diff --git a/app/rdo_console/CMakeLists.txt b/app/rdo_console/CMakeLists.txt index 75bff9809..101d82e40 100644 --- a/app/rdo_console/CMakeLists.txt +++ b/app/rdo_console/CMakeLists.txt @@ -15,10 +15,10 @@ SET(APP_NAME rdo) CONFIGURE_FILE(${CMAKE_MODULE_PATH}/build.version.cmake ${CMAKE_CURRENT_BINARY_DIR}/build_version.h) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) SET(RESOURCES_FILES - ${CMAKE_CURRENT_BINARY_DIR}/build_version.h + ${CMAKE_CURRENT_BINARY_DIR}/build_version.h ) -FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) +FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp *.h) ADD_EXECUTABLE(rdo ${SOURCE_FILES} ${TEXT_FILES}) SET_TARGET_PROPERTIES(rdo PROPERTIES FOLDER ${APPS_FOLDERS}/.rdo) diff --git a/app/rdo_console/controller/rdo_console_controller.cpp b/app/rdo_console/controller/rdo_console_controller.cpp index 8caef7822..084ddfa1d 100644 --- a/app/rdo_console/controller/rdo_console_controller.cpp +++ b/app/rdo_console/controller/rdo_console_controller.cpp @@ -6,6 +6,7 @@ #include "kernel/rdokernel.h" #include "simulator/service/src/simulator.h" #include "simulator/report/src/build_edit_line_info.h" +#include "simulator/report/src/error_code.h" #include "app/rdo_console/controller/rdo_console_controller.h" // -------------------------------------------------------------------------------- @@ -14,147 +15,147 @@ using namespace rdo::simulation::report; #define MUTEXT_PROTECTION(A) boost::lock_guard lg_##__LINE__(A); -console_controller::console_controller() - : RDOThread("RDOThreadStudioConsoleController") - , m_state(SS_UNDEFINED) - , m_converted(false) - , m_buildError(false) - , m_runtimeError(false) - , m_convertorError(false) - , m_exitCode(rdo::simulation::report::EC_OK) +ConsoleController::ConsoleController() + : RDOThread("RDOThreadStudioConsoleController") + , state(SimulatorState::UNDEFINED) + , converted(false) + , buildError(false) + , runtimeError(false) + , convertorError(false) { - notifies.push_back(RT_REPOSITORY_MODEL_OPEN_ERROR ); - notifies.push_back(RT_RUNTIME_MODEL_START_BEFORE ); /// @todo : wait - notifies.push_back(RT_RUNTIME_MODEL_STOP_AFTER ); - notifies.push_back(RT_SIMULATOR_PARSE_OK ); - notifies.push_back(RT_SIMULATOR_PARSE_ERROR ); - notifies.push_back(RT_SIMULATOR_PARSE_ERROR_SMR ); - notifies.push_back(RT_SIMULATOR_PARSE_ERROR_SMR_EMPTY ); - notifies.push_back(RT_SIMULATOR_MODEL_STOP_OK ); - notifies.push_back(RT_SIMULATOR_MODEL_STOP_RUNTIME_ERROR); - notifies.push_back(RT_CONVERTOR_NONE ); - notifies.push_back(RT_CONVERTOR_OK ); - notifies.push_back(RT_CONVERTOR_ERROR ); - - after_constructor(); + notifies.push_back(Message::REPOSITORY_MODEL_OPEN_ERROR ); + notifies.push_back(Message::RUNTIME_MODEL_START_BEFORE ); // TODO : wait + notifies.push_back(Message::RUNTIME_MODEL_STOP_AFTER ); + notifies.push_back(Message::SIMULATOR_PARSE_OK ); + notifies.push_back(Message::SIMULATOR_PARSE_ERROR ); + notifies.push_back(Message::SIMULATOR_PARSE_ERROR_SMR ); + notifies.push_back(Message::SIMULATOR_PARSE_ERROR_SMR_EMPTY ); + notifies.push_back(Message::SIMULATOR_MODEL_STOP_OK ); + notifies.push_back(Message::SIMULATOR_MODEL_STOP_RUNTIME_ERROR); + notifies.push_back(Message::CONVERTOR_NONE ); + notifies.push_back(Message::CONVERTOR_OK ); + notifies.push_back(Message::CONVERTOR_ERROR ); + + after_constructor(); } -console_controller::~console_controller() +ConsoleController::~ConsoleController() {} -bool console_controller::finished() const +bool ConsoleController::isFinished() const { - bool res = true; - { - MUTEXT_PROTECTION(m_stateMutex); - res = (m_state == SS_FINISHED); - } - return res; + bool res = true; + { + MUTEXT_PROTECTION(stateMutex); + res = (state == SimulatorState::FINISHED); + } + return res; } -bool console_controller::converted() const +bool ConsoleController::isConverted() const { - return m_converted; + return converted; } -bool console_controller::simulationSuccessfully() +bool ConsoleController::isSimulationSuccessfully() { - sendMessage(kernel->simulator(), RT_SIMULATOR_GET_MODEL_EXITCODE, &m_exitCode); - return m_exitCode == rdo::simulation::report::EC_OK; + rdo::simulation::report::ExitCode exitCode; + sendMessage(kernel->simulator(), Message::SIMULATOR_GET_MODEL_EXITCODE, &exitCode); + return exitCode == rdo::simulation::report::ExitCode::OK; } -bool console_controller::buildError() const +bool ConsoleController::isBuildError() const { - return m_buildError; + return buildError; } -bool console_controller::runtimeError() const +bool ConsoleController::isRuntimeError() const { - return m_runtimeError; + return runtimeError; } -bool console_controller::convertorError() const +bool ConsoleController::isConvertorError() const { - return m_convertorError; + return convertorError; } -void console_controller::getBuildLogList(StringList& list) const +void ConsoleController::getBuildLog(std::list& list) const { - list = m_buildLogList; + list = buildLog; } -void console_controller::proc(RDOThread::RDOMessageInfo& msg) +void ConsoleController::proc(RDOThread::RDOMessageInfo& msg) { - switch (msg.message) - { - case RDOThread::RT_REPOSITORY_MODEL_OPEN_ERROR: - break; - - case RDOThread::RT_RUNTIME_MODEL_START_BEFORE: - { - MUTEXT_PROTECTION(m_stateMutex); - m_state = SS_IN_PROGRESS; - } - break; - - case RDOThread::RT_RUNTIME_MODEL_STOP_AFTER: - { - MUTEXT_PROTECTION(m_stateMutex); - m_state = SS_FINISHED; - } - break; - - case RDOThread::RT_SIMULATOR_PARSE_OK: - break; - - case RDOThread::RT_SIMULATOR_PARSE_ERROR: - { - m_buildError = true; - std::vector errors; - sendMessage(kernel->simulator(), RT_SIMULATOR_GET_ERRORS, &errors); - fillBuildLogList(errors); - } - break; - - case RDOThread::RT_SIMULATOR_PARSE_ERROR_SMR: - break; - - case RDOThread::RT_SIMULATOR_PARSE_ERROR_SMR_EMPTY: - break; - - case RDOThread::RT_SIMULATOR_MODEL_STOP_OK: - break; - - case RDOThread::RT_SIMULATOR_MODEL_STOP_RUNTIME_ERROR: - m_runtimeError = true; - break; - - case RDOThread::RT_CONVERTOR_NONE: - m_converted = true; - m_convertorError = false; - break; - - case RDOThread::RT_CONVERTOR_OK: - m_converted = true; - m_convertorError = false; - break; - - case RDOThread::RT_CONVERTOR_ERROR: - m_converted = true; - m_convertorError = true; - break; - - default: - break; - } + switch (msg.message) + { + case RDOThread::Message::REPOSITORY_MODEL_OPEN_ERROR: + break; + + case RDOThread::Message::RUNTIME_MODEL_START_BEFORE: + { + MUTEXT_PROTECTION(stateMutex); + state = SimulatorState::IN_PROGRESS; + } + break; + + case RDOThread::Message::RUNTIME_MODEL_STOP_AFTER: + { + MUTEXT_PROTECTION(stateMutex); + state = SimulatorState::FINISHED; + } + break; + + case RDOThread::Message::SIMULATOR_PARSE_OK: + break; + + case RDOThread::Message::SIMULATOR_PARSE_ERROR: + { + buildError = true; + std::vector errors; + sendMessage(kernel->simulator(), Message::SIMULATOR_GET_ERRORS, &errors); + appendToBuildLog(errors); + } + break; + + case RDOThread::Message::SIMULATOR_PARSE_ERROR_SMR: + break; + + case RDOThread::Message::SIMULATOR_PARSE_ERROR_SMR_EMPTY: + break; + + case RDOThread::Message::SIMULATOR_MODEL_STOP_OK: + break; + + case RDOThread::Message::SIMULATOR_MODEL_STOP_RUNTIME_ERROR: + runtimeError = true; + break; + + case RDOThread::Message::CONVERTOR_NONE: + converted = true; + convertorError = false; + break; + + case RDOThread::Message::CONVERTOR_OK: + converted = true; + convertorError = false; + break; + + case RDOThread::Message::CONVERTOR_ERROR: + converted = true; + convertorError = true; + break; + + default: + break; + } } -void console_controller::fillBuildLogList(std::vector& errors) +void ConsoleController::appendToBuildLog(std::vector& errors) { - for (const FileMessage& error: errors) - { - const BuildEditLineInfo info(error); - const std::string line = info.getMessage(); - m_buildLogList.push_back(line); - } + for (const FileMessage& error: errors) + { + const BuildEditLineInfo info(error); + const std::string line = info.getMessage(); + buildLog.push_back(line); + } } diff --git a/app/rdo_console/controller/rdo_console_controller.h b/app/rdo_console/controller/rdo_console_controller.h index 79af448d2..84914d3ca 100644 --- a/app/rdo_console/controller/rdo_console_controller.h +++ b/app/rdo_console/controller/rdo_console_controller.h @@ -1,62 +1,52 @@ -#ifndef _RDO_STUDIO_CONSOLE_CONTROLLER_H_ -#define _RDO_STUDIO_CONSOLE_CONTROLLER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include #include // ----------------------------------------------------------------------- SYNOPSIS #include "kernel/rdothread.h" -#include "simulator/report/src/error_code.h" #include "simulator/report/src/file_message.h" // -------------------------------------------------------------------------------- namespace rdo { -class console_controller: public RDOThread +class ConsoleController: public RDOThread { public: - typedef std::list StringList; + ConsoleController(); + virtual ~ConsoleController(); - console_controller(); - virtual ~console_controller(); + bool isFinished() const; + bool isConverted() const; + bool isSimulationSuccessfully(); - bool finished() const; - bool converted() const; - bool simulationSuccessfully(); + bool isBuildError() const; + bool isRuntimeError() const; + bool isConvertorError() const; - bool buildError() const; - bool runtimeError() const; - bool convertorError() const; - - void getBuildLogList(StringList& list) const; - -private: - typedef rdo::simulation::report::FileMessage FileMessage; - typedef rdo::simulation::report::RDOExitCode RDOExitCode; + void getBuildLog(std::list& list) const; private: - void proc(RDOMessageInfo& msg); - void fillBuildLogList(std::vector& errors); - -private: - enum SimulatorState - { - SS_UNDEFINED, - SS_IN_PROGRESS, - SS_FINISHED - }; - - SimulatorState m_state; - bool m_converted; - bool m_buildError; - bool m_runtimeError; - bool m_convertorError; - RDOExitCode m_exitCode; - StringList m_buildLogList; - - mutable boost::mutex m_stateMutex; + typedef rdo::simulation::report::FileMessage FileMessage; + + enum class SimulatorState + { + UNDEFINED, + IN_PROGRESS, + FINISHED + }; + + SimulatorState state; + mutable boost::mutex stateMutex; + + bool converted; + bool buildError; + bool runtimeError; + bool convertorError; + std::list buildLog; + + void proc(RDOMessageInfo& msg); + void appendToBuildLog(std::vector& errors); }; } // namespace rdo - -#endif // _RDO_STUDIO_CONSOLE_CONTROLLER_H_ diff --git a/app/rdo_console/events/rdo_event.cpp b/app/rdo_console/events/rdo_event.cpp index 317dc6ec6..249bf3438 100644 --- a/app/rdo_console/events/rdo_event.cpp +++ b/app/rdo_console/events/rdo_event.cpp @@ -5,38 +5,38 @@ namespace rdo { -event::event(const std::string& name, etime time, types type) : - m_name(name), m_time(time), m_type(type) -{ -} +Event::Event(const std::string& name, Time time, Type type) + : name(name) + , time(time) + , type(type) +{} -event::~event() -{ -} +Event::~Event() +{} -void event::setName(const std::string& name) +void Event::setName(const std::string& name) { - m_name = name; + this->name = name; } -void event::setTime(double time) +void Event::setTime(double time) { - m_time = time; + this->time = time; } -std::string event::getName() const +const std::string& Event::getName() const { - return m_name; + return name; } -event::etime event::getTime() const +Event::Time Event::getTime() const { - return m_time; + return time; } -event::types event::getType() const +Event::Type Event::getType() const { - return m_type; + return type; } } // namespace rdo diff --git a/app/rdo_console/events/rdo_event.h b/app/rdo_console/events/rdo_event.h index aa6aaf843..0fa112343 100644 --- a/app/rdo_console/events/rdo_event.h +++ b/app/rdo_console/events/rdo_event.h @@ -1,5 +1,4 @@ -#ifndef _RDO_EVENT_H_ -#define _RDO_EVENT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -10,35 +9,33 @@ namespace rdo { -/// base event class -class event +class Event { public: - enum types { - none, - key, - mouse - }; + enum class Type + { + NONE, + KEY, + MOUSE + }; - typedef double etime; + typedef double Time; public: - event(const std::string& name, etime time, types type = none); - virtual ~event(); + Event(const std::string& name, Time time, Type type = Type::NONE); + virtual ~Event(); - void setName(const std::string& name); - void setTime(etime time); + void setName(const std::string& name); + void setTime(Time time); - std::string getName() const; - etime getTime() const; - types getType() const; + const std::string& getName() const; + Time getTime() const; + Type getType() const; private: - std::string m_name; - etime m_time; - types m_type; + std::string name; + Time time; + Type type; }; } // namespace rdo - -#endif // _RDO_EVENT_H_ diff --git a/app/rdo_console/events/rdo_key_event.cpp b/app/rdo_console/events/rdo_key_event.cpp index f4270846a..a6bda415d 100644 --- a/app/rdo_console/events/rdo_key_event.cpp +++ b/app/rdo_console/events/rdo_key_event.cpp @@ -5,33 +5,33 @@ namespace rdo { -key_event::key_event(const std::string& name, double time, states state, int key_code) - : event(name, time, event::key) - , m_state(state) - , m_key_code(key_code) +KeyEvent::KeyEvent(const std::string& name, Time time, State state, int key_code) + : Event(name, time, Event::Type::KEY) + , state(state) + , keyCode(key_code) {} -key_event::~key_event() +KeyEvent::~KeyEvent() {} -void key_event::setState(states state) +void KeyEvent::setState(State state) { - m_state = state; + this->state = state; } -void key_event::setKeyCode(int key_code) +void KeyEvent::setKeyCode(int keyCode) { - m_key_code = key_code; + this->keyCode = keyCode; } -key_event::states key_event::getState() const +KeyEvent::State KeyEvent::getState() const { - return m_state; + return state; } -int key_event::getKeyCode() const +int KeyEvent::getKeyCode() const { - return m_key_code; + return keyCode; } } // namespace rdo diff --git a/app/rdo_console/events/rdo_key_event.h b/app/rdo_console/events/rdo_key_event.h index 68ac03981..ac8e24f42 100644 --- a/app/rdo_console/events/rdo_key_event.h +++ b/app/rdo_console/events/rdo_key_event.h @@ -1,5 +1,4 @@ -#ifndef _RDO_KEY_EVENT_H_ -#define _RDO_KEY_EVENT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,30 +7,27 @@ namespace rdo { -/// base event class -class key_event: public event +class KeyEvent: public Event { public: - enum states - { - press = 0, - release - }; + enum class State + { + PRESS = 0, + RELEASE + }; - key_event(const std::string& name, double time, states state, int key_code); - virtual ~key_event(); + KeyEvent(const std::string& name, Time time, State state, int key_code); + virtual ~KeyEvent(); - void setState(states state); - void setKeyCode(int key_code); + void setState(State state); + void setKeyCode(int keyCode); - states getState() const; - int getKeyCode() const; + State getState() const; + int getKeyCode() const; private: - states m_state; - int m_key_code; + State state; + int keyCode; }; } // namespace rdo - -#endif // _RDO_KEY_EVENT_H_ diff --git a/app/rdo_console/events/rdo_mouse_event.cpp b/app/rdo_console/events/rdo_mouse_event.cpp index c602817bc..bed18c68d 100644 --- a/app/rdo_console/events/rdo_mouse_event.cpp +++ b/app/rdo_console/events/rdo_mouse_event.cpp @@ -5,44 +5,44 @@ namespace rdo { -mouse_event::mouse_event(const std::string& name, double time, buttons button, int x, int y) - : event(name, time, event::mouse) - , m_button(button) - , m_x(x) - , m_y(y) +MouseEvent::MouseEvent(const std::string& name, Time time, Button button, int x, int y) + : Event(name, time, Event::Type::MOUSE) + , button(button) + , x(x) + , y(y) {} -mouse_event::~mouse_event() +MouseEvent::~MouseEvent() {} -void mouse_event::setButton(buttons button) +void MouseEvent::setButton(Button button) { - m_button = button; + this->button = button; } -void mouse_event::setX(int x) +void MouseEvent::setX(int x) { - m_x = x; + this->x = x; } -void mouse_event::sety(int y) +void MouseEvent::sety(int y) { - m_y = y; + this->y = y; } -mouse_event::buttons mouse_event::getButton() const +MouseEvent::Button MouseEvent::getButton() const { - return m_button; + return button; } -int mouse_event::getX() const +int MouseEvent::getX() const { - return m_x; + return x; } -int mouse_event::getY() const +int MouseEvent::getY() const { - return m_y; + return y; } } // namespace rdo diff --git a/app/rdo_console/events/rdo_mouse_event.h b/app/rdo_console/events/rdo_mouse_event.h index bf08344db..eeaec94c3 100644 --- a/app/rdo_console/events/rdo_mouse_event.h +++ b/app/rdo_console/events/rdo_mouse_event.h @@ -1,5 +1,4 @@ -#ifndef _RDO_MOUSE_EVENT_H_ -#define _RDO_MOUSE_EVENT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,35 +7,32 @@ namespace rdo { -class mouse_event: public event +class MouseEvent: public Event { public: - enum buttons - { - none, - left, - right, - middle - }; + enum class Button + { + NONE, + LEFT, + RIGHT, + MIDDLE + }; - mouse_event(const std::string& name, double time, buttons button, int x, int y); - virtual ~mouse_event(); + MouseEvent(const std::string& name, Time time, Button button, int x, int y); + virtual ~MouseEvent(); - void setButton(buttons button); - void setX(int x); - void sety(int y); + void setButton(Button button); + void setX(int x); + void sety(int y); - buttons getButton() const; - int getX() const; - int getY() const; + Button getButton() const; + int getX() const; + int getY() const; private: - buttons m_button; - - int m_x; - int m_y; + Button button; + int x; + int y; }; } // namespace rdo - -#endif // _RDO_MOUSE_EVENT_H_ diff --git a/app/rdo_console/events/xml_parser/rdo_event_xml_parser.cpp b/app/rdo_console/events/xml_parser/rdo_event_xml_parser.cpp index 1dc3939dc..6da26f112 100644 --- a/app/rdo_console/events/xml_parser/rdo_event_xml_parser.cpp +++ b/app/rdo_console/events/xml_parser/rdo_event_xml_parser.cpp @@ -7,46 +7,33 @@ namespace rdo { -bool event_xml_parser::register_parser(const std::string& name, boost::shared_ptr reader) +bool EventXmlParser::registerParser(const std::string& name, std::shared_ptr reader) { - if (m_parsers.find(name) == m_parsers.end()) - { - m_parsers[name] = reader; - return true; - } - return false; + return parsers.insert(std::make_pair(name, reader)).second; } -void event_xml_parser::parse(std::istream& stream, event_container& list) const +void EventXmlParser::parse(std::istream& stream, Events& events) const { - list.clear(); - - boost::property_tree::ptree pt; - boost::property_tree::read_xml(stream, pt); - - for (const boost::property_tree::ptree::value_type& v: pt.get_child("rscript.events")) - { - const boost::property_tree::ptree& node = v.second; - - const std::string event_type = node.get(".type", ""); - parsers::const_iterator it = m_parsers.find(event_type); - if (it != m_parsers.end()) - { - event* e = it->second->read(node); - if (e) - { - list.insert(std::make_pair(e->getTime(), boost::shared_ptr(e))); - } - else - { - throw std::runtime_error("read event from XML"); - } - } - else - { - throw std::runtime_error("read unknown event type from XML"); - } - } + events.clear(); + + boost::property_tree::ptree pt; + boost::property_tree::read_xml(stream, pt); + + for (const boost::property_tree::ptree::value_type& v: pt.get_child("rscript.events")) + { + const auto& node = v.second; + + const auto event_type = node.get(".type", ""); + Parsers::const_iterator it = parsers.find(event_type); + if (it == parsers.end()) + throw std::runtime_error("read unknown event type from XML"); + + const auto& event = it->second->read(node); + if (!event) + throw std::runtime_error("read event from XML"); + + events.insert(std::make_pair(event->getTime(), event)); + } } } // namespace rdo diff --git a/app/rdo_console/events/xml_parser/rdo_event_xml_parser.h b/app/rdo_console/events/xml_parser/rdo_event_xml_parser.h index 032e46703..dbb7e4947 100644 --- a/app/rdo_console/events/xml_parser/rdo_event_xml_parser.h +++ b/app/rdo_console/events/xml_parser/rdo_event_xml_parser.h @@ -1,12 +1,10 @@ -#ifndef _RDO_KEY_EVENT_XML_PARSER_H_ -#define _RDO_KEY_EVENT_XML_PARSER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include #include #include - -#include +#include // ----------------------------------------------------------------------- SYNOPSIS #include "utils/src/common/rdocommon.h" #include "app/rdo_console/events/rdo_event.h" @@ -15,22 +13,20 @@ namespace rdo { -class event_xml_parser +class EventXmlParser { public: - typedef std::map< event::etime, boost::shared_ptr > event_container; + typedef std::map> Events; public: - bool register_parser(const std::string& name, boost::shared_ptr reader); + bool registerParser(const std::string& name, std::shared_ptr reader); - void parse(std::istream& stream, event_container& list) const; + void parse(std::istream& stream, Events& events) const; private: - typedef std::map> parsers; + typedef std::map> Parsers; - parsers m_parsers; + Parsers parsers; }; } // namespace rdo - -#endif // _RDO_KEY_EVENT_XML_PARSER_H_ diff --git a/app/rdo_console/events/xml_parser/rdo_event_xml_reader.cpp b/app/rdo_console/events/xml_parser/rdo_event_xml_reader.cpp index f461c1a10..d002f390c 100644 --- a/app/rdo_console/events/xml_parser/rdo_event_xml_reader.cpp +++ b/app/rdo_console/events/xml_parser/rdo_event_xml_reader.cpp @@ -5,7 +5,7 @@ namespace rdo { -event_xml_reader::~event_xml_reader() +EventXmlReader::~EventXmlReader() {} } // namespace rdo diff --git a/app/rdo_console/events/xml_parser/rdo_event_xml_reader.h b/app/rdo_console/events/xml_parser/rdo_event_xml_reader.h index 9b9a38281..94782ec2e 100644 --- a/app/rdo_console/events/xml_parser/rdo_event_xml_reader.h +++ b/app/rdo_console/events/xml_parser/rdo_event_xml_reader.h @@ -1,24 +1,22 @@ -#ifndef _RDO_EVENT_XML_READER_H_ -#define _RDO_EVENT_XML_READER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include +#include // ----------------------------------------------------------------------- SYNOPSIS #include "utils/src/common/rdocommon.h" // -------------------------------------------------------------------------------- namespace rdo { -class event; +class Event; -class event_xml_reader +class EventXmlReader { public: - virtual ~event_xml_reader(); + virtual ~EventXmlReader(); - virtual event* read(const boost::property_tree::ptree& pt) const = 0; + virtual std::shared_ptr read(const boost::property_tree::ptree& pt) const = 0; }; } // namespace rdo - -#endif // _RDO_EVENT_XML_READER_H_ diff --git a/app/rdo_console/events/xml_parser/rdo_key_event_xml_reader.cpp b/app/rdo_console/events/xml_parser/rdo_key_event_xml_reader.cpp index 25373b293..9c6413a79 100644 --- a/app/rdo_console/events/xml_parser/rdo_key_event_xml_reader.cpp +++ b/app/rdo_console/events/xml_parser/rdo_key_event_xml_reader.cpp @@ -6,20 +6,20 @@ namespace rdo { -key_event_xml_reader::~key_event_xml_reader() +KeyEventXmlReader::~KeyEventXmlReader() {} -event* key_event_xml_reader::read(const boost::property_tree::ptree& pt) const +std::shared_ptr KeyEventXmlReader::read(const boost::property_tree::ptree& pt) const { - const std::string name = pt.get(".name", ""); - const double time = pt.get(".time", 0.0); + const auto name = pt.get(".name", ""); + const auto time = pt.get(".time", 0.0); - const boost::property_tree::ptree& param = pt.get_child("param"); + const auto& param = pt.get_child("param"); - const int state = param.get(".state"); - const int key_code = param.get(".key"); + const auto state = param.get(".state"); + const auto key_code = param.get(".key"); - return new key_event(name, time, static_cast(state), key_code); + return std::make_shared(name, time, static_cast(state), key_code); } } // namespace rdo diff --git a/app/rdo_console/events/xml_parser/rdo_key_event_xml_reader.h b/app/rdo_console/events/xml_parser/rdo_key_event_xml_reader.h index 371ce3152..1c7030624 100644 --- a/app/rdo_console/events/xml_parser/rdo_key_event_xml_reader.h +++ b/app/rdo_console/events/xml_parser/rdo_key_event_xml_reader.h @@ -1,5 +1,4 @@ -#ifndef _RDO_KEY_EVENT_XML_READER_H_ -#define _RDO_KEY_EVENT_XML_READER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,14 +7,12 @@ namespace rdo { -class key_event_xml_reader: public event_xml_reader +class KeyEventXmlReader: public EventXmlReader { public: - virtual ~key_event_xml_reader(); + virtual ~KeyEventXmlReader(); - virtual event* read(const boost::property_tree::ptree& pt) const; + virtual std::shared_ptr read(const boost::property_tree::ptree& pt) const; }; } // namespace rdo - -#endif // _RDO_KEY_EVENT_XML_READER_H_ diff --git a/app/rdo_console/events/xml_parser/rdo_mouse_event_xml_reader.cpp b/app/rdo_console/events/xml_parser/rdo_mouse_event_xml_reader.cpp index 0fc683adb..be8e08d82 100644 --- a/app/rdo_console/events/xml_parser/rdo_mouse_event_xml_reader.cpp +++ b/app/rdo_console/events/xml_parser/rdo_mouse_event_xml_reader.cpp @@ -6,21 +6,21 @@ namespace rdo { -mouse_event_xml_reader::~mouse_event_xml_reader() +MouseEventXmlReader::~MouseEventXmlReader() {} -event* mouse_event_xml_reader::read(const boost::property_tree::ptree& pt) const +std::shared_ptr MouseEventXmlReader::read(const boost::property_tree::ptree& pt) const { - const std::string name = pt.get(".name", ""); - const double time = pt.get(".time", 0.0); + const auto name = pt.get(".name", ""); + const auto time = pt.get(".time", 0.0); - const boost::property_tree::ptree& param = pt.get_child("param"); + const auto& param = pt.get_child("param"); - const int button = param.get(".button"); - const int x = param.get(".x"); - const int y = param.get(".y"); + const auto button = param.get(".button"); + const auto x = param.get(".x"); + const auto y = param.get(".y"); - return new mouse_event(name, time, static_cast(button), x, y); + return std::make_shared(name, time, static_cast(button), x, y); } } // namespace rdo diff --git a/app/rdo_console/events/xml_parser/rdo_mouse_event_xml_reader.h b/app/rdo_console/events/xml_parser/rdo_mouse_event_xml_reader.h index 3445a25ec..3379a0ff8 100644 --- a/app/rdo_console/events/xml_parser/rdo_mouse_event_xml_reader.h +++ b/app/rdo_console/events/xml_parser/rdo_mouse_event_xml_reader.h @@ -1,5 +1,4 @@ -#ifndef _RDO_MOUSE_EVENT_XML_READER_H_ -#define _RDO_MOUSE_EVENT_XML_READER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,14 +7,12 @@ namespace rdo { -class mouse_event_xml_reader: public event_xml_reader +class MouseEventXmlReader: public EventXmlReader { public: - virtual ~mouse_event_xml_reader(); + virtual ~MouseEventXmlReader(); - virtual event* read(const boost::property_tree::ptree& pt) const; + virtual std::shared_ptr read(const boost::property_tree::ptree& pt) const; }; } // namespace rdo - -#endif // _RDO_MOUSE_EVENT_XML_READER_H_ diff --git a/app/rdo_console/main.cpp b/app/rdo_console/main.cpp index 30cff9cee..a9f19987b 100644 --- a/app/rdo_console/main.cpp +++ b/app/rdo_console/main.cpp @@ -22,225 +22,223 @@ #include "app/rdo_console/terminate_codes.h" // -------------------------------------------------------------------------------- -typedef std::list string_list; -typedef rdo::event_xml_parser::event_container event_container; +typedef std::list Strings; +typedef rdo::EventXmlParser::Events Events; const boost::filesystem::path LOG_FILE_NAME = "log.txt"; -void read_events(std::istream& stream, event_container& container); -void write_build_log(std::ostream& stream, const string_list& list); -bool run(rdo::console_controller* pAppController, event_container& container); -void process_event(rdo::console_controller* pAppController, event_container& container); +void readEvents(std::istream& stream, Events& container); +void writeBuildLog(std::ostream& stream, const Strings& list); +bool run(rdo::ConsoleController* pAppController, Events& container); +void processEvent(rdo::ConsoleController* pAppController, Events& container); int main(int argc, char* argv[]) { - std::size_t exitCode = TERMINATION_NORMAL; - - rdo::locale::init(); - - boost::posix_time::ptime startTime = boost::posix_time::microsec_clock::local_time(); - - rdo::ControllerConsoleOptions optionsController(argc, argv); - optionsController.parseOptions(); - - const boost::filesystem::path modelFileName = optionsController.getModelFileName(); - const bool modelExist = rdo::File::exist(modelFileName); - - const boost::filesystem::path eventsFileName = optionsController.getScriptFileName(); - const bool eventExist = rdo::File::exist(eventsFileName); - - if (optionsController.helpQuery()) - { - exit(TERMINATION_NORMAL); - } - else if (!modelExist) - { - std::cerr << "Model file does not exist" << std::endl; - exit(TERMINATION_WITH_AN_ERROR_NO_MODEL); - } - else if (!eventExist && !eventsFileName.empty()) - { - std::cerr << "Events file does not exist" << std::endl; - exit(TERMINATION_WITH_AN_ERROR_NO_EVENTS); - } - - // read events - event_container container; - if (eventExist) { - boost::filesystem::ifstream stream(eventsFileName, std::ios::out); - read_events(stream, container); - } - - // simulation - RDOKernel::init(); - new rdo::service::simulation::RDOThreadSimulator(); - new rdo::repository::RDOThreadRepository(); - - rdo::console_controller* pAppController = new rdo::console_controller(); - - rdo::repository::RDOThreadRepository::OpenFile data(modelFileName); - pAppController->broadcastMessage(RDOThread::RT_STUDIO_MODEL_OPEN, &data); - - if (optionsController.convertQuery()) - { - bool converted = false; - while (!converted) - { - converted = pAppController->converted(); - boost::this_thread::sleep(boost::posix_time::milliseconds(500)); - } - if (pAppController->convertorError()) - { - exit(TERMINATION_WITH_AN_ERROR_CONVERTOR_ERROR); - } - exit(TERMINATION_NORMAL); - } - - pAppController->broadcastMessage(RDOThread::RT_STUDIO_MODEL_BUILD); - - bool simulationSuccessfully = false; - - const bool buildError = pAppController->buildError(); - if (buildError) - { - string_list buildList; - pAppController->getBuildLogList(buildList); - - const boost::filesystem::path fileName = modelFileName.parent_path() / LOG_FILE_NAME; - boost::filesystem::remove(fileName); - boost::filesystem::ofstream stream(fileName, std::ios::out); - - write_build_log(stream, buildList); - - std::cerr << "Build model error" << std::endl; - exitCode = TERMINATION_WITH_AN_ERROR_PARSE_MODEL_ERROR; - } - else - { - simulationSuccessfully = run(pAppController, container); - RDOKernel::close(); - } - - const boost::posix_time::ptime endTime = boost::posix_time::microsec_clock::local_time(); - const uint64_t simulationTimeMillisecond = (endTime - startTime).total_milliseconds(); - rdo::locale::cout(boost::str(boost::format("Total simulation time : %1% milliseconds") % simulationTimeMillisecond)); - - if (simulationSuccessfully) - { - rdo::locale::cout("Simulation finished successfully"); - exitCode = TERMINATION_NORMAL; - } - else - { - rdo::locale::cout("Simulation completed with errors"); - } - return exitCode; + std::size_t exitCode = TERMINATION_NORMAL; + + rdo::locale::init(); + + boost::posix_time::ptime startTime = boost::posix_time::microsec_clock::local_time(); + + rdo::ControllerConsoleOptions optionsController(argc, argv); + optionsController.parseOptions(); + + const boost::filesystem::path modelFileName = optionsController.getModelFileName(); + const bool modelExist = rdo::File::exist(modelFileName); + + const boost::filesystem::path eventsFileName = optionsController.getScriptFileName(); + const bool eventExist = rdo::File::exist(eventsFileName); + + if (optionsController.helpQuery()) + { + exit(TERMINATION_NORMAL); + } + else if (!modelExist) + { + std::cerr << "Model file does not exist" << std::endl; + exit(TERMINATION_WITH_AN_ERROR_NO_MODEL); + } + else if (!eventExist && !eventsFileName.empty()) + { + std::cerr << "Events file does not exist" << std::endl; + exit(TERMINATION_WITH_AN_ERROR_NO_EVENTS); + } + + // read events + Events container; + if (eventExist) + { + boost::filesystem::ifstream stream(eventsFileName, std::ios::out); + readEvents(stream, container); + } + + // simulation + RDOKernel::init(); + new rdo::service::simulation::RDOThreadSimulator(); + new rdo::repository::RDOThreadRepository(); + + rdo::ConsoleController* pAppController = new rdo::ConsoleController(); + + rdo::repository::RDOThreadRepository::OpenFile data(modelFileName); + pAppController->broadcastMessage(RDOThread::Message::STUDIO_MODEL_OPEN, &data); + + if (optionsController.convertQuery()) + { + bool converted = false; + while (!converted) + { + converted = pAppController->isConverted(); + boost::this_thread::sleep(boost::posix_time::milliseconds(500)); + } + + if (pAppController->isConvertorError()) + exit(TERMINATION_WITH_AN_ERROR_CONVERTOR_ERROR); + + exit(TERMINATION_NORMAL); + } + + pAppController->broadcastMessage(RDOThread::Message::STUDIO_MODEL_BUILD); + + bool simulationSuccessfully = false; + + const bool buildError = pAppController->isBuildError(); + if (buildError) + { + Strings buildList; + pAppController->getBuildLog(buildList); + + const boost::filesystem::path fileName = modelFileName.parent_path() / LOG_FILE_NAME; + boost::filesystem::remove(fileName); + boost::filesystem::ofstream stream(fileName, std::ios::out); + + writeBuildLog(stream, buildList); + + std::cerr << "Build model error" << std::endl; + exitCode = TERMINATION_WITH_AN_ERROR_PARSE_MODEL_ERROR; + } + else + { + simulationSuccessfully = run(pAppController, container); + RDOKernel::close(); + } + + const boost::posix_time::ptime endTime = boost::posix_time::microsec_clock::local_time(); + const uint64_t simulationTimeMillisecond = (endTime - startTime).total_milliseconds(); + rdo::locale::cout(boost::str(boost::format("Total simulation time : %1% milliseconds") % simulationTimeMillisecond)); + + if (simulationSuccessfully) + { + rdo::locale::cout("Simulation finished successfully"); + exitCode = TERMINATION_NORMAL; + } + else + { + rdo::locale::cout("Simulation completed with errors"); + } + return exitCode; } -void read_events(std::istream& stream, event_container& container) +void readEvents(std::istream& stream, Events& container) { - container.clear(); - - if (stream.fail()) - { - exit(TERMINATION_WITH_APP_RUNTIME_ERROR); - } - rdo::event_xml_parser parser; - parser.register_parser("key", boost::shared_ptr(new rdo::key_event_xml_reader)); - parser.register_parser("mouse", boost::shared_ptr(new rdo::mouse_event_xml_reader)); - - try - { - parser.parse(stream, container); - } - catch (...) - { - exit(TERMINATION_WITH_AN_ERROR_PARSE_EVENTS_ERROR); - } + container.clear(); + + if (stream.fail()) + exit(TERMINATION_WITH_APP_RUNTIME_ERROR); + + rdo::EventXmlParser parser; + parser.registerParser("key", std::make_shared()); + parser.registerParser("mouse", std::make_shared()); + + try + { + parser.parse(stream, container); + } + catch (...) + { + exit(TERMINATION_WITH_AN_ERROR_PARSE_EVENTS_ERROR); + } } -void write_build_log(std::ostream& stream, const string_list& list) +void writeBuildLog(std::ostream& stream, const Strings& list) { - if (stream.fail()) - { - exit(TERMINATION_WITH_APP_RUNTIME_ERROR); - } - for (const string_list::value_type& line: list) - { - stream << line.c_str() << std::endl; - } + if (stream.fail()) + exit(TERMINATION_WITH_APP_RUNTIME_ERROR); + + for (const Strings::value_type& line: list) + stream << line.c_str() << std::endl; } -bool run(rdo::console_controller* pAppController, event_container& container) +bool run(rdo::ConsoleController* pAppController, Events& container) { - pAppController->broadcastMessage(RDOThread::RT_STUDIO_MODEL_RUN); - - rdo::runtime::RunTimeMode runtimeMode = rdo::runtime::RTM_MaxSpeed; - pAppController->broadcastMessage(RDOThread::RT_RUNTIME_SET_MODE, &runtimeMode); - - while (!pAppController->finished()) - { - kernel->idle(); - - if (pAppController->runtimeError()) - { - rdo::locale::cout("Run-time error"); - exit(TERMINATION_WITH_AN_ERROR_RUNTIME_ERROR); - } - process_event(pAppController, container); - } - return pAppController->simulationSuccessfully(); + pAppController->broadcastMessage(RDOThread::Message::STUDIO_MODEL_RUN); + + rdo::runtime::RunTimeMode runtimeMode = rdo::runtime::RunTimeMode::MAX_SPEED; + pAppController->broadcastMessage(RDOThread::Message::RUNTIME_SET_MODE, &runtimeMode); + + while (!pAppController->isFinished()) + { + kernel->idle(); + + if (pAppController->isRuntimeError()) + { + rdo::locale::cout("Run-time error"); + exit(TERMINATION_WITH_AN_ERROR_RUNTIME_ERROR); + } + processEvent(pAppController, container); + } + return pAppController->isSimulationSuccessfully(); +} + +RDOThread::Message getMessageType(rdo::KeyEvent::State state) +{ + switch (state) + { + case rdo::KeyEvent::State::PRESS: return RDOThread::Message::RUNTIME_KEY_DOWN; + case rdo::KeyEvent::State::RELEASE: return RDOThread::Message::RUNTIME_KEY_UP; + } + + throw std::runtime_error("Unexpected event state"); } -void process_event(rdo::console_controller* pAppController, event_container& container) +void processEvent(rdo::ConsoleController* pAppController, Events& container) { - double runtime_time = 0; - pAppController->broadcastMessage(RDOThread::RT_RUNTIME_GET_TIMENOW, &runtime_time); - - if(!container.empty()) - { - event_container::const_iterator it = container.begin(); - if (it->first < runtime_time) - { - const std::string eventName = boost::str(boost::format("process event : name : %1% | time : %2%") - % it->second->getName() - % it->second->getTime() - ); - rdo::locale::cout(eventName); - - rdo::event::types type = it->second->getType(); - - switch (type) - { - case rdo::event::key: - { - std::size_t code = static_cast(it->second.get())->getKeyCode(); - rdo::key_event::states state = static_cast(it->second.get())->getState(); - - rdo::console_controller::RDOTreadMessage message_type; - switch (state) - { - case rdo::key_event::press: - message_type = RDOThread::RT_RUNTIME_KEY_DOWN; - break; - case rdo::key_event::release: - message_type = RDOThread::RT_RUNTIME_KEY_UP; - break; - } - pAppController->broadcastMessage(message_type, &code); - } - break; - - case rdo::event::mouse: - /// @todo : complete me - NEVER_REACH_HERE; - break; - - default: - NEVER_REACH_HERE; - break; - } - container.erase(it); - } - } + double runtime_time = 0; + pAppController->broadcastMessage(RDOThread::Message::RUNTIME_GET_TIMENOW, &runtime_time); + + if(!container.empty()) + { + Events::const_iterator it = container.begin(); + if (it->first < runtime_time) + { + const auto eventName = boost::str(boost::format("process event : name : %1% | time : %2%") + % it->second->getName() + % it->second->getTime()); + rdo::locale::cout(eventName); + + rdo::Event::Type type = it->second->getType(); + + switch (type) + { + case rdo::Event::Type::KEY: + { + std::size_t code = static_cast(it->second.get())->getKeyCode(); + const rdo::KeyEvent::State state = static_cast(it->second.get())->getState(); + + const rdo::ConsoleController::Message message_type = getMessageType(state); + pAppController->broadcastMessage(message_type, &code); + } + break; + + case rdo::Event::Type::MOUSE: + // TODO : complete me + NEVER_REACH_HERE; + break; + + default: + NEVER_REACH_HERE; + break; + } + container.erase(it); + } + } } diff --git a/app/rdo_console/options/controller_console_options.cpp b/app/rdo_console/options/controller_console_options.cpp index 5a6c3e515..2ad8c4b89 100644 --- a/app/rdo_console/options/controller_console_options.cpp +++ b/app/rdo_console/options/controller_console_options.cpp @@ -12,38 +12,38 @@ using namespace rdo; ControllerConsoleOptions::ControllerConsoleOptions(int argc, char *argv[]) - : m_help(false) - , m_convert(false) + : help(false) + , convert(false) { - const po::options_description options_header(boost::str(boost::format("%1%\n\n%2%") - % rdo::version::g_versionName - % rdo::version::g_site - )); - - po::options_description options_general("General options"); - createGeneralOptions(options_general); - - po::options_description options_convertor("Convertor options"); - createConvertorOptions(options_convertor); - - po::options_description options_additional("Compatibility options (skipped in console version)"); - createAdditionalOptions(options_additional); - - m_options.add(options_header); - m_options.add(options_general); - m_options.add(options_convertor); - m_options.add(options_additional); - - try - { - po::store(po::parse_command_line(argc, argv, m_options), m_variables); - po::notify(m_variables); - } - catch (const std::exception& e) - { - const std::string error = boost::str(boost::format("command line error: %1%") % e.what()); - rdo::locale::cout(error); - } + const po::options_description options_header(boost::str(boost::format("%1%\n\n%2%") + % rdo::version::g_versionName + % rdo::version::g_site + )); + + po::options_description options_general("General options"); + createGeneralOptions(options_general); + + po::options_description options_convertor("Convertor options"); + createConvertorOptions(options_convertor); + + po::options_description options_additional("Compatibility options (skipped in console version)"); + createAdditionalOptions(options_additional); + + options.add(options_header); + options.add(options_general); + options.add(options_convertor); + options.add(options_additional); + + try + { + po::store(po::parse_command_line(argc, argv, options), variables); + po::notify(variables); + } + catch (const std::exception& e) + { + const std::string error = boost::str(boost::format("command line error: %1%") % e.what()); + rdo::locale::cout(error); + } } ControllerConsoleOptions::~ControllerConsoleOptions() @@ -51,96 +51,96 @@ ControllerConsoleOptions::~ControllerConsoleOptions() void ControllerConsoleOptions::parseOptions() { - if ((m_variables.empty() || m_variables.count(HELP_COMMAND)) && - !m_variables.count(LANGUAGE_COMMAND) && - !m_variables.count(VERSION_COMMAND)) - { - std::stringstream stream; - stream << m_options; - rdo::locale::cout(stream.str()); - m_help = true; - } - else if (m_variables.count(LANGUAGE_COMMAND)) - { - const std::string message("rdo language v" + RDO_LANGUAGE_VERSION + " ( supported rdox )"); - rdo::locale::cout(message); - m_help = true; - } - else if (m_variables.count(VERSION_COMMAND)) - { - rdo::locale::cout(rdo::version::g_versionName); - m_help = true; - } - else if(m_variables.count(CONVERTOR_COMMAND)) - { - m_convert = true; - } + if ((variables.empty() || variables.count(HELP_COMMAND)) && + !variables.count(LANGUAGE_COMMAND) && + !variables.count(VERSION_COMMAND)) + { + std::stringstream stream; + stream << options; + rdo::locale::cout(stream.str()); + help = true; + } + else if (variables.count(LANGUAGE_COMMAND)) + { + const std::string message("rdo language v" + RDO_LANGUAGE_VERSION + " ( supported rdox )"); + rdo::locale::cout(message); + help = true; + } + else if (variables.count(VERSION_COMMAND)) + { + rdo::locale::cout(rdo::version::g_versionName); + help = true; + } + else if(variables.count(CONVERTOR_COMMAND)) + { + convert = true; + } } boost::filesystem::path ControllerConsoleOptions::getModelFileName() const { - boost::filesystem::path result; - if (m_variables.count(MODEL_COMMAND)) - { - std::string modelFileName = m_variables[MODEL_COMMAND].as(); + boost::filesystem::path result; + if (variables.count(MODEL_COMMAND)) + { + std::string modelFileName = variables[MODEL_COMMAND].as(); #if defined(OST_WINDOWS) - modelFileName = rdo::locale::convertFromCLocale(modelFileName); + modelFileName = rdo::locale::convertFromCLocale(modelFileName); #elif defined(OST_LINUX) - modelFileName = rdo::locale::convert(modelFileName, rdo::locale::get().utf8(), rdo::locale::get().system()); + modelFileName = rdo::locale::convert(modelFileName, rdo::locale::get().utf8(), rdo::locale::get().system()); #endif - result = rdo::locale::convertToWStr(modelFileName); - } - return result; + result = rdo::locale::convertToWStr(modelFileName); + } + return result; } boost::filesystem::path ControllerConsoleOptions::getScriptFileName() const { - boost::filesystem::path result; - if (m_variables.count(SCRIPT_COMMAND)) - { - std::string eventsFileName = m_variables[SCRIPT_COMMAND].as(); + boost::filesystem::path result; + if (variables.count(SCRIPT_COMMAND)) + { + std::string eventsFileName = variables[SCRIPT_COMMAND].as(); #if defined(OST_WINDOWS) - eventsFileName = rdo::locale::convertFromCLocale(eventsFileName); + eventsFileName = rdo::locale::convertFromCLocale(eventsFileName); #elif defined(OST_LINUX) - eventsFileName = rdo::locale::convert(eventsFileName, rdo::locale::get().utf8(), rdo::locale::get().system()); + eventsFileName = rdo::locale::convert(eventsFileName, rdo::locale::get().utf8(), rdo::locale::get().system()); #endif - result = rdo::locale::convertToWStr(eventsFileName); - } - return result; + result = rdo::locale::convertToWStr(eventsFileName); + } + return result; } bool ControllerConsoleOptions::helpQuery() const { - return m_help; + return help; } bool ControllerConsoleOptions::convertQuery() const { - return m_convert; + return convert; } void ControllerConsoleOptions::createGeneralOptions(po::options_description& options) { - options.add_options() - ((MODEL_COMMAND + COMMA_STRING + MODEL_COMMAND_SHORT).c_str(), po::value(), MODEL_COMMENT.c_str()) - ((SCRIPT_COMMAND + COMMA_STRING + SCRIPT_COMMAND_SHORT).c_str(), po::value(), SCRIPT_COMMENT.c_str()) - ((LANGUAGE_COMMAND + COMMA_STRING + LANGUAGE_COMMAND_SHORT).c_str(), LANGUAGE_COMMENT.c_str()) - ((VERSION_COMMAND + COMMA_STRING + VERSION_COMMAND_SHORT).c_str(), VERSION_COMMENT.c_str()) - ((HELP_COMMAND + COMMA_STRING + HELP_COMMAND_SHORT).c_str(), HELP_COMMENT.c_str()); + options.add_options() + ((MODEL_COMMAND + COMMA_STRING + MODEL_COMMAND_SHORT).c_str(), po::value(), MODEL_COMMENT.c_str()) + ((SCRIPT_COMMAND + COMMA_STRING + SCRIPT_COMMAND_SHORT).c_str(), po::value(), SCRIPT_COMMENT.c_str()) + ((LANGUAGE_COMMAND + COMMA_STRING + LANGUAGE_COMMAND_SHORT).c_str(), LANGUAGE_COMMENT.c_str()) + ((VERSION_COMMAND + COMMA_STRING + VERSION_COMMAND_SHORT).c_str(), VERSION_COMMENT.c_str()) + ((HELP_COMMAND + COMMA_STRING + HELP_COMMAND_SHORT).c_str(), HELP_COMMENT.c_str()); } void ControllerConsoleOptions::createConvertorOptions(po::options_description& options) { - options.add_options() - ((CONVERTOR_COMMAND + COMMA_STRING + CONVERTOR_COMMAND_SHORT).c_str(), CONVERTOR_COMMENT.c_str()); + options.add_options() + ((CONVERTOR_COMMAND + COMMA_STRING + CONVERTOR_COMMAND_SHORT).c_str(), CONVERTOR_COMMENT.c_str()); } void ControllerConsoleOptions::createAdditionalOptions(po::options_description& options) { - options.add_options() - (AUTO_RUN_COMMAND.c_str(), AUTO_RUN_COMMENT.c_str()) - (AUTO_EXIT_COMMAND.c_str(), AUTO_EXIT_COMMENT.c_str()) - (DONT_CLOSE_IF_ERROR_COMMAND.c_str(), DONT_CLOSE_IF_ERROR_COMMENT.c_str()) - (PLUGIN_START_COMMAND.c_str(), PLUGIN_START_COMMENT.c_str()) - (PLUGIN_AUTO_EXIT_COMMAND.c_str(), PLUGIN_AUTO_EXIT_COMMENT.c_str()); + options.add_options() + (AUTO_RUN_COMMAND.c_str(), AUTO_RUN_COMMENT.c_str()) + (AUTO_EXIT_COMMAND.c_str(), AUTO_EXIT_COMMENT.c_str()) + (DONT_CLOSE_IF_ERROR_COMMAND.c_str(), DONT_CLOSE_IF_ERROR_COMMENT.c_str()) + (PLUGIN_START_COMMAND.c_str(), PLUGIN_START_COMMENT.c_str()) + (PLUGIN_AUTO_EXIT_COMMAND.c_str(), PLUGIN_AUTO_EXIT_COMMENT.c_str()); } diff --git a/app/rdo_console/options/controller_console_options.h b/app/rdo_console/options/controller_console_options.h index e6d75e34d..1252f778b 100644 --- a/app/rdo_console/options/controller_console_options.h +++ b/app/rdo_console/options/controller_console_options.h @@ -1,11 +1,10 @@ -#ifndef _RDO_CONTROLLER_CONSOLE_OPTIONS_H_ -#define _RDO_CONTROLLER_CONSOLE_OPTIONS_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM #include "utils/src/common/platform.h" // ----------------------------------------------------------------------- INCLUDES #ifdef COMPILER_VISUAL_STUDIO -# pragma warning (disable:4512) +# pragma warning (disable:4512) #endif // COMPILER_VISUAL_STUDIO #include @@ -21,32 +20,30 @@ namespace po = boost::program_options; class ControllerConsoleOptions { public: - ControllerConsoleOptions(int argc, char* argv[]); - ~ControllerConsoleOptions(); + ControllerConsoleOptions(int argc, char* argv[]); + ~ControllerConsoleOptions(); - void parseOptions(); + void parseOptions(); - boost::filesystem::path getModelFileName () const; - boost::filesystem::path getScriptFileName() const; + boost::filesystem::path getModelFileName() const; + boost::filesystem::path getScriptFileName() const; - bool helpQuery() const; - bool convertQuery() const; + bool helpQuery() const; + bool convertQuery() const; private: - po::options_description m_options; - po::variables_map m_variables; - bool m_help; - bool m_convert; - - void createGeneralOptions(po::options_description& options); - void createConvertorOptions(po::options_description& options); - void createAdditionalOptions(po::options_description& options); + po::options_description options; + po::variables_map variables; + bool help; + bool convert; + + void createGeneralOptions(po::options_description& options); + void createConvertorOptions(po::options_description& options); + void createAdditionalOptions(po::options_description& options); }; } // namespace rdo #ifdef COMPILER_VISUAL_STUDIO -# pragma warning (default:4512) +# pragma warning (default:4512) #endif // COMPILER_VISUAL_STUDIO - -#endif // _RDO_CONTROLLER_CONSOLE_OPTIONS_H_ diff --git a/app/rdo_console/options/controller_console_options_config.h b/app/rdo_console/options/controller_console_options_config.h index e7b850dae..50a0ebe07 100644 --- a/app/rdo_console/options/controller_console_options_config.h +++ b/app/rdo_console/options/controller_console_options_config.h @@ -1,5 +1,4 @@ -#ifndef _RDO_CONTROLLER_CONSOLE_OPTIONS_CONFIG_H_ -#define _RDO_CONTROLLER_CONSOLE_OPTIONS_CONFIG_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM #include "utils/src/common/platform.h" @@ -49,5 +48,3 @@ const std::string RDO_LANGUAGE_VERSION = "2.0"; const std::string NOP_STRING = " "; const std::string COMMA_STRING = ","; - -#endif // _RDO_CONTROLLER_CONSOLE_OPTIONS_CONFIG_H_ diff --git a/app/rdo_console/terminate_codes.h b/app/rdo_console/terminate_codes.h index 2322ddfd8..409dd63c6 100644 --- a/app/rdo_console/terminate_codes.h +++ b/app/rdo_console/terminate_codes.h @@ -1,5 +1,4 @@ -#ifndef _TERMINATE_CODES_H_ -#define _TERMINATE_CODES_H_ +#pragma once const int TERMINATION_NORMAL = 0; const int TERMINATION_WITH_AN_ERROR_NO_MODEL = 1; @@ -11,5 +10,3 @@ const int TERMINATION_WITH_AN_ERROR_PARSE_EVENTS_ERROR = 6; const int TERMINATION_WITH_AN_ERROR_CONVERTOR_ERROR = 7; const int TERMINATION_WITH_APP_RUNTIME_ERROR = 666; - -#endif // _TERMINATE_CODES_H_ diff --git a/app/rdo_studio/CMakeLists.txt b/app/rdo_studio/CMakeLists.txt index cdcd38042..5f5d7a7b6 100644 --- a/app/rdo_studio/CMakeLists.txt +++ b/app/rdo_studio/CMakeLists.txt @@ -20,246 +20,244 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) ADD_SUBDIRECTORY(plugins) SET(MAIN_FILES - src/main.cpp + src/main.cpp ) SET(STUDIO_PCH_FILES - pch/stdpch.cpp - pch/stdpch.h + pch/stdpch.cpp + pch/stdpch.h ) SET(APPLICATION_FILES - src/application.cpp - src/application.h - src/shared_object_service.h - src/main_window.cpp - src/main_window.h - src/main_window_base.h - src/status_bar.cpp - src/status_bar.h - src/style.cpp - src/style.h - src/thread.cpp - src/thread.h - src/view_preferences.cpp - src/view_preferences.h + src/application.cpp + src/application.h + src/shared_object_service.h + src/main_window.cpp + src/main_window.h + src/main_window_base.h + src/status_bar.cpp + src/status_bar.h + src/style.cpp + src/style.h + src/view_preferences.cpp + src/view_preferences.h ) SET(APPLICATION_ACTIONACTIVATOR_FILES - src/action_activator/action_activator.cpp - src/action_activator/action_activator.h - src/action_activator/action_activator_widget.cpp - src/action_activator/action_activator_widget.h + src/action_activator/action_activator.cpp + src/action_activator/action_activator.h + src/action_activator/action_activator_widget.cpp + src/action_activator/action_activator_widget.h ) SET(DIALOG_FILES - src/dialog/about_dialog.cpp - src/dialog/about_dialog.h - src/dialog/file_association_dialog.cpp - src/dialog/file_association_dialog.h - src/dialog/find_dialog.cpp - src/dialog/find_dialog.h - src/dialog/find_replace_dialog.cpp - src/dialog/find_replace_dialog.h - src/dialog/goto_line_dialog.cpp - src/dialog/goto_line_dialog.h - src/dialog/new_model_dialog.cpp - src/dialog/new_model_dialog.h + src/dialog/about_dialog.cpp + src/dialog/about_dialog.h + src/dialog/file_association_dialog.cpp + src/dialog/file_association_dialog.h + src/dialog/find_dialog.cpp + src/dialog/find_dialog.h + src/dialog/find_replace_dialog.cpp + src/dialog/find_replace_dialog.h + src/dialog/goto_line_dialog.cpp + src/dialog/goto_line_dialog.h + src/dialog/new_model_dialog.cpp + src/dialog/new_model_dialog.h ) SET(DOCK_FILES - src/dock/dock_build.cpp - src/dock/dock_build.h - src/dock/dock_chart_tree.cpp - src/dock/dock_chart_tree.h - src/dock/dock_debug.cpp - src/dock/dock_debug.h - src/dock/dock_find.cpp - src/dock/dock_find.h - src/dock/dock_focusable.cpp - src/dock/dock_focusable.h - src/dock/dock_frame.cpp - src/dock/dock_frame.h - src/dock/dock_results.cpp - src/dock/dock_results.h - src/dock/dock_trace.cpp - src/dock/dock_trace.h + src/dock/dock_build.cpp + src/dock/dock_build.h + src/dock/dock_chart_tree.cpp + src/dock/dock_chart_tree.h + src/dock/dock_debug.cpp + src/dock/dock_debug.h + src/dock/dock_find.cpp + src/dock/dock_find.h + src/dock/dock_focusable.cpp + src/dock/dock_focusable.h + src/dock/dock_frame.cpp + src/dock/dock_frame.h + src/dock/dock_results.cpp + src/dock/dock_results.h + src/dock/dock_trace.cpp + src/dock/dock_trace.h ) SET(APPLICATION_PCH_FILES - pch/application_pch.cpp - pch/application_pch.h + pch/application_pch.cpp + pch/application_pch.h ) SET(EDITOR_FILES - src/editor/edit.cpp - src/editor/edit.h - src/editor/edit_popup_menu.cpp - src/editor/edit_popup_menu.h - src/editor/edit_style.cpp - src/editor/edit_style.h + src/editor/edit.cpp + src/editor/edit.h + src/editor/edit_popup_menu.cpp + src/editor/edit_popup_menu.h + src/editor/edit_style.cpp + src/editor/edit_style.h ) SET(EDITOR_DEBUG_FILES - src/editor/debug_edit.cpp - src/editor/debug_edit.h + src/editor/debug_edit.cpp + src/editor/debug_edit.h ) SET(EDITOR_LEXER_FILES - src/editor/lexer/lexer_find.cpp - src/editor/lexer/lexer_find.h - src/editor/lexer/lexer_model.cpp - src/editor/lexer/lexer_model.h - src/editor/lexer/word_list_util.cpp - src/editor/lexer/word_list_util.h + src/editor/lexer/lexer_find.cpp + src/editor/lexer/lexer_find.h + src/editor/lexer/lexer_model.cpp + src/editor/lexer/lexer_model.h + src/editor/lexer/word_list_util.cpp + src/editor/lexer/word_list_util.h ) SET(EDITOR_LOG_FILES - src/editor/log_edit.cpp - src/editor/log_edit.h - src/editor/log_edit_style.cpp - src/editor/log_edit_style.h + src/editor/log_edit.cpp + src/editor/log_edit.h + src/editor/log_edit_style.cpp + src/editor/log_edit_style.h ) SET(EDITOR_LOG_BUILD_FILES - src/editor/build_edit.cpp - src/editor/build_edit.h - src/editor/build_edit_style.cpp - src/editor/build_edit_style.h + src/editor/build_edit.cpp + src/editor/build_edit.h + src/editor/build_edit_style.cpp + src/editor/build_edit_style.h ) SET(EDITOR_LOG_FIND_FILES - src/editor/find_edit.cpp - src/editor/find_edit.h - src/editor/find_edit_style.cpp - src/editor/find_edit_style.h + src/editor/find_edit.cpp + src/editor/find_edit.h + src/editor/find_edit_style.cpp + src/editor/find_edit_style.h ) SET(EDITOR_MODEL_FILES - src/editor/model_edit.cpp - src/editor/model_edit.h - src/editor/model_edit_style.cpp - src/editor/model_edit_style.h + src/editor/model_edit.cpp + src/editor/model_edit.h + src/editor/model_edit_style.cpp + src/editor/model_edit_style.h ) SET(EDITOR_PARSER_FILES - src/editor/parser_edit.cpp - src/editor/parser_edit.h - src/editor/parser_edit_style.cpp - src/editor/parser_edit_style.h + src/editor/parser_edit.cpp + src/editor/parser_edit.h + src/editor/parser_edit_style.cpp + src/editor/parser_edit_style.h ) SET(EDITOR_RESULTS_FILES - src/editor/results_edit.cpp - src/editor/results_edit.h - src/editor/results_edit_style.cpp - src/editor/results_edit_style.h + src/editor/results_edit.cpp + src/editor/results_edit.h + src/editor/results_edit_style.cpp + src/editor/results_edit_style.h ) SET(EDITOR_PCH_FILES - pch/editor_pch.cpp - pch/editor_pch.h + pch/editor_pch.cpp + pch/editor_pch.h ) SET(FRAME_FILES - src/frame/frame_manager.cpp - src/frame/frame_manager.h - src/frame/frame_options_view.cpp - src/frame/frame_options_view.h - src/frame/frame_style.cpp - src/frame/frame_style.h - src/frame/frame_tree_ctrl.cpp - src/frame/frame_tree_ctrl.h - src/frame/frame_view.cpp - src/frame/frame_view.h + src/frame/frame_manager.cpp + src/frame/frame_manager.h + src/frame/frame_options_view.cpp + src/frame/frame_options_view.h + src/frame/frame_style.cpp + src/frame/frame_style.h + src/frame/frame_tree_ctrl.cpp + src/frame/frame_tree_ctrl.h + src/frame/frame_view.cpp + src/frame/frame_view.h ) SET(FRAME_PCH_FILES - pch/frame_pch.cpp - pch/frame_pch.h + pch/frame_pch.cpp + pch/frame_pch.h ) SET(MODEL_FILES - src/model/model.cpp - src/model/model.h - src/model/model_tab_ctrl.cpp - src/model/model_tab_ctrl.h - src/model/model_view.cpp - src/model/model_view.h + src/model/model.cpp + src/model/model.h + src/model/model_tab_ctrl.cpp + src/model/model_tab_ctrl.h + src/model/model_view.cpp + src/model/model_view.h ) SET(MODEL_PCH_FILES - pch/model_pch.cpp - pch/model_pch.h + pch/model_pch.cpp + pch/model_pch.h ) SET(PLUGINS_FILES - src/plugins/plugin_info.cpp - src/plugins/plugin_info.h - src/plugins/plugin_interface.h - src/plugins/plugin_loader.cpp - src/plugins/plugin_loader.h + src/plugins/plugin_info.cpp + src/plugins/plugin_info.h + src/plugins/plugin_interface.h + src/plugins/plugin_loader.cpp + src/plugins/plugin_loader.h ) SET(PLUGIN_LOADER_PCH_FILES - pch/plugin_loader_pch.cpp - pch/plugin_loader_pch.h + pch/plugin_loader_pch.cpp + pch/plugin_loader_pch.h ) SET(TRACER_FILES - src/tracer/tracer.cpp - src/tracer/tracer.h - src/tracer/tracer_base.cpp - src/tracer/tracer_base.h - src/tracer/tracer_operation.cpp - src/tracer/tracer_operation.h - src/tracer/tracer_pattern.cpp - src/tracer/tracer_pattern.h - src/tracer/tracer_resource.cpp - src/tracer/tracer_resource.h - src/tracer/tracer_resource_type.cpp - src/tracer/tracer_resource_type.h - src/tracer/tracer_result.cpp - src/tracer/tracer_result.h - src/tracer/tracer_serie.cpp - src/tracer/tracer_serie.h - src/tracer/tracer_values.cpp - src/tracer/tracer_values.h + src/tracer/tracer.cpp + src/tracer/tracer.h + src/tracer/tracer_base.cpp + src/tracer/tracer_base.h + src/tracer/tracer_operation.cpp + src/tracer/tracer_operation.h + src/tracer/tracer_pattern.cpp + src/tracer/tracer_pattern.h + src/tracer/tracer_resource.cpp + src/tracer/tracer_resource.h + src/tracer/tracer_resource_type.cpp + src/tracer/tracer_resource_type.h + src/tracer/tracer_result.cpp + src/tracer/tracer_result.h + src/tracer/tracer_serie.cpp + src/tracer/tracer_serie.h + src/tracer/tracer_values.cpp + src/tracer/tracer_values.h ) SET(TRACER_CHART_FILES - src/tracer/chart/chart_doc.cpp - src/tracer/chart/chart_doc.h - src/tracer/chart/chart_preferences.cpp - src/tracer/chart/chart_preferences.h - src/tracer/chart/chart_serie.cpp - src/tracer/chart/chart_serie.h - src/tracer/chart/chart_tree.cpp - src/tracer/chart/chart_tree.h - src/tracer/chart/chart_tree_item.cpp - src/tracer/chart/chart_tree_item.h - src/tracer/chart/chart_view.cpp - src/tracer/chart/chart_view.h - src/tracer/chart/chart_view_style.cpp - src/tracer/chart/chart_view_style.h + src/tracer/chart/chart_doc.cpp + src/tracer/chart/chart_doc.h + src/tracer/chart/chart_preferences.cpp + src/tracer/chart/chart_preferences.h + src/tracer/chart/chart_serie.cpp + src/tracer/chart/chart_serie.h + src/tracer/chart/chart_tree.cpp + src/tracer/chart/chart_tree.h + src/tracer/chart/chart_tree_item.cpp + src/tracer/chart/chart_tree_item.h + src/tracer/chart/chart_view.cpp + src/tracer/chart/chart_view.h + src/tracer/chart/chart_view_style.cpp + src/tracer/chart/chart_view_style.h ) SET(TRACER_LOGGER_FILES - src/tracer/logger/tracer_logger_main_wnd.cpp - src/tracer/logger/tracer_logger_main_wnd.h - src/tracer/logger/tracer_logger_view.cpp - src/tracer/logger/tracer_logger_view.h - src/tracer/logger/tracer_logger_view_style.cpp - src/tracer/logger/tracer_logger_view_style.h + src/tracer/logger/tracer_logger_main_wnd.cpp + src/tracer/logger/tracer_logger_main_wnd.h + src/tracer/logger/tracer_logger_view.cpp + src/tracer/logger/tracer_logger_view.h + src/tracer/logger/tracer_logger_view_style.cpp + src/tracer/logger/tracer_logger_view_style.h ) SET(TRACER_PCH_FILES - pch/tracer_pch.cpp - pch/tracer_pch.h + pch/tracer_pch.cpp + pch/tracer_pch.h ) SET(QRC_FILES - res/rdo_studio.qrc + res/rdo_studio.qrc ) QT5_ADD_RESOURCES(GENERATED_QRC_FILES ${QRC_FILES}) @@ -268,112 +266,112 @@ SET(APP_NAME RAO-studio) CONFIGURE_FILE(${CMAKE_MODULE_PATH}/build.version.cmake ${CMAKE_CURRENT_BINARY_DIR}/build_version.h) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) SET(RESOURCES_FILES - ${CMAKE_CURRENT_BINARY_DIR}/build_version.h - ${QRC_FILES} + ${CMAKE_CURRENT_BINARY_DIR}/build_version.h + ${QRC_FILES} ) SET(RESOURCES_IMAGE_FILES - res/images/about.png - res/images/dock_build.png - res/images/dock_chart.png - res/images/dock_debug.png - res/images/dock_find.png - res/images/dock_frame.png - res/images/dock_process.png - res/images/dock_results.png - res/images/dock_trace.png - res/images/edit_copy.png - res/images/edit_copy_d.png - res/images/edit_cut.png - res/images/edit_cut_d.png - res/images/edit_paste.png - res/images/edit_paste_d.png - res/images/edit_redo.png - res/images/edit_redo_d.png - res/images/edit_undo.png - res/images/edit_undo_d.png - res/images/file_new.png - res/images/file_new_d.png - res/images/file_open.png - res/images/file_open_d.png - res/images/file_save.png - res/images/file_save_all.png - res/images/file_save_all_d.png - res/images/file_save_d.png - res/images/frameoptionsctrl.png - res/images/help_context.png - res/images/logo.png - res/images/mdi_chart.png - res/images/mdi_flowchart.png - res/images/mdi_frame.png - res/images/mdi_model.png - res/images/model_frame_next.png - res/images/model_frame_next_d.png - res/images/model_frame_prev.png - res/images/model_frame_prev_d.png - res/images/model_run.png - res/images/model_run_d.png - res/images/model_runtime_jump.png - res/images/model_runtime_jump_d.png - res/images/model_runtime_max_speed.png - res/images/model_runtime_max_speed_d.png - res/images/model_runtime_pause.png - res/images/model_runtime_pause_d.png - res/images/model_runtime_sync.png - res/images/model_runtime_sync_d.png - res/images/model_show_rate_dec.png - res/images/model_show_rate_dec_d.png - res/images/model_show_rate_dec_four.png - res/images/model_show_rate_dec_four_d.png - res/images/model_show_rate_inc.png - res/images/model_show_rate_inc_d.png - res/images/model_show_rate_inc_four.png - res/images/model_show_rate_inc_four_d.png - res/images/model_stop.png - res/images/model_stop_d.png - res/images/search_bookmark_next.png - res/images/search_bookmark_next_d.png - res/images/search_bookmark_prev.png - res/images/search_bookmark_prev_d.png - res/images/search_find.png - res/images/search_find_d.png - res/images/search_replace.png - res/images/search_replace_d.png - res/images/tree_chart_erased.png - res/images/tree_chart_root.png - res/images/tree_chart_sub_root_1.png - res/images/tree_chart_sub_root_2.png - res/images/tree_chart_sub_root_3.png - res/images/tree_chart_value.png - res/images/tree_frame_item.png - res/images/tree_frame_root.png - res/images/view_zoom_auto.png - res/images/view_zoom_auto_d.png - res/images/view_zoom_dec.png - res/images/view_zoom_dec_d.png - res/images/view_zoom_inc.png - res/images/view_zoom_inc_d.png - res/images/view_zoom_reset.png - res/images/view_zoom_reset_d.png + res/images/about.png + res/images/dock_build.png + res/images/dock_chart.png + res/images/dock_debug.png + res/images/dock_find.png + res/images/dock_frame.png + res/images/dock_process.png + res/images/dock_results.png + res/images/dock_trace.png + res/images/edit_copy.png + res/images/edit_copy_d.png + res/images/edit_cut.png + res/images/edit_cut_d.png + res/images/edit_paste.png + res/images/edit_paste_d.png + res/images/edit_redo.png + res/images/edit_redo_d.png + res/images/edit_undo.png + res/images/edit_undo_d.png + res/images/file_new.png + res/images/file_new_d.png + res/images/file_open.png + res/images/file_open_d.png + res/images/file_save.png + res/images/file_save_all.png + res/images/file_save_all_d.png + res/images/file_save_d.png + res/images/frameoptionsctrl.png + res/images/help_context.png + res/images/logo.png + res/images/mdi_chart.png + res/images/mdi_flowchart.png + res/images/mdi_frame.png + res/images/mdi_model.png + res/images/model_frame_next.png + res/images/model_frame_next_d.png + res/images/model_frame_prev.png + res/images/model_frame_prev_d.png + res/images/model_run.png + res/images/model_run_d.png + res/images/model_runtime_jump.png + res/images/model_runtime_jump_d.png + res/images/model_runtime_max_speed.png + res/images/model_runtime_max_speed_d.png + res/images/model_runtime_pause.png + res/images/model_runtime_pause_d.png + res/images/model_runtime_sync.png + res/images/model_runtime_sync_d.png + res/images/model_show_rate_dec.png + res/images/model_show_rate_dec_d.png + res/images/model_show_rate_dec_four.png + res/images/model_show_rate_dec_four_d.png + res/images/model_show_rate_inc.png + res/images/model_show_rate_inc_d.png + res/images/model_show_rate_inc_four.png + res/images/model_show_rate_inc_four_d.png + res/images/model_stop.png + res/images/model_stop_d.png + res/images/search_bookmark_next.png + res/images/search_bookmark_next_d.png + res/images/search_bookmark_prev.png + res/images/search_bookmark_prev_d.png + res/images/search_find.png + res/images/search_find_d.png + res/images/search_replace.png + res/images/search_replace_d.png + res/images/tree_chart_erased.png + res/images/tree_chart_root.png + res/images/tree_chart_sub_root_1.png + res/images/tree_chart_sub_root_2.png + res/images/tree_chart_sub_root_3.png + res/images/tree_chart_value.png + res/images/tree_frame_item.png + res/images/tree_frame_root.png + res/images/view_zoom_auto.png + res/images/view_zoom_auto_d.png + res/images/view_zoom_dec.png + res/images/view_zoom_dec_d.png + res/images/view_zoom_inc.png + res/images/view_zoom_inc_d.png + res/images/view_zoom_reset.png + res/images/view_zoom_reset_d.png ) SET(RESOURCES_SCINTILLA_FILES - res/scintilla/ac_data.xpm - res/scintilla/ac_function.xpm - res/scintilla/ac_trace.xpm + res/scintilla/ac_data.xpm + res/scintilla/ac_function.xpm + res/scintilla/ac_trace.xpm ) SET(RESOURCES_UI_FILES - res/ui/about_dialog.ui - res/ui/chart_preferences.ui - res/ui/file_association_dialog.ui - res/ui/find_dialog.ui - res/ui/find_replace_dialog.ui - res/ui/frame_options_widget.ui - res/ui/goto_line_dialog.ui - res/ui/main_window.ui - res/ui/new_model_dialog.ui - res/ui/view_preferenses.ui + res/ui/about_dialog.ui + res/ui/chart_preferences.ui + res/ui/file_association_dialog.ui + res/ui/find_dialog.ui + res/ui/find_replace_dialog.ui + res/ui/frame_options_widget.ui + res/ui/goto_line_dialog.ui + res/ui/main_window.ui + res/ui/new_model_dialog.ui + res/ui/view_preferenses.ui ) QT5_WRAP_UI(GENERATED_RESOURCES_UI_FILES ${RESOURCES_UI_FILES}) @@ -391,39 +389,39 @@ ELSEIF (MINGW) ENDIF() SET(RDO_APP_MOC_FILES - src/dialog/about_dialog.h - src/dialog/file_association_dialog.h - src/dialog/find_dialog.h - src/dialog/find_replace_dialog.h - src/dialog/goto_line_dialog.h - src/dialog/new_model_dialog.h - src/dock/dock_focusable.h - src/main_window.h - src/view_preferences.h + src/dialog/about_dialog.h + src/dialog/file_association_dialog.h + src/dialog/find_dialog.h + src/dialog/find_replace_dialog.h + src/dialog/goto_line_dialog.h + src/dialog/new_model_dialog.h + src/dock/dock_focusable.h + src/main_window.h + src/view_preferences.h ) SET(RDO_EDITOR_MOC_FILES - src/editor/edit.h - src/editor/log_edit.h + src/editor/edit.h + src/editor/log_edit.h ) SET(RDO_FRAME_MOC_FILES - src/frame/frame_manager.h - src/frame/frame_tree_ctrl.h - src/frame/frame_view.h + src/frame/frame_manager.h + src/frame/frame_tree_ctrl.h + src/frame/frame_view.h ) SET(RDO_MODEL_MOC_FILES - src/editor/model_edit.h - src/model/model.h - src/model/model_view.h + src/editor/model_edit.h + src/model/model.h + src/model/model_view.h ) SET(RDO_TRACER_MOC_FILES - src/tracer/chart/chart_preferences.h - src/tracer/chart/chart_tree.h - src/tracer/chart/chart_view.h - src/tracer/logger/tracer_logger_view.h + src/tracer/chart/chart_preferences.h + src/tracer/chart/chart_tree.h + src/tracer/chart/chart_view.h + src/tracer/logger/tracer_logger_view.h ) SET(QT_MOC_FLAGS) @@ -431,121 +429,121 @@ QT5_GET_MOC_FLAGS(QT_MOC_FLAGS) SET(GENERATED_APP_MOC_FILES) FOREACH(RDO_APP_MOC_FILES_IT ${RDO_APP_MOC_FILES}) - QT5_WRAP_CPP(GENERATED_RDO_APP_MOC_FILES_IT ${RDO_APP_MOC_FILES_IT} OPTIONS ${QT_MOC_FLAGS} "-fapp/rdo_studio/pch/application_pch.h" "-futils/src/common/warning_disable.h" "-fapp/rdo_studio/${RDO_APP_MOC_FILES_IT}") - SET(GENERATED_APP_MOC_FILES ${GENERATED_APP_MOC_FILES} ${GENERATED_RDO_APP_MOC_FILES_IT}) + QT5_WRAP_CPP(GENERATED_RDO_APP_MOC_FILES_IT ${RDO_APP_MOC_FILES_IT} OPTIONS ${QT_MOC_FLAGS} "-fapp/rdo_studio/pch/application_pch.h" "-futils/src/common/warning_disable.h" "-fapp/rdo_studio/${RDO_APP_MOC_FILES_IT}") + SET(GENERATED_APP_MOC_FILES ${GENERATED_APP_MOC_FILES} ${GENERATED_RDO_APP_MOC_FILES_IT}) ENDFOREACH() SET(GENERATED_EDITOR_MOC_FILES) FOREACH(RDO_EDITOR_MOC_FILES_IT ${RDO_EDITOR_MOC_FILES}) - QT5_WRAP_CPP(GENERATED_RDO_EDITOR_MOC_FILES_IT ${RDO_EDITOR_MOC_FILES_IT} OPTIONS ${QT_MOC_FLAGS} "-fapp/rdo_studio/pch/editor_pch.h" "-futils/src/common/warning_disable.h" "-fapp/rdo_studio/${RDO_EDITOR_MOC_FILES_IT}") - SET(GENERATED_EDITOR_MOC_FILES ${GENERATED_EDITOR_MOC_FILES} ${GENERATED_RDO_EDITOR_MOC_FILES_IT}) + QT5_WRAP_CPP(GENERATED_RDO_EDITOR_MOC_FILES_IT ${RDO_EDITOR_MOC_FILES_IT} OPTIONS ${QT_MOC_FLAGS} "-fapp/rdo_studio/pch/editor_pch.h" "-futils/src/common/warning_disable.h" "-fapp/rdo_studio/${RDO_EDITOR_MOC_FILES_IT}") + SET(GENERATED_EDITOR_MOC_FILES ${GENERATED_EDITOR_MOC_FILES} ${GENERATED_RDO_EDITOR_MOC_FILES_IT}) ENDFOREACH() SET(GENERATED_FRAME_MOC_FILES) FOREACH(RDO_FRAME_MOC_FILES_IT ${RDO_FRAME_MOC_FILES}) - QT5_WRAP_CPP(GENERATED_RDO_FRAME_MOC_FILES_IT ${RDO_FRAME_MOC_FILES_IT} OPTIONS ${QT_MOC_FLAGS} "-fapp/rdo_studio/pch/frame_pch.h" "-futils/src/common/warning_disable.h" "-fapp/rdo_studio/${RDO_FRAME_MOC_FILES_IT}") - SET(GENERATED_FRAME_MOC_FILES ${GENERATED_FRAME_MOC_FILES} ${GENERATED_RDO_FRAME_MOC_FILES_IT}) + QT5_WRAP_CPP(GENERATED_RDO_FRAME_MOC_FILES_IT ${RDO_FRAME_MOC_FILES_IT} OPTIONS ${QT_MOC_FLAGS} "-fapp/rdo_studio/pch/frame_pch.h" "-futils/src/common/warning_disable.h" "-fapp/rdo_studio/${RDO_FRAME_MOC_FILES_IT}") + SET(GENERATED_FRAME_MOC_FILES ${GENERATED_FRAME_MOC_FILES} ${GENERATED_RDO_FRAME_MOC_FILES_IT}) ENDFOREACH() SET(GENERATED_MODEL_MOC_FILES) FOREACH(RDO_MODEL_MOC_FILES_IT ${RDO_MODEL_MOC_FILES}) - QT5_WRAP_CPP(GENERATED_RDO_MODEL_MOC_FILES_IT ${RDO_MODEL_MOC_FILES_IT} OPTIONS ${QT_MOC_FLAGS} "-fapp/rdo_studio/pch/model_pch.h" "-futils/src/common/warning_disable.h" "-fapp/rdo_studio/${RDO_MODEL_MOC_FILES_IT}") - SET(GENERATED_MODEL_MOC_FILES ${GENERATED_MODEL_MOC_FILES} ${GENERATED_RDO_MODEL_MOC_FILES_IT}) + QT5_WRAP_CPP(GENERATED_RDO_MODEL_MOC_FILES_IT ${RDO_MODEL_MOC_FILES_IT} OPTIONS ${QT_MOC_FLAGS} "-fapp/rdo_studio/pch/model_pch.h" "-futils/src/common/warning_disable.h" "-fapp/rdo_studio/${RDO_MODEL_MOC_FILES_IT}") + SET(GENERATED_MODEL_MOC_FILES ${GENERATED_MODEL_MOC_FILES} ${GENERATED_RDO_MODEL_MOC_FILES_IT}) ENDFOREACH() SET(GENERATED_TRACER_MOC_FILES) FOREACH(RDO_TRACER_MOC_FILES_IT ${RDO_TRACER_MOC_FILES}) - QT5_WRAP_CPP(GENERATED_RDO_TRACER_MOC_FILES_IT ${RDO_TRACER_MOC_FILES_IT} OPTIONS ${QT_MOC_FLAGS} "-fapp/rdo_studio/pch/tracer_pch.h" "-futils/src/common/warning_disable.h" "-fapp/rdo_studio/${RDO_TRACER_MOC_FILES_IT}") - SET(GENERATED_TRACER_MOC_FILES ${GENERATED_TRACER_MOC_FILES} ${GENERATED_RDO_TRACER_MOC_FILES_IT}) + QT5_WRAP_CPP(GENERATED_RDO_TRACER_MOC_FILES_IT ${RDO_TRACER_MOC_FILES_IT} OPTIONS ${QT_MOC_FLAGS} "-fapp/rdo_studio/pch/tracer_pch.h" "-futils/src/common/warning_disable.h" "-fapp/rdo_studio/${RDO_TRACER_MOC_FILES_IT}") + SET(GENERATED_TRACER_MOC_FILES ${GENERATED_TRACER_MOC_FILES} ${GENERATED_RDO_TRACER_MOC_FILES_IT}) ENDFOREACH() SET(APP_SOURCE_FILES - ${APPLICATION_FILES} - ${APPLICATION_ACTIONACTIVATOR_FILES} - ${DIALOG_FILES} - ${DOCK_FILES} - ${RESOURCES_FILES} - ${RESOURCES_IMAGE_FILES} - ${RESOURCES_SCINTILLA_FILES} - ${RESOURCES_UI_FILES} - ${APPLICATION_PCH_FILES} - ${GENERATED_APP_MOC_FILES} + ${APPLICATION_FILES} + ${APPLICATION_ACTIONACTIVATOR_FILES} + ${DIALOG_FILES} + ${DOCK_FILES} + ${RESOURCES_FILES} + ${RESOURCES_IMAGE_FILES} + ${RESOURCES_SCINTILLA_FILES} + ${RESOURCES_UI_FILES} + ${APPLICATION_PCH_FILES} + ${GENERATED_APP_MOC_FILES} ) SET(EDITOR_SOURCE_FILES - ${EDITOR_FILES} - ${EDITOR_DEBUG_FILES} - ${EDITOR_LEXER_FILES} - ${EDITOR_LOG_FILES} - ${EDITOR_LOG_BUILD_FILES} - ${EDITOR_LOG_FIND_FILES} - ${EDITOR_PARSER_FILES} - ${EDITOR_RESULTS_FILES} - ${EDITOR_PCH_FILES} - ${GENERATED_EDITOR_MOC_FILES} + ${EDITOR_FILES} + ${EDITOR_DEBUG_FILES} + ${EDITOR_LEXER_FILES} + ${EDITOR_LOG_FILES} + ${EDITOR_LOG_BUILD_FILES} + ${EDITOR_LOG_FIND_FILES} + ${EDITOR_PARSER_FILES} + ${EDITOR_RESULTS_FILES} + ${EDITOR_PCH_FILES} + ${GENERATED_EDITOR_MOC_FILES} ) SET(FRAME_SOURCE_FILES - ${FRAME_FILES} - ${FRAME_PCH_FILES} - ${GENERATED_FRAME_MOC_FILES} + ${FRAME_FILES} + ${FRAME_PCH_FILES} + ${GENERATED_FRAME_MOC_FILES} ) SET(MODEL_SOURCE_FILES - ${EDITOR_MODEL_FILES} - ${MODEL_FILES} - ${MODEL_PCH_FILES} - ${GENERATED_MODEL_MOC_FILES} + ${EDITOR_MODEL_FILES} + ${MODEL_FILES} + ${MODEL_PCH_FILES} + ${GENERATED_MODEL_MOC_FILES} ) SET(TRACER_SOURCE_FILES - ${TRACER_FILES} - ${TRACER_CHART_FILES} - ${TRACER_LOGGER_FILES} - ${TRACER_PCH_FILES} - ${GENERATED_TRACER_MOC_FILES} + ${TRACER_FILES} + ${TRACER_CHART_FILES} + ${TRACER_LOGGER_FILES} + ${TRACER_PCH_FILES} + ${GENERATED_TRACER_MOC_FILES} ) SET(PLUGIN_LOADER_SOURCE_FILES - ${PLUGINS_FILES} - ${PLUGIN_LOADER_PCH_FILES} + ${PLUGINS_FILES} + ${PLUGIN_LOADER_PCH_FILES} ) SET(RDO_STUDIO_SOURCE_FILES - ${MAIN_FILES} - ${RESOURCES_WIN32_FILES} - ${STUDIO_PCH_FILES} + ${MAIN_FILES} + ${RESOURCES_WIN32_FILES} + ${STUDIO_PCH_FILES} ) ADD_EXECUTABLE(rdo_studio - ${RDO_STUDIO_SOURCE_FILES} - ${TEXT_FILES} + ${RDO_STUDIO_SOURCE_FILES} + ${TEXT_FILES} ) ADD_LIBRARY(rdo_application STATIC - ${APP_SOURCE_FILES} - ${GENERATED_RESOURCES_UI_FILES} - ${GENERATED_QRC_FILES} + ${APP_SOURCE_FILES} + ${GENERATED_RESOURCES_UI_FILES} + ${GENERATED_QRC_FILES} ) ADD_LIBRARY(rdo_editor STATIC - ${EDITOR_SOURCE_FILES} + ${EDITOR_SOURCE_FILES} ) ADD_LIBRARY(rdo_frame STATIC - ${FRAME_SOURCE_FILES} + ${FRAME_SOURCE_FILES} ) ADD_LIBRARY(rdo_model STATIC - ${MODEL_SOURCE_FILES} + ${MODEL_SOURCE_FILES} ) ADD_LIBRARY(rdo_tracer STATIC - ${TRACER_SOURCE_FILES} + ${TRACER_SOURCE_FILES} ) ADD_LIBRARY(rdo_plugin_loader STATIC - ${PLUGIN_LOADER_SOURCE_FILES} + ${PLUGIN_LOADER_SOURCE_FILES} ) INCLUDE(${PROJECT_SOURCE_DIR}/app/rdo_studio/projects/common/rdo_studio.cmake) @@ -661,172 +659,172 @@ INSTALL(TARGETS rdo_tracer DESTINATION lib) IF(MSVC_IDE) # options for windows # - INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) - ADD_PCH("${RDO_STUDIO_SOURCE_FILES}" "${STUDIO_PCH_FILES}" app/rdo_studio pch stdpch) - ADD_PCH("${APP_SOURCE_FILES}" "${APPLICATION_PCH_FILES}" app/rdo_studio pch application_pch) - ADD_PCH("${EDITOR_SOURCE_FILES}" "${EDITOR_PCH_FILES}" app/rdo_studio pch editor_pch) - ADD_PCH("${FRAME_SOURCE_FILES}" "${FRAME_PCH_FILES}" app/rdo_studio pch frame_pch) - ADD_PCH("${MODEL_SOURCE_FILES}" "${MODEL_PCH_FILES}" app/rdo_studio pch model_pch) - ADD_PCH("${PLUGIN_LOADER_SOURCE_FILES}" "${PLUGIN_LOADER_PCH_FILES}" app/rdo_studio pch plugin_loader_pch) - ADD_PCH("${TRACER_SOURCE_FILES}" "${TRACER_PCH_FILES}" app/rdo_studio pch tracer_pch) - - SOURCE_GROUP("rdo_studio\\.doc" FILES - ${DOC_FILES} - ) - - SOURCE_GROUP("rdo_studio\\.pch" FILES - ${STUDIO_PCH_FILES} - ) - - SOURCE_GROUP("rdo_studio" FILES - ${MAIN_FILES} - ) - - SOURCE_GROUP("rdo_studio\\.resources\\.win32" FILES - ${RESOURCES_WIN32_FILES} - ) - - SOURCE_GROUP("rdo_application\\.application" FILES - ${APPLICATION_FILES} - ) - - SOURCE_GROUP("rdo_application\\.application\\.action_activator" FILES - ${APPLICATION_ACTIONACTIVATOR_FILES} - ) - - SOURCE_GROUP("rdo_application\\.dialog" FILES - ${DIALOG_FILES} - ) - - SOURCE_GROUP("rdo_application\\.dock" FILES - ${DOCK_FILES} - ) - - SOURCE_GROUP("rdo_application\\.generated\\.ui" FILES - ${GENERATED_RESOURCES_UI_FILES} - ) - - SOURCE_GROUP("rdo_application\\.generated\\.qrc" FILES - ${GENERATED_QRC_FILES} - ) - - SOURCE_GROUP("rdo_application\\.generated\\.moc" FILES - ${GENERATED_APP_MOC_FILES} - ) - - SOURCE_GROUP("rdo_application\\.resources" FILES - ${RESOURCES_FILES} - ) - - SOURCE_GROUP("rdo_application\\.resources\\.images" FILES - ${RESOURCES_IMAGE_FILES} - ) - - SOURCE_GROUP("rdo_application\\.resources\\.scintilla" FILES - ${RESOURCES_SCINTILLA_FILES} - ) - - SOURCE_GROUP("rdo_application\\.resources\\.ui" FILES - ${RESOURCES_UI_FILES} - ) - - SOURCE_GROUP("rdo_application\\.pch" FILES - ${APPLICATION_PCH_FILES} - ) - - SOURCE_GROUP("rdo_editor\\.editor" FILES - ${EDITOR_FILES} - ) - - SOURCE_GROUP("rdo_editor\\.editor\\.debug" FILES - ${EDITOR_DEBUG_FILES} - ) - - SOURCE_GROUP("rdo_editor\\.editor\\.lexer" FILES - ${EDITOR_LEXER_FILES} - ) - - SOURCE_GROUP("rdo_editor\\.editor\\.log" FILES - ${EDITOR_LOG_FILES} - ) - - SOURCE_GROUP("rdo_editor\\.editor\\.log\\.build" FILES - ${EDITOR_LOG_BUILD_FILES} - ) - - SOURCE_GROUP("rdo_editor\\.editor\\.log\\.find" FILES - ${EDITOR_LOG_FIND_FILES} - ) - - SOURCE_GROUP("rdo_editor\\.editor\\.parser" FILES - ${EDITOR_PARSER_FILES} - ) - - SOURCE_GROUP("rdo_editor\\.editor\\.results" FILES - ${EDITOR_RESULTS_FILES} - ) - - SOURCE_GROUP("rdo_editor\\.generated\\.moc" FILES - ${GENERATED_EDITOR_MOC_FILES} - ) - - SOURCE_GROUP("rdo_editor\\.pch" FILES - ${EDITOR_PCH_FILES} - ) - - SOURCE_GROUP("rdo_frame\\.frame" FILES - ${FRAME_FILES} - ) - - SOURCE_GROUP("rdo_frame\\.generated\\.moc" FILES - ${GENERATED_FRAME_MOC_FILES} - ) - - SOURCE_GROUP("rdo_frame\\.pch" FILES - ${FRAME_PCH_FILES} - ) - - SOURCE_GROUP("rdo_model\\.editor" FILES - ${EDITOR_MODEL_FILES} - ) - - SOURCE_GROUP("rdo_model\\.model" FILES - ${MODEL_FILES} - ) - - SOURCE_GROUP("rdo_model\\.generated\\.moc" FILES - ${GENERATED_MODEL_MOC_FILES} - ) - - SOURCE_GROUP("rdo_model\\.pch" FILES - ${MODEL_PCH_FILES} - ) - - SOURCE_GROUP("rdo_plugin_loader\\.plugins" FILES - ${PLUGINS_FILES} - ) - - SOURCE_GROUP("rdo_plugin_loader\\.pch" FILES - ${PLUGIN_LOADER_PCH_FILES} - ) - - SOURCE_GROUP("rdo_tracer\\.tracer" FILES - ${TRACER_FILES} - ) - - SOURCE_GROUP("rdo_tracer\\.tracer\\.chart" FILES - ${TRACER_CHART_FILES} - ) - - SOURCE_GROUP("rdo_tracer\\.tracer\\.logger" FILES - ${TRACER_LOGGER_FILES} - ) - - SOURCE_GROUP("rdo_tracer\\.generated\\.moc" FILES - ${GENERATED_TRACER_MOC_FILES} - ) - - SOURCE_GROUP("rdo_tracer\\.pch" FILES - ${TRACER_PCH_FILES} - ) + INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) + ADD_PCH("${RDO_STUDIO_SOURCE_FILES}" "${STUDIO_PCH_FILES}" app/rdo_studio pch stdpch) + ADD_PCH("${APP_SOURCE_FILES}" "${APPLICATION_PCH_FILES}" app/rdo_studio pch application_pch) + ADD_PCH("${EDITOR_SOURCE_FILES}" "${EDITOR_PCH_FILES}" app/rdo_studio pch editor_pch) + ADD_PCH("${FRAME_SOURCE_FILES}" "${FRAME_PCH_FILES}" app/rdo_studio pch frame_pch) + ADD_PCH("${MODEL_SOURCE_FILES}" "${MODEL_PCH_FILES}" app/rdo_studio pch model_pch) + ADD_PCH("${PLUGIN_LOADER_SOURCE_FILES}" "${PLUGIN_LOADER_PCH_FILES}" app/rdo_studio pch plugin_loader_pch) + ADD_PCH("${TRACER_SOURCE_FILES}" "${TRACER_PCH_FILES}" app/rdo_studio pch tracer_pch) + + SOURCE_GROUP("rdo_studio\\.doc" FILES + ${DOC_FILES} + ) + + SOURCE_GROUP("rdo_studio\\.pch" FILES + ${STUDIO_PCH_FILES} + ) + + SOURCE_GROUP("rdo_studio" FILES + ${MAIN_FILES} + ) + + SOURCE_GROUP("rdo_studio\\.resources\\.win32" FILES + ${RESOURCES_WIN32_FILES} + ) + + SOURCE_GROUP("rdo_application\\.application" FILES + ${APPLICATION_FILES} + ) + + SOURCE_GROUP("rdo_application\\.application\\.action_activator" FILES + ${APPLICATION_ACTIONACTIVATOR_FILES} + ) + + SOURCE_GROUP("rdo_application\\.dialog" FILES + ${DIALOG_FILES} + ) + + SOURCE_GROUP("rdo_application\\.dock" FILES + ${DOCK_FILES} + ) + + SOURCE_GROUP("rdo_application\\.generated\\.ui" FILES + ${GENERATED_RESOURCES_UI_FILES} + ) + + SOURCE_GROUP("rdo_application\\.generated\\.qrc" FILES + ${GENERATED_QRC_FILES} + ) + + SOURCE_GROUP("rdo_application\\.generated\\.moc" FILES + ${GENERATED_APP_MOC_FILES} + ) + + SOURCE_GROUP("rdo_application\\.resources" FILES + ${RESOURCES_FILES} + ) + + SOURCE_GROUP("rdo_application\\.resources\\.images" FILES + ${RESOURCES_IMAGE_FILES} + ) + + SOURCE_GROUP("rdo_application\\.resources\\.scintilla" FILES + ${RESOURCES_SCINTILLA_FILES} + ) + + SOURCE_GROUP("rdo_application\\.resources\\.ui" FILES + ${RESOURCES_UI_FILES} + ) + + SOURCE_GROUP("rdo_application\\.pch" FILES + ${APPLICATION_PCH_FILES} + ) + + SOURCE_GROUP("rdo_editor\\.editor" FILES + ${EDITOR_FILES} + ) + + SOURCE_GROUP("rdo_editor\\.editor\\.debug" FILES + ${EDITOR_DEBUG_FILES} + ) + + SOURCE_GROUP("rdo_editor\\.editor\\.lexer" FILES + ${EDITOR_LEXER_FILES} + ) + + SOURCE_GROUP("rdo_editor\\.editor\\.log" FILES + ${EDITOR_LOG_FILES} + ) + + SOURCE_GROUP("rdo_editor\\.editor\\.log\\.build" FILES + ${EDITOR_LOG_BUILD_FILES} + ) + + SOURCE_GROUP("rdo_editor\\.editor\\.log\\.find" FILES + ${EDITOR_LOG_FIND_FILES} + ) + + SOURCE_GROUP("rdo_editor\\.editor\\.parser" FILES + ${EDITOR_PARSER_FILES} + ) + + SOURCE_GROUP("rdo_editor\\.editor\\.results" FILES + ${EDITOR_RESULTS_FILES} + ) + + SOURCE_GROUP("rdo_editor\\.generated\\.moc" FILES + ${GENERATED_EDITOR_MOC_FILES} + ) + + SOURCE_GROUP("rdo_editor\\.pch" FILES + ${EDITOR_PCH_FILES} + ) + + SOURCE_GROUP("rdo_frame\\.frame" FILES + ${FRAME_FILES} + ) + + SOURCE_GROUP("rdo_frame\\.generated\\.moc" FILES + ${GENERATED_FRAME_MOC_FILES} + ) + + SOURCE_GROUP("rdo_frame\\.pch" FILES + ${FRAME_PCH_FILES} + ) + + SOURCE_GROUP("rdo_model\\.editor" FILES + ${EDITOR_MODEL_FILES} + ) + + SOURCE_GROUP("rdo_model\\.model" FILES + ${MODEL_FILES} + ) + + SOURCE_GROUP("rdo_model\\.generated\\.moc" FILES + ${GENERATED_MODEL_MOC_FILES} + ) + + SOURCE_GROUP("rdo_model\\.pch" FILES + ${MODEL_PCH_FILES} + ) + + SOURCE_GROUP("rdo_plugin_loader\\.plugins" FILES + ${PLUGINS_FILES} + ) + + SOURCE_GROUP("rdo_plugin_loader\\.pch" FILES + ${PLUGIN_LOADER_PCH_FILES} + ) + + SOURCE_GROUP("rdo_tracer\\.tracer" FILES + ${TRACER_FILES} + ) + + SOURCE_GROUP("rdo_tracer\\.tracer\\.chart" FILES + ${TRACER_CHART_FILES} + ) + + SOURCE_GROUP("rdo_tracer\\.tracer\\.logger" FILES + ${TRACER_LOGGER_FILES} + ) + + SOURCE_GROUP("rdo_tracer\\.generated\\.moc" FILES + ${GENERATED_TRACER_MOC_FILES} + ) + + SOURCE_GROUP("rdo_tracer\\.pch" FILES + ${TRACER_PCH_FILES} + ) ENDIF() diff --git a/app/rdo_studio/help/CMakeLists.txt b/app/rdo_studio/help/CMakeLists.txt index e5fe65bc6..a7ccba736 100644 --- a/app/rdo_studio/help/CMakeLists.txt +++ b/app/rdo_studio/help/CMakeLists.txt @@ -9,22 +9,22 @@ SET(QT_BIN_DIR ${QT_DIR}/bin) SET(QT_PLUGIN_PATH ${QT_DIR}/plugins) FIND_PROGRAM( - QCOLLECTIONGENERATOR_EXECUTABLE - NAME qcollectiongenerator - PATHS ${QT_BIN_DIR} + QCOLLECTIONGENERATOR_EXECUTABLE + NAME qcollectiongenerator + PATHS ${QT_BIN_DIR} ) IF(NOT QCOLLECTIONGENERATOR_EXECUTABLE) - MESSAGE(FATAL_ERROR "Unable to find 'qcollectiongenerator' program") + MESSAGE(FATAL_ERROR "Unable to find 'qcollectiongenerator' program") ENDIF() SET(HELP_COLLECTION_FILES - RAO-help-collection.qhcp + RAO-help-collection.qhcp ) SET(HELP_PROJECT_FILES - rdo_lang_rus.qhp - rdo_studio_rus.qhp + rdo_lang_rus.qhp + rdo_studio_rus.qhp ) FILE(GLOB RDOLANGRUS_HTML_FILES "rdo_lang_rus/html/*.htm") @@ -44,41 +44,41 @@ FILE(GLOB RDOSTUDIORUS_HTML_WORK_OPTIONS_FILES "rdo_studio_rus/html/work_options FILE(GLOB RDOSTUDIORUS_IMAGES_FILES "rdo_studio_rus/images/*") SET(SOURCES_FILES - ${HELP_COLLECTION_FILES} - ${HELP_PROJECT_FILES} - ${RDOLANGRUS_HTML_FILES} - ${RDOLANGRUS_HTML_RDO_BASE_FILES} - ${RDOLANGRUS_HTML_RDO_DPT_FILES} - ${RDOLANGRUS_HTML_RDO_LEX_DIV_FILES} - ${RDOLANGRUS_HTML_RDO_OBJ_FILES} - ${RDOLANGRUS_HTML_RDO_OBJ_SEC_FILES} - ${RDOLANGRUS_HTML_RDO_OBJ_PAT_TYPE_FILES} - ${RDOLANGRUS_HTML_RDO_RES_FILES} - ${RDOLANGRUS_HTML_RDO_THEORY_FILES} - ${RDOLANGRUS_IMAGES_FILES} - ${RDOSTUDIORUS_HTML_FILES} - ${RDOSTUDIORUS_HTML_WORK_MODEL_FILES} - ${RDOSTUDIORUS_HTML_WORK_OPTIONS_FILES} - ${RDOSTUDIORUS_IMAGES_FILES} + ${HELP_COLLECTION_FILES} + ${HELP_PROJECT_FILES} + ${RDOLANGRUS_HTML_FILES} + ${RDOLANGRUS_HTML_RDO_BASE_FILES} + ${RDOLANGRUS_HTML_RDO_DPT_FILES} + ${RDOLANGRUS_HTML_RDO_LEX_DIV_FILES} + ${RDOLANGRUS_HTML_RDO_OBJ_FILES} + ${RDOLANGRUS_HTML_RDO_OBJ_SEC_FILES} + ${RDOLANGRUS_HTML_RDO_OBJ_PAT_TYPE_FILES} + ${RDOLANGRUS_HTML_RDO_RES_FILES} + ${RDOLANGRUS_HTML_RDO_THEORY_FILES} + ${RDOLANGRUS_IMAGES_FILES} + ${RDOSTUDIORUS_HTML_FILES} + ${RDOSTUDIORUS_HTML_WORK_MODEL_FILES} + ${RDOSTUDIORUS_HTML_WORK_OPTIONS_FILES} + ${RDOSTUDIORUS_IMAGES_FILES} ) ADD_CUSTOM_COMMAND( - OUTPUT ${PROJECT_BINARY_DIR}/RAO-help.qhc ${PROJECT_BINARY_DIR}/rdo_lang_rus.qch ${PROJECT_BINARY_DIR}/rdo_studio_rus.qch - COMMAND ${QCOLLECTIONGENERATOR_EXECUTABLE} ARGS RAO-help-collection.qhcp -o RAO-help.qhc - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/RAO-help.qhc ${PROJECT_BINARY_DIR}/RAO-help.qhc - COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/RAO-help.qhc - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/rdo_lang_rus.qch ${PROJECT_BINARY_DIR}/rdo_lang_rus.qch - COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/rdo_lang_rus.qch - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/rdo_studio_rus.qch ${PROJECT_BINARY_DIR}/rdo_studio_rus.qch - COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/rdo_studio_rus.qch - DEPENDS ${SOURCES_FILES} - COMMENT "generate help files" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + OUTPUT ${PROJECT_BINARY_DIR}/RAO-help.qhc ${PROJECT_BINARY_DIR}/rdo_lang_rus.qch ${PROJECT_BINARY_DIR}/rdo_studio_rus.qch + COMMAND ${QCOLLECTIONGENERATOR_EXECUTABLE} ARGS RAO-help-collection.qhcp -o RAO-help.qhc + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/RAO-help.qhc ${PROJECT_BINARY_DIR}/RAO-help.qhc + COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/RAO-help.qhc + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/rdo_lang_rus.qch ${PROJECT_BINARY_DIR}/rdo_lang_rus.qch + COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/rdo_lang_rus.qch + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/rdo_studio_rus.qch ${PROJECT_BINARY_DIR}/rdo_studio_rus.qch + COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/rdo_studio_rus.qch + DEPENDS ${SOURCES_FILES} + COMMENT "generate help files" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) ADD_CUSTOM_TARGET(rdo_help - SOURCES ${SOURCES_FILES} - DEPENDS ${PROJECT_BINARY_DIR}/RAO-help.qhc + SOURCES ${SOURCES_FILES} + DEPENDS ${PROJECT_BINARY_DIR}/RAO-help.qhc ) INCLUDE(${PROJECT_SOURCE_DIR}/app/rdo_studio/projects/common/rdo_studio.cmake) @@ -86,68 +86,68 @@ SET_TARGET_PROPERTIES(rdo_help PROPERTIES FOLDER ${APP_FOLDER}/.help) IF(MSVC) # options for windows # - SOURCE_GROUP(".collection" FILES - ${HELP_COLLECTION_FILES} - ) + SOURCE_GROUP(".collection" FILES + ${HELP_COLLECTION_FILES} + ) - SOURCE_GROUP(".project" FILES - ${HELP_PROJECT_FILES} - ) + SOURCE_GROUP(".project" FILES + ${HELP_PROJECT_FILES} + ) - SOURCE_GROUP(".rdo_lang_rus\\.html" FILES - ${RDOLANGRUS_HTML_FILES} - ) + SOURCE_GROUP(".rdo_lang_rus\\.html" FILES + ${RDOLANGRUS_HTML_FILES} + ) - SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_base" FILES - ${RDOLANGRUS_HTML_RDO_BASE_FILES} - ) + SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_base" FILES + ${RDOLANGRUS_HTML_RDO_BASE_FILES} + ) - SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_dpt" FILES - ${RDOLANGRUS_HTML_RDO_DPT_FILES} - ) + SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_dpt" FILES + ${RDOLANGRUS_HTML_RDO_DPT_FILES} + ) - SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_lex_div" FILES - ${RDOLANGRUS_HTML_RDO_LEX_DIV_FILES} - ) + SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_lex_div" FILES + ${RDOLANGRUS_HTML_RDO_LEX_DIV_FILES} + ) - SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_obj" FILES - ${RDOLANGRUS_HTML_RDO_OBJ_FILES} - ) + SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_obj" FILES + ${RDOLANGRUS_HTML_RDO_OBJ_FILES} + ) - SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_obj\\rdo_obj_sec" FILES - ${RDOLANGRUS_HTML_RDO_OBJ_SEC_FILES} - ) + SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_obj\\rdo_obj_sec" FILES + ${RDOLANGRUS_HTML_RDO_OBJ_SEC_FILES} + ) - SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_obj\\rdo_pat_type" FILES - ${RDOLANGRUS_HTML_RDO_OBJ_PAT_TYPE_FILES} - ) + SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_obj\\rdo_pat_type" FILES + ${RDOLANGRUS_HTML_RDO_OBJ_PAT_TYPE_FILES} + ) - SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_res" FILES - ${RDOLANGRUS_HTML_RDO_RES_FILES} - ) + SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_res" FILES + ${RDOLANGRUS_HTML_RDO_RES_FILES} + ) - SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_theory" FILES - ${RDOLANGRUS_HTML_RDO_THEORY_FILES} - ) + SOURCE_GROUP(".rdo_lang_rus\\.html\\rdo_theory" FILES + ${RDOLANGRUS_HTML_RDO_THEORY_FILES} + ) - SOURCE_GROUP(".rdo_lang_rus\\.images" FILES - ${RDOLANGRUS_IMAGES_FILES} - ) + SOURCE_GROUP(".rdo_lang_rus\\.images" FILES + ${RDOLANGRUS_IMAGES_FILES} + ) - SOURCE_GROUP(".rdo_studio_rus\\.html" FILES - ${RDOSTUDIORUS_HTML_FILES} - ) + SOURCE_GROUP(".rdo_studio_rus\\.html" FILES + ${RDOSTUDIORUS_HTML_FILES} + ) - SOURCE_GROUP(".rdo_studio_rus\\.html\\work_model" FILES - ${RDOSTUDIORUS_HTML_WORK_MODEL_FILES} - ) + SOURCE_GROUP(".rdo_studio_rus\\.html\\work_model" FILES + ${RDOSTUDIORUS_HTML_WORK_MODEL_FILES} + ) - SOURCE_GROUP(".rdo_studio_rus\\.html\\work_options" FILES - ${RDOSTUDIORUS_HTML_WORK_OPTIONS_FILES} - ) + SOURCE_GROUP(".rdo_studio_rus\\.html\\work_options" FILES + ${RDOSTUDIORUS_HTML_WORK_OPTIONS_FILES} + ) - SOURCE_GROUP(".rdo_studio_rus\\.images" FILES - ${RDOSTUDIORUS_IMAGES_FILES} - ) + SOURCE_GROUP(".rdo_studio_rus\\.images" FILES + ${RDOSTUDIORUS_IMAGES_FILES} + ) ENDIF() diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_alpha.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_alpha.htm index 2c71a8153..0fdc6f707 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_alpha.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_alpha.htm @@ -8,14 +8,14 @@ -
-

АЛФАВИТ

-

Алфавит языка содержит следующие символы:

-
    -
  • цифры 0…9
  • -
  • прописные и строчные латинские буквы A…Z, a…z
  • -
  • прописные и строчные русские буквы А…Я, а…я
  • -
  • специальные символы:
  • +
    +

    АЛФАВИТ

    +

    Алфавит языка содержит следующие символы:

    +
      +
    • цифры 0…9
    • +
    • прописные и строчные латинские буквы A…Z, a…z
    • +
    • прописные и строчные русские буквы А…Я, а…я
    • +
    • специальные символы:
    • @@ -102,10 +102,10 @@

      АЛФАВИТ

      Символ знак номера
      -
    -

    См. также

    -

    Лексемы и разделители

    -
    -
    +
+

См. также

+

Лексемы и разделители

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_equations.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_equations.htm index 00b08f26a..f5ee722bf 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_equations.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_equations.htm @@ -8,99 +8,99 @@ -
-

АРИФМЕТИЧЕСКИЕ И ЛОГИЧЕСКИЕ ВЫРАЖЕНИЯ

-

Арифметические выражения в данной версии языка могут быть целого, вещественного, перечислимого типов, а также иметь тип ресурса, описанный в модели. Выражения целого и вещественного типов состоят из операндов, знаков арифметических операций и круглых скобок.

-

Операндами арифметического выражения служат:

- -

Возможность использования операндов зависит от контекста. Так, параметры функции можно использовать в арифметических выражениях лишь в теле алгоритмических функций, а параметры образца и параметры релевантных ресурсов - в теле образцов.

-

В выражениях целого и вещественного типа допустимы следующие арифметические операции: сложение (+), вычитание (-), умножение (*), деление (/). Порядок вычисления значения выражения определяется старшинством арифметических операций и скобками. Сначала выполняется вычисление значений в скобках, затем умножение и деление и, наконец, сложение и вычитание.

-

Тип арифметического выражения определяется типами операндов, которые задаются пользователем при описании констант, функций, последовательностей, типов ресурсов, образцов. Выражение имеет целый тип, если все операнды имеют целый тип. Если в выражение входят только целые и вещественные операнды (хотя бы один), то выражение имеет вещественный тип. Выражения перечислимого типа состоят из единственного операнда перечислимого типа либо имени значения перечислимого типа. Арифметические операции над перечислимыми операндами не определены.

-

При вычислении значения арифметического выражения тип результата выполнения арифметической операции будет целым, если оба операнда целые. Если хотя бы один операнд имеет вещественный тип, то результат имеет вещественный тип. Результатом деления целых чисел является целое число - целая часть результата деления. Дробная часть отбрасывается. Например, результатом выражения 2 * (5 / 2) будет целое число 4, а выражения 2 * (5.0 / 2) - вещественное число 5.0.

-

Примеры

-
1 + 3 + 5 + 7.0 = 16.0
-
2 + 3 * 4 + 7 = 21
-
(2 + 3) * (4 + 7) = 55
-
2.0 * (3 * 4 + 7) = 38.0
-

Примечание

-

При использовании в качестве операндов численных констант их необходимо отделять от стоящих перед ними знаков "+" или "-" по крайней мере одним разделителем. В противном случае эти знаки воспринимаются не как знаки арифметических операций, а как знак численной константы.

-

Логические выражения состоят из логических стандартных функций, арифметических выражений, объединенных в пары операциями отношения, логических операций и квадратных (круглых) скобок.

-

Операции отношения включают в себя:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ОперацияЗначение
==Равно
<>Не равно
!=Не равно
<Меньше
>Больше
<=Меньше или равно
>=Больше или равно
-

Логические операции:

- - - - - - - - - - - - - - - - - -
ОперацияЗначение
andоперация И
orоперация ИЛИ
not (или символ '!')операция ОТРИЦАНИЕ
-

При вычислении значения логического выражения сначала вычисляются значения арифметических выражений, затем результаты операций отношения и значения стандартных логических функций и в последнюю очередь выполняются логические операции. Оба арифметических выражения в операции отношения должны иметь один и тот же тип, либо одно должно быть вещественным, а второе - целым. Если одно из арифметических выражений в операции отношения имеет вещественный тип, то при выполнении операции отношения значение второго выражения также преобразуется к вещественному типу. Если оба арифметических выражения целого типа, то операция отношения выполняется над целыми операндами. Над выражениями перечислимого типа допустимы только операции "равно" и "не равно".

-

Порядок выполнения логических операций при вычислении выражения определяется старшинством и скобками. Сначала вычисляются значения в скобках, затем выполняются операции И, затем ИЛИ. При вычислении используется короткая схема, т.е. вычисляются значения не всех логических операндов, а только значения, необходимые для получения результата логической операции. Так, если первый операнд в операции ИЛИ имеет значение ИСТИНА, то независимо от значения второго операнда результат операции будет ИСТИНА, поэтому нет необходимости вычислять значение второго операнда. Аналогично, если в операции И первый операнд имеет значение ЛОЖЬ, то независимо от значения второго операнда значением операции будет ЛОЖЬ.

-

Примеры

-
1 + 3 * 5 <= 20 - ИСТИНА
-
1 + 3 * 5 <= 20 and 1.0 > 2 - ЛОЖЬ
-
2 * (5 / 2) = 2 * (5.0 / 2) - ЛОЖЬ
-
2 >= 1 and 5 <= 3 or 7 <> 5 - ИСТИНА
-
not 1 > 2 and 10 > 3 - ИСТИНА
-
not(1 > 2 or 10 > 3) - ЛОЖЬ
-

См. также

-

Типы данных. Соответствие типов

-
-
+
+

АРИФМЕТИЧЕСКИЕ И ЛОГИЧЕСКИЕ ВЫРАЖЕНИЯ

+

Арифметические выражения в данной версии языка могут быть целого, вещественного, перечислимого типов, а также иметь тип ресурса, описанный в модели. Выражения целого и вещественного типов состоят из операндов, знаков арифметических операций и круглых скобок.

+

Операндами арифметического выражения служат:

+ +

Возможность использования операндов зависит от контекста. Так, параметры функции можно использовать в арифметических выражениях лишь в теле алгоритмических функций, а параметры образца и параметры релевантных ресурсов - в теле образцов.

+

В выражениях целого и вещественного типа допустимы следующие арифметические операции: сложение (+), вычитание (-), умножение (*), деление (/). Порядок вычисления значения выражения определяется старшинством арифметических операций и скобками. Сначала выполняется вычисление значений в скобках, затем умножение и деление и, наконец, сложение и вычитание.

+

Тип арифметического выражения определяется типами операндов, которые задаются пользователем при описании констант, функций, последовательностей, типов ресурсов, образцов. Выражение имеет целый тип, если все операнды имеют целый тип. Если в выражение входят только целые и вещественные операнды (хотя бы один), то выражение имеет вещественный тип. Выражения перечислимого типа состоят из единственного операнда перечислимого типа либо имени значения перечислимого типа. Арифметические операции над перечислимыми операндами не определены.

+

При вычислении значения арифметического выражения тип результата выполнения арифметической операции будет целым, если оба операнда целые. Если хотя бы один операнд имеет вещественный тип, то результат имеет вещественный тип. Результатом деления целых чисел является целое число - целая часть результата деления. Дробная часть отбрасывается. Например, результатом выражения 2 * (5 / 2) будет целое число 4, а выражения 2 * (5.0 / 2) - вещественное число 5.0.

+

Примеры

+
1 + 3 + 5 + 7.0 = 16.0
+
2 + 3 * 4 + 7 = 21
+
(2 + 3) * (4 + 7) = 55
+
2.0 * (3 * 4 + 7) = 38.0
+

Примечание

+

При использовании в качестве операндов численных констант их необходимо отделять от стоящих перед ними знаков "+" или "-" по крайней мере одним разделителем. В противном случае эти знаки воспринимаются не как знаки арифметических операций, а как знак численной константы.

+

Логические выражения состоят из логических стандартных функций, арифметических выражений, объединенных в пары операциями отношения, логических операций и квадратных (круглых) скобок.

+

Операции отношения включают в себя:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ОперацияЗначение
==Равно
<>Не равно
!=Не равно
<Меньше
>Больше
<=Меньше или равно
>=Больше или равно
+

Логические операции:

+ + + + + + + + + + + + + + + + + +
ОперацияЗначение
andоперация И
orоперация ИЛИ
not (или символ '!')операция ОТРИЦАНИЕ
+

При вычислении значения логического выражения сначала вычисляются значения арифметических выражений, затем результаты операций отношения и значения стандартных логических функций и в последнюю очередь выполняются логические операции. Оба арифметических выражения в операции отношения должны иметь один и тот же тип, либо одно должно быть вещественным, а второе - целым. Если одно из арифметических выражений в операции отношения имеет вещественный тип, то при выполнении операции отношения значение второго выражения также преобразуется к вещественному типу. Если оба арифметических выражения целого типа, то операция отношения выполняется над целыми операндами. Над выражениями перечислимого типа допустимы только операции "равно" и "не равно".

+

Порядок выполнения логических операций при вычислении выражения определяется старшинством и скобками. Сначала вычисляются значения в скобках, затем выполняются операции И, затем ИЛИ. При вычислении используется короткая схема, т.е. вычисляются значения не всех логических операндов, а только значения, необходимые для получения результата логической операции. Так, если первый операнд в операции ИЛИ имеет значение ИСТИНА, то независимо от значения второго операнда результат операции будет ИСТИНА, поэтому нет необходимости вычислять значение второго операнда. Аналогично, если в операции И первый операнд имеет значение ЛОЖЬ, то независимо от значения второго операнда значением операции будет ЛОЖЬ.

+

Примеры

+
1 + 3 * 5 <= 20 - ИСТИНА
+
1 + 3 * 5 <= 20 and 1.0 > 2 - ЛОЖЬ
+
2 * (5 / 2) = 2 * (5.0 / 2) - ЛОЖЬ
+
2 >= 1 and 5 <= 3 or 7 <> 5 - ИСТИНА
+
not 1 > 2 and 10 > 3 - ИСТИНА
+
not(1 > 2 or 10 > 3) - ЛОЖЬ
+

См. также

+

Типы данных. Соответствие типов

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_instr.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_instr.htm index 59ceed317..57a8fd545 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_instr.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_instr.htm @@ -8,95 +8,95 @@ -
-

ИНСТРУКЦИИ ИСПОЛЬЗУЕМЫЕ В ОБРАЗЦАХ

-

Инструкция имеет формат:

-
<инструкция_присваивания>
+    
+

ИНСТРУКЦИИ ИСПОЛЬЗУЕМЫЕ В ОБРАЗЦАХ

+

Инструкция имеет формат:

+
<инструкция_присваивания>
 | <инструкция_планирования_события>
 | <инструкция_остановки_события>
 | <инструкция_инициации_процесса>
 | <условная инструкция>
 | <пустая_инструкция>
 | {<список_инструкций>}
-
-
инструкция_присваивания
-
Инструкция присваивания имеет формат: -
<имя_параметра> <оператор_присваивания> <арифметическое_выражение>;
-
-
оператор_присваивания
-
В данной версии языка возможны следующих операторы присваивания: - - - - - - - - - - - - - - - - - - - - - - - - - -
Оператор присваиванияОписание
=Присваивает параметру слева значение арифметического выражения справа
+=Увеличивает параметр слева на значение арифметического выражения справа
-=Уменьшает параметр слева на значение арифметического выражения справа
*=Умножает параметр слева на значение арифметического выражения справа
/=Делит параметр слева на значение арифметического выражения справа
-
-
арифметическое_выражение
-
Арифметическое выражение должно иметь тот же тип, что и параметр, которому присваивается значение. Для вещественного параметра выражение может иметь целый тип.
-
-
-
инструкция_планирования_события
-
Инструкция планирования события имеет формат: -
<имя_события>.planning(<время_планирования_события> [, <знчение_параметров_события>]);
-
-
имя_события
-
Имя события - это имя одного из описанных в модели событий.
-
время_планирования_события
-
Время планирования события представляет собой арифметическое выражение, равное времени, в которое данное событие выполнится.
-
значение параметров события
-
Значения параметров события записываются таким же образом, как и для активностей, за исключением того, что они могут представлять собой арифметическое выражение.
-
-
-
инструкция_остановки_события
-
Инструкция остановки события имеет формат: -
<имя_события>.stop();
-
-
имя_события
-
Имя события - это имя одного из описанных в модели событий.
-
-
-
инструкция_инициации_процесса
-
Инструкция инициации процесса активизирует процесс обслуживания, передавая транзакт в его первый блок, имеет следующий формат: -
<имя_процесса>.processStart(<транзакт>);
-
-
имя_процесса
-
Имя события - это имя одного из описанных в модели процессов.
-
транзакт
-
Транзакт - это имя релевантного ресурса, который передается в процесс в качестве транзакта.
-
-
-
пустая_инструкция
-
Пустая инструкция имеет формат: -
<имя_параметра> NoChange;
Зарезервированное слово NoChange указывает, что значение данного параметра не изменяется. -
-
-

См. также

-

Алфавит

-

Типы данных. Соответствие типов

-

Типы ресурсов

-

Функции

-
-
+
+
инструкция_присваивания
+
Инструкция присваивания имеет формат: +
<имя_параметра> <оператор_присваивания> <арифметическое_выражение>;
+
+
оператор_присваивания
+
В данной версии языка возможны следующих операторы присваивания: + + + + + + + + + + + + + + + + + + + + + + + + + +
Оператор присваиванияОписание
=Присваивает параметру слева значение арифметического выражения справа
+=Увеличивает параметр слева на значение арифметического выражения справа
-=Уменьшает параметр слева на значение арифметического выражения справа
*=Умножает параметр слева на значение арифметического выражения справа
/=Делит параметр слева на значение арифметического выражения справа
+
+
арифметическое_выражение
+
Арифметическое выражение должно иметь тот же тип, что и параметр, которому присваивается значение. Для вещественного параметра выражение может иметь целый тип.
+
+
+
инструкция_планирования_события
+
Инструкция планирования события имеет формат: +
<имя_события>.planning(<время_планирования_события> [, <знчение_параметров_события>]);
+
+
имя_события
+
Имя события - это имя одного из описанных в модели событий.
+
время_планирования_события
+
Время планирования события представляет собой арифметическое выражение, равное времени, в которое данное событие выполнится.
+
значение параметров события
+
Значения параметров события записываются таким же образом, как и для активностей, за исключением того, что они могут представлять собой арифметическое выражение.
+
+
+
инструкция_остановки_события
+
Инструкция остановки события имеет формат: +
<имя_события>.stop();
+
+
имя_события
+
Имя события - это имя одного из описанных в модели событий.
+
+
+
инструкция_инициации_процесса
+
Инструкция инициации процесса активизирует процесс обслуживания, передавая транзакт в его первый блок, имеет следующий формат: +
<имя_процесса>.processStart(<транзакт>);
+
+
имя_процесса
+
Имя события - это имя одного из описанных в модели процессов.
+
транзакт
+
Транзакт - это имя релевантного ресурса, который передается в процесс в качестве транзакта.
+
+
+
пустая_инструкция
+
Пустая инструкция имеет формат: +
<имя_параметра> NoChange;
Зарезервированное слово NoChange указывает, что значение данного параметра не изменяется. +
+
+

См. также

+

Алфавит

+

Типы данных. Соответствие типов

+

Типы ресурсов

+

Функции

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_intro.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_intro.htm index 8b8e22769..120d8aa62 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_intro.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_intro.htm @@ -8,15 +8,15 @@ -
-

БАЗОВЫЕ КОНСТРУКЦИИ ЯЗЫКА РДО

-

При описании конструкций языка используются следующие условные обозначения.

-

Каждое правило записи состоит из одной или нескольких альтернатив (фраз), разделенных вертикальной чертой ( | ).

-

Фраза состоит из нуля или более элементов.

-

Элемент - это или зарезервированное слово языка (выделяется жирным шрифтом), или специальный символ (комбинация), или некоторое метаимя, заключенное в угловые скобки <>, или другое синтаксическое выражение, заключенное с двух сторон в фигурные, квадратные, круглые скобки.

-

Фигурные скобки указывают на повторение (нуль или более вхождений), квадратные скобки - на допустимость (нуль или одно вхождение), а круглые скобки - на группирование (точно одно вхождение) выражений, в них заключенных.

-

Синтаксические конструкции языка отображаются на сером фоне.

-
-
+
+

БАЗОВЫЕ КОНСТРУКЦИИ ЯЗЫКА РДО

+

При описании конструкций языка используются следующие условные обозначения.

+

Каждое правило записи состоит из одной или нескольких альтернатив (фраз), разделенных вертикальной чертой ( | ).

+

Фраза состоит из нуля или более элементов.

+

Элемент - это или зарезервированное слово языка (выделяется жирным шрифтом), или специальный символ (комбинация), или некоторое метаимя, заключенное в угловые скобки <>, или другое синтаксическое выражение, заключенное с двух сторон в фигурные, квадратные, круглые скобки.

+

Фигурные скобки указывают на повторение (нуль или более вхождений), квадратные скобки - на допустимость (нуль или одно вхождение), а круглые скобки - на группирование (точно одно вхождение) выражений, в них заключенных.

+

Синтаксические конструкции языка отображаются на сером фоне.

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_proc_lang.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_proc_lang.htm index 665863717..791b944e2 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_proc_lang.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_proc_lang.htm @@ -9,118 +9,118 @@ -
-

ОПЕРАТОРЫ И ИНСТРУКЦИИ ПРОЦЕДУРНОГО ПРОГРАММИРОВАНИЯ

-

Для описания алгоритмов в данной версии языка есть возможность использования операторов процедурного (императивного) программирования:

- -

Данные операторы можно использовать при описании алгоритмических зависимостей в теле образцов и функций для составления процедур. Все операторы являются зарезервированными словами.

-

Условный оператор

-

Описание условного оператора имеет следующий формат:

-
if (<условие>)
+    
+

ОПЕРАТОРЫ И ИНСТРУКЦИИ ПРОЦЕДУРНОГО ПРОГРАММИРОВАНИЯ

+

Для описания алгоритмов в данной версии языка есть возможность использования операторов процедурного (императивного) программирования:

+ +

Данные операторы можно использовать при описании алгоритмических зависимостей в теле образцов и функций для составления процедур. Все операторы являются зарезервированными словами.

+

Условный оператор

+

Описание условного оператора имеет следующий формат:

+
if (<условие>)
     <первая_ветвь_исполнения>;
 {else
     <вторая_ветвь_исполнения>;}
-
-
условие
-
Логическое выражение, определяющее выполнение первой ветви процедур условного оператора
-
первая_ветвь_исполнения
-
Одна процедура или список процедур, заключенный в оператор выделения области локальной памяти. Данная ветвь подлежит исполнению, если условие истинно.
-
вторая_ветвь_исполнения
-
Одна процедура или список процедур, заключенный в оператор выделения области локальной памяти. Данная ветвь подлежит исполнению, если условие ложно.
-
-
-
-

Примеры

- +
+

Оператор цикла

+

Описание оператора цикла имеет следующий формат:

+
for (<инициализация>; <условие_останова>; <выражение>)
     <тело_цикла>
-
-
инициализация
-
Определить циклическую переменную можно оператором присваивания начального значения уже объявленной циклической переменной или оператором объявления локальной циклической переменной с инициализирующим значением.
-
условие_останова
-
Логическое выражение, содержащее условие выполнения текущей итерации цикла.
-
выражение
-
процедура, выполняемая после тела цикла. Обычно используется для изменения циклической переменной.
-
тело_цикла
-
Тело цикла состоит из одной процедуры или списка процедур, заключенного в оператор выделения области локальной памяти.
-
-

Оператор for работает следующим образом:

-
    -
  1. Перед выполнением цикла вычисляется начальное выражение, определяющее циклическую переменную.
  2. -
  3. Проверяется контрольное выражение.
  4. -
  5. Если контрольное выражение истинное, то выполняется блок из одного или нескольких операторов, рассчитывается выражение счетчик, возврат к пункту 2.
  6. -
  7. А если ложно, то оператор for заканчивает свою работу.
  8. -
-

Примечание

-

Окончание работы цикла также может быть вызвано операторами break и return.

-
-
-

Пример

- -
+
+ +

Оператор вызова подпрограммы

+

Оператор вызова подпрограммы являет собой вызов функции. Результатом выполнения оператора вызова является арифметическое выражение, следовательно его можно использовать внутри процедуры, совместно с другими операторами, и внутри других операторов и выражений. При использовании в теле функции необходимо помнить, что вызываемая функция должна быть описана раньше в файле .fun), места ее вызова.

+

См. также

+

Алфавит

+

Типы данных. Соответствие типов

+

Типы ресурсов

+

Функции

+
+
diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_res_types.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_res_types.htm index ee7be0be7..960a4f4e4 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_res_types.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_res_types.htm @@ -8,52 +8,52 @@ -
-

ТИПЫ РЕСУРСОВ

-

Типы ресурсов определяют структуру глобальной базы данных программы (модели) и их описывают в отдельном объекте (имеет расширение .rtp).

-

Описание каждого типа ресурса имеет следующий формат:

-
$Resource_type <имя_типа>: <вид_ресурсов>
+    
+

ТИПЫ РЕСУРСОВ

+

Типы ресурсов определяют структуру глобальной базы данных программы (модели) и их описывают в отдельном объекте (имеет расширение .rtp).

+

Описание каждого типа ресурса имеет следующий формат:

+
$Resource_type <имя_типа>: <вид_ресурсов>
 $Parameters
     <описание_параметра> {<описание_параметра>}
 $End
-
-
имя_типа
-
Имя типа представляет собой простое имя. Имена типов должны быть различными для всех типов и не должны совпадать с предопределенными и ранее использованными именами.
-
вид_ресурсов
-
Вид ресурсов данного типа может быть одним из следующих: - - - - - - - - - - - - - -
Вид ресурсовЗначение
permanentПостоянные ресурсы; ресурсы этого вида всегда присутствуют в модели, они не могут быть уничтожены или созданы во время прогона
temporaryВременные ресурсы; ресурсы этого вида могут во время прогона создаваться и уничтожаться при выполнении событий, активностей и процессов
-
-
описание_параметра
-
Описание параметра ресурса имеет формат:
-
<имя_параметра>: <тип_параметра> [= <значение_по_умолчанию>]
-
-
имя_параметра
-
Имя параметра - это простое имя. Имена параметров должны быть различными для всех параметров данного типа и не должны совпадать предопределенными и ранее использованными именами. Имя параметра может совпадать с именем параметра другого типа ресурсов.
-
тип_параметра
-
Тип параметра - это один из возможных типов данных языка. Ссылки возможны на параметры ранее описанных типов ресурсов и на ранее описанные параметры данного типа ресурсов.
- Тип параметра может задаваться именем типа ресурса, описанного ранее. В этом случае параметром будет являться вложенные ресурс данного типа.
+
+
имя_типа
+
Имя типа представляет собой простое имя. Имена типов должны быть различными для всех типов и не должны совпадать с предопределенными и ранее использованными именами.
+
вид_ресурсов
+
Вид ресурсов данного типа может быть одним из следующих: + + + + + + + + + + + + + +
Вид ресурсовЗначение
permanentПостоянные ресурсы; ресурсы этого вида всегда присутствуют в модели, они не могут быть уничтожены или созданы во время прогона
temporaryВременные ресурсы; ресурсы этого вида могут во время прогона создаваться и уничтожаться при выполнении событий, активностей и процессов
+
+
описание_параметра
+
Описание параметра ресурса имеет формат:
+
<имя_параметра>: <тип_параметра> [= <значение_по_умолчанию>]
+
+
имя_параметра
+
Имя параметра - это простое имя. Имена параметров должны быть различными для всех параметров данного типа и не должны совпадать предопределенными и ранее использованными именами. Имя параметра может совпадать с именем параметра другого типа ресурсов.
+
тип_параметра
+
Тип параметра - это один из возможных типов данных языка. Ссылки возможны на параметры ранее описанных типов ресурсов и на ранее описанные параметры данного типа ресурсов.
+ Тип параметра может задаваться именем типа ресурса, описанного ранее. В этом случае параметром будет являться вложенные ресурс данного типа.
значение_по_умолчанию
-
Для параметра любого типа, кроме типа ресурса, может быть задано значение по умолчанию. Это значение указывают после знака равенства целой или вещественной численной константой, либо именем значения для перечислимого параметра. При указании типа ссылкой также возможно задание значения по умолчанию. При этом задаваемое значение может отличаться от значения по умолчанию того параметра, на тип которого проводится ссылка.
-
-
-
-

Примечание

-

При описании сложных систем часто возникает так называемая проблема представления. Она состоит в том, что не существует единственного описания, и разработчик должен выбирать тот или иной вариант на основе своего опыта, интуиции и т.д. Различные варианты описания могут отличаться эффективностью моделирования, наглядностью, удобством формулирования образцов и т.п.

-

Примеры

-
$Resource_type Тип_1: permanent
+                    
Для параметра любого типа, кроме типа ресурса, может быть задано значение по умолчанию. Это значение указывают после знака равенства целой или вещественной численной константой, либо именем значения для перечислимого параметра. При указании типа ссылкой также возможно задание значения по умолчанию. При этом задаваемое значение может отличаться от значения по умолчанию того параметра, на тип которого проводится ссылка.
+
+
+
+

Примечание

+

При описании сложных систем часто возникает так называемая проблема представления. Она состоит в том, что не существует единственного описания, и разработчик должен выбирать тот или иной вариант на основе своего опыта, интуиции и т.д. Различные варианты описания могут отличаться эффективностью моделирования, наглядностью, удобством формулирования образцов и т.п.

+

Примеры

+
$Resource_type Тип_1: permanent
 $Parameters
     Параметр_1: integer = 10
     Параметр_2: real
@@ -71,10 +71,10 @@ 

Примеры

Параметр_1: Тип_1 Параметр_2: such_as Тип_1.Параметр_1 $End
-

См. также

-

Типы данных. Соответствие типов

-

Описание ресурсов

-
-
+

См. также

+

Типы данных. Соответствие типов

+

Описание ресурсов

+
+
diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_resources.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_resources.htm index e674a99a6..8eedbc209 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_resources.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_resources.htm @@ -8,46 +8,46 @@ -
-

ОПИСАНИЕ РЕСУРСОВ

-

Ресурсы определяют начальное состояние глобальной базы данных модели и описываются в отдельном объекте (с расширением .rss).

-

Объект ресурсов имеет следующий формат:

-
$Resources
+    
+

ОПИСАНИЕ РЕСУРСОВ

+

Ресурсы определяют начальное состояние глобальной базы данных модели и описываются в отдельном объекте (с расширением .rss).

+

Объект ресурсов имеет следующий формат:

+
$Resources
     <описание_ресурса> [<вызов_метода_трассировки>]
     {<описание_ресурса> [<вызов_метода_трассировки>]}
 $End
-
-
описание_ресурса
-
Описание каждого ресурса имеет следующий формат:
-
<имя_ресурса> = <имя_типа_ресурса>(<начальные_значения_параметров>);
-
-
имя_типа_ресурса
-
Имя типа ресурса - это имя одного из типов ресурсов, описанных в объекте типов.
-
имя_ресурса
-
Имя ресурса - это простое имя. Имена должны быть различными для всех ресурсов и не должны совпадать с предопределенными и ранее использованными именами.
-
начальные_значения_параметров
-
Начальные значения параметров ресурса задают в позиционном соответствии с порядком следования параметров в описании типа и разделяются запятыми. Значения задают целой или вещественной численной константой либо именем значения в соответствии с типом параметра. Если типом параметра является тип ресурса, в качестве начального значения необходимо задать конструктор вложенного ресурса с начальными значениями его параметров.
+
+
описание_ресурса
+
Описание каждого ресурса имеет следующий формат:
+
<имя_ресурса> = <имя_типа_ресурса>(<начальные_значения_параметров>);
+
+
имя_типа_ресурса
+
Имя типа ресурса - это имя одного из типов ресурсов, описанных в объекте типов.
+
имя_ресурса
+
Имя ресурса - это простое имя. Имена должны быть различными для всех ресурсов и не должны совпадать с предопределенными и ранее использованными именами.
+
начальные_значения_параметров
+
Начальные значения параметров ресурса задают в позиционном соответствии с порядком следования параметров в описании типа и разделяются запятыми. Значения задают целой или вещественной численной константой либо именем значения в соответствии с типом параметра. Если типом параметра является тип ресурса, в качестве начального значения необходимо задать конструктор вложенного ресурса с начальными значениями его параметров.
Для тех параметров, у которых при описании типа указано значение по умолчанию, вместо начального значения можно указать символ "*". В этом случае параметр примет значение по умолчанию. Если для параметра задан диапазон возможных значений, то проверяется соответствие начального значения этому диапазону. - Для того, чтобы использовать неопределенное значение параметра, необходимо указать символ "#". В этом случае параметр будет задан как неопределенный (т.е его значение не является проинициализированным), и с ним нельзя будет работать до тех пор, пока он не будет явно проинициализирован.
-
-
-
-
вызов_метода_трассировки
-
Вызов метода трассировки может отсутствовать. В этом случае трассировка для ресурса по умолчанию отключена.
Вызов метода трассировки имеет следующий формат:
-
 <имя_ресурса>.<признак_трассировки>();
-
-
имя_ресурса
-
Имя ресурса - это имя одного из уже описанных ресурсов, для которого вызывается метод.
-
признак_трассировки
-
Признак трассировки - это один из допустимых признаков трассировки (подробнее смотри описание трассировки).
-
-
-
-

Примечание

+ Для того, чтобы использовать неопределенное значение параметра, необходимо указать символ "#". В этом случае параметр будет задан как неопределенный (т.е его значение не является проинициализированным), и с ним нельзя будет работать до тех пор, пока он не будет явно проинициализирован.
+
+
+
+
вызов_метода_трассировки
+
Вызов метода трассировки может отсутствовать. В этом случае трассировка для ресурса по умолчанию отключена.
Вызов метода трассировки имеет следующий формат:
+
 <имя_ресурса>.<признак_трассировки>();
+
+
имя_ресурса
+
Имя ресурса - это имя одного из уже описанных ресурсов, для которого вызывается метод.
+
признак_трассировки
+
Признак трассировки - это один из допустимых признаков трассировки (подробнее смотри описание трассировки).
+
+
+
+

Примечание

Поэтому в ниже рассмотренном примере последний параметр ресурса "Ресурс_2" при такой записи получит начальное значение "Занят", установленное для параметра "Параметр_9", а не "Свободен", установленное для параметра "Параметр_5", а параметр "Параметр_8" получит значение "Свободен".

-

Примеры

-

Ниже будет рассмотрена модель обслуживания клиента в парикмахерской. Пусть были описаны следующие типы ресурсов:

-
$Resource_type Парикмахерские: permanent
+        

Примеры

+

Ниже будет рассмотрена модель обслуживания клиента в парикмахерской. Пусть были описаны следующие типы ресурсов:

+
$Resource_type Парикмахерские: permanent
 $Parameters
     количество_в_очереди: integer
 $End
@@ -66,9 +66,9 @@ 

Примеры

длительность_max : integer тип_клиента : such_as Клиенты.тип $End
-

Парикмахерские и Парикмахеры - это постоянные типы ресурсов. Эти ресурсы могут быть созданы только в объекте RSS и не могут создаваться или изменяться в процессе прогона модели. Клиенты - временный тип ресурсов. Клиенты приходят и уходят и создавать их в объекте RSS необходимости нет.

-

Пусть в парикмахерской работают три парикмахера с различными характеристиками. Эти ресурсы необходимо создать во вкладке RSS:

-
$Resources
+        

Парикмахерские и Парикмахеры - это постоянные типы ресурсов. Эти ресурсы могут быть созданы только в объекте RSS и не могут создаваться или изменяться в процессе прогона модели. Клиенты - временный тип ресурсов. Клиенты приходят и уходят и создавать их в объекте RSS необходимости нет.

+

Пусть в парикмахерской работают три парикмахера с различными характеристиками. Эти ресурсы необходимо создать во вкладке RSS:

+
$Resources
     Парикмахерская = Парикмахерские(0);
     Парикмахерская.no_trace();
 
@@ -79,15 +79,15 @@ 

Примеры

Парикмахер_3 = Парикмахеры(*, 0, 30, 60, Ребенок); $End
-

В результате был создан ресурс 'Парикмахерская' с начальным значением параметра 'количество_в_очереди' равным нулю, а также три ресурса типа 'Парикмахеры' с различными начальными значениями параметров. Для параметра 'состояние_парикмахера' было задано значение по умолчанию ('Свободен'), и потому возможно было указать символ "*", чтобы парикмахер при создании имел состояние 'Свободен'. При использовании цепочных ссылок ('such_as') значение по умолчанию принимается равным ближайшему из указанных в цепочке, поэтому последний параметр ресуса 'Парикмахер_1' ('тип_клиента') имеет значение по умолчанию значение 'Взрослый'. Трассировка в примере включена только для ресурса 'Парикмахер_1'. Для ресурса 'Парикмахерские' она в явном виде отключена, а для ресурсов 'Парикмахер_2' и 'Парикмахер_3' она отключена по умолчанию.

-

См. также

-

Алфавит

-

Типы данных. Соответствие типов

-

Типы ресурсов

-

Вложенные ресурсы

-

Объект трассировки

-

Трассировка состояния объектов РДО

-
-
+

В результате был создан ресурс 'Парикмахерская' с начальным значением параметра 'количество_в_очереди' равным нулю, а также три ресурса типа 'Парикмахеры' с различными начальными значениями параметров. Для параметра 'состояние_парикмахера' было задано значение по умолчанию ('Свободен'), и потому возможно было указать символ "*", чтобы парикмахер при создании имел состояние 'Свободен'. При использовании цепочных ссылок ('such_as') значение по умолчанию принимается равным ближайшему из указанных в цепочке, поэтому последний параметр ресуса 'Парикмахер_1' ('тип_клиента') имеет значение по умолчанию значение 'Взрослый'. Трассировка в примере включена только для ресурса 'Парикмахер_1'. Для ресурса 'Парикмахерские' она в явном виде отключена, а для ресурсов 'Парикмахер_2' и 'Парикмахер_3' она отключена по умолчанию.

+

См. также

+

Алфавит

+

Типы данных. Соответствие типов

+

Типы ресурсов

+

Вложенные ресурсы

+

Объект трассировки

+

Трассировка состояния объектов РДО

+
+
diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_resources_nested.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_resources_nested.htm index 5328c0dcf..bba7aab2c 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_resources_nested.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_resources_nested.htm @@ -8,23 +8,23 @@ -
-

ВЛОЖЕННЫЕ РЕСУРСЫ

-

В языке РДО существует возможность использовать в качестве типа параметра тип ресурса. В этом случае параметр представляет из себя структуру данных, называемую вложенным ресурсом. Вложенный ресурс может, в свою очередь, иметь другие вложенные ресурсы в качестве параметров. Допустимый уровень вложенности не ограничен. В дальнейшем ресурс, задаваемый в качестве параметра другого ресурса, будет называться вложенным, а ресурс, по отношению к которому данный ресурс является вложенным, родительским.
Вложенные ресурсы не являются самостоятельными сущностями, а существуют нераздельно от родительского ресурса. Из этого следуют нижеприведенные правила:

-
    -
  • создание и удаление вложенных ресурсов осуществляется только совместно с созданием их родительского для них ресурса;
  • -
  • вложенный ресурс не может быть релевантным, т.к. в этом случае он стал бы независимым от родительского ресурса;
  • -
  • вложенный ресурс не имеет имени, т.к. обращение к нему осуществляется только как к параметру родительского ресурса;
  • -
+
+

ВЛОЖЕННЫЕ РЕСУРСЫ

+

В языке РДО существует возможность использовать в качестве типа параметра тип ресурса. В этом случае параметр представляет из себя структуру данных, называемую вложенным ресурсом. Вложенный ресурс может, в свою очередь, иметь другие вложенные ресурсы в качестве параметров. Допустимый уровень вложенности не ограничен. В дальнейшем ресурс, задаваемый в качестве параметра другого ресурса, будет называться вложенным, а ресурс, по отношению к которому данный ресурс является вложенным, родительским.
Вложенные ресурсы не являются самостоятельными сущностями, а существуют нераздельно от родительского ресурса. Из этого следуют нижеприведенные правила:

+
    +
  • создание и удаление вложенных ресурсов осуществляется только совместно с созданием их родительского для них ресурса;
  • +
  • вложенный ресурс не может быть релевантным, т.к. в этом случае он стал бы независимым от родительского ресурса;
  • +
  • вложенный ресурс не имеет имени, т.к. обращение к нему осуществляется только как к параметру родительского ресурса;
  • +

Описание вложенных ресурсов на вкладке RTP

-

Описание параметра типа ресурса имеет следующий формат:

+

Описание параметра типа ресурса имеет следующий формат:

<имя_параметра> : <имя_типа_ресурса>
имя_параметра
Имя параметра - это простое имя. Имена параметров должны быть различными для всех параметров данного типа и не должны совпадать предопределенными и ранее использованными именами. Имя параметра может совпадать с именем параметра другого типа ресурсов.
имя_типа_ресурса
Имя типа ресурса - это имя одного из типов ресурсов, описанных ранее. Задание значения по умолчанию для параметра типа ресурса невозможно.
-

Пример

-
$Resource_type CPU_Type: permanent
+        

Пример

+
$Resource_type CPU_Type: permanent
 $Parameters
     number_of_cores: integer
     clock_rate     : real
@@ -62,9 +62,9 @@ 

Пример

rating : real $End

Создание вложенных ресурсов

-

Создание вложенных ресурсов осуществляется как определение значения соответствующего параметра родительского ресурса. В этом случае вместо начального значения параметра приводится конструктор вложенного ресурса с начальными значениями его параметров. Если вложенный ресурс тоже имеет ресурсы в качестве своих параметров, их создание описывается аналогично.

-

Пример

-
$Resources
+        

Создание вложенных ресурсов осуществляется как определение значения соответствующего параметра родительского ресурса. В этом случае вместо начального значения параметра приводится конструктор вложенного ресурса с начальными значениями его параметров. Если вложенный ресурс тоже имеет ресурсы в качестве своих параметров, их создание описывается аналогично.

+

Пример

+
$Resources
     Laptop_1 = Laptop(
         CPU_Type(4, 3700),
         RAM_Type(4096, 1600),
@@ -75,12 +75,12 @@ 

Пример

1499, 50, 0, - 0); + 0); $End

Доступ к параметрам вложенных ресурсов

-

Доступ к параметрам ресурса произвольного уровня вложенности осуществляется через оператор 'точка'('.').

-

Пример

-
$Pattern Choosing_laptop_pattern: operation trace
+        

Доступ к параметрам ресурса произвольного уровня вложенности осуществляется через оператор 'точка'('.').

+

Пример

+
$Pattern Choosing_laptop_pattern: operation trace
 $Relevant_resources
     _Client       : Clients Keep Erase
     _Chosen_laptop: Laptop Keep NoChange
@@ -90,7 +90,7 @@ 

Пример

Choice from status == Ready Convert_begin status = Done; - + _Chosen_laptop: Choice from _Client.money_available >= price and _Client.desired_Laptop.RAM.memory_size <= RAM.memory_size @@ -105,8 +105,8 @@

Пример

$End

См. также

Описание ресурсов

-

Типы данных. Соответствие типов

-

Типы ресурсов

-

+

Типы данных. Соответствие типов

+

Типы ресурсов

+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_resources_undefined.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_resources_undefined.htm index 01826a922..233ade46c 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_resources_undefined.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_resources_undefined.htm @@ -9,21 +9,21 @@ -
-

НЕОПРЕДЕЛЕННОЕ ЗНАЧЕНИЕ ПАРАМЕТРА РЕСУРСА

-

В рамках имитационного моделирования приходится сталкиваться с ситуациями, когда значение параметра ресурса может быть неопределенно в данный момент времени. Это может произойти в двух случаях: когда параметр не был проинициализирован, либо когда последняя проверка достоверности значения параметра была произведена давно, и данные устарели.

-
-

Пример

-
$Resources
+    
+

НЕОПРЕДЕЛЕННОЕ ЗНАЧЕНИЕ ПАРАМЕТРА РЕСУРСА

+

В рамках имитационного моделирования приходится сталкиваться с ситуациями, когда значение параметра ресурса может быть неопределенно в данный момент времени. Это может произойти в двух случаях: когда параметр не был проинициализирован, либо когда последняя проверка достоверности значения параметра была произведена давно, и данные устарели.

+
+

Пример

+
$Resources
     Парикмахерская = Парикмахерские(#, 0, 0);
     Парикмахерская.trace();
 $End
@@ -42,9 +42,9 @@ 

Пример

состояние_парикмахера = Свободен; количество_обслуженных++; $End
-
-

В данном примере значение параметра "состояние_парикмахера" является неопределенным. Соответственно, при попытке его использованния в Choice_from система моделирования понимает, что не может использовать его при проверке условия, так как значение этого параметра не является достоверным. Для того, чтобы работа продолжилась, необходимо явно инициализировать параметр ресурса:

-
$Pattern Образец_прихода_парикмахера: event
+        
+

В данном примере значение параметра "состояние_парикмахера" является неопределенным. Соответственно, при попытке его использованния в Choice_from система моделирования понимает, что не может использовать его при проверке условия, так как значение этого параметра не является достоверным. Для того, чтобы работа продолжилась, необходимо явно инициализировать параметр ресурса:

+
$Pattern Образец_прихода_парикмахера: event
 $Relevant_resources
     _Парикмахерская: Парикмахерская Keep
 $Body
@@ -52,8 +52,8 @@ 

Пример

Convert_event состояние_парикмахера = Свободен; $End
-

После наступления события, описанного выше, параметра ресурса "состояние_парикмахера" будет проинициализирован, что означает, что мы можем быть уверенны в достоверности его значения, и условие в Choice_from начнет проверяться.

-
-
+

После наступления события, описанного выше, параметра ресурса "состояние_парикмахера" будет проинициализирован, что означает, что мы можем быть уверенны в достоверности его значения, и условие в Choice_from начнет проверяться.

+ +
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_std_var_func.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_std_var_func.htm index bb012e8f0..588b6aa73 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_std_var_func.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_std_var_func.htm @@ -8,299 +8,299 @@ -
-

ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ И СТАНДАРТНЫЕ ФУНКЦИИ

-

Глобальные переменные и стандартные арифметические функции используются в арифметических выражениях.

-

Глобальных переменных в данной версии языка три:

- - - - - - - - - - - - - - - - - - - - - -
Имя переменнойТип переменнойОписание
SecondsвещественныйСодержит количество секунд, прошедших с момента начала моделирования
Time_nowвещественныйСодержит значение текущего модельного времени (времени в моделируемой системе) в единицах времени.
Terminate_counterцелыйСодержит значение терминального счетчика процессного подхода.
-

Стандартные арифметические функции, включенные в данную версию языка, приведены в следующей таблице с соответствующими пояснениями:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Имя функцииТип значенияТип первого аргументаТип второго аргументаОписание
Abs(x)вещественныйвещественныйВычисляет абсолютную величину вещественного аргумента x
ArcCos(x)вещественныйвещественныйВычисляет арккосинус аргумента x, заданного в радианах
ArcSin(x)вещественныйвещественныйВычисляет арксинус аргумента x, заданного в радианах
ArcTan(x)вещественныйвещественныйВычисляет арктангенс аргумента x, заданного в радианах
Cos(x)вещественныйвещественныйВычисляет косинус аргумента x, заданного в радианах
Cotan(x)вещественныйвещественныйВычисляет котангенс аргумента x, заданного в радианах
Exp(x)вещественныйвещественныйВычисляет значение е в степени x
Floor(x)целыйвещественныйРезультат функции - наибольшее целое число, не превосходящее x
Frac(x)вещественныйвещественныйВозвращает дробную часть вещественного аргумента x
IAbs(x)целыйцелыйВычисляет абсолютную величину целого аргумента x
IMax(x,y)целыйцелыйцелыйВозвращает максимальное из значений двух целых аргументов x и y
IMin(x,y)целыйцелыйцелыйВозвращает минимальное из значений двух целых аргументов x и y
Int(x)целыйвещественныйРезультат функции - наибольшее целое число, не превосходящее x
IntPower(x,y)вещественныйвещественныйцелыйВычисляет значение x в целой степени y с учетом знака x. Если x отрицателен и y - нечетная, то результат отрицателен
Ln(x)вещественныйвещественныйВычисляет натуральный логарифм положительного аргумента x
Log10(x)вещественныйвещественныйВычисляет логарифм по основанию 10 положительного аргумента x
Log2(x)вещественныйвещественныйВычисляет логарифм по основанию 2 положительного аргумента x
LogN(x,y)вещественныйвещественныйвещественныйВычисляет логарифм по основанию y положительного аргумента x. Аргумент y должен быть положителен
Max(x,y)вещественныйвещественныйвещественныйВозвращает максимальное из значений двух вещественных аргументов x и y
Min(x,y)вещественныйвещественныйвещественныйВозвращает минимальное из значений двух вещественных аргументов x и y
Power(x,y)вещественныйвещественныйвещественныйВычисляет значение x в степени y. x должен быть неотрицателен
Round(x)целыйвещественныйОкругляет значение вещественного аргумента x к ближайшему целому числу
Sin(x)вещественныйвещественныйВычисляет синус аргумента x, заданного в радианах
Sqrt(x)вещественныйвещественныйВычисляет значение корня квадратного из x. x должен быть неотрицателен
Tan(x)вещественныйвещественныйВычисляет тангенс аргумента x, заданного в радианах
- -

Кроме стандартных арифметических функций в языке определены четыре стандартные функции, значением которых является ИСТИНА или ЛОЖЬ. Синтаксис вызова этих функций следующий:

-
<имя_функции>(<имя_типа_ресурсов>: (<логическое_выражение> | NoCheck))
-

Стандартные логические функции используются в логических выражениях. Ниже приведены их имена и способы вычисления их значений:

- - - - - - - - - - - - - - - - - - - - - -
Имя функцииЗначение
ExistЕсли существует хотя бы один ресурс указанного типа, состояние которого удовлетворяет заданному логическому выражению, функция выдает значение ИСТИНА, в противном случае - ЛОЖЬ
Not_ExistЕсли не существует ни одного ресурса указанного типа, состояние которого удовлетворяет заданному логическому выражению, функция выдает значение ИСТИНА, в противном случае - ЛОЖЬ
For_AllЕсли состояние всех ресурсов указанного типа удовлетворяет заданному логическому выражению, функция выдает значение ИСТИНА, в противном случае - ЛОЖЬ
Not_For_AllЕсли состояние не всех ресурсов указанного типа удовлетворяет заданному логическому выражению, функция выдает значение ИСТИНА, в противном случае - ЛОЖЬ
-

Если вместо логического выражения указано зарезервированное слово NoCheck, то рассматриваются все ресурсы указанного типа. В этом случае функция Exist определяет, существует ли хотя бы один ресурс указанного типа, функция For_All всегда выдает значение ИСТИНА (даже если нет ни одного ресурса указанного типа), а функция Not_For_All всегда выдает значение ЛОЖЬ.

- -

В языке определена еще одна стандартная функция, позволяющая работать со списком ресурсов. Она позволяет отобрать только часть ресурсов указанного типа и проверить их состояния. Синтаксис:

-
Select(<имя_типа_ресурсов>: (<логическое_выражение> | NoCheck)).<метод_списка>
-

Список методов приведен в таблице:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Имя методаОписаниеЗначение
ExistОписание аналогично приведённому, но проверяются не все, ресурсы, а только отобранные в список. Формат использования:
Exist(<логическое_выражение> | NoCheck)
Логическое
Not_ExistОписание аналогично приведённому, но проверяются не все, ресурсы, а только отобранные в список. Формат использования:
Not_Exist(<логическое_выражение> | NoCheck)
Логическое
For_AllОписание аналогично приведённому, но проверяются не все, ресурсы, а только отобранные в список. Формат использования:
For_All(<логическое_выражение> | NoCheck)
Логическое
Not_For_AllОписание аналогично приведённому, но проверяются не все, ресурсы, а только отобранные в список. Формат использования:
Not_For_All(<логическое_выражение> | NoCheck)
Логическое
EmptyВозвращает значение ИСТИНА, если список отобранных ресурсов пуст, в противном случае - ЛОЖЬ. Формат использования:
Empty()
Логическое
SizeВозвращает размер списка ресурсов, целое число. Если список пуст, то вовращается ноль. Формат использования:
Size()
Арифметическое
getArrayРаботает только в системе анимации. Возвращает массив с отобранными ресурсами, тип массива соответствует типу ресурса. Если список ресурсов пуст, возвращаемый массив также имеет нулевой размер. Формат использования:
getArray() | get_array()
-
Арифметическое
-

Примеры

-
Exist(Заявки : Заявки.Состояние = ожидает)
-
Not_Exist(Тип_1 : NoCheck)
-
Not_For_All(Станок : Станок.Количество > 3 and Станок.Состояние = свободен)
-
Select(Заявка: Заявка.Время_прихода >= 480 and Заявка.Состояние = в_очереди).For_All(Заявка.Время_в_очереди > 20)
+
+

ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ И СТАНДАРТНЫЕ ФУНКЦИИ

+

Глобальные переменные и стандартные арифметические функции используются в арифметических выражениях.

+

Глобальных переменных в данной версии языка три:

+ + + + + + + + + + + + + + + + + + + + + +
Имя переменнойТип переменнойОписание
SecondsвещественныйСодержит количество секунд, прошедших с момента начала моделирования
Time_nowвещественныйСодержит значение текущего модельного времени (времени в моделируемой системе) в единицах времени.
Terminate_counterцелыйСодержит значение терминального счетчика процессного подхода.
+

Стандартные арифметические функции, включенные в данную версию языка, приведены в следующей таблице с соответствующими пояснениями:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Имя функцииТип значенияТип первого аргументаТип второго аргументаОписание
Abs(x)вещественныйвещественныйВычисляет абсолютную величину вещественного аргумента x
ArcCos(x)вещественныйвещественныйВычисляет арккосинус аргумента x, заданного в радианах
ArcSin(x)вещественныйвещественныйВычисляет арксинус аргумента x, заданного в радианах
ArcTan(x)вещественныйвещественныйВычисляет арктангенс аргумента x, заданного в радианах
Cos(x)вещественныйвещественныйВычисляет косинус аргумента x, заданного в радианах
Cotan(x)вещественныйвещественныйВычисляет котангенс аргумента x, заданного в радианах
Exp(x)вещественныйвещественныйВычисляет значение е в степени x
Floor(x)целыйвещественныйРезультат функции - наибольшее целое число, не превосходящее x
Frac(x)вещественныйвещественныйВозвращает дробную часть вещественного аргумента x
IAbs(x)целыйцелыйВычисляет абсолютную величину целого аргумента x
IMax(x,y)целыйцелыйцелыйВозвращает максимальное из значений двух целых аргументов x и y
IMin(x,y)целыйцелыйцелыйВозвращает минимальное из значений двух целых аргументов x и y
Int(x)целыйвещественныйРезультат функции - наибольшее целое число, не превосходящее x
IntPower(x,y)вещественныйвещественныйцелыйВычисляет значение x в целой степени y с учетом знака x. Если x отрицателен и y - нечетная, то результат отрицателен
Ln(x)вещественныйвещественныйВычисляет натуральный логарифм положительного аргумента x
Log10(x)вещественныйвещественныйВычисляет логарифм по основанию 10 положительного аргумента x
Log2(x)вещественныйвещественныйВычисляет логарифм по основанию 2 положительного аргумента x
LogN(x,y)вещественныйвещественныйвещественныйВычисляет логарифм по основанию y положительного аргумента x. Аргумент y должен быть положителен
Max(x,y)вещественныйвещественныйвещественныйВозвращает максимальное из значений двух вещественных аргументов x и y
Min(x,y)вещественныйвещественныйвещественныйВозвращает минимальное из значений двух вещественных аргументов x и y
Power(x,y)вещественныйвещественныйвещественныйВычисляет значение x в степени y. x должен быть неотрицателен
Round(x)целыйвещественныйОкругляет значение вещественного аргумента x к ближайшему целому числу
Sin(x)вещественныйвещественныйВычисляет синус аргумента x, заданного в радианах
Sqrt(x)вещественныйвещественныйВычисляет значение корня квадратного из x. x должен быть неотрицателен
Tan(x)вещественныйвещественныйВычисляет тангенс аргумента x, заданного в радианах
+ +

Кроме стандартных арифметических функций в языке определены четыре стандартные функции, значением которых является ИСТИНА или ЛОЖЬ. Синтаксис вызова этих функций следующий:

+
<имя_функции>(<имя_типа_ресурсов>: (<логическое_выражение> | NoCheck))
+

Стандартные логические функции используются в логических выражениях. Ниже приведены их имена и способы вычисления их значений:

+ + + + + + + + + + + + + + + + + + + + + +
Имя функцииЗначение
ExistЕсли существует хотя бы один ресурс указанного типа, состояние которого удовлетворяет заданному логическому выражению, функция выдает значение ИСТИНА, в противном случае - ЛОЖЬ
Not_ExistЕсли не существует ни одного ресурса указанного типа, состояние которого удовлетворяет заданному логическому выражению, функция выдает значение ИСТИНА, в противном случае - ЛОЖЬ
For_AllЕсли состояние всех ресурсов указанного типа удовлетворяет заданному логическому выражению, функция выдает значение ИСТИНА, в противном случае - ЛОЖЬ
Not_For_AllЕсли состояние не всех ресурсов указанного типа удовлетворяет заданному логическому выражению, функция выдает значение ИСТИНА, в противном случае - ЛОЖЬ
+

Если вместо логического выражения указано зарезервированное слово NoCheck, то рассматриваются все ресурсы указанного типа. В этом случае функция Exist определяет, существует ли хотя бы один ресурс указанного типа, функция For_All всегда выдает значение ИСТИНА (даже если нет ни одного ресурса указанного типа), а функция Not_For_All всегда выдает значение ЛОЖЬ.

+ +

В языке определена еще одна стандартная функция, позволяющая работать со списком ресурсов. Она позволяет отобрать только часть ресурсов указанного типа и проверить их состояния. Синтаксис:

+
Select(<имя_типа_ресурсов>: (<логическое_выражение> | NoCheck)).<метод_списка>
+

Список методов приведен в таблице:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Имя методаОписаниеЗначение
ExistОписание аналогично приведённому, но проверяются не все, ресурсы, а только отобранные в список. Формат использования:
Exist(<логическое_выражение> | NoCheck)
Логическое
Not_ExistОписание аналогично приведённому, но проверяются не все, ресурсы, а только отобранные в список. Формат использования:
Not_Exist(<логическое_выражение> | NoCheck)
Логическое
For_AllОписание аналогично приведённому, но проверяются не все, ресурсы, а только отобранные в список. Формат использования:
For_All(<логическое_выражение> | NoCheck)
Логическое
Not_For_AllОписание аналогично приведённому, но проверяются не все, ресурсы, а только отобранные в список. Формат использования:
Not_For_All(<логическое_выражение> | NoCheck)
Логическое
EmptyВозвращает значение ИСТИНА, если список отобранных ресурсов пуст, в противном случае - ЛОЖЬ. Формат использования:
Empty()
Логическое
SizeВозвращает размер списка ресурсов, целое число. Если список пуст, то вовращается ноль. Формат использования:
Size()
Арифметическое
getArrayРаботает только в системе анимации. Возвращает массив с отобранными ресурсами, тип массива соответствует типу ресурса. Если список ресурсов пуст, возвращаемый массив также имеет нулевой размер. Формат использования:
getArray() | get_array()
+
Арифметическое
+

Примеры

+
Exist(Заявки : Заявки.Состояние = ожидает)
+
Not_Exist(Тип_1 : NoCheck)
+
Not_For_All(Станок : Станок.Количество > 3 and Станок.Состояние = свободен)
+
Select(Заявка: Заявка.Время_прихода >= 480 and Заявка.Состояние = в_очереди).For_All(Заявка.Время_в_очереди > 20)
array<Заявки> Z = Select(Заявки: Заявки.Время_прихода >= 300).getArray();
-

См. также

-

Типы данных. Соответствие типов

-
-
+

См. также

+

Типы данных. Соответствие типов

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_types.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_types.htm index c80c091a2..c63a4b9e7 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_types.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_base/rdo_base_types.htm @@ -8,39 +8,39 @@ -
-

ТИПЫ ДАННЫХ. СООТВЕТСТВИЕ ТИПОВ

-

Тип данных определяет множество значений, которые может принимать та или иная переменная, и те операции, которые можно к ним применять. Концепцию типов данных широко используют в современных языках программирования, с ее помощью можно абстрагироваться от физического представления данных, повысить наглядность и надежность программы. С каждой встречающейся в программе константой, функцией, последовательностью, параметром ресурса, параметром функции, параметром образца должен быть сопоставлен один и только один тип.

-

В данной версии РДО-языка определены следующие типы данных:

-
    -
  • целый тип - integer;
  • -
  • вещественный тип - real;
  • -
  • логический тип - bool;
  • -
  • перечислимый тип;
  • +
    +

    ТИПЫ ДАННЫХ. СООТВЕТСТВИЕ ТИПОВ

    +

    Тип данных определяет множество значений, которые может принимать та или иная переменная, и те операции, которые можно к ним применять. Концепцию типов данных широко используют в современных языках программирования, с ее помощью можно абстрагироваться от физического представления данных, повысить наглядность и надежность программы. С каждой встречающейся в программе константой, функцией, последовательностью, параметром ресурса, параметром функции, параметром образца должен быть сопоставлен один и только один тип.

    +

    В данной версии РДО-языка определены следующие типы данных:

    +
      +
    • целый тип - integer;
    • +
    • вещественный тип - real;
    • +
    • логический тип - bool;
    • +
    • перечислимый тип;
    • тип ресурса;
    • -
    • ссылка на один из выше определенных типов - such_as.
    • -
    -

    Для целых и вещественных типов возможно задание диапазона допустимых значений. Диапазон указывают за зарезервированным словом integer или real в квадратных скобках. Границы диапазона представляют собой численные константы вещественного или целого типа, их разделяют двумя точками.

    -

    Примеры

    -
    integer [1..100]
    -
    real [0.0..50.7]
    -

    Если диапазон указан, то при присвоении значения проверяется нахождение значения объекта в диапазоне допустимых, и в случае выхода за границы выдается собщение об ошибке как на этапе компиляции модели, так и во время прогона.

    -

    Перечислимые типы задают указанием всех возможных значений. Имена всех возможных значений перечислимого типа указывают в круглых скобках через запятую. Максимальное количество имен значений равно 256, значение перечислимого типа хранится как байт. Имя значения перечислимого типа - это простое имя.

    -

    Примеры

    -
    (Свободен, Занят, Погрузка, Разгрузка)
    -
    (Первый, Второй, Третий, Седьмой)
    -

    Если несколько различных объектов программы имеют одинаковый тип, то нет необходимости повторять описание типа. Вместо этого можно воспользоваться ссылкой на ранее описанный тип. Ссылка имеет следующий формат:

    -
    such_as <имя_ранее_описанного_объекта>
    -

    Ссылки возможны на типы ранее описанных констант и параметров ресурсов, представленных в объекте типов ресурсов. Допустимы цепочные ссылки, т.е. ссылки на объект, тип которого также описан ссылкой.

    -

    Примеры

    -
    wood_kind  : such_as a_trunk.wood_kind
    -
    quality    : such_as a_trunk.quality
    -
    diameter_b : such_as a_trunk.diameter_a
    -
    diameter_e : such_as diameter_b
    -

    В языке используют следующие соглашения о соответствии типов. Целый тип всегда соответствует целому, а вещественный - вещественному независимо от диапазона допустимых значений, если он задан. Перечислимые типы считаются соответствующими только если один из них описан ссылкой на тип другого либо если они оба описаны ссылкой на тип третьего.

    -

    См. также

    -

    Арифметические и логические выражения

    -
    -
    +
  • ссылка на один из выше определенных типов - such_as.
  • +
+

Для целых и вещественных типов возможно задание диапазона допустимых значений. Диапазон указывают за зарезервированным словом integer или real в квадратных скобках. Границы диапазона представляют собой численные константы вещественного или целого типа, их разделяют двумя точками.

+

Примеры

+
integer [1..100]
+
real [0.0..50.7]
+

Если диапазон указан, то при присвоении значения проверяется нахождение значения объекта в диапазоне допустимых, и в случае выхода за границы выдается собщение об ошибке как на этапе компиляции модели, так и во время прогона.

+

Перечислимые типы задают указанием всех возможных значений. Имена всех возможных значений перечислимого типа указывают в круглых скобках через запятую. Максимальное количество имен значений равно 256, значение перечислимого типа хранится как байт. Имя значения перечислимого типа - это простое имя.

+

Примеры

+
(Свободен, Занят, Погрузка, Разгрузка)
+
(Первый, Второй, Третий, Седьмой)
+

Если несколько различных объектов программы имеют одинаковый тип, то нет необходимости повторять описание типа. Вместо этого можно воспользоваться ссылкой на ранее описанный тип. Ссылка имеет следующий формат:

+
such_as <имя_ранее_описанного_объекта>
+

Ссылки возможны на типы ранее описанных констант и параметров ресурсов, представленных в объекте типов ресурсов. Допустимы цепочные ссылки, т.е. ссылки на объект, тип которого также описан ссылкой.

+

Примеры

+
wood_kind  : such_as a_trunk.wood_kind
+
quality    : such_as a_trunk.quality
+
diameter_b : such_as a_trunk.diameter_a
+
diameter_e : such_as diameter_b
+

В языке используют следующие соглашения о соответствии типов. Целый тип всегда соответствует целому, а вещественный - вещественному независимо от диапазона допустимых значений, если он задан. Перечислимые типы считаются соответствующими только если один из них описан ссылкой на тип другого либо если они оба описаны ссылкой на тип третьего.

+

См. также

+

Арифметические и логические выражения

+
+
diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_dpt/rdo_dpt_prior.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_dpt/rdo_dpt_prior.htm index df50df4e1..6e473cd90 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_dpt/rdo_dpt_prior.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_dpt/rdo_dpt_prior.htm @@ -9,56 +9,58 @@
-

ТОЧКА ПРИНЯТИЯ РЕШЕНИЙ ТИПА PRIOR

-

Алгоритм обработки точек принятия решений типа prior следующий. При каждом событии после изменения состояния системы и сбора статистической информации проверяются предусловия точек принятия решений в порядке убывания их приоритетов.

-

Описание точек принятия решений типа prior аналогично some:

-
$Decision_point <имя_точки>: prior [<признак_трассировки>]
+    

ТОЧКА ПРИНЯТИЯ РЕШЕНИЙ ТИПА PRIOR

+

Алгоритм обработки точек принятия решений типа prior следующий. При каждом событии после изменения состояния системы и сбора статистической информации проверяются предусловия точек принятия решений в порядке убывания их приоритетов.

+

Описание точек принятия решений типа prior аналогично some:

+
$Decision_point <имя_точки>: prior [<признак_трассировки>]
 $Condition <условие_активизации_точки>
 $Activities
     <описание_активности> {<описание_активности>}
 $End
-
оценка_стоимости_оставшегося_пути_на_графе
-
Эвристическая оценочная функция стоимости оставшегося пути до целевой вершины задается арифметическим выражением целого либо вещественного типа.
-
признак_сравнения_вершин
-
Признак сравнения вершин задается зарезервированным словом YES, если необходимо сравнивать каждую вновь порожденную в процессе поиска вершину с вершинами, уже находящимися в графе, и зарезервированным словом NO, если сравнивать не нужно. Необходимость в сравнении вершин зависит от конкретной задачи, решаемой поиском на графе.
-
описание активности
-
<имя_активности>: <имя_образца> [<код_клавиши>]
-[<значения_параметров_образца>]
-[<приоритет_активности>]
-
имя_образца
-

При написании активности типа prior допустимо использовать все существующие типы образцов

-
приоритет активности -

Приоритет активности имеет следующий формат: -

CF = <арифметическое выражение>
-
-
арифметическое_выражение
-
Арифметическое выражение должно иметь целый или вещественный тип, и его значение должно лежать в диапазоне [0; 1].
-
-

Пример

-
+

Пример

+ -

См. также

-

Точка принятия решений типа some

-

Точка принятия решений типа search

-

Описание точек принятия решений в РДО

-
-
+ +

См. также

+

Точка принятия решений типа some

+

Точка принятия решений типа search

+

Описание точек принятия решений в РДО

+ +
diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_dpt/rdo_dpt_search.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_dpt/rdo_dpt_search.htm index 5b1e4801e..36f38044e 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_dpt/rdo_dpt_search.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_dpt/rdo_dpt_search.htm @@ -9,21 +9,21 @@
-

ТОЧКА ПРИНЯТИЯ РЕШЕНИЙ ТИПА SEARCH

-

Точки принятия решений типа search реализуют поиск решения на графе состояний

-

Описание имеет следующий формат:

-
$Decision_point <имя_точки>: search [<признак_трассировки>]
+    

ТОЧКА ПРИНЯТИЯ РЕШЕНИЙ ТИПА SEARCH

+

Точки принятия решений типа search реализуют поиск решения на графе состояний

+

Описание имеет следующий формат:

+
$Decision_point <имя_точки>: search [<признак_трассировки>]
 $Condition <условие_активизации_точки>
 $Term_condition <терминальное_условие>
 $Evaluate_by <оценка_стоимости_оставшегося_пути_на_графе>
@@ -32,42 +32,44 @@ 

ТОЧКА ПРИНЯТИЯ РЕШЕНИЙ ТИПА SEARCH

<описание_активности> {<описание_активности>} $End
-
терминальное_условие
-
Терминальное условие поиска - это логическое выражение. Когда алгоритм поиска на графе выбирает очередную вершину для раскрытия, проверяется, не удовлетворяет ли состояние системы, соответствующее этой вершине, терминальному условию. Если удовлетворяет, то это означает, что решение найдено и процесс поиска прекращается.
-
 оценка_стоимости_оставшегося_пути_на_графе
-
Эвристическая оценочная функция стоимости оставшегося пути до целевой вершины задается арифметическим выражением целого либо вещественного типа.
-
признак_сравнения_вершин
-
Признак сравнения вершин задается зарезервированным словом YES, если необходимо сравнивать каждую вновь порожденную в процессе поиска вершину с вершинами, уже находящимися в графе, и зарезервированным словом NO, если сравнивать не нужно. Необходимость в сравнении вершин зависит от конкретной задачи, решаемой поиском на графе.
-
описание_активности
-
<имя_активности>: <имя_образца> [<код_клавиши>]
-[<значения_параметров_образца>]
-[(value before | value after) <стоимость_применения_правила>]
-
имя_образца
-
Для точки принятия решений типа search допустимо использование только образцов типа rule, при выполнении которых ресурсы не создаются и не уничтожаются, то есть статусы конверторов релевантных ресурсов которых не содержат Create или Erase. Использование образцов других типов не допускается.
-
стоимость_применения_правила
-
Стоимость применения правил есть арифметическое выражение целого или вещественного типа, записанное в контексте данного образца, то есть в этом выражении можно использовать параметры образца и параметры релевантных ресурсов - образца. Зарезервированные слова value before обозначают, что значение выражения должно быть вычислено до применения правила, то есть при состоянии системы перед преобразованием состояния в соответствии с правилом. Зарезервированные слова value after обозначают, что значение выражения должно быть вычислено после применения правила, то есть с измененным состоянием системы.
-

Для точек типа search запускается алгоритм поиска решения на графе состояний в локальной продукционной системе. Базой данных этой локальной продукционной системы являются все ресурсы, присутствующие в данный момент в моделируемой системе, базой знаний - продукционные правила, записанные в блоке активностей данной точки. Решением, получаемым с помощью поиска на графе, является путь на графе. Путь представляет собой последовательность правил, которые необходимо применить для преобразования начального состояния системы в целевое. Найденная последовательность правил затем применяется к состоянию системы, изменяя его в соответствии с полученным решением. Это измененное состояние системы и является результатом принятия решения. Процесс имитации продолжается далее от нового состояния, полученного в результате принятия решения. Обработка других точек принятия решений завершается. Если же в процессе поиска решение не найдено, обрабатывается следующая точка принятия решений.

- -

Пример

-
+

Пример

+ -

См. также

-

Точка принятия решений типа some

-

Точка принятия решений типа prior

-

Описание точек принятия решений в РДО

-
-
+ +

См. также

+

Точка принятия решений типа some

+

Точка принятия решений типа prior

+

Описание точек принятия решений в РДО

+ +
- \ No newline at end of file + diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_dpt/rdo_dpt_some.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_dpt/rdo_dpt_some.htm index baeec21a0..a36b6577e 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_dpt/rdo_dpt_some.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_dpt/rdo_dpt_some.htm @@ -9,45 +9,47 @@
-

ТОЧКА ПРИНЯТИЯ РЕШЕНИЙ ТИПА SOME

-

Алгоритм обработки точек принятия решений типа some следующий: при каждом событии после изменения состояния системы и сбора статистической информации проверяются предусловия точек принятия решений в порядке их следования в объекте описания точек. При нахождении точки принятия решений, предусловие которой выполняется, запускается алгоритм обработки точки.

-

Описание точек принятия решений типа some имеет следующий формат:

-
$Decision_point <имя_точки>: some [<признак_трассировки>]
+    

ТОЧКА ПРИНЯТИЯ РЕШЕНИЙ ТИПА SOME

+

Алгоритм обработки точек принятия решений типа some следующий: при каждом событии после изменения состояния системы и сбора статистической информации проверяются предусловия точек принятия решений в порядке их следования в объекте описания точек. При нахождении точки принятия решений, предусловие которой выполняется, запускается алгоритм обработки точки.

+

Описание точек принятия решений типа some имеет следующий формат:

+
$Decision_point <имя_точки>: some [<признак_трассировки>]
 $Condition <условие_активизации_точки>
 $Activities
     <описание_активности> {<описание_активности>}
 $End
-
описание активности:
-
<имя_активности>: <имя_образца> [<код_клавиши>] [<значения_параметров_образца>]
-
имя_образца
-

При написании активности типа some допустимо использовать все существующие типы образцов.

- -

Для точек типа some алгоритм проверяет активности в порядке их записи в точке принятия решений. Найдя первую активность, предусловия которой выполняются, он планирует соответствующее событие (событие начала действия или событие выполнения правила), после чего обработка этой и других точек завершается. Если же не найдено ни одной активности, для которой выполнены предусловия, анализируется следующая точка принятия решений.

-

Пример

- -
+
+

См. также

+

Точка принятия решений типа search

+

Точка принятия решений типа prior

+

Описание точек принятия решений в РДО

+ +
- \ No newline at end of file + diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_intro.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_intro.htm index e1c62c27a..eb8db5773 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_intro.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_intro.htm @@ -8,42 +8,42 @@ -
- -

ВВЕДЕНИЕ

-

Имитационное моделирование (ИМ) на ЭВМ находит широкое применение при исследовании и управлении сложными дискретными системами (СДС) и процессами, в них протекающими. К таким системам можно отнести экономические и производственные объекты, морские порты, аэропорты, комплексы перекачки нефти и газа, ирригационные системы, программное обеспечение сложных систем управления, вычислительные сети и многие другие. Широкое использование ИМ объясняется тем, что размерность решаемых задач и неформализуемость сложных систем не позволяют использовать строгие методы оптимизации. Так выделяют, например, следующие проблемы в исследовании операций, которые не могут быть решены сейчас и в обозримом будущем без ИМ:

-
    -
  1. Формирование инвестиционной политики при перспективном планировании.
  2. -
  3. Выбор средств обслуживания (или оборудования) при текущем планировании.
  4. -
  5. Разработка планов с обратной информационной связью и операционных предписаний.
  6. -
-

Эти классы задач определяются тем, что при их решении необходимо одновременно учитывать факторы неопределенности, динамическую взаимную обусловленность текущих решений и последующих событий, комплексную взаимозависимость между управляемыми переменными исследуемой системы, а часто и строго дискретную и четко определенную последовательность интервалов времени. Указанные особенности свойственны всем сложным системам.

-

Проведение имитационного эксперимента позволяет:

-
    -
  1. Сделать выводы о поведении СДС и ее особенностях:
  2. -
      -
    • без ее построения, если это проектируемая система;
    • -
    • без вмешательства в ее функционирование, если это действующая система, проведение экспериментов над которой или слишком дорого, или небезопасно;
    • -
    • без ее разрушения, если цель эксперимента состоит в определении пределов воздействия на систему.
    • -
    -
  3. Синтезировать и исследовать стратегии управления.
  4. -
  5. Прогнозировать и планировать функционирование системы в будущем.
  6. -
  7. Обучать и тренировать управленческий персонал и т.д.
  8. -
-

ИМ является эффективным, но и не лишенным недостатков, методом. Трудности использования ИМ, связаны с обеспечением адекватности описания системы, интерпретацией результатов, обеспечением стохастической сходимости процесса моделирования, решением проблемы размерности и т.п. К проблемам применения ИМ следует отнести также и большую трудоемкость данного метода.

-

Интеллектуальное ИМ, характеризующиеся возможностью использования методов искусственного интеллекта и прежде всего знаний, при принятии решений в процессе имитации, при управлении имитационным экспериментом, при реализации интерфейса пользователя, создании информационных банков ИМ, использовании нечетких данных, снимает часть проблем использования ИМ.

-

Разработка интеллектуальной среды имитационного моделирования РДО выполнена в Московском государственном техническом университете (МГТУ им.Н.Э. Баумана) на кафедре "Компьютерные системы автоматизации производства". Причинами ее проведения и создания РДО явились требования универсальности ИМ относительно классов моделируемых систем и процессов, легкости модификации моделей, моделирования сложных систем управления совместно с управляемым объектом (включая использование ИМ в управлении в реальном масштабе времени) и ряд других, сформировавшихся у разработчиков при выполнении работ, связанных с системным анализом и организационным управлением сложными системами различной природы.

-

Среда РДО служит для решения указанных выше проблем ИМ и обеспечения исследователя и проектировщика новыми возможностями.

-

Данная версия языка предназначена для использования на персональных компьютерах, работающих под управлением операционных систем Windows 7 или Ubuntu 12.10.

-


Microsoft, Windows являются зарегистрированными торговыми марками или торговыми марками Microsoft Corporation (в США и/или других странах).

-

Ubuntu является зарегистрированной торговой маркой Canonical Ltd.

-

Названия реальных компаний и продуктов, упомянутых в данном руководстве пользователя, могут быть торговыми марками соответствующих владельцев.

-

См. также

-

Основные понятия

-

Базовые конструкции языка РДО

-

Конструкции языка

-

Результаты моделирования

-
-
+
+ +

ВВЕДЕНИЕ

+

Имитационное моделирование (ИМ) на ЭВМ находит широкое применение при исследовании и управлении сложными дискретными системами (СДС) и процессами, в них протекающими. К таким системам можно отнести экономические и производственные объекты, морские порты, аэропорты, комплексы перекачки нефти и газа, ирригационные системы, программное обеспечение сложных систем управления, вычислительные сети и многие другие. Широкое использование ИМ объясняется тем, что размерность решаемых задач и неформализуемость сложных систем не позволяют использовать строгие методы оптимизации. Так выделяют, например, следующие проблемы в исследовании операций, которые не могут быть решены сейчас и в обозримом будущем без ИМ:

+
    +
  1. Формирование инвестиционной политики при перспективном планировании.
  2. +
  3. Выбор средств обслуживания (или оборудования) при текущем планировании.
  4. +
  5. Разработка планов с обратной информационной связью и операционных предписаний.
  6. +
+

Эти классы задач определяются тем, что при их решении необходимо одновременно учитывать факторы неопределенности, динамическую взаимную обусловленность текущих решений и последующих событий, комплексную взаимозависимость между управляемыми переменными исследуемой системы, а часто и строго дискретную и четко определенную последовательность интервалов времени. Указанные особенности свойственны всем сложным системам.

+

Проведение имитационного эксперимента позволяет:

+
    +
  1. Сделать выводы о поведении СДС и ее особенностях:
  2. +
      +
    • без ее построения, если это проектируемая система;
    • +
    • без вмешательства в ее функционирование, если это действующая система, проведение экспериментов над которой или слишком дорого, или небезопасно;
    • +
    • без ее разрушения, если цель эксперимента состоит в определении пределов воздействия на систему.
    • +
    +
  3. Синтезировать и исследовать стратегии управления.
  4. +
  5. Прогнозировать и планировать функционирование системы в будущем.
  6. +
  7. Обучать и тренировать управленческий персонал и т.д.
  8. +
+

ИМ является эффективным, но и не лишенным недостатков, методом. Трудности использования ИМ, связаны с обеспечением адекватности описания системы, интерпретацией результатов, обеспечением стохастической сходимости процесса моделирования, решением проблемы размерности и т.п. К проблемам применения ИМ следует отнести также и большую трудоемкость данного метода.

+

Интеллектуальное ИМ, характеризующиеся возможностью использования методов искусственного интеллекта и прежде всего знаний, при принятии решений в процессе имитации, при управлении имитационным экспериментом, при реализации интерфейса пользователя, создании информационных банков ИМ, использовании нечетких данных, снимает часть проблем использования ИМ.

+

Разработка интеллектуальной среды имитационного моделирования РДО выполнена в Московском государственном техническом университете (МГТУ им.Н.Э. Баумана) на кафедре "Компьютерные системы автоматизации производства". Причинами ее проведения и создания РДО явились требования универсальности ИМ относительно классов моделируемых систем и процессов, легкости модификации моделей, моделирования сложных систем управления совместно с управляемым объектом (включая использование ИМ в управлении в реальном масштабе времени) и ряд других, сформировавшихся у разработчиков при выполнении работ, связанных с системным анализом и организационным управлением сложными системами различной природы.

+

Среда РДО служит для решения указанных выше проблем ИМ и обеспечения исследователя и проектировщика новыми возможностями.

+

Данная версия языка предназначена для использования на персональных компьютерах, работающих под управлением операционных систем Windows 7 или Ubuntu 12.10.

+


Microsoft, Windows являются зарегистрированными торговыми марками или торговыми марками Microsoft Corporation (в США и/или других странах).

+

Ubuntu является зарегистрированной торговой маркой Canonical Ltd.

+

Названия реальных компаний и продуктов, упомянутых в данном руководстве пользователя, могут быть торговыми марками соответствующих владельцев.

+

См. также

+

Основные понятия

+

Базовые конструкции языка РДО

+

Конструкции языка

+

Результаты моделирования

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_intro.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_intro.htm index 3102cd87c..658b5582e 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_intro.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_intro.htm @@ -8,22 +8,22 @@ -
- -

ЛЕКСЕМЫ И РАЗДЕЛИТЕЛИ

-

Лексемы языка состоят из символов, входящих в алфавит языка, и отделяются друг от друга одним или несколькими разделителями.

-

Разделителем является:

-
    -
  • пробел;
  • -
  • знак горизонтальной табуляции;
  • -
  • конец строки;
  • -
  • конец объекта;
  • -
  • комментарий.
  • -
-

Разделители могут следовать один за другим в любом количестве и сочетании (кроме признака конца объекта).

-

Комментарием является любой текст заключенный в символы /* ... */ (многострочный комментарий), или текст, перед которым указаны два символа // (однострочный комментарий). -

-
-
+
+ +

ЛЕКСЕМЫ И РАЗДЕЛИТЕЛИ

+

Лексемы языка состоят из символов, входящих в алфавит языка, и отделяются друг от друга одним или несколькими разделителями.

+

Разделителем является:

+
    +
  • пробел;
  • +
  • знак горизонтальной табуляции;
  • +
  • конец строки;
  • +
  • конец объекта;
  • +
  • комментарий.
  • +
+

Разделители могут следовать один за другим в любом количестве и сочетании (кроме признака конца объекта).

+

Комментарием является любой текст заключенный в символы /* ... */ (многострочный комментарий), или текст, перед которым указаны два символа // (однострочный комментарий). +

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_names.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_names.htm index dc77d52ca..3430e4094 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_names.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_names.htm @@ -8,24 +8,24 @@ -
-

ИМЕНА

-

Простое имя - это последовательность русских или латинских строчных или прописных букв и цифр, а также символов "$" и "_".

-

Составное имя содержит два простых имени, разделенных точкой.

-

Примечания

-

Имя не может начинаться с цифры.

-

Прописные и строчные буквы считаются разными символами.

-

Примеры

-
Положение
-
_наверх
-
$Количество
-
Партия_запуска
-
Arv_time
-
Пресс.Номер_группы
-
Storage.volume
-
Фигаро.Количество_клиентов_в_очереди
-

-
-
+
+

ИМЕНА

+

Простое имя - это последовательность русских или латинских строчных или прописных букв и цифр, а также символов "$" и "_".

+

Составное имя содержит два простых имени, разделенных точкой.

+

Примечания

+

Имя не может начинаться с цифры.

+

Прописные и строчные буквы считаются разными символами.

+

Примеры

+
Положение
+
_наверх
+
$Количество
+
Партия_запуска
+
Arv_time
+
Пресс.Номер_группы
+
Storage.volume
+
Фигаро.Количество_клиентов_в_очереди
+

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_numeric_const.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_numeric_const.htm index 6fdd3be09..a257c50b1 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_numeric_const.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_numeric_const.htm @@ -8,24 +8,24 @@ -
-

ЧИСЛЕННЫЕ КОНСТАНТЫ

-

Численные константы записывают так же, как в языках программирования высокого уровня.

-

Константы целого типа представляют собой последовательность цифр, перед которой может стоять знак "+" или "-".

-

Вещественные константы состоят из целой и дробной частей, разделенных точкой, за которыми может следовать порядок. Порядок числа начинается символом "E" или "e", за которым следует значение порядка (целая константа со знаком). Вещественная константа также может иметь знак.

-

Примечания

-

Диапазон допустимых значений целой константы составляет -32767…32767, длинной целой -2147483647…2147483647.

-

Вещественные константы хранятся в 4-байтном формате (диапазон 1.5Е-45…3.4Е+38, точность 7-8 значащих цифр).

-

Примеры

-
12345
-
-12345
-
123.45E6
-
-12.3e-4
-
0.012345
-
+12345
-

См. также

-

Строковые константы

-
-
+
+

ЧИСЛЕННЫЕ КОНСТАНТЫ

+

Численные константы записывают так же, как в языках программирования высокого уровня.

+

Константы целого типа представляют собой последовательность цифр, перед которой может стоять знак "+" или "-".

+

Вещественные константы состоят из целой и дробной частей, разделенных точкой, за которыми может следовать порядок. Порядок числа начинается символом "E" или "e", за которым следует значение порядка (целая константа со знаком). Вещественная константа также может иметь знак.

+

Примечания

+

Диапазон допустимых значений целой константы составляет -32767…32767, длинной целой -2147483647…2147483647.

+

Вещественные константы хранятся в 4-байтном формате (диапазон 1.5Е-45…3.4Е+38, точность 7-8 значащих цифр).

+

Примеры

+
12345
+
-12345
+
123.45E6
+
-12.3e-4
+
0.012345
+
+12345
+

См. также

+

Строковые константы

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_procedures.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_procedures.htm index ab6f24249..79ba41ab8 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_procedures.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_procedures.htm @@ -8,19 +8,19 @@ -
-

ПРОЦЕДУРЫ

-

Все алгоритмы в языке исполняются поэтапно. Каждая лексема, имя, спецсимвол дают определнную инструкцию симулятору модели. Весь набор инструкций должен быть разбит на определенные отдельные группы, несущие смысл законченного действия. Данные группы инструкций называются процедурами.

-

Процедура представляет собой совокупность операторов языка программирования, арифметических и логических выражений, ресурсов(релевантных и глобальных), параметров, локальных и глобальных переменных, численных и строковых констант, типов данных и т.д. Процедуры разделяются между собой спецсимволом";". Процедуры могут использоваться в телах образцов и алгоритмических функций.

-

Выполнение алгоритма происходит последовательным исполнением соответствующих процедур. Особенности операторов процедурного программирования позволяют создавать рекурсивные и вложенные функции, а также списки процедур внутри одной процедуры.

-

См. также

-

Лексемы

-

Типы данных. Соответствие типов

-

Операторы процедурного программирования

-

Ресурсы

-

Функции

-

Образцы

-
-
+
+

ПРОЦЕДУРЫ

+

Все алгоритмы в языке исполняются поэтапно. Каждая лексема, имя, спецсимвол дают определнную инструкцию симулятору модели. Весь набор инструкций должен быть разбит на определенные отдельные группы, несущие смысл законченного действия. Данные группы инструкций называются процедурами.

+

Процедура представляет собой совокупность операторов языка программирования, арифметических и логических выражений, ресурсов(релевантных и глобальных), параметров, локальных и глобальных переменных, численных и строковых констант, типов данных и т.д. Процедуры разделяются между собой спецсимволом";". Процедуры могут использоваться в телах образцов и алгоритмических функций.

+

Выполнение алгоритма происходит последовательным исполнением соответствующих процедур. Особенности операторов процедурного программирования позволяют создавать рекурсивные и вложенные функции, а также списки процедур внутри одной процедуры.

+

См. также

+

Лексемы

+

Типы данных. Соответствие типов

+

Операторы процедурного программирования

+

Ресурсы

+

Функции

+

Образцы

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_res_words.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_res_words.htm index f16fe285b..b52ec5997 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_res_words.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_res_words.htm @@ -8,200 +8,200 @@ -
-

ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА

-

В данной версии языка имеется 116 зарезервированных слов. Они должны быть записаны так как указано ниже или полностью в нижнем регистре (прописные и строчные буквы различаются, т.е. вместо $Pattern можно использовать $pattern, но никак не $pATTern ) и не могут быть использованы в другом контексте (в тексте настоящего документа зарезервированные слова выделяются жирным шрифтом):


- - - - - - -
- $Activities
- $Back_picture
- $Body( - 1, - 2, - 3)
- $Compare_tops
- $Condition
- $Constant
- $Decision_point
- $End( - 1, - 2, - 3, - 4, - 5, - 6, - 7, - 8, - 9, - 10)
- $Evaluate_by
- $Frame
- $Function
- $Parameters( - 1, - 2, - 3)
- $Pattern
- $Process
- $Relevant_resources
- $Resource_type
- $Resources
- $Results
- $Sequence
- $Status( - 1, - 2)
- $Term_condition
- $Time
- $Type( - 1, - 2)
- active
- after
- algorithmic
- ADVANCE
- and
- Animation
- ASSIGN
- before
- bitmap
- break
- Break_point
- by_hist
- CF
- Choice( - 1, - 2, - 3)
- circle
- Convert_begin( - 1, - 2)
- Convert_end( - 1, - 2)
- Convert_event
- Convert_rule
- Create
-
- DEPART
- else
- ellipse
- enumerative
- Erase
- event
- exponential
- first
- for
- Frame_file
- Frame_number
- from( - 1, - 2, - 3)
- GENERATE
- get_value
- if
- integer
- irregular_event
- Keep
- keyboard
- line
- list
- Model_name( - 1, - 2, - 3)
- Monitor
- NO
- no_trace( - 1, - 2, - 3, - 4)
- NoChange
- NoCheck( - 1, - 2, - 3)
- NonExist
- normal
- NORMAL_TERMINATION( - 1, - 2)
- NoShow
- not
- Not_Exist
- Not_For_All
- operation
- OperRuleCheckCounter
- OprIev_file( - 1, - 2, - 3)
- or
- permanent
- QUEUE
- r_rect
- real
- rect
-
- Resource_file( - 1, - 2, - 3)
- Results_file( - 1, - 2, - 3)
- RELEASE
- return
- rule
- Run_StartTime
- s_bmp
- search
- SEIZE
- Select
- set
- Show_mode
- Show_rate
- some
- Statistic_file
- such_as
- table
- temporary
- TERMINATE
- Terminate_if
- text
- trace( - 1, - 2, - 3)
- trace_all
- Trace_EndTime
- Trace_file
- Trace_StartTime
- trace_stat
- trace_tops
- transparent
- triang
- triangular
- uniform
- value
- watch_par
- watch_quant
- watch_state
- watch_value
- with_max
- with_min
- YES
-
-
-
+
+

ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА

+

В данной версии языка имеется 116 зарезервированных слов. Они должны быть записаны так как указано ниже или полностью в нижнем регистре (прописные и строчные буквы различаются, т.е. вместо $Pattern можно использовать $pattern, но никак не $pATTern ) и не могут быть использованы в другом контексте (в тексте настоящего документа зарезервированные слова выделяются жирным шрифтом):


+ + + + + + +
+ $Activities
+ $Back_picture
+ $Body( + 1, + 2, + 3)
+ $Compare_tops
+ $Condition
+ $Constant
+ $Decision_point
+ $End( + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10)
+ $Evaluate_by
+ $Frame
+ $Function
+ $Parameters( + 1, + 2, + 3)
+ $Pattern
+ $Process
+ $Relevant_resources
+ $Resource_type
+ $Resources
+ $Results
+ $Sequence
+ $Status( + 1, + 2)
+ $Term_condition
+ $Time
+ $Type( + 1, + 2)
+ active
+ after
+ algorithmic
+ ADVANCE
+ and
+ Animation
+ ASSIGN
+ before
+ bitmap
+ break
+ Break_point
+ by_hist
+ CF
+ Choice( + 1, + 2, + 3)
+ circle
+ Convert_begin( + 1, + 2)
+ Convert_end( + 1, + 2)
+ Convert_event
+ Convert_rule
+ Create
+
+ DEPART
+ else
+ ellipse
+ enumerative
+ Erase
+ event
+ exponential
+ first
+ for
+ Frame_file
+ Frame_number
+ from( + 1, + 2, + 3)
+ GENERATE
+ get_value
+ if
+ integer
+ irregular_event
+ Keep
+ keyboard
+ line
+ list
+ Model_name( + 1, + 2, + 3)
+ Monitor
+ NO
+ no_trace( + 1, + 2, + 3, + 4)
+ NoChange
+ NoCheck( + 1, + 2, + 3)
+ NonExist
+ normal
+ NORMAL_TERMINATION( + 1, + 2)
+ NoShow
+ not
+ Not_Exist
+ Not_For_All
+ operation
+ OperRuleCheckCounter
+ OprIev_file( + 1, + 2, + 3)
+ or
+ permanent
+ QUEUE
+ r_rect
+ real
+ rect
+
+ Resource_file( + 1, + 2, + 3)
+ Results_file( + 1, + 2, + 3)
+ RELEASE
+ return
+ rule
+ Run_StartTime
+ s_bmp
+ search
+ SEIZE
+ Select
+ set
+ Show_mode
+ Show_rate
+ some
+ Statistic_file
+ such_as
+ table
+ temporary
+ TERMINATE
+ Terminate_if
+ text
+ trace( + 1, + 2, + 3)
+ trace_all
+ Trace_EndTime
+ Trace_file
+ Trace_StartTime
+ trace_stat
+ trace_tops
+ transparent
+ triang
+ triangular
+ uniform
+ value
+ watch_par
+ watch_quant
+ watch_state
+ watch_value
+ with_max
+ with_min
+ YES
+
+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_spesial_symbols.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_spesial_symbols.htm index 3f2095f50..6fed5f07d 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_spesial_symbols.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_spesial_symbols.htm @@ -8,84 +8,84 @@ -
-

СПЕЦИАЛЬНЫЕ СИМВОЛЫ

-

В данной версии языка лексемами являются следующие специальные символы и их комбинации:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
КомбинацияЗначение
:Двоеточие
[, ]Прямые скобки
(, )Kруглые скобки
{, }Фигурные скобки
,Запятая
+Знак сложения
-Знак вычитания или унарного минуса в зависимости от ситуации
*Знак умножения
/Знак деления
<Знак меньше
>Знак больше
=Знак равно
<>Не равно
<=Меньше или равно
>=Больше или равно
!Знак отрицания
..Знак диапазона
-
-
+
+

СПЕЦИАЛЬНЫЕ СИМВОЛЫ

+

В данной версии языка лексемами являются следующие специальные символы и их комбинации:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
КомбинацияЗначение
:Двоеточие
[, ]Прямые скобки
(, )Kруглые скобки
{, }Фигурные скобки
,Запятая
+Знак сложения
-Знак вычитания или унарного минуса в зависимости от ситуации
*Знак умножения
/Знак деления
<Знак меньше
>Знак больше
=Знак равно
<>Не равно
<=Меньше или равно
>=Больше или равно
!Знак отрицания
..Знак диапазона
+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_string_const.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_string_const.htm index 18e746c97..78cd839df 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_string_const.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_lex_div/rdo_lex_div_string_const.htm @@ -8,19 +8,19 @@ -
-

СТРОКОВЫЕ КОНСТАНТЫ

-

Строковая константа представляет собой строку текста, заключенную в апострофы. Текст может содержать разделители (кроме признака конца строки и конца объекта), а также символы, не входящие в алфавит языка. Апострофы внутри строковой константы не допускаются.

-

Примеры

-
'Абв{abc}d'
-
'1743+hdfs-'
-
'hhh kkk'
-
'Line____Строка-----'
-

См. также

-

Алфавит

-

Лексемы и разделители

-

Описание символьных констант, функций и последовательностей

-
-
+
+

СТРОКОВЫЕ КОНСТАНТЫ

+

Строковая константа представляет собой строку текста, заключенную в апострофы. Текст может содержать разделители (кроме признака конца строки и конца объекта), а также символы, не входящие в алфавит языка. Апострофы внутри строковой константы не допускаются.

+

Примеры

+
'Абв{abc}d'
+
'1743+hdfs-'
+
'hhh kkk'
+
'Line____Строка-----'
+

См. также

+

Алфавит

+

Лексемы и разделители

+

Описание символьных констант, функций и последовательностей

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_const.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_const.htm index ed61fe424..237c65813 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_const.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_const.htm @@ -8,26 +8,26 @@ -
-

СИМВОЛЬНЫЕ КОНСТАНТЫ

-

Константы описываются в объекте (с расширением .fun), который определяет символьные константы, функции и последовательности. Константы должны быть описаны до функций и последовательностей. Описание констант имеет следующий формат:

-
$Constant
+    
+

СИМВОЛЬНЫЕ КОНСТАНТЫ

+

Константы описываются в объекте (с расширением .fun), который определяет символьные константы, функции и последовательности. Константы должны быть описаны до функций и последовательностей. Описание констант имеет следующий формат:

+
$Constant
     <описание_константы> {<описание_константы>}
 $End
 
-
-
описание_константы
-
Описание константы имеет формат:
-
<имя_константы>: <тип_константы> = <значение_константы>
-
-
имя_константы
-
Имя константы представляет собой простое имя. Имена должны быть различными для всех констант и не должны совпадать с зарезервированными словами, именами типов ресурсов и именами параметров, именами ресурсов.
-
тип_константы
-
Тип константы - это один из возможных типов данных языка. При описании типов констант возможны ссылки на типы параметров ресурсов и типы ранее описанных констант.
-
значение_константы
-
Значение символьной константы задается целой или вещественной численной константой либо именем значения в соответствии с типом константы.
-

Примеры

-
$Constant
+        
+
описание_константы
+
Описание константы имеет формат:
+
<имя_константы>: <тип_константы> = <значение_константы>
+
+
имя_константы
+
Имя константы представляет собой простое имя. Имена должны быть различными для всех констант и не должны совпадать с зарезервированными словами, именами типов ресурсов и именами параметров, именами ресурсов.
+
тип_константы
+
Тип константы - это один из возможных типов данных языка. При описании типов констант возможны ссылки на типы параметров ресурсов и типы ранее описанных констант.
+
значение_константы
+
Значение символьной константы задается целой или вещественной численной константой либо именем значения в соответствии с типом константы.
+

Примеры

+
$Constant
     Константа_1: integer = 10
     Константа_2: real = 3.14159
     Константа_3: integer [0..1000] = 0
@@ -38,18 +38,18 @@ 

Примеры

Константа_8: such_as Тип_1.Параметр_5 = Занят Константа_9: (Значение_1, Значение_2, Значение_3, Значение_4, Значение_5) = Значение_1 $End
-

Примечание

-

Значение символьной константы может быть изменено перед началом прогона в объекте прогона. Если при описании константы указан диапазон возможных значений, то проверяется нахождение нового значения в диапазоне допустимых.

-
-
-

За описаниями констант следуют описания функций и (или) описания последовательностей.

-
-

См. также

-

Типы данных. Соответствие типов

-

Описание символьных констант, функций и последовательностей

-

Синтаксис функции

-

Синтаксис последовательности

-
-
+

Примечание

+

Значение символьной константы может быть изменено перед началом прогона в объекте прогона. Если при описании константы указан диапазон возможных значений, то проверяется нахождение нового значения в диапазоне допустимых.

+ + +

За описаниями констант следуют описания функций и (или) описания последовательностей.

+ +

См. также

+

Типы данных. Соответствие типов

+

Описание символьных констант, функций и последовательностей

+

Синтаксис функции

+

Синтаксис последовательности

+
+
diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_const_fun_seq.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_const_fun_seq.htm index 42d19ec4e..058ec5c80 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_const_fun_seq.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_const_fun_seq.htm @@ -8,15 +8,15 @@ -
-

СИМВОЛЬНЫЕ КОНСТАНТЫ, ФУНКЦИИ И ПОСЛЕДОВАТЕЛЬНОСТИ

-

Для увеличения выразительных возможностей и повышения удобства записи в языке могут быть определены символьные константы и функции.

-

Они описываются в отдельном объекте (с расширением .fun), который определяет символьные константы, функции и последовательности. Сначала описывают все константы, затем функции и последовательности в произвольном порядке.

-

См. также

-

Синтаксис констант

-

Синтаксис функции

-

Синтаксис последовательности

-
-
+
+

СИМВОЛЬНЫЕ КОНСТАНТЫ, ФУНКЦИИ И ПОСЛЕДОВАТЕЛЬНОСТИ

+

Для увеличения выразительных возможностей и повышения удобства записи в языке могут быть определены символьные константы и функции.

+

Они описываются в отдельном объекте (с расширением .fun), который определяет символьные константы, функции и последовательности. Сначала описывают все константы, затем функции и последовательности в произвольном порядке.

+

См. также

+

Синтаксис констант

+

Синтаксис функции

+

Синтаксис последовательности

+
+
diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_dpt.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_dpt.htm index b24c01093..2f626261e 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_dpt.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_dpt.htm @@ -9,141 +9,140 @@ -
-

ОПИСАНИЕ ТОЧЕК ПРИНЯТИЯ РЕШЕНИЙ

-

Точки принятия решений описываются в отдельном объекте (с расширением .dpt).

-

Точки принятия решений в РДО являются строительными блоками Базы Знаний моделей. В точках принятия решений происходит инстанцирование активностей из описанных раннее образцов путем задания их параметров.

-

Описание точек принятия решений имеет следующий формат:

-
<описание_точки_принятия_решений> {<описание_точки_принятия_решений>}
-
-
описание_точки_принятия_решений
-
Описание каждой точки принятия решений имеет следующий формат: -
<заголовок_точки_принятия_решений>
+    
+

ОПИСАНИЕ ТОЧЕК ПРИНЯТИЯ РЕШЕНИЙ

+

Точки принятия решений описываются в отдельном объекте (с расширением .dpt).

+

Точки принятия решений в РДО являются строительными блоками Базы Знаний моделей. В точках принятия решений происходит инстанцирование активностей из описанных раннее образцов путем задания их параметров.

+

Описание точек принятия решений имеет следующий формат:

+
<описание_точки_принятия_решений> {<описание_точки_принятия_решений>}
+
+
описание_точки_принятия_решений
+
Описание каждой точки принятия решений имеет следующий формат: +
<заголовок_точки_принятия_решений>
 <блок_активностей>
-
-
заголовок_точки_принятия_решений
-
Заголовок точки принятия решений в общем случае имеет следующий формат: -
$Decision_point <имя_точки>: <тип_точки> [<признак_трассировки>]
+                
+
заголовок_точки_принятия_решений
+
Заголовок точки принятия решений в общем случае имеет следующий формат: +
$Decision_point <имя_точки>: <тип_точки> [<признак_трассировки>]
 [$Parent <имя_родительской_точки>]
 [$Condition <условие_активизации_точки>]
 [$Priority <приоритет_точки>]
 [$Term_condition <терминальное_условие>
   $Evaluate_by <оценка_стоимости_оставшегося_пути_на_графе>
   $Compare_tops = <признак_сравнения_вершин>]
-
-
имя_точки
-
Имя точки принятия решений представляет собой простое имя. Имена должны быть различными для всех точек принятия решений и не должны совпадать с ранее определенными именами.
-
тип_точки
-
В данной версии РДО-языка имеются три типа точек принятия решений: - - - - - - - - - - - - - - - - -
Тип точкиОписание
someПроверять предусловия запуска активностей в порядке их записи в точке принятия решений, выполнить первую найденную активность, предусловия которой удовлетворяются
priorПроверять предусловия запуска активностей в порядке убывания их приоритетов, выполнить первую найденную активность, предусловия которой удовлетворяются
searchРеализовать поиск на графе состояний
-
-
признак_трассировки
-
Точка принятия решений может иметь признак трассировки (подробнее смотри описание <трассировка состояния объектов РДО>). -
имя_родительской_точки
-
-

База знаний в РДО имеет древовидную иерархическую структуру. Это достигается за счет возможности вложения точек принятия решений друг в друга. Таким образом внутри одной точки содержатся не только активности, указанный в ней явно, но и те точки, которые указали ее в качестве родителя. В процессе сканирования активностей дочерние точки принятия решений имеют приоритет перед активностями внутри точек типа some, но не имеют таковой в точках типа prior. В последних все содержимое точки сортируется по приоритету на каждой итерации поиска.

-

Имя родительской точки - это имя той точки принятия решений, внутрь которой встраивается текущая точка. Дочерние точки могут иметь только точки типа some и prior, точки типа search дочерних иметь не могут.

-
-
условие_активизации_точки
-
Условие активизации точки есть логическое выражение. Если при некотором событии состояние системы удовлетворяет этому выражению, активизируется алгоритм обработки точки принятия решений.
-
приоритет_точки
-
Приоритет точки есть арифметическое выражение целого или вещественного типа, ограниченное диапазоном [0;1]. В случае, если данная точка имеет в качестве родительской точку типа prior, то на каждой итерации процесса сканирования активностей будет расчитан приоритет точки, в соответствии с которым она будет отсортирована внутри родительской. Этот механизм позволяет динамически управлять направлением логического вывода внутри иерархической базы знаний модели.
-

Терминальное условие поиска, эвристическая оценочная функция стоимости оставшегося пути до целевой вершины и признак сравнения вершин записывается только для точек типа search.
-
-
-
-
-
блок_активностей
-
Блок активностей имеет следующий формат: -
$Activities
+                        
+
имя_точки
+
Имя точки принятия решений представляет собой простое имя. Имена должны быть различными для всех точек принятия решений и не должны совпадать с ранее определенными именами.
+
тип_точки
+
В данной версии РДО-языка имеются три типа точек принятия решений: + + + + + + + + + + + + + + + + +
Тип точкиОписание
someПроверять предусловия запуска активностей в порядке их записи в точке принятия решений, выполнить первую найденную активность, предусловия которой удовлетворяются
priorПроверять предусловия запуска активностей в порядке убывания их приоритетов, выполнить первую найденную активность, предусловия которой удовлетворяются
searchРеализовать поиск на графе состояний
+
+
признак_трассировки
+
Точка принятия решений может иметь признак трассировки (подробнее смотри описание <трассировка состояния объектов РДО>). +
имя_родительской_точки
+
+

База знаний в РДО имеет древовидную иерархическую структуру. Это достигается за счет возможности вложения точек принятия решений друг в друга. Таким образом внутри одной точки содержатся не только активности, указанный в ней явно, но и те точки, которые указали ее в качестве родителя. В процессе сканирования активностей дочерние точки принятия решений имеют приоритет перед активностями внутри точек типа some, но не имеют таковой в точках типа prior. В последних все содержимое точки сортируется по приоритету на каждой итерации поиска.

+

Имя родительской точки - это имя той точки принятия решений, внутрь которой встраивается текущая точка. Дочерние точки могут иметь только точки типа some и prior, точки типа search дочерних иметь не могут.

+
+
условие_активизации_точки
+
Условие активизации точки есть логическое выражение. Если при некотором событии состояние системы удовлетворяет этому выражению, активизируется алгоритм обработки точки принятия решений.
+
приоритет_точки
+
Приоритет точки есть арифметическое выражение целого или вещественного типа, ограниченное диапазоном [0;1]. В случае, если данная точка имеет в качестве родительской точку типа prior, то на каждой итерации процесса сканирования активностей будет расчитан приоритет точки, в соответствии с которым она будет отсортирована внутри родительской. Этот механизм позволяет динамически управлять направлением логического вывода внутри иерархической базы знаний модели.
+

Терминальное условие поиска, эвристическая оценочная функция стоимости оставшегося пути до целевой вершины и признак сравнения вершин записывается только для точек типа search.
+
+
+
+
+
блок_активностей
+
Блок активностей имеет следующий формат: +
$Activities
     <описание_активности> {<описание_активности>}
 $End
-
-
Активности вместе с событиями определяют содержимое базы знаний программы (модели).
-
описание_активности
-
Описание каждой активности зависит от типа точки и в общем случае - имеет следующий формат: -
<имя_активности>: <имя_образца> [<код_клавиши>]
-[<значения_параметров_образца>]
+                        
+
Активности вместе с событиями определяют содержимое базы знаний программы (модели).
+
описание_активности
+
Описание каждой активности зависит от типа точки и в общем случае + имеет следующий формат: +
<имя_активности>: <имя_образца> [(<код_клавиши>, <значения_параметров_образца>)]
 [<приоритет_активности>]
-[(value before | value after) <стоимость_применения_правила>]
-
-
имя_активности
-
Имя активности - это любое допустимое в языке имя, не совпадающее с ранее определенными именами.
-
имя_образца
-
Имя образца - это имя одного из образцов, заданных в объекте образцов.

При написании блока активностей необходимо иметь ввиду следующее. Для точки принятия решений типа search допустимо использование только образцов типа rule, при выполнении которых ресурсы не создаются и не уничтожаются, то есть статусы конверторов релевантных ресурсов которых не содержат Create или Erase. Использование образцов других типов не допускается.

-
код_клавиши
-
Код клавиши указывают для образцов типа клавиатурная операция (keyboard).
-
значения_параметров_образца
-
Значения параметров образца задают в позиционном соответствии с порядком следования параметров в описании образца. Значения задают целой или вещественной численной константой либо именем значения в соответствии с типом параметра. Для тех параметров, у которых указано значение по умолчанию, вместо начального значения можно указать символ "*". В этом случае параметр примет значение по умолчанию. Если для параметра задан диапазон возможных значений, то проверяется соответствие начального значения этому диапазону.
- -
-
-
-
-
-
-
-

Примеры

-
+
+
имя_активности
+
Имя активности - это любое допустимое в языке имя, не совпадающее с ранее определенными именами.
+
имя_образца
+
Имя образца - это имя одного из образцов, заданных в объекте образцов.

При написании блока активностей необходимо иметь ввиду следующее. Для точки принятия решений типа search допустимо использование только образцов типа rule, при выполнении которых ресурсы не создаются и не уничтожаются, то есть статусы конверторов релевантных ресурсов которых не содержат Create или Erase. Использование образцов других типов не допускается.

+
код_клавиши
+
Код клавиши указывают для образцов типа клавиатурная операция (keyboard).
+
значения_параметров_образца
+
Значения параметров образца задают в позиционном соответствии с порядком следования параметров в описании образца, отделяя друг от друга запятыми. Значения задают целой или вещественной численной константой либо именем значения в соответствии с типом параметра. Для тех параметров, у которых указано значение по умолчанию, вместо начального значения можно указать символ "*". В этом случае параметр примет значение по умолчанию. Если для параметра задан диапазон возможных значений, то проверяется соответствие начального значения этому диапазону.
+
+
+
+
+
+ + +

Примеры

+ -

См. также

-

Описание ресурсов

-

Описание образцов

-

Трассировка состояния объектов РДО

-
-
+ +

См. также

+

Описание ресурсов

+

Описание образцов

+

Трассировка состояния объектов РДО

+ +
- \ No newline at end of file + diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_frm.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_frm.htm index a1ea7cda4..1822dd68f 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_frm.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_frm.htm @@ -9,59 +9,59 @@ -
-

КАДРЫ АНИМАЦИИ

-

Описание кадров производится в отдельном объекте, который является исходным для системы отображения. Этот объект имеет расширение .frm. Кадр представляет собой прямоугольную область экрана, в которой производится отображение. Он состоит из фоновой картинки и переменных элементов (элементов отображения или спрайтов), состав, форма, размеры и расположение которых определяются состоянием системы и, следовательно, могут изменяться во время просмотра кадра.

-

Описание кадра имеет следующий формат:

-
$Frame <имя_кадра>
+    
+

КАДРЫ АНИМАЦИИ

+

Описание кадров производится в отдельном объекте, который является исходным для системы отображения. Этот объект имеет расширение .frm. Кадр представляет собой прямоугольную область экрана, в которой производится отображение. Он состоит из фоновой картинки и переменных элементов (элементов отображения или спрайтов), состав, форма, размеры и расположение которых определяются состоянием системы и, следовательно, могут изменяться во время просмотра кадра.

+

Описание кадра имеет следующий формат:

+
$Frame <имя_кадра>
 $Back_picture = <описание_фоновой_картинки>
     [<описание_элементов_отображения>]
 $End
-
-
имя_кадра
-
Имя кадра представляет собой простое имя. Имена должны быть различными для всех кадров и не должны совпадать с ранее определенными именами.
-
описание_фоновой_картинки
-
Описание фоновой картинки имеет следующий формат: -
[<цвет_фона>] (<размеры_кадра> | <имя_файла_фона>)
-
-
цвет_фона
-
Цвет фона задает цвет части кадра, которая находится за пределами фоновой картинки. Цвет задается тремя численными константами целого типа, разделенными пробелами и заключенными в угловые скобки. Каждое число должно находиться в диапазоне 0..255, оно задает интенсивность одной из трех цветовых составляющих: первое - красной, второе - зеленой и третье - синей. -
-
-

Примеры

-
<0   0   0>   - черный
+        
+
имя_кадра
+
Имя кадра представляет собой простое имя. Имена должны быть различными для всех кадров и не должны совпадать с ранее определенными именами.
+
описание_фоновой_картинки
+
Описание фоновой картинки имеет следующий формат: +
[<цвет_фона>] (<размеры_кадра> | <имя_файла_фона>)
+
+
цвет_фона
+
Цвет фона задает цвет части кадра, которая находится за пределами фоновой картинки. Цвет задается тремя численными константами целого типа, разделенными пробелами и заключенными в угловые скобки. Каждое число должно находиться в диапазоне 0..255, оно задает интенсивность одной из трех цветовых составляющих: первое - красной, второе - зеленой и третье - синей. +
+
+

Примеры

+
<0   0   0>   - черный
 <255 0   0>   - красный
 <0   255 0>   - зеленый
 <0   0   255> - синий
 <255 255 0>   - желтый
 <255 255 255> - белый
 <127 127 127> - серый
-
-
-

Цвет фона является необязательным параметром. Если он не задан, используется значение по умолчанию, равное <0 100 0> (это значение соответствует темно-зеленому цвету).

-
-
размеры_кадра, имя_файла_фона
-
Для описания фоновой картинки задают либо имя файла, содержащего фоновое изображение, либо размер фоновой картинки. Файл фоновой картинки должен быть растровым изображением, сохраненным в формате независимой от устройства битовой карты (BMP - формате) и иметь расширение .bmp. -

Если вместо имени файла указаны размеры фоновой картинки, РДО-имитатор сам создает фоновую картинку, которая представляет собой прямоугольник указанного размера с цветом фона и границей черного цвета толщиной в один пиксел. Размеры задают двумя численными константами целого типа. Первое число задает ширину фоновой картинки и должно быть в диапазоне 1..800, второе число задает высоту и должно находиться в диапазоне 1..600.

-
-
-
-
описание_элементов_отображения
-
Список элементов можно посмотреть по ссылке. -

Кадр анимации может быть пустым. При описании кадра может быть использован процедурный язык. Это дает возможность отображать часть элементов по заданному условию или сокращать объём кода модели за счет циклов.

-
-

Пример

-
+
+

Цвет фона является необязательным параметром. Если он не задан, используется значение по умолчанию, равное <0 100 0> (это значение соответствует темно-зеленому цвету).

+
+
размеры_кадра, имя_файла_фона
+
Для описания фоновой картинки задают либо имя файла, содержащего фоновое изображение, либо размер фоновой картинки. Файл фоновой картинки должен быть растровым изображением, сохраненным в формате независимой от устройства битовой карты (BMP - формате) и иметь расширение .bmp. +

Если вместо имени файла указаны размеры фоновой картинки, РДО-имитатор сам создает фоновую картинку, которая представляет собой прямоугольник указанного размера с цветом фона и границей черного цвета толщиной в один пиксел. Размеры задают двумя численными константами целого типа. Первое число задает ширину фоновой картинки и должно быть в диапазоне 1..800, второе число задает высоту и должно находиться в диапазоне 1..600.

+
+
+
+
описание_элементов_отображения
+
Список элементов можно посмотреть по ссылке. +

Кадр анимации может быть пустым. При описании кадра может быть использован процедурный язык. Это дает возможность отображать часть элементов по заданному условию или сокращать объём кода модели за счет циклов.

+
+

Пример

+ -

См. также

-

Описание образцов

-
-
+
+

См. также

+

Описание образцов

+ +
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_frm_elem.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_frm_elem.htm index c2ade9ca3..f7da26684 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_frm_elem.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_frm_elem.htm @@ -8,184 +8,184 @@ -
-

ЭЛЕМЕНТЫ ОТОБРАЖЕНИЯ

-
-
элемент_отображения
-
Элемент отображения (спрайт) имеет следующий формат: -
<тип_элемента> [<свойства_элемента>]
-
-
тип_элемента
-
Тип элемента задают одним из следующих зарезервированных слов: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Тип элементаОписание
textТекст
bitmapКартинка
s_bmpМасштабируемая картинка
rectПрямоугольник
r_rectПрямоугольник со скругленными углами
lineЛиния
circleОкружность
ellipseЭллипс
triangТреугольник
spriteСпрайт
-
-
свойства_элемента
-
Порядок записи, количество и смысл свойств элемента зависят от типа элемента. Свойства элементов записываются в прямых скобках и разделяются запятыми. -

Первые два свойства элементов всех типов - их координаты. Координаты элемента есть координаты в пикселах левого верхнего угла прямоугольника, являющегося границей элемента. Их задают арифметическими выражениями, они являются относительными, то есть отсчитываются от левого верхнего угла кадра вправо и вниз. Если результат вычисления арифметического выражения имеет вещественный тип, то координата вычисляется по правилам округления.

-

Свойствами многих элементов являются также размеры (ширина и высота в пикселах) и цвета. Размеры элемента задают арифметическими выражениями, вещественные значения округляются до целого числа пикселов. Цвет задается тремя численными константами целого типа, разделенными пробелами и заключенными в угловые скобки. Каждое число должно находиться в диапазоне 0..255, оно задает интенсивность одной из трех цветовых составляющих: первое - красной, второе - зеленой и третье - красной. Задавая разные значения цветовых составляющих, можно получить до более чем шестнадцати миллионов цветов. Реальное максимально возможное количество цветов определяется видеоадаптером и режимом его работы. Если видеоадаптер не может изобразить заданный цвет, то система Windows заменяет заданный цвет ближайшим из числа возможных. Фон текстовых элементов и внутренние части фигур могут быть также прозрачными. Для этого необходимо вместо цвета фона записать зарезервированное слово transparent.

-

При изменении состояния модели значения выражений, определяющих координаты и размеры элемента, могут изменяться, то есть элемент может перемещаться по экрану и меняться в размерах. Если при этом элемент выходит за границы кадра, то он автоматически усекается. Прорисовка элементов происходит в том порядке, как они описаны в объекте кадров, то есть при наложении элементов тот из них, который описан в объекте раньше, будет скрыт (полностью или частично) под элементом, описанным позже.

-
-
-

Ниже рассматриваются элементы различных типов.

+
+

ЭЛЕМЕНТЫ ОТОБРАЖЕНИЯ

+
+
элемент_отображения
+
Элемент отображения (спрайт) имеет следующий формат: +
<тип_элемента> [<свойства_элемента>]
+
+
тип_элемента
+
Тип элемента задают одним из следующих зарезервированных слов: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Тип элементаОписание
textТекст
bitmapКартинка
s_bmpМасштабируемая картинка
rectПрямоугольник
r_rectПрямоугольник со скругленными углами
lineЛиния
circleОкружность
ellipseЭллипс
triangТреугольник
spriteСпрайт
+
+
свойства_элемента
+
Порядок записи, количество и смысл свойств элемента зависят от типа элемента. Свойства элементов записываются в прямых скобках и разделяются запятыми. +

Первые два свойства элементов всех типов - их координаты. Координаты элемента есть координаты в пикселах левого верхнего угла прямоугольника, являющегося границей элемента. Их задают арифметическими выражениями, они являются относительными, то есть отсчитываются от левого верхнего угла кадра вправо и вниз. Если результат вычисления арифметического выражения имеет вещественный тип, то координата вычисляется по правилам округления.

+

Свойствами многих элементов являются также размеры (ширина и высота в пикселах) и цвета. Размеры элемента задают арифметическими выражениями, вещественные значения округляются до целого числа пикселов. Цвет задается тремя численными константами целого типа, разделенными пробелами и заключенными в угловые скобки. Каждое число должно находиться в диапазоне 0..255, оно задает интенсивность одной из трех цветовых составляющих: первое - красной, второе - зеленой и третье - красной. Задавая разные значения цветовых составляющих, можно получить до более чем шестнадцати миллионов цветов. Реальное максимально возможное количество цветов определяется видеоадаптером и режимом его работы. Если видеоадаптер не может изобразить заданный цвет, то система Windows заменяет заданный цвет ближайшим из числа возможных. Фон текстовых элементов и внутренние части фигур могут быть также прозрачными. Для этого необходимо вместо цвета фона записать зарезервированное слово transparent.

+

При изменении состояния модели значения выражений, определяющих координаты и размеры элемента, могут изменяться, то есть элемент может перемещаться по экрану и меняться в размерах. Если при этом элемент выходит за границы кадра, то он автоматически усекается. Прорисовка элементов происходит в том порядке, как они описаны в объекте кадров, то есть при наложении элементов тот из них, который описан в объекте раньше, будет скрыт (полностью или частично) под элементом, описанным позже.

+
+
+

Ниже рассматриваются элементы различных типов.

-

Текст

-
text(<X>, <Y>, <ширина>, <высота>, <цвет_фона>, <цвет>, [<способ_размещения>] <содержимое>);
-
-
способ_размещения
-
Способ размещения задает размещение выводимой строки (содержимого) в поле элемента. Он может быть опущен, в этом случае строка сдвигается к левому краю. Способ размещения задают одним из следующих символов: - - - - - - - - - - - - - - - - - -
Способ размещенияОписание
<Сдвинуть к левому краю
=Выровнять по центру
>Сдвинуть к правому краю
-

В том случае, если длина выводимой строки больше ширины элемента, строка усекается.

-
-
содержимое
-
Содержимое элемента описывают одним из следующих способов: -
    -
  • арифметическим выражением (выводимая строка представляет собой результат вычисления выражения; это целое либо вещественное число или имя значения перечислимого типа);
  • -
  • строковой константой (выводимой строке присваивается значение строковой константы).
  • -
-
-
+

Текст

+
text(<X>, <Y>, <ширина>, <высота>, <цвет_фона>, <цвет>, [<способ_размещения>] <содержимое>);
+
+
способ_размещения
+
Способ размещения задает размещение выводимой строки (содержимого) в поле элемента. Он может быть опущен, в этом случае строка сдвигается к левому краю. Способ размещения задают одним из следующих символов: + + + + + + + + + + + + + + + + + +
Способ размещенияОписание
<Сдвинуть к левому краю
=Выровнять по центру
>Сдвинуть к правому краю
+

В том случае, если длина выводимой строки больше ширины элемента, строка усекается.

+
+
содержимое
+
Содержимое элемента описывают одним из следующих способов: +
    +
  • арифметическим выражением (выводимая строка представляет собой результат вычисления выражения; это целое либо вещественное число или имя значения перечислимого типа);
  • +
  • строковой константой (выводимой строке присваивается значение строковой константы).
  • +
+
+
-

Картинка

-
bitmap(<X>, <Y>, <имя_файла> [, <имя_файла_маски>]);
-
-
имя_файла, имя_файла_маски
-
Для создания элемента необходимы два файла: файл изображения и файл маски. Оба этих файла должны иметь BMP-формат. Имена этих файлов без типа указывают в описании свойств элемента. Расширение файлов должно быть .bmp. -

Объект изображения содержит рисунок элемента (спрайта), изображенный на черном фоне, маска содержит силуэт спрайта, она черная на белом фоне. Такое сочетание изображения и маски приводит к тому, что в тех областях, где маска черная, будет изображаться рисунок спрайта, а там, где маска белая, будет виден фон, на котором изображается элемент. Файл маски может отсутствовать, в этом случае прямоугольный рисунок спрайта из файла будет изображаться поверх фона (то есть если маска не указана, используется полностью черная маска).

-
-
+

Картинка

+
bitmap(<X>, <Y>, <имя_файла> [, <имя_файла_маски>]);
+
+
имя_файла, имя_файла_маски
+
Для создания элемента необходимы два файла: файл изображения и файл маски. Оба этих файла должны иметь BMP-формат. Имена этих файлов без типа указывают в описании свойств элемента. Расширение файлов должно быть .bmp. +

Объект изображения содержит рисунок элемента (спрайта), изображенный на черном фоне, маска содержит силуэт спрайта, она черная на белом фоне. Такое сочетание изображения и маски приводит к тому, что в тех областях, где маска черная, будет изображаться рисунок спрайта, а там, где маска белая, будет виден фон, на котором изображается элемент. Файл маски может отсутствовать, в этом случае прямоугольный рисунок спрайта из файла будет изображаться поверх фона (то есть если маска не указана, используется полностью черная маска).

+
+
-

Масштабируемая картинка

-
s_bmp(<X>, <Y>, <ширина>, <высота>, <имя_файла> [, <имя_файла_маски>]);
-

Элементы аналогичны картинке.

-
-
ширина, высота
-
Ширина и высота представляют собой арифметические выражения для вычисления размеров элемента. -

Исходная картинка, находящийся в файлах изображения и маски, растягивается или сжимается независимо по двум осям так, чтобы его размеры стали равны размерам элемента.

-
-
+

Масштабируемая картинка

+
s_bmp(<X>, <Y>, <ширина>, <высота>, <имя_файла> [, <имя_файла_маски>]);
+

Элементы аналогичны картинке.

+
+
ширина, высота
+
Ширина и высота представляют собой арифметические выражения для вычисления размеров элемента. +

Исходная картинка, находящийся в файлах изображения и маски, растягивается или сжимается независимо по двум осям так, чтобы его размеры стали равны размерам элемента.

+
+
-

Прямоугольник

-
rect(<X>, <Y>, <ширина>, <высота>, <цвет_фона>, <цвет>);
-

Этот элемент изображает в заданных координатах прямоугольник заданного размера с указанным цветом границы и заполнения. Стороны прямоугольника параллельны координатным осям. Граница изображается линией толщиной в один пиксел.

+

Прямоугольник

+
rect(<X>, <Y>, <ширина>, <высота>, <цвет_фона>, <цвет>);
+

Этот элемент изображает в заданных координатах прямоугольник заданного размера с указанным цветом границы и заполнения. Стороны прямоугольника параллельны координатным осям. Граница изображается линией толщиной в один пиксел.

-

Прямоугольник со скругленными углами

-
r_rect(<X>, <Y>, <ширина>, <высота>, <цвет_фона>, <цвет>);
-

Этот элемент описывается так же как и прямоугольник. Различие в изображении состоит в скруглении углов прямоугольника, которое производится дугой окружности.

+

Прямоугольник со скругленными углами

+
r_rect(<X>, <Y>, <ширина>, <высота>, <цвет_фона>, <цвет>);
+

Этот элемент описывается так же как и прямоугольник. Различие в изображении состоит в скруглении углов прямоугольника, которое производится дугой окружности.

-

Линия

-
line(<X1>, <Y1>, <X2>, <Y2>, <цвет>);
-

Этот элемент изображает отрезок прямой заданного цвета между двумя точками с указанными координатами. Толщина линии равна одному пикселу.

+

Линия

+
line(<X1>, <Y1>, <X2>, <Y2>, <цвет>);
+

Этот элемент изображает отрезок прямой заданного цвета между двумя точками с указанными координатами. Толщина линии равна одному пикселу.

-

Окружность

-
circle(<X>, <Y>, <радиус>, <цвет_фона>, <цвет>);
-

Этот элемент изображает в заданных координатах окружность с заданным радиусом с указанным цветом границы и заполнения.

-
-
X, Y
-
Координаты задают положение центра окружности
-
радиус
-
Радиус определяет радиус окружности
-
-

Граница изображается линией толщиной в один пиксел.

+

Окружность

+
circle(<X>, <Y>, <радиус>, <цвет_фона>, <цвет>);
+

Этот элемент изображает в заданных координатах окружность с заданным радиусом с указанным цветом границы и заполнения.

+
+
X, Y
+
Координаты задают положение центра окружности
+
радиус
+
Радиус определяет радиус окружности
+
+

Граница изображается линией толщиной в один пиксел.

-

Эллипс

-
ellipse(<X>, <Y>, <ширина>, <высота>, <цвет_фона>, <цвет>);
-

Этот элемент изображает в заданных координатах эллипс с заданными длинами осей с указанным цветом границы и заполнения. Оси эллипса параллельны координатным осям.

-
-
X, Y
-
Координаты задают положение левого верхнего угла описанного прямоугольника со сторонами, параллельными координатным осям.
-
ширина, высота
-
Ширина определяет длину оси эллипса, параллельной оси X, высота - длину оси эллипса, параллельной оси Y.
-
-

Граница изображается линией толщиной в один пиксел.

+

Эллипс

+
ellipse(<X>, <Y>, <ширина>, <высота>, <цвет_фона>, <цвет>);
+

Этот элемент изображает в заданных координатах эллипс с заданными длинами осей с указанным цветом границы и заполнения. Оси эллипса параллельны координатным осям.

+
+
X, Y
+
Координаты задают положение левого верхнего угла описанного прямоугольника со сторонами, параллельными координатным осям.
+
ширина, высота
+
Ширина определяет длину оси эллипса, параллельной оси X, высота - длину оси эллипса, параллельной оси Y.
+
+

Граница изображается линией толщиной в один пиксел.

-

Треугольник

-
triang(<X1>, <Y1>, <X2>, <Y2>, <X3>, <Y3>, <цвет_фона>, <цвет>);
-

Треугольник задается координатами трех его вершин. Как и у прямоугольников и эллипсов, внутренняя область треугольника может быть прозрачной либо иметь какой-либо цвет. Граница треугольника изображается линией указанного цвета толщиной в один пиксел.

+

Треугольник

+
triang(<X1>, <Y1>, <X2>, <Y2>, <X3>, <Y3>, <цвет_фона>, <цвет>);
+

Треугольник задается координатами трех его вершин. Как и у прямоугольников и эллипсов, внутренняя область треугольника может быть прозрачной либо иметь какой-либо цвет. Граница треугольника изображается линией указанного цвета толщиной в один пиксел.

-

Cпрайт

-
sprite <имя_спрайта>();
-
-
имя_спрайта
-
Имя спрайта представляет собой простое имя. Имена должны быть различными для всех спрайта и не должны совпадать с ранее определенными именами.
-
-

Вызываемый спрайт должен быть объявлен. Спрайт можно вызывать множество раз, такое использование позволяет сокращать объем модели за счет повторного использования кода модели, написаного при объявлении спрайта. Вызов может быть произведен в любом месте описания кадра, где могут быть записаны видимые элементы отображения.

-
-
-

Активная область

-
active <имя_клавиатурной_операции> (<X>, <Y>, <ширина>, <высота>);
-
-
имя_клавиатурной_операции
-
Имя клавиатурной операции, которая будет инициирована при нажатии кнопки мыши.
-
-

Активная область представляет собой прямоугольник с координатами левого верхнего угла <X> и <Y> и размерами <ширина> и <высота>. При нажатии на облать вызывается указанная клавиатурная операция. Координаты и размеры области задают арифметическими выражениями, следовательно область может изменяться в размерах и перемещаться при изменении значений этих выражений.

-

Активная область может быть задана везде, где могут быть записаны видимые элементы отображения.

-
-
-

См. также

-

Описание образцов

-
-
+

Cпрайт

+
sprite <имя_спрайта>();
+
+
имя_спрайта
+
Имя спрайта представляет собой простое имя. Имена должны быть различными для всех спрайта и не должны совпадать с ранее определенными именами.
+
+

Вызываемый спрайт должен быть объявлен. Спрайт можно вызывать множество раз, такое использование позволяет сокращать объем модели за счет повторного использования кода модели, написаного при объявлении спрайта. Вызов может быть произведен в любом месте описания кадра, где могут быть записаны видимые элементы отображения.

+ + +

Активная область

+
active <имя_клавиатурной_операции> (<X>, <Y>, <ширина>, <высота>);
+
+
имя_клавиатурной_операции
+
Имя клавиатурной операции, которая будет инициирована при нажатии кнопки мыши.
+
+

Активная область представляет собой прямоугольник с координатами левого верхнего угла <X> и <Y> и размерами <ширина> и <высота>. При нажатии на облать вызывается указанная клавиатурная операция. Координаты и размеры области задают арифметическими выражениями, следовательно область может изменяться в размерах и перемещаться при изменении значений этих выражений.

+

Активная область может быть задана везде, где могут быть записаны видимые элементы отображения.

+ + +

См. также

+

Описание образцов

+ +
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_frm_sprite.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_frm_sprite.htm index ea1dec018..6e11e3b31 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_frm_sprite.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_frm_sprite.htm @@ -9,35 +9,35 @@ -
-

СПРАЙТ

-

Описание спрайтов производится в объекте исходных данных с расширением .frm (кадры анимации), который является исходным для системы отображения. Спрайт представляет собой группу переменных элементов отображения, состав, форма, размеры и расположение которых определяются состоянием системы и, следовательно, могут изменяться во время просмотра кадра.

-

Описание спрайта имеет следующий формат:

-
$Sprite <имя_спрайта>(<параметры>)
+    
+

СПРАЙТ

+

Описание спрайтов производится в объекте исходных данных с расширением .frm (кадры анимации), который является исходным для системы отображения. Спрайт представляет собой группу переменных элементов отображения, состав, форма, размеры и расположение которых определяются состоянием системы и, следовательно, могут изменяться во время просмотра кадра.

+

Описание спрайта имеет следующий формат:

+
$Sprite <имя_спрайта>(<параметры>)
     [<описание_элементов_отображения>]
 $End
-
-
имя_спрайта
-
Имя спрайта представляет собой простое имя. Имена должны быть различными для всех спрайтов и не должны совпадать с ранее определенными именами.
-
описание_элементов_отображения
-
Список элементов можно посмотреть по ссылке. -

Спрайт может быть пустым. При описании спрайта может быть использован процедурный язык. Это дает возможность отображать часть элементов по заданному условию или сокращать объём кода модели за счет циклов.

-
-
-

Описаный спрайт используется в качестве элемента отображения при описании кадра

-

Использование спрайтов позволяет сокращать объем кода модели за счет повторного использования текста, написанного в теле спрайта. Спрайты целесообразно применять для отрисовки повторяющейся сложной анимации на разных кадрах ИЛИ в рамках одного кадра, используя при описании спрайта последовательности перечислимых значений, причем количество её элементов должно совпадать с количеством использований конкретного спрайта.

-

Пример 1

- -
+
+

См. также

+

Описание образцов

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_fun.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_fun.htm index 0a9638384..7be9338a1 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_fun.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_fun.htm @@ -9,85 +9,85 @@ -
-

ФУНКЦИИ

-

Описание функции следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и имеет следующий формат:

-
$Function <имя_функции>: <тип_значения_функции>
+    
+

ФУНКЦИИ

+

Описание функции следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и имеет следующий формат:

+
$Function <имя_функции>: <тип_значения_функции>
 $Type = <тип_функции>
 $Parameters
     <описание_параметра_функции> {<описание_параметра_функции>}
 $Body
     <тело_функции>
 $End
-
-
имя_функции
-
Имя функции представляет собой простое имя. Имена должны быть различными для всех функций и не должны совпадать с ранее определенными именами.
-
тип_значения_функции
-
Тип значения функции - это один из возможных в языке типов данных и описанных ранее типов ресурсов. При описании типов значений функции возможны ссылки на типы параметров ресурсов и типы символьных констант. Значения по умолчанию также могут быть указаны при описании типа значения функции, однако они не используются, за исключением функций типа список.
-
тип_функции
-
В данной версии языка определены функции следующих типов: - - - - - - - - - - - - - - - - - -
Тип функцииОписание
algorithmicФункция алгоритмического типа
tableФункция типа таблица
listФункция типа список
-

Функция типа список представляет собой список значений параметров и соответствующих им значений функции, функция типа таблица - таблицу значений функции, алгоритмическая функция - перечень условий и формул, по которым вычисляется значение функции.

-
-
описание_параметра_функции
-
Описание параметра функции имеет следующий формат:
-
<имя_параметра_функции>: <тип_параметра>
-
-
имя_параметра_функции
-
Имя параметра функции представляет собой простое имя. Имена должны быть различными для всех параметров и не должны совпадать с ранее определенными именами.
-
тип_параметра
-
Тип параметра функции - это один из возможных в языке типов данных и описанных ранее типов ресурсов. При описании типов параметров функции возможны ссылки на типы параметров ресурсов и типы символьных констант. Значения по умолчанию не задают.
-
-
-


Обращение к функции имеет следующий формат:

-
-
<имя_функции>(<выражение> {, <выражение>})
-
выражение
-
После имени функции в скобках через запятую записывают арифметические выражения для вычисления значений параметров. Порядок следования выражений определяется порядком следования параметров в описании функции. Тип арифметического выражения должен соответствовать типу параметра. Для вещественных параметров допустимо выражение целого типа.
-
-
-
тело_функции
-
Синтаксис тела функции зависит от типа функции -

Алгоритмическая функция

-

Тело алгоритмической функции имеет следующий формат:

-
<процедура>; {<процедура>;}
-
-
процедура
-
Тело функции представляет собой последовательность процедур. Значение функции должно быть возвращено оператором return.
-
-

Значение алгоритмической функции вычисляется следующим образом. Просматриваются и исполняются в порядке описания в теле функции процедуры. Значение функции опеределяется первой выполненной процедурой, содержащей оператор return, и равно значению выражения после этого оператора.

-

В арифметических выражениях для вычисления значений функции могут вызываться другие функции, в том числе может рекурсивно вызываться эта же функция, операндами этих выражений могут также являться символьные константы и последовательности.

-
-
-

Примеры

- +
+

Список

+

Для функции типа список описание тела имеет следующий формат:

+
<значения_параметров> = <значение_функции>
 {<значения_параметров> = <значение_функции>}
-
-
значения_параметров
-
Значения параметров функции разделяют по крайней мере одним разделителем. Порядок следования значений параметров определяется порядком следования описаний параметров функции. Значение параметра задают целой или вещественной численной константой либо именем значения в соответствии с типом параметра.
-
значение_функции
-
Значение функции задают целой или вещественной численной константой либо именем значения в соответствии с типом значения функции.
-
-

Пользователь описывает все возможные значения функции и соответствующие им комбинации значений параметров. При вычислении функции определяются значения параметров, ищется соответствующая комбинация из описанных в теле функции, и функция принимает значение, указанное для данных значений параметров. Если тело функции не содержит комбинацию значений параметров, вычисленных при данном вызове функции, то функция принимает значение, указанное как значение по умолчанию при описании типа значений функции. По этой причине указание значения по умолчанию при описании типа значения функции-списка является обязательным.

-

Если в описании типа значения функции указан диапазон допустимых значений, то при чтении тела функции ее значения будут проверяться на попадание в диапазон допустимых.

-
-
-

Пример

-
-
-

См. также

-

Типы данных. Соответствие типов

-

Описание символьных констант, функций и последовательностей

-

Синтаксис констант

-

Синтаксис последовательности

-
-
+
+ + + +

См. также

+

Типы данных. Соответствие типов

+

Описание символьных констант, функций и последовательностей

+

Синтаксис констант

+

Синтаксис последовательности

+ +
diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_intro.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_intro.htm index ab21d2e96..a5a1751dc 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_intro.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_intro.htm @@ -8,13 +8,13 @@ -
-

ОБЪЕКТЫ ЯЗЫКА

-

ИМ на языке РДО состоит из объектов.

-

Имеется минимальный состав объектов, обязательных для любой модели, остальные могут добавляться к нему пользователем или создаваться имитатором.

-

В минимальный состав ИМ, созданной в РДО, входят следующие объекты: типы ресурсов, образцы, ресурсы, точки принятия решений (или события), прогон.

-

Помимо этих обязательных объектов могут быть созданы и использоваться следующие исходные объекты модели: константы, функции и последовательности, кадры анимации, описание требуемых показателей (статистик).

-
-
+
+

ОБЪЕКТЫ ЯЗЫКА

+

ИМ на языке РДО состоит из объектов.

+

Имеется минимальный состав объектов, обязательных для любой модели, остальные могут добавляться к нему пользователем или создаваться имитатором.

+

В минимальный состав ИМ, созданной в РДО, входят следующие объекты: типы ресурсов, образцы, ресурсы, точки принятия решений (или события), прогон.

+

Помимо этих обязательных объектов могут быть созданы и использоваться следующие исходные объекты модели: константы, функции и последовательности, кадры анимации, описание требуемых показателей (статистик).

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_pat.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_pat.htm index 3fd74cf3d..6992e675f 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_pat.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_pat.htm @@ -9,19 +9,19 @@ -
-

ОПИСАНИЕ ОБРАЗЦОВ

-

Образцы представляют собой шаблоны, по которым в модели заводятся активности точкек принятия решений. Подобно тому, как типы ресурсов определяют структуру базы данных программы, образцы определяют структуру её базы знаний. Они представляют собой знания о функционировании моделируемой системы (знания о предметной области), записанные в виде модифицированных продукционных правил в соответствии с синтаксисом языка. Описание всех образцов содержится в объекте образцов (с расширением .pat). На основании одного образца в системе может быть заведено несколько активностей, но самостоятельного значения образцы не имеют. Имитатор в процессе моделирования обрабатывает именно активности, а не образцы, поэтому если какой-либо образец был описан в объекте образцов, но ни разу не упоминался в активностях, то он никогда не будет использован. Описание образца имеет следующий формат:

-
$Pattern <имя_образца>: <тип_образца> [<признак_трассировки>]
+    
+

ОПИСАНИЕ ОБРАЗЦОВ

+

Образцы представляют собой шаблоны, по которым в модели заводятся активности точкек принятия решений. Подобно тому, как типы ресурсов определяют структуру базы данных программы, образцы определяют структуру её базы знаний. Они представляют собой знания о функционировании моделируемой системы (знания о предметной области), записанные в виде модифицированных продукционных правил в соответствии с синтаксисом языка. Описание всех образцов содержится в объекте образцов (с расширением .pat). На основании одного образца в системе может быть заведено несколько активностей, но самостоятельного значения образцы не имеют. Имитатор в процессе моделирования обрабатывает именно активности, а не образцы, поэтому если какой-либо образец был описан в объекте образцов, но ни разу не упоминался в активностях, то он никогда не будет использован. Описание образца имеет следующий формат:

+
$Pattern <имя_образца>: <тип_образца> [<признак_трассировки>]
 [$Parameters
     <описание_параметров_образца>]
 $Relevant_resources
@@ -31,157 +31,157 @@ 

ОПИСАНИЕ ОБРАЗЦОВ

$Body <тело_образца> $End
-
-
имя_образца
-
Имя образца представляет собой простое имя. Имена должны быть различными для всех образцов и не должны совпадать с ранее определенными именами.
-
тип_образца
-
В данной версии языка возможны образцы следующих типов: - - - - - - - - - - - - - - - - - - - - - -
Тип образцаОписание
ruleОбразец, описывающий продукционное правило
operationОбразец, описывающий операцию
keyboardОбразец, описывающий клавиатурную операцию (такая операция может быть выполнена, если пользователь выполнил некоторое действие - нажал определенную клавишу или щелкнул мышью в активной области кадра анимации - и выполняются предусловия)
eventОбразец, описывающий событие
-
-
признак_трассировки
-
После типа образца может быть указан признак трассировки (подробнее смотри описание объекта трассировки). -
-
описание_параметров_образца
-
Описание параметров образца имеет следующий формат: -
<имя_параметра>: <тип_параметра> [= <значение_по_умолчанию>]
+        
+
имя_образца
+
Имя образца представляет собой простое имя. Имена должны быть различными для всех образцов и не должны совпадать с ранее определенными именами.
+
тип_образца
+
В данной версии языка возможны образцы следующих типов: + + + + + + + + + + + + + + + + + + + + + +
Тип образцаОписание
ruleОбразец, описывающий продукционное правило
operationОбразец, описывающий операцию
keyboardОбразец, описывающий клавиатурную операцию (такая операция может быть выполнена, если пользователь выполнил некоторое действие - нажал определенную клавишу или щелкнул мышью в активной области кадра анимации - и выполняются предусловия)
eventОбразец, описывающий событие
+
+
признак_трассировки
+
После типа образца может быть указан признак трассировки (подробнее смотри описание объекта трассировки). +
+
описание_параметров_образца
+
Описание параметров образца имеет следующий формат: +
<имя_параметра>: <тип_параметра> [= <значение_по_умолчанию>]
 {<имя_параметра>: <тип_параметра> [= <значение_по_умолчанию>]}
-
-
имя_параметра
-
Имя параметра образца представляет собой простое имя. Имена должны быть различными для всех параметров и не должны совпадать с ранее определенными именами. Имя параметра может совпадать с именем параметра другого образца.
-
тип_параметра
-
Тип параметра - это один из возможных типов данных. При описании типов параметров образца возможны ссылки на типы параметров ресурсов и типы символьных констант.
-
значение_по_умолчанию
-
Для параметра любого типа может быть задано значение по умолчанию. Это значение указывают после знака равенства целой или вещественной численной константой, либо именем значения для перечислимого параметра. При указании типа ссылкой также возможно задание значения по умолчанию. При этом задаваемое значение может отличаться от значения по умолчанию того параметра, на тип которого производится ссылка.
-
-

Параметры в образце любого типа могут отсутствовать, в этом случае зарезервированное слово $Parameters не указывают.

-
-
описание_релевантных_ресурсов_образца
-
Описание релевантных ресурсов для образцов типа операция и клавиатурная операция имеет следующий формат: -
<имя_релевантного_ресурса>: <описатель> <статус_конвертора_начала> <статус_конвертора_конца>
-

Описание релевантных ресурсов образца для образцов типа событие и продукционное правило имеет следующий формат:

-
<имя_релевантного_ресурса>: <описатель> <статус_конвертора>
-
-
имя_релевантного_ресурса
-
Имя релевантного ресурса образца представляет собой простое имя. Имена должны быть различными для всех релевантных ресурсов и не должны совпадать с ранее определенными именами. Имя релевантного ресурса может совпадать с именем релевантного ресурса другого образца.
-
описатель
-
Описатель ресурса - это либо имя типа ресурса, либо имя ресурса. В первом случае в качестве релевантного может быть использован любой ресурс указанного типа, состояние которого удовлетворяет предусловию. Во втором случае может быть использован только указанный ресурс, если его состояние удовлетворяет предусловию.
-
статус_конвертора
-
Статус конвертора описывает, что происходит с релевантным ресурсом в целом при выполнении предусловия.
-
статус_конвертора_начала
-
Статус конвертора начала описывает, что происходит с релевантным ресурсом в начале операции.
-
статус_конвертора_конца
-
Статус конвертора конца описывает, что происходит с релевантным ресурсом в конце операции.
-
-

В данной версии языка определены следующие статусы конверторов и соответствующие ключевые слова:

- - - - - - - - - - - - - - - - - - - - - - - - - -
Статус конвертораОписание
KeepРелевантный ресурс сохраняется, но его состояние (значения параметров) изменяется
CreateРелевантный ресурс создается
EraseРелевантный ресурс уничтожается
NonExistРелевантный ресурс не существует
NoChangeСостояние релевантного ресурса не изменяется
-

Статусы Create, Erase и NonExist допустимы только для ресурсов временного вида, при этом, в качестве описателя может использоваться только имя типа ресурса. Статусы NoChange, Erase и NonExist недопустимы в образцах типа событие. Статус NonExist недопустим в продукционном правиле. В образцах типа событие статус Keep допустим только в случае, если описатель есть имя ресурса.

-

В образцах операций и клавиатурных операций возможны следующие сочетания статусов начала и конца:

- - - - - - - - - - - - - - - - - - - - - - - - - -
Статус конвертора началаСтатус конвертора конца
KeepKeep
Erase
NoChange
CreateKeep
Erase
NoChange
EraseNonExist
NonExistCreate
NoChangeKeep
Erase
NoChange
-
-
способ_выбора
-
Способ выбора определяет, какие ресурсы будут использованы в качестве релевантных в том случае, если описатель релевантного ресурса есть имя типа и существует более одного ресурса, удовлетворяющего предусловию. В РДО-языке определены следующие способы выбора: - - - - - - - - - - - - - - - - - -
Способ выбораОписание
firstИспользовать первые попавшиеся ресурсы, удовлетворяющие предусловиям
with_max <арифметическое_выражение>Использовать такую комбинацию релевантных ресурсов, для которой значение указанного арифметического выражения максимально
with_min <арифметическое_выражение>Использовать такую комбинацию релевантных ресурсов, для которой значение указанного арифметического выражения минимально
-

По умолчанию принимается значение способа выбора first, поэтому это значение можно не указывать.

-

Арифметическое выражение в способе выбора должно быть целого или вещественного типа, в нем могут использоваться параметры всех релевантных ресурсов образца, так как оно вычисляется после подбора всех релевантных ресурсов комбинации.

-

Указание способа выбора релевантных ресурсов после описания релевантных ресурсов не является обязательным. Если он указан, РДО-имитатор производит анализ предусловий и подбор комбинаций релевантных ресурсов. Если же способ выбора не указан, то он должен быть указан в теле образца отдельно для каждого релевантного ресурса. В последнем случае РДО-имитатор подбирает не комбинации ресурсов, а каждый релевантный ресурс по отдельности и, возможно, с различными способами выбора. В арифметическом выражении для способа выбора в этом случае не могут использоваться параметры релевантных ресурсов, которые следуют в описании релевантных ресурсов образца после данного. Релевантные ресурсы выбираются последовательно без возвращений, то есть выбранный ранее ресурс не может быть изменен, если при подборе следующего окажется, что операция не может быть выполнена из-за неудачного подбора предыдущих ресурсов. Такая операция не может быть выполнена, хотя она могла бы быть выполнена при другой комбинации релевантных ресурсов.

-

Задание способа выбора релевантных ресурсов в этом месте образца позволяет избегать подобных ситуаций, а также подбирать наиболее предпочтительные комбинации ресурсов. Однако поскольку для этого анализируются все возможные по предусловиям комбинации, это требует больших вычислительных затрат, чем при подборе ресурсов по отдельности. Поэтому данный способ рекомендуется использовать только тогда, когда это действительно необходимо.

-
-
выражение_времени
-
Выражение времени представляет собой арифметическое выражение целого или вещественного типа, по которому рассчитывается длительность операции или клавиатурной операции. В образцах типа event и rule выражение времени вместе с зарезервированным словом $Time и знаком равенства не указывают.
-
тело_образца
-
Тело образца описывает суть изменений, которые происходят в системе в момент срабатывания образца.
-
-

Примеры

-
+
описание_релевантных_ресурсов_образца
+
Описание релевантных ресурсов для образцов типа операция и клавиатурная операция имеет следующий формат: +
<имя_релевантного_ресурса>: <описатель> <статус_конвертора_начала> <статус_конвертора_конца>
+

Описание релевантных ресурсов образца для образцов типа событие и продукционное правило имеет следующий формат:

+
<имя_релевантного_ресурса>: <описатель> <статус_конвертора>
+
+
имя_релевантного_ресурса
+
Имя релевантного ресурса образца представляет собой простое имя. Имена должны быть различными для всех релевантных ресурсов и не должны совпадать с ранее определенными именами. Имя релевантного ресурса может совпадать с именем релевантного ресурса другого образца.
+
описатель
+
Описатель ресурса - это либо имя типа ресурса, либо имя ресурса. В первом случае в качестве релевантного может быть использован любой ресурс указанного типа, состояние которого удовлетворяет предусловию. Во втором случае может быть использован только указанный ресурс, если его состояние удовлетворяет предусловию.
+
статус_конвертора
+
Статус конвертора описывает, что происходит с релевантным ресурсом в целом при выполнении предусловия.
+
статус_конвертора_начала
+
Статус конвертора начала описывает, что происходит с релевантным ресурсом в начале операции.
+
статус_конвертора_конца
+
Статус конвертора конца описывает, что происходит с релевантным ресурсом в конце операции.
+
+

В данной версии языка определены следующие статусы конверторов и соответствующие ключевые слова:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Статус конвертораОписание
KeepРелевантный ресурс сохраняется, но его состояние (значения параметров) изменяется
CreateРелевантный ресурс создается
EraseРелевантный ресурс уничтожается
NonExistРелевантный ресурс не существует
NoChangeСостояние релевантного ресурса не изменяется
+

Статусы Create, Erase и NonExist допустимы только для ресурсов временного вида, при этом, в качестве описателя может использоваться только имя типа ресурса. Статусы NoChange, Erase и NonExist недопустимы в образцах типа событие. Статус NonExist недопустим в продукционном правиле. В образцах типа событие статус Keep допустим только в случае, если описатель есть имя ресурса.

+

В образцах операций и клавиатурных операций возможны следующие сочетания статусов начала и конца:

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Статус конвертора началаСтатус конвертора конца
KeepKeep
Erase
NoChange
CreateKeep
Erase
NoChange
EraseNonExist
NonExistCreate
NoChangeKeep
Erase
NoChange
+
+
способ_выбора
+
Способ выбора определяет, какие ресурсы будут использованы в качестве релевантных в том случае, если описатель релевантного ресурса есть имя типа и существует более одного ресурса, удовлетворяющего предусловию. В РДО-языке определены следующие способы выбора: + + + + + + + + + + + + + + + + + +
Способ выбораОписание
firstИспользовать первые попавшиеся ресурсы, удовлетворяющие предусловиям
with_max <арифметическое_выражение>Использовать такую комбинацию релевантных ресурсов, для которой значение указанного арифметического выражения максимально
with_min <арифметическое_выражение>Использовать такую комбинацию релевантных ресурсов, для которой значение указанного арифметического выражения минимально
+

По умолчанию принимается значение способа выбора first, поэтому это значение можно не указывать.

+

Арифметическое выражение в способе выбора должно быть целого или вещественного типа, в нем могут использоваться параметры всех релевантных ресурсов образца, так как оно вычисляется после подбора всех релевантных ресурсов комбинации.

+

Указание способа выбора релевантных ресурсов после описания релевантных ресурсов не является обязательным. Если он указан, РДО-имитатор производит анализ предусловий и подбор комбинаций релевантных ресурсов. Если же способ выбора не указан, то он должен быть указан в теле образца отдельно для каждого релевантного ресурса. В последнем случае РДО-имитатор подбирает не комбинации ресурсов, а каждый релевантный ресурс по отдельности и, возможно, с различными способами выбора. В арифметическом выражении для способа выбора в этом случае не могут использоваться параметры релевантных ресурсов, которые следуют в описании релевантных ресурсов образца после данного. Релевантные ресурсы выбираются последовательно без возвращений, то есть выбранный ранее ресурс не может быть изменен, если при подборе следующего окажется, что операция не может быть выполнена из-за неудачного подбора предыдущих ресурсов. Такая операция не может быть выполнена, хотя она могла бы быть выполнена при другой комбинации релевантных ресурсов.

+

Задание способа выбора релевантных ресурсов в этом месте образца позволяет избегать подобных ситуаций, а также подбирать наиболее предпочтительные комбинации ресурсов. Однако поскольку для этого анализируются все возможные по предусловиям комбинации, это требует больших вычислительных затрат, чем при подборе ресурсов по отдельности. Поэтому данный способ рекомендуется использовать только тогда, когда это действительно необходимо.

+
+
выражение_времени
+
Выражение времени представляет собой арифметическое выражение целого или вещественного типа, по которому рассчитывается длительность операции или клавиатурной операции. В образцах типа event и rule выражение времени вместе с зарезервированным словом $Time и знаком равенства не указывают.
+
тело_образца
+
Тело образца описывает суть изменений, которые происходят в системе в момент срабатывания образца.
+
+

Примеры

+ -

См. также

-

Типы ресурсов

-

Описание ресурсов

-

Описание символьных констант, функций и последовательностей

-

Описание точек принятия решений

-

Объект трассировки

-
-
+
+

См. также

+

Типы ресурсов

+

Описание ресурсов

+

Описание символьных констант, функций и последовательностей

+

Описание точек принятия решений

+

Объект трассировки

+ +
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_pmd.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_pmd.htm index d14b453b4..a7ad6a0ce 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_pmd.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_pmd.htm @@ -9,132 +9,132 @@ -
-

ОБЪЕКТ ОПИСАНИЯ ПОКАЗАТЕЛЕЙ

-

Показатели, которые требуется собрать в процессе прогона модели, описываются в отдельном объекте (с расширением .pmd) следующего формата:

-
$Results
+    
+

ОБЪЕКТ ОПИСАНИЯ ПОКАЗАТЕЛЕЙ

+

Показатели, которые требуется собрать в процессе прогона модели, описываются в отдельном объекте (с расширением .pmd) следующего формата:

+
$Results
     <описание_показателя> {<описание_показателя>}
 $End
-
-
описание_показателя
-
В свою очередь описание отдельного показателя имеет формат: -
<имя_показателя>: <признак_трассировки> <вид_показателя> <описатель>
-
-
имя_показателя
-
Имя показателя представляет собой простое имя. Имена должны быть различными для всех показателей и не должны совпадать с ранее определенными именами.
-
признак_трассировки
-
Для показателя может быть указан признак трассировки (подробнее смотри описание трассировки). -
-
вид_показателя
-
В РДО-имитаторе собираются показатели следующих видов: - - - - - - - - - - - - - - - - - - - - - - - - - -
Вид показателяОписание
watch_parНаблюдать значение параметра ресурса
watch_stateНаблюдать состояние системы
watch_quantНаблюдать количество временных ресурсов
watch_valueНаблюдать значение параметра временного ресурса в момент уничтожения ресурса
get_valueНаблюдать значение в момент окончания прогона
-
-
описатель
-
Его формат зависит от вида показателя - -

watch_par

-

Наблюдает за изменениями параметра ресурса

-
watch_par <имя_параметра_ресурса>
-
-
$Results
+        
+
описание_показателя
+
В свою очередь описание отдельного показателя имеет формат: +
<имя_показателя>: <признак_трассировки> <вид_показателя> <описатель>
+
+
имя_показателя
+
Имя показателя представляет собой простое имя. Имена должны быть различными для всех показателей и не должны совпадать с ранее определенными именами.
+
признак_трассировки
+
Для показателя может быть указан признак трассировки (подробнее смотри описание трассировки). +
+
вид_показателя
+
В РДО-имитаторе собираются показатели следующих видов: + + + + + + + + + + + + + + + + + + + + + + + + + +
Вид показателяОписание
watch_parНаблюдать значение параметра ресурса
watch_stateНаблюдать состояние системы
watch_quantНаблюдать количество временных ресурсов
watch_valueНаблюдать значение параметра временного ресурса в момент уничтожения ресурса
get_valueНаблюдать значение в момент окончания прогона
+
+
описатель
+
Его формат зависит от вида показателя + +

watch_par

+

Наблюдает за изменениями параметра ресурса

+
watch_par <имя_параметра_ресурса>
+
+
$Results
     Показатель_1: watch_par Ресурс_1.Параметр_1
     Показатель_2: watch_par Ресурс_2.Параметр_2
 $End
-

watch_state

-

Наблюдает за изменениями состояния системы, которое описывается логическим выражением. По окончании выводится статистическая информация о времени, в течение которого это выражение было истинным (система находила в указанном состоянии).

-
watch_state <логическое_выражение>
-
-
$Results
+                        

watch_state

+

Наблюдает за изменениями состояния системы, которое описывается логическим выражением. По окончании выводится статистическая информация о времени, в течение которого это выражение было истинным (система находила в указанном состоянии).

+
watch_state <логическое_выражение>
+
+
$Results
     Показатель_3: trace watch_state Ресурс_2.Параметр_5 = Занят
     Показатель_4:       watch_state Ресурс_2.Параметр_5 = Занят and Ресурс_1.Параметр_1 > 10
 $End
-

watch_quant

-

Наблюдает за изменениями количества временных ресурсов определенного типа, состояние которых удовлетворяет условию. По окончании выводится статистическая информация о количестве ресурсов в течение прогона.

-
watch_quant <имя_типа> [NoCheck | <логическое_выражение>]
-
-
имя_типа
-
Имя типа - это имя одного из типов временных ресурсов, описанных в объекте типов.
-
логическое_выражение
-
Логическое выражение описывает условие, которому должно удовлетворять состояние временного ресурса. -

В логическом выражении для использования значений параметров временных ресурсов указывают конструкцию <имя_типа>.<имя_параметра>, где имя типа должно совпадать с именем, записанным после зарезервированного слова watch_quant. Если необходимо наблюдать количество ресурсов определенного типа независимо от состояния, то вместо логического выражения указывается зарезервированное слово NoCheck.

-
-
-
$Results
+                        

watch_quant

+

Наблюдает за изменениями количества временных ресурсов определенного типа, состояние которых удовлетворяет условию. По окончании выводится статистическая информация о количестве ресурсов в течение прогона.

+
watch_quant <имя_типа> [NoCheck | <логическое_выражение>]
+
+
имя_типа
+
Имя типа - это имя одного из типов временных ресурсов, описанных в объекте типов.
+
логическое_выражение
+
Логическое выражение описывает условие, которому должно удовлетворять состояние временного ресурса. +

В логическом выражении для использования значений параметров временных ресурсов указывают конструкцию <имя_типа>.<имя_параметра>, где имя типа должно совпадать с именем, записанным после зарезервированного слова watch_quant. Если необходимо наблюдать количество ресурсов определенного типа независимо от состояния, то вместо логического выражения указывается зарезервированное слово NoCheck.

+
+
+
$Results
     Показатель_5: trace watch_quant Тип_2 NoCheck
     Показатель_6: trace watch_quant Тип_2 Тип_2.Параметр_3 <= 10.0
 $End
-

watch_value

-

В процессе прогона собирается статистическая информация о значении указанного арифметического выражения в момент уничтожения какого-либо ресурса определенного типа, состояние которого удовлетворяет условию.

-
watch_value <имя_типа> [NoCheck | <логическое_выражение>] <арифметическое_выражение>
-
-
имя_типа
-
Имя типа - это имя одного из типов временных ресурсов, описанных в объекте типов.
-
логическое_выражение
-
Логическое выражение описывает условие, которому должно удовлетворять состояние временного ресурса. -

В логическом выражении для использования значений параметров временных ресурсов указывают конструкцию <имя_типа>.<имя_параметра>, где имя типа должно совпадать с именем, записанным после зарезервированного слова watch_value. Если состояние не имеет значения, то вместо логического выражения указывают зарезервированное слово NoCheck.

-
-
арифметическое_выражение
-
Арифметическое выражение должно быть целого или вещественного типа. -

В арифметическом выражении для использования значений параметров временных ресурсов указывают конструкцию <имя_типа>.<имя_параметра>, где имя типа должно совпадать с именем, записанным после зарезервированного слова watch_value.

-
-
-
$Results
+                        

watch_value

+

В процессе прогона собирается статистическая информация о значении указанного арифметического выражения в момент уничтожения какого-либо ресурса определенного типа, состояние которого удовлетворяет условию.

+
watch_value <имя_типа> [NoCheck | <логическое_выражение>] <арифметическое_выражение>
+
+
имя_типа
+
Имя типа - это имя одного из типов временных ресурсов, описанных в объекте типов.
+
логическое_выражение
+
Логическое выражение описывает условие, которому должно удовлетворять состояние временного ресурса. +

В логическом выражении для использования значений параметров временных ресурсов указывают конструкцию <имя_типа>.<имя_параметра>, где имя типа должно совпадать с именем, записанным после зарезервированного слова watch_value. Если состояние не имеет значения, то вместо логического выражения указывают зарезервированное слово NoCheck.

+
+
арифметическое_выражение
+
Арифметическое выражение должно быть целого или вещественного типа. +

В арифметическом выражении для использования значений параметров временных ресурсов указывают конструкцию <имя_типа>.<имя_параметра>, где имя типа должно совпадать с именем, записанным после зарезервированного слова watch_value.

+
+
+
$Results
     Показатель_7: watch_value Тип_2 NoCheck                 Тип_2.Время_поступления
     Показатель_8: watch_value Тип_2 Тип_2.Параметр_3 < 20.0 Тип_2.Время_поступления
 $End
-

get_value

-

Вычисляет значение арифметического выражения в момент окончания прогона.

-
get_value <арифметическое_выражение>
-
-
$Results
+                        

get_value

+

Вычисляет значение арифметического выражения в момент окончания прогона.

+
get_value <арифметическое_выражение>
+
+
$Results
     Показатель_9 : get_value Ресурс_1.Параметр_1 * Time_now
     Показатель_10: get_value Time_now
 $End
-
-
-
-
-

Примеры

-
+
+
+
+

Примеры

+ -

См. также

-

Типы ресурсов

-

Описание ресурсов

-
-
+
+

См. также

+

Типы ресурсов

+

Описание ресурсов

+ +
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_proc.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_proc.htm index 6fb40354a..cd12d8ebc 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_proc.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_proc.htm @@ -9,36 +9,36 @@ -
-

ОПИСАНИЕ ПРОЦЕССОВ ОБСЛУЖИВАНИЯ

-

Процессы обслуживания описываются в отдельном объекте (с расширением .prc).

-

За основу описания процесса взят синтаксис языка GPSS. Каждый процесс имеет следующий формат:

-
$Process <имя_процесса> <имя_транзактов>
+    
+

ОПИСАНИЕ ПРОЦЕССОВ ОБСЛУЖИВАНИЯ

+

Процессы обслуживания описываются в отдельном объекте (с расширением .prc).

+

За основу описания процесса взят синтаксис языка GPSS. Каждый процесс имеет следующий формат:

+
$Process <имя_процесса> <имя_транзактов>
     {<процессный_блок>}
 $End
-
-
имя_процесса
-
Имя процесса представляет собой простое имя. Имена должны быть различными для всех процессов и не должны совпадать с ранее определенными именами.
-
имя_транзактов
-
Имя транзактов - это имя типа ресурсов, который должны иметь транзакты, обрабатываемые в данном процессе обслуживания.
-
процессный_блок
-
Процессный блок имеет формат: -
<процессный_оператор>
+        
+
имя_процесса
+
Имя процесса представляет собой простое имя. Имена должны быть различными для всех процессов и не должны совпадать с ранее определенными именами.
+
имя_транзактов
+
Имя транзактов - это имя типа ресурсов, который должны иметь транзакты, обрабатываемые в данном процессе обслуживания.
+
процессный_блок
+
Процессный блок имеет формат: +
<процессный_оператор>
 | <инструкция_планирования_событий>
 | <инструкция_планирования_событий>
-
-
процессный_оператор
-
Процессный оператор имеет формат: -
<оператор_создания_транзактов>
+                
+
процессный_оператор
+
Процессный оператор имеет формат: +
<оператор_создания_транзактов>
 | <оператор_захвата_ресурса>
 | <оператор_освобождения_ресурса>
 | <оператор_продвижения_модельного_времени>
@@ -46,104 +46,104 @@ 

ОПИСАНИЕ ПРОЦЕССОВ ОБСЛУЖИВАНИЯ

| <оператор_выхода_из_очереди> | <оператор_модификации_ресурса> | <оператор_удаления_транзактов>
-
-
оператор_создания_транзактов
-
Оператор создания транзактов имеет следующий формат: -
GENERATE <выражение_времени>
-
-
выражение_времени
-
Выражение времени представляет собой арифметическое выражение целого или вещественного типа, по которому рассчитывается интервал времени между создаваемыми транзактами.
-
-
-
оператор_захвата_ресурса
-
При поступлении транзакта в этот оператор, происходит захват указанного ресурса. Другими словами, он описывает начало операции обслуживания. Оператор имеет следующий формат: -
SEIZE <имя_ресурса> {, <имя_ресурса>}
-
-
имя_ресурса
-
-

Если ресурс с таким именем уже заведен и имеет произвольный тип с параметром – Состояние, который является перечислимым со значениями Свободен и Занят, то блок будет работать с этим ресурсом.

-

Иначе будут автоматически созданы ресурс с указанным именем и тип для него с именем имя_ресурсаs и параметром Состояние, либо будет выдано сообщение об ошибке.

-

Если после оператора определен список ресурсов, то в момент поступления транзакта в блок будет заниматься первый свободный.

-
-
-
-
оператор_освобождения_ресурса
-
Предназначен для освобождения ресурса в момент поступления в него транзакта. Другими словами, он описывает окончания операции обслуживания. Работает в паре с SEIZE. Оператор имеет следующий формат: -
RELEASE <имя_ресурса> {, <имя_ресурса>}
-
-
имя_ресурса
-
-

Описание имени соответствует описанию такового оператора SEIZE.

-

Если после оператора определен список ресурсов, то во время поступления транзакта в блок будет освобождаться тот ресурс, который был занят этим транзактом выше.

-
-
-
-
оператор_продвижения_модельного_времени
-
Оператор осуществляет задержку в продвижении транзакта в течение некоторого интервала времени. Другими словами, с его помощью моделируется операция обслуживания. Формат оператора: -
ADVANCE <выражение_времени>
-
-
выражение_времени
-
Выражение времени представляет собой арифметическое выражение целого или вещественного типа, по которому рассчитывается длительность задержки транзакта в блоке.
-
-
-
оператор_постановки_в_очередь
-
При поступлении транзакта увеличивает длину соответствующей очереди на единицу. Он имеет следующий формат: -
QUEUE <очередь> 
-
-
очередь
-
-

Это имя имя ресурса определенного типа - QDEPART с параметром целого типа - длина_очереди. У разработчика модели есть два варианта работы с блоком:

-

1) Завести тип QDEPART и ресурс от этого типа самостоятельно в закладках RTP и RSS, и использовать его в качестве параметра оператора.

-

2) Система сама заведет тип QDEPART и ресурс от этого типа с именем, указанным в качестве параметра оператора.

-

При поступлении транзакта в блок, значение параметра длина_очереди увеличится на единицу.

-
-
-
-
оператор_выхода_из_очереди
-
При поступлении транзакта уменьшает длину соответствующей очереди на единицу. Работает в паре с QUEUE. Имеет следующий формат: -
DEPART <очередь> 
-
-
очередь
-
-

Описание параметра соответствует описанию такового оператора QUEUE.

-

При поступлении транзакта в блок, значение параметра длина_очереди уменьшается на единицу.

-
-
-
-
оператор_модификации_ресурса
-
Изменяет значение параметра ресурса на заданное. Имеет следующий формат: -
ASSIGN <имя_ресурса>.<имя_параметра> = <арифметическое_выражение>
-
-
имя_ресурса
-
Имя изменяемого ресурса.
-
-
-
имя_параметра
-
Имя изменяемого параметра.
-
-
-
арифметическое выражение
-
Определяет новое значение параметра. Его тип должен соответствовать типу параметра, иначе будет выдано сообщение об ошибке.
-
-
-
оператор_удаления_транзактов
-
Удаляет пришедший в него транзакт и увеличивает значение терминального счетчика Terminate_counter (в отличии от языка GPSS, в котором похожий оператор его уменьшал). Имеет следующий формат: -
TERMINATE <дельта> 
-
-
дельта
-
Дельта представляет собой арифметическое выражение целого типа, по которому рассчитывается приращение значения терминального счетчика. Это может понадобиться для того, чтобы связать остановку моделирования с числом удаленных транзактов.
-
-
-
-
-
-
-
-

Примеры

-
-
ГПС имеет два станка с ЧПУ, зону приемки заготовок и зону готовых изделий. Заготовки прибывают каждые 150 секунд (экспоненциальное распределение) и последовательно обрабатываются на двух станках. Роботу требуется 8±1 секунд, чтобы захватить или отпустить компоненты, и 6 секунд, чтобы переместить их из зоны приемки к первому станку. Время обработки на первом станке распределено по нормальному закону со средним в 60 секунд и стандартным отклонением в 10 секунд. На перемещение от первого станка ко второму роботу требуется 7 секунд. Время обработки на втором станке составляет 100 секунд (экспоненциальное распределение). Чтобы переместить компоненты от второго станка в зону готовых изделий, роботу требуется 5 секунд.
-
+
+
оператор_создания_транзактов
+
Оператор создания транзактов имеет следующий формат: +
GENERATE <выражение_времени>
+
+
выражение_времени
+
Выражение времени представляет собой арифметическое выражение целого или вещественного типа, по которому рассчитывается интервал времени между создаваемыми транзактами.
+
+
+
оператор_захвата_ресурса
+
При поступлении транзакта в этот оператор, происходит захват указанного ресурса. Другими словами, он описывает начало операции обслуживания. Оператор имеет следующий формат: +
SEIZE <имя_ресурса> {, <имя_ресурса>}
+
+
имя_ресурса
+
+

Если ресурс с таким именем уже заведен и имеет произвольный тип с параметром – Состояние, который является перечислимым со значениями Свободен и Занят, то блок будет работать с этим ресурсом.

+

Иначе будут автоматически созданы ресурс с указанным именем и тип для него с именем имя_ресурсаs и параметром Состояние, либо будет выдано сообщение об ошибке.

+

Если после оператора определен список ресурсов, то в момент поступления транзакта в блок будет заниматься первый свободный.

+
+
+
+
оператор_освобождения_ресурса
+
Предназначен для освобождения ресурса в момент поступления в него транзакта. Другими словами, он описывает окончания операции обслуживания. Работает в паре с SEIZE. Оператор имеет следующий формат: +
RELEASE <имя_ресурса> {, <имя_ресурса>}
+
+
имя_ресурса
+
+

Описание имени соответствует описанию такового оператора SEIZE.

+

Если после оператора определен список ресурсов, то во время поступления транзакта в блок будет освобождаться тот ресурс, который был занят этим транзактом выше.

+
+
+
+
оператор_продвижения_модельного_времени
+
Оператор осуществляет задержку в продвижении транзакта в течение некоторого интервала времени. Другими словами, с его помощью моделируется операция обслуживания. Формат оператора: +
ADVANCE <выражение_времени>
+
+
выражение_времени
+
Выражение времени представляет собой арифметическое выражение целого или вещественного типа, по которому рассчитывается длительность задержки транзакта в блоке.
+
+
+
оператор_постановки_в_очередь
+
При поступлении транзакта увеличивает длину соответствующей очереди на единицу. Он имеет следующий формат: +
QUEUE <очередь> 
+
+
очередь
+
+

Это имя имя ресурса определенного типа - QDEPART с параметром целого типа - длина_очереди. У разработчика модели есть два варианта работы с блоком:

+

1) Завести тип QDEPART и ресурс от этого типа самостоятельно в закладках RTP и RSS, и использовать его в качестве параметра оператора.

+

2) Система сама заведет тип QDEPART и ресурс от этого типа с именем, указанным в качестве параметра оператора.

+

При поступлении транзакта в блок, значение параметра длина_очереди увеличится на единицу.

+
+
+
+
оператор_выхода_из_очереди
+
При поступлении транзакта уменьшает длину соответствующей очереди на единицу. Работает в паре с QUEUE. Имеет следующий формат: +
DEPART <очередь> 
+
+
очередь
+
+

Описание параметра соответствует описанию такового оператора QUEUE.

+

При поступлении транзакта в блок, значение параметра длина_очереди уменьшается на единицу.

+
+
+
+
оператор_модификации_ресурса
+
Изменяет значение параметра ресурса на заданное. Имеет следующий формат: +
ASSIGN <имя_ресурса>.<имя_параметра> = <арифметическое_выражение>
+
+
имя_ресурса
+
Имя изменяемого ресурса.
+
+
+
имя_параметра
+
Имя изменяемого параметра.
+
+
+
арифметическое выражение
+
Определяет новое значение параметра. Его тип должен соответствовать типу параметра, иначе будет выдано сообщение об ошибке.
+
+
+
оператор_удаления_транзактов
+
Удаляет пришедший в него транзакт и увеличивает значение терминального счетчика Terminate_counter (в отличии от языка GPSS, в котором похожий оператор его уменьшал). Имеет следующий формат: +
TERMINATE <дельта> 
+
+
дельта
+
Дельта представляет собой арифметическое выражение целого типа, по которому рассчитывается приращение значения терминального счетчика. Это может понадобиться для того, чтобы связать остановку моделирования с числом удаленных транзактов.
+
+
+
+ + + + +

Примеры

+ -
-
+
+ +
diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec.htm index 15d1d7757..2de9be6b9 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec.htm @@ -8,62 +8,62 @@ -
-

ПОСЛЕДОВАТЕЛЬНОСТИ

-

Последовательности отличаются от функций тем, что выдаваемое ими значение не вычисляется на основе значений их параметров с использованием определенного алгоритма, а определяется генератором псевдослучайных чисел с соответствующим распределением либо выбирается из числа значений, заданных при описании последовательности.

-

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

-
$Sequence <имя_последовательности>: <тип_значения_последовательности>
+    
+

ПОСЛЕДОВАТЕЛЬНОСТИ

+

Последовательности отличаются от функций тем, что выдаваемое ими значение не вычисляется на основе значений их параметров с использованием определенного алгоритма, а определяется генератором псевдослучайных чисел с соответствующим распределением либо выбирается из числа значений, заданных при описании последовательности.

+

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

+
$Sequence <имя_последовательности>: <тип_значения_последовательности>
 $Type = <тип_последовательности> <значение_базы_генератора>
 $Body
     <тело_последовательности>
 $End
-
-
имя_последовательности
-
Имя последовательности представляет собой простое имя. Имена должны быть различными для всех последовательностей и не должны совпадать с ранее определенными именами.
-
тип_значения_последовательности
-
Тип значения последовательности - это один из возможных в языке типов данных. При описании типов значений последовательности возможны ссылки на типы параметров ресурсов и типы символьных констант.
-
тип_последовательности
-
В данной версии языка определены последовательности следующих типов: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Тип последовательностиОписание
uniformПоследовательность псевдослучайных чисел, распределенных по равномерному закону
exponentialПоследовательность псевдослучайных чисел, распределенных по экспоненциальному закону
normalПоследовательность псевдослучайных чисел, распределенных по нормальному закону
triangularПоследовательность псевдослучайных чисел, распределенных по треугольному закону
by_histПоследовательность псевдослучайных чисел, распределенных по закону, заданному гистограммой
enumerativeПоследовательность значений, перечисленных непосредственно в теле последовательности
-
-
значение_базы_генератора
-
Значение базы генератора представляет собой целое число в диапазоне [-2147483647..2147483647]. Это значение может отсутствовать, в этом случае будет использовано значение, определенное в языке. Значения баз генераторов могут быть изменены в объекте прогона.
-
-

См. также

-

Типы данных. Соответствие типов

-

Описание символьных констант, функций и последовательностей

-

Синтаксис констант

-

Синтаксис функции

-
-
+
+
имя_последовательности
+
Имя последовательности представляет собой простое имя. Имена должны быть различными для всех последовательностей и не должны совпадать с ранее определенными именами.
+
тип_значения_последовательности
+
Тип значения последовательности - это один из возможных в языке типов данных. При описании типов значений последовательности возможны ссылки на типы параметров ресурсов и типы символьных констант.
+
тип_последовательности
+
В данной версии языка определены последовательности следующих типов: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Тип последовательностиОписание
uniformПоследовательность псевдослучайных чисел, распределенных по равномерному закону
exponentialПоследовательность псевдослучайных чисел, распределенных по экспоненциальному закону
normalПоследовательность псевдослучайных чисел, распределенных по нормальному закону
triangularПоследовательность псевдослучайных чисел, распределенных по треугольному закону
by_histПоследовательность псевдослучайных чисел, распределенных по закону, заданному гистограммой
enumerativeПоследовательность значений, перечисленных непосредственно в теле последовательности
+
+
значение_базы_генератора
+
Значение базы генератора представляет собой целое число в диапазоне [-2147483647..2147483647]. Это значение может отсутствовать, в этом случае будет использовано значение, определенное в языке. Значения баз генераторов могут быть изменены в объекте прогона.
+
+

См. также

+

Типы данных. Соответствие типов

+

Описание символьных констант, функций и последовательностей

+

Синтаксис констант

+

Синтаксис функции

+
+
diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_by_hist.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_by_hist.htm index 6f8ec0875..75d00b51c 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_by_hist.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_by_hist.htm @@ -9,48 +9,48 @@ -
-

ГИСТОГРАММНОЕ РАСПРЕДЕЛЕНИЕ

-

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

-
$Sequence <имя_последовательности>: <тип_значения_последовательности>
+    
+

ГИСТОГРАММНОЕ РАСПРЕДЕЛЕНИЕ

+

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

+
$Sequence <имя_последовательности>: <тип_значения_последовательности>
 $Type = by_hist <значение_базы_генератора>
 $Body
     <тело_последовательности>
 $End
-
-
имя_последовательности
-
Имя последовательности представляет собой простое имя. Имена должны быть различными для всех последовательностей и не должны совпадать с ранее определенными именами.
-
тип_значения_последовательности
-
Тип значения последовательности - это один из возможных в языке типов данных. При описании типов значений последовательности возможны ссылки на типы параметров ресурсов и типы символьных констант.
-


Обращение к последовательности имеет следующий формат:

-
<имя_последовательности>
-
-

Последовательности типа by_hist не имеют параметров (при обращении к последовательности без параметров скобки после имени последовательности не указывают).

-
-
тело_последовательности
-

Тело последовательности типа by_hist имеет следующий формат:

-
<границы_диапазона> <относительная_частота>
+        
+
имя_последовательности
+
Имя последовательности представляет собой простое имя. Имена должны быть различными для всех последовательностей и не должны совпадать с ранее определенными именами.
+
тип_значения_последовательности
+
Тип значения последовательности - это один из возможных в языке типов данных. При описании типов значений последовательности возможны ссылки на типы параметров ресурсов и типы символьных констант.
+


Обращение к последовательности имеет следующий формат:

+
<имя_последовательности>
+
+

Последовательности типа by_hist не имеют параметров (при обращении к последовательности без параметров скобки после имени последовательности не указывают).

+
+
тело_последовательности
+

Тело последовательности типа by_hist имеет следующий формат:

+
<границы_диапазона> <относительная_частота>
 {<границы_диапазона> <относительная_частота>}
-
-
границы_диапазона
-
Для целых и вещественных последовательностей границы диапазона указывают целыми либо вещественными численными константами, причем нижняя граница диапазона (за исключением первого диапазона) должна быть равна верхней границе предыдущего диапазона. Для перечислимых последовательностей задают не диапазон, а имя значения перечислимого типа.
-
относительная_частота
-
Относительную частоту задают вещественной численной константой, она обозначает относительную частоту попадания значений последовательности в заданный интервал (относительную частоту появления заданного значения для перечислимых последовательностей). Сумма относительных частот для всех интервалов гистограммы не обязательно должна быть равна 1. Использование для задания границ диапазона и относительных частот символьных констант и выражений не допускается.
-
-
-
-

Примеры

-
+
+

Примеры

+ -

Примечания

-

Значение последовательности типа by_hist вычисляется следующим образом. В начале в соответствии с относительными частотами определяется интервал гистограммы, затем конкретное значение получается как равномерно распределенное на этом интервале число. Для последовательностей с перечислимыми значениями по относительной частоте сразу определяется значение.

-

После определения описанным способом значения последовательности любого типа в случае, если задан допустимый диапазон значений последовательности, производится проверка попадания полученного значения в этот диапазон. Если значение меньше нижней границы, то оно становится равным нижней границе, если больше верхней, то равным верхней границе.

-

Все последовательности порождают независимые потоки псевдослучайных чисел. Изменением значений начальных баз генераторов могут быть получены различные реализации последовательности.

-

См. также

-

Типы данных. Соответствие типов

-

Описание символьных констант, функций и последовательностей

-

Синтаксис констант

-

Синтаксис функции

-

Синтаксис последовательностей

-
-
+

Вызов последовательности:

+
Последовательность_7
+
+

Примечания

+

Значение последовательности типа by_hist вычисляется следующим образом. В начале в соответствии с относительными частотами определяется интервал гистограммы, затем конкретное значение получается как равномерно распределенное на этом интервале число. Для последовательностей с перечислимыми значениями по относительной частоте сразу определяется значение.

+

После определения описанным способом значения последовательности любого типа в случае, если задан допустимый диапазон значений последовательности, производится проверка попадания полученного значения в этот диапазон. Если значение меньше нижней границы, то оно становится равным нижней границе, если больше верхней, то равным верхней границе.

+

Все последовательности порождают независимые потоки псевдослучайных чисел. Изменением значений начальных баз генераторов могут быть получены различные реализации последовательности.

+

См. также

+

Типы данных. Соответствие типов

+

Описание символьных констант, функций и последовательностей

+

Синтаксис констант

+

Синтаксис функции

+

Синтаксис последовательностей

+ +
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_enum.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_enum.htm index b7e43e285..b75e2f0ac 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_enum.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_enum.htm @@ -9,47 +9,47 @@ -
-

ПЕРЕЧИСЛИМЫЕ ЗНАЧЕНИЯ

-

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

-
$Sequence <имя_последовательности>: <тип_значения_последовательности>
+    
+

ПЕРЕЧИСЛИМЫЕ ЗНАЧЕНИЯ

+

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

+
$Sequence <имя_последовательности>: <тип_значения_последовательности>
 $Type = enumerative
 $Body
     <тело_последовательности>
 $End
-
-
имя_последовательности
-
Имя последовательности представляет собой простое имя. Имена должны быть различными для всех последовательностей и не должны совпадать с ранее определенными именами.
-
тип_значения_последовательности
-
Тип значения последовательности - это один из возможных в языке типов данных. При описании типов значений последовательности возможны ссылки на типы параметров ресурсов и типы символьных констант.
-


Обращение к последовательности имеет следующий формат:

-
<имя_последовательности>
-
-

Последовательности типа enumerative не имеют параметров (при обращении к последовательности без параметров скобки после имени последовательности не указывают).

- -
-
тело_последовательности
-
Синтаксис тела последовательности зависит от типа последовательности. -

Тело последовательности типа enumerative имеет следующий формат:

-
<значение_последовательности> {<значение_последовательности>}
-
-
значение_последовательности
-
Значение последовательности задают целой либо вещественной численной константой или именем значения в соответствии с типом значений последовательности. Максимальное количество значений в данной версии равно 1024.
-
-
-
-

Примеры

- -
+

Вызов последовательности:

+
Последовательность_9
+
+

Примечания

+

Значения последовательности типа enumerative заданы непосредственно в теле. Эти значения выдаются при вызовах последовательности в порядке их следования в описании. При первом обращении выдается первое значение, при втором - второе и так далее. После последнего значения выдается первое.

+

Все последовательности порождают независимые потоки псевдослучайных чисел. Изменением значений начальных баз генераторов могут быть получены различные реализации последовательности.

+

См. также

+

Типы данных. Соответствие типов

+

Описание символьных констант, функций и последовательностей

+

Синтаксис констант

+

Синтаксис функции

+

Синтаксис последовательностей

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_exponen.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_exponen.htm index 4777fc572..dd5367af2 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_exponen.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_exponen.htm @@ -8,60 +8,60 @@ -
-

ЭКСПОНЕНЦИАЛЬНЫЙ ЗАКОН

-

Теоретические сведения о генераторах псевдослечайных чисел можно найти здесь

-

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

-
$Sequence <имя_последовательности>: <тип_значения_последовательности>
+    
+

ЭКСПОНЕНЦИАЛЬНЫЙ ЗАКОН

+

Теоретические сведения о генераторах псевдослечайных чисел можно найти здесь

+

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

+
$Sequence <имя_последовательности>: <тип_значения_последовательности>
 $Type = exponential <значение_базы_генератора>
 $End
-
-
имя_последовательности
-
Имя последовательности представляет собой простое имя. Имена должны быть различными для всех последовательностей и не должны совпадать с ранее определенными именами.
-
тип_значения_последовательности
-
Тип значения последовательности - это один из возможных в языке типов данных. При описании типов значений последовательности возможны ссылки на типы параметров ресурсов и типы символьных констант.
-
значение_базы_генератора
-
Значение базы генератора представляет собой целое число в диапазоне [-2147483647..2147483647]. Это значение может отсутствовать, в этом случае будет использовано значение, определенное в языке. Значения баз генераторов могут быть изменены в объекте прогона.
-


Обращение к последовательности имеет следующий формат:

-
<имя_последовательности>(<среднее_значение_экспоненциального_распределения>)
-

Для задания значения параметра вещественного типа можно пользоваться арифметическим выражением целого типа.

-
-
выражение
-
После имени последовательности в скобках через запятую записываются арифметические выражения для вычисления значений параметров. - - - - - - - - - - - -
Тип последовательностиТип значения последовательностиТип параметра
exponentialЦелый
Вещественный
Вещественный
Вещественный
-
-
-
-

Пример

-
$Sequence Последовательность_2: real [0.0..10.0]
+        
+
имя_последовательности
+
Имя последовательности представляет собой простое имя. Имена должны быть различными для всех последовательностей и не должны совпадать с ранее определенными именами.
+
тип_значения_последовательности
+
Тип значения последовательности - это один из возможных в языке типов данных. При описании типов значений последовательности возможны ссылки на типы параметров ресурсов и типы символьных констант.
+
значение_базы_генератора
+
Значение базы генератора представляет собой целое число в диапазоне [-2147483647..2147483647]. Это значение может отсутствовать, в этом случае будет использовано значение, определенное в языке. Значения баз генераторов могут быть изменены в объекте прогона.
+


Обращение к последовательности имеет следующий формат:

+
<имя_последовательности>(<среднее_значение_экспоненциального_распределения>)
+

Для задания значения параметра вещественного типа можно пользоваться арифметическим выражением целого типа.

+
+
выражение
+
После имени последовательности в скобках через запятую записываются арифметические выражения для вычисления значений параметров. + + + + + + + + + + + +
Тип последовательностиТип значения последовательностиТип параметра
exponentialЦелый
Вещественный
Вещественный
Вещественный
+
+
+
+

Пример

+
$Sequence Последовательность_2: real [0.0..10.0]
 $Type = exponential 2147483647
 $End
 
-

Вызов последовательности:

-
Последовательность_2(2.5)
-

Примечания

-

Вычисление значений последовательности происходит следующим образом. Сначала вычисляются значения параметров, если параметры имеются.

-

Значения последовательности типа exponential вычисляются на основе генератора псевдослучайных чисел как экспоненциально распределенные вещественные числа с заданным средним. Если тип значения последовательности целый, то целое значение получается из вещественного отбрасыванием дробной части.

-

После определения описанным способом значения последовательности любого типа в случае, если задан допустимый диапазон значений последовательности, производится проверка попадания полученного значения в этот диапазон. Если значение меньше нижней границы, то оно становится равным нижней границе, если больше верхней, то равным верхней границе.

-

Все последовательности порождают независимые потоки псевдослучайных чисел. Изменением значений начальных баз генераторов могут быть получены различные реализации последовательности.

-

См. также

-

Типы данных. Соответствие типов

-

Описание символьных констант, функций и последовательностей

-

Синтаксис констант

-

Синтаксис функции

-

Синтаксис последовательностей

-
-
+

Вызов последовательности:

+
Последовательность_2(2.5)
+

Примечания

+

Вычисление значений последовательности происходит следующим образом. Сначала вычисляются значения параметров, если параметры имеются.

+

Значения последовательности типа exponential вычисляются на основе генератора псевдослучайных чисел как экспоненциально распределенные вещественные числа с заданным средним. Если тип значения последовательности целый, то целое значение получается из вещественного отбрасыванием дробной части.

+

После определения описанным способом значения последовательности любого типа в случае, если задан допустимый диапазон значений последовательности, производится проверка попадания полученного значения в этот диапазон. Если значение меньше нижней границы, то оно становится равным нижней границе, если больше верхней, то равным верхней границе.

+

Все последовательности порождают независимые потоки псевдослучайных чисел. Изменением значений начальных баз генераторов могут быть получены различные реализации последовательности.

+

См. также

+

Типы данных. Соответствие типов

+

Описание символьных констант, функций и последовательностей

+

Синтаксис констант

+

Синтаксис функции

+

Синтаксис последовательностей

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_normal.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_normal.htm index afb3aa331..a10759794 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_normal.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_normal.htm @@ -8,61 +8,61 @@ -
-

НОРМАЛЬНЫЙ ЗАКОН

-

Теоретические сведения о генераторах псевдослечайных чисел можно найти здесь

-

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

-
$Sequence <имя_последовательности>: <тип_значения_последовательности>
+    
+

НОРМАЛЬНЫЙ ЗАКОН

+

Теоретические сведения о генераторах псевдослечайных чисел можно найти здесь

+

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

+
$Sequence <имя_последовательности>: <тип_значения_последовательности>
 $Type = normal <значение_базы_генератора>
 $End
-
-
имя_последовательности
-
Имя последовательности представляет собой простое имя. Имена должны быть различными для всех последовательностей и не должны совпадать с ранее определенными именами.
-
тип_значения_последовательности
-
Тип значения последовательности - это один из возможных в языке типов данных. При описании типов значений последовательности возможны ссылки на типы параметров ресурсов и типы символьных констант.
-
значение_базы_генератора
-
Значение базы генератора представляет собой целое число в диапазоне [-2147483647..2147483647]. Это значение может отсутствовать, в этом случае будет использовано значение, определенное в языке. Значения баз генераторов могут быть изменены в объекте прогона.
-


Обращение к последовательности имеет следующий формат:

-
<имя_последовательности>(<среднее_значение>, <стандартное_отклонение>)
-

Для задания значения параметра вещественного типа можно пользоваться арифметическим выражением целого типа.

-
-
выражение
-
После имени последовательности в скобках через запятую записываются арифметические выражения для вычисления значений параметров. - - - - - - - - - - - - - -
Тип последовательностиТип значения последовательностиТип первого параметраТип второго параметра
normalЦелый
Вещественный
Вещественный
Вещественный
Вещественный
Вещественный
-
-
-
-

Пример

-
$Sequence Последовательность_3: real [0.0..10.0]
+        
+
имя_последовательности
+
Имя последовательности представляет собой простое имя. Имена должны быть различными для всех последовательностей и не должны совпадать с ранее определенными именами.
+
тип_значения_последовательности
+
Тип значения последовательности - это один из возможных в языке типов данных. При описании типов значений последовательности возможны ссылки на типы параметров ресурсов и типы символьных констант.
+
значение_базы_генератора
+
Значение базы генератора представляет собой целое число в диапазоне [-2147483647..2147483647]. Это значение может отсутствовать, в этом случае будет использовано значение, определенное в языке. Значения баз генераторов могут быть изменены в объекте прогона.
+


Обращение к последовательности имеет следующий формат:

+
<имя_последовательности>(<среднее_значение>, <стандартное_отклонение>)
+

Для задания значения параметра вещественного типа можно пользоваться арифметическим выражением целого типа.

+
+
выражение
+
После имени последовательности в скобках через запятую записываются арифметические выражения для вычисления значений параметров. + + + + + + + + + + + + + +
Тип последовательностиТип значения последовательностиТип первого параметраТип второго параметра
normalЦелый
Вещественный
Вещественный
Вещественный
Вещественный
Вещественный
+
+
+
+

Пример

+
$Sequence Последовательность_3: real [0.0..10.0]
 $Type = normal
 $End
-

Вызов последовательности:

-
Последовательность_3(2.0, 1 / 5.0)
-

Примечания

-

Вычисление значений последовательности происходит следующим образом. Сначала вычисляются значения параметров, если параметры имеются.

-

Значения последовательности типа normal вычисляются на основе генератора псевдослучайных чисел как нормально распределенные вещественные числа с заданным средним и дисперсией. Если тип значения последовательности целый, то целое значение получается из вещественного округлением к ближайшему целому.

-

После определения описанным способом значения последовательности любого типа в случае, если задан допустимый диапазон значений последовательности, производится проверка попадания полученного значения в этот диапазон. Если значение меньше нижней границы, то оно становится равным нижней границе, если больше верхней, то равным верхней границе.

-

Все последовательности порождают независимые потоки псевдослучайных чисел. Изменением значений начальных баз генераторов могут быть получены различные реализации последовательности.

-

См. также

-

Типы данных. Соответствие типов

-

Описание символьных констант, функций и последовательностей

-

Синтаксис констант

-

Синтаксис функции

-

Синтаксис последовательностей

-
-
+

Вызов последовательности:

+
Последовательность_3(2.0, 1 / 5.0)
+

Примечания

+

Вычисление значений последовательности происходит следующим образом. Сначала вычисляются значения параметров, если параметры имеются.

+

Значения последовательности типа normal вычисляются на основе генератора псевдослучайных чисел как нормально распределенные вещественные числа с заданным средним и дисперсией. Если тип значения последовательности целый, то целое значение получается из вещественного округлением к ближайшему целому.

+

После определения описанным способом значения последовательности любого типа в случае, если задан допустимый диапазон значений последовательности, производится проверка попадания полученного значения в этот диапазон. Если значение меньше нижней границы, то оно становится равным нижней границе, если больше верхней, то равным верхней границе.

+

Все последовательности порождают независимые потоки псевдослучайных чисел. Изменением значений начальных баз генераторов могут быть получены различные реализации последовательности.

+

См. также

+

Типы данных. Соответствие типов

+

Описание символьных констант, функций и последовательностей

+

Синтаксис констант

+

Синтаксис функции

+

Синтаксис последовательностей

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_triang.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_triang.htm index 56ecb40cc..0e8fa3493 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_triang.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_triang.htm @@ -8,62 +8,62 @@ -
-

ТРЕУГОЛЬНЫЙ ЗАКОН

-

Теоретические сведения о генераторах псевдослечайных чисел можно найти здесь

-

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

-
$Sequence <имя_последовательности>: <тип_значения_последовательности>
+    
+

ТРЕУГОЛЬНЫЙ ЗАКОН

+

Теоретические сведения о генераторах псевдослечайных чисел можно найти здесь

+

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

+
$Sequence <имя_последовательности>: <тип_значения_последовательности>
 $Type = triangular <значение_базы_генератора>
 $End
-
-
имя_последовательности
-
Имя последовательности представляет собой простое имя. Имена должны быть различными для всех последовательностей и не должны совпадать с ранее определенными именами.
-
тип_значения_последовательности
-
Тип значения последовательности - это один из возможных в языке типов данных. При описании типов значений последовательности возможны ссылки на типы параметров ресурсов и типы символьных констант.
-
значение_базы_генератора
-
Значение базы генератора представляет собой целое число в диапазоне [-2147483647..2147483647]. Это значение может отсутствовать, в этом случае будет использовано значение, определенное в языке. Значения баз генераторов могут быть изменены в объекте прогона.
-


Обращение к последовательности имеет следующий формат:

-
<имя_последовательности>(<левая_граница_интервала_распределения>, <точка_под_вершиной_треугольника>, <правая_граница_интервала_распределения>)
-

Для задания значения параметра вещественного типа можно пользоваться арифметическим выражением целого типа.

-
-
выражение
-
После имени последовательности в скобках через запятую записываются арифметические выражения для вычисления значений параметров. - - - - - - - - - - - - - - - -
Тип последовательностиТип значения последовательностиТип первого параметраТип второго параметраТип третьего параметра
triangularЦелый
Вещественный
Вещественный
Вещественный
Вещественный
Вещественный
Вещественный
Вещественный
-
-
-

Пример

-
$Sequence Последовательность_4: real[0.0..10.0]
+        
+
имя_последовательности
+
Имя последовательности представляет собой простое имя. Имена должны быть различными для всех последовательностей и не должны совпадать с ранее определенными именами.
+
тип_значения_последовательности
+
Тип значения последовательности - это один из возможных в языке типов данных. При описании типов значений последовательности возможны ссылки на типы параметров ресурсов и типы символьных констант.
+
значение_базы_генератора
+
Значение базы генератора представляет собой целое число в диапазоне [-2147483647..2147483647]. Это значение может отсутствовать, в этом случае будет использовано значение, определенное в языке. Значения баз генераторов могут быть изменены в объекте прогона.
+


Обращение к последовательности имеет следующий формат:

+
<имя_последовательности>(<левая_граница_интервала_распределения>, <точка_под_вершиной_треугольника>, <правая_граница_интервала_распределения>)
+

Для задания значения параметра вещественного типа можно пользоваться арифметическим выражением целого типа.

+
+
выражение
+
После имени последовательности в скобках через запятую записываются арифметические выражения для вычисления значений параметров. + + + + + + + + + + + + + + + +
Тип последовательностиТип значения последовательностиТип первого параметраТип второго параметраТип третьего параметра
triangularЦелый
Вещественный
Вещественный
Вещественный
Вещественный
Вещественный
Вещественный
Вещественный
+
+
+

Пример

+
$Sequence Последовательность_4: real[0.0..10.0]
 $Type = triangular
 $End
-

Вызов последовательности:

-
Последовательность_4(2.0, 5, 7 + 1/2.0)
-

Примечание

-

Вычисление значений последовательности происходит следующим образом. Сначала вычисляются значения параметров, если параметры имеются.

-

Значения последовательности типа triangular вычисляются на основе генератора псевдослучайных чисел как распределенные вещественные числа по треугольному закону с заданными границами интервала распределния и точкой под вершиной треугольника. Если тип значения последовательности целый, то целое значение получается из вещественного отбрасыванием дробной части.

-

После определения описанным способом значения последовательности любого типа в случае, если задан допустимый диапазон значений последовательности, производится проверка попадания полученного значения в этот диапазон. Если значение меньше нижней границы, то оно становится равным нижней границе, если больше верхней, то равным верхней границе.

-

Все последовательности порождают независимые потоки псевдослучайных чисел. Изменением значений начальных баз генераторов могут быть получены различные реализации последовательности.

-

См. также

-

Типы данных. Соответствие типов

-

Описание символьных констант, функций и последовательностей

-

Синтаксис констант

-

Синтаксис функции

-

Синтаксис последовательностей

-
-
+

Вызов последовательности:

+
Последовательность_4(2.0, 5, 7 + 1/2.0)
+

Примечание

+

Вычисление значений последовательности происходит следующим образом. Сначала вычисляются значения параметров, если параметры имеются.

+

Значения последовательности типа triangular вычисляются на основе генератора псевдослучайных чисел как распределенные вещественные числа по треугольному закону с заданными границами интервала распределния и точкой под вершиной треугольника. Если тип значения последовательности целый, то целое значение получается из вещественного отбрасыванием дробной части.

+

После определения описанным способом значения последовательности любого типа в случае, если задан допустимый диапазон значений последовательности, производится проверка попадания полученного значения в этот диапазон. Если значение меньше нижней границы, то оно становится равным нижней границе, если больше верхней, то равным верхней границе.

+

Все последовательности порождают независимые потоки псевдослучайных чисел. Изменением значений начальных баз генераторов могут быть получены различные реализации последовательности.

+

См. также

+

Типы данных. Соответствие типов

+

Описание символьных констант, функций и последовательностей

+

Синтаксис констант

+

Синтаксис функции

+

Синтаксис последовательностей

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_uniform.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_uniform.htm index e5ba5c344..96d03e3c9 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_uniform.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_sec/rdo_obj_sec_uniform.htm @@ -8,61 +8,61 @@ -
-

РАВНОМЕРНЫЙ ЗАКОН

-

Теоретические сведения о генераторах псевдослечайных чисел можно найти здесь

-

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

-
$Sequence <имя_последовательности>: <тип_значения_последовательности>
+    
+

РАВНОМЕРНЫЙ ЗАКОН

+

Теоретические сведения о генераторах псевдослечайных чисел можно найти здесь

+

Описание последовательности следует за описанием констант в объекте символьных констант, функций и последовательностей (с расширением .fun) и в общем случае имеет вид:

+
$Sequence <имя_последовательности>: <тип_значения_последовательности>
 $Type = uniform <значение_базы_генератора>
 $End
-
-
имя_последовательности
-
Имя последовательности представляет собой простое имя. Имена должны быть различными для всех последовательностей и не должны совпадать с ранее определенными именами.
-
тип_значения_последовательности
-
Тип значения последовательности - это один из возможных в языке типов данных. При описании типов значений последовательности возможны ссылки на типы параметров ресурсов и типы символьных констант.
-
значение_базы_генератора
-
Значение базы генератора представляет собой целое число в диапазоне [-2147483647..2147483647]. Это значение может отсутствовать, в этом случае будет использовано значение, определенное в языке. Значения баз генераторов могут быть изменены в объекте прогона.
-


Обращение к последовательности имеет следующий формат:

-
<имя_последовательности>(<нижняя_граница_диапазона_распределения>, <верхняя_граница_диапазона_распределения>)
-

Для задания значения параметра вещественного типа можно пользоваться арифметическим выражением целого типа.

-
-
выражение
-
После имени последовательности в скобках через запятую записываются арифметические выражения для вычисления значений параметров. - - - - - - - - - - - - - -
Тип последовательностиТип значения последовательностиТип первого параметраТип второго параметра
uniformЦелый
Вещественный
Целый
Вещественный
Целый
Вещественный
-
-
-
-

Пример

-
$Sequence Последовательность_1: real
+        
+
имя_последовательности
+
Имя последовательности представляет собой простое имя. Имена должны быть различными для всех последовательностей и не должны совпадать с ранее определенными именами.
+
тип_значения_последовательности
+
Тип значения последовательности - это один из возможных в языке типов данных. При описании типов значений последовательности возможны ссылки на типы параметров ресурсов и типы символьных констант.
+
значение_базы_генератора
+
Значение базы генератора представляет собой целое число в диапазоне [-2147483647..2147483647]. Это значение может отсутствовать, в этом случае будет использовано значение, определенное в языке. Значения баз генераторов могут быть изменены в объекте прогона.
+


Обращение к последовательности имеет следующий формат:

+
<имя_последовательности>(<нижняя_граница_диапазона_распределения>, <верхняя_граница_диапазона_распределения>)
+

Для задания значения параметра вещественного типа можно пользоваться арифметическим выражением целого типа.

+
+
выражение
+
После имени последовательности в скобках через запятую записываются арифметические выражения для вычисления значений параметров. + + + + + + + + + + + + + +
Тип последовательностиТип значения последовательностиТип первого параметраТип второго параметра
uniformЦелый
Вещественный
Целый
Вещественный
Целый
Вещественный
+
+
+
+

Пример

+
$Sequence Последовательность_1: real
 $Type = uniform 11111111
 $End
-

Вызов последовательности:

-
Последовательность_1(1.0, 1 + 5 / 2.0)
-

Примечания

-

Вычисление значений последовательности происходит следующим образом. Сначала вычисляются значения параметров, если параметры имеются.

-

Значения последовательности типа uniform вычисляются на основе генератора псевдослучайных чисел как равномерно распределенные на заданном диапазоне целые либо вещественные (в зависимости от типа значения последовательности) числа.

-

После определения описанным способом значения последовательности любого типа в случае, если задан допустимый диапазон значений последовательности, производится проверка попадания полученного значения в этот диапазон. Если значение меньше нижней границы, то оно становится равным нижней границе, если больше верхней, то равным верхней границе.

-

Все последовательности порождают независимые потоки псевдослучайных чисел. Изменением значений начальных баз генераторов могут быть получены различные реализации последовательности.

-

См. также

-

Типы данных. Соответствие типов

-

Описание символьных констант, функций и последовательностей

-

Синтаксис констант

-

Синтаксис функции

-

Синтаксис последовательностей

-
-
+

Вызов последовательности:

+
Последовательность_1(1.0, 1 + 5 / 2.0)
+

Примечания

+

Вычисление значений последовательности происходит следующим образом. Сначала вычисляются значения параметров, если параметры имеются.

+

Значения последовательности типа uniform вычисляются на основе генератора псевдослучайных чисел как равномерно распределенные на заданном диапазоне целые либо вещественные (в зависимости от типа значения последовательности) числа.

+

После определения описанным способом значения последовательности любого типа в случае, если задан допустимый диапазон значений последовательности, производится проверка попадания полученного значения в этот диапазон. Если значение меньше нижней границы, то оно становится равным нижней границе, если больше верхней, то равным верхней границе.

+

Все последовательности порождают независимые потоки псевдослучайных чисел. Изменением значений начальных баз генераторов могут быть получены различные реализации последовательности.

+

См. также

+

Типы данных. Соответствие типов

+

Описание символьных констант, функций и последовательностей

+

Синтаксис констант

+

Синтаксис функции

+

Синтаксис последовательностей

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_smr.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_smr.htm index afea0948d..0a181fada 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_smr.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_obj_smr.htm @@ -9,106 +9,106 @@ -
-

ОБЪЕКТ ПРОГОНА

-

В объекте прогона (с расширением .smr) указывают ряд необходимых для управления прогоном данных и режимов. Этот объект состоит из двух частей. Первая часть содержит имена файлов, содержащих необходимые объекты и режимы прогона.

-

Первой лексемой объекта должно быть зарезервированное слово Model_name, за которым после знака равенства должно следовать имя модели. Имя модели - это простое имя, оно не должно совпадать с ранее определенными именами.

-


Далее в первой части объекта в произвольном порядке записываются дескрипторы, описывающие имена объектов и режимы. Формат дескриптора следующий:

-
<зарезервированное_слово> = <значение>
-

Ниже приведены имена зарезервированных слов и возможных значений с пояснениями.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Зарезервированное словоОписание
Resource_fileЗадает имя объекта ресурсов. Значением является имя файла объекта без расширения.
OprIev_fileЗадает имя объекта операций. Значением является имя файла объекта без расширения.
Frame_fileЗадает имя объекта кадров. Значением является имя файла объекта без расширения. Если дескриптор не указан, кадры не загружаются и не могут быть отображены.
Statistic_fileЗадает имя объекта описания результирующих показателей. Значением является имя файла объекта без расширения. Если дескриптор не указан, результирующие показатели не собираются.
Results_fileЗадает имя объекта результатов. Значением является имя файла объекта без расширения. Если дескриптор не указан, объект не создается.
Trace_fileЗадает имя объекта трассировки. Значением является имя файла объекта без расширения. Если дескриптор не указан, объект не создается.
Show_modeЗадает режим отображения при запуске модели. Режимы задаются одним из следующих зарезервированных слов: -
    -
  • NoShow - режим без отображения;
  • -
  • Monitor - режим монитора;
  • -
  • Animation - режим отображения состояния (анимации).
  • -
- Значение по умолчанию - NoShow. -
Frame_numberЗадает номер кадра из числа описанных в объекте кадров для отображения при запуске модели, если указан соответствующий режим. Номер задается константой целого типа. Значение по умолчанию равно 1.
Show_rateЗадает временной масштаб отображения. Указывается вещественной численной константой, равной отношению темпа отображения к модельному времени. Например, при Show_rate = 60.0 отображение будет производиться в 60 раз быстрее, т.е. один час модельного времени будет отображаться за одну минуту. Значение по умолчанию - 60.0.
Run_StartTimeЗадает модельное время, устанавливаемое в начале прогона. Указывается вещественной численной константой. Значение по умолчанию - 0.0.
Trace_StartTimeЗадает время начала выдачи информации в объект трассировки. Указывается вещественной численной константой. Значение по умолчанию - 0.0.
Trace_EndTimeЗадает время окончания выдачи информации в объект трассировки. Указывается вещественной численной константой. Значение по умолчанию - 10.0Е+30.
-

Указание имен файлов объектов ресурсов  в первой части объекта прогона обязательно. Остальные дескрипторы могут отсутствовать. В этом случае используется значение по умолчанию.

-


Во второй части объекта задают в произвольном порядке точки останова, условие окончания прогона, новые начальные значения констант, параметров ресурсов и баз генераторов последовательностей. -


Задание условия окончания прогона имеет следующий формат:

-
Terminate_if <логическое_выражение>
-

Прогон будет автоматически завершен в тот момент, когда значением указанного логического выражения станет ИСТИНА.

-

Если условие окончания прогона не задано, автоматического завершения прогона не происходит.

-


Механизм точек останова служит для повышения удобства отладки моделей.

-

Формат описания точки останова следующий:

-
Break_point <имя_точки_останова> <логическое_выражение>
-

Имя точки останова - это простое имя, оно не должно совпадать с ранее определенными именами. Логическое выражение задает условие, которому должно удовлетворять состояние системы.

-

В тот момент, когда указанное логическое выражение приобретает значение ИСТИНА, происходит прерывание моделирования с выдачей соответствующей информации и РДО-имитатор переходит в режим монитора.

-


Формат задания нового значения символьных констант:

-
<имя_константы> = <новое_значение>
-

Имя константы - это одно из имен констант, описанных в объекте констант. Новое значение символьной константы задается целой или вещественной численной константой либо именем значения в соответствии с типом константы.

-


Формат задания нового значения параметров ресурсов:

-
<имя_ресурса>.<имя_параметра> = <новое_значение>
-

Имя ресурса - это одно из имен ресурсов, заданное в объекте ресурсов. Имя параметра - одно из имен параметров, описанных в объекте типов ресурсов для соответствующего типа. Новое значение задают целой или вещественной численной константой либо именем значения в соответствии с типом параметра.

-


Формат задания нового начального значения базы генераторов последовательности:

-
<имя_последовательности>.Seed = <значение>
-

Имя последовательности - это одно из имен, указанных в объекте констант при описании последовательностей. Оно идентифицирует последовательность, для которой задается значение базы. Значение задают численной константой целого типа в диапазоне -2147483647…2147483647.

-

Пример

- +

См. также

+

Типы ресурсов

+

Описание ресурсов

+

Описание символьных констант, функций и последовательностей

+

Синтаксис последовательности

+

Объекты ИМ

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_event.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_event.htm index 4c289d765..586d4bf48 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_event.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_event.htm @@ -9,19 +9,19 @@

СОБЫТИЕ

-

События описываются в отдельном объекте с расширением .evn

-
$Pattern <имя_события>: event [<признак_трассировки>]
+        

События описываются в отдельном объекте с расширением .evn

+
$Pattern <имя_события>: event [<признак_трассировки>]
 [$Parameters
     <описание_параметров_события>]
 $Relevant_resources
@@ -29,21 +29,21 @@ 

СОБЫТИЕ

$Body <тело_события> $End
-
-
имя_события
-
Имя события представляет собой простое имя. Имена должны быть различными для всех событий и не должны совпадать с ранее определенными именами.
-
признак_трассировки
-
Событие может иметь признак трассировки (подробнее смотри описание <трассировка состояния объектов РДО>).
-
описание_релевантных_ресурсов_события
-
Описание релевантных ресурсов события имеет следующий формат: -
<имя_релевантного_ресурса>: <описатель> <статус_конвертора>
-
-
имя_релевантного_ресурса
-
Имя релевантного ресурса образца представляет собой простое имя. Область видимости имени релевантного ресурса события - это данное событие. Поэтому имена всех релевантных ресурсов одного события должны быть различными.
-
описатель
-
Описатель ресурса - это имя ресурса. Может быть использован указанный ресурс, если его состояние удовлетворяет предусловию.
-
статус_конвертора
-
Статус конвертора описывает, что происходит с релевантным ресурсом в целом при наступлении события. +
+
имя_события
+
Имя события представляет собой простое имя. Имена должны быть различными для всех событий и не должны совпадать с ранее определенными именами.
+
признак_трассировки
+
Событие может иметь признак трассировки (подробнее смотри описание <трассировка состояния объектов РДО>).
+
описание_релевантных_ресурсов_события
+
Описание релевантных ресурсов события имеет следующий формат: +
<имя_релевантного_ресурса>: <описатель> <статус_конвертора>
+
+
имя_релевантного_ресурса
+
Имя релевантного ресурса образца представляет собой простое имя. Область видимости имени релевантного ресурса события - это данное событие. Поэтому имена всех релевантных ресурсов одного события должны быть различными.
+
описатель
+
Описатель ресурса - это имя ресурса. Может быть использован указанный ресурс, если его состояние удовлетворяет предусловию.
+
статус_конвертора
+
Статус конвертора описывает, что происходит с релевантным ресурсом в целом при наступлении события.

В данной версии языка для событий определены следующие статусы конверторов

@@ -64,24 +64,24 @@

СОБЫТИЕ

Статусы конверторов Keep и Erase требуют в качестве описателя исключительно имя ресурса, а статус Create - имя типа ресурса.

-
-
-
-
тело_образца
-
Тело событий и образцов имеет следующий формат: -
<имя_релевантного_ресурса>:
+                    
+
+
+
тело_образца
+
Тело событий и образцов имеет следующий формат: +
<имя_релевантного_ресурса>:
     Convert_event
         <список_инструкций>
-
-
имя_релевантного_ресурса
-
Имена релевантных ресурсов должны следовать в том порядке, в котором они указаны в описании релевантных ресурсов.
-
список_инструкций
-
Список инструкций и указанное перед ним зарезервированное слово должны присутствовать в образце в том случае, если соответствующий статус конвертора, указанный при описании релевантных ресурсов, есть Keep или Create. Если статус конвертора есть Erase, то список инструкций может быть пустым или наоборот содержать инструкции, которые требуется выполнить для сбора статистики в момент удаления ресурса. Если статус конвертора есть Create, то после зарезервированного слова может быть указан признак трассировки для создаваемого ресурса. -

Список инструкций записывают в следующем формате:

-
<инструкция>; {<инструкция>;}
-

Все инструкции могут быть указаны в произвольном порядке. Вычисление новых значений параметров релевантных ресурсов происходит в том порядке, в котором следуют их инструкции присваивания. Если нет ни одной инструкции присваивания, которая относится к данному параметру, то подразумевается, что значение этого параметра не изменяется. Для ресурсов, имеющих статус конвертора Create, задание новых значений каждого параметра обязательны, за исключением случая, когда для параметра указано значение по умолчанию в описании типа ресурса.

-
-
+
+
имя_релевантного_ресурса
+
Имена релевантных ресурсов должны следовать в том порядке, в котором они указаны в описании релевантных ресурсов.
+
список_инструкций
+
Список инструкций и указанное перед ним зарезервированное слово должны присутствовать в образце в том случае, если соответствующий статус конвертора, указанный при описании релевантных ресурсов, есть Keep или Create. Если статус конвертора есть Erase, то список инструкций может быть пустым или наоборот содержать инструкции, которые требуется выполнить для сбора статистики в момент удаления ресурса. Если статус конвертора есть Create, то после зарезервированного слова может быть указан признак трассировки для создаваемого ресурса. +

Список инструкций записывают в следующем формате:

+
<инструкция>; {<инструкция>;}
+

Все инструкции могут быть указаны в произвольном порядке. Вычисление новых значений параметров релевантных ресурсов происходит в том порядке, в котором следуют их инструкции присваивания. Если нет ни одной инструкции присваивания, которая относится к данному параметру, то подразумевается, что значение этого параметра не изменяется. Для ресурсов, имеющих статус конвертора Create, задание новых значений каждого параметра обязательны, за исключением случая, когда для параметра указано значение по умолчанию в описании типа ресурса.

+
+

Примеры

@@ -98,14 +98,14 @@

СОБЫТИЕ

Образец_прихода_клиента.planning(time_now + Интервал_прихода(30))(norm(5)); Количество_в_очереди += Образец_прихода_клиента.Количество; $End
-
-

См. также

-

Типы ресурсов

-

Описание ресурсов

-

Описание символьных констант, функций и последовательностей

-

Описание точек принятия решений

-

Объект трассировки

- -
+ +

См. также

+

Типы ресурсов

+

Описание ресурсов

+

Описание символьных констант, функций и последовательностей

+

Описание точек принятия решений

+

Объект трассировки

+ +
diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_keyboard.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_keyboard.htm index 54c91a45e..b6225dcbd 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_keyboard.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_keyboard.htm @@ -10,11 +10,11 @@

КЛАВИАТУРНАЯ ОПЕРАЦИЯ

-

Образцы типа keyboard описывают клавиатурные операции(такая операция может быть выполнена если нажата определенная клавиша или кнопка мыши и выполняются предусловия операции)

-

Способ записи клавиатурных операций позволяет в РДО разрабатывать интерактивные программы. Для этой цели используются образцы типа keyboard. Каждой клавиатурной операции ставится в соответствие клавиша или комбинация клавиш. В момент нажатия этой клавиши проверяются предусловия и, если они выполняются, инициируется событие начала клавиатурной операции. Дальнейший ход этой операции ничем не отличается от выполнения операции других типов. Таким образом, единственным отличием клавиатурной операции является то, что для ее начала недостаточно выполнения предусловий, сформулированных в образце, а необходимо чтобы еще была нажата соответствующая клавиша.

-

Клавиатурная операция также может быть инициирована нажатием кнопки мыши в активной области кадра анимации, связанной с этой операцией. Механизм выполнения клавиатурной операции при нажатии кнопки мыши ничем не отличается от ее выполнения при нажатии клавиши (комбинации клавишей) на клавиатуре. Одной клавиатурной операции может быть поставлена в соответствие только одна уникальная комбинация клавишей и любое количество активных областей в кадрах анимации.

-

Формат описания образца  клавиатурной операции похож на описание образца обычной:

-
$Pattern <имя_образца>: keyboard [<признак_трассировки>]
+    

Образцы типа keyboard описывают клавиатурные операции(такая операция может быть выполнена если нажата определенная клавиша или кнопка мыши и выполняются предусловия операции)

+

Способ записи клавиатурных операций позволяет в РДО разрабатывать интерактивные программы. Для этой цели используются образцы типа keyboard. Каждой клавиатурной операции ставится в соответствие клавиша или комбинация клавиш. В момент нажатия этой клавиши проверяются предусловия и, если они выполняются, инициируется событие начала клавиатурной операции. Дальнейший ход этой операции ничем не отличается от выполнения операции других типов. Таким образом, единственным отличием клавиатурной операции является то, что для ее начала недостаточно выполнения предусловий, сформулированных в образце, а необходимо чтобы еще была нажата соответствующая клавиша.

+

Клавиатурная операция также может быть инициирована нажатием кнопки мыши в активной области кадра анимации, связанной с этой операцией. Механизм выполнения клавиатурной операции при нажатии кнопки мыши ничем не отличается от ее выполнения при нажатии клавиши (комбинации клавишей) на клавиатуре. Одной клавиатурной операции может быть поставлена в соответствие только одна уникальная комбинация клавишей и любое количество активных областей в кадрах анимации.

+

Формат описания образца  клавиатурной операции похож на описание образца обычной:

+
$Pattern <имя_образца>: keyboard [<признак_трассировки>]
 [$Parameters
     <описание_параметров_образца>]
 $Relevant_resources
@@ -24,188 +24,188 @@ 

КЛАВИАТУРНАЯ ОПЕРАЦИЯ

$Body <тело_образца> $End
-
-
тело_образца
-
Тело событий и образцов имеет следующий формат: -
<имя_релевантного_ресурса>:
+    
+
тело_образца
+
Тело событий и образцов имеет следующий формат: +
<имя_релевантного_ресурса>:
     <предусловие>
     [Convert_begin
         <список_инструкций>]
     [Convert_end
         <список_инструкций>]
-
-
имя_релевантного_ресурса
-
Имена релевантных ресурсов должны следовать в том порядке, в котором они указаны в описании релевантных ресурсов.
-
предусловие
-
Предусловие записывают в следующем формате: -
Choice from <логическое_выражение>
+                
+
имя_релевантного_ресурса
+
Имена релевантных ресурсов должны следовать в том порядке, в котором они указаны в описании релевантных ресурсов.
+
предусловие
+
Предусловие записывают в следующем формате: +
Choice from <логическое_выражение>
 [<способ_выбора>]
или
Choice NoCheck
 [<способ_выбора>]
-
-
логическое_выражение
-
Логическое выражение определяет предусловие использования ресурса (возможность выполнения операции или правила). Если нет необходимости в предусловии, то это указывают зарезервированным словом NoCheck или вообще отсутствием Choice from.
-
способ_выбора
-
Способ выбора задается также, как и после описания релевантных ресурсов образца. Если он не указан после описания релевантных ресурсов образца, он может быть указан в теле образца для каждого релевантного ресурса после логического выражения. Способ выбора может быть задан также в случае, когда описатель релевантного ресурса есть имя конкретного ресурса и не существует альтернативы выбора. При этом можно использовать любой способ выбора: все равно он не будет учитываться, и результат будет одинаковым. Если состояние этого ресурса удовлетворяет предусловию, то ресурс может быть использован независимо от способа выбора, если же не удовлетворяет, то также независимо от способа выбора ресурс не может быть использован. Если способ выбора не указан, то по умолчанию используется first. -

Если способ выбора указан после описания релевантных ресурсов образца, в теле образца он должен отсутствовать для всех релевантных ресурсов.

-
-
-
-
список_инструкций
-
Список инструкций и указанное перед ним зарезервированное слово должны присутствовать в образце в том случае, если соответствующий статус конвертора, указанный при описании релевантных ресурсов, есть Keep или Create. Если статус конвертора есть Erase, то список инструкций может быть пустым или наоборот содержать инструкции, которые требуется выполнить для сбора статистики в момент удаления ресурса. Если статус конвертора есть Create, то после зарезервированного слова может быть указан признак трассировки для создаваемого ресурса. -

Список инструкций записывают в следующем формате:

-
<инструкция>; {<инструкция>;}
-

Все инструкции могут быть указаны в произвольном порядке. Вычисление новых значений параметров релевантных ресурсов происходит в том порядке, в котором следуют их инструкции присваивания. Если нет ни одной инструкции присваивания, которая относится к данному параметру, то подразумевается, что значение этого параметра не изменяется. Для ресурсов, имеющих статус конвертора Create, задание новых значений каждого параметра обязательны, за исключением случая, когда для параметра указано значение по умолчанию в описании типа ресурса.

-
-
-
-
-

При заведении активности от образца типа "клавиатурная операция" в объекте .dpt после имени образца указывают код клавиши, при нажатии которой производится попытка выполнить операцию. После кода указывают значения параметров образца, если они есть.

-

Код клавиши может быть задан следующими способами. Для использования цифровой или буквенной клавиши достаточно указать в апострофах соответствующую букву или цифру. Названия буквенных клавишей указываются прописными латинскими буквами. Например, следующие клавиатурные операции будут выполняться при нажатии клавишей с цифрой 5 и буквой R соответственно (при выполнении остальных предусловий).

-
$Activities 
+                            
+
логическое_выражение
+
Логическое выражение определяет предусловие использования ресурса (возможность выполнения операции или правила). Если нет необходимости в предусловии, то это указывают зарезервированным словом NoCheck или вообще отсутствием Choice from.
+
способ_выбора
+
Способ выбора задается также, как и после описания релевантных ресурсов образца. Если он не указан после описания релевантных ресурсов образца, он может быть указан в теле образца для каждого релевантного ресурса после логического выражения. Способ выбора может быть задан также в случае, когда описатель релевантного ресурса есть имя конкретного ресурса и не существует альтернативы выбора. При этом можно использовать любой способ выбора: все равно он не будет учитываться, и результат будет одинаковым. Если состояние этого ресурса удовлетворяет предусловию, то ресурс может быть использован независимо от способа выбора, если же не удовлетворяет, то также независимо от способа выбора ресурс не может быть использован. Если способ выбора не указан, то по умолчанию используется first. +

Если способ выбора указан после описания релевантных ресурсов образца, в теле образца он должен отсутствовать для всех релевантных ресурсов.

+
+
+
+
список_инструкций
+
Список инструкций и указанное перед ним зарезервированное слово должны присутствовать в образце в том случае, если соответствующий статус конвертора, указанный при описании релевантных ресурсов, есть Keep или Create. Если статус конвертора есть Erase, то список инструкций может быть пустым или наоборот содержать инструкции, которые требуется выполнить для сбора статистики в момент удаления ресурса. Если статус конвертора есть Create, то после зарезервированного слова может быть указан признак трассировки для создаваемого ресурса. +

Список инструкций записывают в следующем формате:

+
<инструкция>; {<инструкция>;}
+

Все инструкции могут быть указаны в произвольном порядке. Вычисление новых значений параметров релевантных ресурсов происходит в том порядке, в котором следуют их инструкции присваивания. Если нет ни одной инструкции присваивания, которая относится к данному параметру, то подразумевается, что значение этого параметра не изменяется. Для ресурсов, имеющих статус конвертора Create, задание новых значений каждого параметра обязательны, за исключением случая, когда для параметра указано значение по умолчанию в описании типа ресурса.

+
+
+
+
+

При заведении активности от образца типа "клавиатурная операция" в объекте .dpt после имени образца указывают код клавиши, при нажатии которой производится попытка выполнить операцию. После кода указывают значения параметров образца, если они есть.

+

Код клавиши может быть задан следующими способами. Для использования цифровой или буквенной клавиши достаточно указать в апострофах соответствующую букву или цифру. Названия буквенных клавишей указываются прописными латинскими буквами. Например, следующие клавиатурные операции будут выполняться при нажатии клавишей с цифрой 5 и буквой R соответственно (при выполнении остальных предусловий).

+
$Activities 
     Клавиатурная_операция_1: Образец_клавиатурной_операции '5' 12
     Клавиатурная_операция_R: Образец_клавиатурной_операции 'R' 25
 $End
-

Кроме буквенных и цифровых клавишей могут быть использованы некоторые другие клавиши. Эти клавиши с идентификаторами, которые необходимо указать для их использования в описании клавиатурных операций, приведены в таблице:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ИдентификаторКлавиша
'ESCAPE'Клавиша выхода (ESC)
'F2' - 'F12'Функциональные клавиши F2 - F12 (кроме F1, которая используется в приложениях Windows для вызова подсказки)
'TAB'Клавиша табуляции
'SHIFT'Клавиша смены регистра (Shift)
'CONTROL'Клавиша Ctrl
'BACK'Клавиша Backspace
'RETURN'Клавиша возврата (Enter)
'INSERT'Клавиша вставки (Ins)
'HOME'Клавиша перехода в начало (Home)
'PRIOR'Клавиша перемещения на страницу вверх (Page Up)
'DELETE'Клавиша удаления (Delete)
'END'Клавиша End
'NEXT'Клавиша перемещения на страницу вниз (Page Down)
'UP'Стрелка вверх
'LEFT'Стрелка влево
'DOWN'Стрелка вниз
'RIGHT'Стрелка вправо
'NUMPAD0' - 'NUMPAD9'Клавиши 0 - 9 на цифровой клавиатуре при включенной клавише Num Lock
'DIVIDE'Клавиша деления на цифровой клавиатуре
'MULTIPLY'Клавиша умножения на цифровой клавиатуре
'SUBTRACT'Клавиша вычитания на цифровой клавиатуре
'ADD'Клавиша сложения на цифровой клавиатуре
'CLEAR'Клавиша 5 на цифровой клавиатуре при отключенной клавише Num Lock
'SPACE'Пробел
'DECIMAL'Точка на цифровой клавиатуре при включенной клавише Num Lock
-
-
-

Примечание

-

Например, следующие клавиатурные операции будут выполняться при нажатии клавишей пробела, стрелки вправо и клавиши 5 на цифровой клавиатуре при включенной клавише Num Lock.

-
Клавиатурная_операция_пробел : Образец_клавиатурной_операции 'SPACE'
+        

Кроме буквенных и цифровых клавишей могут быть использованы некоторые другие клавиши. Эти клавиши с идентификаторами, которые необходимо указать для их использования в описании клавиатурных операций, приведены в таблице:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ИдентификаторКлавиша
'ESCAPE'Клавиша выхода (ESC)
'F2' - 'F12'Функциональные клавиши F2 - F12 (кроме F1, которая используется в приложениях Windows для вызова подсказки)
'TAB'Клавиша табуляции
'SHIFT'Клавиша смены регистра (Shift)
'CONTROL'Клавиша Ctrl
'BACK'Клавиша Backspace
'RETURN'Клавиша возврата (Enter)
'INSERT'Клавиша вставки (Ins)
'HOME'Клавиша перехода в начало (Home)
'PRIOR'Клавиша перемещения на страницу вверх (Page Up)
'DELETE'Клавиша удаления (Delete)
'END'Клавиша End
'NEXT'Клавиша перемещения на страницу вниз (Page Down)
'UP'Стрелка вверх
'LEFT'Стрелка влево
'DOWN'Стрелка вниз
'RIGHT'Стрелка вправо
'NUMPAD0' - 'NUMPAD9'Клавиши 0 - 9 на цифровой клавиатуре при включенной клавише Num Lock
'DIVIDE'Клавиша деления на цифровой клавиатуре
'MULTIPLY'Клавиша умножения на цифровой клавиатуре
'SUBTRACT'Клавиша вычитания на цифровой клавиатуре
'ADD'Клавиша сложения на цифровой клавиатуре
'CLEAR'Клавиша 5 на цифровой клавиатуре при отключенной клавише Num Lock
'SPACE'Пробел
'DECIMAL'Точка на цифровой клавиатуре при включенной клавише Num Lock
+
+
+

Примечание

+

Например, следующие клавиатурные операции будут выполняться при нажатии клавишей пробела, стрелки вправо и клавиши 5 на цифровой клавиатуре при включенной клавише Num Lock.

+
Клавиатурная_операция_пробел : Образец_клавиатурной_операции 'SPACE'
 Клавиатурная_операция_стрелка: Образец_клавиатурной_операции 'RIGHT'
 Клавиатурная_операция_5_цифр : Образец_клавиатурной_операции 'NUMPAD5'
-

Все перечисленные выше клавиши (кроме Shift и Ctrl) могут быть использованы совместно с управляющими клавишами Shift и Ctrl, а также с двумя этими клавишами, нажатыми одновременно. Приведенные ниже примеры показывают способ записи комбинаций клавишей при описании клавиатурных операций.

-
Shift_стрелка     : Образец_клав_операции 'SHIFT' + 'RIGHT'
+        

Все перечисленные выше клавиши (кроме Shift и Ctrl) могут быть использованы совместно с управляющими клавишами Shift и Ctrl, а также с двумя этими клавишами, нажатыми одновременно. Приведенные ниже примеры показывают способ записи комбинаций клавишей при описании клавиатурных операций.

+
Shift_стрелка     : Образец_клав_операции 'SHIFT' + 'RIGHT'
 Ctrl_стрелка      : Образец_клав_операции 'CONTROL' + 'RIGHT'
 Shift_Ctrl_стрелка: Образец_клав_операции 'SHIFT' + 'CONTROL' + 'RIGHT'
-

Описанные выше клавиатурные операции будут выполняться при одновременном нажатии двух клавишей Shift и стрелка вправо, Ctrl и стрелка вправо, при одновременном нажатии трех клавишей - Shift, Ctrl и стрелка вправо.

-

Клавиатурная операция может не иметь кода клавиши. В этом случае при ее описании вместо кода клавиши указывается слово 'NOKEY'. Такие клавиатурные операции используются в том случае, когда для их инициирования используются активные области в кадре анимации и нет необходимости в назначении клавишей.

-

Каждая комбинация клавишей может быть присвоена только одной клавиатурной операции. Запрещенными являются следующие комбинации, используемые в РДО-имитаторе для переключения режимов моделирования:

-
    -
  • 'CONTROL' + 'A'
  • -
  • 'SHIFT' + 'CONTROL' + 'A'
  • -
  • 'CONTROL' + 'R'
  • -
  • 'SHIFT' + 'CONTROL' + 'R'
  • -
  • 'CONTROL' + 'M'
  • -
  • 'SHIFT' + 'CONTROL' + 'M'
  • -
-

Активные области, инициирующие выполнение клавиатурных операций при нажатии кнопки мыши, описывают в объекте кадров анимации.

-
-
+

Описанные выше клавиатурные операции будут выполняться при одновременном нажатии двух клавишей Shift и стрелка вправо, Ctrl и стрелка вправо, при одновременном нажатии трех клавишей - Shift, Ctrl и стрелка вправо.

+

Клавиатурная операция может не иметь кода клавиши. В этом случае при ее описании вместо кода клавиши указывается слово 'NOKEY'. Такие клавиатурные операции используются в том случае, когда для их инициирования используются активные области в кадре анимации и нет необходимости в назначении клавишей.

+

Каждая комбинация клавишей может быть присвоена только одной клавиатурной операции. Запрещенными являются следующие комбинации, используемые в РДО-имитаторе для переключения режимов моделирования:

+
    +
  • 'CONTROL' + 'A'
  • +
  • 'SHIFT' + 'CONTROL' + 'A'
  • +
  • 'CONTROL' + 'R'
  • +
  • 'SHIFT' + 'CONTROL' + 'R'
  • +
  • 'CONTROL' + 'M'
  • +
  • 'SHIFT' + 'CONTROL' + 'M'
  • +
+

Активные области, инициирующие выполнение клавиатурных операций при нажатии кнопки мыши, описывают в объекте кадров анимации.

+
+

См. также

-

Описание образцов

-

Описание символьных констант, функций и последовательностей

-

Тип образца "Продукционное правило"

-

Тип образца "Операция"

-

Трассировка состояния объектов РДО

+

Описание образцов

+

Описание символьных констант, функций и последовательностей

+

Тип образца "Продукционное правило"

+

Тип образца "Операция"

+

Трассировка состояния объектов РДО

-
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_opr.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_opr.htm index 7d3a0ab71..951ed45a2 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_opr.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_opr.htm @@ -9,21 +9,21 @@

ОПЕРАЦИЯ/ДЕЙСТВИЕ

-

Образцы типа operation описывают модифицированные продукционные правила, учитывающие временные связи. Операция описывает предусловия, которым должно удовлетворять состояние участвующих в операции ресурсов и правила изменения состояния ресурсов в начале и конце соответствующего действия.

-

Образец типа operation содержит список релевантных ресурсов (то есть ресурсов, участвующих в описываемой образцом операции), предусловия начала операции (задаваемые по значениям параметров релевантных ресурсов) и конверторы преобразования образцов,участвующих в операции, в ее начале и в конце. В данном типе образцов имеются также выражения, по которым вычисляются длительности выполнения операций, описываемых данными образцами.

-

Формат образца:

-
$Pattern <имя_образца>: operation [<признак_трассировки>]
+        

Образцы типа operation описывают модифицированные продукционные правила, учитывающие временные связи. Операция описывает предусловия, которым должно удовлетворять состояние участвующих в операции ресурсов и правила изменения состояния ресурсов в начале и конце соответствующего действия.

+

Образец типа operation содержит список релевантных ресурсов (то есть ресурсов, участвующих в описываемой образцом операции), предусловия начала операции (задаваемые по значениям параметров релевантных ресурсов) и конверторы преобразования образцов,участвующих в операции, в ее начале и в конце. В данном типе образцов имеются также выражения, по которым вычисляются длительности выполнения операций, описываемых данными образцами.

+

Формат образца:

+
$Pattern <имя_образца>: operation [<признак_трассировки>]
 [$Parameters
     <описание_параметров_образца>]
 $Relevant_resources
@@ -34,17 +34,17 @@ 

ОПЕРАЦИЯ/ДЕЙСТВИЕ

<тело_образца> $End
-
тело_образца
-
Тело событий и образцов имеет следующий формат: -
<имя_релевантного_ресурса>:
+        
тело_образца
+
Тело событий и образцов имеет следующий формат: +
<имя_релевантного_ресурса>:
     <предусловие>
     [Convert_begin
         <список_инструкций>]
     [Convert_end
         <список_инструкций>]
-
-
имя_релевантного_ресурса
-
Имена релевантных ресурсов должны следовать в том порядке, в котором они указаны в описании релевантных ресурсов.
+
+
имя_релевантного_ресурса
+
Имена релевантных ресурсов должны следовать в том порядке, в котором они указаны в описании релевантных ресурсов.
предусловие
Предусловие записывают в следующем формате:
Choice from <логическое_выражение>
@@ -67,12 +67,12 @@ 

ОПЕРАЦИЯ/ДЕЙСТВИЕ

<инструкция>; {<инструкция>;}

Все инструкции могут быть указаны в произвольном порядке. Вычисление новых значений параметров релевантных ресурсов происходит в том порядке, в котором следуют их инструкции присваивания. Если нет ни одной инструкции присваивания, которая относится к данному параметру, то подразумевается, что значение этого параметра не изменяется. Для ресурсов, имеющих статус конвертора Create, задание новых значений каждого параметра обязательны, за исключением случая, когда для параметра указано значение по умолчанию в описании типа ресурса.

-
+
-
-

Пример

- -
+
diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_rule.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_rule.htm index bdbcac6b2..d5682f377 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_rule.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_obj/rdo_pat_type/rdo_pat_type_rule.htm @@ -9,20 +9,20 @@

ПРОДУКЦИОННОЕ ПРАВИЛО

-

Образцы типа rule описывают обычные продукционные правила. Они служат для изменения состояния ресурса в зависимости от того, какое действие он выполняет. В отличие от образцов типа operation этот образец не имеет выражения для вычисления времени операции. Это связано с тем, что действие выполняется мгновенно, как только выполняются предусловия образца по всем релевантным ресурсам.

-

Образец типа rule содержит список релевантных ресурсов, предусловия начала операции (задаваемые по значениям релевантных ресурсов) и конвертор преобразования состояния ресурсов,участвующих в операции. Описание имеет следующий формат:

-
$Pattern <имя_образца>: rule [<признак_трассировки>]
+        

Образцы типа rule описывают обычные продукционные правила. Они служат для изменения состояния ресурса в зависимости от того, какое действие он выполняет. В отличие от образцов типа operation этот образец не имеет выражения для вычисления времени операции. Это связано с тем, что действие выполняется мгновенно, как только выполняются предусловия образца по всем релевантным ресурсам.

+

Образец типа rule содержит список релевантных ресурсов, предусловия начала операции (задаваемые по значениям релевантных ресурсов) и конвертор преобразования состояния ресурсов,участвующих в операции. Описание имеет следующий формат:

+
$Pattern <имя_образца>: rule [<признак_трассировки>]
 [$Parameters
     <описание_параметров_образца>]
 $Relevant_resources
@@ -31,44 +31,44 @@ 

ПРОДУКЦИОННОЕ ПРАВИЛО

$Body <тело_образца> $End
-
-
тело_образца
-
Тело событий и образцов имеет следующий формат: -
<имя_релевантного_ресурса>:
+        
+
тело_образца
+
Тело событий и образцов имеет следующий формат: +
<имя_релевантного_ресурса>:
 <предусловие>
 [Convert_rule
     <список_инструкций>]
-
-
имя_релевантного_ресурса
-
Имена релевантных ресурсов должны следовать в том порядке, в котором они указаны в описании релевантных ресурсов.
-
предусловие
-
Предусловие записывают в следующем формате: -
Choice from <логическое_выражение>
+                
+
имя_релевантного_ресурса
+
Имена релевантных ресурсов должны следовать в том порядке, в котором они указаны в описании релевантных ресурсов.
+
предусловие
+
Предусловие записывают в следующем формате: +
Choice from <логическое_выражение>
 [<способ_выбора>]
или
Choice NoCheck
 [<способ_выбора>]
-
-
логическое_выражение
-
Логическое выражение определяет предусловие использования ресурса (возможность выполнения операции или правила). Если нет необходимости в предусловии, то это указывают зарезервированным словом NoCheck или вообще отсутствием Choice from.
-
способ_выбора
-
Способ выбора задается также, как и после описания релевантных ресурсов образца. Если он не указан после описания релевантных ресурсов образца, он может быть указан в теле образца для каждого релевантного ресурса после логического выражения. Способ выбора может быть задан также в случае, когда описатель релевантного ресурса есть имя конкретного ресурса и не существует альтернативы выбора. При этом можно использовать любой способ выбора: все равно он не будет учитываться, и результат будет одинаковым. Если состояние этого ресурса удовлетворяет предусловию, то ресурс может быть использован независимо от способа выбора, если же не удовлетворяет, то также независимо от способа выбора ресурс не может быть использован. Если способ выбора не указан, то по умолчанию используется first. -

Если способ выбора указан после описания релевантных ресурсов образца, в теле образца он должен отсутствовать для всех релевантных ресурсов.

-
-
-
-
список_инструкций
-
Список инструкций и указанное перед ним зарезервированное слово должны присутствовать в образце в том случае, если соответствующий статус конвертора, указанный при описании релевантных ресурсов, есть Keep или Create. Если статус конвертора есть Erase, то список инструкций может быть пустым или наоборот содержать инструкции, которые требуется выполнить для сбора статистики в момент удаления ресурса. Если статус конвертора есть Create, то после зарезервированного слова может быть указан признак трассировки для создаваемого ресурса. -

Список инструкций записывают в следующем формате:

-
<инструкция>; {<инструкция>;}
-

Все инструкции могут быть указаны в произвольном порядке. Вычисление новых значений параметров релевантных ресурсов происходит в том порядке, в котором следуют их инструкции присваивания. Если нет ни одной инструкции присваивания, которая относится к данному параметру, то подразумевается, что значение этого параметра не изменяется. Для ресурсов, имеющих статус конвертора Create, задание новых значений каждого параметра обязательны, за исключением случая, когда для параметра указано значение по умолчанию в описании типа ресурса.

-
-
-
-
-

Пример

-
+
список_инструкций
+
Список инструкций и указанное перед ним зарезервированное слово должны присутствовать в образце в том случае, если соответствующий статус конвертора, указанный при описании релевантных ресурсов, есть Keep или Create. Если статус конвертора есть Erase, то список инструкций может быть пустым или наоборот содержать инструкции, которые требуется выполнить для сбора статистики в момент удаления ресурса. Если статус конвертора есть Create, то после зарезервированного слова может быть указан признак трассировки для создаваемого ресурса. +

Список инструкций записывают в следующем формате:

+
<инструкция>; {<инструкция>;}
+

Все инструкции могут быть указаны в произвольном порядке. Вычисление новых значений параметров релевантных ресурсов происходит в том порядке, в котором следуют их инструкции присваивания. Если нет ни одной инструкции присваивания, которая относится к данному параметру, то подразумевается, что значение этого параметра не изменяется. Для ресурсов, имеющих статус конвертора Create, задание новых значений каждого параметра обязательны, за исключением случая, когда для параметра указано значение по умолчанию в описании типа ресурса.

+
+
+
+
+

Пример

+ -

См. также

-

Описание образцов

-

Описание символьных констант, функций и последовательностей

-

Тип образца "Операция"

-

Тип образца "Клавиатурная операция"

-

Трассировка состояния объектов РДО

+

См. также

+

Описание образцов

+

Описание символьных констант, функций и последовательностей

+

Тип образца "Операция"

+

Тип образца "Клавиатурная операция"

+

Трассировка состояния объектов РДО

-
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_intro.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_intro.htm index 56c903661..8b4595f78 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_intro.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_intro.htm @@ -8,12 +8,12 @@ -
-

РЕЗУЛЬТАТЫ МОДЕЛИРОВАНИЯ

-

В результате работы РДО-имитатора могут быть созданы объекты результатов и трассировки.

-

Если в объекте прогона не указан дескриптор Results_file, то объект результатов не создается.

-

Если в объекте прогона не указан дескриптор Trace_file, то объект трассировки не создается.

-
-
+
+

РЕЗУЛЬТАТЫ МОДЕЛИРОВАНИЯ

+

В результате работы РДО-имитатора могут быть созданы объекты результатов и трассировки.

+

Если в объекте прогона не указан дескриптор Results_file, то объект результатов не создается.

+

Если в объекте прогона не указан дескриптор Trace_file, то объект трассировки не создается.

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_pmv.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_pmv.htm index 3447a3d99..579e32709 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_pmv.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_pmv.htm @@ -8,10 +8,10 @@ -
-

ОБЪЕКТ РЕЗУЛЬТАТОВ

-

Объект результатов (с расширением .pmv) создается РДО-имитатором, если в прогоне присутствует объект описания требуемых показателей. Он имеет следующий формат:

-
Results_file   = <имя_объекта_результатов>.pmv <дата_создания>
+    
+

ОБЪЕКТ РЕЗУЛЬТАТОВ

+

Объект результатов (с расширением .pmv) создается РДО-имитатором, если в прогоне присутствует объект описания требуемых показателей. Он имеет следующий формат:

+
Results_file   = <имя_объекта_результатов>.pmv <дата_создания>
 Run_file       = <имя_прогона>.smr
 Model_name     = <имя_модели>
 Resource_file  = <имя_объекта_ресурсов>.rss
@@ -25,141 +25,141 @@ 

ОБЪЕКТ РЕЗУЛЬТАТОВ

<время_счета> <служебная_информация> <результирующие_статистики>
-
-
имя_объекта_результатов
-
Имя данного объекта результатов.
-
дата_создания
-
Дата создания данного объекта результатов.
-
имя_прогона
-
Имя объекта прогона, использовавшегося при моделировании.
-
имя_модели, имя_объекта_ресурсов, имя_объекта_операций
-
Имена модели, объекта ресурсов и объекта точек принятия решений - это имена, заданные в объекте прогона.
-
список_изменений
-
Список изменений содержит имена и заданные в объекте прогона новые значения символьных констант, параметров ресурсов и баз генераторов последовательностей.
-
статус_окончания_моделирования
-
Статус окончания моделирования описывает причину завершения моделирования и может быть одним из следующих:
- - - - - - - - - - - - - - - - - - - - - -
СтатусОписание
NORMAL_TERMINATIONНормальное завершение моделирования при выполнении условия окончания моделирования, заданного в прогоне
NO_MORE_EVENTSНет больше событий в модели
USER_BREAKМоделирование завершилось из-за вмешательства пользователя, который завершил РДО-имитатор
RUN_TIME_ERRORМоделирование завершилось из-за ошибки во время счета (информация об ошибке выводится в окно диалога РДО-имитатора)
- -
время_счета
-
Время счета - это физическая длительность прогона в секундах.
-
служебная_информация
-
Служебная информация содержит данные, характеризующие сложность имитационной модели и быстродействие компьютера. Сюда входит количество событий в модели за время счета EventCount, количество проверок предусловий образцов OperRuleCheckCounter, количества вычислений арифметических AExpCalcCounter и логических BExpCalcCounter выражений, а также эти величины, отнесенные к часу модельного времени и к секунде счета компьютера.
-
результирующие_статистики
-
Результирующие статистики по каждому показателю выводятся на отдельной строке в порядке следования показателей в объекте описания показателей. Формат этой строки зависит от вида показателя. +
+
имя_объекта_результатов
+
Имя данного объекта результатов.
+
дата_создания
+
Дата создания данного объекта результатов.
+
имя_прогона
+
Имя объекта прогона, использовавшегося при моделировании.
+
имя_модели, имя_объекта_ресурсов, имя_объекта_операций
+
Имена модели, объекта ресурсов и объекта точек принятия решений - это имена, заданные в объекте прогона.
+
список_изменений
+
Список изменений содержит имена и заданные в объекте прогона новые значения символьных констант, параметров ресурсов и баз генераторов последовательностей.
+
статус_окончания_моделирования
+
Статус окончания моделирования описывает причину завершения моделирования и может быть одним из следующих:
+ + + + + + + + + + + + + + + + + + + + + +
СтатусОписание
NORMAL_TERMINATIONНормальное завершение моделирования при выполнении условия окончания моделирования, заданного в прогоне
NO_MORE_EVENTSНет больше событий в модели
USER_BREAKМоделирование завершилось из-за вмешательства пользователя, который завершил РДО-имитатор
RUN_TIME_ERRORМоделирование завершилось из-за ошибки во время счета (информация об ошибке выводится в окно диалога РДО-имитатора)
+
+
время_счета
+
Время счета - это физическая длительность прогона в секундах.
+
служебная_информация
+
Служебная информация содержит данные, характеризующие сложность имитационной модели и быстродействие компьютера. Сюда входит количество событий в модели за время счета EventCount, количество проверок предусловий образцов OperRuleCheckCounter, количества вычислений арифметических AExpCalcCounter и логических BExpCalcCounter выражений, а также эти величины, отнесенные к часу модельного времени и к секунде счета компьютера.
+
результирующие_статистики
+
Результирующие статистики по каждому показателю выводятся на отдельной строке в порядке следования показателей в объекте описания показателей. Формат этой строки зависит от вида показателя. -

watch_par

-
<имя_показателя>  Тип: par  Посл.знач.: <текущее_значение>  Ср.знач.: <среднее_значение>
+                

watch_par

+
<имя_показателя>  Тип: par  Посл.знач.: <текущее_значение>  Ср.знач.: <среднее_значение>
     Мин.знач.: <минимальное_значение>  Макс.знач.: <максимальное_значение>
     Числ.наб.: <число_наблюдений>  Стд.откл.: <стандартное отклонение>
     К.вар.%: <коэффициент вариации>  Медиана: <медиана>
-
Длина_очереди  Тип: par  Посл.знач.: 0  Ср.знач.: 0.585730  Мин.знач.: 0  Макс.знач.: 5  Числ.наб.: 307  Стд.откл.: 1.045320  К.вар.%: 186.552399  Медиана: 0.000052
-

Каждое наблюдение представляет собой произведение длительности интервала, на протяжении которого значение параметра не изменялось, и значения параметра.

-
-
имя_показателя
-
Имя данного показателя, описанного в объекте показателей.
-
текущее_значение
-
Текущее значение - это значение параметра в момент вывода объекта результатов.
-
число_наблюдений
-
Число наблюдений - это число изменений значения параметра.
-
среднее_значение
-
Среднее значение вычисляется как сумма наблюдений, деленная на длительность интервала наблюдения, т.е. представляет собой усредненное по времени значение параметра.
-
минимальное_значение, максимальное_значение
-
Минимальное и максимальное значения - это минимальное и максимальное значения параметра за время наблюдения.
-
+
Длина_очереди  Тип: par  Посл.знач.: 0  Ср.знач.: 0.585730  Мин.знач.: 0  Макс.знач.: 5  Числ.наб.: 307  Стд.откл.: 1.045320  К.вар.%: 186.552399  Медиана: 0.000052
+

Каждое наблюдение представляет собой произведение длительности интервала, на протяжении которого значение параметра не изменялось, и значения параметра.

+
+
имя_показателя
+
Имя данного показателя, описанного в объекте показателей.
+
текущее_значение
+
Текущее значение - это значение параметра в момент вывода объекта результатов.
+
число_наблюдений
+
Число наблюдений - это число изменений значения параметра.
+
среднее_значение
+
Среднее значение вычисляется как сумма наблюдений, деленная на длительность интервала наблюдения, т.е. представляет собой усредненное по времени значение параметра.
+
минимальное_значение, максимальное_значение
+
Минимальное и максимальное значения - это минимальное и максимальное значения параметра за время наблюдения.
+
-

watch_state

-
<имя_показателя>  Тип: state  Посл.знач.: <текущее_значение>  % соотв.: <среднее_значение>
+                

watch_state

+
<имя_показателя>  Тип: state  Посл.знач.: <текущее_значение>  % соотв.: <среднее_значение>
     Мин.длит.: <минимальное_значение>  Макс.длит.: <максимальное_значение>
     Числ.наб.: <число_наблюдений>
-
Занятость_парикмахера_1  Тип: state  Посл.знач.: FALSE  % соотв.: 0.128582  Мин.длит.: 20.021139  Макс.длит.: 22.963191  Числ.наб.: 30
-
-
имя_показателя
-
Имя данного показателя, описанного в объекте показателей.
-
текущее_значение
-
Текущее значение - это значение логического выражения для данного показателя в момент вывода объекта результатов (TRUE - ИСТИНА, FALSE - ЛОЖЬ).
-
число_наблюдений
-
Число наблюдений представляет собой число интервалов, на которых состояние системы удовлетворяло условию (число раз, когда логическое выражение приобретало значение ИСТИНА).
-
среднее_значение
-
Среднее значение есть отношение времени, в течение которого состояние системы на интервале сбора удовлетворяло условию, к длительности интервала сбора показателя.
-
минимальное_значение, максимальное_значение
-
Минимальное и максимальное значения - это минимальная и максимальная длительность интервала за время наблюдения (сбора показателя).
-
+
Занятость_парикмахера_1  Тип: state  Посл.знач.: FALSE  % соотв.: 0.128582  Мин.длит.: 20.021139  Макс.длит.: 22.963191  Числ.наб.: 30
+
+
имя_показателя
+
Имя данного показателя, описанного в объекте показателей.
+
текущее_значение
+
Текущее значение - это значение логического выражения для данного показателя в момент вывода объекта результатов (TRUE - ИСТИНА, FALSE - ЛОЖЬ).
+
число_наблюдений
+
Число наблюдений представляет собой число интервалов, на которых состояние системы удовлетворяло условию (число раз, когда логическое выражение приобретало значение ИСТИНА).
+
среднее_значение
+
Среднее значение есть отношение времени, в течение которого состояние системы на интервале сбора удовлетворяло условию, к длительности интервала сбора показателя.
+
минимальное_значение, максимальное_значение
+
Минимальное и максимальное значения - это минимальная и максимальная длительность интервала за время наблюдения (сбора показателя).
+
-

watch_quant

-
<имя_показателя>  Тип: quant  Посл.знач.: <текущее_значение>  Ср.знач.: <среднее_значение>
+                

watch_quant

+
<имя_показателя>  Тип: quant  Посл.знач.: <текущее_значение>  Ср.знач.: <среднее_значение>
     Мин.знач.: <минимальное_значение>  Макс.знач.: <максимальное_значение>
     Числ.наб.: <число_наблюдений>  Стд.откл.: <стандартное отклонение>
     К.вар.%: <коэффициент вариации>  Медиана: <медиана>
-
Клиенты_1  Тип: quant  Посл.знач.: 1  Ср.знач.: 1.901105  Мин.знач.: 0  Макс.знач.: 7  Числ.наб.: 306  Стд.откл.: 1.640604  К.вар.%: 141.579917  Медиана: 1.625463
-

Каждое наблюдение представляет собой произведение длительности интервала, на протяжении которого число ресурсов не изменялось, и числа ресурсов.

-
-
имя_показателя
-
Имя данного показателя, описанного в объекте показателей.
-
текущее_значение
-
Текущее значение - это значение числа ресурсов в момент вывода объекта результатов.
-
число_наблюдений
-
Число наблюдений - это число изменений числа ресурсов.
-
среднее_значение
-
Среднее значение вычисляется как сумма наблюдений, деленная на длительность интервала наблюдения, т.е. представляет собой усредненное по времени число ресурсов.
-
минимальное_значение, максимальное_значение
-
Минимальное и максимальное значения - это минимальное и максимальное значения числа ресурсов за время наблюдения.
-
+
Клиенты_1  Тип: quant  Посл.знач.: 1  Ср.знач.: 1.901105  Мин.знач.: 0  Макс.знач.: 7  Числ.наб.: 306  Стд.откл.: 1.640604  К.вар.%: 141.579917  Медиана: 1.625463
+

Каждое наблюдение представляет собой произведение длительности интервала, на протяжении которого число ресурсов не изменялось, и числа ресурсов.

+
+
имя_показателя
+
Имя данного показателя, описанного в объекте показателей.
+
текущее_значение
+
Текущее значение - это значение числа ресурсов в момент вывода объекта результатов.
+
число_наблюдений
+
Число наблюдений - это число изменений числа ресурсов.
+
среднее_значение
+
Среднее значение вычисляется как сумма наблюдений, деленная на длительность интервала наблюдения, т.е. представляет собой усредненное по времени число ресурсов.
+
минимальное_значение, максимальное_значение
+
Минимальное и максимальное значения - это минимальное и максимальное значения числа ресурсов за время наблюдения.
+
-

watch_value

-
<имя_показателя>  Тип: value  Ср.знач.: <среднее_значение>
+                

watch_value

+
<имя_показателя>  Тип: value  Ср.знач.: <среднее_значение>
     Мин.знач.: <минимальное_значение>  Макс.знач.: <максимальное_значение>
     Числ.наб.: <число_наблюдений>  Стд.откл.: <стандартное отклонение>
     К.вар.%: <коэффициент вариации>  Медиана: <медиана>
-
Клиенты_3  Тип: value  Ср.знач.: 1.000000  Мин.знач.: 1  Макс.знач.: 1  Числ.наб.: 152  Стд.откл.: нет данных  К.вар.%: нет данных  Медиана: 1.000000
-

Каждое наблюдение представляет собой значение арифметического выражения в момент уничтожения временного ресурса.

-
-
имя_показателя
-
Имя данного показателя, описанного в объекте показателей.
-
число_наблюдений
-
Число наблюдений - это число уничтоженных временных ресурсов, состояние которых удовлетворяло условию.
-
среднее_значение
-
Среднее значение вычисляется как сумма наблюдений, деленная на число наблюдений.
-
минимальное_значение, максимальное_значение
-
Минимальное и максимальное значения - это минимальное и максимальное значения арифметического выражения за время наблюдения.
-
+
Клиенты_3  Тип: value  Ср.знач.: 1.000000  Мин.знач.: 1  Макс.знач.: 1  Числ.наб.: 152  Стд.откл.: нет данных  К.вар.%: нет данных  Медиана: 1.000000
+

Каждое наблюдение представляет собой значение арифметического выражения в момент уничтожения временного ресурса.

+
+
имя_показателя
+
Имя данного показателя, описанного в объекте показателей.
+
число_наблюдений
+
Число наблюдений - это число уничтоженных временных ресурсов, состояние которых удовлетворяло условию.
+
среднее_значение
+
Среднее значение вычисляется как сумма наблюдений, деленная на число наблюдений.
+
минимальное_значение, максимальное_значение
+
Минимальное и максимальное значения - это минимальное и максимальное значения арифметического выражения за время наблюдения.
+
-

get_value

-
<имя_показателя>  Тип: get_value  Значение: <значение>
-
Обслужено_парикмахером_1  Тип: get_value  Значение: 30
-
-
имя_показателя
-
Имя данного показателя, описанного в объекте показателей.
-
значение
-
Значение есть значение арифметического выражения в момент вывода объекта результатов.
-
-
-
-

См. также

-

Объект описания показателей

-

Объект прогона

-

Объект трассировки

-
-
+

get_value

+
<имя_показателя>  Тип: get_value  Значение: <значение>
+
Обслужено_парикмахером_1  Тип: get_value  Значение: 30
+
+
имя_показателя
+
Имя данного показателя, описанного в объекте показателей.
+
значение
+
Значение есть значение арифметического выражения в момент вывода объекта результатов.
+
+ + +

См. также

+

Объект описания показателей

+

Объект прогона

+

Объект трассировки

+
+
\ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trace_descr.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trace_descr.htm index d5780551d..0c670c1c6 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trace_descr.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trace_descr.htm @@ -8,62 +8,62 @@ -
-

ТРАССИРОВКА СОСТОЯНИЯ ОБЪЕКТОВ РДО

-

В РДО можно производить трассировку:

-
  • событий и образцов
  • -
  • точек принятия решений
  • -
  • ресурсов
  • -
  • показателей

  • -
    Для указанных объектов может быть указан признак трассировки (подробнее смотри описание трассировки). -

    Для событий, образцов, ресурсов, показателей и точек принятия решений типа some и prior признак задают одним из двух зарезервированных слов:

    - - - - - - - - - - - - - -
    ЗначениеОписание
    traceПроизводить трассировку объекта
    no_traceНе производить трассировку объекта

    -

    Для точек принятия решений типа search признак трассировки может быть одним из следующих:

    - - - - - - - - - - - - - - - - - - - - - -
    ЗначениеОписание
    no_traceНе производить трассировку точки
    trace_statВыдавать в объект трассировки только статистическую информацию по процессу поиска на графе
    trace_topsВыдавать в объект трассировки статистическую информацию по процессу поиска и информацию о всех вершинах графа поиска
    trace_allВыдавать в объект трассировки статистическую информацию по процессу поиска, информацию о всех вершинах графа поиска и для каждой вершины новое состояние всех ресурсов, изменивших свое состояние при применении правила, породившего эту вершину
    -

    Значением признака трассировки по умолчанию является значение no_trace. Остальные значения признака трассировки имеют смысл только для точек типа search.

    -

    По умолчанию принимается значение признака no_trace, поэтому это значение можно не указывать.

    -

    См. также

    -

    Объект трассировки

    -

    Трассировка точек принятия решений

    -

    Трассировка событий

    -

    Трассировка состояния ресурсов

    -

    Трассировка показателей

    -
    -
    -
    +
    +

    ТРАССИРОВКА СОСТОЯНИЯ ОБЪЕКТОВ РДО

    +

    В РДО можно производить трассировку:

    +
  • событий и образцов
  • +
  • точек принятия решений
  • +
  • ресурсов
  • +
  • показателей

  • +
    Для указанных объектов может быть указан признак трассировки (подробнее смотри описание трассировки). +

    Для событий, образцов, ресурсов, показателей и точек принятия решений типа some и prior признак задают одним из двух зарезервированных слов:

    + + + + + + + + + + + + + +
    ЗначениеОписание
    traceПроизводить трассировку объекта
    no_traceНе производить трассировку объекта

    +

    Для точек принятия решений типа search признак трассировки может быть одним из следующих:

    + + + + + + + + + + + + + + + + + + + + + +
    ЗначениеОписание
    no_traceНе производить трассировку точки
    trace_statВыдавать в объект трассировки только статистическую информацию по процессу поиска на графе
    trace_topsВыдавать в объект трассировки статистическую информацию по процессу поиска и информацию о всех вершинах графа поиска
    trace_allВыдавать в объект трассировки статистическую информацию по процессу поиска, информацию о всех вершинах графа поиска и для каждой вершины новое состояние всех ресурсов, изменивших свое состояние при применении правила, породившего эту вершину
    +

    Значением признака трассировки по умолчанию является значение no_trace. Остальные значения признака трассировки имеют смысл только для точек типа search.

    +

    По умолчанию принимается значение признака no_trace, поэтому это значение можно не указывать.

    +

    См. также

    +

    Объект трассировки

    +

    Трассировка точек принятия решений

    +

    Трассировка событий

    +

    Трассировка состояния ресурсов

    +

    Трассировка показателей

    +
    +
    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc.htm index 91a855292..e82076305 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc.htm @@ -8,10 +8,10 @@ -
    -

    ОБЪЕКТ ТРАССИРОВКИ

    -

    Объект трассировки (с расширением .trc) создается РДО-имитатором, если в объекте прогона присутствует дескриптор, задающий имя объекта трассировки. Объект имеет следующий формат:

    -
    Results_file   = <имя_объекта_результатов>.pmv <дата_создания>
    +    
    +

    ОБЪЕКТ ТРАССИРОВКИ

    +

    Объект трассировки (с расширением .trc) создается РДО-имитатором, если в объекте прогона присутствует дескриптор, задающий имя объекта трассировки. Объект имеет следующий формат:

    +
    Results_file   = <имя_объекта_результатов>.pmv <дата_создания>
     Run_file       = <имя_прогона>.smr
     Model_name     = <имя_модели>
     Resource_file  = <имя_объекта_ресурсов>.rss
    @@ -28,57 +28,57 @@ 

    ОБЪЕКТ ТРАССИРОВКИ

    $Status = <статус_окончания_моделирования> <модельное_время_окончания> {<статистика_по_поиску_на_графе>}
    -
    -
    имя_объекта_результатов
    -
    Имя объекта результатов, созданного РДО-имитатором.
    -
    дата_создания
    -
    Дата создания данного объекта трассировки.
    -
    имя_прогона
    -
    Имя объекта прогона, использовавшегося при моделировании.
    -
    имя_модели, имя_объекта_ресурсов, имя_объекта_операций
    -
    Имена модели, объекта ресурсов и объекта точек принятия решений - это имена, заданные в объекте прогона.
    -
    список_изменений
    -
    Список изменений содержит имена и заданные в объекте прогона новые значения символьных констант, параметров ресурсов и баз генераторов последовательностей.
    -
    описание_трассируемого_показателя
    -
    Описание трассируемого показателя приводится только для тех показателей, для которых в объекте описания показателей задан признак трассировки trace. Описание трассируемого показателя имеет формат: -
    <имя_показателя> <номер_показателя> <вид_показателя>
    -
    -
    имя_показателя
    -
    Имя показателя - это одно из имен, заданных в объекте описания показателей.
    -
    номер_показателя, вид_показателя
    -
    Номер показателя определяется порядком описания показателей в этом объекте, вид показателя также описан в этом объекте.
    -
    -
    -
    трассировка
    -
    Трассировка содержит информацию четырех видов: трассировку событий, трассировку состояния ресурсов, трассировку показателей и трассировку точек принятия решений. Трассировка выдается только если текущее модельное время больше или равно времени начала трассировки и меньше или равно времени окончания трассировки, а также если в соответствующем объекте (ресурсе, образце, показателе или точке принятия решений) явно указан признак трассировки.
    -
    статус_окончания_моделирования
    -
    Статус окончания моделирования описывает причину завершения моделирования и может быть одним из следующих:
    - - - - - - - - - - - - - - - - - - - - - -
    СтатусОписание
    NORMAL_TERMINATIONНормальное завершение моделирования при выполнении условия окончания моделирования, заданного в прогоне
    NO_MORE_EVENTSНет больше событий в модели
    USER_BREAKМоделирование завершилось из-за вмешательства пользователя, который завершил РДО-имитатор
    RUN_TIME_ERRORМоделирование завершилось из-за ошибки во время счета (информация об ошибке выводится в окно диалога РДО-имитатора)
    - -
    статистика_по_поиску_на_графе
    -
    Статистика по поиску на графе для каждой точки принятия решений типа search имеет следующий формат: -
    DPS_C
    +        
    +
    имя_объекта_результатов
    +
    Имя объекта результатов, созданного РДО-имитатором.
    +
    дата_создания
    +
    Дата создания данного объекта трассировки.
    +
    имя_прогона
    +
    Имя объекта прогона, использовавшегося при моделировании.
    +
    имя_модели, имя_объекта_ресурсов, имя_объекта_операций
    +
    Имена модели, объекта ресурсов и объекта точек принятия решений - это имена, заданные в объекте прогона.
    +
    список_изменений
    +
    Список изменений содержит имена и заданные в объекте прогона новые значения символьных констант, параметров ресурсов и баз генераторов последовательностей.
    +
    описание_трассируемого_показателя
    +
    Описание трассируемого показателя приводится только для тех показателей, для которых в объекте описания показателей задан признак трассировки trace. Описание трассируемого показателя имеет формат: +
    <имя_показателя> <номер_показателя> <вид_показателя>
    +
    +
    имя_показателя
    +
    Имя показателя - это одно из имен, заданных в объекте описания показателей.
    +
    номер_показателя, вид_показателя
    +
    Номер показателя определяется порядком описания показателей в этом объекте, вид показателя также описан в этом объекте.
    +
    +
    +
    трассировка
    +
    Трассировка содержит информацию четырех видов: трассировку событий, трассировку состояния ресурсов, трассировку показателей и трассировку точек принятия решений. Трассировка выдается только если текущее модельное время больше или равно времени начала трассировки и меньше или равно времени окончания трассировки, а также если в соответствующем объекте (ресурсе, образце, показателе или точке принятия решений) явно указан признак трассировки.
    +
    статус_окончания_моделирования
    +
    Статус окончания моделирования описывает причину завершения моделирования и может быть одним из следующих:
    + + + + + + + + + + + + + + + + + + + + + +
    СтатусОписание
    NORMAL_TERMINATIONНормальное завершение моделирования при выполнении условия окончания моделирования, заданного в прогоне
    NO_MORE_EVENTSНет больше событий в модели
    USER_BREAKМоделирование завершилось из-за вмешательства пользователя, который завершил РДО-имитатор
    RUN_TIME_ERRORМоделирование завершилось из-за ошибки во время счета (информация об ошибке выводится в окно диалога РДО-имитатора)
    +
    +
    статистика_по_поиску_на_графе
    +
    Статистика по поиску на графе для каждой точки принятия решений типа search имеет следующий формат: +
    DPS_C
         <номер_точки>
         <количество_активаций>
         <количество_успешных>
    @@ -117,9 +117,9 @@ 

    ОБЪЕКТ ТРАССИРОВКИ

    <среднее_количество_порожденных_вершин> <минимальное_количество_порожденных_вершин> <максимальное_количество_порожденных_вершин>
    -

    Она содержит номер точки принятия решений, количество активаций данной точки и количество успешных завершений поиска с нахождением решения. Кроме этого статистика содержит средние по всем активациям поиска, минимальные и максимальные значения таких характеристик процесса поиска, как время поиска (в секундах), количество использованной для построения графа поиска памяти (в байтах), стоимость найденного решения, количество раскрытых вершин, количество вершин в построенном графе, количество включавшихся в граф вершин (вершины, соответствующие одному и тому же состоянию системы, могут включаться в граф неоднократно, если порождается вершина с меньшей стоимостью пути), общее количество порожденных вершин-преемников в процессе поиска. Значения этих характеристик для каждой активации поиска отдельно находятся в трассировке окончания поиска.

    -
    -

    Пример

    DPS_C  1  1  1
    +                    

    Она содержит номер точки принятия решений, количество активаций данной точки и количество успешных завершений поиска с нахождением решения. Кроме этого статистика содержит средние по всем активациям поиска, минимальные и максимальные значения таких характеристик процесса поиска, как время поиска (в секундах), количество использованной для построения графа поиска памяти (в байтах), стоимость найденного решения, количество раскрытых вершин, количество вершин в построенном графе, количество включавшихся в граф вершин (вершины, соответствующие одному и тому же состоянию системы, могут включаться в граф неоднократно, если порождается вершина с меньшей стоимостью пути), общее количество порожденных вершин-преемников в процессе поиска. Значения этих характеристик для каждой активации поиска отдельно находятся в трассировке окончания поиска.

    +
    +

    Пример

    DPS_C  1  1  1
     DPS_TM 193.816  193.816  193.816
     DPS_ME 7458816  7458816  7458816
     DPS_CO 1.28515e+09  1.28515e+09  1.28515e+09
    @@ -127,16 +127,16 @@ 

    ОБЪЕКТ ТРАССИРОВКИ

    DPS_TT 20261 20261 20261 DPS_TI 21109 21109 21109 DPS_TG 38894 38894 38894
    -
    -
    -
    -
    -

    См. также

    -

    Трассировка событий

    -

    Трассировка состояния ресурсов

    -

    Трассировка показателей

    -

    Трассировка точек принятия решений

    -
    -
    + + + + +

    См. также

    +

    Трассировка событий

    +

    Трассировка состояния ресурсов

    +

    Трассировка показателей

    +

    Трассировка точек принятия решений

    +
    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_decisionpt.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_decisionpt.htm index 243db10ac..7f64c426f 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_decisionpt.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_decisionpt.htm @@ -8,44 +8,44 @@ -
    -

    ТРАССИРОВКА ТОЧЕК ПРИНЯТИЯ РЕШЕНИЙ

    -

    Статистика по поиску на графе для каждой точки принятия решений типа search приводится в конце объекта трассировки.

    -

    Трассировка процесса поиска на графе в точке принятия решений типа search позволяет полностью восстановить картину поиска и полученный граф.

    -

    Формат трассировки имеет следующий вид:

    -
    <начало_поиска>
    +    
    +

    ТРАССИРОВКА ТОЧЕК ПРИНЯТИЯ РЕШЕНИЙ

    +

    Статистика по поиску на графе для каждой точки принятия решений типа search приводится в конце объекта трассировки.

    +

    Трассировка процесса поиска на графе в точке принятия решений типа search позволяет полностью восстановить картину поиска и полученный граф.

    +

    Формат трассировки имеет следующий вид:

    +
    <начало_поиска>
     [<информация_о_поиске>]
     [<решение>]
     <окончание_поиска>
    -

    Трассировка начала и окончания поиска и трассировка решения присутствуют в объекте трассировки, если в описании точки принятия решений указан любой признак трассировки кроме no_trace.

    -
    -
    начало_поиска
    -
    Формат информации о начале поиска следующий: -
    SB <модельное_время> <номер_точки_принятия_решения>
    -
    -
    информация_о_поиске
    -
    Информация о поиске включает данные о вершинах графа поиска, порожденных в процессе поиска. Она выводится в объект трассировки если признак трассировки для данной точки принятия решений есть trace_tops или trace_all и состоит из блоков следующего вида: -
    <трассировка_раскрываемой_вершины>
    +        

    Трассировка начала и окончания поиска и трассировка решения присутствуют в объекте трассировки, если в описании точки принятия решений указан любой признак трассировки кроме no_trace.

    +
    +
    начало_поиска
    +
    Формат информации о начале поиска следующий: +
    SB <модельное_время> <номер_точки_принятия_решения>
    +
    +
    информация_о_поиске
    +
    Информация о поиске включает данные о вершинах графа поиска, порожденных в процессе поиска. Она выводится в объект трассировки если признак трассировки для данной точки принятия решений есть trace_tops или trace_all и состоит из блоков следующего вида: +
    <трассировка_раскрываемой_вершины>
     {<порожденная_вершина> [<трассировка_измененных_ресурсов>]}
    -
    -
    трассировка_раскрываемой_вершины
    -
    Трассировка раскрываемой вершины имеет следующий формат: -
    SO <номер_вершины> <номер_родителя> <стоимость_пути> <значение_оценочной_функции>
    -
    -
    номер_вершины
    -
    Номер раскрываемой вершины в графе поиска.
    -
    номер_родителя
    -
    Номер вершины родителя раскрываемой вершины в графе поиска.
    -
    стоимость_пути
    -
    Далее указана стоимость пути от исходной вершины к данной.
    -
    значение_оценочной_функции
    -
    Значение оценочной функции для данной вершины.
    -
    -

    После информации о раскрываемой вершине следуют данные о всех преемниках, полученных при раскрытии этой вершины.

    -
    -
    порожденная_вершина
    -
    Информация о преемнике имеет следующий формат: -
    ST<признак_вершины>
    +                
    +
    трассировка_раскрываемой_вершины
    +
    Трассировка раскрываемой вершины имеет следующий формат: +
    SO <номер_вершины> <номер_родителя> <стоимость_пути> <значение_оценочной_функции>
    +
    +
    номер_вершины
    +
    Номер раскрываемой вершины в графе поиска.
    +
    номер_родителя
    +
    Номер вершины родителя раскрываемой вершины в графе поиска.
    +
    стоимость_пути
    +
    Далее указана стоимость пути от исходной вершины к данной.
    +
    значение_оценочной_функции
    +
    Значение оценочной функции для данной вершины.
    +
    +

    После информации о раскрываемой вершине следуют данные о всех преемниках, полученных при раскрытии этой вершины.

    +
    +
    порожденная_вершина
    +
    Информация о преемнике имеет следующий формат: +
    ST<признак_вершины>
         <номер_вершины>
         <номер_вершины-родителя>
         <фактическая_стоимость_пройденного_пути_g>
    @@ -55,47 +55,47 @@ 

    ТРАССИРОВКА ТОЧЕК ПРИНЯТИЯ РЕШЕНИЙ

    <стоимость_применения_правила> <количество_релевантных_ресурсов> <номера_релевантных_ресурсов>
    -
    -
    признак_вершины
    -
    Признак вершины может быть следующим: - - - - - - - - - - - - - - - - - -
    Признак вершиныОписание
    NВершина с таким состоянием системы не содержится в уже построенной части графа
    DВершина с таким состоянием уже есть и она не включается в граф (вновь найденный путь имеет большую стоимость)
    RВершина с таким состоянием уже есть в графе, и она перезаписывается, поскольку вновь найденный путь имеет меньшую стоимость
    -
    -
    -
    -
    трассировка_измененных_ресурсов
    -
    Трассировка измененных ресурсов для порождаемых вершин происходит в том случае, если признак трассировки для данной точки принятия решений есть trace_all. Новое состояние ресурса выдается в формате, описанном в трассировке состояния ресурсов. Отличие состоит в том, что строка, содержащая новое состояние ресурса, начинается с префикса S.
    -
    -
    -
    решение
    -
    Трассировка решения имеет формат: -
    SD
    +                        
    +
    признак_вершины
    +
    Признак вершины может быть следующим: + + + + + + + + + + + + + + + + + +
    Признак вершиныОписание
    NВершина с таким состоянием системы не содержится в уже построенной части графа
    DВершина с таким состоянием уже есть и она не включается в граф (вновь найденный путь имеет большую стоимость)
    RВершина с таким состоянием уже есть в графе, и она перезаписывается, поскольку вновь найденный путь имеет меньшую стоимость
    +
    +
    +
    +
    трассировка_измененных_ресурсов
    +
    Трассировка измененных ресурсов для порождаемых вершин происходит в том случае, если признак трассировки для данной точки принятия решений есть trace_all. Новое состояние ресурса выдается в формате, описанном в трассировке состояния ресурсов. Отличие состоит в том, что строка, содержащая новое состояние ресурса, начинается с префикса S.
    +
    +
    +
    решение
    +
    Трассировка решения имеет формат: +
    SD
        {<номер_вершины>
         <номер_активности>
         <номер_образца>
         <количество_релевантных_ресурсов>
         <номера_релевантных_ресурсов>}
    -

    Она состоит из строк, содержащих информацию о том какие правила были применены к исходной вершине графа (исходному состоянию системы) для перехода в целевое состояние. Правила указываются в порядке их применения. Номер вершины позволяет более подробно проанализировать решение на основе информации о поиске.

    -
    -
    окончание_поиска
    -
    Трассировка окончания поиска имеет формат: -
    SE<признак>
    +                

    Она состоит из строк, содержащих информацию о том какие правила были применены к исходной вершине графа (исходному состоянию системы) для перехода в целевое состояние. Правила указываются в порядке их применения. Номер вершины позволяет более подробно проанализировать решение на основе информации о поиске.

    +
    +
    окончание_поиска
    +
    Трассировка окончания поиска имеет формат: +
    SE<признак>
         <модельное_время>
         <время_счета>
         <объем_памяти_для_поиска>
    @@ -104,53 +104,53 @@ 

    ТРАССИРОВКА ТОЧЕК ПРИНЯТИЯ РЕШЕНИЙ

    <количество_вершин_в_графе> <количество_включавшихся_в_граф_вершин> <количество_порожденных_вершин>
    -

    Она содержит признак завершения процесса поиска и статистическую информацию о полученном графе и затраченных ресурсах.

    -
    -
    признак
    -
    Признак завершения может быть одним из следующих: - - - - - - - - - - - - - - - - - - - - - - - - - -
    Признак завершенияОписание
    SУспешное завершение поиска с нахождением решения
    NЗавершение поиска без нахождения решения
    MНе хватило памяти для поиска
    FПроизошла ошибка записи в файл трассировки
    UНеизвестная ошибка
    -
    -
    время_счета
    -
    Время счета выводится в секундах.
    -
    объем_памяти_для_поиска
    -
    Объем памяти, использованной для построения графа выводится в байтах.
    -
    значение_стоимости_решения
    -
    Стоимость решения есть сумма стоимостей применения всех правил, составляющих решение.
    -
    -
    -
    -

    См. также

    -

    Объект трассировки

    -

    Трассировка состояния объектов РДО

    -

    Трассировка событий

    -

    Трассировка состояния ресурсов

    -

    Трассировка показателей

    -
    -
    +

    Она содержит признак завершения процесса поиска и статистическую информацию о полученном графе и затраченных ресурсах.

    +
    +
    признак
    +
    Признак завершения может быть одним из следующих: + + + + + + + + + + + + + + + + + + + + + + + + + +
    Признак завершенияОписание
    SУспешное завершение поиска с нахождением решения
    NЗавершение поиска без нахождения решения
    MНе хватило памяти для поиска
    FПроизошла ошибка записи в файл трассировки
    UНеизвестная ошибка
    +
    +
    время_счета
    +
    Время счета выводится в секундах.
    +
    объем_памяти_для_поиска
    +
    Объем памяти, использованной для построения графа выводится в байтах.
    +
    значение_стоимости_решения
    +
    Стоимость решения есть сумма стоимостей применения всех правил, составляющих решение.
    +
    + + +

    См. также

    +

    Объект трассировки

    +

    Трассировка состояния объектов РДО

    +

    Трассировка событий

    +

    Трассировка состояния ресурсов

    +

    Трассировка показателей

    +
    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_events.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_events.htm index 79b7cc18e..36c8b30d5 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_events.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_events.htm @@ -8,116 +8,116 @@ -
    -

    ТРАССИРОВКА СОБЫТИЙ

    -

    Информация о событии располагается на отдельной строке, которая имеет следующий формат:

    -
    E<тип_события> <время> <информация_о_событии>
    -

    Строка трассировки события начинается символом "E".

    -
    -
    тип_события
    -
    Второй символ строки определяет тип события. Возможны следующие типы и соответствующие им символы: - - - - - - - - - - - - - - - - - - - - - - - - - -
    Тип событияОписание
    SСлужебное событие
    BНачало действия
    FОкончание действия
    IСобытие
    RПродукционное правило
    -
    -
    время
    -
    Время наступления события в формате вещественного числа.
    -
    информация_о_событии
    -
    Далее следует информация о событии, которая зависит от типа события: -

    Для служебных событий

    -
    ES 0 1
    +    
    +

    ТРАССИРОВКА СОБЫТИЙ

    +

    Информация о событии располагается на отдельной строке, которая имеет следующий формат:

    +
    E<тип_события> <время> <информация_о_событии>
    +

    Строка трассировки события начинается символом "E".

    +
    +
    тип_события
    +
    Второй символ строки определяет тип события. Возможны следующие типы и соответствующие им символы: + + + + + + + + + + + + + + + + + + + + + + + + + +
    Тип событияОписание
    SСлужебное событие
    BНачало действия
    FОкончание действия
    IСобытие
    RПродукционное правило
    +
    +
    время
    +
    Время наступления события в формате вещественного числа.
    +
    информация_о_событии
    +
    Далее следует информация о событии, которая зависит от типа события: +

    Для служебных событий

    +
    ES 0 1
     ES 0 3
    -

    Информация содержит номер служебного события:

    - - - - - - - - - - - - - - - - - - - - - -
    Номер служебного событияОписание
    1Начало трассировки
    2Конец трассировки
    3Начало моделирования
    4Завершение процесса поиска на графе состояний в точке принятия решений
    +

    Информация содержит номер служебного события:

    + + + + + + + + + + + + + + + + + + + + + +
    Номер служебного событияОписание
    1Начало трассировки
    2Конец трассировки
    3Начало моделирования
    4Завершение процесса поиска на графе состояний в точке принятия решений
    -

    Для операций

    -
    EB 0.645131 1 17 19 5  88 6 3 5 58
    +                

    Для операций

    +
    EB 0.645131 1 17 19 5  88 6 3 5 58
     ...
     EF 0.673214 1 17 19 5  88 6 3 5 58
    -
    <номер_действия>
    +                
    <номер_действия>
     <номер_активности>
     <номер_образца>
     <количество_релевантных_ресурсов>
     <список_номеров>
    -
    -
    номер_действия
    -
    Номер действия - это внутренний номер, который имеет действие в имитаторе. Этот номер необходим, чтобы связать события начала и окончания одного и того же действия, другой полезной информации он не несет.
    -
    номер_активности, номер_образца
    -
    Эти два поля содержат номер активности, которая выполнялась в действии, и номер образца, соответствующего этой активности.
    -
    количество_релевантных_ресурсов, список_номеров
    -
    Количество релевантных ресурсов действия и список их номеров.
    -
    +
    +
    номер_действия
    +
    Номер действия - это внутренний номер, который имеет действие в имитаторе. Этот номер необходим, чтобы связать события начала и окончания одного и того же действия, другой полезной информации он не несет.
    +
    номер_активности, номер_образца
    +
    Эти два поля содержат номер активности, которая выполнялась в действии, и номер образца, соответствующего этой активности.
    +
    количество_релевантных_ресурсов, список_номеров
    +
    Количество релевантных ресурсов действия и список их номеров.
    +
    -

    Для нерегулярных событий

    -
    EI 0.220589 2 2 1  2
    -
    <номер_события>
    +                

    Для нерегулярных событий

    +
    EI 0.220589 2 2 1  2
    +
    <номер_события>
     <номер_образца>
     <количество_релевантных_ресурсов>
     <список_номеров>
    -
    номер_события, номер_образца
    -
    Для обыкновенных событий номер события и номер образца совпадают.
    +
    номер_события, номер_образца
    +
    Для обыкновенных событий номер события и номер образца совпадают.
    -

    Для продукционных правил

    -
    ER 0.220589 1 1 3 3  39 2 87
    -
    <номер_действия>
    +                

    Для продукционных правил

    +
    ER 0.220589 1 1 3 3  39 2 87
    +
    <номер_действия>
     <номер_активности>
     <номер_образца>
     <количество_релевантных_ресурсов>
     <список_номеров>
    -
    номер_действия
    -
    В текущей версии РДО поле номер_действия для продукционных правил рудиментарно и всегда равно единице.
    -
    -
    -

    См. также

    -

    Объект трассировки

    -

    Трассировка состояния ресурсов

    -

    Трассировка показателей

    -

    Трассировка точек принятия решений

    -
    -
    +
    номер_действия
    +
    В текущей версии РДО поле номер_действия для продукционных правил рудиментарно и всегда равно единице.
    +
    +
    +

    См. также

    +

    Объект трассировки

    +

    Трассировка состояния ресурсов

    +

    Трассировка показателей

    +

    Трассировка точек принятия решений

    +
    +
    diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_resourses.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_resourses.htm index 7a2b1a37e..05748ef1c 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_resourses.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_resourses.htm @@ -8,57 +8,57 @@ -
    -

    ТРАССИРОВКА СОСТОЯНИЯ РЕСУРСОВ

    -

    Трассировка состояния ресурсов включает в себя информацию обо всех изменениях состояния ресурсов. В момент изменения состояния трассируемого ресурса в объект трассировки выдается отдельная строка следующего формата:

    -
    R<символ_статуса>
    +    
    +

    ТРАССИРОВКА СОСТОЯНИЯ РЕСУРСОВ

    +

    Трассировка состояния ресурсов включает в себя информацию обо всех изменениях состояния ресурсов. В момент изменения состояния трассируемого ресурса в объект трассировки выдается отдельная строка следующего формата:

    +
    R<символ_статуса>
         <время>
         <номер_типа>
         <номер_ресурса>
         <новые_значения_параметров>
    -
    -
    символ_статуса
    -
    Символ статуса обозначает, что произошло с ресурсом в целом: - - - - - - - - - - - - - - - - - -
    Символ статусаОписание
    CРесурс создан -
    RC 0 8 71 1 1 31.0032 0 51 0 0 274.8 402.8 530.8 498.8 626.8 754.8 722.8
    -
    EРесурс уничтожен -
    RE 0.336553 1 87 -3275 201 489 467 0.360761 1281 2.85054 0 2 8 38 32766 350 0.843091 0.873441
    -
    KЗначения параметров ресурса изменились -
    RK 0 7 42 2 1 2 53 26.8291 0 14 519 160 180 7.92202 0 3 1 8 0 0 0 0
    -
    -
    -
    время
    -
    Время изменения ресурса в формате вещественного числа.
    -
    номер_типа, номер_ресурса
    -
    Номер типа и номер ресурса определяется порядком следования типов и ресурсов в объекте описания типов и объекте ресурсов соответственно.
    -
    новые_значения_параметров
    -
    Новые значения параметров выводятся в объект в порядке следования параметров при описании типов ресурсов. Для перечислимых параметров выводятся не имена значений, а их номера. При этом первому имени значения присваивается номер 0, второму - 1 и так далее. -

    Для ресурсов, которые уничтожаются (символ статуса E), новые значения параметров не выводятся.

    -
    -
    -

    См. также

    -

    Объект трассировки

    -

    Трассировка событий

    -

    Трассировка показателей

    -

    Трассировка точек принятия решений

    -
    -
    +
    +
    символ_статуса
    +
    Символ статуса обозначает, что произошло с ресурсом в целом: + + + + + + + + + + + + + + + + + +
    Символ статусаОписание
    CРесурс создан +
    RC 0 8 71 1 1 31.0032 0 51 0 0 274.8 402.8 530.8 498.8 626.8 754.8 722.8
    +
    EРесурс уничтожен +
    RE 0.336553 1 87 -3275 201 489 467 0.360761 1281 2.85054 0 2 8 38 32766 350 0.843091 0.873441
    +
    KЗначения параметров ресурса изменились +
    RK 0 7 42 2 1 2 53 26.8291 0 14 519 160 180 7.92202 0 3 1 8 0 0 0 0
    +
    +
    +
    время
    +
    Время изменения ресурса в формате вещественного числа.
    +
    номер_типа, номер_ресурса
    +
    Номер типа и номер ресурса определяется порядком следования типов и ресурсов в объекте описания типов и объекте ресурсов соответственно.
    +
    новые_значения_параметров
    +
    Новые значения параметров выводятся в объект в порядке следования параметров при описании типов ресурсов. Для перечислимых параметров выводятся не имена значений, а их номера. При этом первому имени значения присваивается номер 0, второму - 1 и так далее. +

    Для ресурсов, которые уничтожаются (символ статуса E), новые значения параметров не выводятся.

    +
    +
    +

    См. также

    +

    Объект трассировки

    +

    Трассировка событий

    +

    Трассировка показателей

    +

    Трассировка точек принятия решений

    +
    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_results.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_results.htm index fdd8ac6c1..f7086df2c 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_results.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_res/rdo_res_trc_results.htm @@ -8,49 +8,49 @@ -
    -

    ТРАССИРОВКА ПОКАЗАТЕЛЕЙ

    -

    Строка трассировки показателя имеет следующий формат:

    -
    V <время> <номер_показателя> <значение>
    -
    -
    время
    -
    Время изменения показателя в формате вещественного числа.
    -
    номер_показателя
    -
    Номер показателя - это номер, указанный для трассируемых показателей в секции $Watching объекта трассировки.
    -
    значение
    -
    Трассировка показателей производится в момент изменения значения параметра, количества временных ресурсов, значения логического выражения (для показателя вида watch_state) или в момент уничтожения ресурса (для показателя вида watch_value). -

    Значение зависит от вида показателя. Ниже приведены значения для всех видов показателей:

    - - - - - - - - - - - - - - - - - - - - - -
    Вид показателяОписание значения трассировки
    watch_parНовое значение параметра
    watch_stateНовое значение логического выражения
    watch_quantНовое значение количества ресурсов
    watch_valueЗначение арифметического выражения
    -

    Трассировка показателя вида get_value не производится.

    -
    -
    -

    См. также

    -

    Объект трассировки

    -

    Трассировка событий

    -

    Трассировка состояния ресурсов

    -

    Трассировка точек принятия решений

    -
    -
    +
    +

    ТРАССИРОВКА ПОКАЗАТЕЛЕЙ

    +

    Строка трассировки показателя имеет следующий формат:

    +
    V <время> <номер_показателя> <значение>
    +
    +
    время
    +
    Время изменения показателя в формате вещественного числа.
    +
    номер_показателя
    +
    Номер показателя - это номер, указанный для трассируемых показателей в секции $Watching объекта трассировки.
    +
    значение
    +
    Трассировка показателей производится в момент изменения значения параметра, количества временных ресурсов, значения логического выражения (для показателя вида watch_state) или в момент уничтожения ресурса (для показателя вида watch_value). +

    Значение зависит от вида показателя. Ниже приведены значения для всех видов показателей:

    + + + + + + + + + + + + + + + + + + + + + +
    Вид показателяОписание значения трассировки
    watch_parНовое значение параметра
    watch_stateНовое значение логического выражения
    watch_quantНовое значение количества ресурсов
    watch_valueЗначение арифметического выражения
    +

    Трассировка показателя вида get_value не производится.

    +
    +
    +

    См. также

    +

    Объект трассировки

    +

    Трассировка событий

    +

    Трассировка состояния ресурсов

    +

    Трассировка точек принятия решений

    +
    +
    diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_terms.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_terms.htm index 4ba650f2c..41d74b079 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_terms.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_terms.htm @@ -8,36 +8,36 @@ -
    -

    ОСНОВНЫЕ ПОНЯТИЯ

    -

    При выполнении работ, связанных с созданием и использованием ИМ в среде РДО, пользователь оперирует следующими основными понятиями:

    -

    Модель - совокупность объектов РДО-языка, описывающих какой-то реальный объект, собираемые в процессе имитации показатели, кадры анимации и графические элементы, используемые при анимации, результаты трассировки.

    -

    Прогон - это единая неделимая точка имитационного эксперимента. Он характеризуется совокупностью объектов, представляющих собой исходные данные и результаты, полученные при запуске имитатора с этими исходными данными.

    -

    Проект - один или более прогонов, объединенных какой-либо общей целью. Например, это может быть совокупность прогонов, которые направлены на исследование одного конкретного объекта или выполнение одного контракта на имитационные исследования по одному или нескольким объектам.

    -

    Объект - совокупность информации, предназначенной для определенных целей и имеющая смысл для имитационной программы. Состав объектов обусловлен РДО-методом, определяющим парадигму представления СДС на языке РДО. Подробнее эти объекты рассмотрены в последующих разделах, здесь же приведем лишь их перечень.

    -
    -
    Объектами исходных данных являются: - -
    -

    Объекты, создаваемые РДО-имитатором при выполнении прогона: - -
    -
    -
    -
    +
    +

    ОСНОВНЫЕ ПОНЯТИЯ

    +

    При выполнении работ, связанных с созданием и использованием ИМ в среде РДО, пользователь оперирует следующими основными понятиями:

    +

    Модель - совокупность объектов РДО-языка, описывающих какой-то реальный объект, собираемые в процессе имитации показатели, кадры анимации и графические элементы, используемые при анимации, результаты трассировки.

    +

    Прогон - это единая неделимая точка имитационного эксперимента. Он характеризуется совокупностью объектов, представляющих собой исходные данные и результаты, полученные при запуске имитатора с этими исходными данными.

    +

    Проект - один или более прогонов, объединенных какой-либо общей целью. Например, это может быть совокупность прогонов, которые направлены на исследование одного конкретного объекта или выполнение одного контракта на имитационные исследования по одному или нескольким объектам.

    +

    Объект - совокупность информации, предназначенной для определенных целей и имеющая смысл для имитационной программы. Состав объектов обусловлен РДО-методом, определяющим парадигму представления СДС на языке РДО. Подробнее эти объекты рассмотрены в последующих разделах, здесь же приведем лишь их перечень.

    +
    +
    Объектами исходных данных являются: + +
    +

    Объекты, создаваемые РДО-имитатором при выполнении прогона: + +
    +
    +
    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory.htm index 0c5d060a7..e85ee5208 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory.htm @@ -8,37 +8,37 @@ -
    -

    ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

    -

    В данном разделе справки представлены некоторые теоретические сведения, которые помогут пользователю лучше понимать суть происходящего в модели, а также некоторые конструкции РДО-студии.

    -

    Разделы

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    РазделыОписание
    Принципы генерации псевдослучайных чиселВ этом разделе приведены основные сведения о случайных и псевдослучайных чисел и их генерации.
    Базовое распределениеВ этом разделе приведены основные сведения о понятии базы генератора.
    Законы распределенияВ этом разделе приведены основные сведения о законах распределения случайных чисел.
    Обратная функцияВ этом разделе рассказывается о том, как получить заданное распределение из базового.
    Оценка качества распределенияВ этом разделе рассказывается о визуальном методе оценки качества распределения, полученного ГПСЧ.
    -
    -
    +
    +

    ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

    +

    В данном разделе справки представлены некоторые теоретические сведения, которые помогут пользователю лучше понимать суть происходящего в модели, а также некоторые конструкции РДО-студии.

    +

    Разделы

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    РазделыОписание
    Принципы генерации псевдослучайных чиселВ этом разделе приведены основные сведения о случайных и псевдослучайных чисел и их генерации.
    Базовое распределениеВ этом разделе приведены основные сведения о понятии базы генератора.
    Законы распределенияВ этом разделе приведены основные сведения о законах распределения случайных чисел.
    Обратная функцияВ этом разделе рассказывается о том, как получить заданное распределение из базового.
    Оценка качества распределенияВ этом разделе рассказывается о визуальном методе оценки качества распределения, полученного ГПСЧ.
    +
    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_estimation.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_estimation.htm index e9fb2b2d3..4a641d36d 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_estimation.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_estimation.htm @@ -8,13 +8,13 @@ -
    -

    ОЦЕНКА КАЧЕСТВА РАСПРЕДЕЛЕНИЯ

    -

    Для того, чтобы оценить качество генератора случайных чисел, необходимо определить, насколько близко псевдослучайное распределение, полученное генератором, к случайному.

    -

    Одним из простейших методов оценки является графический. В данном методе строится, например, гистограмма распределения элементов полученной последовательности, и зрительно оценивается её соответствие ожидаемому распределению.

    -

    В качестве примера будет проведена оценка качества генератора псевдослучайного экспоненциального распределения с интенсивностью 1, базовое распределение для которого было получено в разделе "Принципы генерации псевдослучайных чисел", а преобразование к экспоненциальному выполнено в разделе "Метод обратного преобразования".

    -

    Полный код генератора приведен ниже.

    -
    #include <iostream>
    +    
    +

    ОЦЕНКА КАЧЕСТВА РАСПРЕДЕЛЕНИЯ

    +

    Для того, чтобы оценить качество генератора случайных чисел, необходимо определить, насколько близко псевдослучайное распределение, полученное генератором, к случайному.

    +

    Одним из простейших методов оценки является графический. В данном методе строится, например, гистограмма распределения элементов полученной последовательности, и зрительно оценивается её соответствие ожидаемому распределению.

    +

    В качестве примера будет проведена оценка качества генератора псевдослучайного экспоненциального распределения с интенсивностью 1, базовое распределение для которого было получено в разделе "Принципы генерации псевдослучайных чисел", а преобразование к экспоненциальному выполнено в разделе "Метод обратного преобразования".

    +

    Полный код генератора приведен ниже.

    +
    #include <iostream>
     #include <climits>
     #include <cmath>
     
    @@ -25,46 +25,46 @@ 

    ОЦЕНКА КАЧЕСТВА РАСПРЕДЕЛЕНИЯ

    static double base_uniform() { - seed = seed * magic + 1; - return (double) seed / UINT_MAX; + seed = seed * magic + 1; + return (double) seed / UINT_MAX; } static double exp_distr(double lambda, double factor) { - return -1 * log(1 - base_uniform()) / lambda * factor; + return -1 * log(1 - base_uniform()) / lambda * factor; } int main(void) { - seed = seed_init; - for (int i = 0; i < 10000; ++i) { - std::cout << exp_distr(1, 1) << std::endl; - } - return 0; + seed = seed_init; + for (int i = 0; i < 10000; ++i) { + std::cout << exp_distr(1, 1) << std::endl; + } + return 0; }
    -

    Выходными данными программы являются 10000 псевдослучайных чисел, распределенных по экспоненциальному закону.

    -

    Для получения гистограммы выходные данные генератора сохраняются в файл:

    -
    ./rng_exp.o > data.csv
    -

    А затем, с помощью расширения NumPy для python строится гистограмма. Код программы приведен ниже.

    -
    import numpy as np
    +        

    Выходными данными программы являются 10000 псевдослучайных чисел, распределенных по экспоненциальному закону.

    +

    Для получения гистограммы выходные данные генератора сохраняются в файл:

    +
    ./rng_exp.o > data.csv
    +

    А затем, с помощью расширения NumPy для python строится гистограмма. Код программы приведен ниже.

    +
    import numpy as np
     from matplotlib import pyplot
     
     a = np.genfromtxt('data.csv')
     print "length =", a.size, ", min =", min(a), ", max =", max(a), ", mean =", a.mean(), ", stddev =", a.std()
     pyplot.hist(a, bins=40)
     pyplot.show()
    -

    В результате будет построена гистограмма, имеющая следующий вид:

    -



    -

    И следующие параметры:

    -
    length =  10000 , min =  4.62252e-07 , max =  9.74167 , mean =  1.0147809955 , stddev 1.0106752669
    -

    Визуальная оценка в данном случае показывает, что форма распределения достаточно близка к ожидаемой, и подобный генератор вполне может использоваться, например, в моделировании.

    -

    Полученные значения математического ожидания и стандартного отклонения также близки к теоретическим (в данном случае 1 и 1 соответственно):

    -

    См. также

    -

    Основные теоретические сведения

    -

    Принципы генерации псевдослучайных чисел

    -

    База генератора

    -

    Законы распределения

    -

    Метод обратного преобразования

    -
    +

    В результате будет построена гистограмма, имеющая следующий вид:

    +



    +

    И следующие параметры:

    +
    length =  10000 , min =  4.62252e-07 , max =  9.74167 , mean =  1.0147809955 , stddev 1.0106752669
    +

    Визуальная оценка в данном случае показывает, что форма распределения достаточно близка к ожидаемой, и подобный генератор вполне может использоваться, например, в моделировании.

    +

    Полученные значения математического ожидания и стандартного отклонения также близки к теоретическим (в данном случае 1 и 1 соответственно):

    +

    См. также

    +

    Основные теоретические сведения

    +

    Принципы генерации псевдослучайных чисел

    +

    База генератора

    +

    Законы распределения

    +

    Метод обратного преобразования

    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_generator_seed.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_generator_seed.htm index a76ad360d..62bc52138 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_generator_seed.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_generator_seed.htm @@ -8,19 +8,19 @@ -
    -

    БАЗА ГЕНЕРАТОРА

    -

    База ГПСЧ - это число, которое используется для инициализации генератора. Последовательность, генерируемая ГПСЧ полностью определяется базой генератора и всегда одинакова при одной и той же базе. Базу генератора получают из разных источников. Часто в качестве базы используют время, т.к. это число постоянно меняется. Но это не идеальное решение: оно меняется медленно. Иногда, когда нужно получить одно-единственное число, пользователя просят подвигать мышью, чтобы позже на основе тех перемещений курсора получить базу: опыт сложно повторим, поэтому можно считать величину случайной. Одна из компаний, предоставляющих интернет-услуги, которой нужно было ежедневно генерировать множество случайных чисел, использовала погодные данные в качестве баз генератора.

    -

    В РДО источником случайности является пользователь, который вводит базу генератора, которую должен использовать генератор псевдослучайных чисел. Такой подход позволяет обеспечить повторяемость опытов и удобство отладки модели, а случайность каждого нового эксперимента определяется фантазией пользователя.

    -

    Ниже приведен алгоритм определения базы генератора для нового числа из последовательности.

    -

    -

    См. также

    -

    Основные теоретические сведения

    -

    Принципы генерации псевдослучайных чисел

    -

    Законы распределения

    -

    Метод обратного преобразования

    -

    Оценка качества распределения

    -
    -
    +
    +

    БАЗА ГЕНЕРАТОРА

    +

    База ГПСЧ - это число, которое используется для инициализации генератора. Последовательность, генерируемая ГПСЧ полностью определяется базой генератора и всегда одинакова при одной и той же базе. Базу генератора получают из разных источников. Часто в качестве базы используют время, т.к. это число постоянно меняется. Но это не идеальное решение: оно меняется медленно. Иногда, когда нужно получить одно-единственное число, пользователя просят подвигать мышью, чтобы позже на основе тех перемещений курсора получить базу: опыт сложно повторим, поэтому можно считать величину случайной. Одна из компаний, предоставляющих интернет-услуги, которой нужно было ежедневно генерировать множество случайных чисел, использовала погодные данные в качестве баз генератора.

    +

    В РДО источником случайности является пользователь, который вводит базу генератора, которую должен использовать генератор псевдослучайных чисел. Такой подход позволяет обеспечить повторяемость опытов и удобство отладки модели, а случайность каждого нового эксперимента определяется фантазией пользователя.

    +

    Ниже приведен алгоритм определения базы генератора для нового числа из последовательности.

    +

    +

    См. также

    +

    Основные теоретические сведения

    +

    Принципы генерации псевдослучайных чисел

    +

    Законы распределения

    +

    Метод обратного преобразования

    +

    Оценка качества распределения

    +
    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_principles.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_principles.htm index b3e216c25..e56b4eb56 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_principles.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_principles.htm @@ -8,21 +8,21 @@ -
    -

    СЛУЧАЙНЫЕ И ПСЕВДОСЛУЧАЙНЫЕ ЧИСЛА

    -

    Существует два основных метода получения случайных чисел.

    -

    Первый заключается в использовании некоторого физического явления (источник энтропии), от которого ожидается случайное поведение, например, атмосферные и тепловые шумы, радиоактивный распад и другие явления. В персональных компьютерах часто используется счетчик тактов процессора. Полученные таким образом числа являются по-настоящему случайными, а генераторы, использующиеся для их получения, называются генераторами случайных чисел (ГСЧ). Основными недостатками подобных методов является низкая частота измерений (которая ограничена особенностями физического явления и прибора измерения) и возможность атак на источник энтропии.

    -

    Второй метод заключается в использовании детерминированных алгоритмов, преобразовывающих некоторое начальное число, называемое базой генератора. Подобные генераторы называются генераторами псевдослучайных чисел (ГПСЧ), а генерируемые ими числа, соответственно, псевдослучайными. Термины "генератор псевдослучайных чисел" и "датчик псевдослучайных чисел" следует считать синонимами. С помощью ГПСЧ возможно получить распределение, очень близкое к случайному.

    -

    В имитационном моделировании используются ГПСЧ. При этом от генератора требуются следующие свойства:

    -
      -
    • Детерминированность. Генератор должен выдавать одинаковые последовательности при одинаковых значениях базы. Это свойство чрезвычайно удобно при отладке моделей и ползволяет проводить воспроизводимые эксперименты.
    • -
    • Большая длина цикла. Любой ГПСЧ рано или поздно зацикливается, потому что обладает конечным набором состояний. Чем больше длина цикла, тем лучше ведет себя генератор при долгих прогонах.
    • -
    -

    ГЕНЕРАЦИЯ ПСЕВДОСЛУЧАЙНЫХ ЧИСЕЛ

    -

    Генерация псевдослучайных чисел будет рассмотрена на примере базового равномерного распределения. Базовое равномерное распределение представляет собой равномерное распределение на интервале от 0 до 1. Данное распределение используется как основа для получения распределений по другим законам.

    -

    Одним из простейших алгоритмов генерации псевдослучайных чисел является линейный конгруэнтный метод. Суть заключается в том, что база генератора все время растет и переполняет память, которая ограничена, например, 8 байтами. Лишнее отбрасывается.

    -

    Ниже приведен программы на языке C++, которая выводит на экран первые 100 чисел базового равномерного распределения с базой 123456789.

    -
    #include <iostream>
    +    
    +

    СЛУЧАЙНЫЕ И ПСЕВДОСЛУЧАЙНЫЕ ЧИСЛА

    +

    Существует два основных метода получения случайных чисел.

    +

    Первый заключается в использовании некоторого физического явления (источник энтропии), от которого ожидается случайное поведение, например, атмосферные и тепловые шумы, радиоактивный распад и другие явления. В персональных компьютерах часто используется счетчик тактов процессора. Полученные таким образом числа являются по-настоящему случайными, а генераторы, использующиеся для их получения, называются генераторами случайных чисел (ГСЧ). Основными недостатками подобных методов является низкая частота измерений (которая ограничена особенностями физического явления и прибора измерения) и возможность атак на источник энтропии.

    +

    Второй метод заключается в использовании детерминированных алгоритмов, преобразовывающих некоторое начальное число, называемое базой генератора. Подобные генераторы называются генераторами псевдослучайных чисел (ГПСЧ), а генерируемые ими числа, соответственно, псевдослучайными. Термины "генератор псевдослучайных чисел" и "датчик псевдослучайных чисел" следует считать синонимами. С помощью ГПСЧ возможно получить распределение, очень близкое к случайному.

    +

    В имитационном моделировании используются ГПСЧ. При этом от генератора требуются следующие свойства:

    +
      +
    • Детерминированность. Генератор должен выдавать одинаковые последовательности при одинаковых значениях базы. Это свойство чрезвычайно удобно при отладке моделей и ползволяет проводить воспроизводимые эксперименты.
    • +
    • Большая длина цикла. Любой ГПСЧ рано или поздно зацикливается, потому что обладает конечным набором состояний. Чем больше длина цикла, тем лучше ведет себя генератор при долгих прогонах.
    • +
    +

    ГЕНЕРАЦИЯ ПСЕВДОСЛУЧАЙНЫХ ЧИСЕЛ

    +

    Генерация псевдослучайных чисел будет рассмотрена на примере базового равномерного распределения. Базовое равномерное распределение представляет собой равномерное распределение на интервале от 0 до 1. Данное распределение используется как основа для получения распределений по другим законам.

    +

    Одним из простейших алгоритмов генерации псевдослучайных чисел является линейный конгруэнтный метод. Суть заключается в том, что база генератора все время растет и переполняет память, которая ограничена, например, 8 байтами. Лишнее отбрасывается.

    +

    Ниже приведен программы на языке C++, которая выводит на экран первые 100 чисел базового равномерного распределения с базой 123456789.

    +
    #include <iostream>
     #include <climits>
     
     static const unsigned int seed_init = 123456789;
    @@ -32,28 +32,28 @@ 

    ГЕНЕРАЦИЯ ПСЕВДОСЛУЧАЙНЫХ ЧИСЕЛ

    static double base_uniform() { - seed = seed * magic + 1; - return (double) seed / UINT_MAX; + seed = seed * magic + 1; + return (double) seed / UINT_MAX; } int main(void) { - seed = seed_init; - for (int i = 0; i < 10000; ++i) { - std::cout << base_uniform() << std::endl; - } - return 0; + seed = seed_init; + for (int i = 0; i < 10000; ++i) { + std::cout << base_uniform() << std::endl; + } + return 0; }
    -

    MAGIC - это число, благодаря которому получается все гладко и красиво, но объяснения этому явлению найти не удалось. В данном примере MAGIC = 69069.

    -

    +1 - благодаря этому можно не беспокоится о том, что база обратится в ноль, и генератор всегда начнет возвращать только лишь 0. Функция возвращает максимально возможное для 8 байт число плюс 1. Т.е. результатом работы генератора является приведенная база генератора. В итоге возвращается псевдо-случайное число, значение в диапазоне [0, 1).

    -

    Ниже приведен алгоритм работы генератора.

    -

    -

    См. также

    -

    Основные теоретические сведения

    -

    База генератора

    -

    Законы распределения

    -

    Метод обратного преобразования

    -

    Оценка качества распределения

    -
    +

    MAGIC - это число, благодаря которому получается все гладко и красиво, но объяснения этому явлению найти не удалось. В данном примере MAGIC = 69069.

    +

    +1 - благодаря этому можно не беспокоится о том, что база обратится в ноль, и генератор всегда начнет возвращать только лишь 0. Функция возвращает максимально возможное для 8 байт число плюс 1. Т.е. результатом работы генератора является приведенная база генератора. В итоге возвращается псевдо-случайное число, значение в диапазоне [0, 1).

    +

    Ниже приведен алгоритм работы генератора.

    +

    +

    См. также

    +

    Основные теоретические сведения

    +

    База генератора

    +

    Законы распределения

    +

    Метод обратного преобразования

    +

    Оценка качества распределения

    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq.htm index e96714c8c..4262d0627 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq.htm @@ -8,56 +8,56 @@ -
    -

    ЗАКОНЫ РАСПРЕДЕЛЕНИЯ

    -

    В рамках имитационного моделирования постоянно приходится сталкиваться со случайными величинами. Как правило, это величины, связанные с временами (периоды прихода заказов, время обработки заказов), реже – с количествами.

    -

    Последовательности псевдослучайных чисел задаются законами распределения, т.е. некоторыми функциями, позволяющими определить вероятность возникновения того или иного числа в последовательности. Основными характеристиками распределений являются:

    -

    Функция распределения F(x). Функция распределения показывает вероятность того, что случайная величина X примет значение меньше либо равное x.

    -

    Плотность вероятности f(x). Интеграл плотности вероятности на интервале от a до b отражает вероятность того, что случайная величина X попадет в этот интервал.

    -

    Связь между плотностью вероятности и функцией распределения выражается следующей формулой:

    -


    -

    Математическое ожидание M. Математическое ожидание это среднее значение случайной величины.

    -

    Зная плотность распределения, математическое ожидание можно получить по следующей формуле:

    -


    -

    Дисперсия D. Дисперсия это мера отклонения случайной величины от математического ожидания.

    -

    Дисперсию можно вычислить, зная математическое ожидание и плотность распределения:

    -



    -

    Область определения меры. Это область, на которой плотность распределения может принимать ненулевые значения, т.е. область, которой может принадлежать значение случайной величины.

    -

    Ниже приведены наиболее часто встречающиеся законы распределения:

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Закон распределенияСсылки
    НормальныйСинтаксис в РДОХарактеристики закона
    РавномерныйСинтаксис в РДОХарактеристики закона
    ТреугольныйСинтаксис в РДОХарактеристики закона
    ЭкспоненциальныйСинтаксис в РДОХарактеристики закона
    -

    Язык РДО может работать с каждым из них.


    -

    См. также

    -

    Основные теоретические сведения

    -

    Принципы генерации псевдослучайных чисел

    -

    База генератора

    -

    Метод обратного преобразования

    -

    Оценка качества распределения

    -
    -
    +
    +

    ЗАКОНЫ РАСПРЕДЕЛЕНИЯ

    +

    В рамках имитационного моделирования постоянно приходится сталкиваться со случайными величинами. Как правило, это величины, связанные с временами (периоды прихода заказов, время обработки заказов), реже – с количествами.

    +

    Последовательности псевдослучайных чисел задаются законами распределения, т.е. некоторыми функциями, позволяющими определить вероятность возникновения того или иного числа в последовательности. Основными характеристиками распределений являются:

    +

    Функция распределения F(x). Функция распределения показывает вероятность того, что случайная величина X примет значение меньше либо равное x.

    +

    Плотность вероятности f(x). Интеграл плотности вероятности на интервале от a до b отражает вероятность того, что случайная величина X попадет в этот интервал.

    +

    Связь между плотностью вероятности и функцией распределения выражается следующей формулой:

    +


    +

    Математическое ожидание M. Математическое ожидание это среднее значение случайной величины.

    +

    Зная плотность распределения, математическое ожидание можно получить по следующей формуле:

    +


    +

    Дисперсия D. Дисперсия это мера отклонения случайной величины от математического ожидания.

    +

    Дисперсию можно вычислить, зная математическое ожидание и плотность распределения:

    +



    +

    Область определения меры. Это область, на которой плотность распределения может принимать ненулевые значения, т.е. область, которой может принадлежать значение случайной величины.

    +

    Ниже приведены наиболее часто встречающиеся законы распределения:

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Закон распределенияСсылки
    НормальныйСинтаксис в РДОХарактеристики закона
    РавномерныйСинтаксис в РДОХарактеристики закона
    ТреугольныйСинтаксис в РДОХарактеристики закона
    ЭкспоненциальныйСинтаксис в РДОХарактеристики закона
    +

    Язык РДО может работать с каждым из них.


    +

    См. также

    +

    Основные теоретические сведения

    +

    Принципы генерации псевдослучайных чисел

    +

    База генератора

    +

    Метод обратного преобразования

    +

    Оценка качества распределения

    +
    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_exponential.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_exponential.htm index 41a79c117..ba47820a0 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_exponential.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_exponential.htm @@ -8,47 +8,47 @@ -
    -

    ЭКСПОНЕНЦИАЛЬНЫЙ ЗАКОН РАСПРЕДЕЛЕНИЯ

    - - -
    - - - - -
    - - - -

    Плотность распределения:

    График плотности распределения:



    - - -
    - - - - -
    - - - -

    Функция распределения:

    График функции распределения:


    -

    Параметры распределения: λ > 0

    -

    Параметр λ называется интенсивностью. Это величина, обратная коэффициенту масштаба.

    -

    Область определения меры: [0, +∞)

    -

    Математическое ожидание:

    -


    -

    Дисперсия:

    -


    -

    Обратная функция:

    -


    -

    Обратная функция используется для получения данного распределения из базового. В этом случае p будет являться случайной величиной, полученной по базовому распределению.

    -

    Область применения: экспоненциальное распределение используется, когда необходимо описать время, прошедшее между совершением последовательных событий постоянной интенсивности. Например, в некоторую фирму поступают звонки, причем интенсивность поступления звонков не меняется за всем рассматриваемом интервале времени. Тогда время между двумя последовательными звонками будет описываться экспоненциальным законом. В этом случае λ - это интенсивность звонков, т.е. среднее количество звонков в единицу времени.

    -

    Источник: [RU], [ENG]

    -

    См. также

    -

    Законы распределения

    -
    -
    +
    +

    ЭКСПОНЕНЦИАЛЬНЫЙ ЗАКОН РАСПРЕДЕЛЕНИЯ

    + + +
    + + + + +
    + + + +

    Плотность распределения:

    График плотности распределения:



    + + +
    + + + + +
    + + + +

    Функция распределения:

    График функции распределения:


    +

    Параметры распределения: λ > 0

    +

    Параметр λ называется интенсивностью. Это величина, обратная коэффициенту масштаба.

    +

    Область определения меры: [0, +∞)

    +

    Математическое ожидание:

    +


    +

    Дисперсия:

    +


    +

    Обратная функция:

    +


    +

    Обратная функция используется для получения данного распределения из базового. В этом случае p будет являться случайной величиной, полученной по базовому распределению.

    +

    Область применения: экспоненциальное распределение используется, когда необходимо описать время, прошедшее между совершением последовательных событий постоянной интенсивности. Например, в некоторую фирму поступают звонки, причем интенсивность поступления звонков не меняется за всем рассматриваемом интервале времени. Тогда время между двумя последовательными звонками будет описываться экспоненциальным законом. В этом случае λ - это интенсивность звонков, т.е. среднее количество звонков в единицу времени.

    +

    Источник: [RU], [ENG]

    +

    См. также

    +

    Законы распределения

    +
    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_inverse.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_inverse.htm index ef2862670..040333737 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_inverse.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_inverse.htm @@ -8,33 +8,33 @@ -
    -

    МЕТОД ОБРАТНОГО ПРЕОБРАЗОВАНИЯ

    -

    Алгоритмы работы имеющихся генераторов псевдослучайных чисел реализованы с помощью метода обратного преобразования. Подробный разбор этого вопроса можно прочитать в книге Кельтона и Лоу "Имитационное моделирование".

    -

    Суть метода сводится к тому, что для получения распределения, требуемого вида ( F(x) ), нужно применить обратную этому виду функцию ( F^(-1)(x) ) к базовому равномерному распределению на интервале [0,1); где F(x) - функция распределения.

    -

    Применение обратной функции позволяет получить распределение нужной формы. Далее полученное распределение приводится в соответствие конкретным параметрам закона. Это делается смещением с помощью операций сложения/вычитания и масштабированием с помощью операций умножения/деления.


    -

    Пример:

    -

    Пусть необходимо получить экспоненциальное распределение.

    -

    Плотность распределения f(x) имеет вид:

    -

    f(x) = lambda * EXP(-lambda * x)

    -

    Функция распределения F(x) получается интегрированием плотности распределения f(x):

    -

    F(x) = 1 - EXP(-lambda * x)

    -

    Обратная функция F_inv:

    -

    F_inv = -ln(1 - F(x)) / lambda

    -

    Теперь форма распределения приводится к необходимому виду масштабированием и/или смещением:

    -

    F_inv = -(factor / lambda) * ln(1 - base_uniform())


    -

    Ниже приведен пример функции на языке C++, выполняющей данные преобразования.

    -
    static double exp_distr(double lambda, double factor)
    +    
    +

    МЕТОД ОБРАТНОГО ПРЕОБРАЗОВАНИЯ

    +

    Алгоритмы работы имеющихся генераторов псевдослучайных чисел реализованы с помощью метода обратного преобразования. Подробный разбор этого вопроса можно прочитать в книге Кельтона и Лоу "Имитационное моделирование".

    +

    Суть метода сводится к тому, что для получения распределения, требуемого вида ( F(x) ), нужно применить обратную этому виду функцию ( F^(-1)(x) ) к базовому равномерному распределению на интервале [0,1); где F(x) - функция распределения.

    +

    Применение обратной функции позволяет получить распределение нужной формы. Далее полученное распределение приводится в соответствие конкретным параметрам закона. Это делается смещением с помощью операций сложения/вычитания и масштабированием с помощью операций умножения/деления.


    +

    Пример:

    +

    Пусть необходимо получить экспоненциальное распределение.

    +

    Плотность распределения f(x) имеет вид:

    +

    f(x) = lambda * EXP(-lambda * x)

    +

    Функция распределения F(x) получается интегрированием плотности распределения f(x):

    +

    F(x) = 1 - EXP(-lambda * x)

    +

    Обратная функция F_inv:

    +

    F_inv = -ln(1 - F(x)) / lambda

    +

    Теперь форма распределения приводится к необходимому виду масштабированием и/или смещением:

    +

    F_inv = -(factor / lambda) * ln(1 - base_uniform())


    +

    Ниже приведен пример функции на языке C++, выполняющей данные преобразования.

    +
    static double exp_distr(double lambda, double factor)
     {
    -	return -1 * log(1 - base_uniform()) / lambda * factor;
    +    return -1 * log(1 - base_uniform()) / lambda * factor;
     }
    -

    См. также

    -

    Основные теоретические сведения

    -

    Принципы генерации псевдослучайных чисел

    -

    База генератора

    -

    Законы распределения

    -

    Оценка качества распределения

    -
    -
    +

    См. также

    +

    Основные теоретические сведения

    +

    Принципы генерации псевдослучайных чисел

    +

    База генератора

    +

    Законы распределения

    +

    Оценка качества распределения

    +
    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_normal.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_normal.htm index e1f914422..e8092029d 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_normal.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_normal.htm @@ -8,45 +8,45 @@ -
    -

    НОРМАЛЬНЫЙ ЗАКОН РАСПРЕДЕЛЕНИЯ

    - - -
    - - - - -
    - - - -

    Плотность распределения:

    График плотности распределения:



    - - -
    - - - - -
    - - - -

    Функция распределения:

    График функции распределения:



    -

    Параметры распределения: μ, σ > 0

    -

    Параметр μ - это математическое ожидание нормального закона. Нормальное распределение симметрично относительно математического ожидания.

    -

    Параметр σ - это стандартное отклонение нормального закона. Стандартное отклонение должно быть строго больше нуля.

    -

    Область определения меры: (-∞, +∞)

    -

    Математическое ожидание: один из параметров закона, μ

    -

    Дисперсия: это квадрат стандартного отклонения, другого параметра закона.

    -


    -

    Стандартное нормальное распределение: - это нормальное распределение с параметрами μ = 0, σ = 1

    -

    Область применения: Согласно центральной предельной теореме сумма конечного числа одинаково распределенных величин будет распределена примерно нормально. Это свойство используется для оценки случайных погрешностей измерений. Кроме того, нормально распределенные величины встречаются в физике, в частности скорости частиц в термодинамически уравновешенной системе распределены равномерно. Вне лабораторий нормальное распределение можно наблюдать, например, при стрельбе по мишени. Расстояния от места попадания пули до центра мишени распределены нормально.

    -

    Источник: [RU], [ENG]

    -

    См. также

    -

    Законы распределения

    -
    -
    +
    +

    НОРМАЛЬНЫЙ ЗАКОН РАСПРЕДЕЛЕНИЯ

    + + +
    + + + + +
    + + + +

    Плотность распределения:

    График плотности распределения:



    + + +
    + + + + +
    + + + +

    Функция распределения:

    График функции распределения:



    +

    Параметры распределения: μ, σ > 0

    +

    Параметр μ - это математическое ожидание нормального закона. Нормальное распределение симметрично относительно математического ожидания.

    +

    Параметр σ - это стандартное отклонение нормального закона. Стандартное отклонение должно быть строго больше нуля.

    +

    Область определения меры: (-∞, +∞)

    +

    Математическое ожидание: один из параметров закона, μ

    +

    Дисперсия: это квадрат стандартного отклонения, другого параметра закона.

    +


    +

    Стандартное нормальное распределение: - это нормальное распределение с параметрами μ = 0, σ = 1

    +

    Область применения: Согласно центральной предельной теореме сумма конечного числа одинаково распределенных величин будет распределена примерно нормально. Это свойство используется для оценки случайных погрешностей измерений. Кроме того, нормально распределенные величины встречаются в физике, в частности скорости частиц в термодинамически уравновешенной системе распределены равномерно. Вне лабораторий нормальное распределение можно наблюдать, например, при стрельбе по мишени. Расстояния от места попадания пули до центра мишени распределены нормально.

    +

    Источник: [RU], [ENG]

    +

    См. также

    +

    Законы распределения

    +
    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_triangular.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_triangular.htm index ff48f3af2..6cd995683 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_triangular.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_triangular.htm @@ -8,44 +8,44 @@ -
    -

    ТРЕУГОЛЬНЫЙ ЗАКОН РАСПРЕДЕЛЕНИЯ

    - - -
    - - - - -
    - - - -

    Плотность распределения:

    График плотности распределения:



    - - -
    - - - - -
    - - - -

    Функция распределения:

    График функции распределения:


    -

    Параметры распределения: a ≤ c ≤ b, a < b

    -

    Параметр a называется нижним пределом, b - верхним пределом, c - модой (значением, встречающимся в распределении наиболее часто). В частном случае a = c или b = c треугольное распределение строится по двум точкам.

    -

    Область определения меры: [a, b]

    -

    Математическое ожидание:

    -


    -

    Дисперсия:

    -


    -

    Область применения: треугольное распределение используется для моделирования случайной величины в условиях недостатка данных, т.е. когда точный закон неизвестен. Его параметры могут быть определены в ходе опроса экспертов (экспертная оценка).

    -

    Источник: [ENG]

    -

    См. также

    -

    Законы распределения

    -
    -
    +
    +

    ТРЕУГОЛЬНЫЙ ЗАКОН РАСПРЕДЕЛЕНИЯ

    + + +
    + + + + +
    + + + +

    Плотность распределения:

    График плотности распределения:



    + + +
    + + + + +
    + + + +

    Функция распределения:

    График функции распределения:


    +

    Параметры распределения: a ≤ c ≤ b, a < b

    +

    Параметр a называется нижним пределом, b - верхним пределом, c - модой (значением, встречающимся в распределении наиболее часто). В частном случае a = c или b = c треугольное распределение строится по двум точкам.

    +

    Область определения меры: [a, b]

    +

    Математическое ожидание:

    +


    +

    Дисперсия:

    +


    +

    Область применения: треугольное распределение используется для моделирования случайной величины в условиях недостатка данных, т.е. когда точный закон неизвестен. Его параметры могут быть определены в ходе опроса экспертов (экспертная оценка).

    +

    Источник: [ENG]

    +

    См. также

    +

    Законы распределения

    +
    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_uniform.htm b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_uniform.htm index ced1113bb..10c716bc5 100644 --- a/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_uniform.htm +++ b/app/rdo_studio/help/rdo_lang_rus/html/rdo_theory/rdo_theory_seq_uniform.htm @@ -8,47 +8,47 @@ -
    -

    РАВНОМЕРНЫЙ ЗАКОН РАСПРЕДЕЛЕНИЯ

    - - -
    - - - - -
    - - - -

    Плотность распределения:

    График плотности распределения:



    - - -
    - - - - -
    - - - -

    Функция распределения:

    График функции распределения:


    -

    Параметры распределения: a и b

    -

    Параметры a и b ограничивают область определения меры - в данном случае интервал, в каждую точку которого с равной вероятностью может попасть случайная величина.

    -

    Параметр a называется коэффициентом сдвига, так как определяет начальную точку интервала [a,b].

    -

    Разность параметров (b - a) называется коэффициентом масштаба, так как определяет ширину интервала [a,b].

    -

    Область определения меры: [a, b]

    -

    Математическое ожидание:

    -


    -

    Дисперсия:

    -


    -

    Область применения: равномерное распределение используется как базовое для генерации псевдослучайных чисел.

    -

    Простейший пример дискретного равномерного распределения можно наблюдать, бросая кубик или монетку.

    -

    Источник: [RU], [ENG]

    -

    См. также

    -

    Законы распределения

    -
    -
    +
    +

    РАВНОМЕРНЫЙ ЗАКОН РАСПРЕДЕЛЕНИЯ

    + + +
    + + + + +
    + + + +

    Плотность распределения:

    График плотности распределения:



    + + +
    + + + + +
    + + + +

    Функция распределения:

    График функции распределения:


    +

    Параметры распределения: a и b

    +

    Параметры a и b ограничивают область определения меры - в данном случае интервал, в каждую точку которого с равной вероятностью может попасть случайная величина.

    +

    Параметр a называется коэффициентом сдвига, так как определяет начальную точку интервала [a,b].

    +

    Разность параметров (b - a) называется коэффициентом масштаба, так как определяет ширину интервала [a,b].

    +

    Область определения меры: [a, b]

    +

    Математическое ожидание:

    +


    +

    Дисперсия:

    +


    +

    Область применения: равномерное распределение используется как базовое для генерации псевдослучайных чисел.

    +

    Простейший пример дискретного равномерного распределения можно наблюдать, бросая кубик или монетку.

    +

    Источник: [RU], [ENG]

    +

    См. также

    +

    Законы распределения

    +
    +
    \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_studio_rus/html/about.htm b/app/rdo_studio/help/rdo_studio_rus/html/about.htm index 2667c09dd..a714e7474 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/about.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/about.htm @@ -5,45 +5,45 @@ -
    -

    РАЗРАБОТЧИКИ

    -

    Программный комплекс RAO-studio был разработан в Московском Государственном Техническом Университете им. Н.Э.Баумана, на кафедре "Компьютерные системы автоматизации производства" (РК-9) в 2003-2013 гг.

    +
    +

    РАЗРАБОТЧИКИ

    +

    Программный комплекс RAO-studio был разработан в Московском Государственном Техническом Университете им. Н.Э.Баумана, на кафедре "Компьютерные системы автоматизации производства" (РК-9) в 2003-2013 гг.

    - - - - - - - - - - - - - - - - -
     
    Контакты
     
    e-mail: rdo@rk9.bmstu.ru
     
     
    Разработчики
     
    RAO-Studio v2.0 (2012-2013 годы)
    - Клеванец И.С.
    - Пройдаков Е.А.
    - Романов Я.А.
    - Урусов А.В. -
     
    RAO-Studio v1.1 (2009-2011 годы)
    - Лущан Д.Н.
    - Урусов А.В. -
     
    RAO-Studio v1.0 (2003-2009 годы)
    - Емельянов В.В.
    - Барс А.В.
    - Захаров П.А.
    - Урусов А.В. -
     
    RAO-Simulator v3.0 (1991-1999 годы)
    - Емельянов В.В.
    - Ясиновский С.И.
    - Овсянников М.В. -
    -
    - + + + + + + + + + + + + + + + + +
     
    Контакты
     
    e-mail: rdo@rk9.bmstu.ru
     
     
    Разработчики
     
    RAO-Studio v2.0 (2012-2013 годы)
    + Клеванец И.С.
    + Пройдаков Е.А.
    + Романов Я.А.
    + Урусов А.В. +
     
    RAO-Studio v1.1 (2009-2011 годы)
    + Лущан Д.Н.
    + Урусов А.В. +
     
    RAO-Studio v1.0 (2003-2009 годы)
    + Емельянов В.В.
    + Барс А.В.
    + Захаров П.А.
    + Урусов А.В. +
     
    RAO-Simulator v3.0 (1991-1999 годы)
    + Емельянов В.В.
    + Ясиновский С.И.
    + Овсянников М.В. +
    +
    + \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_studio_rus/html/intro.htm b/app/rdo_studio/help/rdo_studio_rus/html/intro.htm index f866f0d6e..1d89180c0 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/intro.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/intro.htm @@ -5,61 +5,61 @@ -
    -

    ОБЩИЕ СВЕДЕНИЯ

    -

    Программный комплекс RAO-studio предназначен для разработки и отладки имитационных моделей на языке РДО. Основные цели данного комплекса - обеспечение пользователя легким в обращении, но достаточно мощным средством разработки текстов моделей на языке РДО, обладающим большинством функций по работе с текстами программ, характерных для сред программирования, а также средствами проведения и обработки результатов имитационных экспериментов.

    -

    В соответствии с основной целью программный комплекс решает следующие задачи:

    -

      -
    • синтаксический разбор текста модели и настраиваемая подсветка синтаксических конструкций языка РДО;
    • -
    • открытие и сохранение моделей;
    • -
    • расширенные возможности для редактирования текстов моделей;
    • -
    • автоматическое завершение ключевых слов языка;
    • -
    • поиск и замена фрагментов текста внутри одного модуля модели;
    • -
    • поиск интересующего фрагмента текста по всей модели;
    • -
    • навигация по тексту моделей с помощью закладок;
    • -
    • наличие нескольких буферов обмена для хранения фрагментов текста;
    • -
    • вставка синтаксических конструкций языка и заготовок (шаблонов) для написания элементов модели;
    • -
    • настройка отображения текста моделей, в т.ч. скрытие фрагментов текста и масштабирование;
    • -
    • запуск и остановка процесса моделирования;
    • -
    • изменение режима моделирования;
    • -
    • изменение скорости работающей модели;
    • -
    • переключение между кадрами анимации в процессе моделирования;
    • -
    • отображение хода работы модели в режиме реального времени;
    • -
    • построение графиков изменения интересующих разработчика характеристик в режиме реального времени;
    • -
    • обработка синтаксических ошибок при запуске процесса моделирования;
    • -
    • обработка ошибок во время выполнения модели;
    • -
    • обеспечение пользователя справочной информацией.
    • -
    -


    Программный комплекс состоит из двух частей:

    -
      -
    • среды разработки (файл RAO-studio.exe под Windows и RAO-studio под Linux);
    • -
    • файлов справок (rdo_lang_rus.qch - справка по языку РДО, rdo_studio_rus.qch - справка по программному комплексу, RAO-help.qhc - объединяет два последних для справочной системы).
    • -
    -


    Требования к программному обеспечению:

    -
      -
    • операционная система Windows 7 или Ubuntu 12.10;
    • -
    • наличие в операционной системе средства просмотра справки в формате Qt - Qt Assistant.
    • -
    - - - - - - - - - - - - - -
    -


    Microsoft, Windows являются зарегистрированными торговыми марками или торговыми марками Microsoft Corporation (в США и/или других странах).

    -

    Ubuntu является зарегистрированной торговой маркой Canonical Ltd.

    -

    Названия реальных компаний и продуктов, упомянутых в данном руководстве пользователя, могут быть торговыми марками соответствующих владельцев.

    -

    См. также

    -

    Работа с программным комплексом

    -
    - +
    +

    ОБЩИЕ СВЕДЕНИЯ

    +

    Программный комплекс RAO-studio предназначен для разработки и отладки имитационных моделей на языке РДО. Основные цели данного комплекса - обеспечение пользователя легким в обращении, но достаточно мощным средством разработки текстов моделей на языке РДО, обладающим большинством функций по работе с текстами программ, характерных для сред программирования, а также средствами проведения и обработки результатов имитационных экспериментов.

    +

    В соответствии с основной целью программный комплекс решает следующие задачи:

    +

      +
    • синтаксический разбор текста модели и настраиваемая подсветка синтаксических конструкций языка РДО;
    • +
    • открытие и сохранение моделей;
    • +
    • расширенные возможности для редактирования текстов моделей;
    • +
    • автоматическое завершение ключевых слов языка;
    • +
    • поиск и замена фрагментов текста внутри одного модуля модели;
    • +
    • поиск интересующего фрагмента текста по всей модели;
    • +
    • навигация по тексту моделей с помощью закладок;
    • +
    • наличие нескольких буферов обмена для хранения фрагментов текста;
    • +
    • вставка синтаксических конструкций языка и заготовок (шаблонов) для написания элементов модели;
    • +
    • настройка отображения текста моделей, в т.ч. скрытие фрагментов текста и масштабирование;
    • +
    • запуск и остановка процесса моделирования;
    • +
    • изменение режима моделирования;
    • +
    • изменение скорости работающей модели;
    • +
    • переключение между кадрами анимации в процессе моделирования;
    • +
    • отображение хода работы модели в режиме реального времени;
    • +
    • построение графиков изменения интересующих разработчика характеристик в режиме реального времени;
    • +
    • обработка синтаксических ошибок при запуске процесса моделирования;
    • +
    • обработка ошибок во время выполнения модели;
    • +
    • обеспечение пользователя справочной информацией.
    • +
    +


    Программный комплекс состоит из двух частей:

    +
      +
    • среды разработки (файл RAO-studio.exe под Windows и RAO-studio под Linux);
    • +
    • файлов справок (rdo_lang_rus.qch - справка по языку РДО, rdo_studio_rus.qch - справка по программному комплексу, RAO-help.qhc - объединяет два последних для справочной системы).
    • +
    +


    Требования к программному обеспечению:

    +
      +
    • операционная система Windows 7 или Ubuntu 12.10;
    • +
    • наличие в операционной системе средства просмотра справки в формате Qt - Qt Assistant.
    • +
    + + + + + + + + + + + + + +
    +


    Microsoft, Windows являются зарегистрированными торговыми марками или торговыми марками Microsoft Corporation (в США и/или других странах).

    +

    Ubuntu является зарегистрированной торговой маркой Canonical Ltd.

    +

    Названия реальных компаний и продуктов, упомянутых в данном руководстве пользователя, могут быть торговыми марками соответствующих владельцев.

    +

    См. также

    +

    Работа с программным комплексом

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/rdo_whats_new.htm b/app/rdo_studio/help/rdo_studio_rus/html/rdo_whats_new.htm index 27f1023c2..3f35eea0b 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/rdo_whats_new.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/rdo_whats_new.htm @@ -5,355 +5,355 @@ -
    -

    ИСТОРИЯ ВЕРСИЙ

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

     История изменений теперь на github

     
     
     
     
     Наиболее важные изменения. Полный список изменений можно увидеть ниже.
     
     build svn-9237 (версия 1.1)
     build svn-9100 (версия 1.1)
      -
    • добавлено построение графиков по строчкам (тип дaнных string) -
    • добавлены лицензионные ограничения -
    • исправлена трассировка показателя watch_value -
     build svn-8489 (версия 1.1)
     build 697 (версия 1.0)
     build 658 (версия 1.0)
      -
    • появилась возможность использования временного ресурса для сбора статистики по watch_par -
    • появилась возможность использования временного ресурса в анимации по его имени -
    • исправлена ошибка рекурсивного вызова функции -
     build 645 (версия 0.9)
      -
    • добавлена runtime проверка на вхождение в допустимый диапазон нового значения параметра -
    • внутри конвертора значения параметров присваиваются в той последовательности, в которой они прописаны в конверторе, а не в RTP -
    • при создании временного ресурса необязательно указывать параметры, для которых задано значение по умолчанию при описании типа -
    • условие выбора Choice NoCheck или Choice from 1 = 1 используется по умолчанию -
    • ключевое слово first используется по умолчанию -
    • добавлена возможность описать конвертор для удаляемого ресурса (Erase) -
    • добавлен унарный минус, т.е. теперь можно использовать '-<имя_функции>()' -
    • добавлена новая команда: Select -
    • добавлен оператор логического отрицания: символ '!' или not -
    • добавлена возможность использования круглых скобок наравне с квадратными в логических выражениях -
     build 415
      -
    • изменены режимы прогона: синхронный - поддерживается масштаб времени, дискретный - масштаб равен бесконечности -
     build 306
      -
    • добавлены однострочные и многострочные комментарии аналогично языку С++ -
     
     
     
     Полный список изменений
     
     
     build svn-9237 (версия 1.1)
      -
    • изменения в собираемых показателях -
        -
      • часть расчитываемых параметров удалена -
      • добавлены новые параметры -
      • изменился формат вывода -
      -
    • добавлен экспорт графиков в формате csv -
    • исправлены ошибки -
        -
      • восстановлено построение графиков по enum -
      -
     build svn-9100 (версия 1.1)
      -
    • добавлено построение графиков по строчкам (тип дaнных string) -
    • в диалог "О программе" добавлено лицензионное соглашение -
    • добавлены лицензионные ограничения -
    • исправлены ошибки -
        -
      • падение в рантайме при обращении к несужествующему ресурсу заменено на сообщение об ошибке -
      • исправлена компиляция пустых DPT -
      • исправлено падение в графиках для нетрассируемых паказателей -
      • исправлена трассировка показателя watch_value -
      • исправлен контекстный вывод справки по анимации -
      -
     build svn-8489 (версия 1.1)
      -
    • рефакторинг документации -
        -
      • перевод документации на unicode -
      • использование Qt Assistant вместо HTMLHelp для offline документации -
      • разработана online версии документации, обновляется автоматически -
      -
    • внедрена TDD-методология -
        -
      • используется Jenkins -
      • разработаны автотесты на модули системы моделирования -
      • разработаны интегральные автотесты на процесс моделирования -
      -
    • добавлен процедурный язык программирования - -
    • рефакторинг событий - -
    • из процесса можно не только планировать, но и останавливать события -
    • разработана консольная версия симулятора -
        -
      • используется для тестирования на Jenkins -
      • генерация проектов на основе cmake -
      • кроссплатформенномая реализация (windows, linux) -
      • собирается через gcc для x86 или x64 -
      • собирается через Visual Studio 2008 для x86 -
      -
    • добавлено неопределенноё значение параметра -
    • графическая подсистема создания процессных моделей (развивается давно, но до сих пор находится в закрытом режиме и не представлена в релизе) -
        -
      • основные блоки процессного подхода -
      • компиляция и моделирование блоков модели -
      • обратная связь процесса моделирования проброшена до анимации -
      -
    • перевод клиента на Qt - -
    • исправлены ошибки -
        -
      • исправлена ошибка генерации файла результатов в различающихся форматах под windows/linux -
      • исправлена ошибка, возникавшая при обращении к параметрам ресурсов, которые являются процессными ресурсами или транзактами процессов -
      • формат трассировки для событий возвращен к прежнему (EE->IE) -
      -
     build 697 (версия 1.0)
      -
    • добавлен процессно-ориентированный подход моделирования -
    • добавлена возможность одновременного использования вкладок OPR и DPT -
     build 658 (версия 1.0)
      -
    • добавлена возможность использования временного ресурса для сбора статистики по watch_par -
    • добавлена возможность использования временного ресурса в анимации по его имени -
    • на закладке анимации (FRM) допускается указывать несуществующий ресурс внутри $Show_if -
    • появилась возможность отключить вывод предупреждений (warnings) -
    • исправлена ошибка рекурсивного вызова функции -
    • собираемый показатель get_value выводит значение перечислимого типа как строку, а не числовой индекс -
     build 645 (версия 0.9)
      -
    • исправлена ошибка в процедуре "смены родителя" поиска на графе -
    • добавлен диалог перехода на строчку текста модели по её номеру -
    • настройки диалогов поиска и замены текста модели стали общими для всех закладок (PAT-SMR) -
    • добавлен вывод статистики прогона в файл результатов -
    • обновлена документация -
    • исправлена ошибка перевода выделенного фрагмента текста модели в формат RTF, если в нем встречались комментарии в стиле C++ (одно- и многострочные) -
    • добавлена запись файлов (объектов) модели под новыми именами, если были сделаны соответствующие изменения в файле прогона -
    • исправлена ошибка 'потери' имени последнего проекта, если студия закрылась аварийно -
    • исправлена ошибка отображения картинок в списке автозавершения ключевых слов -
    • исправлена ошибка утечки памяти при автозавершении ключевых слов -
    • исправлена ошибка нумерации для трассировки точек DPT search и их активностей -
    • исправлена ошибка инициализации собираемых показателей с типом watch_par и watch_quant -
    • исправлена ошибка вывода результатов предыдущего прогона, если новый прогон не имеет файла статистики -
    • исправлено 'добегание' модельного времени (временное ускорение), если в процессе прогона перемещаться по меню или прокручивать кадр анимации -
    • исправлена обработка пустой клавиши 'NOKEY' -
    • длительная операция поиска на графе не приводит к зависанию интерфейса студии -
    • исправлена ошибка выбора релевантных ресурсов в случае: with_min/with_max являются общими для всех (перед $Body), а рел. ресурс определяется через имя ресурса, а не тип -
    • исправлена ошибка с заменой при автозавершении слова, которому не соответствовало ни одно значение из списка, но имелось похожее -
    • заработали ключевые слова: Run_StartTime, Trace_StartTime, Trace_EndTime, Break_point; ранее они игнорировались -
    • если в файле прогона не найдено имя модели, то модель не открывается -
    • если в файле прогона определено несколько значений для файла, например операций, то используется последнее -
    • исправлена ошибка обработки комбинации клавиш клавиатурной операции, которая совпадала с комбинацией горячих клавиш самой студии -
    • исправлена ошибка автоматической прокрутки текста при выводе сообщений компилятора -
    • добавлена runtime проверка на вхождение в допустимый диапазон нового значения параметра -
    • добавлено предупреждающее сообщение при попытке закрыть RAO-studio c работающей моделью -
    • внутри конвертора значение параметров присваиваются в той последовательности, в которой они прописаны в конверторе, а не в RTP -
    • при создании временного ресурса необязательно указывать параметры, для которых задано значение по умолчанию при описании типа -
    • результаты моделирования (собираемые показатели) выводятся, даже если модель завершилась аварийно или остановлена пользователем -
    • добавлен диалог создания новой модели -
    • добавлены требования по соответствию очередности релевантных ресурсов в теле образца и в его заголовке -
    • изменена логика проверки и запуска образцов: явно выделен список текущих событий, поведение приведено в соответствие со старым РДО с точностью до дисциплины выборки из списка текущих (сейчас FIFO, в старом - LIFO) -
    • удалена блокировка ресурса в операции, если его статус конца NoChange, что приводило к ложным runtime-сообщениям об удаления используемого ресурса -
    • исправлена ошибка отображение на графике параметра перечислимого типа -
    • условие выбора Choice NoCheck или Choice from 1 = 1 используется по умолчанию -
    • ключевое слово first используется по умолчанию -
    • исправлена ошибка с выводом нулевого индекса для еще не существующего временного ресурса -
    • удалена трассировка неизменяемого ресурса (NoChange) -
    • добавлена возможность описать конвертор для удаляемого ресурса (Erase) -
    • изменена трассировка удаляемого ресурса: выводятся значения всех его параметров -
    • добавлен вывод статистики по используемой памяти и поиску на графе в конце трассировки -
    • исправлена ошибка нумерации объектов в DPT для трассировки -
    • исправлена ошибка ложного срабатывания клавиатурной операции в случае зажатых shift или control, когда они не входили в состав клавиш операции -
    • исправлена ошибка с реакцией нажатия на клавиши и активные области -
    • добавлена проверка на соответствие типа параметра и типа присваемого ему значения -
    • добавлен унарный минус, т.е. теперь можно использовать '-<имя_функции>()' -
    • исправлена ошибка с вылетом студии из-за двойного удаления объектов в самой студии в случае конструкции with_min( <несуществующий_параметр> ) и аналогичных -
    • отслежена ситуация с планированием событий в прошлом и отрицательной длительностью операций: выдаётся runtime error -
    • исправлена ошибка с повторным удалением временного ресурса, когда на него ссылаются два релевантных из одного образца с конвертором Erase -
    • добавлена новая команда: Select -
    • добавлен оператор логического отрицания: символ '!' или not -
    • добавлена возможность использования круглых скобок наравне с квадратными в логических выражениях -
    • добавлены сообщения об ошибках при компиляции -
    • заработал допустимый интервал возвращаемых значений у последовательностей: если возвращаемое значение выходит за этот интервал, то оно отсекается до его границы -
    • доработано использование ключевого слова nochange -
     build 418
      -
    • восстановлена работоспособность обработки нажатий на клавиши и активные области -
    • изменена обработка клавиатурных операций, скорость стала соответствовать старой версии РДО -
     build 415
      -
    • изменены режимы прогона: синхронный - поддерживается масштаб времени, дискретный - масштаб равен бесконечности -
    • добавлена регулировка скорости работы имитатора - её имеет смысл снижать скорость в моделях без операций -
    • ключевые слова можно писать маленькими буквами, но регистровая зависимость осталась, например, $Pattern теперь можно написать как $pattern, но никак не $pATTern -
    • переписана многопотоковая (multi-threaded) реализация модулей -
    • разработана однопотоковая (single-threaded) версия РДО -
    • увеличена скорость прогона, анимация отображается с заданной частотой, а не после каждого события -
    • из-за поднятия быстродействия пришлось отказаться от ::Sleep(1) в пользу ::Sleep(0) в режиме idle, что привело к загрузке процессора на 100% - не верьте глазам своим :), это далеко не всегда так -
    • добавлены проверки на использование релевантного ресурса со статусами Create и NonExist в условиях выбора других релевантных ресурсов -
    • добавлены проверки на использование релевантного ресурса со статусами Create, NonExist, и Erase в конверторах других релевантных ресурсов -
    • исправлена ошибка перехода на строку с ошибкой после неполного открытия модели -
    • исправлена ошибка при нахождении символа конца комментария без символа начала -
    • произошел откат от генератора Марсе и Робертса к старому, т.к. требовалось проверить совместимость со старой версией РДО. Работа еще не закончена. -
     build 306
      -
    • изменён генератор случайных чисел: для получения равномерно распределенного числа от 0 до 1 используется генератор Марсе и Робертса, функционирует в тестовом режиме, возможен откат к старому генератору -
    • добавлено отключение сворачивания комментариев (по умолчанию комментарии свернуть нельзя) -
    • добавлены однострочные и многострочные комментарии в стиле C++ -
    • исправлена ошибка обработки комментариев -
    • исправлена ошибка при подборе несуществующих ресурсов с помощью with-min/with_max перед $Body -
    • добавлены предупреждающие сообщения (warnings) -
    • интерфейс переведен на русский язык, английский тоже остался - выбор языка зависит от WinXP-MUI -
    • устранено аварийное завершение RAO-studio в случае, когда при ее закрытии панель Output (Панель вывода) была самостоятельным окном, а не доком -
    • в информацию о программе добавлены фамилии разработчиков -
    • добавлено сообщение об ошибке инициализации ресурса в RSS, если указаны не все его параметры -
    • добавлено сообщение об ошибке, если релевантный ресурс описан, но не используется в паттерне -
    • исправлена неточность с выводом трассируемых показателей -
    • добавлено уведомление о завершении модели из-за отсутствия событий (NO_MORE_EVENTS) -
    • добавлена поддержка стилей WinXP -
    • исправлена ошибка вывода кода картинки при автозавершении ключевого слова -
     build 248
      -
    • для совместимости с предыдущей версией РДО добавлено ключевое слово "Системное_время", которое является аналогом "Time_now" -
    • добавлена проверка на вхождение в диапазон допустимых значений, например, integer[0..10], для констант -
    • отпала необходимость писать ключевые слова $Show или $Show_if 1=1 для пустого файла анимации -
    • вышла новая версия (1.62) текстового редактора, любезно предоставленного нам Neil Hodgson'ом (см. www.scintilla.org). Ранее мы использовали версию 1.45. Некоторые исправления: нормальное копирование русских букв в буфер обмена для использования в других программах; появилась возможность добавлять картинки в список автозавершения и др. -
    • если RAO-studio запускается с параметром <файл прогона>.smr (путь отсутствует), то студия автоматически запускает модель на исполнение, а по завершении прогона закрывается -
    • добавлена возможность изменения режима прогона для моделей, в которых нет кадров анимации -
    • добавлена возможность обработки пустого/неправильного файла проекта (*.smr) -
     build 239
      -
    • добавлена документация RAO-studio.chm и контекстная справка -
    • добавлен вывод атрибута "только чтение" при загрузке модели -
    • исправлена ошибка вертикального центрирования текста при его выводе в окне анимации -
    • добавлены коды завершения работы студии по ключу -autoexit -
    • добавлен вывод полного пути модели в заголовок окна приложения -
     build 217
      -
    • исправлена ошибка изменения скорости анимации -
    • исправлена ошибка, возникающая при нажатии на F1 внутри пустой трассировки -
    • добавлена поддержка ключей командной строки: -autorun -autoexit -
    • исправлена ошибка, связанная с утечкой памяти, в диалоге с настройками -
    • появилась возможность автоматического открытия последней модели при запуске программы -
    • в опции программы добавлена возможность установки ассоциацию с файлом проекта (*.smr) -
    • при открытии модели по расширению, короткое имя файла переводится в длинное -
    • изменен внешний вид диалога about -
     build 168
      -
    • новая версия клавиатурных операций, реагирующая на WM_KEYDOWN и WM_KEYUP -
     build 167
      -
    • исправлена ошибка в симуляторе связанная с числом параметров ресурса при его создании -
     build 165
      -
    • дополнен список используемых клавиш в клавиатурных операциях -
     build 164
      -
    • порядок проверки паттернов (активностей) при моделировании соответствует порядку их описания в OPR (или DPT) файле -
    • кадры отображаются при любом событии, а не при изменении модельного времени как раньше -
    • репозиторий закрывает файл трассировки при возникновении ошибки во время прогона -
     build 162
      -
    • исправлена ошибка с зависанием при переключении режимов прогона -
    • исправлена ошибка с выводом вещественных чисел во время анимации -
     build 161 (версия 0.8)
      -
    • первая бета, выложенная на обозрение внутри кафедры -
    -
    - +
    +

    ИСТОРИЯ ВЕРСИЙ

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

     История изменений теперь на github

     
     
     
     
     Наиболее важные изменения. Полный список изменений можно увидеть ниже.
     
     build svn-9237 (версия 1.1)
     build svn-9100 (версия 1.1)
      +
    • добавлено построение графиков по строчкам (тип дaнных string) +
    • добавлены лицензионные ограничения +
    • исправлена трассировка показателя watch_value +
     build svn-8489 (версия 1.1)
     build 697 (версия 1.0)
     build 658 (версия 1.0)
      +
    • появилась возможность использования временного ресурса для сбора статистики по watch_par +
    • появилась возможность использования временного ресурса в анимации по его имени +
    • исправлена ошибка рекурсивного вызова функции +
     build 645 (версия 0.9)
      +
    • добавлена runtime проверка на вхождение в допустимый диапазон нового значения параметра +
    • внутри конвертора значения параметров присваиваются в той последовательности, в которой они прописаны в конверторе, а не в RTP +
    • при создании временного ресурса необязательно указывать параметры, для которых задано значение по умолчанию при описании типа +
    • условие выбора Choice NoCheck или Choice from 1 = 1 используется по умолчанию +
    • ключевое слово first используется по умолчанию +
    • добавлена возможность описать конвертор для удаляемого ресурса (Erase) +
    • добавлен унарный минус, т.е. теперь можно использовать '-<имя_функции>()' +
    • добавлена новая команда: Select +
    • добавлен оператор логического отрицания: символ '!' или not +
    • добавлена возможность использования круглых скобок наравне с квадратными в логических выражениях +
     build 415
      +
    • изменены режимы прогона: синхронный - поддерживается масштаб времени, дискретный - масштаб равен бесконечности +
     build 306
      +
    • добавлены однострочные и многострочные комментарии аналогично языку С++ +
     
     
     
     Полный список изменений
     
     
     build svn-9237 (версия 1.1)
      +
    • изменения в собираемых показателях +
        +
      • часть расчитываемых параметров удалена +
      • добавлены новые параметры +
      • изменился формат вывода +
      +
    • добавлен экспорт графиков в формате csv +
    • исправлены ошибки +
        +
      • восстановлено построение графиков по enum +
      +
     build svn-9100 (версия 1.1)
      +
    • добавлено построение графиков по строчкам (тип дaнных string) +
    • в диалог "О программе" добавлено лицензионное соглашение +
    • добавлены лицензионные ограничения +
    • исправлены ошибки +
        +
      • падение в рантайме при обращении к несужествующему ресурсу заменено на сообщение об ошибке +
      • исправлена компиляция пустых DPT +
      • исправлено падение в графиках для нетрассируемых паказателей +
      • исправлена трассировка показателя watch_value +
      • исправлен контекстный вывод справки по анимации +
      +
     build svn-8489 (версия 1.1)
      +
    • рефакторинг документации +
        +
      • перевод документации на unicode +
      • использование Qt Assistant вместо HTMLHelp для offline документации +
      • разработана online версии документации, обновляется автоматически +
      +
    • внедрена TDD-методология +
        +
      • используется Jenkins +
      • разработаны автотесты на модули системы моделирования +
      • разработаны интегральные автотесты на процесс моделирования +
      +
    • добавлен процедурный язык программирования + +
    • рефакторинг событий + +
    • из процесса можно не только планировать, но и останавливать события +
    • разработана консольная версия симулятора +
        +
      • используется для тестирования на Jenkins +
      • генерация проектов на основе cmake +
      • кроссплатформенномая реализация (windows, linux) +
      • собирается через gcc для x86 или x64 +
      • собирается через Visual Studio 2008 для x86 +
      +
    • добавлено неопределенноё значение параметра +
    • графическая подсистема создания процессных моделей (развивается давно, но до сих пор находится в закрытом режиме и не представлена в релизе) +
        +
      • основные блоки процессного подхода +
      • компиляция и моделирование блоков модели +
      • обратная связь процесса моделирования проброшена до анимации +
      +
    • перевод клиента на Qt + +
    • исправлены ошибки +
        +
      • исправлена ошибка генерации файла результатов в различающихся форматах под windows/linux +
      • исправлена ошибка, возникавшая при обращении к параметрам ресурсов, которые являются процессными ресурсами или транзактами процессов +
      • формат трассировки для событий возвращен к прежнему (EE->IE) +
      +
     build 697 (версия 1.0)
      +
    • добавлен процессно-ориентированный подход моделирования +
    • добавлена возможность одновременного использования вкладок OPR и DPT +
     build 658 (версия 1.0)
      +
    • добавлена возможность использования временного ресурса для сбора статистики по watch_par +
    • добавлена возможность использования временного ресурса в анимации по его имени +
    • на закладке анимации (FRM) допускается указывать несуществующий ресурс внутри $Show_if +
    • появилась возможность отключить вывод предупреждений (warnings) +
    • исправлена ошибка рекурсивного вызова функции +
    • собираемый показатель get_value выводит значение перечислимого типа как строку, а не числовой индекс +
     build 645 (версия 0.9)
      +
    • исправлена ошибка в процедуре "смены родителя" поиска на графе +
    • добавлен диалог перехода на строчку текста модели по её номеру +
    • настройки диалогов поиска и замены текста модели стали общими для всех закладок (PAT-SMR) +
    • добавлен вывод статистики прогона в файл результатов +
    • обновлена документация +
    • исправлена ошибка перевода выделенного фрагмента текста модели в формат RTF, если в нем встречались комментарии в стиле C++ (одно- и многострочные) +
    • добавлена запись файлов (объектов) модели под новыми именами, если были сделаны соответствующие изменения в файле прогона +
    • исправлена ошибка 'потери' имени последнего проекта, если студия закрылась аварийно +
    • исправлена ошибка отображения картинок в списке автозавершения ключевых слов +
    • исправлена ошибка утечки памяти при автозавершении ключевых слов +
    • исправлена ошибка нумерации для трассировки точек DPT search и их активностей +
    • исправлена ошибка инициализации собираемых показателей с типом watch_par и watch_quant +
    • исправлена ошибка вывода результатов предыдущего прогона, если новый прогон не имеет файла статистики +
    • исправлено 'добегание' модельного времени (временное ускорение), если в процессе прогона перемещаться по меню или прокручивать кадр анимации +
    • исправлена обработка пустой клавиши 'NOKEY' +
    • длительная операция поиска на графе не приводит к зависанию интерфейса студии +
    • исправлена ошибка выбора релевантных ресурсов в случае: with_min/with_max являются общими для всех (перед $Body), а рел. ресурс определяется через имя ресурса, а не тип +
    • исправлена ошибка с заменой при автозавершении слова, которому не соответствовало ни одно значение из списка, но имелось похожее +
    • заработали ключевые слова: Run_StartTime, Trace_StartTime, Trace_EndTime, Break_point; ранее они игнорировались +
    • если в файле прогона не найдено имя модели, то модель не открывается +
    • если в файле прогона определено несколько значений для файла, например операций, то используется последнее +
    • исправлена ошибка обработки комбинации клавиш клавиатурной операции, которая совпадала с комбинацией горячих клавиш самой студии +
    • исправлена ошибка автоматической прокрутки текста при выводе сообщений компилятора +
    • добавлена runtime проверка на вхождение в допустимый диапазон нового значения параметра +
    • добавлено предупреждающее сообщение при попытке закрыть RAO-studio c работающей моделью +
    • внутри конвертора значение параметров присваиваются в той последовательности, в которой они прописаны в конверторе, а не в RTP +
    • при создании временного ресурса необязательно указывать параметры, для которых задано значение по умолчанию при описании типа +
    • результаты моделирования (собираемые показатели) выводятся, даже если модель завершилась аварийно или остановлена пользователем +
    • добавлен диалог создания новой модели +
    • добавлены требования по соответствию очередности релевантных ресурсов в теле образца и в его заголовке +
    • изменена логика проверки и запуска образцов: явно выделен список текущих событий, поведение приведено в соответствие со старым РДО с точностью до дисциплины выборки из списка текущих (сейчас FIFO, в старом - LIFO) +
    • удалена блокировка ресурса в операции, если его статус конца NoChange, что приводило к ложным runtime-сообщениям об удаления используемого ресурса +
    • исправлена ошибка отображение на графике параметра перечислимого типа +
    • условие выбора Choice NoCheck или Choice from 1 = 1 используется по умолчанию +
    • ключевое слово first используется по умолчанию +
    • исправлена ошибка с выводом нулевого индекса для еще не существующего временного ресурса +
    • удалена трассировка неизменяемого ресурса (NoChange) +
    • добавлена возможность описать конвертор для удаляемого ресурса (Erase) +
    • изменена трассировка удаляемого ресурса: выводятся значения всех его параметров +
    • добавлен вывод статистики по используемой памяти и поиску на графе в конце трассировки +
    • исправлена ошибка нумерации объектов в DPT для трассировки +
    • исправлена ошибка ложного срабатывания клавиатурной операции в случае зажатых shift или control, когда они не входили в состав клавиш операции +
    • исправлена ошибка с реакцией нажатия на клавиши и активные области +
    • добавлена проверка на соответствие типа параметра и типа присваемого ему значения +
    • добавлен унарный минус, т.е. теперь можно использовать '-<имя_функции>()' +
    • исправлена ошибка с вылетом студии из-за двойного удаления объектов в самой студии в случае конструкции with_min( <несуществующий_параметр> ) и аналогичных +
    • отслежена ситуация с планированием событий в прошлом и отрицательной длительностью операций: выдаётся runtime error +
    • исправлена ошибка с повторным удалением временного ресурса, когда на него ссылаются два релевантных из одного образца с конвертором Erase +
    • добавлена новая команда: Select +
    • добавлен оператор логического отрицания: символ '!' или not +
    • добавлена возможность использования круглых скобок наравне с квадратными в логических выражениях +
    • добавлены сообщения об ошибках при компиляции +
    • заработал допустимый интервал возвращаемых значений у последовательностей: если возвращаемое значение выходит за этот интервал, то оно отсекается до его границы +
    • доработано использование ключевого слова nochange +
     build 418
      +
    • восстановлена работоспособность обработки нажатий на клавиши и активные области +
    • изменена обработка клавиатурных операций, скорость стала соответствовать старой версии РДО +
     build 415
      +
    • изменены режимы прогона: синхронный - поддерживается масштаб времени, дискретный - масштаб равен бесконечности +
    • добавлена регулировка скорости работы имитатора - её имеет смысл снижать скорость в моделях без операций +
    • ключевые слова можно писать маленькими буквами, но регистровая зависимость осталась, например, $Pattern теперь можно написать как $pattern, но никак не $pATTern +
    • переписана многопотоковая (multi-threaded) реализация модулей +
    • разработана однопотоковая (single-threaded) версия РДО +
    • увеличена скорость прогона, анимация отображается с заданной частотой, а не после каждого события +
    • из-за поднятия быстродействия пришлось отказаться от ::Sleep(1) в пользу ::Sleep(0) в режиме idle, что привело к загрузке процессора на 100% - не верьте глазам своим :), это далеко не всегда так +
    • добавлены проверки на использование релевантного ресурса со статусами Create и NonExist в условиях выбора других релевантных ресурсов +
    • добавлены проверки на использование релевантного ресурса со статусами Create, NonExist, и Erase в конверторах других релевантных ресурсов +
    • исправлена ошибка перехода на строку с ошибкой после неполного открытия модели +
    • исправлена ошибка при нахождении символа конца комментария без символа начала +
    • произошел откат от генератора Марсе и Робертса к старому, т.к. требовалось проверить совместимость со старой версией РДО. Работа еще не закончена. +
     build 306
      +
    • изменён генератор случайных чисел: для получения равномерно распределенного числа от 0 до 1 используется генератор Марсе и Робертса, функционирует в тестовом режиме, возможен откат к старому генератору +
    • добавлено отключение сворачивания комментариев (по умолчанию комментарии свернуть нельзя) +
    • добавлены однострочные и многострочные комментарии в стиле C++ +
    • исправлена ошибка обработки комментариев +
    • исправлена ошибка при подборе несуществующих ресурсов с помощью with-min/with_max перед $Body +
    • добавлены предупреждающие сообщения (warnings) +
    • интерфейс переведен на русский язык, английский тоже остался - выбор языка зависит от WinXP-MUI +
    • устранено аварийное завершение RAO-studio в случае, когда при ее закрытии панель Output (Панель вывода) была самостоятельным окном, а не доком +
    • в информацию о программе добавлены фамилии разработчиков +
    • добавлено сообщение об ошибке инициализации ресурса в RSS, если указаны не все его параметры +
    • добавлено сообщение об ошибке, если релевантный ресурс описан, но не используется в паттерне +
    • исправлена неточность с выводом трассируемых показателей +
    • добавлено уведомление о завершении модели из-за отсутствия событий (NO_MORE_EVENTS) +
    • добавлена поддержка стилей WinXP +
    • исправлена ошибка вывода кода картинки при автозавершении ключевого слова +
     build 248
      +
    • для совместимости с предыдущей версией РДО добавлено ключевое слово "Системное_время", которое является аналогом "Time_now" +
    • добавлена проверка на вхождение в диапазон допустимых значений, например, integer[0..10], для констант +
    • отпала необходимость писать ключевые слова $Show или $Show_if 1=1 для пустого файла анимации +
    • вышла новая версия (1.62) текстового редактора, любезно предоставленного нам Neil Hodgson'ом (см. www.scintilla.org). Ранее мы использовали версию 1.45. Некоторые исправления: нормальное копирование русских букв в буфер обмена для использования в других программах; появилась возможность добавлять картинки в список автозавершения и др. +
    • если RAO-studio запускается с параметром <файл прогона>.smr (путь отсутствует), то студия автоматически запускает модель на исполнение, а по завершении прогона закрывается +
    • добавлена возможность изменения режима прогона для моделей, в которых нет кадров анимации +
    • добавлена возможность обработки пустого/неправильного файла проекта (*.smr) +
     build 239
      +
    • добавлена документация RAO-studio.chm и контекстная справка +
    • добавлен вывод атрибута "только чтение" при загрузке модели +
    • исправлена ошибка вертикального центрирования текста при его выводе в окне анимации +
    • добавлены коды завершения работы студии по ключу -autoexit +
    • добавлен вывод полного пути модели в заголовок окна приложения +
     build 217
      +
    • исправлена ошибка изменения скорости анимации +
    • исправлена ошибка, возникающая при нажатии на F1 внутри пустой трассировки +
    • добавлена поддержка ключей командной строки: -autorun -autoexit +
    • исправлена ошибка, связанная с утечкой памяти, в диалоге с настройками +
    • появилась возможность автоматического открытия последней модели при запуске программы +
    • в опции программы добавлена возможность установки ассоциацию с файлом проекта (*.smr) +
    • при открытии модели по расширению, короткое имя файла переводится в длинное +
    • изменен внешний вид диалога about +
     build 168
      +
    • новая версия клавиатурных операций, реагирующая на WM_KEYDOWN и WM_KEYUP +
     build 167
      +
    • исправлена ошибка в симуляторе связанная с числом параметров ресурса при его создании +
     build 165
      +
    • дополнен список используемых клавиш в клавиатурных операциях +
     build 164
      +
    • порядок проверки паттернов (активностей) при моделировании соответствует порядку их описания в OPR (или DPT) файле +
    • кадры отображаются при любом событии, а не при изменении модельного времени как раньше +
    • репозиторий закрывает файл трассировки при возникновении ошибки во время прогона +
     build 162
      +
    • исправлена ошибка с зависанием при переключении режимов прогона +
    • исправлена ошибка с выводом вещественных чисел во время анимации +
     build 161 (версия 0.8)
      +
    • первая бета, выложенная на обозрение внутри кафедры +
    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_help.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_help.htm index 7fb5b16d3..1207fc1b3 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_help.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_help.htm @@ -5,19 +5,19 @@ -
    -

    ПОЛУЧЕНИЕ СПРАВОЧНОЙ ИНФОРМАЦИИ

    -

    Для получения справки по программному комплексу необходимо выбрать пункт меню Помощь/Содержание или нажать клавишу F1.

    -

    Для получения контекстно-зависимой справки по языку РДО необходимо установить курсор на интересующую синтаксическую конструкцию языка и нажать клавишу F1:

    -

    -

    -

    В диалоге настроек программного комплекса доступна контекстная справка:

    -

    -

    -

    См. также

    -

    Справка по языку РДО

    -

    Настройки

    -
    - +
    +

    ПОЛУЧЕНИЕ СПРАВОЧНОЙ ИНФОРМАЦИИ

    +

    Для получения справки по программному комплексу необходимо выбрать пункт меню Помощь/Содержание или нажать клавишу F1.

    +

    Для получения контекстно-зависимой справки по языку РДО необходимо установить курсор на интересующую синтаксическую конструкцию языка и нажать клавишу F1:

    +

    +

    +

    В диалоге настроек программного комплекса доступна контекстная справка:

    +

    +

    +

    См. также

    +

    Справка по языку РДО

    +

    Настройки

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_hotkeys.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_hotkeys.htm index 8dddb43d7..e8fe3bd16 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_hotkeys.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_hotkeys.htm @@ -5,260 +5,260 @@ -
    -

    СПИСОК ГОРЯЧИХ КЛАВИШ

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ДействиеКомбинация клавишФункция
    Файл
    Новая модельCtrl+NСоздание новой модели
    Открыть...Ctrl+OОткрытие существующей модели
    Сохранить всёCtrl+SЗапись всех открытых документов
    ВыходAlt+F4Выход из программного комплекса. Если модель содержит не сохраненные изменения, то будет предложено их сохранить.
    Правка
    ОменитьCtrl+ZПоследовательный откат изменений, внесенных в модель в процессе редактирования
    ПовторитьCtrl+YПоследовательное воспроизведение изменений, внесенных в модель в процессе редактирования
    ВырезатьCtrl+XВырезание выделенного фрагмента текста модели в буфер обмена
    КопироватьCtrl+CКопирование выделенного фрагмента текста модели в буфер обмена
    ВставитьCtrl+VВставка текста из буфера обмена
    УдалитьDelУдаление выделенного фрагмента текста модели
    Выделить всёCtrl+AВыделение всего текста в текущем редактируемом объекте модели
    В верхний регистрCtrl+Shift+UИзменение регистра в выделенном фрагменте текста на верхний, т.е. при выборе данного пункта меню выделенный текст будет записан прописными буквами
    В нижний регистрCtrl+UИзменение регистра в выделенном фрагменте текста на нижний, т.е. при выборе данного пункта меню выделенный текст будет записан строчными буквами
    Закомментировать выделенноеCtrl+QУстановка символов начала комментария слева и окончания комментария справа от выделенного фрагмента текста
    Завершить словоCtrl+SpaceВключение механизма автоматического завершения синтаксических конструкций языка
    Поиск
    НайтиCtrl+FВызов стандартного диалога WINDOWS для поиска подстроки в тексте
    Найти следующийF3Повторный поиск найденного фрагмента в направлении к концу текста
    Найти предыдущийShift+F3Повторный поиск найденного фрагмента в направлении к началу текста
    ЗаменитьCtrl+HВызов стандартного диалога WINDOWS для замены подстроки в тексте
    Найти в моделиCtrl+Shift+FВызов стандартного диалога WINDOWS для поиска подстроки в тексте всей модели. Результаты выводятся на закладку Поиск окна Вывод
    Поставить/снять закладкуCtrl+F2Установка/снятие закладки в тексте
    Перейти к след. закладкеF2Переход к следующей закладке
    Перейти к пред. закладкеShift+F2Переход к предыдущей закладке
    Очисть все закладкиCtrl+Shift+F2Удаление всех установленных в модели закладок
    Перейти на строчкуCtrl+GПереход к строке модели с указанным номером
    Просмотр
    Свернуть/развернуть все группыCtrl+Shift+0Свернуть/развернуть все сворачиваемые фрагменты текста

    Показать пробелыCtrl+Shift+8Включение/выключение режима отображения пробелов и символов табуляции
    Показать символ конца строкиCtrl+Shift+9Включение/выключение режима отображения символов конца строки
    Увеличить масштабCtrl+Num +Увеличение масштаба текста модели/графика результатов
    Уменьшить масштабCtrl+Num -Уменьшение масштаба текста модели/графика результатов
    Автоматический масштабCtrl+Num *Установление автоматического масштаба графика результатов
    Восстаносить мастшабCtrl+Num /Возврат к первоначальному размеру текста модели/графика результатов
    Модель
    СкомпилироватьF7Компиляция текста модели
    ЗапуститьF5Запуск модели
    ОстановитьShift+F5Остановка прогона
    Увеличить масштабAlt+Num +Увеличить скорость анимации на 50% процентов
    Уменьшить масштабAlt+Num -Уменьшить скорость анимации на 50% процентов
    График
    'Схлопнуть' времяCtrl+IВключает/отключает режим "переноса" времени для выбранного графика при его отображении
    Помощь
    СодержаниеF1Вызов справки по программному комплексу
    -
    - +
    +

    СПИСОК ГОРЯЧИХ КЛАВИШ

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ДействиеКомбинация клавишФункция
    Файл
    Новая модельCtrl+NСоздание новой модели
    Открыть...Ctrl+OОткрытие существующей модели
    Сохранить всёCtrl+SЗапись всех открытых документов
    ВыходAlt+F4Выход из программного комплекса. Если модель содержит не сохраненные изменения, то будет предложено их сохранить.
    Правка
    ОменитьCtrl+ZПоследовательный откат изменений, внесенных в модель в процессе редактирования
    ПовторитьCtrl+YПоследовательное воспроизведение изменений, внесенных в модель в процессе редактирования
    ВырезатьCtrl+XВырезание выделенного фрагмента текста модели в буфер обмена
    КопироватьCtrl+CКопирование выделенного фрагмента текста модели в буфер обмена
    ВставитьCtrl+VВставка текста из буфера обмена
    УдалитьDelУдаление выделенного фрагмента текста модели
    Выделить всёCtrl+AВыделение всего текста в текущем редактируемом объекте модели
    В верхний регистрCtrl+Shift+UИзменение регистра в выделенном фрагменте текста на верхний, т.е. при выборе данного пункта меню выделенный текст будет записан прописными буквами
    В нижний регистрCtrl+UИзменение регистра в выделенном фрагменте текста на нижний, т.е. при выборе данного пункта меню выделенный текст будет записан строчными буквами
    Закомментировать выделенноеCtrl+QУстановка символов начала комментария слева и окончания комментария справа от выделенного фрагмента текста
    Завершить словоCtrl+SpaceВключение механизма автоматического завершения синтаксических конструкций языка
    Поиск
    НайтиCtrl+FВызов стандартного диалога WINDOWS для поиска подстроки в тексте
    Найти следующийF3Повторный поиск найденного фрагмента в направлении к концу текста
    Найти предыдущийShift+F3Повторный поиск найденного фрагмента в направлении к началу текста
    ЗаменитьCtrl+HВызов стандартного диалога WINDOWS для замены подстроки в тексте
    Найти в моделиCtrl+Shift+FВызов стандартного диалога WINDOWS для поиска подстроки в тексте всей модели. Результаты выводятся на закладку Поиск окна Вывод
    Поставить/снять закладкуCtrl+F2Установка/снятие закладки в тексте
    Перейти к след. закладкеF2Переход к следующей закладке
    Перейти к пред. закладкеShift+F2Переход к предыдущей закладке
    Очисть все закладкиCtrl+Shift+F2Удаление всех установленных в модели закладок
    Перейти на строчкуCtrl+GПереход к строке модели с указанным номером
    Просмотр
    Свернуть/развернуть все группыCtrl+Shift+0Свернуть/развернуть все сворачиваемые фрагменты текста

    Показать пробелыCtrl+Shift+8Включение/выключение режима отображения пробелов и символов табуляции
    Показать символ конца строкиCtrl+Shift+9Включение/выключение режима отображения символов конца строки
    Увеличить масштабCtrl+Num +Увеличение масштаба текста модели/графика результатов
    Уменьшить масштабCtrl+Num -Уменьшение масштаба текста модели/графика результатов
    Автоматический масштабCtrl+Num *Установление автоматического масштаба графика результатов
    Восстаносить мастшабCtrl+Num /Возврат к первоначальному размеру текста модели/графика результатов
    Модель
    СкомпилироватьF7Компиляция текста модели
    ЗапуститьF5Запуск модели
    ОстановитьShift+F5Остановка прогона
    Увеличить масштабAlt+Num +Увеличить скорость анимации на 50% процентов
    Уменьшить масштабAlt+Num -Уменьшить скорость анимации на 50% процентов
    График
    'Схлопнуть' времяCtrl+IВключает/отключает режим "переноса" времени для выбранного графика при его отображении
    Помощь
    СодержаниеF1Вызов справки по программному комплексу
    +
    + \ No newline at end of file diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_intro.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_intro.htm index c62867fd7..d379e62d7 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_intro.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_intro.htm @@ -5,18 +5,18 @@ -
    -

    РАБОТА С ПРОГРАММНЫМ КОМПЛЕКСОМ

    -

    Пользователь имеет возможность вызывать функции программного комплекса с помощью меню, кнопок панели инструментов и "горячих клавиш".

    -

    Программный комплекс состоит из трех частей:

    -
      -
    • среды разработки (файл RAO-studio.exe);
    • -
    • файлов справок (RAO-language.chm - справка по языку РДО, RAO-studio.chm - справка по программному комплексу).
    • -
    -

    Для обеспечения работы программного комплекса необходимо, чтобы модуль среды разработки и файлы справок находились в одной директории (папке) на диске. Других ограничений нет. Пользователь может сам настроить и расположить, например, на Рабочем столе, ярлык для быстрого запуска программного комплекса.

    -

    См. также

    -

    Запуск программного комплекса

    -
    - +
    +

    РАБОТА С ПРОГРАММНЫМ КОМПЛЕКСОМ

    +

    Пользователь имеет возможность вызывать функции программного комплекса с помощью меню, кнопок панели инструментов и "горячих клавиш".

    +

    Программный комплекс состоит из трех частей:

    +
      +
    • среды разработки (файл RAO-studio.exe);
    • +
    • файлов справок (RAO-language.chm - справка по языку РДО, RAO-studio.chm - справка по программному комплексу).
    • +
    +

    Для обеспечения работы программного комплекса необходимо, чтобы модуль среды разработки и файлы справок находились в одной директории (папке) на диске. Других ограничений нет. Пользователь может сам настроить и расположить, например, на Рабочем столе, ярлык для быстрого запуска программного комплекса.

    +

    См. также

    +

    Запуск программного комплекса

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_bookmarks.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_bookmarks.htm index 5ffa3d099..530c8a4c7 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_bookmarks.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_bookmarks.htm @@ -5,18 +5,18 @@ -
    -

    НАВИГАЦИЯ С ПОМОЩЬЮ ЗАКЛАДОК

    -

    В данной версии программного комплекса существует возможность расстановки закладок и последующей навигации по этим закладкам.

    -

    Поставить/снять закладку в определенном месте текста модели можно, вызвав пункт меню Поиск/Поставить/снять закладку или нажав сочетание клавиш Ctrl+F2. При этом строка, на которой находится закладка, помечается маркером слева от поля редактирования (см. pис. а), а в случае, если поле невидимо, то соответствующим цветом подсвечивается вся строка (см. pис. б).

    -

    а) 

    -

    б) 

    -

    Закладки могут быть установлены во всех объектах модели. Программный комплекс обеспечивает навигацию по всем установленным закладкам. Для перемещения к следующей закладке после позиции каретки в тексте используется пункт меню Поиск/Перейти к след. закладке, клавиша F2 или кнопка на панели инструментов редактирования. Для перемещения к предыдущей закладке можно воспользоваться пунктом меню Поиск/Перейти к пред. закладке, комбинацией клавиш Shift+F2 или кнопкой на панели инструментов редактирования.

    -

    Снять все установленные закладки можно с помощью пункта меню Поиск/Очисть все закладки или нажав комбинацию клавиш Ctrl+Shift+F2.

    -

    См. также

    -

    Настройка бордюра закладок

    -

    Настройка формы и цвета закладок

    -
    - +
    +

    НАВИГАЦИЯ С ПОМОЩЬЮ ЗАКЛАДОК

    +

    В данной версии программного комплекса существует возможность расстановки закладок и последующей навигации по этим закладкам.

    +

    Поставить/снять закладку в определенном месте текста модели можно, вызвав пункт меню Поиск/Поставить/снять закладку или нажав сочетание клавиш Ctrl+F2. При этом строка, на которой находится закладка, помечается маркером слева от поля редактирования (см. pис. а), а в случае, если поле невидимо, то соответствующим цветом подсвечивается вся строка (см. pис. б).

    +

    а) 

    +

    б) 

    +

    Закладки могут быть установлены во всех объектах модели. Программный комплекс обеспечивает навигацию по всем установленным закладкам. Для перемещения к следующей закладке после позиции каретки в тексте используется пункт меню Поиск/Перейти к след. закладке, клавиша F2 или кнопка на панели инструментов редактирования. Для перемещения к предыдущей закладке можно воспользоваться пунктом меню Поиск/Перейти к пред. закладке, комбинацией клавиш Shift+F2 или кнопкой на панели инструментов редактирования.

    +

    Снять все установленные закладки можно с помощью пункта меню Поиск/Очисть все закладки или нажав комбинацию клавиш Ctrl+Shift+F2.

    +

    См. также

    +

    Настройка бордюра закладок

    +

    Настройка формы и цвета закладок

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_chart.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_chart.htm index ad3aab4d4..d2b0fd4e0 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_chart.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_chart.htm @@ -6,112 +6,112 @@ -
    -

    АВТОМАТИЧЕСКОЕ ПОСТРОЕНИЕ ГРАФИКОВ

    -

    В данной версии программного комплекса имеется возможность визуально отображать процессы, происходящие в модели, в виде графиков. Добавление графиков состояния ресурса становится возможным только после запуска модели. Графики состояния ресурса можно добавлять как в процессе работы модели в режиме анимации, так и после завершения моделирования. График состояния ресурса может быть отображен только в том случае, если конкретный ресурс трассируется.
    Для добавления графика во вкладке Графики окна объектов в дереве модели следует найти необходимый вам параметр ресурса . Далее, чтобы создать новое окно графика, нужно щелкнуть два раза по выбранному параметру ресурса левой кнопкой мыши или один раз правой и в выпадающем меню выбрать команду Добавить на новый график. По оси абсцисс графика откладывается время наступления событий, при которых изменяется значение параметра выбранного ресурса.

    -

    -

    При первом построении графика, масштаб по оси ординат устанавливается автоматически. Для изменения масштаба по оси абсцисс можно воспользоваться панелью инструментов Масштаб или использовать выпадающее меню при правом щелчке мышки по области графика. Основными функциями масштабирования являются:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Пункт менюКомбинация клавишКнопкаФункция
    Увеличить масштабCtrl+Num +Увеличение масштаба
    Уменьшить масштабCtrl+Num -Уменьшение масштаба
    Автоматический масштабCtrl+Num *Автоматический подбор масштаба по ширине области графика
    Восстановить масштабCtrl+Num /Восстановление начального масштаба
    -

    Имеется возможность добавлять на уже существующий график другие. Для этого необходимо мышкой перетащить имя параметра ресурса на область уже построенного графика.

    -

    -

    Для изменения основных свойства графика следует использовать пункт меню График/Настройки или команду выпадающего меню Настройки:

    -

    -

    Свойства расположены на двух закладках. На первой перечислены свойства, относящиеся к области отображения графика:

    -

    - - - - - - - - - - - - - - - - - - - - - -
    Наименование настройкиНазначение
    ЗаголовокЗаголовок графика
    Кол-во значений по Y, Кол-во значений по XМаксимальное количество подписей данных на осях абсцисс и ординат соответственно
    Показать легендуОтображать соответствие формы графика к названию параметра
    По Y откладыватьЕсли на одной области построено несколько графиков, то этим параметром определяется, значения какого из выбранных ресурсов будут отображены на оси ординат
    -

    На второй закладке перечислены свойства, относящиеся к свойствам конкретного графика:

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Наименование настройкиНазначение
    ЗначениеПозволяет выбрать график, настройки которого будут изменены
    ЗаголовокНазвание графика, которое пишется в легенде
    Выводить в легендеОтображение в легенде названия графика
    ЦветЦвет графика
    МаркерТип маркера
    Размер маркераРазмер маркера
    ПоказатьОтображение маркеров на графике
    Прозрачный маркерОставить маркер прозрачным (если маркер имеет замкнутую форму, то его можно залить цветом)
    -
    - +
    +

    АВТОМАТИЧЕСКОЕ ПОСТРОЕНИЕ ГРАФИКОВ

    +

    В данной версии программного комплекса имеется возможность визуально отображать процессы, происходящие в модели, в виде графиков. Добавление графиков состояния ресурса становится возможным только после запуска модели. Графики состояния ресурса можно добавлять как в процессе работы модели в режиме анимации, так и после завершения моделирования. График состояния ресурса может быть отображен только в том случае, если конкретный ресурс трассируется.
    Для добавления графика во вкладке Графики окна объектов в дереве модели следует найти необходимый вам параметр ресурса . Далее, чтобы создать новое окно графика, нужно щелкнуть два раза по выбранному параметру ресурса левой кнопкой мыши или один раз правой и в выпадающем меню выбрать команду Добавить на новый график. По оси абсцисс графика откладывается время наступления событий, при которых изменяется значение параметра выбранного ресурса.

    +

    +

    При первом построении графика, масштаб по оси ординат устанавливается автоматически. Для изменения масштаба по оси абсцисс можно воспользоваться панелью инструментов Масштаб или использовать выпадающее меню при правом щелчке мышки по области графика. Основными функциями масштабирования являются:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Пункт менюКомбинация клавишКнопкаФункция
    Увеличить масштабCtrl+Num +Увеличение масштаба
    Уменьшить масштабCtrl+Num -Уменьшение масштаба
    Автоматический масштабCtrl+Num *Автоматический подбор масштаба по ширине области графика
    Восстановить масштабCtrl+Num /Восстановление начального масштаба
    +

    Имеется возможность добавлять на уже существующий график другие. Для этого необходимо мышкой перетащить имя параметра ресурса на область уже построенного графика.

    +

    +

    Для изменения основных свойства графика следует использовать пункт меню График/Настройки или команду выпадающего меню Настройки:

    +

    +

    Свойства расположены на двух закладках. На первой перечислены свойства, относящиеся к области отображения графика:

    +

    + + + + + + + + + + + + + + + + + + + + + +
    Наименование настройкиНазначение
    ЗаголовокЗаголовок графика
    Кол-во значений по Y, Кол-во значений по XМаксимальное количество подписей данных на осях абсцисс и ординат соответственно
    Показать легендуОтображать соответствие формы графика к названию параметра
    По Y откладыватьЕсли на одной области построено несколько графиков, то этим параметром определяется, значения какого из выбранных ресурсов будут отображены на оси ординат
    +

    На второй закладке перечислены свойства, относящиеся к свойствам конкретного графика:

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Наименование настройкиНазначение
    ЗначениеПозволяет выбрать график, настройки которого будут изменены
    ЗаголовокНазвание графика, которое пишется в легенде
    Выводить в легендеОтображение в легенде названия графика
    ЦветЦвет графика
    МаркерТип маркера
    Размер маркераРазмер маркера
    ПоказатьОтображение маркеров на графике
    Прозрачный маркерОставить маркер прозрачным (если маркер имеет замкнутую форму, то его можно залить цветом)
    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_complete.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_complete.htm index 79e22dd80..4e5cfa097 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_complete.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_complete.htm @@ -5,14 +5,14 @@ -
    -

    АВТОЗАВЕРШЕНИЕ (CODE COMPLETION)

    -

    В данной версии программного комплекса имеется механизм автоматического завершения (автозавершения) синтаксических конструкций языка (т.н. code completion). Автозавершение позволяет пользователю не вводить полностью самостоятельно синтаксические конструкции языка. Для пользователя достаточно ввести один или несколько начальных символов конструкции и нажать сочетание клавиш Ctrl+Space или выбрать пункт меню Правка/Завершить слово. При этом рядом с кареткой появится выпадающий список зарезервированных слов языка, а курсор будет позиционирован на ближайшем слове, начало которого совпадает по написанию с символами, введенными пользователем. Далее необходимо выбрать требуемое слово из списка с помощью клавиатуры (клавиши стрелок и клавиша Enter) или мыши. Выбранное слово заменит введенные пользователем начальные символы. Убрать выпадающий список слов без внесения изменений в текст модели можно с помощью клавиши Esc. Если в списке возможных замен находится только одно значение, то оно подставляется автоматически, а сам список не отображается.

    -

    -

    Существует возможность настройки автозавершения, более подробно описанные в настройках программного комплекса.

    -

    См. также

    -

    Настройки автозавершения

    -
    - +
    +

    АВТОЗАВЕРШЕНИЕ (CODE COMPLETION)

    +

    В данной версии программного комплекса имеется механизм автоматического завершения (автозавершения) синтаксических конструкций языка (т.н. code completion). Автозавершение позволяет пользователю не вводить полностью самостоятельно синтаксические конструкции языка. Для пользователя достаточно ввести один или несколько начальных символов конструкции и нажать сочетание клавиш Ctrl+Space или выбрать пункт меню Правка/Завершить слово. При этом рядом с кареткой появится выпадающий список зарезервированных слов языка, а курсор будет позиционирован на ближайшем слове, начало которого совпадает по написанию с символами, введенными пользователем. Далее необходимо выбрать требуемое слово из списка с помощью клавиатуры (клавиши стрелок и клавиша Enter) или мыши. Выбранное слово заменит введенные пользователем начальные символы. Убрать выпадающий список слов без внесения изменений в текст модели можно с помощью клавиши Esc. Если в списке возможных замен находится только одно значение, то оно подставляется автоматически, а сам список не отображается.

    +

    +

    Существует возможность настройки автозавершения, более подробно описанные в настройках программного комплекса.

    +

    См. также

    +

    Настройки автозавершения

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_creation.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_creation.htm index a177bcefa..09ce531a7 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_creation.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_creation.htm @@ -5,42 +5,42 @@ -
    -

    СОЗДАНИЕ МОДЕЛИ

    -

    Создать новую модель можно с помощью пункта меню Файл/Новая модель, комбинации клавиш Ctrl+N или кнопки на панели инструментов проекта - . Если перед созданием новой модели редактировалась другая модель и изменения не были сохранены, то выдается запрос на сохранение изменений.

    -

    Новая модель будет создана на основе варианта, который выбирается в диалоге:

    -

    -

    Типовые варианты:

    - - - - - - - - - - - - - - - - - - - - - -
    ШаблонОписание
    Пустая модельСоздается пустая модель с заполненным файлом прогона имя_модели.smr
    Только каркасФайлы модели будут содержать только шаблоны типовых конструкций (объектов) модели
    Модель простейшей СМОМодель простейшей парикмахерской с одним парикмахером. Модель компилируется, запускается, выводятся собираемые показатели.
    Модель многоканальной СМО с временными ресурсамиМодель простейшей парикмахерской с тремя парикмахерами, клиенты создаются при появлении в парикмахерской и удаляются после обслуживания. Модель компилируется, запускается, выводятся собираемые показатели.
    -

    При установленном флаге Добавить комментарии текст модели будет дополнен пояснениями.

    -

    Все файлы создаваемой модели имеют одно указанное имя, но разные расширения, создаются они в папке с одноимённым названием и имеют текстовый формат. Если модель с указанным именем уже существует, то можно сменить имя в поле ввода имени или директорию создаваемой модели, с помощью соответствующей кнопки под именем модели:

    -

    -

    Ниже приводится пример созданной модели на основе шаблона простейшей СМО с включенными пояснениями:

    -

    -

    См. также

    -

    Шаблоны и вставка синтаксических конструкций

    -
    - +
    +

    СОЗДАНИЕ МОДЕЛИ

    +

    Создать новую модель можно с помощью пункта меню Файл/Новая модель, комбинации клавиш Ctrl+N или кнопки на панели инструментов проекта - . Если перед созданием новой модели редактировалась другая модель и изменения не были сохранены, то выдается запрос на сохранение изменений.

    +

    Новая модель будет создана на основе варианта, который выбирается в диалоге:

    +

    +

    Типовые варианты:

    + + + + + + + + + + + + + + + + + + + + + +
    ШаблонОписание
    Пустая модельСоздается пустая модель с заполненным файлом прогона имя_модели.smr
    Только каркасФайлы модели будут содержать только шаблоны типовых конструкций (объектов) модели
    Модель простейшей СМОМодель простейшей парикмахерской с одним парикмахером. Модель компилируется, запускается, выводятся собираемые показатели.
    Модель многоканальной СМО с временными ресурсамиМодель простейшей парикмахерской с тремя парикмахерами, клиенты создаются при появлении в парикмахерской и удаляются после обслуживания. Модель компилируется, запускается, выводятся собираемые показатели.
    +

    При установленном флаге Добавить комментарии текст модели будет дополнен пояснениями.

    +

    Все файлы создаваемой модели имеют одно указанное имя, но разные расширения, создаются они в папке с одноимённым названием и имеют текстовый формат. Если модель с указанным именем уже существует, то можно сменить имя в поле ввода имени или директорию создаваемой модели, с помощью соответствующей кнопки под именем модели:

    +

    +

    Ниже приводится пример созданной модели на основе шаблона простейшей СМО с включенными пояснениями:

    +

    +

    См. также

    +

    Шаблоны и вставка синтаксических конструкций

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_edit.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_edit.htm index 0e57202a4..8f2df93ce 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_edit.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_edit.htm @@ -5,42 +5,42 @@ -
    -

    РЕДАКТИРОВАНИЕ МОДЕЛИ

    -

    Редактирование объектов модели осуществляется в полях редактирования, находящихся на соответствующих закладках главного окна программного комплекса. При редактировании используются стандартные клавиши и сочетания клавиш WINDOWS.

    -
    -

    В процессе редактирования некоторая информация отображается в строке состояния:

    -
      -
    • В первой позиции отображается текущее положение каретки (позиция в строке, номер строки) в редактируемом объекте. -
    • Во второй - состояние редактируемого объекта. В том случае, если имело место изменение текста объекта, в данной панели отображается слово "Изменён". Если объект доступен только для чтения, то на панели отображается фраза "Только чтение". -
    • Третья – индикатор режима редактирования текста (вставка или замена) в текущем объекте. Переключение режимов осуществляется клавишей Ins. Если для данного объекта включен режим замены, то на панели отображается слово "Замена" и изменяется форма каретки. -
    -

    -
    -

    Выделение фрагментов текста

    -

    Удерживая нажатой клавишу Alt, с помощью мыши, пользователь имеет возможность выделять текст прямоугольными блоками. Будучи скопированным в буфер обмена, данный текст может быть вставлен в текст модели так же в виде прямоугольного блока.

    -

    Выделение всего текста объекта модели осуществляется выбором пункта меню Правка/Выделить всё или нажатием комбинации клавиш Ctrl+A, а также с помощью выпадающего меню поля редактирования при нажатии на правую кнопку мыши.

    -

    Для выделения строки целиком необходимо нажать левую клавишу мыши на поле слева от текста. Для выделения группы строк необходимо, удерживая левую клавишу мыши нажатой, двигать мышь вдоль поля.

    -
    -

    Работа с выделенными фрагментами

    -

    Копирование выделенного фрагмента в буфер обмена осуществляется с помощью пункта меню Правка/Копировать, нажатием комбинации клавиш Ctrl+C или кнопки панели инструментов редактирования, а также с помощью выпадающего меню поля редактирования при нажатии на правую кнопку мыши.

    -

    Вырезание выделенного фрагмента в буфер обмена осуществляется с помощью пункта меню Правка/Вырезать, нажатием комбинации клавиш Ctrl+X или кнопки панели инструментов редактирования, а также с помощью выпадающего меню поля редактирования при нажатии на правую кнопку мыши.

    -

    Вставка скопированного фрагмента из буфера обмена осуществляется с помощью пункта меню Правка/Вставить, нажатием комбинации клавиш Ctrl+V или кнопки панели инструментов редактирования, а также с помощью выпадающего меню поля редактирования при нажатии на правую кнопку мыши.

    -

    Удаление выделенного фрагмента осуществляется с помощью пункта меню Правка/Удалить или нажатием клавиши Del.

    -

    Скопировать выделенный фрагмент в буфер обмена в формате RTF с сохранением форматирования и цветового выделения синтаксических конструкций языка следует путем выбора пункта меню Правка/Копировать как RTF:

    -

    -

    -

    Существует возможность изменения регистра символов в выделенном фрагменте. Для изменения регистра на верхний (все прописные буквы) используется пункт меню Правка/В верхний регистр (комбинация клавиш Ctrl+Shift+U), а для изменения регистра на нижний - пункт меню Правка/В нижний регистр (комбинация клавиш Ctrl+U):

    -

    -

    -

    -

    Имеется возможность закомментировать (в терминах РДО) выделенный фрагмент текста. Для этого необходимо выбрать пункт меню Правка/Закомментировать выделенное или нажать комбинацию клавиш Ctrl+Q. При этом перед началом выделенного фрагмента будет установлен символ начала комментария, а после окончания - символ конца комментария:

    -

    -

    -
    -

    Откат изменений

    -

    Для каждого из объектов возможен откат и повторное внесение изменений. Откат изменений осуществляется выбором пункта меню Правка/Отменить, нажатием комбинации клавиш Ctrl+Z или кнопки в панели инструментов редактирования. Заново внести изменения, для которых был осуществлен откат, можно с помощью пункта меню Правка/Повторить, нажатием комбинации клавиш Ctrl+Y или кнопки на панели инструментов редактирования.

    -
    - +
    +

    РЕДАКТИРОВАНИЕ МОДЕЛИ

    +

    Редактирование объектов модели осуществляется в полях редактирования, находящихся на соответствующих закладках главного окна программного комплекса. При редактировании используются стандартные клавиши и сочетания клавиш WINDOWS.

    +
    +

    В процессе редактирования некоторая информация отображается в строке состояния:

    +
      +
    • В первой позиции отображается текущее положение каретки (позиция в строке, номер строки) в редактируемом объекте. +
    • Во второй - состояние редактируемого объекта. В том случае, если имело место изменение текста объекта, в данной панели отображается слово "Изменён". Если объект доступен только для чтения, то на панели отображается фраза "Только чтение". +
    • Третья – индикатор режима редактирования текста (вставка или замена) в текущем объекте. Переключение режимов осуществляется клавишей Ins. Если для данного объекта включен режим замены, то на панели отображается слово "Замена" и изменяется форма каретки. +
    +

    +
    +

    Выделение фрагментов текста

    +

    Удерживая нажатой клавишу Alt, с помощью мыши, пользователь имеет возможность выделять текст прямоугольными блоками. Будучи скопированным в буфер обмена, данный текст может быть вставлен в текст модели так же в виде прямоугольного блока.

    +

    Выделение всего текста объекта модели осуществляется выбором пункта меню Правка/Выделить всё или нажатием комбинации клавиш Ctrl+A, а также с помощью выпадающего меню поля редактирования при нажатии на правую кнопку мыши.

    +

    Для выделения строки целиком необходимо нажать левую клавишу мыши на поле слева от текста. Для выделения группы строк необходимо, удерживая левую клавишу мыши нажатой, двигать мышь вдоль поля.

    +
    +

    Работа с выделенными фрагментами

    +

    Копирование выделенного фрагмента в буфер обмена осуществляется с помощью пункта меню Правка/Копировать, нажатием комбинации клавиш Ctrl+C или кнопки панели инструментов редактирования, а также с помощью выпадающего меню поля редактирования при нажатии на правую кнопку мыши.

    +

    Вырезание выделенного фрагмента в буфер обмена осуществляется с помощью пункта меню Правка/Вырезать, нажатием комбинации клавиш Ctrl+X или кнопки панели инструментов редактирования, а также с помощью выпадающего меню поля редактирования при нажатии на правую кнопку мыши.

    +

    Вставка скопированного фрагмента из буфера обмена осуществляется с помощью пункта меню Правка/Вставить, нажатием комбинации клавиш Ctrl+V или кнопки панели инструментов редактирования, а также с помощью выпадающего меню поля редактирования при нажатии на правую кнопку мыши.

    +

    Удаление выделенного фрагмента осуществляется с помощью пункта меню Правка/Удалить или нажатием клавиши Del.

    +

    Скопировать выделенный фрагмент в буфер обмена в формате RTF с сохранением форматирования и цветового выделения синтаксических конструкций языка следует путем выбора пункта меню Правка/Копировать как RTF:

    +

    +

    +

    Существует возможность изменения регистра символов в выделенном фрагменте. Для изменения регистра на верхний (все прописные буквы) используется пункт меню Правка/В верхний регистр (комбинация клавиш Ctrl+Shift+U), а для изменения регистра на нижний - пункт меню Правка/В нижний регистр (комбинация клавиш Ctrl+U):

    +

    +

    +

    +

    Имеется возможность закомментировать (в терминах РДО) выделенный фрагмент текста. Для этого необходимо выбрать пункт меню Правка/Закомментировать выделенное или нажать комбинацию клавиш Ctrl+Q. При этом перед началом выделенного фрагмента будет установлен символ начала комментария, а после окончания - символ конца комментария:

    +

    +

    +
    +

    Откат изменений

    +

    Для каждого из объектов возможен откат и повторное внесение изменений. Откат изменений осуществляется выбором пункта меню Правка/Отменить, нажатием комбинации клавиш Ctrl+Z или кнопки в панели инструментов редактирования. Заново внести изменения, для которых был осуществлен откат, можно с помощью пункта меню Правка/Повторить, нажатием комбинации клавиш Ctrl+Y или кнопки на панели инструментов редактирования.

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_find_in_model.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_find_in_model.htm index 9e1e503db..2e30c3417 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_find_in_model.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_find_in_model.htm @@ -5,22 +5,22 @@ -
    -

    ПОИСК ФРАЗЫ ПО ВСЕЙ МОДЕЛИ

    -

    В комплексе RAO-studio имеется возможность поиска подстрок по всей модели целиком. Для общего поиска подстроки необходимо воспользоваться пунктом меню Поиск/Найти в модели. После этого будет выведено стандартное диалоговое окно WINDOWS для поиска подстрок, где пользователю необходимо указать подстроку для поиска, задать параметры поиска и нажать кнопку Найти далее (Find Next).

    -

    -

    После этого будет произведен поиск подстроки в текстах файлов модели, результаты которого будут отображены на закладке Поиск окна Панель вывода. Результаты представляются в виде:

    -
      -
    • тип файла модели (PAT, RPT, RSS и т.п.)
    • -
    • номер строки
    • -
    • строка целиком, в которой была найдена искомая фраза
    • -
    -

    Отчет о найденных подстроках заканчивается сообщением о количестве найденных подстрок.

    -

    -

    При двойном щелчке мыши по строке с результатами поиска, курсор устанавливается в начало найденной подстроки в тексте модели.

    -

    См. также

    -

    Поиск и замена подстрок

    -
    - +
    +

    ПОИСК ФРАЗЫ ПО ВСЕЙ МОДЕЛИ

    +

    В комплексе RAO-studio имеется возможность поиска подстрок по всей модели целиком. Для общего поиска подстроки необходимо воспользоваться пунктом меню Поиск/Найти в модели. После этого будет выведено стандартное диалоговое окно WINDOWS для поиска подстрок, где пользователю необходимо указать подстроку для поиска, задать параметры поиска и нажать кнопку Найти далее (Find Next).

    +

    +

    После этого будет произведен поиск подстроки в текстах файлов модели, результаты которого будут отображены на закладке Поиск окна Панель вывода. Результаты представляются в виде:

    +
      +
    • тип файла модели (PAT, RPT, RSS и т.п.)
    • +
    • номер строки
    • +
    • строка целиком, в которой была найдена искомая фраза
    • +
    +

    Отчет о найденных подстроках заканчивается сообщением о количестве найденных подстрок.

    +

    +

    При двойном щелчке мыши по строке с результатами поиска, курсор устанавливается в начало найденной подстроки в тексте модели.

    +

    См. также

    +

    Поиск и замена подстрок

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_frame.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_frame.htm index 6ab69fcb8..a74522a51 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_frame.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_frame.htm @@ -6,92 +6,92 @@ -
    -

    РЕЖИМЫ МОДЕЛИРОВАНИЯ

    -

    После запуска модели на исполнение, у пользователя есть возможность выбрать режим моделирования.

    - - - - - - - - - - - - - - - - - - - - - - - - - - -
    РежимКнопкаОписание
    Максимальная производительностьРежим максимальной производительности системы моделирования. Скорость моделирования определяется производительностью компьютера. Масштабный коэффициент и регулятор скорости не учитываются. Отключается вывод анимации, графиков и трассировки на экран (данные по трассировке продолжают собираться).
    Дискретная имитацияВ режиме дискретной имитации переходы между событиями осуществляются как можно быстрее без синхронизации с таймером операционной системы, т.е. интервалы времени между событиями в модели учитываются в расчетах модельного времени, но никак не проявляются в анимации и считаются равными друг другу (с точностью до сложности расчета каждого события). Скорость моделирования определяется производительностью компьютера и регулятором скорости имитатора. Если модель содержит кадры анимации, то они могут быть выведены на экран. Доступно построение графиков и просмотр данных трассировки в режиме реального времени. Если сравнивать с режимом синхронной имитации, то для дискретной имитации масштабный коэффициент времени равен бесконечности. Т.е. модель в этом режиме работает с максимальным быстродействием, учитывающим регулятор скорости имитатора, и позволяет отображать анимацию.
    Синхронная имитацияВ режиме синхронной имитации переходы между событиями осуществляются по синхронизации с таймером операционной системы, т.е. интервалы времени между событиями в модели учитываются не только в расчетах, но и при выводе анимации. Скорость моделирования определяется пользователем через масштабный коэффициент. Масштабный коэффициент устанавливает отношение единицы модельного времени к одному часу реального времени, который рассчитывается по таймеру операционной системы и изменяется с помощью соответствующих команд. Регулятор скорости работы имитатора также учитывается. Если модель содержит кадры анимации, то они могут быть выведены на экран. Доступно построение графиков и просмотр данных трассировки в режиме реального времени. При большом значении масштабного коэффициента стирается разница между дискретным и синхронным режимами моделирования, и быстродействие модели начинает определяться мощностью компьютера.
    ПаузаРежим паузы. Процесс моделирования приостанавливается. Чтобы его продолжить, достаточно переключиться на любой другой режим моделирования.
    -

    Поменять скорость имитации можно с помощью команд:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    КомандаКнопкаОписание
    Увеличить масштабУвеличить скорость анимации на 50% процентов. Используется только в режиме синхронной имитации.
    Увеличить масштаб в 4-ре разаУвеличить скорость анимации в 4 раза. Используется только в режиме синхронной имитации.
    Уменьшить масштаб в 4-ре разаУменьшить скорость анимации в 4 раза. Используется только в режиме синхронной имитации.
    Уменьшить масштабУменьшить скорость анимации на 50% процентов. Используется только в режиме синхронной имитации.
    Скорость имитатораЛогарифмическая шкала, регулирующая общую скорость имитатора. Используется в моделях, основанных на продукционных правилах, в которых модельное время остается равным нулю, но имеется анимация. Снизив значение скорости, можно подробнее рассмотреть процесс моделирования. Используется в режимах дискретной и синхронной имитации, не используется в режиме максимального быстродействия.
    -

    Текущее модельное время, режим моделирования, скорость и масштабный коэффициент отображаются в строке состояния:

    -

    -

    В режиме анимации, пользователь может перемещаться по кадрам анимации, выбирая нужный из списка кадров на закладке Анимация окна объектов:

    -

    -

    Или с помощью команд:

    - - - - - - - - - - - - - - - - -
    Команда меню МодельКнопкаОписание
    След. кадр анимацииПерейти к следующему кадру анимации
    Пред. кадр анимацииПерейти к предыдущему кадру анимации
    -
    - +
    +

    РЕЖИМЫ МОДЕЛИРОВАНИЯ

    +

    После запуска модели на исполнение, у пользователя есть возможность выбрать режим моделирования.

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    РежимКнопкаОписание
    Максимальная производительностьРежим максимальной производительности системы моделирования. Скорость моделирования определяется производительностью компьютера. Масштабный коэффициент и регулятор скорости не учитываются. Отключается вывод анимации, графиков и трассировки на экран (данные по трассировке продолжают собираться).
    Дискретная имитацияВ режиме дискретной имитации переходы между событиями осуществляются как можно быстрее без синхронизации с таймером операционной системы, т.е. интервалы времени между событиями в модели учитываются в расчетах модельного времени, но никак не проявляются в анимации и считаются равными друг другу (с точностью до сложности расчета каждого события). Скорость моделирования определяется производительностью компьютера и регулятором скорости имитатора. Если модель содержит кадры анимации, то они могут быть выведены на экран. Доступно построение графиков и просмотр данных трассировки в режиме реального времени. Если сравнивать с режимом синхронной имитации, то для дискретной имитации масштабный коэффициент времени равен бесконечности. Т.е. модель в этом режиме работает с максимальным быстродействием, учитывающим регулятор скорости имитатора, и позволяет отображать анимацию.
    Синхронная имитацияВ режиме синхронной имитации переходы между событиями осуществляются по синхронизации с таймером операционной системы, т.е. интервалы времени между событиями в модели учитываются не только в расчетах, но и при выводе анимации. Скорость моделирования определяется пользователем через масштабный коэффициент. Масштабный коэффициент устанавливает отношение единицы модельного времени к одному часу реального времени, который рассчитывается по таймеру операционной системы и изменяется с помощью соответствующих команд. Регулятор скорости работы имитатора также учитывается. Если модель содержит кадры анимации, то они могут быть выведены на экран. Доступно построение графиков и просмотр данных трассировки в режиме реального времени. При большом значении масштабного коэффициента стирается разница между дискретным и синхронным режимами моделирования, и быстродействие модели начинает определяться мощностью компьютера.
    ПаузаРежим паузы. Процесс моделирования приостанавливается. Чтобы его продолжить, достаточно переключиться на любой другой режим моделирования.
    +

    Поменять скорость имитации можно с помощью команд:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    КомандаКнопкаОписание
    Увеличить масштабУвеличить скорость анимации на 50% процентов. Используется только в режиме синхронной имитации.
    Увеличить масштаб в 4-ре разаУвеличить скорость анимации в 4 раза. Используется только в режиме синхронной имитации.
    Уменьшить масштаб в 4-ре разаУменьшить скорость анимации в 4 раза. Используется только в режиме синхронной имитации.
    Уменьшить масштабУменьшить скорость анимации на 50% процентов. Используется только в режиме синхронной имитации.
    Скорость имитатораЛогарифмическая шкала, регулирующая общую скорость имитатора. Используется в моделях, основанных на продукционных правилах, в которых модельное время остается равным нулю, но имеется анимация. Снизив значение скорости, можно подробнее рассмотреть процесс моделирования. Используется в режимах дискретной и синхронной имитации, не используется в режиме максимального быстродействия.
    +

    Текущее модельное время, режим моделирования, скорость и масштабный коэффициент отображаются в строке состояния:

    +

    +

    В режиме анимации, пользователь может перемещаться по кадрам анимации, выбирая нужный из списка кадров на закладке Анимация окна объектов:

    +

    +

    Или с помощью команд:

    + + + + + + + + + + + + + + + + +
    Команда меню МодельКнопкаОписание
    След. кадр анимацииПерейти к следующему кадру анимации
    Пред. кадр анимацииПерейти к предыдущему кадру анимации
    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_insert.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_insert.htm index 05fab2c8e..df151d33e 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_insert.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_insert.htm @@ -5,16 +5,16 @@ -
    -

    ШАБЛОНЫ И ВСТАВКА СИНТАКСИЧЕСКИХ КОНСТРУКЦИЙ

    -

    Для обеспечения возможности быстрого ввода текста модели с минимальным количеством ошибок пользователь имеет возможность работать с шаблонами элементов модели и автоматически вставлять синтаксические конструкции языка. Для этого необходимо воспользоваться меню Вставка.

    -

    В данном меню шаблоны и синтаксические конструкции сгруппированы по объектам модели. Группы названы, исходя из тех же соображений, что и закладки в главном окне программного комплекса.

    -

    При выборе группы раскрывается подменю, которое содержит шаблоны элементов данного объекта и синтаксические конструкции, употребляемые в данном объекте. Шаблоны находятся в верхней части подменю, и их наименования начинаются с наименования подгруппы. Например: при выборе пункта меню Вставка/PAT/PAT rule в текст будет вставлен шаблон для описания образца типа продукционное правило:

    -

    -

    Синтаксические конструкции следуют за шаблонами, и выбор конкретной конструкции обеспечивает ее вставку в текст модели без синтаксических ошибок.

    -

    Также существует возможность вставки стандартных арифметических и логических функций языка. Эти возможности предоставляют подпункты пункта меню Вставка/Функции.

    -

    Меню Вставка также имеется в выпадающем меню поля редактирования, активизируемом при нажатии на правую кнопку мыши.

    -
    - +
    +

    ШАБЛОНЫ И ВСТАВКА СИНТАКСИЧЕСКИХ КОНСТРУКЦИЙ

    +

    Для обеспечения возможности быстрого ввода текста модели с минимальным количеством ошибок пользователь имеет возможность работать с шаблонами элементов модели и автоматически вставлять синтаксические конструкции языка. Для этого необходимо воспользоваться меню Вставка.

    +

    В данном меню шаблоны и синтаксические конструкции сгруппированы по объектам модели. Группы названы, исходя из тех же соображений, что и закладки в главном окне программного комплекса.

    +

    При выборе группы раскрывается подменю, которое содержит шаблоны элементов данного объекта и синтаксические конструкции, употребляемые в данном объекте. Шаблоны находятся в верхней части подменю, и их наименования начинаются с наименования подгруппы. Например: при выборе пункта меню Вставка/PAT/PAT rule в текст будет вставлен шаблон для описания образца типа продукционное правило:

    +

    +

    Синтаксические конструкции следуют за шаблонами, и выбор конкретной конструкции обеспечивает ее вставку в текст модели без синтаксических ошибок.

    +

    Также существует возможность вставки стандартных арифметических и логических функций языка. Эти возможности предоставляют подпункты пункта меню Вставка/Функции.

    +

    Меню Вставка также имеется в выпадающем меню поля редактирования, активизируемом при нажатии на правую кнопку мыши.

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_intro.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_intro.htm index f3575f685..565a4a43a 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_intro.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_intro.htm @@ -5,14 +5,14 @@ -
    -

    РАБОТА С МОДЕЛЬЮ

    -

    В данном разделе описаны основные возможности по редактированию текстов моделей, предоставляемые программным комплексом.

    -

    См. также

    -

    Общие сведения

    -

    Настройки

    -

    Получение справочной информации

    -
    - +
    +

    РАБОТА С МОДЕЛЬЮ

    +

    В данном разделе описаны основные возможности по редактированию текстов моделей, предоставляемые программным комплексом.

    +

    См. также

    +

    Общие сведения

    +

    Настройки

    +

    Получение справочной информации

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_open.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_open.htm index 9d022b841..c5f428bac 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_open.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_open.htm @@ -5,17 +5,17 @@ -
    -

    ОТКРЫТИЕ МОДЕЛИ

    -

    Открыть модель можно путем выбора пункта меню Файл/Открыть, нажав комбинацию клавиш Ctrl+O или с помощью нажатия соответствующей кнопки на панели инструментов проекта - .

    -

    При этом выдается стандартное диалоговое окно WINDOWS для открытия файла, где пользователю предлагается выбрать модель (файл прогона с расширением *.smr):

    -

    -

    После этого модель будет открыта и ее объекты будут отображены на соответствующих закладках. Это означает, что модель доступна для просмотра, редактирования и запуска:

    -

    -

    Существует возможность повторного открытия ранее открывавшейся модели. Для этого необходимо выбрать пункт меню Файл/Недавние. Далее в подменю выбирается модель для открытия.

    -

    См. также

    -

    Описание объекта прогона

    -
    - +
    +

    ОТКРЫТИЕ МОДЕЛИ

    +

    Открыть модель можно путем выбора пункта меню Файл/Открыть, нажав комбинацию клавиш Ctrl+O или с помощью нажатия соответствующей кнопки на панели инструментов проекта - .

    +

    При этом выдается стандартное диалоговое окно WINDOWS для открытия файла, где пользователю предлагается выбрать модель (файл прогона с расширением *.smr):

    +

    +

    После этого модель будет открыта и ее объекты будут отображены на соответствующих закладках. Это означает, что модель доступна для просмотра, редактирования и запуска:

    +

    +

    Существует возможность повторного открытия ранее открывавшейся модели. Для этого необходимо выбрать пункт меню Файл/Недавние. Далее в подменю выбирается модель для открытия.

    +

    См. также

    +

    Описание объекта прогона

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_results.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_results.htm index b9b2deb5a..8fdd8415f 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_results.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_results.htm @@ -5,22 +5,22 @@ -
    -

    РЕЗУЛЬТАТЫ МОДЕЛИРОВАНИЯ

    -

    Результатами моделирования являются объекты:

    -
      -
    • объект результатов, который выводится на закладку Результаты окна вывода автоматически при завершении прогона: -

      -
    • объект трассировки, который отображается в режиме реального времени в процессе моделирования на закладке Трассировка окна вывода: -

      -
    • графики изменения трассируемых величин, которые отображается в режиме реального времени в процессе моделирования на закладке Графики окна объектов: -

      -
    -

    См. также

    -

    Объект результатов

    -

    Объект трассировки

    -

    Автоматическое построение графиков

    -
    - +
    +

    РЕЗУЛЬТАТЫ МОДЕЛИРОВАНИЯ

    +

    Результатами моделирования являются объекты:

    +
      +
    • объект результатов, который выводится на закладку Результаты окна вывода автоматически при завершении прогона: +

      +
    • объект трассировки, который отображается в режиме реального времени в процессе моделирования на закладке Трассировка окна вывода: +

      +
    • графики изменения трассируемых величин, которые отображается в режиме реального времени в процессе моделирования на закладке Графики окна объектов: +

      +
    +

    См. также

    +

    Объект результатов

    +

    Объект трассировки

    +

    Автоматическое построение графиков

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_run.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_run.htm index 9207624a1..e9ab42eda 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_run.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_run.htm @@ -5,17 +5,17 @@ -
    -

    КОМПИЛЯЦИЯ И ЗАПУСК МОДЕЛИ

    -

    Текст модели перед запуском компилируется с помощью пункта меню Модель/Скомпилировать или нажатием клавиши F7. На этой стадии происходит обнаружение синтаксических ошибок. Отчет о компиляции выводится на закладку Компилятор окна вывода:

    -

    -

    Если была обнаружена ошибка, то курсор автоматически устанавливается на неё:

    -

    -

    Также могут быть выявлены несущественные нарушения, которые называются предупреждениями. На них курсор автоматически не устанавливается. Просмотреть найденные нарушения можно, нажимая на каждое предупреждение мышкой:

    -

    -

    Запуск модели осуществляется путем выбора пункта меню Модель/Запустить, нажатием клавиши F5 или кнопки панели инструментов проекта. Перед запуском модель автоматически записывается и компилируется. Если возникает синтаксическая ошибка, то выдается соответствующее сообщение и запуск отменяется.

    -

    Остановить прогон (запущенную на исполнение модель) можно выбрав пункт меню Модель/Остановить, нажатием комбинации клавиш Shift+F5 или кнопки панели инструментов проекта.

    -
    - +
    +

    КОМПИЛЯЦИЯ И ЗАПУСК МОДЕЛИ

    +

    Текст модели перед запуском компилируется с помощью пункта меню Модель/Скомпилировать или нажатием клавиши F7. На этой стадии происходит обнаружение синтаксических ошибок. Отчет о компиляции выводится на закладку Компилятор окна вывода:

    +

    +

    Если была обнаружена ошибка, то курсор автоматически устанавливается на неё:

    +

    +

    Также могут быть выявлены несущественные нарушения, которые называются предупреждениями. На них курсор автоматически не устанавливается. Просмотреть найденные нарушения можно, нажимая на каждое предупреждение мышкой:

    +

    +

    Запуск модели осуществляется путем выбора пункта меню Модель/Запустить, нажатием клавиши F5 или кнопки панели инструментов проекта. Перед запуском модель автоматически записывается и компилируется. Если возникает синтаксическая ошибка, то выдается соответствующее сообщение и запуск отменяется.

    +

    Остановить прогон (запущенную на исполнение модель) можно выбрав пункт меню Модель/Остановить, нажатием комбинации клавиш Shift+F5 или кнопки панели инструментов проекта.

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_search_replace.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_search_replace.htm index c7eef3908..d0fcaf12c 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_search_replace.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_search_replace.htm @@ -5,19 +5,19 @@ -
    -

    ПОИСК И ЗАМЕНА ПОДСТРОК

    -

    В комплексе RAO-studio имеются возможности для поиска и замены подстрок в тексте модели.

    -

    Для первоначального поиска подстроки необходимо воспользоваться пунктом меню Поиск/Найти, нажать комбинацию клавиш Ctrl+F или кнопку панели инструментов редактирования. После этого будет выведено стандартное диалоговое окно WINDOWS для поиска подстрок, где пользователю необходимо указать подстроку для поиска, задать параметры поиска и нажать кнопку Найти далее (Find Next).

    -

    -

    Для окончания поиска необходимо нажать кнопку Отмена (Cancel). Повторный поиск в направлении от текущего положения к концу текста может быть осуществлен путем выбора пункта меню Поиск/Найти следующий или нажатием на клавишу F3. Повторный поиск в направлении от текущего положения к началу текста осуществляется путем выбора пункта меню Поиск/Найти предыдущий или нажатием сочетания клавиш Shift+F3. Диалоговое окно в этом случае не выдается. Поиск и повторный поиск может осуществляться в любом объекте модели.

    -

    Существует еще одна возможность поиска слова, на котором стоит курсор. Для этого необходимо установить курсор на интересующее слово и нажать комбинацию клавиш Ctrl+F3. Система произведет поиск первого вхождения подстроки представляющей собой интересующее слово в направлении от курсора к концу текста. Далее может быть осуществлен повторный поиск с помощью комбинаций клавиш F3, Shift+F3 или пунктов меню Поиск/Найти следующий, Поиск/Найти предыдущий.

    -

    При необходимости произвести замену подстроки в тексте на другую подстроку пользователь может воспользоваться пунктом меню Поиск/Заменить, нажать сочетание клавиш Ctrl+H или кнопку панели инструментов редактирования. После этого будет выведено стандартное диалоговое окно WINDOWS для замены подстрок, где пользователю необходимо указать подстроку для поиска, задать параметры поиска и нажать кнопку Найти далее (Find Next), Заменить (Replace) или Заменить все (Replace All).

    -

    -

    Замена может осуществляться в любом объекте модели.

    -

    См. также

    -

    Поиск фразы по всей модели

    -
    - +
    +

    ПОИСК И ЗАМЕНА ПОДСТРОК

    +

    В комплексе RAO-studio имеются возможности для поиска и замены подстрок в тексте модели.

    +

    Для первоначального поиска подстроки необходимо воспользоваться пунктом меню Поиск/Найти, нажать комбинацию клавиш Ctrl+F или кнопку панели инструментов редактирования. После этого будет выведено стандартное диалоговое окно WINDOWS для поиска подстрок, где пользователю необходимо указать подстроку для поиска, задать параметры поиска и нажать кнопку Найти далее (Find Next).

    +

    +

    Для окончания поиска необходимо нажать кнопку Отмена (Cancel). Повторный поиск в направлении от текущего положения к концу текста может быть осуществлен путем выбора пункта меню Поиск/Найти следующий или нажатием на клавишу F3. Повторный поиск в направлении от текущего положения к началу текста осуществляется путем выбора пункта меню Поиск/Найти предыдущий или нажатием сочетания клавиш Shift+F3. Диалоговое окно в этом случае не выдается. Поиск и повторный поиск может осуществляться в любом объекте модели.

    +

    Существует еще одна возможность поиска слова, на котором стоит курсор. Для этого необходимо установить курсор на интересующее слово и нажать комбинацию клавиш Ctrl+F3. Система произведет поиск первого вхождения подстроки представляющей собой интересующее слово в направлении от курсора к концу текста. Далее может быть осуществлен повторный поиск с помощью комбинаций клавиш F3, Shift+F3 или пунктов меню Поиск/Найти следующий, Поиск/Найти предыдущий.

    +

    При необходимости произвести замену подстроки в тексте на другую подстроку пользователь может воспользоваться пунктом меню Поиск/Заменить, нажать сочетание клавиш Ctrl+H или кнопку панели инструментов редактирования. После этого будет выведено стандартное диалоговое окно WINDOWS для замены подстрок, где пользователю необходимо указать подстроку для поиска, задать параметры поиска и нажать кнопку Найти далее (Find Next), Заменить (Replace) или Заменить все (Replace All).

    +

    +

    Замена может осуществляться в любом объекте модели.

    +

    См. также

    +

    Поиск фразы по всей модели

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_tabsheets.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_tabsheets.htm index e43f60b76..6e5c97428 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_tabsheets.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_model/work_model_tabsheets.htm @@ -5,55 +5,55 @@ -
    -

    ЗАКЛАДКИ ГЛАВНОГО ОКНА

    -

    На данных закладках расположены поля для просмотра и/или редактирования объектов модели на языке РДО:

    -

    -

    Далее приведен список закладок с соответствующими им объектами модели:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Наименование закладкиОбъект модели
    PATОбъект образцов
    RTPОбъект типов ресурсов
    RSSОбъект ресурсов
    FRMОбъект кадров анимации
    FUNОбъект констант, функций и последовательностей
    DPTОбъект точек принятия решений и процессов обслуживания
    SMRОбъект прогона
    PMDОбъект требуемой статистики
    -

    Переключаясь между закладками, пользователь может редактировать различные элементы модели.

    -

    В поле редактирования отображается текст соответствующего объекта. Поле редактирования имеет набор полей для отображения служебной информации (номера строк, границы сворачиваемого фрагмента текста, закладки). Эти поля отображаются слева от редактируемого текста. Поле редактирования имеет выпадающее меню, активизируемое при нажатии на правую кнопку мыши. Это меню содержит функции для вставки синтаксических конструкций языка и шаблонов, работы с буфером обмена, выделения, а также поиска и замены фрагментов текста.

    -

    См. также

    -

    Язык РДО. Основные понятия

    -

    Работа с моделью

    -
    - +
    +

    ЗАКЛАДКИ ГЛАВНОГО ОКНА

    +

    На данных закладках расположены поля для просмотра и/или редактирования объектов модели на языке РДО:

    +

    +

    Далее приведен список закладок с соответствующими им объектами модели:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Наименование закладкиОбъект модели
    PATОбъект образцов
    RTPОбъект типов ресурсов
    RSSОбъект ресурсов
    FRMОбъект кадров анимации
    FUNОбъект констант, функций и последовательностей
    DPTОбъект точек принятия решений и процессов обслуживания
    SMRОбъект прогона
    PMDОбъект требуемой статистики
    +

    Переключаясь между закладками, пользователь может редактировать различные элементы модели.

    +

    В поле редактирования отображается текст соответствующего объекта. Поле редактирования имеет набор полей для отображения служебной информации (номера строк, границы сворачиваемого фрагмента текста, закладки). Эти поля отображаются слева от редактируемого текста. Поле редактирования имеет выпадающее меню, активизируемое при нажатии на правую кнопку мыши. Это меню содержит функции для вставки синтаксических конструкций языка и шаблонов, работы с буфером обмена, выделения, а также поиска и замены фрагментов текста.

    +

    См. также

    +

    Язык РДО. Основные понятия

    +

    Работа с моделью

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options.htm index ad7056512..cf5caaef7 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options.htm @@ -6,13 +6,13 @@ -
    -

    НАСТРОЙКИ

    -

    Изменение настроек программного комплекса возможно путем выбора пункта меню Просмотр/Настройки. При этом выводится диалоговое окно настроек, имеющее пять закладок – Основные, Редактор, Табуляция, Стиль и Цвет

    -

    См. также

    -

    Автозавершение (code completion)

    -

    Навигация с помощью закладок

    -
    - +
    +

    НАСТРОЙКИ

    +

    Изменение настроек программного комплекса возможно путем выбора пункта меню Просмотр/Настройки. При этом выводится диалоговое окно настроек, имеющее пять закладок – Основные, Редактор, Табуляция, Стиль и Цвет

    +

    См. также

    +

    Автозавершение (code completion)

    +

    Навигация с помощью закладок

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_editor.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_editor.htm index 5e7527d1b..529c6db2d 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_editor.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_editor.htm @@ -6,49 +6,49 @@ -
    -

    ЗАКЛАДКА РЕДАКТОР

    -

    На данной закладке пользователь имеет возможность настроить работу редактора исходного текста модели.

    -

    -

    В группе Авто-завершение настраиваются параметры автозавершения синтаксических конструкций языка:

    - - - - - - - - - - - - - -
    Наименование настройкиНазначение
    ВключитьВключение/выключение режима автозавершения по нажатию комбинации клавиш Ctrl+Space
    Полный список, Только ближайшие словаВозможен выбор только одного из вариантов. Если выбран первый вариант, то выпадающий список зарезервированных слов языка РДО будет содержать все ключевые слова, а курсор будет позиционирован на ближайшем слове, начало которого совпадает по написанию с символами, введенными пользователем перед нажатием Ctrl+Space. Если выбран второй вариант, то выпадающий список зарезервированных слов языка РДО будет содержать только те слова, начало которых совпадает по написанию с символами, введенными пользователем

    -

    В группе Слева настраивается левый бордюр редактора текста модели:

    - - - - - - - - - - - - - - - - - -
    Наименование настройкиНазначение
    Выводить группыОтобразить полосу для работы со сворачиваемыми фрагментами текста

    Выводить закладкиВывести полосу для отображения закладок

    Выводить номера строкОтобразить номера строк текста модели

    -

    См. также

    -

    Закладка Основные

    -

    Закладка Табуляция

    -

    Закладка Стиль и цвет

    -
    - +
    +

    ЗАКЛАДКА РЕДАКТОР

    +

    На данной закладке пользователь имеет возможность настроить работу редактора исходного текста модели.

    +

    +

    В группе Авто-завершение настраиваются параметры автозавершения синтаксических конструкций языка:

    + + + + + + + + + + + + + +
    Наименование настройкиНазначение
    ВключитьВключение/выключение режима автозавершения по нажатию комбинации клавиш Ctrl+Space
    Полный список, Только ближайшие словаВозможен выбор только одного из вариантов. Если выбран первый вариант, то выпадающий список зарезервированных слов языка РДО будет содержать все ключевые слова, а курсор будет позиционирован на ближайшем слове, начало которого совпадает по написанию с символами, введенными пользователем перед нажатием Ctrl+Space. Если выбран второй вариант, то выпадающий список зарезервированных слов языка РДО будет содержать только те слова, начало которых совпадает по написанию с символами, введенными пользователем

    +

    В группе Слева настраивается левый бордюр редактора текста модели:

    + + + + + + + + + + + + + + + + + +
    Наименование настройкиНазначение
    Выводить группыОтобразить полосу для работы со сворачиваемыми фрагментами текста

    Выводить закладкиВывести полосу для отображения закладок

    Выводить номера строкОтобразить номера строк текста модели

    +

    См. также

    +

    Закладка Основные

    +

    Закладка Табуляция

    +

    Закладка Стиль и цвет

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_general.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_general.htm index 3c97923c6..bd67441ea 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_general.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_general.htm @@ -6,45 +6,45 @@ -
    -

    ЗАКЛАДКА ОСНОВНЫЕ

    -

    На данной закладке пользователь имеет возможность настроить основные (самые общие) параметры системы.

    -

    -

    В группе Привязка к расширению настраивается привязка системы моделирования к расширению файла прогона модели:

    - - - - - - - - - - - - - -
    Наименование настройкиНазначение
    Установить привязку для файла проекта (*.smr)Автоматически установить привязки к файлу прогона
    Проверять в будущемПроверять наличие привязки расширения при каждом запуске
    -

    Настройки, не вошедшие в группы:

    - - - - - - - - - - - - - -
    Наименование настройкиНазначение
    Открывать последний проект при стартеАвтоматически загружать последнюю модель при запуске системы
    Показывать полное имя проекта в заголовкеВыводить полный путь к модели в заголовке окна
    -

    См. также

    -

    Закладка Редактор

    -

    Закладка Табуляция

    -

    Закладка Стиль и цвет

    -
    - +
    +

    ЗАКЛАДКА ОСНОВНЫЕ

    +

    На данной закладке пользователь имеет возможность настроить основные (самые общие) параметры системы.

    +

    +

    В группе Привязка к расширению настраивается привязка системы моделирования к расширению файла прогона модели:

    + + + + + + + + + + + + + +
    Наименование настройкиНазначение
    Установить привязку для файла проекта (*.smr)Автоматически установить привязки к файлу прогона
    Проверять в будущемПроверять наличие привязки расширения при каждом запуске
    +

    Настройки, не вошедшие в группы:

    + + + + + + + + + + + + + +
    Наименование настройкиНазначение
    Открывать последний проект при стартеАвтоматически загружать последнюю модель при запуске системы
    Показывать полное имя проекта в заголовкеВыводить полный путь к модели в заголовке окна
    +

    См. также

    +

    Закладка Редактор

    +

    Закладка Табуляция

    +

    Закладка Стиль и цвет

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_styles_and_color.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_styles_and_color.htm index a9cc2bbbe..5bf04f982 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_styles_and_color.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_styles_and_color.htm @@ -6,86 +6,86 @@ -
    -

    ЗАКЛАДКА СТИЛЬ И ЦВЕТ

    -

    На данной закладке пользователь может настроить режим цветового выделения синтаксических конструкций языка, цвета окон вывода процесса компиляции и отладочной информации, цвета объектов трассировки, графиков и анимации.

    -

    -

    Параметры закладки стилей:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Наименование настройкиНазначение
    Группы элементовСуществует несколько типов окон отображения информации. Различные окна могут состоять из различных элементов. Элементы окон одного типа объединены в одну группу. Каждый элемент группы может быть изменен для более наглядного отображения
    ТемаПонятие темы включает в себя все настойки цветового выделения для выбранной группы элементов. Из выпадающего списка можно выбрать одну из подготовленных заранее тем. В нижней части закладки расположено окно предварительного просмотра темы для группы. На базе любой из подготовленных заранее тем пользователь может разработать свою тему
    Наименование и размер шрифтаЯвляются едиными для всех элементов группы. Для изменения шрифта необходимо выбрать его наименование или размер из соответствующего выпадающего списка. Для некоторых групп доступны только шрифты с фиксированной шириной символа
    Текст, ФонНастройка цвета элемента и его фона. Существует возможность выбрать цвет из выпадающего списка, а также задать собственный цвет, нажав на кнопку [...]. При этом откроется стандартный диалог WINDOWS для выбора цвета. Выбранный цвет добавляется в список и, если не присутствовал в списке изначально, отображается в виде тройки [R, G, B]
    Жирный, Курсив, ПодчеркнутыйС помощью этих флажков задаются параметры шрифта темы для выбранного элемента группы
    Перенос по словамВключение режима переноса текста по словам
    Горизонтальная прокруткаУстановка флага отображения горизонтальной полосы прокрутки
    Вывод предупрежденийУстановка флага включения вывода предупредительных сообщений компилятора (warnings)
    ЗакладкаУстановка флага выбора формы маркера закладки
    ГруппаВыбор формы маркера сворачиваемых фрагментов текста, а также установка флага отображения границ сворачиваемых фрагментов
    Межстрочный  интервалУстановка межстрочного интервала
    Горизонт. отступУстановка величины левого отступа объекта трассировки
    ЗаголовокУстановка размера шрифта заголовка графика
    ЛегендаУстановка размера шрифта "легенды" графика
    Минимальный интервал между значениямиУстановка величины миннимального интервала между значениями графика
    Показать какУстановка типа окна предварительного просмотра темы
    -

    См. также

    -

    Закладка Основные

    -

    Закладка Редактор

    -

    Закладка Табуляция

    -
    - +
    +

    ЗАКЛАДКА СТИЛЬ И ЦВЕТ

    +

    На данной закладке пользователь может настроить режим цветового выделения синтаксических конструкций языка, цвета окон вывода процесса компиляции и отладочной информации, цвета объектов трассировки, графиков и анимации.

    +

    +

    Параметры закладки стилей:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Наименование настройкиНазначение
    Группы элементовСуществует несколько типов окон отображения информации. Различные окна могут состоять из различных элементов. Элементы окон одного типа объединены в одну группу. Каждый элемент группы может быть изменен для более наглядного отображения
    ТемаПонятие темы включает в себя все настойки цветового выделения для выбранной группы элементов. Из выпадающего списка можно выбрать одну из подготовленных заранее тем. В нижней части закладки расположено окно предварительного просмотра темы для группы. На базе любой из подготовленных заранее тем пользователь может разработать свою тему
    Наименование и размер шрифтаЯвляются едиными для всех элементов группы. Для изменения шрифта необходимо выбрать его наименование или размер из соответствующего выпадающего списка. Для некоторых групп доступны только шрифты с фиксированной шириной символа
    Текст, ФонНастройка цвета элемента и его фона. Существует возможность выбрать цвет из выпадающего списка, а также задать собственный цвет, нажав на кнопку [...]. При этом откроется стандартный диалог WINDOWS для выбора цвета. Выбранный цвет добавляется в список и, если не присутствовал в списке изначально, отображается в виде тройки [R, G, B]
    Жирный, Курсив, ПодчеркнутыйС помощью этих флажков задаются параметры шрифта темы для выбранного элемента группы
    Перенос по словамВключение режима переноса текста по словам
    Горизонтальная прокруткаУстановка флага отображения горизонтальной полосы прокрутки
    Вывод предупрежденийУстановка флага включения вывода предупредительных сообщений компилятора (warnings)
    ЗакладкаУстановка флага выбора формы маркера закладки
    ГруппаВыбор формы маркера сворачиваемых фрагментов текста, а также установка флага отображения границ сворачиваемых фрагментов
    Межстрочный  интервалУстановка межстрочного интервала
    Горизонт. отступУстановка величины левого отступа объекта трассировки
    ЗаголовокУстановка размера шрифта заголовка графика
    ЛегендаУстановка размера шрифта "легенды" графика
    Минимальный интервал между значениямиУстановка величины миннимального интервала между значениями графика
    Показать какУстановка типа окна предварительного просмотра темы
    +

    См. также

    +

    Закладка Основные

    +

    Закладка Редактор

    +

    Закладка Табуляция

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_tabs.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_tabs.htm index 3b9b37abb..f6511b83b 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_tabs.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_options/work_options_tabs.htm @@ -6,46 +6,46 @@ -
    -

    ЗАКЛАДКА ТАБУЛЯЦИЯ

    -

    На данной закладке пользователь имеет возможность настроить табуляцию для редактора текста модели и некоторых закладок окна вывода.

    -

    -

    Настройки:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Наименование настройкиНазначение
    Размер табуляцииРазмер табуляции в символах пробела
    Размер отступаРазмер отступа в символах пробела
    Использовать символ табуляции (не пробел)Если не установлен этот флажок, то при нажатии на клавишу Tab на клавиатуре в текст модели вместо символа табуляции будут вставлены пробелы, причем их количество определяется значением Размер табуляции
    Отступ через табуляциюЕсли установлен данный флажок, то нажатие на клавишу Tab на клавиатуре приведет к вставке в текст модели отступа размером Размером отступа
    Стирать табуляцией, Стирать отступомВозможен выбор одного из вариантов. В случае если выбран первый вариант, то при нажатии клавиши Backspace будет удален символ табуляции (если он присутствует). Если выбран второй вариант, то при нажатии на клавишу Backspace будет удален весь отступ целиком (может состоять из нескольких символов табуляции и пробелов)
    Авто-отступВключение механизма автоматического переноса отступа от предыдущей строки к следующей при переводе каретки
    -

    См. также

    -

    Закладка Основные

    -

    Закладка Редактор

    -

    Закладка Стиль и цвет

    -
    - +
    +

    ЗАКЛАДКА ТАБУЛЯЦИЯ

    +

    На данной закладке пользователь имеет возможность настроить табуляцию для редактора текста модели и некоторых закладок окна вывода.

    +

    +

    Настройки:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Наименование настройкиНазначение
    Размер табуляцииРазмер табуляции в символах пробела
    Размер отступаРазмер отступа в символах пробела
    Использовать символ табуляции (не пробел)Если не установлен этот флажок, то при нажатии на клавишу Tab на клавиатуре в текст модели вместо символа табуляции будут вставлены пробелы, причем их количество определяется значением Размер табуляции
    Отступ через табуляциюЕсли установлен данный флажок, то нажатие на клавишу Tab на клавиатуре приведет к вставке в текст модели отступа размером Размером отступа
    Стирать табуляцией, Стирать отступомВозможен выбор одного из вариантов. В случае если выбран первый вариант, то при нажатии клавиши Backspace будет удален символ табуляции (если он присутствует). Если выбран второй вариант, то при нажатии на клавишу Backspace будет удален весь отступ целиком (может состоять из нескольких символов табуляции и пробелов)
    Авто-отступВключение механизма автоматического переноса отступа от предыдущей строки к следующей при переводе каретки
    +

    См. также

    +

    Закладка Основные

    +

    Закладка Редактор

    +

    Закладка Стиль и цвет

    +
    + diff --git a/app/rdo_studio/help/rdo_studio_rus/html/work_run.htm b/app/rdo_studio/help/rdo_studio_rus/html/work_run.htm index c38ea3cb4..1609902b6 100644 --- a/app/rdo_studio/help/rdo_studio_rus/html/work_run.htm +++ b/app/rdo_studio/help/rdo_studio_rus/html/work_run.htm @@ -6,57 +6,57 @@ -
    -

    ЗАПУСК ПРОГРАММНОГО КОМПЛЕКСА

    -

    Для начала работы с комплексом необходимо запустить модуль RAO-studio.exe. После загрузки программы откроется основное окно. Оно имеет главное меню, кнопки панели управления, "плавающие" окна объектов и вывода со своими закладками, строку состояния и окно с набором закладок ("RTP", "RSS", "EVN", "PAT", "DPT", "PRC", "FRM", "FUN", "SMR", "PMD"), соответствующих объектам модели для редактирования новой модели.

    -

    -

    Сбоку от главного окна располагается плавающее окно объектов модели с закладками

    -

    Список закладок окна:

    - - - - - - - - - - - - - -
    Наименование закладкиНазначение
    ГрафикиОтображает список трассируемых объектов в процессе моделирования, позволяет отобразить график по выбранному элементу

    АнимацияОтображает список доступных окон анимации в процессе моделирования, позволяет переключиться на выбранное окно

    -

    Снизу располагается окно вывода с закладками:

    - - - - - - - - - - - - - - - - - - - - - - - - - -
    Наименование закладкиНазначение
    КомпиляторОтображает информацию о процессе компиляции модели, выводит сообщения об ошибках компиляции, позволяет переключиться в текст модели на место возникновения выбранной ошибки

    ВыводОкно, в которое любой модуль может вывести отладочную информацию, например, здесь отображается список загруженных для анимации картинок при запуске модели на исполнение

    ТрассировкаОтображает файл трассировки процесса моделирования в режиме реального времени

    РезультатыОтображает результаты моделирования по завершении прогона

    ПоискОтображает результаты поиска подстроки по всей модели, позволяет переключиться в текст модели на найденный фрагмент

    -

    См. также

    -

    Закладки окна модели

    -

    Работа с моделью

    -
    - +
    +

    ЗАПУСК ПРОГРАММНОГО КОМПЛЕКСА

    +

    Для начала работы с комплексом необходимо запустить модуль RAO-studio.exe. После загрузки программы откроется основное окно. Оно имеет главное меню, кнопки панели управления, "плавающие" окна объектов и вывода со своими закладками, строку состояния и окно с набором закладок ("RTP", "RSS", "EVN", "PAT", "DPT", "PRC", "FRM", "FUN", "SMR", "PMD"), соответствующих объектам модели для редактирования новой модели.

    +

    +

    Сбоку от главного окна располагается плавающее окно объектов модели с закладками

    +

    Список закладок окна:

    + + + + + + + + + + + + + +
    Наименование закладкиНазначение
    ГрафикиОтображает список трассируемых объектов в процессе моделирования, позволяет отобразить график по выбранному элементу

    АнимацияОтображает список доступных окон анимации в процессе моделирования, позволяет переключиться на выбранное окно

    +

    Снизу располагается окно вывода с закладками:

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Наименование закладкиНазначение
    КомпиляторОтображает информацию о процессе компиляции модели, выводит сообщения об ошибках компиляции, позволяет переключиться в текст модели на место возникновения выбранной ошибки

    ВыводОкно, в которое любой модуль может вывести отладочную информацию, например, здесь отображается список загруженных для анимации картинок при запуске модели на исполнение

    ТрассировкаОтображает файл трассировки процесса моделирования в режиме реального времени

    РезультатыОтображает результаты моделирования по завершении прогона

    ПоискОтображает результаты поиска подстроки по всей модели, позволяет переключиться в текст модели на найденный фрагмент

    +

    См. также

    +

    Закладки окна модели

    +

    Работа с моделью

    +
    + diff --git a/app/rdo_studio/help/web/styles/tree.css b/app/rdo_studio/help/web/styles/tree.css index e88c71c06..c5c3c47e4 100644 --- a/app/rdo_studio/help/web/styles/tree.css +++ b/app/rdo_studio/help/web/styles/tree.css @@ -1,39 +1,39 @@ .tree { - font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; - font-size: 11px; - padding: 10px; - white-space: nowrap; + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 11px; + padding: 10px; + white-space: nowrap; } .tree img { - border: 0px; - height: 18px; - vertical-align: text-bottom; + border: 0px; + height: 18px; + vertical-align: text-bottom; } .tree a { - color: #000; - text-decoration: none; - cursor: pointer; + color: #000; + text-decoration: none; + cursor: pointer; } .tree a:hover { - color: #345373; + color: #345373; } aside { - background: #f7f7f7; - padding: 3px; - width: 26%; - float: left; - height: 95%; - overflow: auto; + background: #f7f7f7; + padding: 3px; + width: 26%; + float: left; + height: 95%; + overflow: auto; } iframe { - width: 67%; - height: 95%; + width: 67%; + height: 95%; } a.ref { - text-decoration: none; - font-family: Arial; - cursor: pointer; + text-decoration: none; + font-family: Arial; + cursor: pointer; } diff --git a/app/rdo_studio/pch/application_pch.h b/app/rdo_studio/pch/application_pch.h index c41805579..25f81ee2f 100644 --- a/app/rdo_studio/pch/application_pch.h +++ b/app/rdo_studio/pch/application_pch.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_APPLICATION_PCH_H_ -#define _RDO_STUDIO_APPLICATION_PCH_H_ +#pragma once #include "utils/src/common/platform.h" #include "utils/src/common/warning_disable.h" @@ -13,5 +12,3 @@ #include "utils/src/debug/rdodebug.h" #include "utils/src/common/rdocommon.h" - -#endif // _RDO_STUDIO_APPLICATION_PCH_H_ diff --git a/app/rdo_studio/pch/editor_pch.h b/app/rdo_studio/pch/editor_pch.h index 3dd7ac618..25f81ee2f 100644 --- a/app/rdo_studio/pch/editor_pch.h +++ b/app/rdo_studio/pch/editor_pch.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_PCH_H_ -#define _RDO_STUDIO_EDITOR_PCH_H_ +#pragma once #include "utils/src/common/platform.h" #include "utils/src/common/warning_disable.h" @@ -13,5 +12,3 @@ #include "utils/src/debug/rdodebug.h" #include "utils/src/common/rdocommon.h" - -#endif // _RDO_STUDIO_EDITOR_PCH_H_ diff --git a/app/rdo_studio/pch/frame_pch.h b/app/rdo_studio/pch/frame_pch.h index 9ae974697..25f81ee2f 100644 --- a/app/rdo_studio/pch/frame_pch.h +++ b/app/rdo_studio/pch/frame_pch.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_FRAME_PCH_H_ -#define _RDO_STUDIO_FRAME_PCH_H_ +#pragma once #include "utils/src/common/platform.h" #include "utils/src/common/warning_disable.h" @@ -13,5 +12,3 @@ #include "utils/src/debug/rdodebug.h" #include "utils/src/common/rdocommon.h" - -#endif // _RDO_STUDIO_FRAME_PCH_H_ \ No newline at end of file diff --git a/app/rdo_studio/pch/model_pch.h b/app/rdo_studio/pch/model_pch.h index ba2640ab5..25f81ee2f 100644 --- a/app/rdo_studio/pch/model_pch.h +++ b/app/rdo_studio/pch/model_pch.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_MODEL_PCH_H_ -#define _RDO_STUDIO_MODEL_PCH_H_ +#pragma once #include "utils/src/common/platform.h" #include "utils/src/common/warning_disable.h" @@ -13,5 +12,3 @@ #include "utils/src/debug/rdodebug.h" #include "utils/src/common/rdocommon.h" - -#endif // _RDO_STUDIO_MODEL_PCH_H_ \ No newline at end of file diff --git a/app/rdo_studio/pch/plugin_loader_pch.h b/app/rdo_studio/pch/plugin_loader_pch.h index 4ad6c20f9..25f81ee2f 100644 --- a/app/rdo_studio/pch/plugin_loader_pch.h +++ b/app/rdo_studio/pch/plugin_loader_pch.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_PLUGIN_LOADER_PCH_H_ -#define _RDO_STUDIO_PLUGIN_LOADER_PCH_H_ +#pragma once #include "utils/src/common/platform.h" #include "utils/src/common/warning_disable.h" @@ -13,5 +12,3 @@ #include "utils/src/debug/rdodebug.h" #include "utils/src/common/rdocommon.h" - -#endif // _RDO_STUDIO_PLUGIN_LOADER_PCH_H_ diff --git a/app/rdo_studio/pch/stdpch.h b/app/rdo_studio/pch/stdpch.h index 5c202cb5c..25f81ee2f 100644 --- a/app/rdo_studio/pch/stdpch.h +++ b/app/rdo_studio/pch/stdpch.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_STDPCH_H_ -#define _RDO_STUDIO_STDPCH_H_ +#pragma once #include "utils/src/common/platform.h" #include "utils/src/common/warning_disable.h" @@ -13,5 +12,3 @@ #include "utils/src/debug/rdodebug.h" #include "utils/src/common/rdocommon.h" - -#endif // _RDO_STUDIO_STDPCH_H_ diff --git a/app/rdo_studio/pch/tracer_pch.h b/app/rdo_studio/pch/tracer_pch.h index e2e8af94a..25f81ee2f 100644 --- a/app/rdo_studio/pch/tracer_pch.h +++ b/app/rdo_studio/pch/tracer_pch.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_PCH_H_ -#define _RDO_STUDIO_TRACER_PCH_H_ +#pragma once #include "utils/src/common/platform.h" #include "utils/src/common/warning_disable.h" @@ -13,5 +12,3 @@ #include "utils/src/debug/rdodebug.h" #include "utils/src/common/rdocommon.h" - -#endif // _RDO_STUDIO_TRACER_PCH_H_ \ No newline at end of file diff --git a/app/rdo_studio/plugins/game5/CMakeLists.txt b/app/rdo_studio/plugins/game5/CMakeLists.txt index 93db196a2..bfa8c9ad8 100644 --- a/app/rdo_studio/plugins/game5/CMakeLists.txt +++ b/app/rdo_studio/plugins/game5/CMakeLists.txt @@ -1,7 +1,7 @@ MESSAGE(STATUS "CREATE RDO_PLUGIN_GAME5 LIBRARY") IF(PROJECT_OS_LINUX) - FIND_LIBRARY(PTHREAD pthread $ENV{LD_LIBRARY_PATH}) + FIND_LIBRARY(PTHREAD pthread $ENV{LD_LIBRARY_PATH}) ENDIF(PROJECT_OS_LINUX) FIND_PACKAGE(Boost COMPONENTS system filesystem thread REQUIRED) @@ -11,82 +11,82 @@ INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) SET(PLUGIN_GAME5_MOC_FILES - src/board.h - src/checkable_line_edit.h - src/graph_edge.h - src/graph_node.h - src/multi_select_completer.h - src/plugin_game5.h - src/plugin_game5_dialog.h - src/plugin_game5_graph_dialog.h - src/plugin_game5_graph_node_info_dialog.h - src/plugin_game5_tiles_order_dialog.h - src/tiles.h + src/board.h + src/checkable_line_edit.h + src/graph_edge.h + src/graph_node.h + src/multi_select_completer.h + src/plugin_game5.h + src/plugin_game5_dialog.h + src/plugin_game5_graph_dialog.h + src/plugin_game5_graph_node_info_dialog.h + src/plugin_game5_tiles_order_dialog.h + src/tiles.h ) SET(SRC_FILES - src/plugin_game5.h - src/plugin_game5.cpp - src/plugin_game5_model_generator.h - src/plugin_game5_model_generator.cpp + src/plugin_game5.h + src/plugin_game5.cpp + src/plugin_game5_model_generator.h + src/plugin_game5_model_generator.cpp ) SET(COMPLETER_FILES - src/multi_select_completer.h - src/multi_select_completer.cpp + src/multi_select_completer.h + src/multi_select_completer.cpp ) SET(DIALOGS_FILES - src/plugin_game5_dialog.h - src/plugin_game5_dialog.cpp - src/plugin_game5_graph_dialog.h - src/plugin_game5_graph_dialog.cpp - src/plugin_game5_graph_node_info_dialog.h - src/plugin_game5_graph_node_info_dialog.cpp - src/plugin_game5_tiles_order_dialog.h - src/plugin_game5_tiles_order_dialog.cpp + src/plugin_game5_dialog.h + src/plugin_game5_dialog.cpp + src/plugin_game5_graph_dialog.h + src/plugin_game5_graph_dialog.cpp + src/plugin_game5_graph_node_info_dialog.h + src/plugin_game5_graph_node_info_dialog.cpp + src/plugin_game5_tiles_order_dialog.h + src/plugin_game5_tiles_order_dialog.cpp ) SET(GAME_BOARD_FILES - src/board.h - src/board.cpp - src/checkable_line_edit.h - src/checkable_line_edit.cpp - src/tiles.h - src/tiles.cpp + src/board.h + src/board.cpp + src/checkable_line_edit.h + src/checkable_line_edit.cpp + src/tiles.h + src/tiles.cpp ) SET(GRAPH_FILES - src/graph_edge.h - src/graph_edge.cpp - src/graph_info.h - src/graph_info.cpp - src/graph_items_types.h - src/graph_node.h - src/graph_node.cpp - src/graph_node_info.h - src/graph_node_info.cpp - src/graph_widget.h - src/graph_widget.cpp + src/graph_edge.h + src/graph_edge.cpp + src/graph_info.h + src/graph_info.cpp + src/graph_items_type.h + src/graph_node.h + src/graph_node.cpp + src/graph_node_info.h + src/graph_node_info.cpp + src/graph_widget.h + src/graph_widget.cpp ) SET(DIALOGS_UI_FILES - src/plugin_game5_dialog.ui - src/plugin_game5_tiles_order_dialog.ui - src/plugin_game5_graph_dialog.ui - src/plugin_game5_graph_node_info_dialog.ui + src/plugin_game5_dialog.ui + src/plugin_game5_tiles_order_dialog.ui + src/plugin_game5_graph_dialog.ui + src/plugin_game5_graph_node_info_dialog.ui ) SET(QRC_FILES - src/res/plugin_game5.qrc + src/res/plugin_game5.qrc ) QT5_ADD_RESOURCES(GENERATED_QRC_FILES ${QRC_FILES}) SET(RESOURCES_IMAGE_FILES - src/res/images/gen_sit_dialog.png - src/res/images/graph_dialog.png - src/res/images/graph_dialog_d.png + src/res/images/gen_sit_dialog.png + src/res/images/graph_dialog.png + src/res/images/graph_dialog_d.png ) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) @@ -94,14 +94,14 @@ MESSAGE(STATUS ${CMAKE_CURRENT_BINARY_DIR}) QT5_WRAP_UI(GENERATED_DIALOGS_UI_FILES ${DIALOGS_UI_FILES}) SET(PLUGIN_SRC_FILES - ${SRC_FILES} - ${COMPLETER_FILES} - ${DIALOGS_FILES} - ${GAME_BOARD_FILES} - ${GRAPH_FILES} - ${DIALOGS_UI_FILES} - ${RESOURCES_IMAGE_FILES} - ${QRC_FILES} + ${SRC_FILES} + ${COMPLETER_FILES} + ${DIALOGS_FILES} + ${GAME_BOARD_FILES} + ${GRAPH_FILES} + ${DIALOGS_UI_FILES} + ${RESOURCES_IMAGE_FILES} + ${QRC_FILES} ) SET(QT_MOC_FLAGS) @@ -109,30 +109,30 @@ QT5_GET_MOC_FLAGS(QT_MOC_FLAGS) SET(GENERATED_PLUGIN_GAME5_MOC_FILES) FOREACH(PLUGIN_GAME5_MOC_FILES_IT ${PLUGIN_GAME5_MOC_FILES}) - QT5_WRAP_CPP(GENERATED_PLUGIN_GAME5_MOC_FILES_IT ${PLUGIN_GAME5_MOC_FILES_IT} OPTIONS ${QT_MOC_FLAGS} "-fapp/rdo_studio/pch/stdpch.h" "-futils/src/common/warning_disable.h" "-fapp/rdo_studio/plugins/game5/${PLUGIN_GAME5_MOC_FILES_IT}") - SET(GENERATED_PLUGIN_GAME5_MOC_FILES ${GENERATED_PLUGIN_GAME5_MOC_FILES} ${GENERATED_PLUGIN_GAME5_MOC_FILES_IT}) + QT5_WRAP_CPP(GENERATED_PLUGIN_GAME5_MOC_FILES_IT ${PLUGIN_GAME5_MOC_FILES_IT} OPTIONS ${QT_MOC_FLAGS} "-fapp/rdo_studio/pch/stdpch.h" "-futils/src/common/warning_disable.h" "-fapp/rdo_studio/plugins/game5/${PLUGIN_GAME5_MOC_FILES_IT}") + SET(GENERATED_PLUGIN_GAME5_MOC_FILES ${GENERATED_PLUGIN_GAME5_MOC_FILES} ${GENERATED_PLUGIN_GAME5_MOC_FILES_IT}) ENDFOREACH() ADD_LIBRARY(plugin_game5 SHARED - ${PLUGIN_SRC_FILES} - ${GENERATED_DIALOGS_UI_FILES} - ${GENERATED_PLUGIN_GAME5_MOC_FILES} - ${GENERATED_QRC_FILES} + ${PLUGIN_SRC_FILES} + ${GENERATED_DIALOGS_UI_FILES} + ${GENERATED_PLUGIN_GAME5_MOC_FILES} + ${GENERATED_QRC_FILES} ) IF(MSVC) - FOREACH(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) - string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG ) - SET_TARGET_PROPERTIES(plugin_game5 PROPERTIES - RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CONFIG_DIRECTORY_${OUTPUTCONFIG}}/plugins - ) - ENDFOREACH() + FOREACH(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) + string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIG ) + SET_TARGET_PROPERTIES(plugin_game5 PROPERTIES + RUNTIME_OUTPUT_DIRECTORY_${OUTPUTCONFIG} ${CONFIG_DIRECTORY_${OUTPUTCONFIG}}/plugins + ) + ENDFOREACH() ELSE() - SET_TARGET_PROPERTIES(plugin_game5 PROPERTIES - LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/plugins" - ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/plugins" - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/plugins" - ) + SET_TARGET_PROPERTIES(plugin_game5 PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/plugins" + ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/plugins" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/plugins" + ) ENDIF() SET_TARGET_PROPERTIES(plugin_game5 PROPERTIES FOLDER ${APPS_FOLDERS}/.plugins/.game5) @@ -150,49 +150,49 @@ TARGET_LINK_LIBRARIES(plugin_game5 rdo_tracer) INSTALL(TARGETS plugin_game5 DESTINATION lib) IF(PROJECT_OS_LINUX OR CYGWIN) - TARGET_LINK_LIBRARIES(plugin_game5 ${PTHREAD}) + TARGET_LINK_LIBRARIES(plugin_game5 ${PTHREAD}) ENDIF(PROJECT_OS_LINUX OR CYGWIN) IF(MSVC) # options for windows # - SOURCE_GROUP(".generated\\.ui" FILES - ${GENERATED_RESOURCES_UI_FILES} - ) + SOURCE_GROUP(".generated\\.ui" FILES + ${GENERATED_RESOURCES_UI_FILES} + ) - SOURCE_GROUP(".generated\\.moc" FILES - ${GENERATED_PLUGIN_GAME5_MOC_FILES} - ) + SOURCE_GROUP(".generated\\.moc" FILES + ${GENERATED_PLUGIN_GAME5_MOC_FILES} + ) - SOURCE_GROUP(".generated" FILES - ${GENERATED_QRC_FILES} - ) + SOURCE_GROUP(".generated" FILES + ${GENERATED_QRC_FILES} + ) - SOURCE_GROUP(".src" FILES - ${SRC_FILES} - ${QRC_FILES} - ) + SOURCE_GROUP(".src" FILES + ${SRC_FILES} + ${QRC_FILES} + ) - SOURCE_GROUP(".src\\.completer" FILES - ${COMPLETER_FILES} - ) + SOURCE_GROUP(".src\\.completer" FILES + ${COMPLETER_FILES} + ) - SOURCE_GROUP(".src\\.dialogs" FILES - ${DIALOGS_FILES} - ) + SOURCE_GROUP(".src\\.dialogs" FILES + ${DIALOGS_FILES} + ) - SOURCE_GROUP(".src\\.game_board" FILES - ${GAME_BOARD_FILES} - ) + SOURCE_GROUP(".src\\.game_board" FILES + ${GAME_BOARD_FILES} + ) - SOURCE_GROUP(".src\\.graph" FILES - ${GRAPH_FILES} - ) + SOURCE_GROUP(".src\\.graph" FILES + ${GRAPH_FILES} + ) - SOURCE_GROUP(".src\\.dialogs\\.ui" FILES - ${DIALOGS_UI_FILES} - ) + SOURCE_GROUP(".src\\.dialogs\\.ui" FILES + ${DIALOGS_UI_FILES} + ) - SOURCE_GROUP(".src\\.resources" FILES - ${RESOURCES_IMAGE_FILES} - ) + SOURCE_GROUP(".src\\.resources" FILES + ${RESOURCES_IMAGE_FILES} + ) ENDIF() diff --git a/app/rdo_studio/plugins/game5/src/board.cpp b/app/rdo_studio/plugins/game5/src/board.cpp index bdfafe297..3d44178ed 100644 --- a/app/rdo_studio/plugins/game5/src/board.cpp +++ b/app/rdo_studio/plugins/game5/src/board.cpp @@ -11,42 +11,42 @@ namespace { - const std::size_t HOLE_NUMBER = 0; + const std::size_t HOLE_NUMBER = 0; } // anonymous namespace Board::Board(QWidget* pParent) - : QFrame (pParent) - , m_tileSize (75) - , m_tilesCountX (3) - , m_tilesCountY (2) - , m_spacer (1) - , m_boardSpacer (3) - , m_boardSizeX (sizeCalc(m_tilesCountX) - m_spacer + 2 * m_boardSpacer) - , m_boardSizeY (sizeCalc(m_tilesCountY) - m_spacer + 2 * m_boardSpacer) - , m_topLeftX (m_boardSpacer) - , m_topLeftY (m_boardSpacer) -{ - setFixedSize(m_boardSizeX, m_boardSizeY); - - setStyleSheet("\ - background-color: pink; \ - border-style: outset; \ - border-width: 2px; \ - border-radius: 13px; \ - border-color: black; \ - align: center; \ - "); - - tiles.resize(m_tilesCountX * m_tilesCountY); - - for (int index = 0; index < m_tilesCountX * m_tilesCountY; index++) - { - tiles[index] = new PlacedTile(index, this); - tiles[index]->setFixedSize(m_tileSize,m_tileSize); - connect(tiles[index], &Tile::tileClicked, this, &Board::clickOnTile); - } - tiles[HOLE_NUMBER]->setVisible(false); - buildCorrectOrder(); + : QFrame (pParent) + , m_tileSize (75) + , m_tilesCountX (3) + , m_tilesCountY (2) + , m_spacer (1) + , m_boardSpacer (3) + , m_boardSizeX (sizeCalc(m_tilesCountX) - m_spacer + 2 * m_boardSpacer) + , m_boardSizeY (sizeCalc(m_tilesCountY) - m_spacer + 2 * m_boardSpacer) + , m_topLeftX (m_boardSpacer) + , m_topLeftY (m_boardSpacer) +{ + setFixedSize(m_boardSizeX, m_boardSizeY); + + setStyleSheet("\ + background-color: pink; \ + border-style: outset; \ + border-width: 2px; \ + border-radius: 13px; \ + border-color: black; \ + align: center; \ + "); + + tiles.resize(m_tilesCountX * m_tilesCountY); + + for (int index = 0; index < m_tilesCountX * m_tilesCountY; index++) + { + tiles[index] = new PlacedTile(index, this); + tiles[index]->setFixedSize(m_tileSize,m_tileSize); + connect(tiles[index], &Tile::tileClicked, this, &Board::clickOnTile); + } + tiles[HOLE_NUMBER]->setVisible(false); + buildCorrectOrder(); } Board::~Board() @@ -54,145 +54,145 @@ Board::~Board() void Board::setTilesDisabled(bool value) { - for (PlacedTile* tile: tiles) - { - tile->setDisabled(value); - } + for (PlacedTile* tile: tiles) + { + tile->setDisabled(value); + } } void Board::clickOnTile(int number) { - if (freePlaceIsNearby(tiles[number]->getPosition())) - { - swapTiles(number, HOLE_NUMBER); - } + if (freePlaceIsNearby(tiles[number]->getPosition())) + { + swapTiles(number, HOLE_NUMBER); + } } QPoint Board::tilePoint(int place) const { - const int column = place % m_tilesCountX; - const int row = place / m_tilesCountX; - const int tilePlaceX = m_topLeftX + sizeCalc(column); - const int tilePlaceY = m_topLeftY + sizeCalc(row ); - return QPoint(tilePlaceX,tilePlaceY); + const int column = place % m_tilesCountX; + const int row = place / m_tilesCountX; + const int tilePlaceX = m_topLeftX + sizeCalc(column); + const int tilePlaceY = m_topLeftY + sizeCalc(row ); + return QPoint(tilePlaceX,tilePlaceY); } int Board::sizeCalc(int count) const { - return count * m_tileSize + count * m_spacer; + return count * m_tileSize + count * m_spacer; } bool Board::freePlaceIsNearby(int place) const { - const int tileCol = place % m_tilesCountX; - const int tileRow = place / m_tilesCountX; - const int freePlaceCol = tiles[HOLE_NUMBER]->getPosition() % m_tilesCountX; - const int freePlaceRow = tiles[HOLE_NUMBER]->getPosition() / m_tilesCountX; + const int tileCol = place % m_tilesCountX; + const int tileRow = place / m_tilesCountX; + const int freePlaceCol = tiles[HOLE_NUMBER]->getPosition() % m_tilesCountX; + const int freePlaceRow = tiles[HOLE_NUMBER]->getPosition() / m_tilesCountX; - return ((tileCol == freePlaceCol + 1) && (tileRow == freePlaceRow)) || - ((tileCol == freePlaceCol - 1) && (tileRow == freePlaceRow)) || - ((tileRow == freePlaceRow + 1) && (tileCol == freePlaceCol)) || - ((tileRow == freePlaceRow - 1) && (tileCol == freePlaceCol)) ; + return ((tileCol == freePlaceCol + 1) && (tileRow == freePlaceRow)) || + ((tileCol == freePlaceCol - 1) && (tileRow == freePlaceRow)) || + ((tileRow == freePlaceRow + 1) && (tileCol == freePlaceCol)) || + ((tileRow == freePlaceRow - 1) && (tileCol == freePlaceCol)) ; } void Board::buildCorrectOrder() { - for (int index = 1; index < m_tilesCountX * m_tilesCountY; index++) - { - std::size_t position = index - 1; - moveTile(tiles[index], position); - } - moveTile(tiles[HOLE_NUMBER], m_tilesCountX * m_tilesCountY - 1); + for (int index = 1; index < m_tilesCountX * m_tilesCountY; index++) + { + std::size_t position = index - 1; + moveTile(tiles[index], position); + } + moveTile(tiles[HOLE_NUMBER], m_tilesCountX * m_tilesCountY - 1); } void Board::buildRandomOrder(bool solvabilityCheck) { - std::srand(unsigned(std::time(0))); - std::vector tilesPosition; - for (const auto& tile: tiles) - { - tilesPosition.push_back(tile->getPosition()); - } - do - { - std::random_shuffle(tilesPosition.begin(), tilesPosition.end()); - } while (solvabilityCheck && !orderIsSolvable(tilesPosition)); - for (int index = 0; index < m_tilesCountX * m_tilesCountY; index++) - { - moveTile(tiles[index], tilesPosition[index]); - } + std::srand(unsigned(std::time(0))); + std::vector tilesPosition; + for (const auto& tile: tiles) + { + tilesPosition.push_back(tile->getPosition()); + } + do + { + std::random_shuffle(tilesPosition.begin(), tilesPosition.end()); + } while (solvabilityCheck && !orderIsSolvable(tilesPosition)); + for (int index = 0; index < m_tilesCountX * m_tilesCountY; index++) + { + moveTile(tiles[index], tilesPosition[index]); + } } bool Board::orderIsSolvable(const std::vector& tilesPosition) const { - int freePlaceRow = tilesPosition[HOLE_NUMBER] / m_tilesCountX + 1; - int sum = 0; - for (int i = 1; i < m_tilesCountX * m_tilesCountY; i++) - { - for (int j = i + 1; j < m_tilesCountX * m_tilesCountY; j++) - { - if (tilesPosition[i] > tilesPosition[j]) - sum++; - } - } - return m_tilesCountX % 2 != 0 - ? sum % 2 == 0 - : (m_tilesCountY % 2 != 0 - ? (sum + freePlaceRow) % 2 != 0 - : (sum + freePlaceRow) % 2 == 0 - ); // См. Перельман. Живая математика. + int freePlaceRow = tilesPosition[HOLE_NUMBER] / m_tilesCountX + 1; + int sum = 0; + for (int i = 1; i < m_tilesCountX * m_tilesCountY; i++) + { + for (int j = i + 1; j < m_tilesCountX * m_tilesCountY; j++) + { + if (tilesPosition[i] > tilesPosition[j]) + sum++; + } + } + return m_tilesCountX % 2 != 0 + ? sum % 2 == 0 + : (m_tilesCountY % 2 != 0 + ? (sum + freePlaceRow) % 2 != 0 + : (sum + freePlaceRow) % 2 == 0 + ); // См. Перельман. Живая математика. } int Board::getTilePosition(int index) const { - return tiles[index]->getPosition() + 1; + return tiles[index]->getPosition() + 1; } int Board::getHolePosition() const { - return getTilePosition(HOLE_NUMBER); + return getTilePosition(HOLE_NUMBER); } int Board::getQuantityOfTiles() const { - return m_tilesCountX * m_tilesCountY - 1; + return m_tilesCountX * m_tilesCountY - 1; } std::vector Board::getBoardState() const { - std::vector boardState; - boardState.resize(tiles.size()); - for (unsigned int i = 0; i < tiles.size(); i++) - { - boardState[tiles[i]->getPosition()] = i; - } - return boardState; + std::vector boardState; + boardState.resize(tiles.size()); + for (unsigned int i = 0; i < tiles.size(); i++) + { + boardState[tiles[i]->getPosition()] = i; + } + return boardState; } void Board::setTilesPositon(const std::vector& newState) { - for (unsigned int positionIndex = 0; positionIndex < newState.size() && - positionIndex < getBoardState().size(); positionIndex++) - { - unsigned int currentStateIndex = getBoardState()[positionIndex]; - swapTiles(newState[positionIndex], currentStateIndex); - } + for (unsigned int positionIndex = 0; positionIndex < newState.size() && + positionIndex < getBoardState().size(); positionIndex++) + { + unsigned int currentStateIndex = getBoardState()[positionIndex]; + swapTiles(newState[positionIndex], currentStateIndex); + } } void Board::swapTiles(int first, int second) { - if (first != second) - { - const unsigned int firstPosition = tiles[first]->getPosition(); - moveTile(tiles[first], tiles[second]->getPosition()); - moveTile(tiles[second], firstPosition); - } + if (first != second) + { + const unsigned int firstPosition = tiles[first]->getPosition(); + moveTile(tiles[first], tiles[second]->getPosition()); + moveTile(tiles[second], firstPosition); + } } void Board::moveTile(PlacedTile* tile, unsigned int place) { - tile->move(tilePoint(place)); - tile->setPosition(place); + tile->move(tilePoint(place)); + tile->setPosition(place); } Board::PlacedTile::PlacedTile(int number, QWidget* pParent) @@ -204,10 +204,10 @@ Board::PlacedTile::~PlacedTile() unsigned int Board::PlacedTile::getPosition() const { - return position; + return position; } void Board::PlacedTile::setPosition(unsigned int value) { - position = value; + position = value; } diff --git a/app/rdo_studio/plugins/game5/src/board.h b/app/rdo_studio/plugins/game5/src/board.h index 382e02540..c6d148ff6 100644 --- a/app/rdo_studio/plugins/game5/src/board.h +++ b/app/rdo_studio/plugins/game5/src/board.h @@ -1,5 +1,4 @@ -#ifndef _RDO_PLUGIN_GAME_5_BOARD_H_ -#define _RDO_PLUGIN_GAME_5_BOARD_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -13,56 +12,54 @@ class Board: public QFrame { Q_OBJECT public: - Board(QWidget* pParent = NULL); - ~Board(); + Board(QWidget* pParent = NULL); + ~Board(); - void setTilesDisabled(bool value); + void setTilesDisabled(bool value); - const int m_tileSize; - const int m_tilesCountX; - const int m_tilesCountY; - const int m_spacer; - const int m_boardSpacer; - const int m_boardSizeX; - const int m_boardSizeY; - const int m_topLeftX; - const int m_topLeftY; + const int m_tileSize; + const int m_tilesCountX; + const int m_tilesCountY; + const int m_spacer; + const int m_boardSpacer; + const int m_boardSizeX; + const int m_boardSizeY; + const int m_topLeftX; + const int m_topLeftY; - int getTilePosition(int index) const; - int getHolePosition() const; - int getQuantityOfTiles() const; - std::vector getBoardState() const; + int getTilePosition(int index) const; + int getHolePosition() const; + int getQuantityOfTiles() const; + std::vector getBoardState() const; - class PlacedTile: public Tile - { - public: - PlacedTile(int number, QWidget* pParent); - ~PlacedTile(); + class PlacedTile: public Tile + { + public: + PlacedTile(int number, QWidget* pParent); + ~PlacedTile(); - unsigned int getPosition() const; - void setPosition(unsigned int value); + unsigned int getPosition() const; + void setPosition(unsigned int value); - private: - unsigned int position; - }; + private: + unsigned int position; + }; public slots: - void setTilesPositon(const std::vector& newState); - void buildCorrectOrder(); - void buildRandomOrder(bool solvabilityCheck); + void setTilesPositon(const std::vector& newState); + void buildCorrectOrder(); + void buildRandomOrder(bool solvabilityCheck); private: - std::vector tiles; + std::vector tiles; - void swapTiles (int first, int second); - QPoint tilePoint(int place) const; - int sizeCalc (int count) const; - bool freePlaceIsNearby(int place) const; - bool orderIsSolvable(const std::vector& tilesPosition) const; - void moveTile(PlacedTile* tile, unsigned int place); + void swapTiles (int first, int second); + QPoint tilePoint(int place) const; + int sizeCalc (int count) const; + bool freePlaceIsNearby(int place) const; + bool orderIsSolvable(const std::vector& tilesPosition) const; + void moveTile(PlacedTile* tile, unsigned int place); private slots: - void clickOnTile(int number); + void clickOnTile(int number); }; - -#endif // _RDO_PLUGIN_GAME_5_BOARD_H_ diff --git a/app/rdo_studio/plugins/game5/src/checkable_line_edit.cpp b/app/rdo_studio/plugins/game5/src/checkable_line_edit.cpp index 374a1a602..77419b069 100644 --- a/app/rdo_studio/plugins/game5/src/checkable_line_edit.cpp +++ b/app/rdo_studio/plugins/game5/src/checkable_line_edit.cpp @@ -9,35 +9,35 @@ namespace { - const QString DEFAULT_TEXT = "1"; + const QString DEFAULT_TEXT = "1"; } // end anonymous namespace CheckableLineEdit::CheckableLineEdit(QWidget* parent) - : QWidget(parent) - , defaultText(DEFAULT_TEXT) + : QWidget(parent) + , defaultText(DEFAULT_TEXT) { - QHBoxLayout* layout = new QHBoxLayout(this); - layout->setMargin(0); + QHBoxLayout* layout = new QHBoxLayout(this); + layout->setMargin(0); - checkBox = new QCheckBox("", this); - lineEdit = new QLineEdit(defaultText, this); - lineEdit->setEnabled(false); + checkBox = new QCheckBox("", this); + lineEdit = new QLineEdit(defaultText, this); + lineEdit->setEnabled(false); - layout->addWidget(checkBox); - layout->addWidget(lineEdit); - connect(checkBox, &QCheckBox::stateChanged, this, &CheckableLineEdit::setLineEditState); + layout->addWidget(checkBox); + layout->addWidget(lineEdit); + connect(checkBox, &QCheckBox::stateChanged, this, &CheckableLineEdit::setLineEditState); } void CheckableLineEdit::setLineEditState(int state) { - if (state == Qt::Checked) - { - lineEdit->setEnabled(true); - lineEdit->setFocus(); - } - else - { - lineEdit->setText(defaultText); - lineEdit->setEnabled(false); - } + if (state == Qt::Checked) + { + lineEdit->setEnabled(true); + lineEdit->setFocus(); + } + else + { + lineEdit->setText(defaultText); + lineEdit->setEnabled(false); + } } diff --git a/app/rdo_studio/plugins/game5/src/checkable_line_edit.h b/app/rdo_studio/plugins/game5/src/checkable_line_edit.h index 7274f978f..5a05d95bd 100644 --- a/app/rdo_studio/plugins/game5/src/checkable_line_edit.h +++ b/app/rdo_studio/plugins/game5/src/checkable_line_edit.h @@ -1,5 +1,4 @@ -#ifndef _RDO_PLUGIN_GAME_5_CHECKABLE_LINE_EDIT_H -#define _RDO_PLUGIN_GAME_5_CHECKABLE_LINE_EDIT_H +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -14,17 +13,15 @@ class CheckableLineEdit: public QWidget {Q_OBJECT public: - CheckableLineEdit(QWidget* parent); - QCheckBox& getCheckBox() {return *checkBox;}; - QLineEdit& getLineEdit() {return *lineEdit;}; + CheckableLineEdit(QWidget* parent); + QCheckBox& getCheckBox() {return *checkBox;}; + QLineEdit& getLineEdit() {return *lineEdit;}; private: - QCheckBox* checkBox; - QLineEdit* lineEdit; - const QString defaultText; + QCheckBox* checkBox; + QLineEdit* lineEdit; + const QString defaultText; private slots: - void setLineEditState(int state); + void setLineEditState(int state); }; - -#endif // _RDO_PLUGIN_GAME_5_CHECKABLE_LINE_EDIT_H diff --git a/app/rdo_studio/plugins/game5/src/graph_edge.cpp b/app/rdo_studio/plugins/game5/src/graph_edge.cpp index ca5f41948..0870f834e 100644 --- a/app/rdo_studio/plugins/game5/src/graph_edge.cpp +++ b/app/rdo_studio/plugins/game5/src/graph_edge.cpp @@ -11,20 +11,20 @@ namespace { - const double Pi = boost::math::constants::pi(); + const double Pi = boost::math::constants::pi(); } // end anonymous namespace GraphEdge::GraphEdge(GraphNode& sourceNode, GraphNode& destNode) - : source (sourceNode) - , dest (destNode ) - , arrowSize(10 ) - , pointSize(2 ) - , penWidth (2 ) + : source (sourceNode) + , dest (destNode ) + , arrowSize(10 ) + , pointSize(2 ) + , penWidth (2 ) { - setAcceptedMouseButtons(Qt::NoButton); - adjust(); - connect(&source, &GraphNode::positionChanged, this, &GraphEdge::adjust); - connect(&dest , &GraphNode::positionChanged, this, &GraphEdge::adjust); + setAcceptedMouseButtons(Qt::NoButton); + adjust(); + connect(&source, &GraphNode::positionChanged, this, &GraphEdge::adjust); + connect(&dest , &GraphNode::positionChanged, this, &GraphEdge::adjust); } GraphEdge::~GraphEdge() @@ -32,44 +32,44 @@ GraphEdge::~GraphEdge() void GraphEdge::adjust() { - prepareGeometryChange(); - const double angle = -QLineF(source.pos(), dest.pos()).angle() * Pi / 180.; + prepareGeometryChange(); + const double angle = -QLineF(source.pos(), dest.pos()).angle() * Pi / 180.; - sourcePoint = mapFromItem(&source, source.getBorderPointByAngle(angle)); - destPoint = mapFromItem(&dest, dest.getBorderPointByAngle(angle + Pi)); + sourcePoint = mapFromItem(&source, source.getBorderPointByAngle(angle)); + destPoint = mapFromItem(&dest, dest.getBorderPointByAngle(angle + Pi)); } QRectF GraphEdge::boundingRect() const { - const double extra = (penWidth + arrowSize) / 2.0; + const double extra = (penWidth + arrowSize) / 2.0; - return QRectF(sourcePoint, QSizeF(destPoint.x() - sourcePoint.x(), - destPoint.y() - sourcePoint.y())) - .normalized() - .adjusted(-extra, -extra, extra, extra); + return QRectF(sourcePoint, QSizeF(destPoint.x() - sourcePoint.x(), + destPoint.y() - sourcePoint.y())) + .normalized() + .adjusted(-extra, -extra, extra, extra); } void GraphEdge::paint(QPainter* painter, const QStyleOptionGraphicsItem* /*option*/, QWidget* /*widget*/) { - QLineF line(sourcePoint, destPoint); + QLineF line(sourcePoint, destPoint); - painter->setPen(QPen(Qt::black, penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); - painter->drawLine(line); + painter->setPen(QPen(Qt::black, penWidth, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin)); + painter->drawLine(line); - painter->setBrush(Qt::black); - if (line.length() > 2 * arrowSize) - { - const double angle = -line.angle() * Pi / 180.; + painter->setBrush(Qt::black); + if (line.length() > 2 * arrowSize) + { + const double angle = -line.angle() * Pi / 180.; - const QPointF destArrowP1 = destPoint - QPointF(cos(angle - Pi / 12.) * arrowSize, - sin(angle - Pi / 12.) * arrowSize); - const QPointF destArrowP2 = destPoint - QPointF(cos(angle + Pi / 12.) * arrowSize, - sin(angle + Pi / 12.) * arrowSize); + const QPointF destArrowP1 = destPoint - QPointF(cos(angle - Pi / 12.) * arrowSize, + sin(angle - Pi / 12.) * arrowSize); + const QPointF destArrowP2 = destPoint - QPointF(cos(angle + Pi / 12.) * arrowSize, + sin(angle + Pi / 12.) * arrowSize); - painter->drawPolygon(QPolygonF() << line.p2() << destArrowP1 << destArrowP2); - } - else - { - painter->drawEllipse(destPoint, pointSize, pointSize); - } + painter->drawPolygon(QPolygonF() << line.p2() << destArrowP1 << destArrowP2); + } + else + { + painter->drawEllipse(destPoint, pointSize, pointSize); + } } diff --git a/app/rdo_studio/plugins/game5/src/graph_edge.h b/app/rdo_studio/plugins/game5/src/graph_edge.h index 3f9384dbf..07c272293 100644 --- a/app/rdo_studio/plugins/game5/src/graph_edge.h +++ b/app/rdo_studio/plugins/game5/src/graph_edge.h @@ -1,12 +1,11 @@ -#ifndef _RDO_PLUGIN_GAME_5_GRAPH_EDGE_H_ -#define _RDO_PLUGIN_GAME_5_GRAPH_EDGE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" #include #include "utils/src/common/warning_enable.h" // ----------------------------------------------------------------------- SYNOPSIS -#include "app/rdo_studio/plugins/game5/src/graph_items_types.h" +#include "app/rdo_studio/plugins/game5/src/graph_items_type.h" // -------------------------------------------------------------------------------- class GraphNode; @@ -15,27 +14,24 @@ class GraphEdge : public QGraphicsObject {Q_OBJECT public: - GraphEdge(GraphNode& sourceNode, GraphNode& destNode); - ~GraphEdge(); + GraphEdge(GraphNode& sourceNode, GraphNode& destNode); + ~GraphEdge(); - enum { Type = rdo::plugin::game5::TypeID::GRAPH_EDGE }; - virtual int type() const { return Type; } + virtual int type() const { return static_cast(rdo::plugin::game5::GraphItemType::EDGE); } private: - GraphNode& source; - GraphNode& dest; + GraphNode& source; + GraphNode& dest; - QPointF sourcePoint; - QPointF destPoint; - const double arrowSize; - const double pointSize; - const double penWidth; + QPointF sourcePoint; + QPointF destPoint; + const double arrowSize; + const double pointSize; + const double penWidth; - virtual QRectF boundingRect() const; - virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + virtual QRectF boundingRect() const; + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); private slots: - void adjust(); + void adjust(); }; - -#endif // _RDO_PLUGIN_GAME_5_GRAPH_EDGE_H_ diff --git a/app/rdo_studio/plugins/game5/src/graph_info.cpp b/app/rdo_studio/plugins/game5/src/graph_info.cpp index ed0ca794c..d6b103f5b 100644 --- a/app/rdo_studio/plugins/game5/src/graph_info.cpp +++ b/app/rdo_studio/plugins/game5/src/graph_info.cpp @@ -10,23 +10,23 @@ GraphInfo::GraphInfo(QWidget* parent) : QGroupBox("Информация о графе", parent) { - QFormLayout* graphInfoLayout = new QFormLayout(this); + QFormLayout* graphInfoLayout = new QFormLayout(this); - m_solutionCostLabel = new QLabel("Стоимость решения:", this); - m_solutionCostValue = new QLabel(this); - m_numberOfOpenNodesLabel = new QLabel("Количество раскрытых вершин:", this); - m_numberOfOpenNodesValue = new QLabel(this); - m_totalNumberOfNodesLabel = new QLabel("Количество вершин в графе:", this); - m_totalNumberOfNodesValue = new QLabel(this); + m_solutionCostLabel = new QLabel("Стоимость решения:", this); + m_solutionCostValue = new QLabel(this); + m_numberOfOpenNodesLabel = new QLabel("Количество раскрытых вершин:", this); + m_numberOfOpenNodesValue = new QLabel(this); + m_totalNumberOfNodesLabel = new QLabel("Количество вершин в графе:", this); + m_totalNumberOfNodesValue = new QLabel(this); - graphInfoLayout->setWidget(0, QFormLayout::LabelRole, m_solutionCostLabel); - graphInfoLayout->setWidget(0, QFormLayout::FieldRole, m_solutionCostValue); - graphInfoLayout->setWidget(1, QFormLayout::LabelRole, m_numberOfOpenNodesLabel); - graphInfoLayout->setWidget(1, QFormLayout::FieldRole, m_numberOfOpenNodesValue); - graphInfoLayout->setWidget(2, QFormLayout::LabelRole, m_totalNumberOfNodesLabel); - graphInfoLayout->setWidget(2, QFormLayout::FieldRole, m_totalNumberOfNodesValue); + graphInfoLayout->setWidget(0, QFormLayout::LabelRole, m_solutionCostLabel); + graphInfoLayout->setWidget(0, QFormLayout::FieldRole, m_solutionCostValue); + graphInfoLayout->setWidget(1, QFormLayout::LabelRole, m_numberOfOpenNodesLabel); + graphInfoLayout->setWidget(1, QFormLayout::FieldRole, m_numberOfOpenNodesValue); + graphInfoLayout->setWidget(2, QFormLayout::LabelRole, m_totalNumberOfNodesLabel); + graphInfoLayout->setWidget(2, QFormLayout::FieldRole, m_totalNumberOfNodesValue); - setStyleSheet("GraphInfo: {background-color: rgba(255, 255, 255, 60)}; QLabel: {background-color: rgba(255, 255, 255, 0)};"); + setStyleSheet("GraphInfo: {background-color: rgba(255, 255, 255, 60)}; QLabel: {background-color: rgba(255, 255, 255, 0)};"); } GraphInfo::~GraphInfo() @@ -34,7 +34,7 @@ GraphInfo::~GraphInfo() void GraphInfo::update(const QString& solutionCost, const QString& numOfOpenNodes, const QString& totalNumOfNodes) { - m_solutionCostValue->setText(solutionCost); - m_numberOfOpenNodesValue->setText(numOfOpenNodes); - m_totalNumberOfNodesValue->setText(totalNumOfNodes); + m_solutionCostValue->setText(solutionCost); + m_numberOfOpenNodesValue->setText(numOfOpenNodes); + m_totalNumberOfNodesValue->setText(totalNumOfNodes); } diff --git a/app/rdo_studio/plugins/game5/src/graph_info.h b/app/rdo_studio/plugins/game5/src/graph_info.h index 8f1d478c1..2a125e301 100644 --- a/app/rdo_studio/plugins/game5/src/graph_info.h +++ b/app/rdo_studio/plugins/game5/src/graph_info.h @@ -1,5 +1,4 @@ -#ifndef _RDO_PLUGIN_GAME_5_GRAPH_INFO_H_ -#define _RDO_PLUGIN_GAME_5_GRAPH_INFO_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -14,18 +13,16 @@ class GraphInfo; class GraphInfo : public QGroupBox { public: - GraphInfo(QWidget* parent = 0); - ~GraphInfo(); + GraphInfo(QWidget* parent = 0); + ~GraphInfo(); - void update(const QString& solutionCost, const QString& numOfOpenNodes, const QString& totalNumOfNodes); + void update(const QString& solutionCost, const QString& numOfOpenNodes, const QString& totalNumOfNodes); private: - QLabel* m_solutionCostLabel; - QLabel* m_solutionCostValue; - QLabel* m_numberOfOpenNodesLabel; - QLabel* m_numberOfOpenNodesValue; - QLabel* m_totalNumberOfNodesLabel; - QLabel* m_totalNumberOfNodesValue; + QLabel* m_solutionCostLabel; + QLabel* m_solutionCostValue; + QLabel* m_numberOfOpenNodesLabel; + QLabel* m_numberOfOpenNodesValue; + QLabel* m_totalNumberOfNodesLabel; + QLabel* m_totalNumberOfNodesValue; }; - -#endif // _RDO_PLUGIN_GAME_5_GRAPH_INFO_H_ diff --git a/app/rdo_studio/plugins/game5/src/graph_items_types.h b/app/rdo_studio/plugins/game5/src/graph_items_type.h similarity index 65% rename from app/rdo_studio/plugins/game5/src/graph_items_types.h rename to app/rdo_studio/plugins/game5/src/graph_items_type.h index 495b459ac..1b84e52f9 100644 --- a/app/rdo_studio/plugins/game5/src/graph_items_types.h +++ b/app/rdo_studio/plugins/game5/src/graph_items_type.h @@ -1,5 +1,4 @@ -#ifndef _RDO_PLUGIN_GAME_5_GRAPH_ITEMS_TYPES_H -#define _RDO_PLUGIN_GAME_5_GRAPH_ITEMS_TYPES_H +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -12,12 +11,10 @@ namespace rdo { namespace plugin { namespace game5 { -enum TypeID +enum class GraphItemType { - GRAPH_NODE = QGraphicsItem::UserType + 1, - GRAPH_EDGE = QGraphicsItem::UserType + 2, + NODE = QGraphicsItem::UserType + 1, + EDGE = QGraphicsItem::UserType + 2, }; }}} // namespace rdo::plugin::game5 - -#endif // _RDO_PLUGIN_GAME_5_GRAPH_ITEMS_TYPES_H diff --git a/app/rdo_studio/plugins/game5/src/graph_node.cpp b/app/rdo_studio/plugins/game5/src/graph_node.cpp index ac3c46239..250538b27 100644 --- a/app/rdo_studio/plugins/game5/src/graph_node.cpp +++ b/app/rdo_studio/plugins/game5/src/graph_node.cpp @@ -15,48 +15,48 @@ namespace { - QFont fontSizeMultiply(const QFont& baseFont, double multiplier) - { - QFont newFont(baseFont); - if (baseFont.pixelSize() != -1) - { - newFont.setPixelSize((int)(baseFont.pixelSize() * multiplier)); - } - if (baseFont.pointSize() != -1) - { - newFont.setPointSize((int)(baseFont.pointSize() * multiplier)); - } - if (baseFont.pointSizeF() != -1) - { - newFont.setPointSizeF((int)(baseFont.pointSizeF() * multiplier)); - } - return newFont; - } - - const double LEVEL_OF_LOW_DETAIL = 0.8; - const double LOW_DETAIL_MULTIPLIER = 1.5; - const double LEVEL_OF_LOWER_DETAIL = 0.6; - const double LOWER_DETAIL_MULTIPLIER = 3.0; - const double WIDTH_MARGIN = 4; - const double HEIGHT_MARGIN = 4; + QFont fontSizeMultiply(const QFont& baseFont, double multiplier) + { + QFont newFont(baseFont); + if (baseFont.pixelSize() != -1) + { + newFont.setPixelSize((int)(baseFont.pixelSize() * multiplier)); + } + if (baseFont.pointSize() != -1) + { + newFont.setPointSize((int)(baseFont.pointSize() * multiplier)); + } + if (baseFont.pointSizeF() != -1) + { + newFont.setPointSizeF((int)(baseFont.pointSizeF() * multiplier)); + } + return newFont; + } + + const double LEVEL_OF_LOW_DETAIL = 0.8; + const double LOW_DETAIL_MULTIPLIER = 1.5; + const double LEVEL_OF_LOWER_DETAIL = 0.6; + const double LOWER_DETAIL_MULTIPLIER = 3.0; + const double WIDTH_MARGIN = 4; + const double HEIGHT_MARGIN = 4; } // end anonymous namespace GraphNode::GraphNode(const GraphNodeInfo& info, GraphNode* parentGraphNode, int width, int height) - : GraphNodeInfo (info) - , m_pParentGraphNode (parentGraphNode) - , m_graphOnLevelOrder(0) - , m_isChecked (false) - , m_width (width + WIDTH_MARGIN) - , m_height (height + HEIGHT_MARGIN) + : GraphNodeInfo (info) + , m_pParentGraphNode (parentGraphNode) + , m_graphOnLevelOrder(0) + , m_isChecked (false) + , m_width (width + WIDTH_MARGIN) + , m_height (height + HEIGHT_MARGIN) { - setFlag(ItemIsMovable); - setFlag(ItemSendsGeometryChanges); - setCacheMode(DeviceCoordinateCache); + setFlag(ItemIsMovable); + setFlag(ItemSendsGeometryChanges); + setCacheMode(DeviceCoordinateCache); - if (parentGraphNode) - { - parentGraphNode->addChild(this); - } + if (parentGraphNode) + { + parentGraphNode->addChild(this); + } } GraphNode::~GraphNode() @@ -64,288 +64,288 @@ GraphNode::~GraphNode() QRectF GraphNode::boundingRect() const { - double adjust = 2; - return QRectF((-m_width - adjust) / 2, (-m_height - adjust) / 2, - m_width + adjust, m_height + adjust); + double adjust = 2; + return QRectF((-m_width - adjust) / 2, (-m_height - adjust) / 2, + m_width + adjust, m_height + adjust); } void GraphNode::paint(QPainter* painter, const QStyleOptionGraphicsItem* /*option*/, QWidget* /*widget*/) { - QFont sceneFont = painter->font(); - QRect nodeRect(-m_width / 2., -m_height / 2., m_width, m_height); - painter->setPen(QPen(Qt::black, 0)); - if (m_isChecked) - { - painter->setBrush(Qt::darkGreen); - } - else if (m_relatedToSolutionState) - { - painter->setBrush(Qt::darkGray); - } - painter->drawRect(nodeRect); - - if (m_relatedToSolutionState || m_isChecked) - { - painter->setPen(QPen(Qt::white, 0)); - } - - const double levelOfDetail = QStyleOptionGraphicsItem::levelOfDetailFromTransform(painter->worldTransform()); - if (levelOfDetail < LEVEL_OF_LOW_DETAIL) - { - if (levelOfDetail < LEVEL_OF_LOWER_DETAIL) - { - QString textStr = generateNodeTextLowerDetalization(m_nodeID); - painter->setFont(fontSizeMultiply(sceneFont, LOWER_DETAIL_MULTIPLIER)); - painter->drawText(nodeRect, Qt::AlignCenter, textStr); - } - else - { - QString textStr = generateNodeTextLowDetalization(m_nodeID, m_pathCost, m_restPathCost, m_moveCost); - painter->setFont(fontSizeMultiply(sceneFont, LOW_DETAIL_MULTIPLIER)); - painter->drawText(nodeRect, Qt::AlignCenter, textStr); - } - } - else - { - QString textStr = generateNodeTextNormalDetalization(m_nodeID, m_pathCost, m_restPathCost, m_moveCost, m_relevantTile, m_tileMoveTo, m_moveDirection); - painter->drawText(nodeRect, Qt::AlignCenter, textStr); - } - painter->setFont(sceneFont); + QFont sceneFont = painter->font(); + QRect nodeRect(int(-m_width / 2.), int(-m_height / 2.), int(m_width), int(m_height)); + painter->setPen(QPen(Qt::black, 0)); + if (m_isChecked) + { + painter->setBrush(Qt::darkGreen); + } + else if (m_relatedToSolutionState) + { + painter->setBrush(Qt::darkGray); + } + painter->drawRect(nodeRect); + + if (m_relatedToSolutionState || m_isChecked) + { + painter->setPen(QPen(Qt::white, 0)); + } + + const double levelOfDetail = QStyleOptionGraphicsItem::levelOfDetailFromTransform(painter->worldTransform()); + if (levelOfDetail < LEVEL_OF_LOW_DETAIL) + { + if (levelOfDetail < LEVEL_OF_LOWER_DETAIL) + { + QString textStr = generateNodeTextLowerDetalization(m_nodeID); + painter->setFont(fontSizeMultiply(sceneFont, LOWER_DETAIL_MULTIPLIER)); + painter->drawText(nodeRect, Qt::AlignCenter, textStr); + } + else + { + QString textStr = generateNodeTextLowDetalization(m_nodeID, m_pathCost, m_restPathCost, m_moveCost); + painter->setFont(fontSizeMultiply(sceneFont, LOW_DETAIL_MULTIPLIER)); + painter->drawText(nodeRect, Qt::AlignCenter, textStr); + } + } + else + { + QString textStr = generateNodeTextNormalDetalization(m_nodeID, m_pathCost, m_restPathCost, m_moveCost, m_relevantTile, m_tileMoveTo, m_moveDirection); + painter->drawText(nodeRect, Qt::AlignCenter, textStr); + } + painter->setFont(sceneFont); } int GraphNode::getNodeID() const { - return m_nodeID; + return m_nodeID; } int GraphNode::getPathCost() const { - return m_pathCost; + return m_pathCost; } int GraphNode::getRestPathCost() const { - return m_restPathCost; + return m_restPathCost; } const QString& GraphNode::getMoveDirection() const { - return m_moveDirection; + return m_moveDirection; } int GraphNode::getMoveCost() const { - return m_moveCost; + return m_moveCost; } int GraphNode:: getRelevantTile() const { - return m_relevantTile; + return m_relevantTile; } int GraphNode::getGraphLevel() const { - return m_graphLevel; + return m_graphLevel; } int GraphNode::getGraphOnLevelOrder() const { - return m_graphOnLevelOrder; + return m_graphOnLevelOrder; } int GraphNode::getTileMoveFrom() const { - return m_tileMoveFrom; + return m_tileMoveFrom; } int GraphNode::getTileMoveTo() const { - return m_tileMoveTo; + return m_tileMoveTo; } const std::vector& GraphNode::getBoardState() const { - return m_boardState; + return m_boardState; } GraphNode* GraphNode::getParentGraphNode() const { - return m_pParentGraphNode; + return m_pParentGraphNode; } bool GraphNode::isRelatedToSolution() const { - return m_relatedToSolutionState; + return m_relatedToSolutionState; } void GraphNode::setRelatedToSolution(bool value) { - m_relatedToSolutionState = value; + m_relatedToSolutionState = value; } void GraphNode::setGraphOnLevelOrder(int value) { - m_graphOnLevelOrder = value; + m_graphOnLevelOrder = value; } QVariant GraphNode::itemChange(GraphicsItemChange change, const QVariant &value) { - switch (change) - { - case ItemPositionHasChanged: - emit positionChanged(); - break; - default: - break; - } + switch (change) + { + case ItemPositionHasChanged: + emit positionChanged(); + break; + default: + break; + } - return QGraphicsItem::itemChange(change, value); + return QGraphicsItem::itemChange(change, value); } void GraphNode::addChild(GraphNode* child) { - childrenList.push_back(child); + childrenList.push_back(child); } bool GraphNode::haveChild() const { - return !childrenList.empty(); + return !childrenList.empty(); } double GraphNode::childrenMeanX() const { - if (!haveChild()) - return 0.; + if (!haveChild()) + return 0.; - double value(0); - for (GraphNode* child: childrenList) - { - value += child->pos().x(); - } + double value(0); + for (GraphNode* child: childrenList) + { + value += child->pos().x(); + } - return value / childrenList.size(); + return value / childrenList.size(); } double GraphNode::childrenMeanY() const { - double value(0); - if (haveChild()) - value = (*childrenList.begin())->pos().y(); - return value; + double value(0); + if (haveChild()) + value = (*childrenList.begin())->pos().y(); + return value; } const std::list& GraphNode::getChildrenList() const { - return childrenList; + return childrenList; } void GraphNode::forceShift(double deltaX) { - for (GraphNode* child: childrenList) - { - child->forceShift(deltaX); - } - setPos(pos().x() + deltaX, pos().y()); + for (GraphNode* child: childrenList) + { + child->forceShift(deltaX); + } + setPos(pos().x() + deltaX, pos().y()); } void GraphNode::setChecked(bool state) { - m_isChecked = state; - update(); + m_isChecked = state; + update(); } QPointF GraphNode::getBorderPointByAngle(double angle) const { - double xPos; - double yPos; - const double nodeDiagonal = sqrt(((m_height / 2.) * (m_height / 2.)) + ((m_width / 2.) * (m_width / 2.))); - if (fabs(sin(angle)) * nodeDiagonal < m_height / 2.) - { - xPos = cos(angle) > 0 ? m_width / 2. : -m_width / 2.; - yPos = xPos * sin(angle) / cos(angle); - } - else - { - yPos = sin(angle) > 0 ? m_height / 2. : -m_height / 2.; - xPos = yPos * cos(angle) / sin(angle); - } - return QPointF(xPos, yPos); + double xPos; + double yPos; + const double nodeDiagonal = sqrt(((m_height / 2.) * (m_height / 2.)) + ((m_width / 2.) * (m_width / 2.))); + if (fabs(sin(angle)) * nodeDiagonal < m_height / 2.) + { + xPos = cos(angle) > 0 ? m_width / 2. : -m_width / 2.; + yPos = xPos * sin(angle) / cos(angle); + } + else + { + yPos = sin(angle) > 0 ? m_height / 2. : -m_height / 2.; + xPos = yPos * cos(angle) / sin(angle); + } + return QPointF(xPos, yPos); } void GraphNode::mousePressEvent(QGraphicsSceneMouseEvent* mEvent) { - if (!(mEvent->modifiers())) - { - if (mEvent->button() == Qt::LeftButton) - { - emit clickedNode(this); - } - QGraphicsItem::mousePressEvent(mEvent); - } + if (!(mEvent->modifiers())) + { + if (mEvent->button() == Qt::LeftButton) + { + emit clickedNode(this); + } + QGraphicsItem::mousePressEvent(mEvent); + } } void GraphNode::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* mEvent) { - emit doubleClicked(); - QGraphicsItem::mouseDoubleClickEvent(mEvent); + emit doubleClicked(); + QGraphicsItem::mouseDoubleClickEvent(mEvent); } QString GraphNode::generateNodeTextNormalDetalization(int nodeID, int pathCost, int restPathCost, int moveCost, int relevantTile, int tileMoveTo, const QString& moveDirection) { - return QString("%1 (%2/%3/%4)\nФишка %5 = %6\n%7").arg( - QString::number(nodeID), QString::number(pathCost), QString::number(restPathCost), QString::number(moveCost), - QString::number(relevantTile), QString::number(tileMoveTo), - moveDirection); + return QString("%1 (%2/%3/%4)\nФишка %5 = %6\n%7").arg( + QString::number(nodeID), QString::number(pathCost), QString::number(restPathCost), QString::number(moveCost), + QString::number(relevantTile), QString::number(tileMoveTo), + moveDirection); } QString GraphNode::generateNodeTextLowDetalization(int nodeID, int pathCost, int restPathCost, int moveCost) { - return QString("%1\n%2/%3/%4").arg( - QString::number(nodeID), - QString::number(pathCost), QString::number(restPathCost), QString::number(moveCost)); + return QString("%1\n%2/%3/%4").arg( + QString::number(nodeID), + QString::number(pathCost), QString::number(restPathCost), QString::number(moveCost)); } QString GraphNode::generateNodeTextLowerDetalization(int nodeID) { - return QString("%1").arg(QString::number(nodeID)); + return QString("%1").arg(QString::number(nodeID)); } QRect GraphNode::calcTextWidth(const QString& text, const QFont& baseFont, Detalization detalization) { - QFontMetrics fontMetrics = QFontMetrics(baseFont); - switch (detalization) - { - case Detalization::Low : - fontMetrics = QFontMetrics(fontSizeMultiply(baseFont, LOW_DETAIL_MULTIPLIER)); - break; + QFontMetrics fontMetrics = QFontMetrics(baseFont); + switch (detalization) + { + case Detalization::LOW : + fontMetrics = QFontMetrics(fontSizeMultiply(baseFont, LOW_DETAIL_MULTIPLIER)); + break; - case Detalization::Lower : - fontMetrics = QFontMetrics(fontSizeMultiply(baseFont, LOWER_DETAIL_MULTIPLIER)); - break; + case Detalization::LOWER : + fontMetrics = QFontMetrics(fontSizeMultiply(baseFont, LOWER_DETAIL_MULTIPLIER)); + break; - case Detalization::Normal : - break; - } + case Detalization::NORMAL : + break; + } - return fontMetrics.boundingRect(QRect(), Qt::AlignCenter, text);; + return fontMetrics.boundingRect(QRect(), Qt::AlignCenter, text);; } QRect GraphNode::calcNodeRect(const GraphNodeInfo& info, const QFont& baseFont) { - const QString nodeTextNormalD = generateNodeTextNormalDetalization( - info.m_nodeID, info.m_pathCost, info.m_restPathCost, info.m_moveCost, info.m_relevantTile, info.m_tileMoveTo, info.m_moveDirection); - const QString nodeTextLowD = generateNodeTextLowDetalization( - info.m_nodeID, info.m_pathCost, info.m_restPathCost, info.m_moveCost); - const QString nodeTextLowerD = generateNodeTextLowerDetalization(info.m_nodeID); + const QString nodeTextNormalD = generateNodeTextNormalDetalization( + info.m_nodeID, info.m_pathCost, info.m_restPathCost, info.m_moveCost, info.m_relevantTile, info.m_tileMoveTo, info.m_moveDirection); + const QString nodeTextLowD = generateNodeTextLowDetalization( + info.m_nodeID, info.m_pathCost, info.m_restPathCost, info.m_moveCost); + const QString nodeTextLowerD = generateNodeTextLowerDetalization(info.m_nodeID); - const QRect nodeRectNormalD = calcTextWidth(nodeTextNormalD, baseFont, Detalization::Normal); - const QRect nodeRectLowD = calcTextWidth(nodeTextLowD, baseFont, Detalization::Low); - const QRect nodeRectLowerD = calcTextWidth(nodeTextLowerD, baseFont, Detalization::Lower); + const QRect nodeRectNormalD = calcTextWidth(nodeTextNormalD, baseFont, Detalization::NORMAL); + const QRect nodeRectLowD = calcTextWidth(nodeTextLowD, baseFont, Detalization::LOW); + const QRect nodeRectLowerD = calcTextWidth(nodeTextLowerD, baseFont, Detalization::LOWER); - QRect nodeRect = QRect(); - const int width = std::max(nodeRectNormalD.width(), std::max(nodeRectLowD.width(), nodeRectLowerD.width())); - const int height = std::max(nodeRectNormalD.height(), std::max(nodeRectLowD.height(), nodeRectLowerD.height())); - nodeRect.setWidth(width); - nodeRect.setHeight(height); + QRect nodeRect = QRect(); + const int width = std::max(nodeRectNormalD.width(), std::max(nodeRectLowD.width(), nodeRectLowerD.width())); + const int height = std::max(nodeRectNormalD.height(), std::max(nodeRectLowD.height(), nodeRectLowerD.height())); + nodeRect.setWidth(width); + nodeRect.setHeight(height); - return nodeRect; + return nodeRect; } diff --git a/app/rdo_studio/plugins/game5/src/graph_node.h b/app/rdo_studio/plugins/game5/src/graph_node.h index 28171890b..61c03a306 100644 --- a/app/rdo_studio/plugins/game5/src/graph_node.h +++ b/app/rdo_studio/plugins/game5/src/graph_node.h @@ -1,85 +1,86 @@ -#ifndef _RDO_PLUGIN_GAME_5_GRAPH_NODE_H_ -#define _RDO_PLUGIN_GAME_5_GRAPH_NODE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" #include #include "utils/src/common/warning_enable.h" // ----------------------------------------------------------------------- SYNOPSIS -#include "app/rdo_studio/plugins/game5/src/graph_items_types.h" +#include "app/rdo_studio/plugins/game5/src/graph_items_type.h" #include "app/rdo_studio/plugins/game5/src/graph_node_info.h" // -------------------------------------------------------------------------------- class GraphNode - : public QGraphicsObject - , private GraphNodeInfo + : public QGraphicsObject + , private GraphNodeInfo {Q_OBJECT public: - GraphNode(const GraphNodeInfo& info, GraphNode* parentGraphNode, int width, int height); - ~GraphNode(); - - enum { Type = rdo::plugin::game5::TypeID::GRAPH_NODE }; - enum Detalization {Normal, Low, Lower}; - - virtual int type() const { return Type; } - - virtual QRectF boundingRect() const; - virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget); - - void setGraphOnLevelOrder(int value); - void setRelatedToSolution(bool value); - - const std::list& getChildrenList () const; - GraphNode* getParentGraphNode() const; - const std::vector& getBoardState () const; - - int getNodeID () const; - int getPathCost () const; - int getRestPathCost () const; - const QString& getMoveDirection () const; - int getMoveCost () const; - int getRelevantTile () const; - int getGraphLevel () const; - int getGraphOnLevelOrder() const; - int getTileMoveFrom () const; - int getTileMoveTo () const; - bool isRelatedToSolution () const; - - bool haveChild () const; - double childrenMeanX() const; - double childrenMeanY() const; - void addChild (GraphNode* child); - - void forceShift(double deltaX); - void setChecked(bool state); - - QPointF getBorderPointByAngle(double angle) const; - - static QString generateNodeTextNormalDetalization(int nodeID, int pathCost, int restPathCost, int moveCost, - int relevantTile, int tileMoveTo, const QString& moveDirection); - static QString generateNodeTextLowDetalization(int nodeID, int pathCost, int restPathCost, int moveCost); - static QString generateNodeTextLowerDetalization(int nodeID); - static QRect calcTextWidth(const QString& text, const QFont& baseFont, Detalization detalization); - static QRect calcNodeRect(const GraphNodeInfo& info, const QFont& baseFont); + GraphNode(const GraphNodeInfo& info, GraphNode* parentGraphNode, int width, int height); + ~GraphNode(); + + enum class Detalization + { + NORMAL, + LOW, + LOWER + }; + + virtual int type() const { return static_cast(rdo::plugin::game5::GraphItemType::NODE); } + + virtual QRectF boundingRect() const; + virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget); + + void setGraphOnLevelOrder(int value); + void setRelatedToSolution(bool value); + + const std::list& getChildrenList () const; + GraphNode* getParentGraphNode() const; + const std::vector& getBoardState () const; + + int getNodeID () const; + int getPathCost () const; + int getRestPathCost () const; + const QString& getMoveDirection () const; + int getMoveCost () const; + int getRelevantTile () const; + int getGraphLevel () const; + int getGraphOnLevelOrder() const; + int getTileMoveFrom () const; + int getTileMoveTo () const; + bool isRelatedToSolution () const; + + bool haveChild () const; + double childrenMeanX() const; + double childrenMeanY() const; + void addChild (GraphNode* child); + + void forceShift(double deltaX); + void setChecked(bool state); + + QPointF getBorderPointByAngle(double angle) const; + + static QString generateNodeTextNormalDetalization(int nodeID, int pathCost, int restPathCost, int moveCost, + int relevantTile, int tileMoveTo, const QString& moveDirection); + static QString generateNodeTextLowDetalization(int nodeID, int pathCost, int restPathCost, int moveCost); + static QString generateNodeTextLowerDetalization(int nodeID); + static QRect calcTextWidth(const QString& text, const QFont& baseFont, Detalization detalization); + static QRect calcNodeRect(const GraphNodeInfo& info, const QFont& baseFont); signals: - void clickedNode(GraphNode* node); - void doubleClicked(); - void positionChanged(); + void clickedNode(GraphNode* node); + void doubleClicked(); + void positionChanged(); private: - std::list childrenList; - GraphNode* m_pParentGraphNode; + std::list childrenList; + GraphNode* m_pParentGraphNode; - int m_graphOnLevelOrder; - bool m_isChecked; - double m_width; - double m_height; + int m_graphOnLevelOrder; + bool m_isChecked; + double m_width; + double m_height; - virtual QVariant itemChange (GraphicsItemChange change, const QVariant &value); - virtual void mousePressEvent (QGraphicsSceneMouseEvent* mEvent); - virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* mEvent); + virtual QVariant itemChange (GraphicsItemChange change, const QVariant &value); + virtual void mousePressEvent (QGraphicsSceneMouseEvent* mEvent); + virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* mEvent); }; - -#endif // _RDO_PLUGIN_GAME_5_GRAPH_NODE_H_ diff --git a/app/rdo_studio/plugins/game5/src/graph_node_info.cpp b/app/rdo_studio/plugins/game5/src/graph_node_info.cpp index 030704550..bb0961bf9 100644 --- a/app/rdo_studio/plugins/game5/src/graph_node_info.cpp +++ b/app/rdo_studio/plugins/game5/src/graph_node_info.cpp @@ -10,33 +10,33 @@ GraphNodeInfo::GraphNodeInfo(int nodeID, int parentNodeId, int pathCost, int res const QString& moveDirection, int moveCost, int relevantTile, int graphLevel, int tileMoveFrom, int tileMoveTo, const std::vector& boardState) - : m_nodeID(nodeID) - , m_parentNodeId(parentNodeId) - , m_pathCost(pathCost) - , m_restPathCost(restPathCost) - , m_moveDirection(moveDirection) - , m_moveCost(moveCost) - , m_relevantTile(relevantTile) - , m_graphLevel(graphLevel) - , m_tileMoveFrom(tileMoveFrom) - , m_tileMoveTo(tileMoveTo) - , m_relatedToSolutionState(false) - , m_boardState(boardState) + : m_nodeID(nodeID) + , m_parentNodeId(parentNodeId) + , m_pathCost(pathCost) + , m_restPathCost(restPathCost) + , m_moveDirection(moveDirection) + , m_moveCost(moveCost) + , m_relevantTile(relevantTile) + , m_graphLevel(graphLevel) + , m_tileMoveFrom(tileMoveFrom) + , m_tileMoveTo(tileMoveTo) + , m_relatedToSolutionState(false) + , m_boardState(boardState) {} GraphNodeInfo::GraphNodeInfo(const GraphNodeInfo& other) - : m_nodeID(other.m_nodeID) - , m_parentNodeId(other.m_parentNodeId) - , m_pathCost(other.m_pathCost) - , m_restPathCost(other.m_restPathCost) - , m_moveDirection(other.m_moveDirection) - , m_moveCost(other.m_moveCost) - , m_relevantTile(other.m_relevantTile) - , m_graphLevel(other.m_graphLevel) - , m_tileMoveFrom(other.m_tileMoveFrom) - , m_tileMoveTo(other.m_tileMoveTo) - , m_relatedToSolutionState(other.m_relatedToSolutionState) - , m_boardState(other.m_boardState) + : m_nodeID(other.m_nodeID) + , m_parentNodeId(other.m_parentNodeId) + , m_pathCost(other.m_pathCost) + , m_restPathCost(other.m_restPathCost) + , m_moveDirection(other.m_moveDirection) + , m_moveCost(other.m_moveCost) + , m_relevantTile(other.m_relevantTile) + , m_graphLevel(other.m_graphLevel) + , m_tileMoveFrom(other.m_tileMoveFrom) + , m_tileMoveTo(other.m_tileMoveTo) + , m_relatedToSolutionState(other.m_relatedToSolutionState) + , m_boardState(other.m_boardState) {} GraphNodeInfo::GraphNodeInfo() diff --git a/app/rdo_studio/plugins/game5/src/graph_node_info.h b/app/rdo_studio/plugins/game5/src/graph_node_info.h index 1ff084858..024c736cb 100644 --- a/app/rdo_studio/plugins/game5/src/graph_node_info.h +++ b/app/rdo_studio/plugins/game5/src/graph_node_info.h @@ -1,5 +1,4 @@ -#ifndef GRAPH_NODE_INFO_H -#define GRAPH_NODE_INFO_H +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -12,26 +11,24 @@ class GraphNodeInfo { public: - GraphNodeInfo(int nodeID, int parentNodeId, int pathCost, int restPathCost, - const QString& moveDirection, int moveCost, int relevantTile, - int graphLevel, int tileMoveFrom, int tileMoveTo, - const std::vector& boardState); - GraphNodeInfo(const GraphNodeInfo& other); - GraphNodeInfo(); - virtual ~GraphNodeInfo(); + GraphNodeInfo(int nodeID, int parentNodeId, int pathCost, int restPathCost, + const QString& moveDirection, int moveCost, int relevantTile, + int graphLevel, int tileMoveFrom, int tileMoveTo, + const std::vector& boardState); + GraphNodeInfo(const GraphNodeInfo& other); + GraphNodeInfo(); + virtual ~GraphNodeInfo(); - int m_nodeID; - int m_parentNodeId; - int m_pathCost; - int m_restPathCost; - QString m_moveDirection; - int m_moveCost; - int m_relevantTile; - int m_graphLevel; - int m_tileMoveFrom; - int m_tileMoveTo; - bool m_relatedToSolutionState; - std::vector m_boardState; + int m_nodeID; + int m_parentNodeId; + int m_pathCost; + int m_restPathCost; + QString m_moveDirection; + int m_moveCost; + int m_relevantTile; + int m_graphLevel; + int m_tileMoveFrom; + int m_tileMoveTo; + bool m_relatedToSolutionState; + std::vector m_boardState; }; - -#endif // GRAPH_NODE_INFO_H diff --git a/app/rdo_studio/plugins/game5/src/graph_widget.cpp b/app/rdo_studio/plugins/game5/src/graph_widget.cpp index 6191f366e..d4b87ada5 100644 --- a/app/rdo_studio/plugins/game5/src/graph_widget.cpp +++ b/app/rdo_studio/plugins/game5/src/graph_widget.cpp @@ -13,69 +13,69 @@ namespace { - const double MAX_FACTOR = 10; - const double MIN_FACTOR = 0.01; - const double SCALE_SPEED = 1/1200.; - const double MANUAL_SCALE_FACTOR = 20 * SCALE_SPEED; + const double MAX_FACTOR = 10; + const double MIN_FACTOR = 0.01; + const double SCALE_SPEED = 1/1200.; + const double MANUAL_SCALE_FACTOR = 20 * SCALE_SPEED; } // end anonymous namespace GraphWidget::GraphWidget(QWidget* pParent) - : QGraphicsView(pParent) - , m_graphInfo(this) - , m_autoScale(true) + : QGraphicsView(pParent) + , m_graphInfo(this) + , m_autoScale(true) { - QGraphicsScene* pScene = new QGraphicsScene(this); - pScene->setItemIndexMethod(QGraphicsScene::NoIndex); - - setScene(pScene); - - QGridLayout* graphWidgetLayout = new QGridLayout(this); - graphWidgetLayout->setContentsMargins(0, 0, 0, 0); - - QSpacerItem* verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum , QSizePolicy::Expanding); - QSpacerItem* horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); - - graphWidgetLayout->addWidget(&m_graphInfo , 0, 0, 1, 1); - graphWidgetLayout->addItem (verticalSpacer , 1, 0, 1, 1); - graphWidgetLayout->addItem (horizontalSpacer, 0, 1, 2, 1); - - setCacheMode(CacheBackground); - setViewportUpdateMode(BoundingRectViewportUpdate); - setRenderHint(QPainter::Antialiasing); - setTransformationAnchor(AnchorUnderMouse); - setContextMenuPolicy(Qt::CustomContextMenu); - connect(this, &QWidget::customContextMenuRequested, this, &GraphWidget::callContextMenu); - - zoomInAct = new QAction("Zoom In", this); - QShortcut* ctrlPlusShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Plus), this); - connect(ctrlPlusShortcut, &QShortcut::activated, zoomInAct, &QAction::trigger); - QShortcut* ctrlEqualShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Equal), this); - connect(ctrlEqualShortcut, &QShortcut::activated, zoomInAct, &QAction::trigger); - zoomInAct->setStatusTip("Приблизить"); - connect(zoomInAct, &QAction::triggered, this, &GraphWidget::zoomIn); - - zoomOutAct = new QAction("Zoom Out", this); - QShortcut* ctrlMinusShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Minus), this); - connect(ctrlMinusShortcut, &QShortcut::activated, zoomOutAct, &QAction::trigger); - QShortcut* ctrlUnderscoreShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Underscore), this); - connect(ctrlUnderscoreShortcut, &QShortcut::activated, zoomOutAct, &QAction::trigger); - zoomOutAct->setStatusTip("Отдалить"); - connect(zoomOutAct, &QAction::triggered, this, &GraphWidget::zoomOut); - - zoomFitAct = new QAction("Zoom Fit", this); - zoomFitAct->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_9)); - zoomFitAct->setStatusTip("Вписать граф в окно"); - connect(zoomFitAct, &QAction::triggered, this, &GraphWidget::zoomFit); - - normalSizeAct = new QAction("Normal Size", this); - normalSizeAct->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_0)); - normalSizeAct->setStatusTip("Вернуть масштаб 1:1"); - connect(normalSizeAct, &QAction::triggered, this, &GraphWidget::normalSize); - - addAction(zoomInAct); - addAction(zoomOutAct); - addAction(zoomFitAct); - addAction(normalSizeAct); + QGraphicsScene* pScene = new QGraphicsScene(this); + pScene->setItemIndexMethod(QGraphicsScene::NoIndex); + + setScene(pScene); + + QGridLayout* graphWidgetLayout = new QGridLayout(this); + graphWidgetLayout->setContentsMargins(0, 0, 0, 0); + + QSpacerItem* verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum , QSizePolicy::Expanding); + QSpacerItem* horizontalSpacer = new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum); + + graphWidgetLayout->addWidget(&m_graphInfo , 0, 0, 1, 1); + graphWidgetLayout->addItem (verticalSpacer , 1, 0, 1, 1); + graphWidgetLayout->addItem (horizontalSpacer, 0, 1, 2, 1); + + setCacheMode(CacheBackground); + setViewportUpdateMode(BoundingRectViewportUpdate); + setRenderHint(QPainter::Antialiasing); + setTransformationAnchor(AnchorUnderMouse); + setContextMenuPolicy(Qt::CustomContextMenu); + connect(this, &QWidget::customContextMenuRequested, this, &GraphWidget::callContextMenu); + + zoomInAct = new QAction("Zoom In", this); + QShortcut* ctrlPlusShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Plus), this); + connect(ctrlPlusShortcut, &QShortcut::activated, zoomInAct, &QAction::trigger); + QShortcut* ctrlEqualShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Equal), this); + connect(ctrlEqualShortcut, &QShortcut::activated, zoomInAct, &QAction::trigger); + zoomInAct->setStatusTip("Приблизить"); + connect(zoomInAct, &QAction::triggered, this, &GraphWidget::zoomIn); + + zoomOutAct = new QAction("Zoom Out", this); + QShortcut* ctrlMinusShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Minus), this); + connect(ctrlMinusShortcut, &QShortcut::activated, zoomOutAct, &QAction::trigger); + QShortcut* ctrlUnderscoreShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Underscore), this); + connect(ctrlUnderscoreShortcut, &QShortcut::activated, zoomOutAct, &QAction::trigger); + zoomOutAct->setStatusTip("Отдалить"); + connect(zoomOutAct, &QAction::triggered, this, &GraphWidget::zoomOut); + + zoomFitAct = new QAction("Zoom Fit", this); + zoomFitAct->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_9)); + zoomFitAct->setStatusTip("Вписать граф в окно"); + connect(zoomFitAct, &QAction::triggered, this, &GraphWidget::zoomFit); + + normalSizeAct = new QAction("Normal Size", this); + normalSizeAct->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_0)); + normalSizeAct->setStatusTip("Вернуть масштаб 1:1"); + connect(normalSizeAct, &QAction::triggered, this, &GraphWidget::normalSize); + + addAction(zoomInAct); + addAction(zoomOutAct); + addAction(zoomFitAct); + addAction(normalSizeAct); } GraphWidget::~GraphWidget() @@ -83,125 +83,125 @@ GraphWidget::~GraphWidget() void GraphWidget::updateGraphInfo(const QString& solutionCost, const QString& numberOfOpenNodes, const QString& totalNumberOfNodes) { - m_graphInfo.update(solutionCost, numberOfOpenNodes, totalNumberOfNodes); + m_graphInfo.update(solutionCost, numberOfOpenNodes, totalNumberOfNodes); } void GraphWidget::zoomIn() { - scaleView(pow(2., MANUAL_SCALE_FACTOR)); + scaleView(pow(2., MANUAL_SCALE_FACTOR)); } void GraphWidget::zoomOut() { - scaleView(pow(2., -MANUAL_SCALE_FACTOR)); + scaleView(pow(2., -MANUAL_SCALE_FACTOR)); } void GraphWidget::zoomFit() { - m_autoScale = true; - fitInView(scene()->itemsBoundingRect(), Qt::KeepAspectRatio); - const double factor = transform().mapRect(QRectF(0, 0, 1, 1)).width(); - if (factor > MAX_FACTOR) - { - scale(MAX_FACTOR / factor, MAX_FACTOR / factor); - } - if (factor < MIN_FACTOR) - { - scale(MIN_FACTOR / factor, MIN_FACTOR / factor); - } + m_autoScale = true; + fitInView(scene()->itemsBoundingRect(), Qt::KeepAspectRatio); + const double factor = transform().mapRect(QRectF(0, 0, 1, 1)).width(); + if (factor > MAX_FACTOR) + { + scale(MAX_FACTOR / factor, MAX_FACTOR / factor); + } + if (factor < MIN_FACTOR) + { + scale(MIN_FACTOR / factor, MIN_FACTOR / factor); + } } void GraphWidget::normalSize() { - m_autoScale = false; - setTransform(QTransform()); + m_autoScale = false; + setTransform(QTransform()); } void GraphWidget::wheelEvent(QWheelEvent* wEvent) { - if (wEvent->modifiers() & Qt::SHIFT) - { - scaleView(pow(2., wEvent->delta() * SCALE_SPEED)); - } - else - { - QGraphicsView::wheelEvent(wEvent); - } + if (wEvent->modifiers() & Qt::SHIFT) + { + scaleView(pow(2., wEvent->delta() * SCALE_SPEED)); + } + else + { + QGraphicsView::wheelEvent(wEvent); + } } void GraphWidget::keyPressEvent(QKeyEvent* kEvent) { - QGraphicsView::keyPressEvent(kEvent); - if (kEvent->key() == Qt::Key_Control) - { - setDragMode(ScrollHandDrag); - setInteractive(false); - m_dragModeCtrl = true; - } + QGraphicsView::keyPressEvent(kEvent); + if (kEvent->key() == Qt::Key_Control) + { + setDragMode(ScrollHandDrag); + setInteractive(false); + m_dragModeCtrl = true; + } } void GraphWidget::keyReleaseEvent(QKeyEvent* kEvent) { - QGraphicsView::keyReleaseEvent(kEvent); - if (kEvent->key() == Qt::Key_Control) - { - if (!m_dragModeClick) - { - setDragMode(NoDrag); - setInteractive(true); - } - m_dragModeCtrl = false; - } + QGraphicsView::keyReleaseEvent(kEvent); + if (kEvent->key() == Qt::Key_Control) + { + if (!m_dragModeClick) + { + setDragMode(NoDrag); + setInteractive(true); + } + m_dragModeCtrl = false; + } } void GraphWidget::mousePressEvent(QMouseEvent* mEvent) { - if (mEvent->button() == Qt::MouseButton::LeftButton && !itemAt(mEvent->pos())) - { - setDragMode(ScrollHandDrag); - m_dragModeClick = true; - } - QGraphicsView::mousePressEvent(mEvent); + if (mEvent->button() == Qt::MouseButton::LeftButton && !itemAt(mEvent->pos())) + { + setDragMode(ScrollHandDrag); + m_dragModeClick = true; + } + QGraphicsView::mousePressEvent(mEvent); } void GraphWidget::mouseReleaseEvent(QMouseEvent* mEvent) { - if (mEvent->button() == Qt::MouseButton::LeftButton) - { - if (!m_dragModeCtrl) - { - setDragMode(NoDrag); - } - m_dragModeClick = false; - } - QGraphicsView::mouseReleaseEvent(mEvent); + if (mEvent->button() == Qt::MouseButton::LeftButton) + { + if (!m_dragModeCtrl) + { + setDragMode(NoDrag); + } + m_dragModeClick = false; + } + QGraphicsView::mouseReleaseEvent(mEvent); } void GraphWidget::scaleView(double scaleFactor) { - m_autoScale = false; - const double factor = transform().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width(); - if (MIN_FACTOR < factor && factor < MAX_FACTOR) - { - scale(scaleFactor, scaleFactor); - } + m_autoScale = false; + const double factor = transform().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width(); + if (MIN_FACTOR < factor && factor < MAX_FACTOR) + { + scale(scaleFactor, scaleFactor); + } } void GraphWidget::resizeEvent(QResizeEvent* event) { - if (m_autoScale) - { - zoomFit(); - } - QGraphicsView::resizeEvent(event); + if (m_autoScale) + { + zoomFit(); + } + QGraphicsView::resizeEvent(event); } void GraphWidget::callContextMenu(const QPoint& pos) { - QMenu* menu = new QMenu; - menu->addAction(zoomInAct); - menu->addAction(zoomOutAct); - menu->addAction(zoomFitAct); - menu->addAction(normalSizeAct); - menu->exec(viewport()->mapToGlobal(pos)); + QMenu* menu = new QMenu; + menu->addAction(zoomInAct); + menu->addAction(zoomOutAct); + menu->addAction(zoomFitAct); + menu->addAction(normalSizeAct); + menu->exec(viewport()->mapToGlobal(pos)); } diff --git a/app/rdo_studio/plugins/game5/src/graph_widget.h b/app/rdo_studio/plugins/game5/src/graph_widget.h index b084a635c..0a242574f 100644 --- a/app/rdo_studio/plugins/game5/src/graph_widget.h +++ b/app/rdo_studio/plugins/game5/src/graph_widget.h @@ -1,5 +1,4 @@ -#ifndef _RDO_PLUGIN_GAME_5_GRAPH_WIDGET_H_ -#define _RDO_PLUGIN_GAME_5_GRAPH_WIDGET_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -13,38 +12,36 @@ class GraphWidget : public QGraphicsView { public: - GraphWidget(QWidget* parent = 0); - ~GraphWidget(); + GraphWidget(QWidget* parent = 0); + ~GraphWidget(); - void updateGraphInfo(const QString& solutionCost, const QString& numOfOpenNodes, const QString& totalNumberOfNodes); - void zoomIn(); - void zoomOut(); - void zoomFit(); - void normalSize(); + void updateGraphInfo(const QString& solutionCost, const QString& numOfOpenNodes, const QString& totalNumberOfNodes); + void zoomIn(); + void zoomOut(); + void zoomFit(); + void normalSize(); private: - GraphInfo m_graphInfo; - bool m_dragModeCtrl; - bool m_dragModeClick; - bool m_autoScale; + GraphInfo m_graphInfo; + bool m_dragModeCtrl; + bool m_dragModeClick; + bool m_autoScale; - QAction* zoomInAct; - QAction* zoomOutAct; - QAction* zoomFitAct; - QAction* normalSizeAct; + QAction* zoomInAct; + QAction* zoomOutAct; + QAction* zoomFitAct; + QAction* normalSizeAct; - virtual void wheelEvent (QWheelEvent* wEvent); - virtual void keyPressEvent (QKeyEvent* kEvent); - virtual void keyReleaseEvent (QKeyEvent* kEvent); - virtual void mousePressEvent (QMouseEvent* mEvent); - virtual void mouseReleaseEvent(QMouseEvent* mEvent); + virtual void wheelEvent (QWheelEvent* wEvent); + virtual void keyPressEvent (QKeyEvent* kEvent); + virtual void keyReleaseEvent (QKeyEvent* kEvent); + virtual void mousePressEvent (QMouseEvent* mEvent); + virtual void mouseReleaseEvent(QMouseEvent* mEvent); - void scaleView(double scaleFactor); + void scaleView(double scaleFactor); - virtual void resizeEvent(QResizeEvent* event); + virtual void resizeEvent(QResizeEvent* event); private slots: - void callContextMenu(const QPoint &pos); + void callContextMenu(const QPoint &pos); }; - -#endif // _RDO_PLUGIN_GAME_5_GRAPH_WIDGET_H_ diff --git a/app/rdo_studio/plugins/game5/src/multi_select_completer.cpp b/app/rdo_studio/plugins/game5/src/multi_select_completer.cpp index 1e76601ef..6a7595923 100644 --- a/app/rdo_studio/plugins/game5/src/multi_select_completer.cpp +++ b/app/rdo_studio/plugins/game5/src/multi_select_completer.cpp @@ -8,13 +8,13 @@ // -------------------------------------------------------------------------------- MultiSelectCompleter::MultiSelectCompleter(const QStringList& items, QObject* parent) - : QCompleter(items, parent) - , m_cursorPos(-1) - , m_selectionLen(-1) + : QCompleter(items, parent) + , m_cursorPos(-1) + , m_selectionLen(-1) { - setCaseSensitivity(Qt::CaseSensitive); - setCompletionMode(QCompleter::InlineCompletion); - connect(this, &MultiSelectCompleter::changeSelection, this, &MultiSelectCompleter::setSelection); + setCaseSensitivity(Qt::CaseSensitive); + setCompletionMode(QCompleter::InlineCompletion); + connect(this, &MultiSelectCompleter::changeSelection, this, &MultiSelectCompleter::setSelection); } MultiSelectCompleter::~MultiSelectCompleter() @@ -22,60 +22,60 @@ MultiSelectCompleter::~MultiSelectCompleter() QString MultiSelectCompleter::pathFromIndex(const QModelIndex& index) const { - QLineEdit* lineEdit = static_cast(widget()); - QString path = QCompleter::pathFromIndex(index); - QString text = lineEdit->text(); + QLineEdit* lineEdit = static_cast(widget()); + QString path = QCompleter::pathFromIndex(index); + QString text = lineEdit->text(); - const int cursorPos = lineEdit->cursorPosition(); - const int leftPos = text.lastIndexOf(" ", cursorPos - 1); - const int rightPos = text.indexOf(" ", cursorPos); - const int prefixLen = cursorPos - leftPos - 1; - const int matchedLen = path.length(); - const int selectionLen = matchedLen - prefixLen; + const int cursorPos = lineEdit->cursorPosition(); + const int leftPos = text.lastIndexOf(" ", cursorPos - 1); + const int rightPos = text.indexOf(" ", cursorPos); + const int prefixLen = cursorPos - leftPos - 1; + const int matchedLen = path.length(); + const int selectionLen = matchedLen - prefixLen; - if (leftPos >= 0) - { - path = text.mid(0, leftPos) + " " + path; - } + if (leftPos >= 0) + { + path = text.mid(0, leftPos) + " " + path; + } - if (rightPos >= 0) - { - path = path + text.mid(rightPos); - } + if (rightPos >= 0) + { + path = path + text.mid(rightPos); + } - emit changeSelection(cursorPos, selectionLen); - return path; + emit changeSelection(cursorPos, selectionLen); + return path; } -QStringList MultiSelectCompleter::splitPath(const QString& path) const +QStringList MultiSelectCompleter::splitPath(const QString& /*path*/) const { - QLineEdit* lineEdit = static_cast(widget()); + QLineEdit* lineEdit = static_cast(widget()); - int cursorPos = lineEdit->cursorPosition(); - QString text = lineEdit->text().left(cursorPos); - int pos = text.lastIndexOf(' '); + int cursorPos = lineEdit->cursorPosition(); + QString text = lineEdit->text().left(cursorPos); + int pos = text.lastIndexOf(' '); - if (pos >= 0) - { - text = text.mid(pos + 1); - } + if (pos >= 0) + { + text = text.mid(pos + 1); + } - return QStringList(text); + return QStringList(text); } void MultiSelectCompleter::onLineEditTextChanged() { - if (m_cursorPos != -1) - { - QLineEdit* lineEdit = static_cast(widget()); - lineEdit->setSelection(m_cursorPos, m_selectionLen); - m_cursorPos = -1; - m_selectionLen = -1; - } + if (m_cursorPos != -1) + { + QLineEdit* lineEdit = static_cast(widget()); + lineEdit->setSelection(m_cursorPos, m_selectionLen); + m_cursorPos = -1; + m_selectionLen = -1; + } } void MultiSelectCompleter::setSelection(int cursorPos, int selectionLen) { - m_cursorPos = cursorPos; - m_selectionLen = selectionLen; + m_cursorPos = cursorPos; + m_selectionLen = selectionLen; } diff --git a/app/rdo_studio/plugins/game5/src/multi_select_completer.h b/app/rdo_studio/plugins/game5/src/multi_select_completer.h index 13cb9db09..97cd11290 100644 --- a/app/rdo_studio/plugins/game5/src/multi_select_completer.h +++ b/app/rdo_studio/plugins/game5/src/multi_select_completer.h @@ -1,5 +1,4 @@ -#ifndef _RDO_PLUGIN_GAME_5_MULTI_SELECT_COMPLETER_H_ -#define _RDO_PLUGIN_GAME_5_MULTI_SELECT_COMPLETER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -12,22 +11,20 @@ class MultiSelectCompleter : public QCompleter {Q_OBJECT public: - MultiSelectCompleter(const QStringList& items, QObject* parent); - ~MultiSelectCompleter(); + MultiSelectCompleter(const QStringList& items, QObject* parent); + ~MultiSelectCompleter(); - virtual QString pathFromIndex(const QModelIndex& index) const; - virtual QStringList splitPath(const QString& path) const; + virtual QString pathFromIndex(const QModelIndex& index) const; + virtual QStringList splitPath(const QString& path) const; signals: - void changeSelection(int cursorPos, int selectionLen) const; + void changeSelection(int cursorPos, int selectionLen) const; public slots: - void onLineEditTextChanged(); - void setSelection(int cursorPos, int selectionLen); + void onLineEditTextChanged(); + void setSelection(int cursorPos, int selectionLen); private: - int m_cursorPos; - int m_selectionLen; + int m_cursorPos; + int m_selectionLen; }; - -#endif // _RDO_PLUGIN_GAME_5_MULTI_SELECT_COMPLETER_H_ diff --git a/app/rdo_studio/plugins/game5/src/plugin_game5.cpp b/app/rdo_studio/plugins/game5/src/plugin_game5.cpp index 62fdc7ac5..c4ad29016 100644 --- a/app/rdo_studio/plugins/game5/src/plugin_game5.cpp +++ b/app/rdo_studio/plugins/game5/src/plugin_game5.cpp @@ -21,314 +21,314 @@ namespace { - const QString PLUGIN_GUID = "{5315750C-964B-4ed2-96FE-21FC6226942B}"; - const QString PLUGIN_ACTION_NAME = "action" + PLUGIN_GUID; - const QString PLUGIN_MENU_NAME = "createdMenu"; - const QString PLUGIN_MENU_TEXT = "Плагины"; - const QString PLUGIN_TOOLBAR_NAME = "toolbar" + PLUGIN_GUID; - const QString RDO_MENUBAR_NAME = "menubar"; - const size_t RDOFileType_ENUM_SIZE = 13; - - void backUpModel(rdo::gui::model::Model* pModel) - { - boost::filesystem::path modelFolder(pModel->getFullName().toStdWString()); - modelFolder.remove_leaf(); - const QString backupFolderName = "backup" + QDateTime::currentDateTime().toString("_yyyy-MM-dd_HH.mm.ss"); - const boost::filesystem::path backupFolder = modelFolder / backupFolderName.toStdString(); - try - { - if (boost::filesystem::create_directory(backupFolder)) - { - for (size_t i = 0; i < RDOFileType_ENUM_SIZE; i++) - { - std::string fileExtension = rdo::model::getFileTypeString(rdo::model::FileType(i)); - boost::algorithm::to_lower(fileExtension); - const std::string fileName = pModel->getName().toStdString() + "." + fileExtension; - const boost::filesystem::path filePath = modelFolder / fileName; - const boost::filesystem::path backupFilePath = backupFolder / fileName; - if (boost::filesystem::exists(filePath)) - { - boost::filesystem::copy(filePath, backupFilePath); - } - } - } - } - catch (const boost::filesystem::filesystem_error& error) - { - const std::string system_what = error.boost::system::system_error::what(); - const std::string system_what_utf = + const QString PLUGIN_GUID = "{5315750C-964B-4ed2-96FE-21FC6226942B}"; + const QString PLUGIN_ACTION_NAME = "action" + PLUGIN_GUID; + const QString PLUGIN_MENU_NAME = "createdMenu"; + const QString PLUGIN_MENU_TEXT = "Плагины"; + const QString PLUGIN_TOOLBAR_NAME = "toolbar" + PLUGIN_GUID; + const QString RDO_MENUBAR_NAME = "menubar"; + const size_t RDOFileType_ENUM_SIZE = 13; + + void backUpModel(rdo::gui::model::Model* pModel) + { + boost::filesystem::path modelFolder(pModel->getFullName().toStdWString()); + modelFolder.remove_leaf(); + const QString backupFolderName = "backup" + QDateTime::currentDateTime().toString("_yyyy-MM-dd_HH.mm.ss"); + const boost::filesystem::path backupFolder = modelFolder / backupFolderName.toStdString(); + try + { + if (boost::filesystem::create_directory(backupFolder)) + { + for (size_t i = 0; i < RDOFileType_ENUM_SIZE; i++) + { + std::string fileExtension = rdo::getFileTypeString(rdo::FileType(i)); + boost::algorithm::to_lower(fileExtension); + const std::string fileName = pModel->getName().toStdString() + "." + fileExtension; + const boost::filesystem::path filePath = modelFolder / fileName; + const boost::filesystem::path backupFilePath = backupFolder / fileName; + if (boost::filesystem::exists(filePath)) + { + boost::filesystem::copy(filePath, backupFilePath); + } + } + } + } + catch (const boost::filesystem::filesystem_error& error) + { + const std::string system_what = error.boost::system::system_error::what(); + const std::string system_what_utf = #if defined(OST_WINDOWS) - rdo::locale::convertFromCLocale(system_what, rdo::locale::get().system()); + rdo::locale::convertFromCLocale(system_what, rdo::locale::get().system()); #elif defined(OST_LINUX) - system_what; + system_what; #endif - QString what = error.what(); - what.replace(QString::fromStdString(system_what), QString::fromStdString(system_what_utf)); - QMessageBox::critical(g_pApp->getMainWnd(), - "RAO-Studio", - QString("Ошибка создания резервной копии модели: ") + what); - } - } - - QMenu* findPluginMenu(QWidget* pParent) - { - QMenu* pluginMenu = pParent->findChild(PLUGIN_MENU_NAME); - if (!pluginMenu) - { - QMenuBar* menuBar = pParent->findChild(RDO_MENUBAR_NAME); - ASSERT(menuBar); - for (auto action: menuBar->actions()) - { - if (action->text() == PLUGIN_MENU_TEXT) - { - pluginMenu = action->menu(); - break; - } - } - } - return pluginMenu; - } + QString what = error.what(); + what.replace(QString::fromStdString(system_what), QString::fromStdString(system_what_utf)); + QMessageBox::critical(g_pApp->getMainWnd(), + "RAO-Studio", + QString("Ошибка создания резервной копии модели: ") + what); + } + } + + QMenu* findPluginMenu(QWidget* pParent) + { + QMenu* pluginMenu = pParent->findChild(PLUGIN_MENU_NAME); + if (!pluginMenu) + { + QMenuBar* menuBar = pParent->findChild(RDO_MENUBAR_NAME); + ASSERT(menuBar); + for (auto action: menuBar->actions()) + { + if (action->text() == PLUGIN_MENU_TEXT) + { + pluginMenu = action->menu(); + break; + } + } + } + return pluginMenu; + } } // end anonymous namespace QString PluginGame5::getPluginName() const { - return "game5_debug"; + return "game5_debug"; } QString PluginGame5::getAuthor() const { - return "Chernov"; + return "Chernov"; } QString PluginGame5::getVersion() const { - return "0.2.1"; + return "0.2.1"; } QUuid PluginGame5::getGUID() const { - QUuid pluginGUID(PLUGIN_GUID); - return pluginGUID; + QUuid pluginGUID(PLUGIN_GUID); + return pluginGUID; } void PluginGame5::pluginStartAction(QWidget* pParent, const std::string& commandLine) { - if (!g_pApp) - { - g_pApp = static_cast(qApp); - g_pModel = g_pApp->getMainWndUI()->getModel(); - g_pTracer = g_pApp->getTracer(); - kernel = g_pApp->getKernel(); - } - - if (!commandLine.empty()) - { - executeCommand(commandLine); - } - - QMenu* pluginMenu = findPluginMenu(pParent); - if (!pluginMenu) - { - pluginMenu = new QMenu(PLUGIN_MENU_TEXT, pParent); - pluginMenu->setObjectName(PLUGIN_MENU_NAME); - } - QMenuBar* menuBar = pParent->findChild(RDO_MENUBAR_NAME); - ASSERT(menuBar); - menuBar->addMenu(pluginMenu); - - QAction* action = new QAction(getPluginName() + " ver " + getVersion(), pluginMenu); - action->setObjectName(PLUGIN_ACTION_NAME); - connect(action, &QAction::triggered, this, &PluginGame5::pluginActivation); - pluginMenu->addAction(action); - - m_generateSituationDlg = NULL; - m_graphDlg = NULL; + if (!g_pApp) + { + g_pApp = static_cast(qApp); + g_pModel = g_pApp->getMainWndUI()->getModel(); + g_pTracer = g_pApp->getTracer(); + kernel = g_pApp->getKernel(); + } + + if (!commandLine.empty()) + { + executeCommand(commandLine); + } + + QMenu* pluginMenu = findPluginMenu(pParent); + if (!pluginMenu) + { + pluginMenu = new QMenu(PLUGIN_MENU_TEXT, pParent); + pluginMenu->setObjectName(PLUGIN_MENU_NAME); + } + QMenuBar* menuBar = pParent->findChild(RDO_MENUBAR_NAME); + ASSERT(menuBar); + menuBar->addMenu(pluginMenu); + + QAction* action = new QAction(getPluginName() + " ver " + getVersion(), pluginMenu); + action->setObjectName(PLUGIN_ACTION_NAME); + connect(action, &QAction::triggered, this, &PluginGame5::pluginActivation); + pluginMenu->addAction(action); + + m_generateSituationDlg = NULL; + m_graphDlg = NULL; } void PluginGame5::pluginStopAction(QWidget* pParent) { - QMenu* pluginMenu = findPluginMenu(pParent); - ASSERT(pluginMenu); - - QAction* pluignAction = pluginMenu->findChild(PLUGIN_ACTION_NAME); - ASSERT(pluignAction); - delete pluignAction; - - if (pluginMenu->isEmpty()) - delete pluginMenu; - - if (m_generateSituationDlg) - delete m_generateSituationDlg; - - if (m_graphDlg); - delete m_graphDlg; - - QToolBar* pluginGame5ToolBar = pParent->findChild(PLUGIN_TOOLBAR_NAME); - if (pluginGame5ToolBar) - delete pluginGame5ToolBar; - - if (g_pApp->getMainWndUI()) - { - rdo::gui::model::Model* pModel = g_pApp->getMainWndUI()->getModel(); - if (pModel) - { - disconnect(pModel, &rdo::gui::model::Model::stopped, - this , &PluginGame5::reemitGraphDlgAction); - disconnect(pModel, &rdo::gui::model::Model::actionUpdated, - this , &PluginGame5::enablePluginActions); - } - } + QMenu* pluginMenu = findPluginMenu(pParent); + ASSERT(pluginMenu); + + QAction* pluignAction = pluginMenu->findChild(PLUGIN_ACTION_NAME); + ASSERT(pluignAction); + delete pluignAction; + + if (pluginMenu->isEmpty()) + delete pluginMenu; + + if (m_generateSituationDlg) + delete m_generateSituationDlg; + + if (m_graphDlg) + delete m_graphDlg; + + QToolBar* pluginGame5ToolBar = pParent->findChild(PLUGIN_TOOLBAR_NAME); + if (pluginGame5ToolBar) + delete pluginGame5ToolBar; + + if (g_pApp->getMainWndUI()) + { + rdo::gui::model::Model* pModel = g_pApp->getMainWndUI()->getModel(); + if (pModel) + { + disconnect(pModel, &rdo::gui::model::Model::stopped, + this , &PluginGame5::reemitGraphDlgAction); + disconnect(pModel, &rdo::gui::model::Model::actionUpdated, + this , &PluginGame5::enablePluginActions); + } + } } void PluginGame5::executeCommand(const std::string& commandLine) { - if (!g_pApp || !g_pApp->getMainWndUI() || !g_pApp->getMainWndUI()->getModel()) - return; - - rdo::gui::model::Model* pModel = g_pApp->getMainWndUI()->getModel(); - - if (!pModel->getTab()) - return; - - QStringList positionList = QString::fromStdString(commandLine).split(' ', QString::SkipEmptyParts); - std::vector newState; - for (const auto& position: positionList) - { - newState.push_back(position.toInt()); - } - Board board; - board.setTilesPositon(newState); - - for (int i = 0; i < pModel->getTab()->tabBar()->count(); i++) - { - pModel->getTab()->getItemEdit(i)->clearAll(); - } - pModel->getTab()->getItemEdit(rdo::model::RTP)->appendText(PluginGame5ModelGenerator::modelRTP(board)); - pModel->getTab()->getItemEdit(rdo::model::RSS)->appendText(PluginGame5ModelGenerator::modelRSS(board)); - pModel->getTab()->getItemEdit(rdo::model::PAT)->appendText(PluginGame5ModelGenerator::modelPAT()); - pModel->getTab()->getItemEdit(rdo::model::DPT)->appendText(PluginGame5ModelGenerator::modelDPT(board)); - pModel->getTab()->getItemEdit(rdo::model::FUN)->appendText(PluginGame5ModelGenerator::modelFUN(board)); - - pModel->saveModel(); - g_pApp->quit(); + if (!g_pApp || !g_pApp->getMainWndUI() || !g_pApp->getMainWndUI()->getModel()) + return; + + rdo::gui::model::Model* pModel = g_pApp->getMainWndUI()->getModel(); + + if (!pModel->getTab()) + return; + + QStringList positionList = QString::fromStdString(commandLine).split(' ', QString::SkipEmptyParts); + std::vector newState; + for (const auto& position: positionList) + { + newState.push_back(position.toInt()); + } + Board board; + board.setTilesPositon(newState); + + for (int i = 0; i < pModel->getTab()->tabBar()->count(); i++) + { + pModel->getTab()->getItemEdit(i)->clearAll(); + } + pModel->getTab()->getItemEdit(rdo::FileType::RTP)->appendText(PluginGame5ModelGenerator::modelRTP(board)); + pModel->getTab()->getItemEdit(rdo::FileType::RSS)->appendText(PluginGame5ModelGenerator::modelRSS(board)); + pModel->getTab()->getItemEdit(rdo::FileType::PAT)->appendText(PluginGame5ModelGenerator::modelPAT()); + pModel->getTab()->getItemEdit(rdo::FileType::DPT)->appendText(PluginGame5ModelGenerator::modelDPT(board)); + pModel->getTab()->getItemEdit(rdo::FileType::FUN)->appendText(PluginGame5ModelGenerator::modelFUN(board)); + + pModel->saveModel(); + g_pApp->quit(); } void PluginGame5::pluginActivation() { - QWidget* pParent = qobject_cast(sender()-> //action - parent()-> //QMenu - parent()); //QMainWindow - MainWindow* pMainWindow = (MainWindow*)pParent; - if (pMainWindow->getModel()->getTab()) - { - bool canStart = true; - if (pMainWindow->getModel()->isModify()) - { - const int ret = QMessageBox::question(g_pApp->getMainWnd(), - "RAO-Studio", - "Модель будет перезаписана!\nНесохраненные изменения будут потеряны\nХотите сохранить изменения?", - QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, - QMessageBox::Save - ); - switch (ret) - { - case QMessageBox::Save : pMainWindow->actFileSaveAll->trigger(); break; - case QMessageBox::Discard : break; - default: canStart = false; break; - } - } - else - { - if (!pMainWindow->getModel()->isEmpty()) - { - const int ret = QMessageBox::warning(g_pApp->getMainWnd(), - "RAO-Studio", - "Модель будет перезаписана!", - QMessageBox::Ok | QMessageBox::Cancel, - QMessageBox::Ok); - if (ret == QMessageBox::Cancel) - { - canStart = false; - } - } - } - if (canStart) - { - backUpModel(pMainWindow->getModel()); - initDialogs(pParent); - initToolBar(pMainWindow); - QAction* senderAction = qobject_cast(sender()); - senderAction->setEnabled(false); - } - } - else - { - pMainWindow->actFileNew->trigger(); - } + QWidget* pParent = qobject_cast(sender()-> //action + parent()-> //QMenu + parent()); //QMainWindow + MainWindow* pMainWindow = (MainWindow*)pParent; + if (pMainWindow->getModel()->getTab()) + { + bool canStart = true; + if (pMainWindow->getModel()->isModify()) + { + const int ret = QMessageBox::question(g_pApp->getMainWnd(), + "RAO-Studio", + "Модель будет перезаписана!\nНесохраненные изменения будут потеряны\nХотите сохранить изменения?", + QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel, + QMessageBox::Save + ); + switch (ret) + { + case QMessageBox::Save : pMainWindow->actFileSaveAll->trigger(); break; + case QMessageBox::Discard : break; + default: canStart = false; break; + } + } + else + { + if (!pMainWindow->getModel()->isEmpty()) + { + const int ret = QMessageBox::warning(g_pApp->getMainWnd(), + "RAO-Studio", + "Модель будет перезаписана!", + QMessageBox::Ok | QMessageBox::Cancel, + QMessageBox::Ok); + if (ret == QMessageBox::Cancel) + { + canStart = false; + } + } + } + if (canStart) + { + backUpModel(pMainWindow->getModel()); + initDialogs(pParent); + initToolBar(pMainWindow); + QAction* senderAction = qobject_cast(sender()); + senderAction->setEnabled(false); + } + } + else + { + pMainWindow->actFileNew->trigger(); + } } void PluginGame5::initToolBar(MainWindow* pParent) const { - QToolBar* pluginToolBar = new QToolBar(pParent); - pluginToolBar->setObjectName(PLUGIN_TOOLBAR_NAME); - - QAction* graphDlgAction = new QAction(pParent); - QAction* generateSituationDlgAction = new QAction(pParent); - - generateSituationDlgAction->setText("Расставить фишки"); - QPixmap pluginGenerateDlgActionPixmap(":/res/images/gen_sit_dialog.png"); - generateSituationDlgAction->setIcon(QIcon(pluginGenerateDlgActionPixmap)); - - graphDlgAction->setText("Построить граф"); - QPixmap graphDlgPixmapD(":/res/images/graph_dialog_d.png"); - QPixmap graphDlgPixmap (":/res/images/graph_dialog.png"); - QIcon graphDlgIcon(graphDlgPixmap); - graphDlgIcon.addPixmap(graphDlgPixmapD, QIcon::Disabled); - graphDlgAction->setIcon(graphDlgIcon); - graphDlgAction->setEnabled(false); - - pluginToolBar->addAction(generateSituationDlgAction); - pluginToolBar->addAction(graphDlgAction); - pluginToolBar->setIconSize(QSize(16, 15)); - - pParent->addToolBar(Qt::TopToolBarArea, pluginToolBar); - - rdo::gui::model::Model* pModel = g_pApp->getMainWndUI()->getModel(); - - connect(generateSituationDlgAction, &QAction::triggered, - m_generateSituationDlg , &PluginGame5GenerateSituationDialog::onPluginAction); - connect(pModel, &rdo::gui::model::Model::stopped, - this , &PluginGame5::reemitGraphDlgAction); - connect(graphDlgAction, &QAction::triggered, - this , &PluginGame5::reemitGraphDlgAction); - connect(this , &PluginGame5::onGraphDlgAction, - m_graphDlg, &PluginGame5GraphDialog::onPluginAction); - connect(this , &PluginGame5::setGraphDlgActionEnabled, - graphDlgAction, &QAction::setEnabled); - connect(this, &PluginGame5::setGenerateSituationDlgActionEnabled, - generateSituationDlgAction, &QAction::setEnabled); - connect(pModel, &rdo::gui::model::Model::actionUpdated, - this , &PluginGame5::enablePluginActions); + QToolBar* pluginToolBar = new QToolBar(pParent); + pluginToolBar->setObjectName(PLUGIN_TOOLBAR_NAME); + + QAction* graphDlgAction = new QAction(pParent); + QAction* generateSituationDlgAction = new QAction(pParent); + + generateSituationDlgAction->setText("Расставить фишки"); + QPixmap pluginGenerateDlgActionPixmap(":/res/images/gen_sit_dialog.png"); + generateSituationDlgAction->setIcon(QIcon(pluginGenerateDlgActionPixmap)); + + graphDlgAction->setText("Построить граф"); + QPixmap graphDlgPixmapD(":/res/images/graph_dialog_d.png"); + QPixmap graphDlgPixmap (":/res/images/graph_dialog.png"); + QIcon graphDlgIcon(graphDlgPixmap); + graphDlgIcon.addPixmap(graphDlgPixmapD, QIcon::Disabled); + graphDlgAction->setIcon(graphDlgIcon); + graphDlgAction->setEnabled(false); + + pluginToolBar->addAction(generateSituationDlgAction); + pluginToolBar->addAction(graphDlgAction); + pluginToolBar->setIconSize(QSize(16, 15)); + + pParent->addToolBar(Qt::TopToolBarArea, pluginToolBar); + + rdo::gui::model::Model* pModel = g_pApp->getMainWndUI()->getModel(); + + connect(generateSituationDlgAction, &QAction::triggered, + m_generateSituationDlg , &PluginGame5GenerateSituationDialog::onPluginAction); + connect(pModel, &rdo::gui::model::Model::stopped, + this , &PluginGame5::reemitGraphDlgAction); + connect(graphDlgAction, &QAction::triggered, + this , &PluginGame5::reemitGraphDlgAction); + connect(this , &PluginGame5::onGraphDlgAction, + m_graphDlg, &PluginGame5GraphDialog::onPluginAction); + connect(this , &PluginGame5::setGraphDlgActionEnabled, + graphDlgAction, &QAction::setEnabled); + connect(this, &PluginGame5::setGenerateSituationDlgActionEnabled, + generateSituationDlgAction, &QAction::setEnabled); + connect(pModel, &rdo::gui::model::Model::actionUpdated, + this , &PluginGame5::enablePluginActions); } void PluginGame5::initDialogs(QWidget* pParent) { - m_generateSituationDlg = new PluginGame5GenerateSituationDialog(pParent); - m_graphDlg = new PluginGame5GraphDialog(pParent); + m_generateSituationDlg = new PluginGame5GenerateSituationDialog(pParent); + m_graphDlg = new PluginGame5GraphDialog(pParent); } void PluginGame5::reemitGraphDlgAction() { - emit onGraphDlgAction(m_generateSituationDlg->getBoardState()); + emit onGraphDlgAction(m_generateSituationDlg->getBoardState()); } void PluginGame5::enablePluginActions() { - if (!g_pApp || !g_pApp->getMainWndUI() || !g_pApp->getMainWndUI()->getModel()) - return; + if (!g_pApp || !g_pApp->getMainWndUI() || !g_pApp->getMainWndUI()->getModel()) + return; - rdo::gui::model::Model* pModel = g_pApp->getMainWndUI()->getModel(); + rdo::gui::model::Model* pModel = g_pApp->getMainWndUI()->getModel(); - emit setGraphDlgActionEnabled(pModel->canRun()); - emit setGenerateSituationDlgActionEnabled(pModel->canRun()); + emit setGraphDlgActionEnabled(pModel->canRun()); + emit setGenerateSituationDlgActionEnabled(pModel->canRun()); } diff --git a/app/rdo_studio/plugins/game5/src/plugin_game5.h b/app/rdo_studio/plugins/game5/src/plugin_game5.h index 527118b74..17c879fd3 100644 --- a/app/rdo_studio/plugins/game5/src/plugin_game5.h +++ b/app/rdo_studio/plugins/game5/src/plugin_game5.h @@ -1,5 +1,4 @@ -#ifndef _RDO_PLUGIN_PLUGIN_GAME5_H_ -#define _RDO_PLUGIN_PLUGIN_GAME5_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -13,39 +12,37 @@ // -------------------------------------------------------------------------------- class PluginGame5 - : public QObject - , public PluginInterface + : public QObject + , public PluginInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "RDO_PLUGIN_INTERFACE" FILE "plugin_game5.json") Q_INTERFACES(PluginInterface) public: - virtual QUuid getGUID () const; - virtual QString getPluginName() const; - virtual QString getAuthor () const; - virtual QString getVersion () const; + virtual QUuid getGUID () const; + virtual QString getPluginName() const; + virtual QString getAuthor () const; + virtual QString getVersion () const; - virtual void pluginStartAction(QWidget* parent, const std::string& commandLine); - virtual void pluginStopAction (QWidget* parent); + virtual void pluginStartAction(QWidget* parent, const std::string& commandLine); + virtual void pluginStopAction (QWidget* parent); private: - PluginGame5GenerateSituationDialog* m_generateSituationDlg; - PluginGame5GraphDialog* m_graphDlg; - - void initDialogs(QWidget* pParent); - void initToolBar(MainWindow* pParent) const; + PluginGame5GenerateSituationDialog* m_generateSituationDlg; + PluginGame5GraphDialog* m_graphDlg; + + void initDialogs(QWidget* pParent); + void initToolBar(MainWindow* pParent) const; - void executeCommand(const std::string& commandLine); + void executeCommand(const std::string& commandLine); private slots: - void pluginActivation(); - void reemitGraphDlgAction(); - void enablePluginActions(); + void pluginActivation(); + void reemitGraphDlgAction(); + void enablePluginActions(); signals: - void onGraphDlgAction(const std::vector& state); - void setGraphDlgActionEnabled(bool); - void setGenerateSituationDlgActionEnabled(bool); + void onGraphDlgAction(const std::vector& state); + void setGraphDlgActionEnabled(bool); + void setGenerateSituationDlgActionEnabled(bool); }; - -#endif // _RDO_PLUGIN_PLUGIN_GAME5_H_ diff --git a/app/rdo_studio/plugins/game5/src/plugin_game5_dialog.cpp b/app/rdo_studio/plugins/game5/src/plugin_game5_dialog.cpp index 213793f79..03267981d 100644 --- a/app/rdo_studio/plugins/game5/src/plugin_game5_dialog.cpp +++ b/app/rdo_studio/plugins/game5/src/plugin_game5_dialog.cpp @@ -16,56 +16,45 @@ #include "app/rdo_studio/plugins/game5/src/multi_select_completer.h" // -------------------------------------------------------------------------------- -namespace -{ - enum moveDirection - { - MOVE_UP = 0, - MOVE_DOWN, - MOVE_RIGHT, - MOVE_LEFT - }; -} // end anonymous namespace - PluginGame5GenerateSituationDialog::PluginGame5GenerateSituationDialog(QWidget* pParent) - : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) + : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) { - setupUi(this); + setupUi(this); - MultiSelectCompleter* completer = new MultiSelectCompleter(QStringList(), this); - lineEditCustom->setCompleter(completer); - connect(lineEditCustom, &QLineEdit::selectionChanged, completer, &MultiSelectCompleter::onLineEditTextChanged); + MultiSelectCompleter* completer = new MultiSelectCompleter(QStringList(), this); + lineEditCustom->setCompleter(completer); + connect(lineEditCustom, &QLineEdit::selectionChanged, completer, &MultiSelectCompleter::onLineEditTextChanged); - adjustSize(); - hiddenWidget->setFixedWidth(hiddenWidget->width()); - hiddenWidget->hide(); + adjustSize(); + hiddenWidget->setFixedWidth(hiddenWidget->width()); + hiddenWidget->hide(); - buttonHide->setCheckable(true); - buttonHide->setDefault(false); + buttonHide->setCheckable(true); + buttonHide->setDefault(false); - adjustSize(); - setFixedSize(width(), height()); - setSizeGripEnabled(false); + adjustSize(); + setFixedSize(width(), height()); + setSizeGripEnabled(false); - rdo::gui::model::Model* pModel = getCurrentModel(); - clearAllTabs(); - pModel->getTab()->getItemEdit(rdo::model::FUN)->clearAll(); - pModel->getTab()->getItemEdit(rdo::model::FUN)->appendText(modelFUN()); + rdo::gui::model::Model* pModel = getCurrentModel(); + clearAllTabs(); + pModel->getTab()->getItemEdit(rdo::FileType::FUN)->clearAll(); + pModel->getTab()->getItemEdit(rdo::FileType::FUN)->appendText(modelFUN()); - connect(buttonHide , &QPushButton::toggled, this, &PluginGame5GenerateSituationDialog::onClickHide ); - connect(buttonSetLineup , &QPushButton::clicked, this, &PluginGame5GenerateSituationDialog::callTilesOrderDialog); - connect(buttonRandomLineup, &QPushButton::clicked, this, &PluginGame5GenerateSituationDialog::emitSolvabilityCheck); - connect(buttonOk , &QPushButton::clicked, this, &PluginGame5GenerateSituationDialog::onClickOk ); + connect(buttonHide , &QPushButton::toggled, this, &PluginGame5GenerateSituationDialog::onClickHide ); + connect(buttonSetLineup , &QPushButton::clicked, this, &PluginGame5GenerateSituationDialog::callTilesOrderDialog); + connect(buttonRandomLineup, &QPushButton::clicked, this, &PluginGame5GenerateSituationDialog::emitSolvabilityCheck); + connect(buttonOk , &QPushButton::clicked, this, &PluginGame5GenerateSituationDialog::onClickOk ); - connect(this , &PluginGame5GenerateSituationDialog::buttonRandomClicked, - gameBoard, &Board::buildRandomOrder); - connect(buttonRightLineup, &QPushButton::clicked, - gameBoard , &Board::buildCorrectOrder); + connect(this , &PluginGame5GenerateSituationDialog::buttonRandomClicked, + gameBoard, &Board::buildRandomOrder); + connect(buttonRightLineup, &QPushButton::clicked, + gameBoard , &Board::buildCorrectOrder); - if (pParent) - { - move(pParent->frameGeometry().center() - frameGeometry().center()); - } + if (pParent) + { + move(pParent->frameGeometry().center() - frameGeometry().center()); + } } PluginGame5GenerateSituationDialog::~PluginGame5GenerateSituationDialog() @@ -73,166 +62,172 @@ PluginGame5GenerateSituationDialog::~PluginGame5GenerateSituationDialog() void PluginGame5GenerateSituationDialog::onClickHide(bool state) { - hiddenWidget->setVisible(state); - setFixedWidth(QWIDGETSIZE_MAX); - adjustSize(); - setFixedWidth(width()); + hiddenWidget->setVisible(state); + setFixedWidth(QWIDGETSIZE_MAX); + adjustSize(); + setFixedWidth(width()); } void PluginGame5GenerateSituationDialog::onClickOk() { - rdo::gui::model::Model* pModel = getCurrentModel(); - generateModel(); - pModel->runModel(); - done(Accepted); + rdo::gui::model::Model* pModel = getCurrentModel(); + generateModel(); + pModel->runModel(); + done(Accepted); } void PluginGame5GenerateSituationDialog::emitSolvabilityCheck() { - emit buttonRandomClicked(solvabilityCheck->isChecked()); + emit buttonRandomClicked(solvabilityCheck->isChecked()); } std::string PluginGame5GenerateSituationDialog::evaluateBy() const { - if (radioButton0->isChecked()) - { - return "0"; - } - if (radioButtonQuantity->isChecked()) - { - return "Кол_во_фишек_не_на_месте()"; - } - if (radioButtonDistance->isChecked()) - { - return "Расстояния_фишек_до_мест()"; - } - else //if (radioButtonCustom->isChecked()) - { - return lineEditCustom->text().toStdString(); - } -} - -std::string PluginGame5GenerateSituationDialog::activityValue(int direction) const -{ - QString costValue; - QString calcSwitcher; - switch (direction) - { - case MOVE_DOWN: - costValue = moveDownCost->getLineEdit().text(); - calcSwitcher = moveDownCalcSwitcher->currentText(); - break; - case MOVE_LEFT: - costValue = moveLeftCost->getLineEdit().text(); - calcSwitcher = moveLeftCalcSwitcher->currentText(); - break; - case MOVE_RIGHT: - costValue = moveRightCost->getLineEdit().text(); - calcSwitcher = moveRightCalcSwitcher->currentText(); - break; - case MOVE_UP: - costValue = moveUpCost->getLineEdit().text(); - calcSwitcher = moveUpCalcSwitcher->currentText(); - break; - default: - break; - } - const QString string = calcSwitcher + " " + costValue ; - return string.toStdString(); + if (radioButton0->isChecked()) + { + return "0"; + } + if (radioButtonQuantity->isChecked()) + { + return "Кол_во_фишек_не_на_месте()"; + } + if (radioButtonDistance->isChecked()) + { + return "Расстояния_фишек_до_мест()"; + } + else //if (radioButtonCustom->isChecked()) + { + return lineEditCustom->text().toStdString(); + } +} + +std::string PluginGame5GenerateSituationDialog::activityValue(MoveDirection direction) const +{ + QString costValue; + QString calcSwitcher; + switch (direction) + { + case MoveDirection::DOWN: + costValue = moveDownCost->getLineEdit().text(); + calcSwitcher = moveDownCalcSwitcher->currentText(); + break; + case MoveDirection::LEFT: + costValue = moveLeftCost->getLineEdit().text(); + calcSwitcher = moveLeftCalcSwitcher->currentText(); + break; + case MoveDirection::RIGHT: + costValue = moveRightCost->getLineEdit().text(); + calcSwitcher = moveRightCalcSwitcher->currentText(); + break; + case MoveDirection::UP: + costValue = moveUpCost->getLineEdit().text(); + calcSwitcher = moveUpCalcSwitcher->currentText(); + break; + default: + break; + } + const QString string = calcSwitcher + " " + costValue; + return string.toStdString(); } QString PluginGame5GenerateSituationDialog::modelRTP() const { - return PluginGame5ModelGenerator::modelRTP(*gameBoard); + return PluginGame5ModelGenerator::modelRTP(*gameBoard); } QString PluginGame5GenerateSituationDialog::modelRSS() const { - return PluginGame5ModelGenerator::modelRSS(*gameBoard); + return PluginGame5ModelGenerator::modelRSS(*gameBoard); } QString PluginGame5GenerateSituationDialog::modelPAT() const { - return PluginGame5ModelGenerator::modelPAT(); + return PluginGame5ModelGenerator::modelPAT(); } QString PluginGame5GenerateSituationDialog::modelDPT() const { - return PluginGame5ModelGenerator::modelDPT(*gameBoard, evaluateBy(), checkBoxCopareTop->isChecked(), activityValue(MOVE_LEFT), - activityValue(MOVE_RIGHT), activityValue(MOVE_DOWN), activityValue(MOVE_UP)); + return PluginGame5ModelGenerator::modelDPT( + *gameBoard, + evaluateBy(), + checkBoxCopareTop->isChecked(), + activityValue(MoveDirection::LEFT), + activityValue(MoveDirection::RIGHT), + activityValue(MoveDirection::DOWN), + activityValue(MoveDirection::UP)); } QString PluginGame5GenerateSituationDialog::modelFUN() const { - return PluginGame5ModelGenerator::modelFUN(*gameBoard); + return PluginGame5ModelGenerator::modelFUN(*gameBoard); } void PluginGame5GenerateSituationDialog::clearAllTabs() const { - rdo::gui::model::Model* pModel = getCurrentModel(); - for (int i = 0; i < pModel->getTab()->tabBar()->count(); i++) - { - if (i != rdo::model::FUN) - { - pModel->getTab()->getItemEdit(i)->clearAll(); - } - } + rdo::gui::model::Model* pModel = getCurrentModel(); + for (int i = 0; i < pModel->getTab()->tabBar()->count(); i++) + { + if (i != (int)rdo::FileType::FUN) + { + pModel->getTab()->getItemEdit(i)->clearAll(); + } + } } void PluginGame5GenerateSituationDialog::callTilesOrderDialog() { - TilesOrderDialog dlg(this, gameBoard->getBoardState()); - connect(&dlg, &TilesOrderDialog::tilesOrderCommited, gameBoard, &Board::setTilesPositon); - dlg.exec(); + TilesOrderDialog dlg(this, gameBoard->getBoardState()); + connect(&dlg, &TilesOrderDialog::tilesOrderCommited, gameBoard, &Board::setTilesPositon); + dlg.exec(); } void PluginGame5GenerateSituationDialog::generateModel() const { - rdo::gui::model::Model* pModel = getCurrentModel(); - if (pModel->getTab()) - { - clearAllTabs(); + rdo::gui::model::Model* pModel = getCurrentModel(); + if (pModel->getTab()) + { + clearAllTabs(); - pModel->getTab()->getItemEdit(rdo::model::RTP)->appendText(modelRTP()); - pModel->getTab()->getItemEdit(rdo::model::RSS)->appendText(modelRSS()); - pModel->getTab()->getItemEdit(rdo::model::PAT)->appendText(modelPAT()); - pModel->getTab()->getItemEdit(rdo::model::DPT)->appendText(modelDPT()); - } + pModel->getTab()->getItemEdit(rdo::FileType::RTP)->appendText(modelRTP()); + pModel->getTab()->getItemEdit(rdo::FileType::RSS)->appendText(modelRSS()); + pModel->getTab()->getItemEdit(rdo::FileType::PAT)->appendText(modelPAT()); + pModel->getTab()->getItemEdit(rdo::FileType::DPT)->appendText(modelDPT()); + } } void PluginGame5GenerateSituationDialog::onPluginAction() { - QStringList funList = parseModelFUN(); - QStringListModel* stringModel = (QStringListModel*)lineEditCustom->completer()->model(); - stringModel->setStringList(funList); - exec(); + QStringList funList = parseModelFUN(); + QStringListModel* stringModel = (QStringListModel*)lineEditCustom->completer()->model(); + stringModel->setStringList(funList); + exec(); } QStringList PluginGame5GenerateSituationDialog::parseModelFUN() const { - rdo::gui::model::Model* pModel = getCurrentModel(); - std::stringstream txtStream; - pModel->getTab()->getItemEdit(rdo::model::FUN)->save(txtStream); - QString tabStr = QString::fromStdString(txtStream.str()); - QRegExp regExp("(\\$Function)(\\s*)([A-Za-z0-9_А-Яа-я\\$]*)(\\s*):"); + rdo::gui::model::Model* pModel = getCurrentModel(); + std::stringstream txtStream; + pModel->getTab()->getItemEdit(rdo::FileType::FUN)->save(txtStream); + QString tabStr = QString::fromStdString(txtStream.str()); + QRegExp regExp("(\\$Function)(\\s*)([A-Za-z0-9_А-Яа-я\\$]*)(\\s*):"); - QStringList list; - int pos = 0; - while ((pos = regExp.indexIn(tabStr, pos))!= -1) - { - list << regExp.cap(3); - pos += regExp.matchedLength(); - } - return list; + QStringList list; + int pos = 0; + while ((pos = regExp.indexIn(tabStr, pos))!= -1) + { + list << regExp.cap(3); + pos += regExp.matchedLength(); + } + return list; } rdo::gui::model::Model* PluginGame5GenerateSituationDialog::getCurrentModel() const { - MainWindow* pMainWindow = (MainWindow*)(parent()); - return pMainWindow->getModel(); + MainWindow* pMainWindow = (MainWindow*)(parent()); + return pMainWindow->getModel(); } std::vector PluginGame5GenerateSituationDialog::getBoardState() const { - return gameBoard->getBoardState(); + return gameBoard->getBoardState(); } diff --git a/app/rdo_studio/plugins/game5/src/plugin_game5_dialog.h b/app/rdo_studio/plugins/game5/src/plugin_game5_dialog.h index d140ce6c0..e2885b6f2 100644 --- a/app/rdo_studio/plugins/game5/src/plugin_game5_dialog.h +++ b/app/rdo_studio/plugins/game5/src/plugin_game5_dialog.h @@ -1,5 +1,4 @@ -#ifndef _RDO_PLUGIN_GAME_5_DIALOG_H_ -#define _RDO_PLUGIN_GAME_5_DIALOG_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -11,43 +10,49 @@ // -------------------------------------------------------------------------------- class PluginGame5GenerateSituationDialog - : public QDialog - , public Ui_PluginGame5GenerateSituationDialog + : public QDialog + , public Ui_PluginGame5GenerateSituationDialog {Q_OBJECT public: - PluginGame5GenerateSituationDialog(QWidget* parent); - ~PluginGame5GenerateSituationDialog(); + PluginGame5GenerateSituationDialog(QWidget* parent); + ~PluginGame5GenerateSituationDialog(); - std::vector getBoardState() const; + std::vector getBoardState() const; signals: - void buttonRandomClicked(bool solvabilityCheck); + void buttonRandomClicked(bool solvabilityCheck); public slots: - void onPluginAction(); + void onPluginAction(); private: - std::string evaluateBy() const; - std::string activityValue(int direction) const; + std::string evaluateBy() const; - QString modelRTP() const; - QString modelRSS() const; - QString modelPAT() const; - QString modelDPT() const; - QString modelFUN() const; + enum class MoveDirection + { + UP, + DOWN, + RIGHT, + LEFT + }; + std::string activityValue(MoveDirection direction) const; - void clearAllTabs() const; - rdo::gui::model::Model* getCurrentModel() const; - void generateModel() const; + QString modelRTP() const; + QString modelRSS() const; + QString modelPAT() const; + QString modelDPT() const; + QString modelFUN() const; - QStringList parseModelFUN() const; + void clearAllTabs() const; + rdo::gui::model::Model* getCurrentModel() const; + void generateModel() const; + + QStringList parseModelFUN() const; private slots: - void callTilesOrderDialog(); - void onClickOk(); - void onClickHide(bool state); - void emitSolvabilityCheck(); + void callTilesOrderDialog(); + void onClickOk(); + void onClickHide(bool state); + void emitSolvabilityCheck(); }; - -#endif // _RDO_PLUGIN_GAME_5_DIALOG_H_ diff --git a/app/rdo_studio/plugins/game5/src/plugin_game5_graph_dialog.cpp b/app/rdo_studio/plugins/game5/src/plugin_game5_graph_dialog.cpp index f63dfb8a4..6e2834257 100644 --- a/app/rdo_studio/plugins/game5/src/plugin_game5_graph_dialog.cpp +++ b/app/rdo_studio/plugins/game5/src/plugin_game5_graph_dialog.cpp @@ -16,45 +16,45 @@ namespace { - const int SPACER_X = 20; - const int SPACER_Y = 20; + const int SPACER_X = 20; + const int SPACER_Y = 20; - const int DPS_CO_INDEX = 4; - const int DPS_TO_INDEX = 5; - const int DPS_TT_INDEX = 6; + const int DPS_CO_INDEX = 4; + const int DPS_TO_INDEX = 5; + const int DPS_TT_INDEX = 6; - bool sortingFunction(GraphNode* first, GraphNode* second) - { - const int firstParentOLO = first ->getParentGraphNode()->getGraphOnLevelOrder(); - const int secondParentOLO = second->getParentGraphNode()->getGraphOnLevelOrder(); + bool sortingFunction(GraphNode* first, GraphNode* second) + { + const int firstParentOLO = first ->getParentGraphNode()->getGraphOnLevelOrder(); + const int secondParentOLO = second->getParentGraphNode()->getGraphOnLevelOrder(); - return firstParentOLO < secondParentOLO; - } + return firstParentOLO < secondParentOLO; + } } // end anonymous namespace PluginGame5GraphDialog::PluginGame5GraphDialog(QWidget * pParent) - : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowMaximizeButtonHint| Qt::WindowCloseButtonHint) - , m_traceTimeStamp(getTraceTimeStamp()) - , m_clickedNode(NULL) - , m_nodeWidth(0) - , m_nodeHeight(0) + : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowMaximizeButtonHint| Qt::WindowCloseButtonHint) + , m_traceTimeStamp(getTraceTimeStamp()) + , m_clickedNode(NULL) + , m_nodeWidth(0) + , m_nodeHeight(0) { - setupUi(this); - - if (pParent) - { - move(pParent->frameGeometry().center() - frameGeometry().center()); - } - - PluginGame5GraphNodeInfoDialog* nodeInfoDlg = new PluginGame5GraphNodeInfoDialog(this); - - connect(this , &PluginGame5GraphDialog::updateNodeInfoDlg, - nodeInfoDlg, &PluginGame5GraphNodeInfoDialog::updateDlg); - connect(this , &PluginGame5GraphDialog::showNodeInfoDlg, - nodeInfoDlg, &PluginGame5GraphNodeInfoDialog::show); - - connect(nodeInfoDlg, &PluginGame5GraphNodeInfoDialog::updateCheckedNode, - this , &PluginGame5GraphDialog::updateCheckedNode); + setupUi(this); + + if (pParent) + { + move(pParent->frameGeometry().center() - frameGeometry().center()); + } + + PluginGame5GraphNodeInfoDialog* nodeInfoDlg = new PluginGame5GraphNodeInfoDialog(this); + + connect(this , &PluginGame5GraphDialog::updateNodeInfoDlg, + nodeInfoDlg, &PluginGame5GraphNodeInfoDialog::updateDlg); + connect(this , &PluginGame5GraphDialog::showNodeInfoDlg, + nodeInfoDlg, &PluginGame5GraphNodeInfoDialog::show); + + connect(nodeInfoDlg, &PluginGame5GraphNodeInfoDialog::updateCheckedNode, + this , &PluginGame5GraphDialog::updateCheckedNode); } PluginGame5GraphDialog::~PluginGame5GraphDialog() @@ -62,370 +62,370 @@ PluginGame5GraphDialog::~PluginGame5GraphDialog() QString PluginGame5GraphDialog::getTraceFile() const { - MainWindow* pMainWindow = (MainWindow*)(parent()); - rdo::gui::model::Model* pModel = pMainWindow->getModel(); - boost::filesystem::path traceFilePath(pModel->getFullName().toStdString()); - traceFilePath.replace_extension(".trc"); + MainWindow* pMainWindow = (MainWindow*)(parent()); + rdo::gui::model::Model* pModel = pMainWindow->getModel(); + boost::filesystem::path traceFilePath(pModel->getFullName().toStdString()); + traceFilePath.replace_extension(".trc"); - return QString(traceFilePath.string().c_str()); + return QString(traceFilePath.string().c_str()); } QString PluginGame5GraphDialog::getTraceTimeStamp() const { - QFile trcFile(getTraceFile()); - QString trcString; - if (trcFile.open(QIODevice::ReadOnly)) - { - trcString = QString(trcFile.readLine()); - } - const QString timeStamp = trcString.section(' ', -2, -1); - return timeStamp; + QFile trcFile(getTraceFile()); + QString trcString; + if (trcFile.open(QIODevice::ReadOnly)) + { + trcString = QString(trcFile.readLine()); + } + const QString timeStamp = trcString.section(' ', -2, -1); + return timeStamp; } std::list PluginGame5GraphDialog::getSolutionNodes() const { - QFile trcFile(getTraceFile()); - QString trcString; - if (trcFile.open(QIODevice::ReadOnly)) - { - trcString = QString(trcFile.readAll()); - } - - QString solutionStr; - const int begin = trcString.indexOf("SD"); - int end; - if (begin > 0) - { - end = trcString.indexOf("SES", begin); - solutionStr = trcString.mid(begin, end - begin); - } - - const QRegExp regExp("(\\d{1,5})((\\s\\d){3}\\s\\s\\d{1,2}\\s\\d{1,2})"); - std::list list; - - int pos = 0; - while ((pos = regExp.indexIn(solutionStr, pos))!= -1) - { - list.push_back(regExp.cap(1).toInt()); - pos += regExp.matchedLength(); - } - - if (!list.empty()) - { - list.push_front(1); - } - - trcFile.close(); - return list; + QFile trcFile(getTraceFile()); + QString trcString; + if (trcFile.open(QIODevice::ReadOnly)) + { + trcString = QString(trcFile.readAll()); + } + + QString solutionStr; + const int begin = trcString.indexOf("SD"); + int end; + if (begin > 0) + { + end = trcString.indexOf("SES", begin); + solutionStr = trcString.mid(begin, end - begin); + } + + const QRegExp regExp("(\\d{1,5})((\\s\\d){3}\\s\\s\\d{1,2}\\s\\d{1,2})"); + std::list list; + + int pos = 0; + while ((pos = regExp.indexIn(solutionStr, pos))!= -1) + { + list.push_back(regExp.cap(1).toInt()); + pos += regExp.matchedLength(); + } + + if (!list.empty()) + { + list.push_front(1); + } + + trcFile.close(); + return list; } std::vector PluginGame5GraphDialog::parseTrace(const std::vector& startBoardState) { - QFile trcFile(getTraceFile()); - QString trcString; - if (trcFile.open(QIODevice::ReadOnly)) - { - trcString = QString(trcFile.readAll()); - } - trcFile.close(); - - const int begin = trcString.indexOf("SB"); - const int end = trcString.indexOf(QRegExp("SEN|SES"), begin); - const QString trcStringShort = trcString.mid(begin, end - begin); - - const QRegExp regExp("(STN|STR)(((\\s)-?\\d+){8}((\\s)(\\s)(\\d+)(\\s)(\\d+)))(((\\nSRK)((\\s)\\d+){4})(\\s\\d+)((\\nSRK)((\\s)\\d+){3})(\\s\\d+))"); - QStringList list; - int pos = 0; - while ((pos = regExp.indexIn(trcStringShort, pos))!= -1) - { - list << regExp.cap(2) + regExp.cap(16) + regExp.cap(21); - pos += regExp.matchedLength(); - } - - const QFont sceneFont = graphWidget->scene()->font(); - std::vector parsingResult; - if (!list.empty()) - { - parsingResult.resize(list.size() + 1); - parsingResult[0] = GraphNodeInfo(1, 0, 0, 0, "Начало поиска", 0, 0, 0, 0, 0, startBoardState); - - QRect nodeRect = GraphNode::calcNodeRect(parsingResult[0], sceneFont); - m_nodeWidth = nodeRect.width(); - m_nodeHeight = nodeRect.height(); - } - for (const QString& string: list) - { - const int graphNodeId = string.section(" ", 1, 1).toInt(); - const int parentGraphNodeId = string.section(" ", 2, 2).toInt(); - const int pathCost = string.section(" ", 3, 3).toInt(); - const int restPathCost = string.section(" ", 4, 4).toInt() - pathCost; - const int moveDirection = string.section(" ", 5, 5).toInt(); - const int moveCost = string.section(" ", 7, 7).toInt(); - - const int tileMoveFrom = string.section(" ", -1, -1).toInt(); - const int tileMoveTo = string.section(" ", -2, -2).toInt(); - const int relevantTile = string.section(" ", -4, -4).toInt(); - - QString moveDirectionText; - switch (moveDirection) - { - case 1: moveDirectionText = "Вправо"; break; - case 2: moveDirectionText = "Влево" ; break; - case 3: moveDirectionText = "Вверх" ; break; - case 4: moveDirectionText = "Вниз" ; break; - } - - const int graphNodeIndex = graphNodeId - 1; - const int parentGraphNodeIndex = parentGraphNodeId - 1; - - const int graphLevel = parsingResult[parentGraphNodeIndex].m_graphLevel + 1; - std::vector boardState = parsingResult[parentGraphNodeIndex].m_boardState; - std::swap(boardState[tileMoveFrom - 1], boardState[tileMoveTo - 1]); - - parsingResult[graphNodeIndex] = GraphNodeInfo(graphNodeId, parentGraphNodeId, pathCost, restPathCost, - moveDirectionText, moveCost, relevantTile, graphLevel, - tileMoveFrom, tileMoveTo, boardState); - - QRect nodeRect = GraphNode::calcNodeRect(parsingResult[graphNodeIndex], sceneFont); - m_nodeWidth = std::max(nodeRect.width(), m_nodeWidth); - m_nodeHeight = std::max(nodeRect.height(), m_nodeHeight); - } - - for (int nodeId: getSolutionNodes()) - { - parsingResult[nodeId - 1].m_relatedToSolutionState = true; - } - - return parsingResult; + QFile trcFile(getTraceFile()); + QString trcString; + if (trcFile.open(QIODevice::ReadOnly)) + { + trcString = QString(trcFile.readAll()); + } + trcFile.close(); + + const int begin = trcString.indexOf("SB"); + const int end = trcString.indexOf(QRegExp("SEN|SES"), begin); + const QString trcStringShort = trcString.mid(begin, end - begin); + + const QRegExp regExp("(STN|STR)(((\\s)-?\\d+){8}((\\s)(\\s)(\\d+)(\\s)(\\d+)))(((\\nSRK)((\\s)\\d+){4})(\\s\\d+)((\\nSRK)((\\s)\\d+){3})(\\s\\d+))"); + QStringList list; + int pos = 0; + while ((pos = regExp.indexIn(trcStringShort, pos))!= -1) + { + list << regExp.cap(2) + regExp.cap(16) + regExp.cap(21); + pos += regExp.matchedLength(); + } + + const QFont sceneFont = graphWidget->scene()->font(); + std::vector parsingResult; + if (!list.empty()) + { + parsingResult.resize(list.size() + 1); + parsingResult[0] = GraphNodeInfo(1, 0, 0, 0, "Начало поиска", 0, 0, 0, 0, 0, startBoardState); + + QRect nodeRect = GraphNode::calcNodeRect(parsingResult[0], sceneFont); + m_nodeWidth = nodeRect.width(); + m_nodeHeight = nodeRect.height(); + } + for (const QString& string: list) + { + const int graphNodeId = string.section(" ", 1, 1).toInt(); + const int parentGraphNodeId = string.section(" ", 2, 2).toInt(); + const int pathCost = string.section(" ", 3, 3).toInt(); + const int restPathCost = string.section(" ", 4, 4).toInt() - pathCost; + const int moveDirection = string.section(" ", 5, 5).toInt(); + const int moveCost = string.section(" ", 7, 7).toInt(); + + const int tileMoveFrom = string.section(" ", -1, -1).toInt(); + const int tileMoveTo = string.section(" ", -2, -2).toInt(); + const int relevantTile = string.section(" ", -4, -4).toInt(); + + QString moveDirectionText; + switch (moveDirection) + { + case 1: moveDirectionText = "Вправо"; break; + case 2: moveDirectionText = "Влево" ; break; + case 3: moveDirectionText = "Вверх" ; break; + case 4: moveDirectionText = "Вниз" ; break; + } + + const int graphNodeIndex = graphNodeId - 1; + const int parentGraphNodeIndex = parentGraphNodeId - 1; + + const int graphLevel = parsingResult[parentGraphNodeIndex].m_graphLevel + 1; + std::vector boardState = parsingResult[parentGraphNodeIndex].m_boardState; + std::swap(boardState[tileMoveFrom - 1], boardState[tileMoveTo - 1]); + + parsingResult[graphNodeIndex] = GraphNodeInfo(graphNodeId, parentGraphNodeId, pathCost, restPathCost, + moveDirectionText, moveCost, relevantTile, graphLevel, + tileMoveFrom, tileMoveTo, boardState); + + QRect nodeRect = GraphNode::calcNodeRect(parsingResult[graphNodeIndex], sceneFont); + m_nodeWidth = std::max(nodeRect.width(), m_nodeWidth); + m_nodeHeight = std::max(nodeRect.height(), m_nodeHeight); + } + + for (int nodeId: getSolutionNodes()) + { + parsingResult[nodeId - 1].m_relatedToSolutionState = true; + } + + return parsingResult; } std::vector > PluginGame5GraphDialog::generateGraphNodes(std::vector& parsingResult) const { - std::vector tempStorage; - tempStorage.resize(parsingResult.size()); - auto it = tempStorage.begin(); - while (it != tempStorage.end()) - { - *it = NULL; - ++it; - } - - std::vector> graphTree; - for (const GraphNodeInfo& info: parsingResult) - { - const int nodeGraphLevel = info.m_graphLevel; - const int currentLevel = graphTree.size() - 1; - if (currentLevel < nodeGraphLevel) - { - graphTree.push_back(std::vector()); - } - - GraphNode* parentNode = NULL; - if (info.m_parentNodeId) - { - ASSERT(tempStorage[info.m_parentNodeId - 1]); - parentNode = tempStorage[info.m_parentNodeId - 1]; - } - - GraphNode* node = new GraphNode(info, parentNode, m_nodeWidth, m_nodeHeight); - connect(node, &GraphNode::clickedNode , this, &PluginGame5GraphDialog::updateCheckedNode); - connect(node, &GraphNode::doubleClicked, this, &PluginGame5GraphDialog::emitShowNodeInfoDlg); - graphTree[nodeGraphLevel].push_back(node); - tempStorage[info.m_nodeID - 1] = node; - } - - for (unsigned int i = 1; i < graphTree.size(); i++) - { - std::sort(graphTree[i].begin(), graphTree[i].end(), sortingFunction); - for (unsigned int j = 0; j < graphTree[i].size(); j++) - { - graphTree[i][j]->setGraphOnLevelOrder(j); - } - } - - return graphTree; + std::vector tempStorage; + tempStorage.resize(parsingResult.size()); + auto it = tempStorage.begin(); + while (it != tempStorage.end()) + { + *it = NULL; + ++it; + } + + std::vector> graphTree; + for (const GraphNodeInfo& info: parsingResult) + { + const int nodeGraphLevel = info.m_graphLevel; + const int currentLevel = graphTree.size() - 1; + if (currentLevel < nodeGraphLevel) + { + graphTree.push_back(std::vector()); + } + + GraphNode* parentNode = NULL; + if (info.m_parentNodeId) + { + ASSERT(tempStorage[info.m_parentNodeId - 1]); + parentNode = tempStorage[info.m_parentNodeId - 1]; + } + + GraphNode* node = new GraphNode(info, parentNode, m_nodeWidth, m_nodeHeight); + connect(node, &GraphNode::clickedNode , this, &PluginGame5GraphDialog::updateCheckedNode); + connect(node, &GraphNode::doubleClicked, this, &PluginGame5GraphDialog::emitShowNodeInfoDlg); + graphTree[nodeGraphLevel].push_back(node); + tempStorage[info.m_nodeID - 1] = node; + } + + for (unsigned int i = 1; i < graphTree.size(); i++) + { + std::sort(graphTree[i].begin(), graphTree[i].end(), sortingFunction); + for (unsigned int j = 0; j < graphTree[i].size(); j++) + { + graphTree[i][j]->setGraphOnLevelOrder(j); + } + } + + return graphTree; } void PluginGame5GraphDialog::drawGraph(const std::vector>& graph) const { - for (unsigned int j = 0; j < graph.back().size(); j++) - { - GraphNode* node = graph.back()[j]; - graphWidget->scene()->addItem(node); - node->setPos((SPACER_X + m_nodeWidth) * (j + 1), (graph.size() - 1) * (SPACER_Y + m_nodeHeight)); - } - - for (int i = (int)graph.size() - 2; i >= 0; i--) - { - bool buildFlag = true; - unsigned int tempNodeNum = 0; - unsigned int tempCounter = 0; - std::vector unbuiltRangeVector; - for (unsigned int j = 0; j < graph[i].size(); j++) - { - GraphNode* node = graph[i][j]; - if (node->haveChild()) - { - graphWidget->scene()->addItem(node); - node->setPos(node->childrenMeanX(), node->childrenMeanY() - (SPACER_Y + m_nodeHeight)); - for (GraphNode* childNode: node->getChildrenList()) - { - graphWidget->scene()->addItem(new GraphEdge(*node, *childNode)); - } - - if (!buildFlag) - { - buildFlag = true; - UnbuiltRange temp = {tempNodeNum, tempCounter}; - unbuiltRangeVector.push_back(temp); - tempCounter = 0; - } - } - else - { - if (buildFlag) - { - buildFlag = false; - tempNodeNum = j; - } - tempCounter++; - } - } - if (!buildFlag) - { - buildFlag = true; - UnbuiltRange temp = {tempNodeNum, tempCounter}; - unbuiltRangeVector.push_back(temp); - tempCounter = 0; - } - for (const UnbuiltRange& unbuiltRange: unbuiltRangeVector) - { - const unsigned int endUnbuiltRange = unbuiltRange.firstNode + unbuiltRange.range; - if (unbuiltRange.firstNode == 0) - { - GraphNode* leftNode = graph[i][endUnbuiltRange]; - for (unsigned int k = unbuiltRange.firstNode; k < endUnbuiltRange; k++) - { - GraphNode* node = graph[i][k]; - const int segment = unbuiltRange.range - k + unbuiltRange.firstNode; - - graphWidget->scene()->addItem(node); - node->setPos(leftNode->pos().x() - (SPACER_X + m_nodeWidth) * segment, leftNode->pos().y()); - } - } - else if (endUnbuiltRange == graph[i].size()) - { - GraphNode* rightNode = graph[i][unbuiltRange.firstNode - 1]; - for (unsigned int k = unbuiltRange.firstNode; k < endUnbuiltRange; k++) - { - GraphNode* node = graph[i][k]; - const int segment = k - unbuiltRange.firstNode + 1; - - graphWidget->scene()->addItem(node); - node->setPos(rightNode->pos().x() + (SPACER_X + m_nodeWidth) * segment, rightNode->pos().y()); - } - } - else - { - GraphNode* leftNode = graph[i][unbuiltRange.firstNode - 1]; - GraphNode* rightNode = graph[i][endUnbuiltRange]; - double deltaX = rightNode->pos().x() - leftNode->pos().x(); - - if (deltaX < (unbuiltRange.range + 1) * (SPACER_X + m_nodeWidth)) - { - for (unsigned int l = endUnbuiltRange; l < graph[i].size(); l++) - { - GraphNode* node = graph[i][l]; - node->forceShift((unbuiltRange.range + 1) * (SPACER_X + m_nodeWidth) - deltaX); - } - deltaX = rightNode->pos().x() - leftNode->pos().x(); - } - - for (unsigned int k = unbuiltRange.firstNode; k < endUnbuiltRange; k++) - { - GraphNode* node = graph[i][k]; - const int segment = k - unbuiltRange.firstNode + 1; - - graphWidget->scene()->addItem(node); - node->setPos(leftNode->pos().x() + segment * deltaX/(unbuiltRange.range + 1), leftNode->pos().y()); - } - } - } - } + for (unsigned int j = 0; j < graph.back().size(); j++) + { + GraphNode* node = graph.back()[j]; + graphWidget->scene()->addItem(node); + node->setPos((SPACER_X + m_nodeWidth) * (j + 1), (graph.size() - 1) * (SPACER_Y + m_nodeHeight)); + } + + for (int i = (int)graph.size() - 2; i >= 0; i--) + { + bool buildFlag = true; + unsigned int tempNodeNum = 0; + unsigned int tempCounter = 0; + std::vector unbuiltRangeVector; + for (unsigned int j = 0; j < graph[i].size(); j++) + { + GraphNode* node = graph[i][j]; + if (node->haveChild()) + { + graphWidget->scene()->addItem(node); + node->setPos(node->childrenMeanX(), node->childrenMeanY() - (SPACER_Y + m_nodeHeight)); + for (GraphNode* childNode: node->getChildrenList()) + { + graphWidget->scene()->addItem(new GraphEdge(*node, *childNode)); + } + + if (!buildFlag) + { + buildFlag = true; + UnbuiltRange temp = {tempNodeNum, tempCounter}; + unbuiltRangeVector.push_back(temp); + tempCounter = 0; + } + } + else + { + if (buildFlag) + { + buildFlag = false; + tempNodeNum = j; + } + tempCounter++; + } + } + if (!buildFlag) + { + buildFlag = true; + UnbuiltRange temp = {tempNodeNum, tempCounter}; + unbuiltRangeVector.push_back(temp); + tempCounter = 0; + } + for (const UnbuiltRange& unbuiltRange: unbuiltRangeVector) + { + const unsigned int endUnbuiltRange = unbuiltRange.firstNode + unbuiltRange.range; + if (unbuiltRange.firstNode == 0) + { + GraphNode* leftNode = graph[i][endUnbuiltRange]; + for (unsigned int k = unbuiltRange.firstNode; k < endUnbuiltRange; k++) + { + GraphNode* node = graph[i][k]; + const int segment = unbuiltRange.range - k + unbuiltRange.firstNode; + + graphWidget->scene()->addItem(node); + node->setPos(leftNode->pos().x() - (SPACER_X + m_nodeWidth) * segment, leftNode->pos().y()); + } + } + else if (endUnbuiltRange == graph[i].size()) + { + GraphNode* rightNode = graph[i][unbuiltRange.firstNode - 1]; + for (unsigned int k = unbuiltRange.firstNode; k < endUnbuiltRange; k++) + { + GraphNode* node = graph[i][k]; + const int segment = k - unbuiltRange.firstNode + 1; + + graphWidget->scene()->addItem(node); + node->setPos(rightNode->pos().x() + (SPACER_X + m_nodeWidth) * segment, rightNode->pos().y()); + } + } + else + { + GraphNode* leftNode = graph[i][unbuiltRange.firstNode - 1]; + GraphNode* rightNode = graph[i][endUnbuiltRange]; + double deltaX = rightNode->pos().x() - leftNode->pos().x(); + + if (deltaX < (unbuiltRange.range + 1) * (SPACER_X + m_nodeWidth)) + { + for (unsigned int l = endUnbuiltRange; l < graph[i].size(); l++) + { + GraphNode* node = graph[i][l]; + node->forceShift((unbuiltRange.range + 1) * (SPACER_X + m_nodeWidth) - deltaX); + } + deltaX = rightNode->pos().x() - leftNode->pos().x(); + } + + for (unsigned int k = unbuiltRange.firstNode; k < endUnbuiltRange; k++) + { + GraphNode* node = graph[i][k]; + const int segment = k - unbuiltRange.firstNode + 1; + + graphWidget->scene()->addItem(node); + node->setPos(leftNode->pos().x() + segment * deltaX/(unbuiltRange.range + 1), leftNode->pos().y()); + } + } + } + } } PluginGame5GraphDialog::GraphInfo PluginGame5GraphDialog::getGraphInfo() const { - QFile trcFile(getTraceFile()); - QString trcString; - if (trcFile.open(QIODevice::ReadOnly)) - { - trcString = QString(trcFile.readAll()); - } - trcFile.close(); - - const int begin = trcString.indexOf(QRegExp("SES|SEN")); - if (begin >= 0) - { - const QString trcStringShort = trcString.mid(begin); - - QString solutionCost = trcStringShort.section(' ', DPS_CO_INDEX, DPS_CO_INDEX, QString::SectionSkipEmpty); - QString numberOfOpenNodes = trcStringShort.section(' ', DPS_TO_INDEX, DPS_TO_INDEX, QString::SectionSkipEmpty); - QString totalNumberOfNodes = trcStringShort.section(' ', DPS_TT_INDEX, DPS_TT_INDEX, QString::SectionSkipEmpty); - return GraphInfo(solutionCost, numberOfOpenNodes, totalNumberOfNodes); - } - return GraphInfo(); + QFile trcFile(getTraceFile()); + QString trcString; + if (trcFile.open(QIODevice::ReadOnly)) + { + trcString = QString(trcFile.readAll()); + } + trcFile.close(); + + const int begin = trcString.indexOf(QRegExp("SES|SEN")); + if (begin >= 0) + { + const QString trcStringShort = trcString.mid(begin); + + QString solutionCost = trcStringShort.section(' ', DPS_CO_INDEX, DPS_CO_INDEX, QString::SectionSkipEmpty); + QString numberOfOpenNodes = trcStringShort.section(' ', DPS_TO_INDEX, DPS_TO_INDEX, QString::SectionSkipEmpty); + QString totalNumberOfNodes = trcStringShort.section(' ', DPS_TT_INDEX, DPS_TT_INDEX, QString::SectionSkipEmpty); + return GraphInfo(solutionCost, numberOfOpenNodes, totalNumberOfNodes); + } + return GraphInfo(); } void PluginGame5GraphDialog::updateGraph(const std::vector& startBoardState) { - graphWidget->scene()->clear(); - m_clickedNode = NULL; - - std::vector parsingResult = parseTrace(startBoardState); - std::vector> graph = generateGraphNodes(parsingResult); - if (!graph.empty()) - { - drawGraph(graph); - } - - PluginGame5GraphDialog::GraphInfo graphInfo = getGraphInfo(); - graphWidget->updateGraphInfo(graphInfo.solutionCost, graphInfo.numberOfOpenNodes, graphInfo.totalNumberOfNodes); - graphWidget->scene()->setSceneRect(graphWidget->scene()->itemsBoundingRect()); - graphWidget->zoomFit(); + graphWidget->scene()->clear(); + m_clickedNode = NULL; + + std::vector parsingResult = parseTrace(startBoardState); + std::vector> graph = generateGraphNodes(parsingResult); + if (!graph.empty()) + { + drawGraph(graph); + } + + PluginGame5GraphDialog::GraphInfo graphInfo = getGraphInfo(); + graphWidget->updateGraphInfo(graphInfo.solutionCost, graphInfo.numberOfOpenNodes, graphInfo.totalNumberOfNodes); + graphWidget->scene()->setSceneRect(graphWidget->scene()->itemsBoundingRect()); + graphWidget->zoomFit(); } void PluginGame5GraphDialog::onPluginAction(const std::vector& boardState) { - if (m_traceTimeStamp != getTraceTimeStamp()) - { - m_traceTimeStamp = getTraceTimeStamp(); - updateGraph(boardState); - } - exec(); + if (m_traceTimeStamp != getTraceTimeStamp()) + { + m_traceTimeStamp = getTraceTimeStamp(); + updateGraph(boardState); + } + exec(); } void PluginGame5GraphDialog::updateCheckedNode(GraphNode* node) { - if (node != m_clickedNode) - { - if (m_clickedNode) - { - m_clickedNode->setChecked(false); - } - node->setChecked(true); - m_clickedNode = node; - emit updateNodeInfoDlg(node); - } + if (node != m_clickedNode) + { + if (m_clickedNode) + { + m_clickedNode->setChecked(false); + } + node->setChecked(true); + m_clickedNode = node; + emit updateNodeInfoDlg(node); + } } void PluginGame5GraphDialog::emitShowNodeInfoDlg() { - emit showNodeInfoDlg(); + emit showNodeInfoDlg(); } PluginGame5GraphDialog::GraphInfo::GraphInfo(QString solutionCost, QString numberOfOpenNodes, QString totalNumberOfNodes) - : solutionCost(solutionCost) - , numberOfOpenNodes(numberOfOpenNodes) - , totalNumberOfNodes(totalNumberOfNodes) + : solutionCost(solutionCost) + , numberOfOpenNodes(numberOfOpenNodes) + , totalNumberOfNodes(totalNumberOfNodes) {} diff --git a/app/rdo_studio/plugins/game5/src/plugin_game5_graph_dialog.h b/app/rdo_studio/plugins/game5/src/plugin_game5_graph_dialog.h index 7da71f4c5..5b55330fc 100644 --- a/app/rdo_studio/plugins/game5/src/plugin_game5_graph_dialog.h +++ b/app/rdo_studio/plugins/game5/src/plugin_game5_graph_dialog.h @@ -1,5 +1,4 @@ -#ifndef _RDO_PLUGIN_GAME5_GRAPH_DIALOG_H_ -#define _RDO_PLUGIN_GAME5_GRAPH_DIALOG_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -11,54 +10,56 @@ // -------------------------------------------------------------------------------- class PluginGame5GraphDialog - : public QDialog - , public Ui_PluginGame5GraphDialog + : public QDialog + , public Ui_PluginGame5GraphDialog { Q_OBJECT public: - PluginGame5GraphDialog(QWidget* parent); - ~PluginGame5GraphDialog(); + PluginGame5GraphDialog(QWidget* parent); + ~PluginGame5GraphDialog(); - void updateGraph(const std::vector& startBoardState); + void updateGraph(const std::vector& startBoardState); public slots: - void onPluginAction(const std::vector& boardState); - void emitShowNodeInfoDlg(); + void onPluginAction(const std::vector& boardState); + void emitShowNodeInfoDlg(); signals: - void updateNodeInfoDlg(GraphNode* node); - void showNodeInfoDlg (); + void updateNodeInfoDlg(GraphNode* node); + void showNodeInfoDlg (); private: - struct UnbuiltRange - { - unsigned int firstNode; - unsigned int range; - }; + struct UnbuiltRange + { + unsigned int firstNode; + unsigned int range; + }; - struct GraphInfo - { - GraphInfo(QString solutionCost = "", QString numberOfOpenNodes = "", QString totalNumberOfNodes = ""); - const QString solutionCost; - const QString numberOfOpenNodes; - const QString totalNumberOfNodes; - }; + struct GraphInfo + { + GraphInfo(QString solutionCost = "", QString numberOfOpenNodes = "", QString totalNumberOfNodes = ""); - QString m_traceTimeStamp; - GraphNode* m_clickedNode; - int m_nodeWidth; - int m_nodeHeight; + const QString solutionCost; + const QString numberOfOpenNodes; + const QString totalNumberOfNodes; - std::list getSolutionNodes() const; - void updateCheckedNode(GraphNode* node); - QString getTraceTimeStamp() const; - QString getTraceFile() const; - std::vector parseTrace(const std::vector& startBoardState); - std::vector> generateGraphNodes(std::vector& parsingResult) const; - void drawGraph(const std::vector>& graph) const; + private: + GraphInfo& operator= (const GraphInfo&); + }; - PluginGame5GraphDialog::GraphInfo getGraphInfo() const; -}; + QString m_traceTimeStamp; + GraphNode* m_clickedNode; + int m_nodeWidth; + int m_nodeHeight; + + std::list getSolutionNodes() const; + void updateCheckedNode(GraphNode* node); + QString getTraceTimeStamp() const; + QString getTraceFile() const; + std::vector parseTrace(const std::vector& startBoardState); + std::vector> generateGraphNodes(std::vector& parsingResult) const; + void drawGraph(const std::vector>& graph) const; -#endif // _RDO_PLUGIN_GAME5_GRAPH_DIALOG_H_ + PluginGame5GraphDialog::GraphInfo getGraphInfo() const; +}; diff --git a/app/rdo_studio/plugins/game5/src/plugin_game5_graph_node_info_dialog.cpp b/app/rdo_studio/plugins/game5/src/plugin_game5_graph_node_info_dialog.cpp index c04761393..d6b63246c 100644 --- a/app/rdo_studio/plugins/game5/src/plugin_game5_graph_node_info_dialog.cpp +++ b/app/rdo_studio/plugins/game5/src/plugin_game5_graph_node_info_dialog.cpp @@ -7,21 +7,21 @@ // -------------------------------------------------------------------------------- PluginGame5GraphNodeInfoDialog::PluginGame5GraphNodeInfoDialog(QWidget* pParent) - : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) - , m_pNode(NULL) + : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) + , m_pNode(NULL) { - setupUi(this); - gameBoard->setTilesDisabled(true); + setupUi(this); + gameBoard->setTilesDisabled(true); - buttonNext->setIcon(style()->standardIcon(QStyle::SP_ArrowForward)); - buttonPrev->setIcon(style()->standardIcon(QStyle::SP_ArrowBack)); - connect(buttonNext, &QPushButton::clicked, this, &PluginGame5GraphNodeInfoDialog::nextNode); - connect(buttonPrev, &QPushButton::clicked, this, &PluginGame5GraphNodeInfoDialog::prevNode); + buttonNext->setIcon(style()->standardIcon(QStyle::SP_ArrowForward)); + buttonPrev->setIcon(style()->standardIcon(QStyle::SP_ArrowBack)); + connect(buttonNext, &QPushButton::clicked, this, &PluginGame5GraphNodeInfoDialog::nextNode); + connect(buttonPrev, &QPushButton::clicked, this, &PluginGame5GraphNodeInfoDialog::prevNode); - if (pParent) - { - move(pParent->frameGeometry().center() - frameGeometry().center()); - } + if (pParent) + { + move(pParent->frameGeometry().center() - frameGeometry().center()); + } } PluginGame5GraphNodeInfoDialog::~PluginGame5GraphNodeInfoDialog() @@ -29,55 +29,55 @@ PluginGame5GraphNodeInfoDialog::~PluginGame5GraphNodeInfoDialog() void PluginGame5GraphNodeInfoDialog::updateDlg(GraphNode* node) { - m_pNode = node; + m_pNode = node; - labelPathCostOut ->setText(QString::number(node->getPathCost())); - labelRestPathCostOut->setText(QString::number(node->getRestPathCost())); - labelRelevantTileOut->setText(QString::number(node->getRelevantTile())); - QString moveText = node->getMoveDirection(); - if (node->getRelevantTile()) - { - moveText += " (c " + QString::number(node->getTileMoveFrom()) - + " на " + QString::number(node->getTileMoveTo()) + ")"; - } - labelSolutionOut ->setText(node->isRelatedToSolution() ? "Да" : "Нет"); - labelMoveDirectionOut->setText(moveText); - labelMoveCostOut ->setText(QString::number(node->getMoveCost())); - labelNodeNumOut ->setText(QString::number(node->getNodeID())); - if (GraphNode* parentNode = node->getParentGraphNode()) - { - labelParentNodeNumOut->setText(QString::number(parentNode->getNodeID())); - } - else - { - labelParentNodeNumOut->setText(QString::number(0)); - } + labelPathCostOut ->setText(QString::number(node->getPathCost())); + labelRestPathCostOut->setText(QString::number(node->getRestPathCost())); + labelRelevantTileOut->setText(QString::number(node->getRelevantTile())); + QString moveText = node->getMoveDirection(); + if (node->getRelevantTile()) + { + moveText += " (c " + QString::number(node->getTileMoveFrom()) + + " на " + QString::number(node->getTileMoveTo()) + ")"; + } + labelSolutionOut ->setText(node->isRelatedToSolution() ? "Да" : "Нет"); + labelMoveDirectionOut->setText(moveText); + labelMoveCostOut ->setText(QString::number(node->getMoveCost())); + labelNodeNumOut ->setText(QString::number(node->getNodeID())); + if (GraphNode* parentNode = node->getParentGraphNode()) + { + labelParentNodeNumOut->setText(QString::number(parentNode->getNodeID())); + } + else + { + labelParentNodeNumOut->setText(QString::number(0)); + } - buttonNext->setEnabled(!node->getChildrenList().empty()); - buttonPrev->setEnabled(node->getParentGraphNode() != NULL); + buttonNext->setEnabled(!node->getChildrenList().empty()); + buttonPrev->setEnabled(node->getParentGraphNode() != NULL); - gameBoard->setTilesPositon(node->getBoardState()); + gameBoard->setTilesPositon(node->getBoardState()); - if (size().width() < sizeHint().width()) - { - setFixedSize(sizeHint()); - } + if (size().width() < sizeHint().width()) + { + setFixedSize(sizeHint()); + } } void PluginGame5GraphNodeInfoDialog::nextNode() { - for (GraphNode* node: m_pNode->getChildrenList()) - { - if (node->isRelatedToSolution()) - { - emit updateCheckedNode(node); - return; - } - } - emit updateCheckedNode(*m_pNode->getChildrenList().begin()); + for (GraphNode* node: m_pNode->getChildrenList()) + { + if (node->isRelatedToSolution()) + { + emit updateCheckedNode(node); + return; + } + } + emit updateCheckedNode(*m_pNode->getChildrenList().begin()); } void PluginGame5GraphNodeInfoDialog::prevNode() { - emit updateCheckedNode(m_pNode->getParentGraphNode()); + emit updateCheckedNode(m_pNode->getParentGraphNode()); } diff --git a/app/rdo_studio/plugins/game5/src/plugin_game5_graph_node_info_dialog.h b/app/rdo_studio/plugins/game5/src/plugin_game5_graph_node_info_dialog.h index 511609fe3..1d1d55211 100644 --- a/app/rdo_studio/plugins/game5/src/plugin_game5_graph_node_info_dialog.h +++ b/app/rdo_studio/plugins/game5/src/plugin_game5_graph_node_info_dialog.h @@ -1,5 +1,4 @@ -#ifndef _RDO_PLUGIN_GAME5_GRAPH_NODE_INFO_DIALOG_H_ -#define _RDO_PLUGIN_GAME5_GRAPH_NODE_INFO_DIALOG_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -10,26 +9,24 @@ // -------------------------------------------------------------------------------- class PluginGame5GraphNodeInfoDialog - : public QDialog - , public Ui_PluginGame5GraphNodeInfoDialog + : public QDialog + , public Ui_PluginGame5GraphNodeInfoDialog { Q_OBJECT public: - PluginGame5GraphNodeInfoDialog(QWidget* parent); - ~PluginGame5GraphNodeInfoDialog(); + PluginGame5GraphNodeInfoDialog(QWidget* parent); + ~PluginGame5GraphNodeInfoDialog(); public slots: - void updateDlg(GraphNode* node); + void updateDlg(GraphNode* node); signals: - void updateCheckedNode(GraphNode* node); + void updateCheckedNode(GraphNode* node); private slots: - void nextNode(); - void prevNode(); + void nextNode(); + void prevNode(); private: - GraphNode* m_pNode; + GraphNode* m_pNode; }; - -#endif // _RDO_PLUGIN_GAME5_GRAPH_NODE_INFO_DIALOG_H_ diff --git a/app/rdo_studio/plugins/game5/src/plugin_game5_model_generator.cpp b/app/rdo_studio/plugins/game5/src/plugin_game5_model_generator.cpp index a70a7fff1..bc2aefc1f 100644 --- a/app/rdo_studio/plugins/game5/src/plugin_game5_model_generator.cpp +++ b/app/rdo_studio/plugins/game5/src/plugin_game5_model_generator.cpp @@ -9,172 +9,172 @@ QString PluginGame5ModelGenerator::modelRTP(const Board& gameBoard) { - std::stringstream RTPtabTextStream; - RTPtabTextStream - << "$Resource_type Фишка : permanent" << std::endl - << "$Parameters" << std::endl - << " Номер : integer[1.." << gameBoard.getQuantityOfTiles() << "]" << std::endl - << " Местоположение : integer[1.." << gameBoard.getQuantityOfTiles() + 1 << "]" << std::endl - << "$End" << std::endl - << std::endl - << "$Resource_type Дырка_t : permanent" << std::endl - << "$Parameters" << std::endl - << "\t Место: integer[1.." << gameBoard.getQuantityOfTiles() + 1 << "]" << std::endl - << "$End" << std::endl; - return QString::fromStdString(RTPtabTextStream.str()); + std::stringstream RTPtabTextStream; + RTPtabTextStream + << "$Resource_type Фишка : permanent" << std::endl + << "$Parameters" << std::endl + << " Номер : integer[1.." << gameBoard.getQuantityOfTiles() << "]" << std::endl + << " Местоположение : integer[1.." << gameBoard.getQuantityOfTiles() + 1 << "]" << std::endl + << "$End" << std::endl + << std::endl + << "$Resource_type Дырка_t : permanent" << std::endl + << "$Parameters" << std::endl + << " Место: integer[1.." << gameBoard.getQuantityOfTiles() + 1 << "]" << std::endl + << "$End" << std::endl; + return QString::fromStdString(RTPtabTextStream.str()); } QString PluginGame5ModelGenerator::modelRSS(const Board& gameBoard) { - std::stringstream RSStabTextStream; - RSStabTextStream << "$Resources" << std::endl; - for (int i = 1; i < gameBoard.getQuantityOfTiles() + 1; i++) - { - RSStabTextStream << "\tФишка" << i <<" = Фишка(" << i << ", " << gameBoard.getTilePosition(i) << ");" << std::endl; - } - RSStabTextStream << "\tДырка = Дырка_t(" << gameBoard.getHolePosition() << ");" << std::endl; - RSStabTextStream << "$End" << std::endl; - return QString::fromStdString(RSStabTextStream.str()); + std::stringstream RSStabTextStream; + RSStabTextStream << "$Resources" << std::endl; + for (int i = 1; i < gameBoard.getQuantityOfTiles() + 1; i++) + { + RSStabTextStream << "\tФишка" << i <<" = Фишка(" << i << ", " << gameBoard.getTilePosition(i) << ");" << std::endl; + } + RSStabTextStream << "\tДырка = Дырка_t(" << gameBoard.getHolePosition() << ");" << std::endl; + RSStabTextStream << "$End" << std::endl; + return QString::fromStdString(RSStabTextStream.str()); } QString PluginGame5ModelGenerator::modelPAT() { - std::stringstream PATtabTextStream; - PATtabTextStream - << "$Pattern Перемещение_фишки : rule" << std::endl - << "$Parameters" << std::endl - << " Куда_перемещать: such_as Место_дырки" << std::endl - << " На_сколько_перемещать: integer" << std::endl - << "$Relevant_resources" << std::endl - << " _Фишка: Фишка Keep" << std::endl - << " _Дырка: Дырка_t Keep" << std::endl - << "$Body" << std::endl - << " _Фишка:" << std::endl - << " Choice from Где_дырка(_Фишка.Местоположение) == Куда_перемещать" << std::endl - << " first" << std::endl - << " Convert_rule Местоположение = _Фишка.Местоположение + На_сколько_перемещать;" << std::endl - << " _Дырка:" << std::endl - << " Choice NoCheck" << std::endl - << " first" << std::endl - << " Convert_rule Место = _Дырка.Место - На_сколько_перемещать;" << std::endl - << "$End" << std::endl; - return QString::fromStdString(PATtabTextStream.str()); + std::stringstream PATtabTextStream; + PATtabTextStream + << "$Pattern Перемещение_фишки : rule" << std::endl + << "$Parameters" << std::endl + << " Куда_перемещать: such_as Место_дырки" << std::endl + << " На_сколько_перемещать: integer" << std::endl + << "$Relevant_resources" << std::endl + << " _Фишка: Фишка Keep" << std::endl + << " _Дырка: Дырка_t Keep" << std::endl + << "$Body" << std::endl + << " _Фишка:" << std::endl + << " Choice from Где_дырка(_Фишка.Местоположение) == Куда_перемещать" << std::endl + << " first" << std::endl + << " Convert_rule Местоположение = _Фишка.Местоположение + На_сколько_перемещать;" << std::endl + << " _Дырка:" << std::endl + << " Choice NoCheck" << std::endl + << " first" << std::endl + << " Convert_rule Место = _Дырка.Место - На_сколько_перемещать;" << std::endl + << "$End" << std::endl; + return QString::fromStdString(PATtabTextStream.str()); } QString PluginGame5ModelGenerator::modelDPT(const Board& gameBoard, const std::string& evaluateBy, bool compareTops, const std::string& activityValueLeft, const std::string& activityValueRight, const std::string& activityValueDown, const std::string& activityValueUp) { - std::stringstream DPTtabTextStream; - DPTtabTextStream - << "$Decision_point Расстановка_фишек : search trace_all" << std::endl - << "$Condition Exist(Фишка: Фишка.Номер <> Фишка.Местоположение)" << std::endl - << "$Term_condition" << std::endl - << " For_All(Фишка: Фишка.Номер == Фишка.Местоположение)" << std::endl - << "$Evaluate_by " << evaluateBy << std::endl - << "$Compare_tops = " << (compareTops ? "YES" : "NO") << std::endl - << "$Activities" << std::endl - << " Перемещение_вправо: Перемещение_фишки справа 1 value " << activityValueLeft << std::endl - << " Перемещение_влево : Перемещение_фишки слева -1 value " << activityValueRight << std::endl - << " Перемещение_вверх : Перемещение_фишки сверху -" << gameBoard.m_tilesCountX << " value " << activityValueDown << std::endl - << " Перемещение_вниз : Перемещение_фишки снизу " << gameBoard.m_tilesCountX << " value " << activityValueUp << std::endl - << "$End"; - return QString::fromStdString(DPTtabTextStream.str()); + std::stringstream DPTtabTextStream; + DPTtabTextStream + << "$Decision_point Расстановка_фишек : search trace_all" << std::endl + << "$Condition Exist(Фишка: Фишка.Номер <> Фишка.Местоположение)" << std::endl + << "$Term_condition" << std::endl + << " For_All(Фишка: Фишка.Номер == Фишка.Местоположение)" << std::endl + << "$Evaluate_by " << evaluateBy << std::endl + << "$Compare_tops = " << (compareTops ? "YES" : "NO") << std::endl + << "$Activities" << std::endl + << " Перемещение_вправо: Перемещение_фишки (справа, 1) value " << activityValueLeft << ";" << std::endl + << " Перемещение_влево : Перемещение_фишки (слева, -1) value " << activityValueRight << ";" << std::endl + << " Перемещение_вверх : Перемещение_фишки (сверху, -" << gameBoard.m_tilesCountX << ") value " << activityValueDown << ";" << std::endl + << " Перемещение_вниз : Перемещение_фишки (снизу, " << gameBoard.m_tilesCountX << ") value " << activityValueUp << ";" << std::endl + << "$End"; + return QString::fromStdString(DPTtabTextStream.str()); } QString PluginGame5ModelGenerator::modelFUN(const Board& gameBoard) { - std::stringstream FUNtabTextStream; - FUNtabTextStream - << "$Constant" << std::endl - << " Место_дырки: (справа, слева, сверху, снизу, дырки_рядом_нет) = дырки_рядом_нет" << std::endl - << " Длина_поля : integer = " << gameBoard.m_tilesCountX << std::endl - << "$End" << std::endl - << std::endl - << "$Function Ряд: integer" << std::endl - << "$Type = algorithmic" << std::endl - << "$Parameters" << std::endl - << " Местоположение: integer" << std::endl - << "$Body" << std::endl - << " return (Местоположение - 1)/Длина_поля + 1;" << std::endl - << "$End" << std::endl - << std::endl - << "$Function Остаток_от_деления : integer" << std::endl - << "$Type = algorithmic" << std::endl - << "$Parameters" << std::endl - << " Делимое : integer" << std::endl - << " Делитель : integer" << std::endl - << "$Body" << std::endl - << " integer Целая_часть = Делимое/Делитель;" << std::endl - << " integer Макс_делимое = Делитель * int(Целая_часть);" << std::endl - << " return Делимое - Макс_делимое;" << std::endl - << "$End" << std::endl - << std::endl - << "$Function Столбец: integer" << std::endl - << "$Type = algorithmic" << std::endl - << "$Parameters" << std::endl - << " Местоположение: integer" << std::endl - << "$Body" << std::endl - << " return Остаток_от_деления(Местоположение - 1,Длина_поля) + 1;" << std::endl - << "$End" << std::endl - << std::endl - << "$Function Где_дырка : such_as Место_дырки" << std::endl - << "$Type = algorithmic" << std::endl - << "$Parameters" << std::endl - << " _Место: such_as Фишка.Местоположение" << std::endl - << "$Body" << std::endl - << " if (Столбец(_Место) == Столбец(Дырка.Место) and Ряд(_Место) == Ряд(Дырка.Место)+ 1) return сверху;" << std::endl - << " if (Столбец(_Место) == Столбец(Дырка.Место) and Ряд(_Место) == Ряд(Дырка.Место)- 1) return снизу;" << std::endl - << " if (Ряд(_Место) == Ряд(Дырка.Место) and Столбец(_Место) == Столбец(Дырка.Место)- 1) return справа;" << std::endl - << " if (Ряд(_Место) == Ряд(Дырка.Место) and Столбец(_Место) == Столбец(Дырка.Место)+ 1) return слева;" << std::endl - << " return дырки_рядом_нет;" << std::endl - << "$End" << std::endl - << std::endl - << "$Function Фишка_на_месте : integer" << std::endl - << "$Type = algorithmic" << std::endl - << "$Parameters" << std::endl - << " _Номер: such_as Фишка.Номер" << std::endl - << " _Место: such_as Фишка.Местоположение" << std::endl - << "$Body" << std::endl - << " if (_Номер == _Место) return 1;" << std::endl - << " else return 0;" << std::endl - << "$End" << std::endl - << std::endl - << "$Function Кол_во_фишек_не_на_месте : integer" << std::endl - << "$Type = algorithmic" << std::endl - << "$Parameters" << std::endl - << "$Body" << std::endl - << " return " << gameBoard.getQuantityOfTiles() << " - (Фишка_на_месте(Фишка1.Номер, Фишка1.Местоположение)+" << std::endl; - for (int i = 2; i < gameBoard.getQuantityOfTiles(); i++) - { - FUNtabTextStream - << " Фишка_на_месте(Фишка" << i <<".Номер, Фишка" << i <<".Местоположение)+" << std::endl; - } - FUNtabTextStream - << " Фишка_на_месте(Фишка" << gameBoard.getQuantityOfTiles() <<".Номер, Фишка" << gameBoard.getQuantityOfTiles() <<".Местоположение));" << std::endl - << "$End" << std::endl - << std::endl - << "$Function Расстояние_фишки_до_места : integer" << std::endl - << "$Type = algorithmic" << std::endl - << "$Parameters" << std::endl - << " Откуда: integer" << std::endl - << " Куда : integer" << std::endl - << "$Body" << std::endl - << " return Abs(Ряд(Откуда)-Ряд(Куда)) + Abs(Столбец(Откуда)-Столбец(Куда));" << std::endl - << "$End" << std::endl - << std::endl - << "$Function Расстояния_фишек_до_мест : integer" << std::endl - << "$Type = algorithmic" << std::endl - << "$Parameters" << std::endl - << "$Body" << std::endl - << " return Расстояние_фишки_до_места(Фишка1.Номер, Фишка1.Местоположение)+" << std::endl; - for (int i = 2; i < gameBoard.getQuantityOfTiles(); i++) - { - FUNtabTextStream - << " Расстояние_фишки_до_места(Фишка" << i << ".Номер, Фишка" << i << ".Местоположение)+" << std::endl; - } - FUNtabTextStream - << " Расстояние_фишки_до_места(Фишка" << gameBoard.getQuantityOfTiles() << ".Номер, Фишка" << gameBoard.getQuantityOfTiles() << ".Местоположение);" << std::endl - << "$End"; - return QString::fromStdString(FUNtabTextStream.str()); + std::stringstream FUNtabTextStream; + FUNtabTextStream + << "$Constant" << std::endl + << " Место_дырки: (справа, слева, сверху, снизу, дырки_рядом_нет) = дырки_рядом_нет" << std::endl + << " Длина_поля : integer = " << gameBoard.m_tilesCountX << std::endl + << "$End" << std::endl + << std::endl + << "$Function Ряд: integer" << std::endl + << "$Type = algorithmic" << std::endl + << "$Parameters" << std::endl + << " Местоположение: integer" << std::endl + << "$Body" << std::endl + << " return (Местоположение - 1)/Длина_поля + 1;" << std::endl + << "$End" << std::endl + << std::endl + << "$Function Остаток_от_деления : integer" << std::endl + << "$Type = algorithmic" << std::endl + << "$Parameters" << std::endl + << " Делимое : integer" << std::endl + << " Делитель : integer" << std::endl + << "$Body" << std::endl + << " integer Целая_часть = Делимое/Делитель;" << std::endl + << " integer Макс_делимое = Делитель * int(Целая_часть);" << std::endl + << " return Делимое - Макс_делимое;" << std::endl + << "$End" << std::endl + << std::endl + << "$Function Столбец: integer" << std::endl + << "$Type = algorithmic" << std::endl + << "$Parameters" << std::endl + << " Местоположение: integer" << std::endl + << "$Body" << std::endl + << " return Остаток_от_деления(Местоположение - 1,Длина_поля) + 1;" << std::endl + << "$End" << std::endl + << std::endl + << "$Function Где_дырка : such_as Место_дырки" << std::endl + << "$Type = algorithmic" << std::endl + << "$Parameters" << std::endl + << " _Место: such_as Фишка.Местоположение" << std::endl + << "$Body" << std::endl + << " if (Столбец(_Место) == Столбец(Дырка.Место) and Ряд(_Место) == Ряд(Дырка.Место)+ 1) return сверху;" << std::endl + << " if (Столбец(_Место) == Столбец(Дырка.Место) and Ряд(_Место) == Ряд(Дырка.Место)- 1) return снизу;" << std::endl + << " if (Ряд(_Место) == Ряд(Дырка.Место) and Столбец(_Место) == Столбец(Дырка.Место)- 1) return справа;" << std::endl + << " if (Ряд(_Место) == Ряд(Дырка.Место) and Столбец(_Место) == Столбец(Дырка.Место)+ 1) return слева;" << std::endl + << " return дырки_рядом_нет;" << std::endl + << "$End" << std::endl + << std::endl + << "$Function Фишка_на_месте : integer" << std::endl + << "$Type = algorithmic" << std::endl + << "$Parameters" << std::endl + << " _Номер: such_as Фишка.Номер" << std::endl + << " _Место: such_as Фишка.Местоположение" << std::endl + << "$Body" << std::endl + << " if (_Номер == _Место) return 1;" << std::endl + << " else return 0;" << std::endl + << "$End" << std::endl + << std::endl + << "$Function Кол_во_фишек_не_на_месте : integer" << std::endl + << "$Type = algorithmic" << std::endl + << "$Parameters" << std::endl + << "$Body" << std::endl + << " return " << gameBoard.getQuantityOfTiles() << " - (Фишка_на_месте(Фишка1.Номер, Фишка1.Местоположение)+" << std::endl; + for (int i = 2; i < gameBoard.getQuantityOfTiles(); i++) + { + FUNtabTextStream + << " Фишка_на_месте(Фишка" << i <<".Номер, Фишка" << i <<".Местоположение)+" << std::endl; + } + FUNtabTextStream + << " Фишка_на_месте(Фишка" << gameBoard.getQuantityOfTiles() <<".Номер, Фишка" << gameBoard.getQuantityOfTiles() <<".Местоположение));" << std::endl + << "$End" << std::endl + << std::endl + << "$Function Расстояние_фишки_до_места : integer" << std::endl + << "$Type = algorithmic" << std::endl + << "$Parameters" << std::endl + << " Откуда: integer" << std::endl + << " Куда : integer" << std::endl + << "$Body" << std::endl + << " return Abs(Ряд(Откуда)-Ряд(Куда)) + Abs(Столбец(Откуда)-Столбец(Куда));" << std::endl + << "$End" << std::endl + << std::endl + << "$Function Расстояния_фишек_до_мест : integer" << std::endl + << "$Type = algorithmic" << std::endl + << "$Parameters" << std::endl + << "$Body" << std::endl + << " return Расстояние_фишки_до_места(Фишка1.Номер, Фишка1.Местоположение)+" << std::endl; + for (int i = 2; i < gameBoard.getQuantityOfTiles(); i++) + { + FUNtabTextStream + << " Расстояние_фишки_до_места(Фишка" << i << ".Номер, Фишка" << i << ".Местоположение)+" << std::endl; + } + FUNtabTextStream + << " Расстояние_фишки_до_места(Фишка" << gameBoard.getQuantityOfTiles() << ".Номер, Фишка" << gameBoard.getQuantityOfTiles() << ".Местоположение);" << std::endl + << "$End"; + return QString::fromStdString(FUNtabTextStream.str()); } diff --git a/app/rdo_studio/plugins/game5/src/plugin_game5_model_generator.h b/app/rdo_studio/plugins/game5/src/plugin_game5_model_generator.h index 6055bd016..b7888f8a9 100644 --- a/app/rdo_studio/plugins/game5/src/plugin_game5_model_generator.h +++ b/app/rdo_studio/plugins/game5/src/plugin_game5_model_generator.h @@ -1,5 +1,4 @@ -#ifndef PLUGIN_GAME5_MODEL_GENERATOR_H -#define PLUGIN_GAME5_MODEL_GENERATOR_H +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,13 +8,11 @@ class PluginGame5ModelGenerator { public: - static QString modelRTP(const Board& gameBoard); - static QString modelRSS(const Board& gameBoard); - static QString modelPAT(); - static QString modelDPT(const Board& gameBoard, const std::string& evaluateBy = "0", bool compareTops = true, - const std::string& activityValueLeft = "before 1", const std::string& activityValueRight = "before 1", - const std::string& activityValueDown = "before 1", const std::string& activityValueUp = "before 1"); - static QString modelFUN(const Board& gameBoard); + static QString modelRTP(const Board& gameBoard); + static QString modelRSS(const Board& gameBoard); + static QString modelPAT(); + static QString modelDPT(const Board& gameBoard, const std::string& evaluateBy = "0", bool compareTops = true, + const std::string& activityValueLeft = "before 1", const std::string& activityValueRight = "before 1", + const std::string& activityValueDown = "before 1", const std::string& activityValueUp = "before 1"); + static QString modelFUN(const Board& gameBoard); }; - -#endif // PLUGIN_GAME5_MODEL_GENERATOR_H diff --git a/app/rdo_studio/plugins/game5/src/plugin_game5_tiles_order_dialog.cpp b/app/rdo_studio/plugins/game5/src/plugin_game5_tiles_order_dialog.cpp index e0cb93a3b..c0c6a7472 100644 --- a/app/rdo_studio/plugins/game5/src/plugin_game5_tiles_order_dialog.cpp +++ b/app/rdo_studio/plugins/game5/src/plugin_game5_tiles_order_dialog.cpp @@ -8,29 +8,29 @@ // -------------------------------------------------------------------------------- TilesOrderDialog::TilesOrderDialog(QWidget* pParent, const std::vector& state) - : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) + : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) { - setupUi(this); + setupUi(this); - QString boardStateStr; - for (auto index : state) - { - boardStateStr += QString::number(index) + " "; - } + QString boardStateStr; + for (auto index : state) + { + boardStateStr += QString::number(index) + " "; + } - QRegExpValidator * validator = new QRegExpValidator(); - validator->setRegExp(QRegExp(validatorRegExpPattern(state.size()))); + QRegExpValidator * validator = new QRegExpValidator(); + validator->setRegExp(QRegExp(validatorRegExpPattern(state.size()))); - lineEditPosition->setValidator(validator); - lineEditPosition->setText(boardStateStr); + lineEditPosition->setValidator(validator); + lineEditPosition->setText(boardStateStr); - connect(buttonCancel, &QPushButton::clicked, this, &TilesOrderDialog::reject); - connect(buttonOk , &QPushButton::clicked, this, &TilesOrderDialog::onOkClick); - - if (pParent) - { - move(pParent->frameGeometry().center() - frameGeometry().center()); - } + connect(buttonCancel, &QPushButton::clicked, this, &TilesOrderDialog::reject); + connect(buttonOk , &QPushButton::clicked, this, &TilesOrderDialog::onOkClick); + + if (pParent) + { + move(pParent->frameGeometry().center() - frameGeometry().center()); + } } TilesOrderDialog::~TilesOrderDialog() @@ -39,37 +39,37 @@ TilesOrderDialog::~TilesOrderDialog() void TilesOrderDialog::onOkClick() { - QStringList positionList = lineEditPosition->text().split(' ', QString::SkipEmptyParts); - std::vector newState; - for (const auto& position: positionList) - { - newState.push_back(position.toInt()); - } - emit tilesOrderCommited(newState); - accept(); + QStringList positionList = lineEditPosition->text().split(' ', QString::SkipEmptyParts); + std::vector newState; + for (const auto& position: positionList) + { + newState.push_back(position.toInt()); + } + emit tilesOrderCommited(newState); + accept(); } QString TilesOrderDialog::validatorRegExpPattern(int value) const { - QString singleRegExp; - int leastBit = value % 10 - 1; - int highBit = value / 10; - if (highBit == 0) - { - singleRegExp += "[0-" + QString::number(leastBit) + "]"; - } - else - { - if (highBit == 1) - { - singleRegExp += "[0-9]|[0-1][0-" + QString::number(leastBit) + "]"; - } - else - { - singleRegExp += "[0-9]|[0-" + QString::number(highBit - 1) + "][0-9]|[0-" + QString::number(highBit) + "][0-" + QString::number(leastBit) + "]"; - } - } + QString singleRegExp; + int leastBit = value % 10 - 1; + int highBit = value / 10; + if (highBit == 0) + { + singleRegExp += "[0-" + QString::number(leastBit) + "]"; + } + else + { + if (highBit == 1) + { + singleRegExp += "[0-9]|[0-1][0-" + QString::number(leastBit) + "]"; + } + else + { + singleRegExp += "[0-9]|[0-" + QString::number(highBit - 1) + "][0-9]|[0-" + QString::number(highBit) + "][0-" + QString::number(leastBit) + "]"; + } + } - QString regExpString = "(((" + singleRegExp + ")(\\s)+)|((\\s)+(" + singleRegExp + ")(\\s)+)){" + QString::number(value) + "}($|((" + singleRegExp + ")$))"; - return regExpString; + QString regExpString = "(((" + singleRegExp + ")(\\s)+)|((\\s)+(" + singleRegExp + ")(\\s)+)){" + QString::number(value) + "}($|((" + singleRegExp + ")$))"; + return regExpString; } diff --git a/app/rdo_studio/plugins/game5/src/plugin_game5_tiles_order_dialog.h b/app/rdo_studio/plugins/game5/src/plugin_game5_tiles_order_dialog.h index 74d0d21da..2da829b3b 100644 --- a/app/rdo_studio/plugins/game5/src/plugin_game5_tiles_order_dialog.h +++ b/app/rdo_studio/plugins/game5/src/plugin_game5_tiles_order_dialog.h @@ -1,5 +1,4 @@ -#ifndef _RDO_PLUGIN_GAME_5_TILE_ORDER_DIALOG_H_ -#define _RDO_PLUGIN_GAME_5_TILE_ORDER_DIALOG_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -9,22 +8,20 @@ // -------------------------------------------------------------------------------- class TilesOrderDialog - : public QDialog - , public Ui_RAOgame5TilesOrderDialog + : public QDialog + , public Ui_RAOgame5TilesOrderDialog { Q_OBJECT public: - TilesOrderDialog(QWidget* parent, const std::vector& state); - virtual ~TilesOrderDialog(); + TilesOrderDialog(QWidget* parent, const std::vector& state); + virtual ~TilesOrderDialog(); signals: - void tilesOrderCommited(const std::vector& state); + void tilesOrderCommited(const std::vector& state); private: - QString validatorRegExpPattern(int value) const; + QString validatorRegExpPattern(int value) const; private slots: - void onOkClick(); + void onOkClick(); }; - -#endif // _RDO_PLUGIN_GAME_5_TILE_ORDER_DIALOG_H_ diff --git a/app/rdo_studio/plugins/game5/src/tiles.cpp b/app/rdo_studio/plugins/game5/src/tiles.cpp index 3f617985b..4170c9a2b 100644 --- a/app/rdo_studio/plugins/game5/src/tiles.cpp +++ b/app/rdo_studio/plugins/game5/src/tiles.cpp @@ -5,21 +5,21 @@ // -------------------------------------------------------------------------------- Tile::Tile(int number, QWidget* pParent) - : QPushButton(pParent) - , tileNumber (number) + : QPushButton(pParent) + , tileNumber (number) { - setText(QString::number(number)); - setStyleSheet("\ - background-color: red; \ - border-style: outset; \ - border-width: 2px; \ - border-radius: 10px; \ - border-color: black; \ - font: bold 28px; \ - color: black; \ - padding: 6px;"); + setText(QString::number(number)); + setStyleSheet("\ + background-color: red; \ + border-style: outset; \ + border-width: 2px; \ + border-radius: 10px; \ + border-color: black; \ + font: bold 28px; \ + color: black; \ + padding: 6px;"); - connect(this, &QPushButton::clicked, this, &Tile::reemitClicked); + connect(this, &QPushButton::clicked, this, &Tile::reemitClicked); } Tile::~Tile() @@ -27,6 +27,6 @@ Tile::~Tile() void Tile::reemitClicked() { - emit tileClicked(tileNumber); + emit tileClicked(tileNumber); } diff --git a/app/rdo_studio/plugins/game5/src/tiles.h b/app/rdo_studio/plugins/game5/src/tiles.h index b7fca8069..c8e7c242f 100644 --- a/app/rdo_studio/plugins/game5/src/tiles.h +++ b/app/rdo_studio/plugins/game5/src/tiles.h @@ -1,5 +1,4 @@ -#ifndef _RDO_PLUGIN_GAME_5_TILES_H_ -#define _RDO_PLUGIN_GAME_5_TILES_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -12,17 +11,15 @@ class Tile: public QPushButton {Q_OBJECT public: - Tile(int number, QWidget* pParent); - virtual ~Tile(); + Tile(int number, QWidget* pParent); + virtual ~Tile(); signals: - void tileClicked(int number); + void tileClicked(int number); private: - int tileNumber; + int tileNumber; private slots: - void reemitClicked(); + void reemitClicked(); }; - -#endif // _RDO_PLUGIN_GAME_5_TILES_H_ diff --git a/app/rdo_studio/res/insert_menu_template/algo_for.txt b/app/rdo_studio/res/insert_menu_template/algo_for.txt index 0181c7ed8..f80f39056 100644 --- a/app/rdo_studio/res/insert_menu_template/algo_for.txt +++ b/app/rdo_studio/res/insert_menu_template/algo_for.txt @@ -1,4 +1,4 @@ for (; ; ) { - + } diff --git a/app/rdo_studio/res/insert_menu_template/dtp_prior.txt b/app/rdo_studio/res/insert_menu_template/dpt_prior.txt similarity index 100% rename from app/rdo_studio/res/insert_menu_template/dtp_prior.txt rename to app/rdo_studio/res/insert_menu_template/dpt_prior.txt diff --git a/app/rdo_studio/res/insert_menu_template/dtp_search.txt b/app/rdo_studio/res/insert_menu_template/dpt_search.txt similarity index 73% rename from app/rdo_studio/res/insert_menu_template/dtp_search.txt rename to app/rdo_studio/res/insert_menu_template/dpt_search.txt index 90beaedc6..c6d11621c 100644 --- a/app/rdo_studio/res/insert_menu_template/dtp_search.txt +++ b/app/rdo_studio/res/insert_menu_template/dpt_search.txt @@ -6,6 +6,6 @@ $Term_condition $Evaluate_by $Compare_tops = YES $Activities - : value before - : value after + : value before + : value after $End diff --git a/app/rdo_studio/res/insert_menu_template/dtp_some.txt b/app/rdo_studio/res/insert_menu_template/dpt_some.txt similarity index 100% rename from app/rdo_studio/res/insert_menu_template/dtp_some.txt rename to app/rdo_studio/res/insert_menu_template/dpt_some.txt diff --git a/app/rdo_studio/res/insert_menu_template/frm.txt b/app/rdo_studio/res/insert_menu_template/frm.txt index 8ce139e71..863b7f3b1 100644 --- a/app/rdo_studio/res/insert_menu_template/frm.txt +++ b/app/rdo_studio/res/insert_menu_template/frm.txt @@ -1,5 +1,5 @@ $Frame $Back_picture = <255 255 255> 800 600 - bitmap(, , ); - text(, , , , <255 255 255>, <0 0 0>, = ); + bitmap(, , ); + text(, , , , <255 255 255>, <0 0 0>, = ); $End diff --git a/app/rdo_studio/res/insert_menu_template/fun_const.txt b/app/rdo_studio/res/insert_menu_template/fun_const.txt index ecf77f451..ace813e36 100644 --- a/app/rdo_studio/res/insert_menu_template/fun_const.txt +++ b/app/rdo_studio/res/insert_menu_template/fun_const.txt @@ -1,3 +1,3 @@ $Constant - : integer = + : integer = $End diff --git a/app/rdo_studio/res/insert_menu_template/pat_event.txt b/app/rdo_studio/res/insert_menu_template/pat_event.txt index a03e1b43e..0b12ed7b4 100644 --- a/app/rdo_studio/res/insert_menu_template/pat_event.txt +++ b/app/rdo_studio/res/insert_menu_template/pat_event.txt @@ -3,6 +3,6 @@ $Parameters : $Relevant_resources $Body - Convert_event + Convert_event $End diff --git a/app/rdo_studio/res/insert_menu_template/pat_keyboard.txt b/app/rdo_studio/res/insert_menu_template/pat_keyboard.txt index 6423012e9..a84f2a13f 100644 --- a/app/rdo_studio/res/insert_menu_template/pat_keyboard.txt +++ b/app/rdo_studio/res/insert_menu_template/pat_keyboard.txt @@ -4,10 +4,10 @@ $Relevant_resources $Time = $Body - Choice from - first - Convert_begin + Choice from + first + Convert_begin - Convert_end + Convert_end $End diff --git a/app/rdo_studio/res/insert_menu_template/pat_operation.txt b/app/rdo_studio/res/insert_menu_template/pat_operation.txt index 9dfd69669..b834fd247 100644 --- a/app/rdo_studio/res/insert_menu_template/pat_operation.txt +++ b/app/rdo_studio/res/insert_menu_template/pat_operation.txt @@ -4,10 +4,10 @@ $Relevant_resources $Time = $Body - Choice from - first - Convert_begin + Choice from + first + Convert_begin - Convert_end + Convert_end $End diff --git a/app/rdo_studio/res/insert_menu_template/pat_rule.txt b/app/rdo_studio/res/insert_menu_template/pat_rule.txt index a3a9f49ae..47ed29fa3 100644 --- a/app/rdo_studio/res/insert_menu_template/pat_rule.txt +++ b/app/rdo_studio/res/insert_menu_template/pat_rule.txt @@ -3,8 +3,8 @@ $Relevant_resources $Body - Choice from - first - Convert_rule + Choice from + first + Convert_rule $End diff --git a/app/rdo_studio/res/insert_menu_template/pmd.txt b/app/rdo_studio/res/insert_menu_template/pmd.txt index 76b3ab018..b75066f88 100644 --- a/app/rdo_studio/res/insert_menu_template/pmd.txt +++ b/app/rdo_studio/res/insert_menu_template/pmd.txt @@ -1,7 +1,7 @@ $Results - : watch_par - : watch_state - : watch_quant - : watch_value - : get_value + : watch_par + : watch_state + : watch_quant + : watch_value + : get_value $End diff --git a/app/rdo_studio/res/insert_menu_template/prc.txt b/app/rdo_studio/res/insert_menu_template/prc.txt index 856eb720a..aaad5b48c 100644 --- a/app/rdo_studio/res/insert_menu_template/prc.txt +++ b/app/rdo_studio/res/insert_menu_template/prc.txt @@ -1,7 +1,7 @@ $Process - GENERATE - SEIZE - ADVANCE - RELEASE - TERMINATE + GENERATE + SEIZE + ADVANCE + RELEASE + TERMINATE $End diff --git a/app/rdo_studio/res/insert_menu_template/rss.txt b/app/rdo_studio/res/insert_menu_template/rss.txt index 4311818d6..b8bd6e079 100644 --- a/app/rdo_studio/res/insert_menu_template/rss.txt +++ b/app/rdo_studio/res/insert_menu_template/rss.txt @@ -1,3 +1,3 @@ $Resources - + $End diff --git a/app/rdo_studio/res/new_model_template/template_0/template_0.rdox b/app/rdo_studio/res/new_model_template/template_0/template_0.rdox index b1c8636e2..1ccaaaf7c 100644 --- a/app/rdo_studio/res/new_model_template/template_0/template_0.rdox +++ b/app/rdo_studio/res/new_model_template/template_0/template_0.rdox @@ -1,4 +1,4 @@ - + diff --git a/app/rdo_studio/res/new_model_template/template_1/template_1.rdox b/app/rdo_studio/res/new_model_template/template_1/template_1.rdox index b1c8636e2..1ccaaaf7c 100644 --- a/app/rdo_studio/res/new_model_template/template_1/template_1.rdox +++ b/app/rdo_studio/res/new_model_template/template_1/template_1.rdox @@ -1,4 +1,4 @@ - + diff --git a/app/rdo_studio/res/new_model_template/template_2/template_2.evn b/app/rdo_studio/res/new_model_template/template_2/template_2.evn index 3de7f509e..aa596af74 100644 --- a/app/rdo_studio/res/new_model_template/template_2/template_2.evn +++ b/app/rdo_studio/res/new_model_template/template_2/template_2.evn @@ -1,5 +1,5 @@ $Pattern : event $Relevant_resources $Body - Convert_event + Convert_event $End diff --git a/app/rdo_studio/res/new_model_template/template_2/template_2.pat b/app/rdo_studio/res/new_model_template/template_2/template_2.pat index 840e55352..ed20abdef 100644 --- a/app/rdo_studio/res/new_model_template/template_2/template_2.pat +++ b/app/rdo_studio/res/new_model_template/template_2/template_2.pat @@ -1,15 +1,15 @@ $Pattern : rule $Relevant_resources $Body - Choice from - Convert_rule + Choice from + Convert_rule $End $Pattern : operation $Relevant_resources $Time = $Body - Choice from - Convert_begin - Convert_end + Choice from + Convert_begin + Convert_end $End diff --git a/app/rdo_studio/res/new_model_template/template_2/template_2.rdox b/app/rdo_studio/res/new_model_template/template_2/template_2.rdox index b1c8636e2..1ccaaaf7c 100644 --- a/app/rdo_studio/res/new_model_template/template_2/template_2.rdox +++ b/app/rdo_studio/res/new_model_template/template_2/template_2.rdox @@ -1,4 +1,4 @@ - + diff --git a/app/rdo_studio/res/new_model_template/template_3/template_3.dpt b/app/rdo_studio/res/new_model_template/template_3/template_3.dpt index b6e5b067a..60ecd8d6b 100644 --- a/app/rdo_studio/res/new_model_template/template_3/template_3.dpt +++ b/app/rdo_studio/res/new_model_template/template_3/template_3.dpt @@ -3,10 +3,10 @@ $Decision_point /* <имя_точки> */: some $Condition NoCheck $Activities /* - <имя_активности_1_1> : <имя_образца> <значения_параметров_образца> - <имя_активности_1_2> : <имя_образца> <значения_параметров_образца> - ... - <имя_активности_1_n> : <имя_образца> <значения_параметров_образца> + <имя_активности_1_1> : <имя_образца> <значения_параметров_образца> + <имя_активности_1_2> : <имя_образца> <значения_параметров_образца> + ... + <имя_активности_1_n> : <имя_образца> <значения_параметров_образца> */ $End @@ -15,10 +15,10 @@ $Parent /* <имя_родительской_точки_принятия_реше $Condition /* <логическое_выражение> */ $Activities /* - <имя_активности_2_1> : <имя_образца> <значения_параметров_образца> - <имя_активности_2_2> : <имя_образца> <значения_параметров_образца> - ... - <имя_активности_2_n> : <имя_образца> <значения_параметров_образца> + <имя_активности_2_1> : <имя_образца> <значения_параметров_образца> + <имя_активности_2_2> : <имя_образца> <значения_параметров_образца> + ... + <имя_активности_2_n> : <имя_образца> <значения_параметров_образца> */ $End diff --git a/app/rdo_studio/res/new_model_template/template_3/template_3.evn b/app/rdo_studio/res/new_model_template/template_3/template_3.evn index 5a1dde2d0..d8328f9ab 100644 --- a/app/rdo_studio/res/new_model_template/template_3/template_3.evn +++ b/app/rdo_studio/res/new_model_template/template_3/template_3.evn @@ -2,22 +2,22 @@ $Pattern /* <имя_события> */ : event /* [признак_трассировки] */ $Relevant_resources /* - Здесь необходимо описать ресурсы, которые будут использоваться в событии - Эти ресурсы называются релевантными - Как правило, в событии происходит создание временных ресурсов, например, - <имя_рел_ресурса>: <Тип_временного_ресурса> Create + Здесь необходимо описать ресурсы, которые будут использоваться в событии + Эти ресурсы называются релевантными + Как правило, в событии происходит создание временных ресурсов, например, + <имя_рел_ресурса>: <Тип_временного_ресурса> Create */ // После $Body описывается использование ресурсов $Body /* <имя_релевантного_ресурса> */ - Convert_event - /* - Конвертор события. Выполняется, когда наступило время, в которое запланировано событие - Здесь могут описываться изменения над параметрами релевантных ресурсов, а так же все доступные в языке инструкции, - например, инструкции планирования событий: - <имя_события>.planning( Time_now + Интервал_между_событиями ); - */ - + Convert_event + /* + Конвертор события. Выполняется, когда наступило время, в которое запланировано событие + Здесь могут описываться изменения над параметрами релевантных ресурсов, а так же все доступные в языке инструкции, + например, инструкции планирования событий: + <имя_события>.planning( Time_now + Интервал_между_событиями ); + */ + /* <имя_релевантного_ресурса_2> и т.д. */ $End diff --git a/app/rdo_studio/res/new_model_template/template_3/template_3.fun b/app/rdo_studio/res/new_model_template/template_3/template_3.fun index 15dd91c17..7526a6464 100644 --- a/app/rdo_studio/res/new_model_template/template_3/template_3.fun +++ b/app/rdo_studio/res/new_model_template/template_3/template_3.fun @@ -4,20 +4,20 @@ $Type = algorithmic $Parameters /* Параметры функции, могут отсутствовать - <имя_параметра_функции_1> : <тип_параметра> - <имя_параметра_функции_2> : <тип_параметра> - ... - <имя_параметра_функции_n> : <тип_параметра> + <имя_параметра_функции_1> : <тип_параметра> + <имя_параметра_функции_2> : <тип_параметра> + ... + <имя_параметра_функции_n> : <тип_параметра> */ $Body /* Тело функции содержит инструкции языка Инструкция выхода из функции: result = <арифметическое_выражение> - if <логическое_выражение_1> result = <арифметическое_выражение> - if <логическое_выражение_2> result = <арифметическое_выражение> - ... - if <логическое_выражение_n> result = <арифметическое_выражение> + if <логическое_выражение_1> result = <арифметическое_выражение> + if <логическое_выражение_2> result = <арифметическое_выражение> + ... + if <логическое_выражение_n> result = <арифметическое_выражение> */ /* diff --git a/app/rdo_studio/res/new_model_template/template_3/template_3.pat b/app/rdo_studio/res/new_model_template/template_3/template_3.pat index b34794708..c7ad8174d 100644 --- a/app/rdo_studio/res/new_model_template/template_3/template_3.pat +++ b/app/rdo_studio/res/new_model_template/template_3/template_3.pat @@ -2,20 +2,20 @@ $Pattern /* <имя_образца> */ : rule /* [признак_трассировки] */ $Relevant_resources /* - Здесь необходимо описать ресурсы, которые будут использоваться в образце - Эти ресурсы называются релевантными + Здесь необходимо описать ресурсы, которые будут использоваться в образце + Эти ресурсы называются релевантными */ // После $Body описывается использование ресурсов $Body /* <имя_релевантного_ресурса> */ - Choice from /* <логическое_выражение>, с помощью которого выбирается рел. ресурс */ - first /* Если рел. ресурсов несколько, то будет выбран первый из них */ - Convert_rule - /* - Конвертор правила. Выполняется, если <логическое_выражение> вернуло значение ИСТИНА - Здесь описываются изменения над параметрами релевантных ресурсов - */ - + Choice from /* <логическое_выражение>, с помощью которого выбирается рел. ресурс */ + first /* Если рел. ресурсов несколько, то будет выбран первый из них */ + Convert_rule + /* + Конвертор правила. Выполняется, если <логическое_выражение> вернуло значение ИСТИНА + Здесь описываются изменения над параметрами релевантных ресурсов + */ + /* <имя_релевантного_ресурса_2> и т.д. */ $End @@ -25,25 +25,25 @@ $End $Pattern /* <имя_образца> */ : operation /* [признак_трассировки] */ $Relevant_resources /* - Здесь необходимо описать ресурсы, которые будут использоваться в образце - Эти ресурсы называются релевантными + Здесь необходимо описать ресурсы, которые будут использоваться в образце + Эти ресурсы называются релевантными */ $Time = /* Длительность операции */ // После $Body описывается использование ресурсов $Body /* <имя_релевантного_ресурса> */ - Choice from /* <логическое_выражение>, с помощью которого выбирается рел. ресурс */ - first /* Если рел. ресурсов несколько, то будет выбран первый из них */ - Convert_begin - /* - Конвертор начала. Выполняется, если <логическое_выражение> вернуло значение ИСТИНА - Здесь описываются изменения над параметрами релевантных ресурсов - */ - Convert_end - /* - Конвертор конца. Выполняется по истечении времени $Time - */ - + Choice from /* <логическое_выражение>, с помощью которого выбирается рел. ресурс */ + first /* Если рел. ресурсов несколько, то будет выбран первый из них */ + Convert_begin + /* + Конвертор начала. Выполняется, если <логическое_выражение> вернуло значение ИСТИНА + Здесь описываются изменения над параметрами релевантных ресурсов + */ + Convert_end + /* + Конвертор конца. Выполняется по истечении времени $Time + */ + /* <имя_релевантного_ресурса_2> и т.д. */ /* diff --git a/app/rdo_studio/res/new_model_template/template_3/template_3.pmd b/app/rdo_studio/res/new_model_template/template_3/template_3.pmd index 574c6d3e3..b4105ec46 100644 --- a/app/rdo_studio/res/new_model_template/template_3/template_3.pmd +++ b/app/rdo_studio/res/new_model_template/template_3/template_3.pmd @@ -1,10 +1,10 @@ // Собираемые показатели модели $Results /* - <имя_показателя_1> : watch_par <арифметическое_выражение> // Наблюдать значение параметра ресурса - <имя_показателя_2> : watch_state <логическое_выражение> // Наблюдать состояние системы - <имя_показателя_3> : watch_quant <временный_ресурс> // Наблюдать количество временных ресурсов - <имя_показателя_4> : watch_value <арифметическое_выражение> // Наблюдать значение параметра временного ресурса в момент уничтожения ресурса - <имя_показателя_5> : get_value <арифметическое_выражение> // Наблюдать значение в момент окончания прогона + <имя_показателя_1> : watch_par <арифметическое_выражение> // Наблюдать значение параметра ресурса + <имя_показателя_2> : watch_state <логическое_выражение> // Наблюдать состояние системы + <имя_показателя_3> : watch_quant <временный_ресурс> // Наблюдать количество временных ресурсов + <имя_показателя_4> : watch_value <арифметическое_выражение> // Наблюдать значение параметра временного ресурса в момент уничтожения ресурса + <имя_показателя_5> : get_value <арифметическое_выражение> // Наблюдать значение в момент окончания прогона */ $End diff --git a/app/rdo_studio/res/new_model_template/template_3/template_3.prc b/app/rdo_studio/res/new_model_template/template_3/template_3.prc index 9287117a0..5fca1ed1a 100644 --- a/app/rdo_studio/res/new_model_template/template_3/template_3.prc +++ b/app/rdo_studio/res/new_model_template/template_3/template_3.prc @@ -3,14 +3,14 @@ $Process /* Внутри блока Process используются процессные операторы, например: - GENERATE время_между_созданием транзактов // Создание транзакта - - QUEUE очередь // Появление в очереди - SEIZE ресурс // Захват ресурса - DEPART очередь // Уход из очереди - ADVANCE время_обслуживания // Выполнение операции - RELEASE ресурс // Освобождение ресурса - - TERMINATE 1 // Удаление транзактов и увеличение терминального счетчика на 1 + GENERATE время_между_созданием транзактов // Создание транзакта + + QUEUE очередь // Появление в очереди + SEIZE ресурс // Захват ресурса + DEPART очередь // Уход из очереди + ADVANCE время_обслуживания // Выполнение операции + RELEASE ресурс // Освобождение ресурса + + TERMINATE 1 // Удаление транзактов и увеличение терминального счетчика на 1 */ $End diff --git a/app/rdo_studio/res/new_model_template/template_3/template_3.rdox b/app/rdo_studio/res/new_model_template/template_3/template_3.rdox index b1c8636e2..1ccaaaf7c 100644 --- a/app/rdo_studio/res/new_model_template/template_3/template_3.rdox +++ b/app/rdo_studio/res/new_model_template/template_3/template_3.rdox @@ -1,4 +1,4 @@ - + diff --git a/app/rdo_studio/res/new_model_template/template_3/template_3.rss b/app/rdo_studio/res/new_model_template/template_3/template_3.rss index 4c01932ca..a2a43db30 100644 --- a/app/rdo_studio/res/new_model_template/template_3/template_3.rss +++ b/app/rdo_studio/res/new_model_template/template_3/template_3.rss @@ -1,13 +1,13 @@ // Здесь определяются все постоянные ресурсы $Resources /* - <имя_ресурса_1> = <имя_типа_ресурса>(<начальные_значения_параметров>); - [<вызов_метода_трассировки>] - <имя_ресурса_2> = <имя_типа_ресурса>(<начальные_значения_параметров>); - [<вызов_метода_трассировки>] - ... - <имя_ресурса_n> = <имя_типа_ресурса>(<начальные_значения_параметров>); - [<вызов_метода_трассировки>] + <имя_ресурса_1> = <имя_типа_ресурса>(<начальные_значения_параметров>); + [<вызов_метода_трассировки>] + <имя_ресурса_2> = <имя_типа_ресурса>(<начальные_значения_параметров>); + [<вызов_метода_трассировки>] + ... + <имя_ресурса_n> = <имя_типа_ресурса>(<начальные_значения_параметров>); + [<вызов_метода_трассировки>] */ $End diff --git a/app/rdo_studio/res/new_model_template/template_3/template_3.rtp b/app/rdo_studio/res/new_model_template/template_3/template_3.rtp index 2b0f3345d..ba0a0f85d 100644 --- a/app/rdo_studio/res/new_model_template/template_3/template_3.rtp +++ b/app/rdo_studio/res/new_model_template/template_3/template_3.rtp @@ -2,20 +2,20 @@ $Resource_type /* <имя_типа_ресурса_1> */ : permanent /* Ресурсы будут постоянными */ $Parameters /* - <имя_параметра_1> : <тип_параметра> [ = <значение_по_умолчанию> ] - <имя_параметра_2> : <тип_параметра> [ = <значение_по_умолчанию> ] - ... - <имя_параметра_n> : <тип_параметра> [ = <значение_по_умолчанию> ] + <имя_параметра_1> : <тип_параметра> [ = <значение_по_умолчанию> ] + <имя_параметра_2> : <тип_параметра> [ = <значение_по_умолчанию> ] + ... + <имя_параметра_n> : <тип_параметра> [ = <значение_по_умолчанию> ] */ $End $Resource_type /* <имя_типа_ресурса_2> */ : temporary /* Ресурсы будут временный */ $Parameters /* - <имя_параметра_1> : <тип_параметра> [ = <значение_по_умолчанию> ] - <имя_параметра_2> : <тип_параметра> [ = <значение_по_умолчанию> ] - ... - <имя_параметра_n> : <тип_параметра> [ = <значение_по_умолчанию> ] + <имя_параметра_1> : <тип_параметра> [ = <значение_по_умолчанию> ] + <имя_параметра_2> : <тип_параметра> [ = <значение_по_умолчанию> ] + ... + <имя_параметра_n> : <тип_параметра> [ = <значение_по_умолчанию> ] */ $End diff --git a/app/rdo_studio/res/new_model_template/template_4/template_4.dpt b/app/rdo_studio/res/new_model_template/template_4/template_4.dpt index 46e362c4f..e0c7034a5 100644 --- a/app/rdo_studio/res/new_model_template/template_4/template_4.dpt +++ b/app/rdo_studio/res/new_model_template/template_4/template_4.dpt @@ -1,5 +1,5 @@ $Decision_point model: some $Condition NoCheck $Activities - Обслуживание_клиента: Образец_обслуживания_клиента + Обслуживание_клиента: Образец_обслуживания_клиента $End diff --git a/app/rdo_studio/res/new_model_template/template_4/template_4.evn b/app/rdo_studio/res/new_model_template/template_4/template_4.evn index 1796b65ad..0909c703b 100644 --- a/app/rdo_studio/res/new_model_template/template_4/template_4.evn +++ b/app/rdo_studio/res/new_model_template/template_4/template_4.evn @@ -1,9 +1,9 @@ $Pattern Образец_прихода_клиента : event $Relevant_resources - _Парикмахерская: Парикмахерская Keep + _Парикмахерская: Парикмахерская Keep $Body _Парикмахерская: - Convert_event - Образец_прихода_клиента.planning( time_now + Интервал_прихода( 30 ) ); - количество_в_очереди++; + Convert_event + Образец_прихода_клиента.planning( time_now + Интервал_прихода( 30 ) ); + количество_в_очереди++; $End diff --git a/app/rdo_studio/res/new_model_template/template_4/template_4.pat b/app/rdo_studio/res/new_model_template/template_4/template_4.pat index e1e058d2f..7caa4610d 100644 --- a/app/rdo_studio/res/new_model_template/template_4/template_4.pat +++ b/app/rdo_studio/res/new_model_template/template_4/template_4.pat @@ -1,14 +1,14 @@ $Pattern Образец_обслуживания_клиента : operation $Relevant_resources - _Парикмахерская: Парикмахерская Keep Keep + _Парикмахерская: Парикмахерская Keep Keep $Time = Длительность_обслуживания( 20, 40 ) $Body _Парикмахерская: - Choice from _Парикмахерская.состояние_парикмахера == Свободен and _Парикмахерская.количество_в_очереди > 0 - Convert_begin - количество_в_очереди--; - состояние_парикмахера = Занят; - Convert_end - состояние_парикмахера = Свободен; - количество_обслуженных++; + Choice from _Парикмахерская.состояние_парикмахера == Свободен and _Парикмахерская.количество_в_очереди > 0 + Convert_begin + количество_в_очереди--; + состояние_парикмахера = Занят; + Convert_end + состояние_парикмахера = Свободен; + количество_обслуженных++; $End diff --git a/app/rdo_studio/res/new_model_template/template_4/template_4.pmd b/app/rdo_studio/res/new_model_template/template_4/template_4.pmd index ae297e7cb..0dc57cbe6 100644 --- a/app/rdo_studio/res/new_model_template/template_4/template_4.pmd +++ b/app/rdo_studio/res/new_model_template/template_4/template_4.pmd @@ -1,7 +1,7 @@ $Results - Занятость_парикмахера : watch_state Парикмахерская.состояние_парикмахера == Занят - Длина_очереди : watch_par Парикмахерская.количество_в_очереди - Всего_обслужено : get_value Парикмахерская.количество_обслуженных - Пропускная_способность: get_value Парикмахерская.количество_обслуженных / Time_now * 60 - Длительность_работы : get_value Time_now / 60 + Занятость_парикмахера : watch_state Парикмахерская.состояние_парикмахера == Занят + Длина_очереди : watch_par Парикмахерская.количество_в_очереди + Всего_обслужено : get_value Парикмахерская.количество_обслуженных + Пропускная_способность: get_value Парикмахерская.количество_обслуженных / Time_now * 60 + Длительность_работы : get_value Time_now / 60 $End diff --git a/app/rdo_studio/res/new_model_template/template_4/template_4.rdox b/app/rdo_studio/res/new_model_template/template_4/template_4.rdox index b1c8636e2..1ccaaaf7c 100644 --- a/app/rdo_studio/res/new_model_template/template_4/template_4.rdox +++ b/app/rdo_studio/res/new_model_template/template_4/template_4.rdox @@ -1,4 +1,4 @@ - + diff --git a/app/rdo_studio/res/new_model_template/template_4/template_4.rss b/app/rdo_studio/res/new_model_template/template_4/template_4.rss index 046054ec2..c3840a33b 100644 --- a/app/rdo_studio/res/new_model_template/template_4/template_4.rss +++ b/app/rdo_studio/res/new_model_template/template_4/template_4.rss @@ -1,4 +1,4 @@ $Resources - Парикмахерская = Парикмахерские(Свободен, 0, 0); - Парикмахерская.trace(); + Парикмахерская = Парикмахерские(Свободен, 0, 0); + Парикмахерская.trace(); $End diff --git a/app/rdo_studio/res/new_model_template/template_4/template_4.rtp b/app/rdo_studio/res/new_model_template/template_4/template_4.rtp index 3b17a57f8..7917eb0b0 100644 --- a/app/rdo_studio/res/new_model_template/template_4/template_4.rtp +++ b/app/rdo_studio/res/new_model_template/template_4/template_4.rtp @@ -1,6 +1,6 @@ $Resource_type Парикмахерские: permanent $Parameters - состояние_парикмахера : ( Свободен, Занят ) - количество_в_очереди : integer - количество_обслуженных: integer + состояние_парикмахера : ( Свободен, Занят ) + количество_в_очереди : integer + количество_обслуженных: integer $End diff --git a/app/rdo_studio/res/new_model_template/template_5/template_5.dpt b/app/rdo_studio/res/new_model_template/template_5/template_5.dpt index 4c9f59aca..a83ae29eb 100644 --- a/app/rdo_studio/res/new_model_template/template_5/template_5.dpt +++ b/app/rdo_studio/res/new_model_template/template_5/template_5.dpt @@ -1,13 +1,13 @@ $Decision_point model: some $Condition NoCheck $Activities - // Описанные на закладке PAT образцы не будут использоваться в модели, если - // по ним не определены операции на закладке DPT. PAT и DPT, находятся в такой же - // логической зависимости, как и RTP и RSS, т.е. существует возможность от одного - // образца создать несколько операций, которые могут отличаться значениями - // параметров (операций), но это не используется в данном примере. - // Определим по одной операции от каждого образца. - Обслуживание_клиента: Образец_обслуживания_клиента + // Описанные на закладке PAT образцы не будут использоваться в модели, если + // по ним не определены операции на закладке DPT. PAT и DPT, находятся в такой же + // логической зависимости, как и RTP и RSS, т.е. существует возможность от одного + // образца создать несколько операций, которые могут отличаться значениями + // параметров (операций), но это не используется в данном примере. + // Определим по одной операции от каждого образца. + Обслуживание_клиента: Образец_обслуживания_клиента /* Замечание: 1. Если в модели появляется хотя бы одна операция типа operation, то она будет запускаться @@ -18,9 +18,9 @@ $Activities четыре операции перемещения по четырем направлениям создаются на основе одного образца, в котором описывается перемещению в любую сторону. При этом, конкретное направление задается через параметры каждой операции: - Прокрутка_Вправо: _Прокрутка 'RIGHT' 1 0 -1 - Прокрутка_Влево : _Прокрутка 'LEFT' 1 0 +1 - Прокрутка_Вверх : _Прокрутка 'UP' 0 1 +1 - Прокрутка_Вниз : _Прокрутка 'DOWN' 0 1 -1 + Прокрутка_Вправо: _Прокрутка 'RIGHT' 1 0 -1 + Прокрутка_Влево : _Прокрутка 'LEFT' 1 0 +1 + Прокрутка_Вверх : _Прокрутка 'UP' 0 1 +1 + Прокрутка_Вниз : _Прокрутка 'DOWN' 0 1 -1 */ $End \ No newline at end of file diff --git a/app/rdo_studio/res/new_model_template/template_5/template_5.evn b/app/rdo_studio/res/new_model_template/template_5/template_5.evn index 648b67235..04910a3a4 100644 --- a/app/rdo_studio/res/new_model_template/template_5/template_5.evn +++ b/app/rdo_studio/res/new_model_template/template_5/template_5.evn @@ -1,16 +1,16 @@ // Приход клиента описывается событием event $Pattern Событие_прихода_клиента : event $Relevant_resources - // В качестве релевантного выбирается единственный ресурс модели (см. RSS), - // который изменяется (Keep) в образце - _Парикмахерская: Парикмахерская Keep + // В качестве релевантного выбирается единственный ресурс модели (см. RSS), + // который изменяется (Keep) в образце + _Парикмахерская: Парикмахерская Keep $Body _Парикмахерская: - Convert_event - // Клиенты приходят с периодичностью в 30 минут по экспоненциальному закону (см. FUN), - // поэтому в момент наступления События_прихода_клиента планируется следующее Событие_прихода_клиента - Событие_прихода_клиента.planning( time_now + Интервал_прихода( 30 ) ); - // Сразу после прихода клиент перемещается в очередь, что увеличивает её на 1 - // реализовано с помощью оператора инкремента - количество_в_очереди++; + Convert_event + // Клиенты приходят с периодичностью в 30 минут по экспоненциальному закону (см. FUN), + // поэтому в момент наступления События_прихода_клиента планируется следующее Событие_прихода_клиента + Событие_прихода_клиента.planning( time_now + Интервал_прихода( 30 ) ); + // Сразу после прихода клиент перемещается в очередь, что увеличивает её на 1 + // реализовано с помощью оператора инкремента + количество_в_очереди++; $End \ No newline at end of file diff --git a/app/rdo_studio/res/new_model_template/template_5/template_5.pat b/app/rdo_studio/res/new_model_template/template_5/template_5.pat index 8b7d2c166..295e11417 100644 --- a/app/rdo_studio/res/new_model_template/template_5/template_5.pat +++ b/app/rdo_studio/res/new_model_template/template_5/template_5.pat @@ -2,25 +2,25 @@ // т.к. операция обслуживания имеет длительность и условие начала $Pattern Образец_обслуживания_клиента : operation $Relevant_resources - // В качестве релевантного выбирается единственный ресурс модели (см. RSS), - // который изменяется (Keep/Keep) и в начале и в конце образца - _Парикмахерская: Парикмахерская Keep Keep + // В качестве релевантного выбирается единственный ресурс модели (см. RSS), + // который изменяется (Keep/Keep) и в начале и в конце образца + _Парикмахерская: Парикмахерская Keep Keep $Time = Длительность_обслуживания( 20, 40 ) // Продолжительность стрижки выбирается // в интервале от 20 до 40 минут - // по равномерному закону, см. FUN + // по равномерному закону, см. FUN $Body _Парикмахерская: - // Стрижка может начаться, если парикмахер свободен, а очередь не пуста - Choice from _Парикмахерская.состояние_парикмахера == Свободен and _Парикмахерская.количество_в_очереди > 0 - Convert_begin - // В начале действия клиент перемещается из очереди в кресло парикмахера, а... - количество_в_очереди--; - // ...сам парикмахер переходит в состояние Занят - состояние_парикмахера = Занят; - // Между событиями начала и конца будет выдержана пауза, величиной в $Time - Convert_end - // После стрижки парикмахер становится свободным, и... - состояние_парикмахера = Свободен; - // ...увеличивается счетчик обслуженных клиентов для сбора статистики - количество_обслуженных++; + // Стрижка может начаться, если парикмахер свободен, а очередь не пуста + Choice from _Парикмахерская.состояние_парикмахера == Свободен and _Парикмахерская.количество_в_очереди > 0 + Convert_begin + // В начале действия клиент перемещается из очереди в кресло парикмахера, а... + количество_в_очереди--; + // ...сам парикмахер переходит в состояние Занят + состояние_парикмахера = Занят; + // Между событиями начала и конца будет выдержана пауза, величиной в $Time + Convert_end + // После стрижки парикмахер становится свободным, и... + состояние_парикмахера = Свободен; + // ...увеличивается счетчик обслуженных клиентов для сбора статистики + количество_обслуженных++; $End \ No newline at end of file diff --git a/app/rdo_studio/res/new_model_template/template_5/template_5.pmd b/app/rdo_studio/res/new_model_template/template_5/template_5.pmd index b59dceb41..9b87e8210 100644 --- a/app/rdo_studio/res/new_model_template/template_5/template_5.pmd +++ b/app/rdo_studio/res/new_model_template/template_5/template_5.pmd @@ -1,31 +1,31 @@ $Results - // Собираем информацию о состоянии системы, которое задается через логическое выражение - // Парикмахерская.состояние_парикмахера = Занят, т.е. считаем загрузку парикмахера. - // Подсчет статистики ведется для тех моментов времени, когда значение логического - // выражения истинно. - Занятость_парикмахера : watch_state Парикмахерская.состояние_парикмахера == Занят + // Собираем информацию о состоянии системы, которое задается через логическое выражение + // Парикмахерская.состояние_парикмахера = Занят, т.е. считаем загрузку парикмахера. + // Подсчет статистики ведется для тех моментов времени, когда значение логического + // выражения истинно. + Занятость_парикмахера : watch_state Парикмахерская.состояние_парикмахера == Занят - // Наблюдаем за всеми изменениями параметра ресурса и собираем статистику - // (но не строим график, для этого используется trace на закладке RSS) - Длина_очереди : watch_par Парикмахерская.количество_в_очереди + // Наблюдаем за всеми изменениями параметра ресурса и собираем статистику + // (но не строим график, для этого используется trace на закладке RSS) + Длина_очереди : watch_par Парикмахерская.количество_в_очереди - // Количество обслуженных клиентов выводится как значение параметра - // на конец моделирования без какой-либо дополнительной обработки - Всего_обслужено : get_value Парикмахерская.количество_обслуженных + // Количество обслуженных клиентов выводится как значение параметра + // на конец моделирования без какой-либо дополнительной обработки + Всего_обслужено : get_value Парикмахерская.количество_обслуженных - // Количество обслуженных клиентов за один час работы парикмахерской - Пропускная_способность: get_value Парикмахерская.количество_обслуженных / Time_now * 60 - - // Длительность работы парикмахерской в часах - Длительность_работы : get_value Time_now / 60 + // Количество обслуженных клиентов за один час работы парикмахерской + Пропускная_способность: get_value Парикмахерская.количество_обслуженных / Time_now * 60 + + // Длительность работы парикмахерской в часах + Длительность_работы : get_value Time_now / 60 /* После расчета будет получен результат: -Занятость_парикмахера TRUE 149 0.877315 136115 20.0211 39.9958 -Длина_очереди 3 303 2.75699 1.56872e+006 0 9 -Всего_обслужено 150 -Пропускная_способность 1.78177 -Длительность_работы 84.186 +Занятость_парикмахера TRUE 149 0.877315 136115 20.0211 39.9958 +Длина_очереди 3 303 2.75699 1.56872e+006 0 9 +Всего_обслужено 150 +Пропускная_способность 1.78177 +Длительность_работы 84.186 Занятость_парикмахера: 0.877315 (т.е. 87.73%) Длина_очереди : средняя 2.75699, минимальная 0, максимальная 9 diff --git a/app/rdo_studio/res/new_model_template/template_5/template_5.rdox b/app/rdo_studio/res/new_model_template/template_5/template_5.rdox index b1c8636e2..1ccaaaf7c 100644 --- a/app/rdo_studio/res/new_model_template/template_5/template_5.rdox +++ b/app/rdo_studio/res/new_model_template/template_5/template_5.rdox @@ -1,4 +1,4 @@ - + diff --git a/app/rdo_studio/res/new_model_template/template_5/template_5.rss b/app/rdo_studio/res/new_model_template/template_5/template_5.rss index f956fd2e7..752a290d5 100644 --- a/app/rdo_studio/res/new_model_template/template_5/template_5.rss +++ b/app/rdo_studio/res/new_model_template/template_5/template_5.rss @@ -1,14 +1,14 @@ $Resources - // Создаем ресурс по определенному ранее типу. - // Метод trace() включает трассировку всех изменений параметров ресурса, - // что позволит построить, например, графики изменения параметров от времени. - // Начальные значения параметров ресурса указываются в скобках. - Парикмахерская = Парикмахерские(Свободен, 0, 0); - Парикмахерская.trace(); - - // , что означает: - // состояние_парикмахера = Свободен - // количество_в_очереди = 0 - // количество_обслуженных = 0 - // , т.е. в начале система пуста + // Создаем ресурс по определенному ранее типу. + // Метод trace() включает трассировку всех изменений параметров ресурса, + // что позволит построить, например, графики изменения параметров от времени. + // Начальные значения параметров ресурса указываются в скобках. + Парикмахерская = Парикмахерские(Свободен, 0, 0); + Парикмахерская.trace(); + + // , что означает: + // состояние_парикмахера = Свободен + // количество_в_очереди = 0 + // количество_обслуженных = 0 + // , т.е. в начале система пуста $End diff --git a/app/rdo_studio/res/new_model_template/template_5/template_5.rtp b/app/rdo_studio/res/new_model_template/template_5/template_5.rtp index 5d6059a8a..bc020d2b4 100644 --- a/app/rdo_studio/res/new_model_template/template_5/template_5.rtp +++ b/app/rdo_studio/res/new_model_template/template_5/template_5.rtp @@ -5,7 +5,7 @@ // типа ресурсы можно изменять в процессе прогона, но нельзя удалять или создавать динамически. $Resource_type Парикмахерские: permanent $Parameters - состояние_парикмахера : ( Свободен, Занят ) - количество_в_очереди : integer - количество_обслуженных: integer + состояние_парикмахера : ( Свободен, Занят ) + количество_в_очереди : integer + количество_обслуженных: integer $End diff --git a/app/rdo_studio/res/new_model_template/template_6/template_6.dpt b/app/rdo_studio/res/new_model_template/template_6/template_6.dpt index 46e362c4f..e0c7034a5 100644 --- a/app/rdo_studio/res/new_model_template/template_6/template_6.dpt +++ b/app/rdo_studio/res/new_model_template/template_6/template_6.dpt @@ -1,5 +1,5 @@ $Decision_point model: some $Condition NoCheck $Activities - Обслуживание_клиента: Образец_обслуживания_клиента + Обслуживание_клиента: Образец_обслуживания_клиента $End diff --git a/app/rdo_studio/res/new_model_template/template_6/template_6.evn b/app/rdo_studio/res/new_model_template/template_6/template_6.evn index 3842935ab..7d3248e48 100644 --- a/app/rdo_studio/res/new_model_template/template_6/template_6.evn +++ b/app/rdo_studio/res/new_model_template/template_6/template_6.evn @@ -1,15 +1,15 @@ $Pattern Образец_прихода_клиента : event $Relevant_resources - _Парикмахерская: Парикмахерская Keep - _Клиент : Клиенты Create + _Парикмахерская: Парикмахерская Keep + _Клиент : Клиенты Create $Body _Парикмахерская: - Convert_event - Образец_прихода_клиента.planning( time_now + Интервал_прихода( 30 ) ); - количество_в_очереди++; + Convert_event + Образец_прихода_клиента.planning( time_now + Интервал_прихода( 30 ) ); + количество_в_очереди++; _Клиент: - Convert_event trace - тип = Тип_клиента; - состояние = Пришел; + Convert_event trace + тип = Тип_клиента; + состояние = Пришел; $End diff --git a/app/rdo_studio/res/new_model_template/template_6/template_6.fun b/app/rdo_studio/res/new_model_template/template_6/template_6.fun index 010362fdd..9e3d7583e 100644 --- a/app/rdo_studio/res/new_model_template/template_6/template_6.fun +++ b/app/rdo_studio/res/new_model_template/template_6/template_6.fun @@ -9,6 +9,6 @@ $End $Sequence Тип_клиента : such_as Клиенты.тип $Type = by_hist 123456789 $Body - Тип1 1.0 - Тип2 5.0 + Тип1 1.0 + Тип2 5.0 $End diff --git a/app/rdo_studio/res/new_model_template/template_6/template_6.pat b/app/rdo_studio/res/new_model_template/template_6/template_6.pat index 47d5471fb..239e13d4f 100644 --- a/app/rdo_studio/res/new_model_template/template_6/template_6.pat +++ b/app/rdo_studio/res/new_model_template/template_6/template_6.pat @@ -1,26 +1,26 @@ $Pattern Образец_обслуживания_клиента : operation $Relevant_resources - _Парикмахерская: Парикмахерская Keep NoChange - _Клиент : Клиенты Keep Erase - _Парикмахер : Парикмахеры Keep Keep + _Парикмахерская: Парикмахерская Keep NoChange + _Клиент : Клиенты Keep Erase + _Парикмахер : Парикмахеры Keep Keep $Time = Длительность_обслуживания( _Парикмахер.длительность_min, _Парикмахер.длительность_max ) $Body _Парикмахерская: - Choice from _Парикмахерская.количество_в_очереди > 0 - Convert_begin - количество_в_очереди--; + Choice from _Парикмахерская.количество_в_очереди > 0 + Convert_begin + количество_в_очереди--; _Клиент: - Choice from _Клиент.состояние == Пришел - Convert_begin - состояние = Начал_стрижку; + Choice from _Клиент.состояние == Пришел + Convert_begin + состояние = Начал_стрижку; _Парикмахер: - Choice from _Парикмахер.состояние_парикмахера == Свободен and _Парикмахер.тип_клиента == _Клиент.тип - with_min( _Парикмахер.количество_обслуженных ) - Convert_begin - состояние_парикмахера = Занят; - Convert_end - состояние_парикмахера = Свободен; - количество_обслуженных++; + Choice from _Парикмахер.состояние_парикмахера == Свободен and _Парикмахер.тип_клиента == _Клиент.тип + with_min( _Парикмахер.количество_обслуженных ) + Convert_begin + состояние_парикмахера = Занят; + Convert_end + состояние_парикмахера = Свободен; + количество_обслуженных++; $End diff --git a/app/rdo_studio/res/new_model_template/template_6/template_6.pmd b/app/rdo_studio/res/new_model_template/template_6/template_6.pmd index 679a21b00..50080a454 100644 --- a/app/rdo_studio/res/new_model_template/template_6/template_6.pmd +++ b/app/rdo_studio/res/new_model_template/template_6/template_6.pmd @@ -1,9 +1,9 @@ $Results - Занятость_парикмахера_1 : watch_state Парикмахер_1.состояние_парикмахера == Занят - Занятость_парикмахера_2 : watch_state Парикмахер_2.состояние_парикмахера == Занят - Занятость_парикмахера_3 : watch_state Парикмахер_3.состояние_парикмахера == Занят - Обслужено_парикмахером_1: get_value Парикмахер_1.количество_обслуженных - Обслужено_парикмахером_2: get_value Парикмахер_2.количество_обслуженных - Обслужено_парикмахером_3: get_value Парикмахер_3.количество_обслуженных - Длина_очереди : watch_par Парикмахерская.количество_в_очереди + Занятость_парикмахера_1 : watch_state Парикмахер_1.состояние_парикмахера == Занят + Занятость_парикмахера_2 : watch_state Парикмахер_2.состояние_парикмахера == Занят + Занятость_парикмахера_3 : watch_state Парикмахер_3.состояние_парикмахера == Занят + Обслужено_парикмахером_1: get_value Парикмахер_1.количество_обслуженных + Обслужено_парикмахером_2: get_value Парикмахер_2.количество_обслуженных + Обслужено_парикмахером_3: get_value Парикмахер_3.количество_обслуженных + Длина_очереди : watch_par Парикмахерская.количество_в_очереди $End diff --git a/app/rdo_studio/res/new_model_template/template_6/template_6.rdox b/app/rdo_studio/res/new_model_template/template_6/template_6.rdox index b1c8636e2..1ccaaaf7c 100644 --- a/app/rdo_studio/res/new_model_template/template_6/template_6.rdox +++ b/app/rdo_studio/res/new_model_template/template_6/template_6.rdox @@ -1,4 +1,4 @@ - + diff --git a/app/rdo_studio/res/new_model_template/template_6/template_6.rss b/app/rdo_studio/res/new_model_template/template_6/template_6.rss index 44ae6e086..07b7edb95 100644 --- a/app/rdo_studio/res/new_model_template/template_6/template_6.rss +++ b/app/rdo_studio/res/new_model_template/template_6/template_6.rss @@ -1,10 +1,10 @@ $Resources - Парикмахерская = Парикмахерские(0); - Парикмахерская.trace(); - Парикмахер_1 = Парикмахеры(*, 0, 20, 40, Тип1); - Парикмахер_1.trace(); - Парикмахер_2 = Парикмахеры(*, 0, 25, 70, Тип2); - Парикмахер_2.trace(); - Парикмахер_3 = Парикмахеры(*, 0, 30, 60, Тип2); - Парикмахер_3.trace(); + Парикмахерская = Парикмахерские(0); + Парикмахерская.trace(); + Парикмахер_1 = Парикмахеры(*, 0, 20, 40, Тип1); + Парикмахер_1.trace(); + Парикмахер_2 = Парикмахеры(*, 0, 25, 70, Тип2); + Парикмахер_2.trace(); + Парикмахер_3 = Парикмахеры(*, 0, 30, 60, Тип2); + Парикмахер_3.trace(); $End diff --git a/app/rdo_studio/res/new_model_template/template_6/template_6.rtp b/app/rdo_studio/res/new_model_template/template_6/template_6.rtp index a9c66e958..eb123e3cf 100644 --- a/app/rdo_studio/res/new_model_template/template_6/template_6.rtp +++ b/app/rdo_studio/res/new_model_template/template_6/template_6.rtp @@ -1,19 +1,19 @@ $Resource_type Парикмахерские: permanent $Parameters - количество_в_очереди: integer + количество_в_очереди: integer $End $Resource_type Клиенты : temporary $Parameters - тип : ( Тип1, Тип2 ) - состояние: ( Пришел, Начал_стрижку ) + тип : ( Тип1, Тип2 ) + состояние: ( Пришел, Начал_стрижку ) $End $Resource_type Парикмахеры: permanent $Parameters - состояние_парикмахера : ( Свободен, Занят ) = Свободен - количество_обслуженных: integer - длительность_min : integer - длительность_max : integer - тип_клиента : such_as Клиенты.тип + состояние_парикмахера : ( Свободен, Занят ) = Свободен + количество_обслуженных: integer + длительность_min : integer + длительность_max : integer + тип_клиента : such_as Клиенты.тип $End diff --git a/app/rdo_studio/res/new_model_template/template_7/template_7.dpt b/app/rdo_studio/res/new_model_template/template_7/template_7.dpt index 8e450a6a1..acad10bd2 100644 --- a/app/rdo_studio/res/new_model_template/template_7/template_7.dpt +++ b/app/rdo_studio/res/new_model_template/template_7/template_7.dpt @@ -1,13 +1,13 @@ $Decision_point model: some $Condition NoCheck $Activities - // Описанные на закладке PAT образцы не будут использоваться в модели, если - // по ним не определены операции на закладке DPT. PAT и DPT, находятся в такой же - // логической зависимости, как и RTP и RSS, т.е. существует возможность от одного - // образца создать несколько операций, которые могут отличаться значениями - // параметров (операций), но это не используется в данном примере. - // Определим по одной операции от каждого образца. - Обслуживание_клиента: Образец_обслуживания_клиента + // Описанные на закладке PAT образцы не будут использоваться в модели, если + // по ним не определены операции на закладке DPT. PAT и DPT, находятся в такой же + // логической зависимости, как и RTP и RSS, т.е. существует возможность от одного + // образца создать несколько операций, которые могут отличаться значениями + // параметров (операций), но это не используется в данном примере. + // Определим по одной операции от каждого образца. + Обслуживание_клиента: Образец_обслуживания_клиента /* Замечание: 1. Если в модели появляется хотя бы одна операция типа operation, то она будет запускаться @@ -18,9 +18,9 @@ $Activities четыре операции перемещения по четырем направлениям создаются на основе одного образца, в котором описывается перемещению в любую сторону. При этом, конкретное направление задается через параметры каждой операции: - Прокрутка_Вправо: _Прокрутка 'RIGHT' 1 0 -1 - Прокрутка_Влево : _Прокрутка 'LEFT' 1 0 +1 - Прокрутка_Вверх : _Прокрутка 'UP' 0 1 +1 - Прокрутка_Вниз : _Прокрутка 'DOWN' 0 1 -1 + Прокрутка_Вправо: _Прокрутка 'RIGHT' 1 0 -1 + Прокрутка_Влево : _Прокрутка 'LEFT' 1 0 +1 + Прокрутка_Вверх : _Прокрутка 'UP' 0 1 +1 + Прокрутка_Вниз : _Прокрутка 'DOWN' 0 1 -1 */ $End diff --git a/app/rdo_studio/res/new_model_template/template_7/template_7.evn b/app/rdo_studio/res/new_model_template/template_7/template_7.evn index a8b071b9c..a3127ee19 100644 --- a/app/rdo_studio/res/new_model_template/template_7/template_7.evn +++ b/app/rdo_studio/res/new_model_template/template_7/template_7.evn @@ -1,22 +1,22 @@ // Прихода клиента, описывает событием типа event $Pattern Событие_прихода_клиента : event $Relevant_resources - // В качестве релевантных ресурсов указываем парикмахерскую (Keep), в которую заходит - // клиент, и самого клиента, который динамически создается в этом образце (Create) - _Парикмахерская: Парикмахерская Keep - _Клиент : Клиенты Create + // В качестве релевантных ресурсов указываем парикмахерскую (Keep), в которую заходит + // клиент, и самого клиента, который динамически создается в этом образце (Create) + _Парикмахерская: Парикмахерская Keep + _Клиент : Клиенты Create $Body _Парикмахерская: - Convert_event - // Клиенты приходят с периодичностью в 30 минут по экспоненциальному закону (см. FUN), - // поэтому в момент наступления События_прихода_клиента планируется следующее Событие_прихода_клиента - Событие_прихода_клиента.planning( time_now + Интервал_прихода( 30 ) ); - // Сразу после прихода клиент перемещается в очередь, что увеличивает её на 1 - количество_в_очереди++; + Convert_event + // Клиенты приходят с периодичностью в 30 минут по экспоненциальному закону (см. FUN), + // поэтому в момент наступления События_прихода_клиента планируется следующее Событие_прихода_клиента + Событие_прихода_клиента.planning( time_now + Интервал_прихода( 30 ) ); + // Сразу после прихода клиент перемещается в очередь, что увеличивает её на 1 + количество_в_очереди++; _Клиент: - Convert_event trace // признак трассировки для временного ресурса - // При создании временного ресурса необходимо указать значения всех его параметров - тип = Тип_клиента; // Тип клиента выбирается по гисторгамме, см. FUN - состояние = Пришел; + Convert_event trace // признак трассировки для временного ресурса + // При создании временного ресурса необходимо указать значения всех его параметров + тип = Тип_клиента; // Тип клиента выбирается по гисторгамме, см. FUN + состояние = Пришел; $End diff --git a/app/rdo_studio/res/new_model_template/template_7/template_7.fun b/app/rdo_studio/res/new_model_template/template_7/template_7.fun index a224a4236..748d3ec86 100644 --- a/app/rdo_studio/res/new_model_template/template_7/template_7.fun +++ b/app/rdo_studio/res/new_model_template/template_7/template_7.fun @@ -12,6 +12,6 @@ $End $Sequence Тип_клиента : such_as Клиенты.тип $Type = by_hist 123456789 $Body - Тип1 1.0 - Тип2 5.0 + Тип1 1.0 + Тип2 5.0 $End diff --git a/app/rdo_studio/res/new_model_template/template_7/template_7.pat b/app/rdo_studio/res/new_model_template/template_7/template_7.pat index 94ca5be79..0009c2ae5 100644 --- a/app/rdo_studio/res/new_model_template/template_7/template_7.pat +++ b/app/rdo_studio/res/new_model_template/template_7/template_7.pat @@ -2,17 +2,17 @@ // т.к. операция обслуживания имеет длительность и условие начала $Pattern Образец_обслуживания_клиента : operation $Relevant_resources - // В качестве релевантных ресурсов указываем: - // 1. Единственную парикмахерскую, в котрую приходят клиенты - // 2. Одного из клиентов, который находится в состоянии Пришел - // 3. Одного из парикмахеров, который может (состояние = Свободен) и - // умеет (совпал тип) стрич выбранного клиента - // При этом, состояние парикмахерской изменяется только в начале действия (Keep/NoChange), - // клиент вообще будет удален из модели в конце стрижки (Keep/Erase), а парикмахер - // изменяет свое состояние и в начале и в конце стрижки (Keep/Keep) - _Парикмахерская: Парикмахерская Keep NoChange - _Клиент : Клиенты Keep Erase - _Парикмахер : Парикмахеры Keep Keep + // В качестве релевантных ресурсов указываем: + // 1. Единственную парикмахерскую, в котрую приходят клиенты + // 2. Одного из клиентов, который находится в состоянии Пришел + // 3. Одного из парикмахеров, который может (состояние = Свободен) и + // умеет (совпал тип) стрич выбранного клиента + // При этом, состояние парикмахерской изменяется только в начале действия (Keep/NoChange), + // клиент вообще будет удален из модели в конце стрижки (Keep/Erase), а парикмахер + // изменяет свое состояние и в начале и в конце стрижки (Keep/Keep) + _Парикмахерская: Парикмахерская Keep NoChange + _Клиент : Клиенты Keep Erase + _Парикмахер : Парикмахеры Keep Keep $Time = Длительность_обслуживания( _Парикмахер.длительность_min, _Парикмахер.длительность_max ) /* Продолжительность стрижки выбирается по равномерному закону (см. FUN), параметры @@ -20,32 +20,32 @@ $Time = Длительность_обслуживания( _Парикмахер */ $Body _Парикмахерская: - // Стрижка может начаться, если очередь не пуста - Choice from _Парикмахерская.количество_в_очереди > 0 - Convert_begin - // В начале действия клиент перемещается из очереди в кресло парикмахера - количество_в_очереди--; + // Стрижка может начаться, если очередь не пуста + Choice from _Парикмахерская.количество_в_очереди > 0 + Convert_begin + // В начале действия клиент перемещается из очереди в кресло парикмахера + количество_в_очереди--; _Клиент: - // Выбираем клиента, который еще не начал стрижку - Choice from _Клиент.состояние == Пришел - Convert_begin - // В начале действия изменяем состояние клиента, чтобы его не подстригли дважды - состояние = Начал_стрижку; + // Выбираем клиента, который еще не начал стрижку + Choice from _Клиент.состояние == Пришел + Convert_begin + // В начале действия изменяем состояние клиента, чтобы его не подстригли дважды + состояние = Начал_стрижку; _Парикмахер: - // Стрижка может начаться, если парикмахер свободен, и он умеет стрич выбранного клиента - Choice from _Парикмахер.состояние_парикмахера == Свободен and _Парикмахер.тип_клиента == _Клиент.тип - with_min( _Парикмахер.количество_обслуженных ) // Если сразу несколько парикмахеров - // удовлетворяют условию Choice from, то - // выбрать того из них, кто меньше всего - // подстриг клиентов - Convert_begin - // В начале действия парикмахер переходит в состояние Занят - состояние_парикмахера = Занят; - Convert_end - // После стрижки парикмахер становится свободным, и... - состояние_парикмахера = Свободен; - // ...для статистики увеличим счетчик обслуженных клиентов - количество_обслуженных++; + // Стрижка может начаться, если парикмахер свободен, и он умеет стрич выбранного клиента + Choice from _Парикмахер.состояние_парикмахера == Свободен and _Парикмахер.тип_клиента == _Клиент.тип + with_min( _Парикмахер.количество_обслуженных ) // Если сразу несколько парикмахеров + // удовлетворяют условию Choice from, то + // выбрать того из них, кто меньше всего + // подстриг клиентов + Convert_begin + // В начале действия парикмахер переходит в состояние Занят + состояние_парикмахера = Занят; + Convert_end + // После стрижки парикмахер становится свободным, и... + состояние_парикмахера = Свободен; + // ...для статистики увеличим счетчик обслуженных клиентов + количество_обслуженных++; $End diff --git a/app/rdo_studio/res/new_model_template/template_7/template_7.pmd b/app/rdo_studio/res/new_model_template/template_7/template_7.pmd index e2e9f7cd0..0cb133714 100644 --- a/app/rdo_studio/res/new_model_template/template_7/template_7.pmd +++ b/app/rdo_studio/res/new_model_template/template_7/template_7.pmd @@ -1,31 +1,31 @@ $Results - // Собираем информацию о состоянии системы, которое задается через логическое выражение - // Парикмахер_1.состояние_парикмахера = Занят, т.е. считаем загрузку парикмахера. - // Подсчет статистики ведется для тех моментов времени, когда значение логического - // выражения истинно. - Занятость_парикмахера_1 : watch_state Парикмахер_1.состояние_парикмахера == Занят - Занятость_парикмахера_2 : watch_state Парикмахер_2.состояние_парикмахера == Занят - Занятость_парикмахера_3 : watch_state Парикмахер_3.состояние_парикмахера == Занят + // Собираем информацию о состоянии системы, которое задается через логическое выражение + // Парикмахер_1.состояние_парикмахера = Занят, т.е. считаем загрузку парикмахера. + // Подсчет статистики ведется для тех моментов времени, когда значение логического + // выражения истинно. + Занятость_парикмахера_1 : watch_state Парикмахер_1.состояние_парикмахера == Занят + Занятость_парикмахера_2 : watch_state Парикмахер_2.состояние_парикмахера == Занят + Занятость_парикмахера_3 : watch_state Парикмахер_3.состояние_парикмахера == Занят - // С помощью get_value получаем значение указанного параметра (выражения) - // в конце моделирования - Обслужено_парикмахером_1: get_value Парикмахер_1.количество_обслуженных - Обслужено_парикмахером_2: get_value Парикмахер_2.количество_обслуженных - Обслужено_парикмахером_3: get_value Парикмахер_3.количество_обслуженных - - // Наблюдаем за всеми изменениями параметра ресурса и собираем статистику - // (но не строим график, для этого используется trace на закладке RSS) - Длина_очереди : watch_par Парикмахерская.количество_в_очереди + // С помощью get_value получаем значение указанного параметра (выражения) + // в конце моделирования + Обслужено_парикмахером_1: get_value Парикмахер_1.количество_обслуженных + Обслужено_парикмахером_2: get_value Парикмахер_2.количество_обслуженных + Обслужено_парикмахером_3: get_value Парикмахер_3.количество_обслуженных + + // Наблюдаем за всеми изменениями параметра ресурса и собираем статистику + // (но не строим график, для этого используется trace на закладке RSS) + Длина_очереди : watch_par Парикмахерская.количество_в_очереди /* После расчета будет получен результат: -Занятость_парикмахера_1 Тип: state Посл.знач.: FALSE % соотв.: 0.128582 Мин.длит.: 20.021139 Макс.длит.: 22.963191 Числ.наб.: 30 -Занятость_парикмахера_2 Тип: state Посл.знач.: TRUE % соотв.: 0.609160 Мин.длит.: 29.277054 Макс.длит.: 69.203516 Числ.наб.: 62 -Занятость_парикмахера_3 Тип: state Посл.знач.: FALSE % соотв.: 0.577632 Мин.длит.: 35.046200 Макс.длит.: 59.993740 Числ.наб.: 61 -Обслужено_парикмахером_1 Тип: get_value Значение: 30 -Обслужено_парикмахером_2 Тип: get_value Значение: 61 -Обслужено_парикмахером_3 Тип: get_value Значение: 61 -Длина_очереди Тип: par Посл.знач.: 0 Ср.знач.: 0.585730 Мин.знач.: 0 Макс.знач.: 5 Числ.наб.: 307 Стд.откл.: 1.045320 К.вар.%: 186.552399 Медиана: 0.000052 +Занятость_парикмахера_1 Тип: state Посл.знач.: FALSE % соотв.: 0.128582 Мин.длит.: 20.021139 Макс.длит.: 22.963191 Числ.наб.: 30 +Занятость_парикмахера_2 Тип: state Посл.знач.: TRUE % соотв.: 0.609160 Мин.длит.: 29.277054 Макс.длит.: 69.203516 Числ.наб.: 62 +Занятость_парикмахера_3 Тип: state Посл.знач.: FALSE % соотв.: 0.577632 Мин.длит.: 35.046200 Макс.длит.: 59.993740 Числ.наб.: 61 +Обслужено_парикмахером_1 Тип: get_value Значение: 30 +Обслужено_парикмахером_2 Тип: get_value Значение: 61 +Обслужено_парикмахером_3 Тип: get_value Значение: 61 +Длина_очереди Тип: par Посл.знач.: 0 Ср.знач.: 0.585730 Мин.знач.: 0 Макс.знач.: 5 Числ.наб.: 307 Стд.откл.: 1.045320 К.вар.%: 186.552399 Медиана: 0.000052 Занятость_парикмахера_1: 0.128582 (т.е. 12.86%) Занятость_парикмахера_2: 0.609160 (т.е. 60.92%) diff --git a/app/rdo_studio/res/new_model_template/template_7/template_7.rdox b/app/rdo_studio/res/new_model_template/template_7/template_7.rdox index b1c8636e2..1ccaaaf7c 100644 --- a/app/rdo_studio/res/new_model_template/template_7/template_7.rdox +++ b/app/rdo_studio/res/new_model_template/template_7/template_7.rdox @@ -1,4 +1,4 @@ - + diff --git a/app/rdo_studio/res/new_model_template/template_7/template_7.rss b/app/rdo_studio/res/new_model_template/template_7/template_7.rss index 3e6e3a758..f380f175b 100644 --- a/app/rdo_studio/res/new_model_template/template_7/template_7.rss +++ b/app/rdo_studio/res/new_model_template/template_7/template_7.rss @@ -1,37 +1,37 @@ $Resources - // Создаем ресурс по определенному ранее типу. - // Метод trace() включает трассировку всех изменений параметров ресурса, - // что позволит построить, например, графики изменения параметров от времени. - // Начальные значения параметров ресурса указываются в скобках. - Парикмахерская = Парикмахерские(0); - Парикмахерская.trace(); - // , что означает: - // количество_в_очереди = 0 + // Создаем ресурс по определенному ранее типу. + // Метод trace() включает трассировку всех изменений параметров ресурса, + // что позволит построить, например, графики изменения параметров от времени. + // Начальные значения параметров ресурса указываются в скобках. + Парикмахерская = Парикмахерские(0); + Парикмахерская.trace(); + // , что означает: + // количество_в_очереди = 0 - Парикмахер_1 = Парикмахеры(*, 0, 20, 40, Тип1); - Парикмахер_1.trace(); - // , что означает: - // состояние_парикмахера = Свободен - // количество_обслуженных = 0 - // длительность_min = 20 - // длительность_max = 40 - // тип_клиента = Тип1 + Парикмахер_1 = Парикмахеры(*, 0, 20, 40, Тип1); + Парикмахер_1.trace(); + // , что означает: + // состояние_парикмахера = Свободен + // количество_обслуженных = 0 + // длительность_min = 20 + // длительность_max = 40 + // тип_клиента = Тип1 - Парикмахер_2 = Парикмахеры(*, 0, 25, 70, Тип2); - Парикмахер_2.trace(); - // , что означает: - // состояние_парикмахера = Свободен - // количество_обслуженных = 0 - // длительность_min = 25 - // длительность_max = 70 - // тип_клиента = Тип2 + Парикмахер_2 = Парикмахеры(*, 0, 25, 70, Тип2); + Парикмахер_2.trace(); + // , что означает: + // состояние_парикмахера = Свободен + // количество_обслуженных = 0 + // длительность_min = 25 + // длительность_max = 70 + // тип_клиента = Тип2 - Парикмахер_3 = Парикмахеры(*, 0, 30, 60, Тип2); - Парикмахер_3.trace(); - // , что означает: - // состояние_парикмахера = Свободен - // количество_обслуженных = 0 - // длительность_min = 30 - // длительность_max = 60 - // тип_клиента = Тип2 + Парикмахер_3 = Парикмахеры(*, 0, 30, 60, Тип2); + Парикмахер_3.trace(); + // , что означает: + // состояние_парикмахера = Свободен + // количество_обслуженных = 0 + // длительность_min = 30 + // длительность_max = 60 + // тип_клиента = Тип2 $End diff --git a/app/rdo_studio/res/new_model_template/template_7/template_7.rtp b/app/rdo_studio/res/new_model_template/template_7/template_7.rtp index 9ffbb5459..f245f2a50 100644 --- a/app/rdo_studio/res/new_model_template/template_7/template_7.rtp +++ b/app/rdo_studio/res/new_model_template/template_7/template_7.rtp @@ -7,22 +7,22 @@ // или создавать динамически $Resource_type Парикмахерские: permanent $Parameters - количество_в_очереди: integer + количество_в_очереди: integer $End // Клиенты будут динамически создаваться и удалятся. Для этого необходимо // указать в качестве вида temporary $Resource_type Клиенты : temporary $Parameters - тип : ( Тип1, Тип2 ) - состояние: ( Пришел, Начал_стрижку ) + тип : ( Тип1, Тип2 ) + состояние: ( Пришел, Начал_стрижку ) $End $Resource_type Парикмахеры: permanent $Parameters - состояние_парикмахера : ( Свободен, Занят ) = Свободен - количество_обслуженных: integer - длительность_min : integer // минимальная длительность стрижки - длительность_max : integer // максимальная длительность стрижки - тип_клиента : such_as Клиенты.тип // тип обслуживаемых клиентов + состояние_парикмахера : ( Свободен, Занят ) = Свободен + количество_обслуженных: integer + длительность_min : integer // минимальная длительность стрижки + длительность_max : integer // максимальная длительность стрижки + тип_клиента : such_as Клиенты.тип // тип обслуживаемых клиентов $End diff --git a/app/rdo_studio/res/rdo_studio.qrc b/app/rdo_studio/res/rdo_studio.qrc index 2f77e2fc0..544a01fbe 100644 --- a/app/rdo_studio/res/rdo_studio.qrc +++ b/app/rdo_studio/res/rdo_studio.qrc @@ -150,9 +150,9 @@ insert_menu_template/algo_for.txt insert_menu_template/algo_if.txt insert_menu_template/algo_if_else.txt - insert_menu_template/dtp_prior.txt - insert_menu_template/dtp_search.txt - insert_menu_template/dtp_some.txt + insert_menu_template/dpt_prior.txt + insert_menu_template/dpt_search.txt + insert_menu_template/dpt_some.txt insert_menu_template/frm.txt insert_menu_template/fun_algorithmic.txt insert_menu_template/fun_const.txt diff --git a/app/rdo_studio/src/action_activator/action_activator.cpp b/app/rdo_studio/src/action_activator/action_activator.cpp index 57990f46e..937430dc7 100644 --- a/app/rdo_studio/src/action_activator/action_activator.cpp +++ b/app/rdo_studio/src/action_activator/action_activator.cpp @@ -9,7 +9,7 @@ // -------------------------------------------------------------------------------- ActionActivator::ActionActivator() - : m_activated(false) + : m_activated(false) {} ActionActivator::~ActionActivator() @@ -17,30 +17,28 @@ ActionActivator::~ActionActivator() bool ActionActivator::isActivated() const { - return m_activated; + return m_activated; } -void ActionActivator::activate(QFocusEvent* pEvent) +void ActionActivator::activate(QFocusEvent* /*pEvent*/) { - ASSERT(pEvent); - - if (!m_activated) - { - m_activated = true; - onUpdateActions(m_activated); - } + if (!m_activated) + { + m_activated = true; + onUpdateActions(m_activated); + } } void ActionActivator::deactivate(QFocusEvent* pEvent) { - ASSERT(pEvent); + ASSERT(pEvent); - if (pEvent->reason() != Qt::PopupFocusReason) - { - if (m_activated) - { - m_activated = false; - onUpdateActions(m_activated); - } - } + if (pEvent->reason() != Qt::PopupFocusReason) + { + if (m_activated) + { + m_activated = false; + onUpdateActions(m_activated); + } + } } diff --git a/app/rdo_studio/src/action_activator/action_activator.h b/app/rdo_studio/src/action_activator/action_activator.h index 806b346fe..34f4d620a 100644 --- a/app/rdo_studio/src/action_activator/action_activator.h +++ b/app/rdo_studio/src/action_activator/action_activator.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_ACTION_ACTIVATOR_H_ -#define _RDO_STUDIO_ACTION_ACTIVATOR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -13,52 +12,50 @@ class ActionActivator { public: - template - static void updateAction(QAction* pAction, bool enabled, const typename QtPrivate::FunctionPointer::Object* pObject, SlotFun pSlot) - { - ASSERT(pAction); - - pAction->setEnabled(enabled); - if (enabled) - { - ASSERT(pObject); - QObject::connect(pAction, &QAction::triggered, pObject, pSlot, Qt::UniqueConnection); - } - else - { - QObject::disconnect(pAction, &QAction::triggered, NULL, NULL); - } - } - - template - static void updateAction(QAction* pAction, bool enabled, const F& functor) - { - ASSERT(pAction); - - pAction->setEnabled(enabled); - if (enabled) - { - QObject::connect(pAction, &QAction::triggered, functor); - } - else - { - QObject::disconnect(pAction, &QAction::triggered, NULL, NULL); - } - } + template + static void updateAction(QAction* pAction, bool enabled, const typename QtPrivate::FunctionPointer::Object* pObject, SlotFun pSlot) + { + ASSERT(pAction); + + pAction->setEnabled(enabled); + if (enabled) + { + ASSERT(pObject); + QObject::connect(pAction, &QAction::triggered, pObject, pSlot, Qt::UniqueConnection); + } + else + { + QObject::disconnect(pAction, &QAction::triggered, NULL, NULL); + } + } + + template + static void updateAction(QAction* pAction, bool enabled, const F& functor) + { + ASSERT(pAction); + + pAction->setEnabled(enabled); + if (enabled) + { + QObject::connect(pAction, &QAction::triggered, functor); + } + else + { + QObject::disconnect(pAction, &QAction::triggered, NULL, NULL); + } + } protected: - ActionActivator(); - virtual ~ActionActivator(); + ActionActivator(); + virtual ~ActionActivator(); - bool isActivated() const; + bool isActivated() const; - void activate (QFocusEvent* pEvent); - void deactivate(QFocusEvent* pEvent); + void activate (QFocusEvent* pEvent); + void deactivate(QFocusEvent* pEvent); - virtual void onUpdateActions(bool activated) = 0; + virtual void onUpdateActions(bool activated) = 0; private: - bool m_activated; + bool m_activated; }; - -#endif // _RDO_STUDIO_ACTION_ACTIVATOR_H_ diff --git a/app/rdo_studio/src/action_activator/action_activator_widget.cpp b/app/rdo_studio/src/action_activator/action_activator_widget.cpp index 19e026cde..902da66f6 100644 --- a/app/rdo_studio/src/action_activator/action_activator_widget.cpp +++ b/app/rdo_studio/src/action_activator/action_activator_widget.cpp @@ -6,7 +6,7 @@ // -------------------------------------------------------------------------------- ActionActivatorWidget::ActionActivatorWidget(QWidget* pParent) - : QWidget(pParent) + : QWidget(pParent) {} ActionActivatorWidget::~ActionActivatorWidget() @@ -14,12 +14,12 @@ ActionActivatorWidget::~ActionActivatorWidget() void ActionActivatorWidget::focusInEvent(QFocusEvent* pEvent) { - QWidget::focusInEvent(pEvent); - activate(pEvent); + QWidget::focusInEvent(pEvent); + activate(pEvent); } void ActionActivatorWidget::focusOutEvent(QFocusEvent* pEvent) { - deactivate(pEvent); - QWidget::focusOutEvent(pEvent); + deactivate(pEvent); + QWidget::focusOutEvent(pEvent); } diff --git a/app/rdo_studio/src/action_activator/action_activator_widget.h b/app/rdo_studio/src/action_activator/action_activator_widget.h index 2cd529975..8a9aad227 100644 --- a/app/rdo_studio/src/action_activator/action_activator_widget.h +++ b/app/rdo_studio/src/action_activator/action_activator_widget.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_ACTION_ACTIVATOR_WIDGET_H_ -#define _RDO_STUDIO_ACTION_ACTIVATOR_WIDGET_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -10,15 +9,13 @@ // -------------------------------------------------------------------------------- class ActionActivatorWidget - : public QWidget - , public ActionActivator + : public QWidget + , public ActionActivator { protected: - ActionActivatorWidget(QWidget* pParent); - virtual ~ActionActivatorWidget(); + ActionActivatorWidget(QWidget* pParent); + virtual ~ActionActivatorWidget(); - virtual void focusInEvent (QFocusEvent* pEvent); - virtual void focusOutEvent(QFocusEvent* pEvent); + virtual void focusInEvent (QFocusEvent* pEvent); + virtual void focusOutEvent(QFocusEvent* pEvent); }; - -#endif // _RDO_STUDIO_ACTION_ACTIVATOR_WIDGET_H_ diff --git a/app/rdo_studio/src/application.cpp b/app/rdo_studio/src/application.cpp index 18b2cf5dd..5e82da157 100644 --- a/app/rdo_studio/src/application.cpp +++ b/app/rdo_studio/src/application.cpp @@ -19,46 +19,39 @@ #include "app/rdo_studio/src/application.h" #include "app/rdo_studio/src/main_window.h" #include "app/rdo_studio/src/model/model.h" -#include "app/rdo_studio/src/thread.h" #include "app/rdo_studio/src/dialog/file_association_dialog.h" #include "app/rdo_studio/src/tracer/tracer.h" // -------------------------------------------------------------------------------- - namespace { - typedef std::map PluginOptionType; - - int validateKeyByPrefix(const std::string& key, const std::string& prefix) - { - QRegExp re(QString::fromStdString(prefix) + "(\\d+)"); - - if (re.indexIn(QString::fromStdString(key), 0) != -1) - { - return re.cap(1).toInt(); - } - else - { - return -1; - } - } - - PluginOptionType getPluginsOptions(const boost::program_options::variables_map& vm, - const std::string& prefix) - { - PluginOptionType pluginOptions; - namespace po = boost::program_options; - for (const po::variables_map::value_type& pair: vm) - { - const std::string& key = pair.first; - int postfix = validateKeyByPrefix(key, prefix); - if (postfix != -1) - { - pluginOptions.insert(std::make_pair(postfix, pair.second.as())); - } - } - return pluginOptions; - } + typedef std::map PluginOptionType; + + int validateKeyByPrefix(const std::string& key, const std::string& prefix) + { + QRegExp re(QString::fromStdString(prefix) + "(\\d+)"); + + if (re.indexIn(QString::fromStdString(key), 0) != -1) + return re.cap(1).toInt(); + else + return -1; + } + + PluginOptionType getPluginsOptions( + const boost::program_options::variables_map& vm, + const std::string& prefix) + { + PluginOptionType pluginOptions; + namespace po = boost::program_options; + for (const po::variables_map::value_type& pair: vm) + { + const std::string& key = pair.first; + int postfix = validateKeyByPrefix(key, prefix); + if (postfix != -1) + pluginOptions.insert(std::make_pair(postfix, pair.second.as())); + } + return pluginOptions; + } } // end anonymous namespace // -------------------------------------------------------------------------------- @@ -69,953 +62,881 @@ Application* g_pApp = NULL; #ifdef _DEBUG void g_messageOutput(QtMsgType type, const QMessageLogContext& context, const QString& msg) { - if (msg.contains("requested for null window or window without handle")) - return; + if (msg.contains("requested for null window or window without handle")) + return; - if (msg.contains("QBackingStore::flush() called with non-exposed window, behavior is undefined")) - return; + if (msg.contains("QBackingStore::flush() called with non-exposed window, behavior is undefined")) + return; - if (msg.contains("Cannot create accessible interface for object")) - return; + if (msg.contains("Cannot create accessible interface for object")) + return; - qInstallMessageHandler(NULL); + qInstallMessageHandler(NULL); - QString message = QString("%1\n\nfile: %2: %3\nat function: %4") - .arg(msg) - .arg(context.file) - .arg(context.line) - .arg(context.function); + QString message = QString("%1\n\nfile: %2: %3\nat function: %4") + .arg(msg) + .arg(context.file) + .arg(context.line) + .arg(context.function); - switch (type) - { - case QtDebugMsg: - TRACE1("Debug: %s\n", msg.toLocal8Bit().constData()); - break; + switch (type) + { + case QtDebugMsg: + TRACE1("Debug: %s\n", msg.toLocal8Bit().constData()); + break; - case QtWarningMsg: - TRACE1("Warning: %s\n", message.toLocal8Bit().constData()); - if (g_pApp->platformName() != "minimal") - QMessageBox::warning(g_pApp->getMainWnd(), "QtWarning", message); - break; + case QtWarningMsg: + TRACE1("Warning: %s\n", message.toLocal8Bit().constData()); + if (g_pApp->platformName() != "minimal") + QMessageBox::warning(g_pApp->getMainWnd(), "QtWarning", message); + break; - case QtCriticalMsg: - if (g_pApp->platformName() != "minimal") - QMessageBox::critical(g_pApp->getMainWnd(), "QtCritical", message); - break; + case QtCriticalMsg: + if (g_pApp->platformName() != "minimal") + QMessageBox::critical(g_pApp->getMainWnd(), "QtCritical", message); + break; - case QtFatalMsg: - if (g_pApp->platformName() != "minimal") - QMessageBox::critical(g_pApp->getMainWnd(), "QtFatal", message); - break; - } + case QtFatalMsg: + if (g_pApp->platformName() != "minimal") + QMessageBox::critical(g_pApp->getMainWnd(), "QtFatal", message); + break; + } - qInstallMessageHandler(g_messageOutput); + qInstallMessageHandler(g_messageOutput); } #endif Application::Application(int& argc, char** argv) - : QApplication(argc, argv) - , m_pStudioGUI (NULL ) -#ifdef RDO_MT - , m_pStudioMT (NULL ) -#endif - , m_fileAssociationSetup (false ) - , m_fileAssociationCheckInFuture(false ) - , m_openLastProject (false ) - , m_showCaptionFullName (false ) - , m_autoExitByModel (false ) - , m_dontCloseIfError (false ) - , m_exitCode (rdo::simulation::report::EC_OK) - , m_pAssistant (NULL ) - , m_pMainFrame (NULL ) - , m_pluginLoader () -{ - g_pApp = this; + : QApplication(argc, argv) + , m_pStudioGUI (NULL ) + , m_fileAssociationSetup (false ) + , m_fileAssociationCheckInFuture(false ) + , m_openLastProject (false ) + , m_showCaptionFullName (false ) + , m_autoExitByModel (false ) + , m_dontCloseIfError (false ) + , m_exitCode (rdo::simulation::report::ExitCode::OK) + , m_pAssistant (NULL ) + , m_pMainFrame (NULL ) + , m_pluginLoader () +{ + g_pApp = this; #ifdef _DEBUG - qInstallMessageHandler(g_messageOutput); + qInstallMessageHandler(g_messageOutput); #endif - m_log.open("log.txt"); - - qApp->setQuitOnLastWindowClosed(true); + qApp->setQuitOnLastWindowClosed(true); - QApplication::setApplicationName("RAO-studio"); - QApplication::setOrganizationName("RAO-studio"); + QApplication::setApplicationName("RAO-studio"); + QApplication::setOrganizationName("RAO-studio"); #ifdef Q_OS_WIN - convertSettings(); + convertSettings(); #endif - QSettings settings; + QSettings settings; - m_fileAssociationSetup = settings.value("general/file_association_setup", true).toBool(); - m_fileAssociationCheckInFuture = settings.value("general/file_association_check_in_future", true).toBool(); + m_fileAssociationSetup = settings.value("general/file_association_setup", true).toBool(); + m_fileAssociationCheckInFuture = settings.value("general/file_association_check_in_future", true).toBool(); - m_lastProjectName = settings.value("general/last_project_full_name", QString()).toString(); - m_openLastProject = settings.value("general/last_project_auto_open", true).toBool(); - m_showCaptionFullName = settings.value("general/show_caption_full_name", false).toBool(); + m_lastProjectName = settings.value("general/last_project_full_name", QString()).toString(); + m_openLastProject = settings.value("general/last_project_auto_open", true).toBool(); + m_showCaptionFullName = settings.value("general/show_caption_full_name", false).toBool(); - // Кто-то должен поднять кернел и треды - RDOKernel::init(); -#ifdef RDO_MT - m_pStudioGUI = new ThreadStudioGUI(); -#else - m_pStudioGUI = kernel; -#endif - new rdo::service::simulation::RDOThreadSimulator(); - new rdo::service::simulation::RDOThreadCodeComp(); - new rdo::repository::RDOThreadRepository(); + // Кто-то должен поднять кернел и треды + RDOKernel::init(); + m_pStudioGUI = kernel; + new rdo::service::simulation::RDOThreadSimulator(); + new rdo::service::simulation::RDOThreadCodeComp(); + new rdo::repository::RDOThreadRepository(); //#define CORBA_ENABLE #ifdef CORBA_ENABLE - new rdoCorba::RDOThreadCorba(); + new rdoCorba::RDOThreadCorba(); #endif -#ifdef RDO_MT - m_pStudioMT = new ThreadStudio(); -#endif + g_pTracer = new rdo::gui::tracer::Tracer(); - g_pTracer = new rdo::gui::tracer::Tracer(); + m_pModelStyle = rdo::Factory::create(); - m_pModelStyle = rdo::Factory::create(); + // Внутри создается объект модели + m_pMainFrame = new MainWindow(); + m_pMainFrame->init(); + m_pMainFrame->show(); - // Внутри создается объект модели - m_pMainFrame = new MainWindow(); - m_pMainFrame->init(); - m_pMainFrame->show(); + m_pluginLoader.init(m_pMainFrame); - m_pluginLoader.init(m_pMainFrame); + kernel->thread_studio = g_pModel; -#ifdef RDO_MT - kernel->thread_studio = m_pStudioGUI; -#else - kernel->thread_studio = g_pModel; -#endif - - QObject::connect(&m_initTimer, &QTimer::timeout, boost::function(boost::bind(&Application::onInit, this, argc, argv))); - m_initTimer.setSingleShot(true); - m_initTimer.start(0); + QObject::connect(&m_initTimer, &QTimer::timeout, boost::function(boost::bind(&Application::onInit, this, argc, argv))); + m_initTimer.setSingleShot(true); + m_initTimer.start(0); - connect(&m_idleTimer, &QTimer::timeout, this, &Application::onIdle); - m_idleTimer.start(0); + connect(&m_idleTimer, &QTimer::timeout, this, &Application::onIdle); + m_idleTimer.start(0); } Application::~Application() { - m_pMainFrame = NULL; - - if (m_exitCode != rdo::simulation::report::EC_ModelNotFound) - { - m_exitCode = g_pModel->getExitCode(); - } -#ifdef RDO_MT - if (m_pStudioGUI) - { - m_pStudioGUI->sendMessage(m_pStudioGUI, RDOThread::RT_THREAD_CLOSE); - delete static_cast(m_pStudioGUI); - m_pStudioGUI = NULL; - } -#endif + m_pMainFrame = NULL; + + if (m_exitCode != rdo::simulation::report::ExitCode::MODEL_NOTFOUND) + m_exitCode = g_pModel->getExitCode(); - // Роняем кернел и закрываем все треды - RDOKernel::close(); + // Роняем кернел и закрываем все треды + RDOKernel::close(); - g_pApp = NULL; + g_pApp = NULL; - if (m_autoExitByModel) - { - //! @todo qt - //return m_exitCode; - } + if (m_autoExitByModel) + { + // TODO qt + //return m_exitCode; + } } void Application::onInit(int argc, char** argv) { - if (getFileAssociationCheckInFuture()) - { - setupFileAssociation(); - } - - namespace po = boost::program_options; - - po::options_description desc("RAO-studio"); - desc.add_options() - ("help,h", "display help message") - ("input,i", po::value(), "model file name") - ("gui_silent_mode,s", "turn on GUI silent mode from console running") - ("autorun", "auto run model") - ("autoexit", "auto exit after simulation stoped") - ("dont_close_if_error", "don't close application if model error detected") - ("plugin_list", "display all plugins") - ("plugin*", po::value(), "start # plugin from list with [arg] as options, e.g. --plugin1=\"--help\"") - ; - - po::variables_map vm; - try - { - po::store(po::parse_command_line(argc, argv, desc), vm); - po::notify(vm); - } - catch (const std::exception&) - {} - - if (vm.count("help")) - { - std::stringstream stream; - stream << desc; - rdo::locale::cout(stream.str()); - if (!vm.count("gui_silent_mode")) - { - QMessageBox::information(getMainWndUI(), "Help", QString::fromStdString(stream.str())); - } - quit(); - } - - std::string openModelName; - if (vm.count("input")) - { - openModelName = vm["input"].as(); - openModelName = rdo::locale::convertFromCLocale(openModelName); - } - - bool autoRun = false; - if (vm.count("autorun")) - { - autoRun = true; - } - - if (vm.count("autoexit")) - { - m_autoExitByModel = true; - } - - if (vm.count("dont_close_if_error")) - { - m_dontCloseIfError = true; - } - - bool autoModel = false; - if (!openModelName.empty()) - { - if (rdo::File::exist(openModelName) && g_pModel->openModel(QString::fromStdString(openModelName))) - { - autoModel = true; - } - else - { - m_exitCode = rdo::simulation::report::EC_ModelNotFound; - return; - } - } - else - { - if (getOpenLastProject() && !getLastProjectName().isEmpty() && QFile::exists(getLastProjectName())) - { - g_pModel->openModel(getLastProjectName()); - } - } - - if (!autoModel) - { - autoRun = false; - m_dontCloseIfError = false; - } - - if (autoRun) - { - g_pModel->runModel(); - } - - if (vm.count("plugin_list")) - { - std::stringstream stream; - int index = 0; - for (const LPPluginInfo& pluginInfo: *(m_pluginLoader.getPluginInfoList())) - { - stream << index++ << " " << pluginInfo->getName().toStdString() - << " ver. " << pluginInfo->getVersion().toStdString() - << (pluginInfo->isAvailable() ? " available" : " not available"); - } - rdo::locale::cout(stream.str()); - quit(); - } - - m_pluginLoader.autoStartPlugins(getPluginsOptions(vm, "plugin")); + if (getFileAssociationCheckInFuture()) + setupFileAssociation(); + + namespace po = boost::program_options; + + po::options_description desc("RAO-studio"); + desc.add_options() + ("help,h", "display help message") + ("input,i", po::value(), "model file name") + ("gui_silent_mode,s", "turn on GUI silent mode from console running") + ("autorun", "auto run model") + ("autoexit", "auto exit after simulation stoped") + ("dont_close_if_error", "don't close application if model error detected") + ("plugin_list", "display all plugins") + ("plugin*", po::value(), "start # plugin from list with [arg] as options, e.g. --plugin1=\"--help\"") + ; + + po::variables_map vm; + try + { + po::store(po::parse_command_line(argc, argv, desc), vm); + po::notify(vm); + } + catch (const std::exception&) + {} + + if (vm.count("help")) + { + std::stringstream stream; + stream << desc; + rdo::locale::cout(stream.str()); + if (!vm.count("gui_silent_mode")) + QMessageBox::information(getMainWndUI(), "Help", QString::fromStdString(stream.str())); + + quit(); + } + + std::string openModelName; + if (vm.count("input")) + { + openModelName = vm["input"].as(); + openModelName = rdo::locale::convertFromCLocale(openModelName); + } + + bool autoRun = false; + if (vm.count("autorun")) + autoRun = true; + + if (vm.count("autoexit")) + m_autoExitByModel = true; + + if (vm.count("dont_close_if_error")) + m_dontCloseIfError = true; + + bool autoModel = false; + if (!openModelName.empty()) + { + if (rdo::File::exist(openModelName) && g_pModel->openModel(QString::fromStdString(openModelName))) + { + autoModel = true; + } + else + { + m_exitCode = rdo::simulation::report::ExitCode::MODEL_NOTFOUND; + return; + } + } + else + { + if (getOpenLastProject() && !getLastProjectName().isEmpty() && QFile::exists(getLastProjectName())) + g_pModel->openModel(getLastProjectName()); + } + + if (!autoModel) + { + autoRun = false; + m_dontCloseIfError = false; + } + + if (autoRun) + g_pModel->runModel(); + + if (vm.count("plugin_list")) + { + std::stringstream stream; + int index = 0; + for (const LPPluginInfo& pluginInfo: *(m_pluginLoader.getPluginInfoList())) + { + stream << index++ << " " << pluginInfo->getName().toStdString() + << " ver. " << pluginInfo->getVersion().toStdString() + << (pluginInfo->isAvailable() ? " available" : " not available"); + } + rdo::locale::cout(stream.str()); + quit(); + } + + m_pluginLoader.autoStartPlugins(getPluginsOptions(vm, "plugin")); } RDOKernel* Application::getKernel() const { - return kernel; + return kernel; } MainWindow* Application::getMainWndUI() const { - return m_pMainFrame; + return m_pMainFrame; } rdo::gui::tracer::Tracer* Application::getTracer() const { - return g_pTracer; + return g_pTracer; } QMainWindow* Application::getMainWnd() { - return m_pMainFrame; + return m_pMainFrame; } MainWindowBase* Application::getStyle() { - return m_pMainFrame; + return m_pMainFrame; } MainWindowBase* Application::getIMainWnd() { - return m_pMainFrame; -} - -std::ofstream& Application::log() -{ - return m_log; + return m_pMainFrame; } QString Application::getFullHelpFileName(const QString& helpFileName) const { - QString result = chkHelpExist(helpFileName); - if (!result.isEmpty()) - { -#ifdef OST_WINDOWS - if (chkHelpExist("assistant.exe").isEmpty()) - { - result = QString(); - } + QString result = chkHelpExist(helpFileName); + if (!result.isEmpty()) + { +#ifdef OST_WINDOWS + if (chkHelpExist("assistant.exe").isEmpty()) + result = QString(); #endif - } - return result; + } + return result; } QString Application::chkHelpExist(const QString& helpFileName) const { - QString fullHelpFileName = QString("%1%2") - .arg(QString::fromStdWString(rdo::File::extractFilePath(qApp->applicationFilePath().toStdWString()).wstring())) - .arg(helpFileName); + QString fullHelpFileName = QString("%1%2") + .arg(QString::fromStdWString(rdo::File::extractFilePath(qApp->applicationFilePath().toStdWString()).wstring())) + .arg(helpFileName); - if (!QFile::exists(fullHelpFileName)) - { - QMessageBox::warning(g_pApp->getMainWnd(), "RAO-Studio", QString("Невозможно найти файл справки '%1'.\r\nОн должен быть расположен в директории с RAO-studio.").arg(helpFileName)); - fullHelpFileName = QString(); - } + if (!QFile::exists(fullHelpFileName)) + { + QMessageBox::warning(g_pApp->getMainWnd(), "RAO-Studio", QString("Невозможно найти файл справки '%1'.\r\nОн должен быть расположен в директории с RAO-studio.").arg(helpFileName)); + fullHelpFileName = QString(); + } - return fullHelpFileName; + return fullHelpFileName; } void Application::chkAndRunQtAssistant() { - if (!m_pAssistant) - { - m_pAssistant = runQtAssistant(); - } - else if (m_pAssistant->state() == m_pAssistant->Running) - return; - else - m_pAssistant = runQtAssistant(); + if (!m_pAssistant) + m_pAssistant = runQtAssistant(); + else if (m_pAssistant->state() == m_pAssistant->Running) + return; + else + m_pAssistant = runQtAssistant(); } QProcess* Application::runQtAssistant() const { - QProcess* pProcess = new QProcess; - QStringList args; - args << QString("-collectionFile") - << getFullHelpFileName() - << QString("-enableRemoteControl") - << QString("-quiet"); - pProcess->start(QString("assistant"), args); - return pProcess; + QProcess* pProcess = new QProcess; + QStringList args; + args << QString("-collectionFile") + << getFullHelpFileName() + << QString("-enableRemoteControl") + << QString("-quiet"); + pProcess->start(QString("assistant"), args); + return pProcess; } void Application::callQtAssistant(const QByteArray& ba) { - chkAndRunQtAssistant(); - if (m_pAssistant->state() != m_pAssistant->Running) - return; + chkAndRunQtAssistant(); + if (m_pAssistant->state() != m_pAssistant->Running) + return; - m_pAssistant->write(ba); + m_pAssistant->write(ba); } bool Application::getFileAssociationSetup() const { - return m_fileAssociationSetup; + return m_fileAssociationSetup; } void Application::setFileAssociationSetup(bool value) { - m_fileAssociationSetup = value; - QSettings settings; - settings.setValue("general/file_association_setup", m_fileAssociationSetup); - if (m_fileAssociationSetup) - { - setupFileAssociation(); - } + m_fileAssociationSetup = value; + QSettings settings; + settings.setValue("general/file_association_setup", m_fileAssociationSetup); + if (m_fileAssociationSetup) + setupFileAssociation(); } bool Application::getFileAssociationCheckInFuture() const { - return m_fileAssociationCheckInFuture; + return m_fileAssociationCheckInFuture; } void Application::setFileAssociationCheckInFuture(bool value) { - if (m_fileAssociationCheckInFuture != value) - { - m_fileAssociationCheckInFuture = value; - QSettings settings; - settings.setValue("general/file_association_check_in_future", m_fileAssociationCheckInFuture); - } + if (m_fileAssociationCheckInFuture != value) + { + m_fileAssociationCheckInFuture = value; + QSettings settings; + settings.setValue("general/file_association_check_in_future", m_fileAssociationCheckInFuture); + } } bool Application::getOpenLastProject() const { - return m_openLastProject; + return m_openLastProject; } void Application::setOpenLastProject(bool value) { - if (m_openLastProject != value) - { - m_openLastProject = value; - QSettings settings; - settings.setValue("general/last_project_auto_open", m_openLastProject); - } + if (m_openLastProject != value) + { + m_openLastProject = value; + QSettings settings; + settings.setValue("general/last_project_auto_open", m_openLastProject); + } } const QString& Application::getLastProjectName() const { - return m_lastProjectName; + return m_lastProjectName; } void Application::setLastProjectName(const QString& projectName) { - m_pMainFrame->insertMenuFileReopenItem(projectName); - if (m_lastProjectName != projectName) - { - m_lastProjectName = projectName; - QSettings settings; - settings.setValue("general/last_project_full_name", getOpenLastProject() - ? m_lastProjectName - : QString() - ); - } + m_pMainFrame->insertMenuFileReopenItem(projectName); + if (m_lastProjectName != projectName) + { + m_lastProjectName = projectName; + QSettings settings; + settings.setValue("general/last_project_full_name", getOpenLastProject() + ? m_lastProjectName + : QString()); + } } bool Application::getShowCaptionFullName() const { - return m_showCaptionFullName; + return m_showCaptionFullName; } void Application::setShowCaptionFullName(bool value) { - if (m_showCaptionFullName != value) - { - m_showCaptionFullName = value; - g_pModel->setName(g_pModel->getName()); - QSettings settings; - settings.setValue("general/show_caption_full_name", m_showCaptionFullName); - } + if (m_showCaptionFullName != value) + { + m_showCaptionFullName = value; + g_pModel->setName(g_pModel->getName()); + QSettings settings; + settings.setValue("general/show_caption_full_name", m_showCaptionFullName); + } } void Application::setupFileAssociation() { #ifdef Q_OS_WIN - QString fileTypeID("RAO.Project"); - QString appParam(" -i \"%1\""); - QString appFullName = qApp->applicationFilePath(); - appFullName.replace("/", "\\"); - - QSettings settings("HKEY_CURRENT_USER\\Software\\Classes", QSettings::NativeFormat); - - bool mustBeRegistered = true; - if (settings.childGroups().contains(fileTypeID)) - { - QString openCommand = settings.value(fileTypeID + "/shell/open/command/Default").toString(); - int pos = openCommand.indexOf(appParam); - if (pos != -1) - { - openCommand.remove(pos, appParam.length()); - if (openCommand != appFullName && qApp->platformName() != QString("minimal")) - { - FileAssociationDialog dlg(g_pApp->getMainWndUI()); - mustBeRegistered = dlg.exec() == QDialog::Accepted; - setFileAssociationCheckInFuture(dlg.checkBox->isChecked()); - } - else - { - mustBeRegistered = false; - } - } - } - - if (mustBeRegistered) - { - { - QString fileTypeIDPrev("RAO.FileInfo"); - QString appExtPrev(".smr"); - settings.remove(fileTypeIDPrev); - settings.remove(appExtPrev); - } - - settings.setValue(fileTypeID + "/Default", "RAO Project"); - settings.setValue(fileTypeID + "/DefaultIcon/Default", appFullName + ",0"); - settings.setValue(fileTypeID + "/shell/open/command/Default", appFullName + appParam); - - QString appExt(".rdox"); - settings.setValue(appExt + "/Default", fileTypeID); - settings.setValue(appExt + "/ShellNew/NullFile", ""); - } + QString fileTypeID("RAO.Project"); + QString appParam(" -i \"%1\""); + QString appFullName = qApp->applicationFilePath(); + appFullName.replace("/", "\\"); + + QSettings settings("HKEY_CURRENT_USER\\Software\\Classes", QSettings::NativeFormat); + + bool mustBeRegistered = true; + if (settings.childGroups().contains(fileTypeID)) + { + QString openCommand = settings.value(fileTypeID + "/shell/open/command/Default").toString(); + int pos = openCommand.indexOf(appParam); + if (pos != -1) + { + openCommand.remove(pos, appParam.length()); + if (openCommand != appFullName && qApp->platformName() != QString("minimal")) + { + FileAssociationDialog dlg(g_pApp->getMainWndUI()); + mustBeRegistered = dlg.exec() == QDialog::Accepted; + setFileAssociationCheckInFuture(dlg.checkBox->isChecked()); + } + else + { + mustBeRegistered = false; + } + } + } + + if (mustBeRegistered) + { + { + QString fileTypeIDPrev("RAO.FileInfo"); + QString appExtPrev(".smr"); + settings.remove(fileTypeIDPrev); + settings.remove(appExtPrev); + } + + settings.setValue(fileTypeID + "/Default", "RAO Project"); + settings.setValue(fileTypeID + "/DefaultIcon/Default", appFullName + ",0"); + settings.setValue(fileTypeID + "/shell/open/command/Default", appFullName + appParam); + + QString appExt(".rdox"); + settings.setValue(appExt + "/Default", fileTypeID); + settings.setValue(appExt + "/ShellNew/NullFile", ""); + } #endif } void Application::autoCloseByModel() { - if (m_autoExitByModel) - { - if (!m_dontCloseIfError || !g_pModel || (m_dontCloseIfError && (g_pModel->getExitCode() == rdo::simulation::report::EC_OK || g_pModel->getExitCode() == rdo::simulation::report::EC_NoMoreEvents))) - { - m_pMainFrame->close(); - } - } -} - -void Application::broadcastMessage(RDOThread::RDOTreadMessage message, void* pParam) -{ -#ifdef RDO_MT - CEvent* pEvent = m_pStudioMT->manualMessageFrom(message, pParam); - while (::WaitForSingleObject(pEvent->m_hObject, 0) == WAIT_TIMEOUT) - { - static_cast(m_pStudioGUI)->processMessages(); - if (m_pMainFrame) { - m_pMainFrame->UpdateWindow(); - } else { - break; - } - } - delete pEvent; -#else - m_pStudioGUI->broadcastMessage(message, pParam); -#endif + if (m_autoExitByModel) + { + if (!m_dontCloseIfError || !g_pModel || (m_dontCloseIfError && (g_pModel->getExitCode() == rdo::simulation::report::ExitCode::OK || g_pModel->getExitCode() == rdo::simulation::report::ExitCode::NOMORE_EVENTS))) + m_pMainFrame->close(); + } +} + +void Application::broadcastMessage(RDOThread::Message message, void* pParam) +{ + m_pStudioGUI->broadcastMessage(message, pParam); } void Application::onIdle() { -#ifdef RDO_MT - static_cast(m_pStudioGUI)->processMessages(); -#else - kernel->idle(); -#endif + kernel->idle(); } const rdo::gui::editor::LPModelStyle& Application::getModelStyle() const { - ASSERT(m_pModelStyle); - return m_pModelStyle; + ASSERT(m_pModelStyle); + return m_pModelStyle; } rdo::plugin::Loader& Application::getPluginLoader() { - return m_pluginLoader; + return m_pluginLoader; } #ifdef Q_OS_WIN class Convertor { public: - Convertor() - : settingsTo () - , settingsFrom("HKEY_CURRENT_USER\\Software\\RAO-studio", QSettings::NativeFormat) - { - childGroupsFrom = settingsFrom.childGroups(); - } - - bool contains(const QString& name) const - { - return childGroupsFrom.contains(name); - } - - template - void convert(const QString& from, const QString& to) - { - if (!settingsFrom.contains(from)) - return; - - setValue(to, convertTo(value(from))); - } - - template - T value(const QString& from) - { - return convertFrom(settingsFrom.value(from, typename qt_to_mfc_type_convertor::type())).value(); - } - - template - void setValue(const QString& to, const T& value) - { - settingsTo.setValue(to, value); - } - - void remove(const QString& name) - { - return settingsFrom.remove(name); - } + Convertor() + : settingsTo () + , settingsFrom("HKEY_CURRENT_USER\\Software\\RAO-studio", QSettings::NativeFormat) + { + childGroupsFrom = settingsFrom.childGroups(); + } + + bool contains(const QString& name) const + { + return childGroupsFrom.contains(name); + } + + template + void convert(const QString& from, const QString& to) + { + if (!settingsFrom.contains(from)) + return; + + setValue(to, convertTo(value(from))); + } + + template + T value(const QString& from) + { + return convertFrom(settingsFrom.value(from, typename qt_to_mfc_type_convertor::type())).value(); + } + + template + void setValue(const QString& to, const T& value) + { + settingsTo.setValue(to, value); + } + + void remove(const QString& name) + { + return settingsFrom.remove(name); + } private: - QSettings settingsTo; - QSettings settingsFrom; - QStringList childGroupsFrom; - - template - struct qt_to_mfc_type_convertor - { - typedef T type; - }; - - template - static QVariant convertFrom(const QVariant& value) - { - return value; - } - - template - static QVariant convertTo(const QVariant& value) - { - return value; - } + QSettings settingsTo; + QSettings settingsFrom; + QStringList childGroupsFrom; + + template + struct qt_to_mfc_type_convertor + { + typedef T type; + }; + + template + static QVariant convertFrom(const QVariant& value) + { + return value; + } + + template + static QVariant convertTo(const QVariant& value) + { + return value; + } }; template <> struct Convertor::qt_to_mfc_type_convertor { - typedef __int32 type; + typedef __int32 type; }; #ifdef COMPILER_MINGW namespace { - __int32 GetRValue(__int32 rgb) - { - return rgb & 0xFF; - } + __int32 GetRValue(__int32 rgb) + { + return rgb & 0xFF; + } - __int32 GetGValue(__int32 rgb) - { - return (rgb >> 8) & 0xFF; - } + __int32 GetGValue(__int32 rgb) + { + return (rgb >> 8) & 0xFF; + } - __int32 GetBValue(__int32 rgb) - { - return (rgb >> 16) & 0xFF; - } + __int32 GetBValue(__int32 rgb) + { + return (rgb >> 16) & 0xFF; + } } #endif template <> QVariant Convertor::convertFrom(const QVariant& value) { - __int32 colorRef = value.value<__int32>(); - return QColor(GetRValue(colorRef), GetGValue(colorRef), GetBValue(colorRef)); + __int32 colorRef = value.value<__int32>(); + return QColor(GetRValue(colorRef), GetGValue(colorRef), GetBValue(colorRef)); } template <> QVariant Convertor::convertTo(const QVariant& value) { - return value.value().name(); + return value.value().name(); } void Application::convertSettings() const { - Convertor convertor; - - if (convertor.contains("fileAssociation")) - { - convertor.convert("fileAssociation/setup", "general/file_association_setup"); - convertor.convert("fileAssociation/checkInFuture", "general/file_association_check_in_future"); - convertor.remove("fileAssociation"); - } - - if (convertor.contains("general")) - { - convertor.convert("general/lastProject", "general/last_project_full_name"); - convertor.convert ("general/openLastProject", "general/last_project_auto_open"); - convertor.convert ("general/showCaptionFullName", "general/show_caption_full_name"); - convertor.remove("general"); - } - - if (convertor.contains("plugins")) - { - convertor.remove("plugins"); - } - - if (convertor.contains("reopen")) - { - for (std::size_t i = 0; i < 10; i++) - { - QString value = convertor.value(QString("reopen/%1%2").arg(i+1 < 10 ? "0" : "").arg(i+1)); - if (value.isEmpty()) - break; - - convertor.setValue(QString("reopen/%1").arg(i+1), value); - } - convertor.remove("reopen"); - } - - if (convertor.contains("style")) - { - convertor.convert("style/build/build/warning", "style/build/build/warning"); - - convertor.convert("style/build/font/name", "style/build/font/name"); - convertor.convert ("style/build/font/size", "style/build/font/size"); - - convertor.convert("style/build/tab/autoIndent", "style/build/tab/auto_indent"); - convertor.convert("style/build/tab/backspaceUntabs", "style/build/tab/backspace_untabs"); - convertor.convert ("style/build/tab/indentSize", "style/build/tab/indent_size"); - convertor.convert("style/build/tab/tabIndents", "style/build/tab/tab_indents"); - convertor.convert ("style/build/tab/tabSize", "style/build/tab/tab_size"); - convertor.convert("style/build/tab/useTabs", "style/build/tab/use_tabs"); - - convertor.convert("style/build/theme/backgroundColor", "style/build/theme/background_color"); - convertor.convert("style/build/theme/bookmarkBgColor", "style/build/theme/bookmark_bg_color"); - convertor.convert("style/build/theme/bookmarkFgColor", "style/build/theme/bookmark_fg_color"); - convertor.convert ("style/build/theme/bookmarkStyle", "style/build/theme/bookmark_style"); - convertor.convert("style/build/theme/caretColor", "style/build/theme/caret_color"); - convertor.convert("style/build/theme/defaultColor", "style/build/theme/default_color"); - convertor.convert ("style/build/theme/defaultStyle", "style/build/theme/default_style"); - convertor.convert("style/build/theme/selectionBgColor", "style/build/theme/selection_bg_color"); - convertor.convert("style/build/theme/selectLineBgColor", "style/build/theme/select_line_bg_color"); - - convertor.convert ("style/build/window/showHorzScrollBar", "style/build/window/show_horz_scroll_bar"); - convertor.convert ("style/build/window/wordWrap", "style/build/window/word_wrap"); - - convertor.convert("style/chart/font/name", "style/chart/font/name"); - convertor.convert ("style/chart/font/size", "style/chart/font/size"); - - convertor.convert("style/chart/fonts_ticks/legendFontSize", "style/chart/fonts_ticks/legend_font_size"); - convertor.convert("style/chart/fonts_ticks/tickWidth", "style/chart/fonts_ticks/tick_width"); - convertor.convert("style/chart/fonts_ticks/titleFontSize", "style/chart/fonts_ticks/title_font_size"); - - convertor.convert("style/chart/theme/axisFgColor", "style/chart/theme/axis_fg_color"); - convertor.convert("style/chart/theme/backgroundColor", "style/chart/theme/background_color"); - convertor.convert("style/chart/theme/chartBgColor", "style/chart/theme/chart_bg_color"); - convertor.convert("style/chart/theme/defaultColor", "style/chart/theme/default_color"); - convertor.convert ("style/chart/theme/defaultStyle", "style/chart/theme/default_style"); - convertor.convert("style/chart/theme/legendFgColor", "style/chart/theme/legend_fg_color"); - convertor.convert ("style/chart/theme/legendStyle", "style/chart/theme/legend_style"); - convertor.convert("style/chart/theme/timeBgColor", "style/chart/theme/time_bg_color"); - convertor.convert("style/chart/theme/titleFGColor", "style/chart/theme/title_fg_color"); - convertor.convert ("style/chart/theme/titleStyle", "style/chart/theme/title_style"); - - convertor.convert("style/debug/font/name", "style/debug/font/name"); - convertor.convert ("style/debug/font/size", "style/debug/font/size"); - - convertor.convert("style/debug/tab/autoIndent", "style/debug/tab/auto_indent"); - convertor.convert("style/debug/tab/backspaceUntabs", "style/debug/tab/backspace_untabs"); - convertor.convert ("style/debug/tab/indentSize", "style/debug/tab/indent_size"); - convertor.convert("style/debug/tab/tabIndents", "style/debug/tab/tab_indents"); - convertor.convert ("style/debug/tab/tabSize", "style/debug/tab/tab_size"); - convertor.convert("style/debug/tab/useTabs", "style/debug/tab/use_tabs"); - - convertor.convert("style/debug/theme/backgroundColor", "style/debug/theme/background_color"); - convertor.convert("style/debug/theme/bookmarkBgColor", "style/debug/theme/bookmark_bg_color"); - convertor.convert("style/debug/theme/bookmarkFgColor", "style/debug/theme/bookmark_fg_color"); - convertor.convert ("style/debug/theme/bookmarkStyle", "style/debug/theme/bookmark_style"); - convertor.convert("style/debug/theme/caretColor", "style/debug/theme/caret_color"); - convertor.convert("style/debug/theme/defaultColor", "style/debug/theme/default_color"); - convertor.convert ("style/debug/theme/defaultStyle", "style/debug/theme/default_style"); - convertor.convert("style/debug/theme/selectionBgColor", "style/debug/theme/selection_bg_color"); - - convertor.convert("style/debug/window/showHorzScrollBar", "style/debug/window/show_horz_scroll_bar"); - convertor.convert("style/debug/window/wordWrap", "style/debug/window/word_wrap"); - - convertor.convert("style/editor/autoComplete/showFullList", "style/editor/auto_complete/show_full_list"); - convertor.convert("style/editor/autoComplete/useAutoComplete", "style/editor/auto_complete/use_auto_complete"); - - convertor.remove("style/editor/buffer"); - - convertor.convert("style/editor/font/name", "style/editor/font/name"); - convertor.convert ("style/editor/font/size", "style/editor/font/size"); - - convertor.convert("style/editor/margin/bookmark", "style/editor/margin/bookmark"); - convertor.convert("style/editor/margin/fold", "style/editor/margin/fold"); - convertor.convert("style/editor/margin/lineNumber", "style/editor/margin/line_number"); - - convertor.convert("style/editor/tab/autoIndent", "style/editor/tab/auto_indent"); - convertor.convert("style/editor/tab/backspaceUntabs", "style/editor/tab/backspace_untabs"); - convertor.convert ("style/editor/tab/indentSize", "style/editor/tab/indent_size"); - convertor.convert("style/editor/tab/tabIndents", "style/editor/tab/tab_indents"); - convertor.convert ("style/editor/tab/tabSize", "style/editor/tab/tab_size"); - convertor.convert("style/editor/tab/useTabs", "style/editor/tab/use_tabs"); - - convertor.convert("style/editor/theme/backgroundColor", "style/editor/theme/background_color"); - convertor.convert("style/editor/theme/bookmarkBgColor", "style/editor/theme/bookmark_bg_color"); - convertor.convert("style/editor/theme/bookmarkFgColor", "style/editor/theme/bookmark_fg_color"); - convertor.convert ("style/editor/theme/bookmarkStyle", "style/editor/theme/bookmark_style"); - convertor.convert("style/editor/theme/caretColor", "style/editor/theme/caret_color"); - convertor.convert("style/editor/theme/colorColor", "style/editor/theme/color_color"); - convertor.convert("style/editor/theme/commentColor", "style/editor/theme/comment_color"); - convertor.convert ("style/editor/theme/commentFold", "style/editor/theme/comment_fold"); - convertor.convert ("style/editor/theme/commentStyle", "style/editor/theme/comment_style"); - convertor.convert("style/editor/theme/defaultColor", "style/editor/theme/default_color"); - convertor.convert ("style/editor/theme/defaultStyle", "style/editor/theme/default_style"); - convertor.convert("style/editor/theme/errorBgColor", "style/editor/theme/error_bg_color"); - convertor.convert("style/editor/theme/foldBgColor", "style/editor/theme/fold_bg_color"); - convertor.convert("style/editor/theme/foldFgColor", "style/editor/theme/fold_fg_color"); - convertor.convert ("style/editor/theme/foldStyle", "style/editor/theme/fold_style"); - convertor.convert("style/editor/theme/functionsColor", "style/editor/theme/functions_color"); - convertor.convert ("style/editor/theme/functionsStyle", "style/editor/theme/functions_style"); - convertor.convert("style/editor/theme/identifierColor", "style/editor/theme/identifier_color"); - convertor.convert ("style/editor/theme/identifierStyle", "style/editor/theme/identifier_style"); - convertor.convert("style/editor/theme/keywordColor", "style/editor/theme/keyword_color"); - convertor.convert ("style/editor/theme/keywordStyle", "style/editor/theme/keyword_style"); - convertor.convert("style/editor/theme/numberColor", "style/editor/theme/number_color"); - convertor.convert ("style/editor/theme/numberStyle", "style/editor/theme/number_style"); - convertor.convert("style/editor/theme/operatorColor", "style/editor/theme/operator_color"); - convertor.convert ("style/editor/theme/operatorStyle", "style/editor/theme/operator_style"); - convertor.convert("style/editor/theme/selectionBgColor", "style/editor/theme/selection_bg_color"); - convertor.convert("style/editor/theme/stringColor", "style/editor/theme/string_color"); - convertor.convert ("style/editor/theme/stringStyle", "style/editor/theme/string_style"); - convertor.convert("style/editor/theme/traceColor", "style/editor/theme/trace_color"); - - convertor.convert("style/editor/window/showHorzScrollBar", "style/editor/window/show_horz_scroll_bar"); - convertor.convert("style/editor/window/wordWrap", "style/editor/window/word_wrap"); - - convertor.convert("style/find/font/name", "style/find/font/name"); - convertor.convert ("style/find/font/size", "style/find/font/size"); - - convertor.convert("style/find/tab/autoIndent", "style/find/tab/auto_indent"); - convertor.convert("style/find/tab/backspaceUntabs", "style/find/tab/backspace_untabs"); - convertor.convert ("style/find/tab/indentSize", "style/find/tab/indent_size"); - convertor.convert("style/find/tab/tabIndents", "style/find/tab/tab_indents"); - convertor.convert ("style/find/tab/tabSize", "style/find/tab/tab_size"); - convertor.convert("style/find/tab/useTabs", "style/find/tab/use_tabs"); - - convertor.convert("style/find/theme/backgroundColor", "style/find/theme/background_color"); - convertor.convert("style/find/theme/bookmarkBgColor", "style/find/theme/bookmark_bg_color"); - convertor.convert("style/find/theme/bookmarkFgColor", "style/find/theme/bookmark_fg_color"); - convertor.convert ("style/find/theme/bookmarkStyle", "style/find/theme/bookmark_style"); - convertor.convert("style/find/theme/caretColor", "style/find/theme/caret_color"); - convertor.convert("style/find/theme/defaultColor", "style/find/theme/default_color"); - convertor.convert ("style/find/theme/defaultStyle", "style/find/theme/default_style"); - convertor.convert("style/find/theme/keywordColor", "style/find/theme/keyword_сolor"); - convertor.convert ("style/find/theme/keywordStyle", "style/find/theme/keyword_style"); - convertor.convert("style/find/theme/selectionBgColor", "style/find/theme/selection_bg_color"); - convertor.convert("style/find/theme/selectLineBgColor", "style/find/theme/select_line_bg_color"); - - convertor.convert("style/find/window/showHorzScrollBar", "style/find/window/show_horz_scroll_bar"); - convertor.convert("style/find/window/wordWrap", "style/find/window/word_wrap"); - - convertor.convert("style/frame/font/name", "style/frame/font/name"); - convertor.convert ("style/frame/font/size", "style/frame/font/size"); - - convertor.convert("style/frame/theme/backgroundColor", "style/frame/theme/background_color"); - convertor.convert("style/frame/theme/defaultColor", "style/frame/theme/default_color"); - convertor.convert ("style/frame/theme/defaultStyle", "style/frame/theme/default_style"); - - convertor.convert("style/results/font/name", "style/results/font/name"); - convertor.convert ("style/results/font/size", "style/results/font/size"); - - convertor.convert("style/results/tab/autoIndent", "style/results/tab/auto_indent"); - convertor.convert("style/results/tab/backspaceUntabs", "style/results/tab/backspace_untabs"); - convertor.convert ("style/results/tab/indentSize", "style/results/tab/indent_size"); - convertor.convert("style/results/tab/tabIndents", "style/results/tab/tab_indents"); - convertor.convert ("style/results/tab/tabSize", "style/results/tab/tab_size"); - convertor.convert("style/results/tab/useTabs", "style/results/tab/use_tabs"); - - convertor.convert("style/results/theme/backgroundColor", "style/results/theme/background_color"); - convertor.convert("style/results/theme/bookmarkBgColor", "style/results/theme/bookmark_bg_color"); - convertor.convert("style/results/theme/bookmarkFgColor", "style/results/theme/bookmark_fg_color"); - convertor.convert ("style/results/theme/bookmarkStyle", "style/results/theme/bookmark_style"); - convertor.convert("style/results/theme/caretColor", "style/results/theme/caret_color"); - convertor.convert("style/results/theme/colorColor", "style/results/theme/color_color"); - convertor.convert("style/results/theme/commentColor", "style/results/theme/comment_color"); - convertor.convert ("style/results/theme/commentStyle", "style/results/theme/comment_style"); - convertor.convert("style/results/theme/defaultColor", "style/results/theme/default_color"); - convertor.convert ("style/results/theme/defaultStyle", "style/results/theme/default_style"); - convertor.convert("style/results/theme/functionsColor", "style/results/theme/functions_color"); - convertor.convert ("style/results/theme/functionsStyle", "style/results/theme/functions_style"); - convertor.convert("style/results/theme/identifierColor", "style/results/theme/identifier_color"); - convertor.convert ("style/results/theme/identifierStyle", "style/results/theme/identifier_style"); - convertor.convert("style/results/theme/keywordColor", "style/results/theme/keyword_color"); - convertor.convert ("style/results/theme/keywordStyle", "style/results/theme/keyword_style"); - convertor.convert("style/results/theme/numberColor", "style/results/theme/number_color"); - convertor.convert ("style/results/theme/numberStyle", "style/results/theme/number_style"); - convertor.convert("style/results/theme/operatorColor", "style/results/theme/operator_color"); - convertor.convert ("style/results/theme/operatorStyle", "style/results/theme/operator_style"); - convertor.convert("style/results/theme/selectionBgColor", "style/results/theme/selection_bg_color"); - convertor.convert("style/results/theme/stringColor", "style/results/theme/string_color"); - convertor.convert ("style/results/theme/stringStyle", "style/results/theme/string_style"); - convertor.convert("style/results/theme/traceColor", "style/results/theme/trace_color"); - - convertor.convert("style/results/window/showHorzScrollBar", "style/results/window/show_horz_scroll_bar"); - convertor.convert("style/results/window/wordWrap", "style/results/window/word_wrap"); - - convertor.convert("style/trace/borders/horzBorder", "style/trace/borders/horz_border"); - convertor.convert("style/trace/borders/vertBorder", "style/trace/borders/vert_border"); - - convertor.convert("style/trace/font/name", "style/trace/font/name"); - convertor.convert ("style/trace/font/size", "style/trace/font/size"); - - convertor.convert("style/trace/theme/defaultColor_backgroundColor", "style/trace/theme/default_color_background_color"); - convertor.convert("style/trace/theme/defaultColor_foregroundColor", "style/trace/theme/default_color_foreground_color"); - convertor.convert("style/trace/theme/dps_backgroundColor", "style/trace/theme/dps_background_color"); - convertor.convert("style/trace/theme/dps_foregroundColor", "style/trace/theme/dps_foreground_color"); - convertor.convert("style/trace/theme/eb_backgroundColor", "style/trace/theme/eb_background_color"); - convertor.convert("style/trace/theme/eb_foregroundColor", "style/trace/theme/eb_foreground_color"); - convertor.convert("style/trace/theme/ef_backgroundColor", "style/trace/theme/ef_background_color"); - convertor.convert("style/trace/theme/ef_foregroundColor", "style/trace/theme/ef_foreground_color"); - convertor.convert("style/trace/theme/ei_backgroundColor", "style/trace/theme/ei_background_color"); - convertor.convert("style/trace/theme/ei_foregroundColor", "style/trace/theme/ei_foreground_color"); - convertor.convert("style/trace/theme/er_backgroundColor", "style/trace/theme/er_background_color"); - convertor.convert("style/trace/theme/er_foregroundColor", "style/trace/theme/er_foreground_color"); - convertor.convert("style/trace/theme/es_backgroundColor", "style/trace/theme/es_background_color"); - convertor.convert("style/trace/theme/es_foregroundColor", "style/trace/theme/es_foreground_color"); - convertor.convert("style/trace/theme/rc_backgroundColor", "style/trace/theme/rc_background_color"); - convertor.convert("style/trace/theme/rc_foregroundColor", "style/trace/theme/rc_foreground_color"); - convertor.convert("style/trace/theme/re_backgroundColor", "style/trace/theme/re_background_color"); - convertor.convert("style/trace/theme/re_foregroundColor", "style/trace/theme/re_foreground_color"); - convertor.convert("style/trace/theme/rk_backgroundColor", "style/trace/theme/rk_background_color"); - convertor.convert("style/trace/theme/rk_foregroundColor", "style/trace/theme/rk_foreground_color"); - convertor.convert("style/trace/theme/s_backgroundColor", "style/trace/theme/s_background_color"); - convertor.convert("style/trace/theme/s_foregroundColor", "style/trace/theme/s_foreground_color"); - convertor.convert("style/trace/theme/sb_backgroundColor", "style/trace/theme/sb_background_color"); - convertor.convert("style/trace/theme/sb_foregroundColor", "style/trace/theme/sb_foreground_color"); - convertor.convert("style/trace/theme/sd_backgroundColor", "style/trace/theme/sd_background_color"); - convertor.convert("style/trace/theme/sd_foregroundColor", "style/trace/theme/sd_foreground_color"); - convertor.convert("style/trace/theme/sef_backgroundColor", "style/trace/theme/sef_background_color"); - convertor.convert("style/trace/theme/sef_foregroundColor", "style/trace/theme/sef_foreground_color"); - convertor.convert("style/trace/theme/sem_backgroundColor", "style/trace/theme/sem_background_color"); - convertor.convert("style/trace/theme/sem_foregroundColor", "style/trace/theme/sem_foreground_color"); - convertor.convert("style/trace/theme/sen_backgroundColor", "style/trace/theme/sen_background_color"); - convertor.convert("style/trace/theme/sen_foregroundColor", "style/trace/theme/sen_foreground_color"); - convertor.convert("style/trace/theme/ses_backgroundColor", "style/trace/theme/ses_background_color"); - convertor.convert("style/trace/theme/ses_foregroundColor", "style/trace/theme/ses_foreground_color"); - convertor.convert("style/trace/theme/seu_backgroundColor", "style/trace/theme/seu_background_color"); - convertor.convert("style/trace/theme/seu_foregroundColor", "style/trace/theme/seu_foreground_color"); - convertor.convert("style/trace/theme/so_backgroundColor", "style/trace/theme/so_background_color"); - convertor.convert("style/trace/theme/so_foregroundColor", "style/trace/theme/so_foreground_color"); - convertor.convert("style/trace/theme/src_backgroundColor", "style/trace/theme/src_background_color"); - convertor.convert("style/trace/theme/src_foregroundColor", "style/trace/theme/src_foreground_color"); - convertor.convert("style/trace/theme/sre_backgroundColor", "style/trace/theme/sre_background_color"); - convertor.convert("style/trace/theme/sre_foregroundColor", "style/trace/theme/sre_foreground_color"); - convertor.convert("style/trace/theme/srk_backgroundColor", "style/trace/theme/srk_background_color"); - convertor.convert("style/trace/theme/srk_foregroundColor", "style/trace/theme/srk_foreground_color"); - convertor.convert("style/trace/theme/std_backgroundColor", "style/trace/theme/std_background_color"); - convertor.convert("style/trace/theme/std_foregroundColor", "style/trace/theme/std_foreground_color"); - convertor.convert("style/trace/theme/stn_backgroundColor", "style/trace/theme/stn_background_color"); - convertor.convert("style/trace/theme/stn_foregroundColor", "style/trace/theme/stn_foreground_color"); - convertor.convert("style/trace/theme/str_backgroundColor", "style/trace/theme/str_background_color"); - convertor.convert("style/trace/theme/str_foregroundColor", "style/trace/theme/str_foreground_color"); - convertor.convert ("style/trace/theme/style", "style/trace/theme/style"); - convertor.convert("style/trace/theme/v_backgroundColor", "style/trace/theme/v_background_color"); - convertor.convert("style/trace/theme/v_foregroundColor", "style/trace/theme/v_foreground_color"); - - convertor.remove("style"); - } + Convertor convertor; + + if (convertor.contains("fileAssociation")) + { + convertor.convert("fileAssociation/setup", "general/file_association_setup"); + convertor.convert("fileAssociation/checkInFuture", "general/file_association_check_in_future"); + convertor.remove("fileAssociation"); + } + + if (convertor.contains("general")) + { + convertor.convert("general/lastProject", "general/last_project_full_name"); + convertor.convert ("general/openLastProject", "general/last_project_auto_open"); + convertor.convert ("general/showCaptionFullName", "general/show_caption_full_name"); + convertor.remove("general"); + } + + if (convertor.contains("plugins")) + { + convertor.remove("plugins"); + } + + if (convertor.contains("reopen")) + { + for (std::size_t i = 0; i < 10; i++) + { + QString value = convertor.value(QString("reopen/%1%2").arg(i+1 < 10 ? "0" : "").arg(i+1)); + if (value.isEmpty()) + break; + + convertor.setValue(QString("reopen/%1").arg(i+1), value); + } + convertor.remove("reopen"); + } + + if (convertor.contains("style")) + { + convertor.convert("style/build/build/warning", "style/build/build/warning"); + + convertor.convert("style/build/font/name", "style/build/font/name"); + convertor.convert ("style/build/font/size", "style/build/font/size"); + + convertor.convert("style/build/tab/autoIndent", "style/build/tab/auto_indent"); + convertor.convert("style/build/tab/backspaceUntabs", "style/build/tab/backspace_untabs"); + convertor.convert ("style/build/tab/indentSize", "style/build/tab/indent_size"); + convertor.convert("style/build/tab/tabIndents", "style/build/tab/tab_indents"); + convertor.convert ("style/build/tab/tabSize", "style/build/tab/tab_size"); + convertor.convert("style/build/tab/useTabs", "style/build/tab/use_tabs"); + + convertor.convert("style/build/theme/backgroundColor", "style/build/theme/background_color"); + convertor.convert("style/build/theme/bookmarkBgColor", "style/build/theme/bookmark_bg_color"); + convertor.convert("style/build/theme/bookmarkFgColor", "style/build/theme/bookmark_fg_color"); + convertor.convert ("style/build/theme/bookmarkStyle", "style/build/theme/bookmark_style"); + convertor.convert("style/build/theme/caretColor", "style/build/theme/caret_color"); + convertor.convert("style/build/theme/defaultColor", "style/build/theme/default_color"); + convertor.convert ("style/build/theme/defaultStyle", "style/build/theme/default_style"); + convertor.convert("style/build/theme/selectionBgColor", "style/build/theme/selection_bg_color"); + convertor.convert("style/build/theme/selectLineBgColor", "style/build/theme/select_line_bg_color"); + + convertor.convert ("style/build/window/showHorzScrollBar", "style/build/window/show_horz_scroll_bar"); + convertor.convert ("style/build/window/wordWrap", "style/build/window/word_wrap"); + + convertor.convert("style/chart/font/name", "style/chart/font/name"); + convertor.convert ("style/chart/font/size", "style/chart/font/size"); + + convertor.convert("style/chart/fonts_ticks/legendFontSize", "style/chart/fonts_ticks/legend_font_size"); + convertor.convert("style/chart/fonts_ticks/tickWidth", "style/chart/fonts_ticks/tick_width"); + convertor.convert("style/chart/fonts_ticks/titleFontSize", "style/chart/fonts_ticks/title_font_size"); + + convertor.convert("style/chart/theme/axisFgColor", "style/chart/theme/axis_fg_color"); + convertor.convert("style/chart/theme/backgroundColor", "style/chart/theme/background_color"); + convertor.convert("style/chart/theme/chartBgColor", "style/chart/theme/chart_bg_color"); + convertor.convert("style/chart/theme/defaultColor", "style/chart/theme/default_color"); + convertor.convert ("style/chart/theme/defaultStyle", "style/chart/theme/default_style"); + convertor.convert("style/chart/theme/legendFgColor", "style/chart/theme/legend_fg_color"); + convertor.convert ("style/chart/theme/legendStyle", "style/chart/theme/legend_style"); + convertor.convert("style/chart/theme/timeBgColor", "style/chart/theme/time_bg_color"); + convertor.convert("style/chart/theme/titleFGColor", "style/chart/theme/title_fg_color"); + convertor.convert ("style/chart/theme/titleStyle", "style/chart/theme/title_style"); + + convertor.convert("style/debug/font/name", "style/debug/font/name"); + convertor.convert ("style/debug/font/size", "style/debug/font/size"); + + convertor.convert("style/debug/tab/autoIndent", "style/debug/tab/auto_indent"); + convertor.convert("style/debug/tab/backspaceUntabs", "style/debug/tab/backspace_untabs"); + convertor.convert ("style/debug/tab/indentSize", "style/debug/tab/indent_size"); + convertor.convert("style/debug/tab/tabIndents", "style/debug/tab/tab_indents"); + convertor.convert ("style/debug/tab/tabSize", "style/debug/tab/tab_size"); + convertor.convert("style/debug/tab/useTabs", "style/debug/tab/use_tabs"); + + convertor.convert("style/debug/theme/backgroundColor", "style/debug/theme/background_color"); + convertor.convert("style/debug/theme/bookmarkBgColor", "style/debug/theme/bookmark_bg_color"); + convertor.convert("style/debug/theme/bookmarkFgColor", "style/debug/theme/bookmark_fg_color"); + convertor.convert ("style/debug/theme/bookmarkStyle", "style/debug/theme/bookmark_style"); + convertor.convert("style/debug/theme/caretColor", "style/debug/theme/caret_color"); + convertor.convert("style/debug/theme/defaultColor", "style/debug/theme/default_color"); + convertor.convert ("style/debug/theme/defaultStyle", "style/debug/theme/default_style"); + convertor.convert("style/debug/theme/selectionBgColor", "style/debug/theme/selection_bg_color"); + + convertor.convert("style/debug/window/showHorzScrollBar", "style/debug/window/show_horz_scroll_bar"); + convertor.convert("style/debug/window/wordWrap", "style/debug/window/word_wrap"); + + convertor.convert("style/editor/autoComplete/showFullList", "style/editor/auto_complete/show_full_list"); + convertor.convert("style/editor/autoComplete/useAutoComplete", "style/editor/auto_complete/use_auto_complete"); + + convertor.remove("style/editor/buffer"); + + convertor.convert("style/editor/font/name", "style/editor/font/name"); + convertor.convert ("style/editor/font/size", "style/editor/font/size"); + + convertor.convert("style/editor/margin/bookmark", "style/editor/margin/bookmark"); + convertor.convert("style/editor/margin/fold", "style/editor/margin/fold"); + convertor.convert("style/editor/margin/lineNumber", "style/editor/margin/line_number"); + + convertor.convert("style/editor/tab/autoIndent", "style/editor/tab/auto_indent"); + convertor.convert("style/editor/tab/backspaceUntabs", "style/editor/tab/backspace_untabs"); + convertor.convert ("style/editor/tab/indentSize", "style/editor/tab/indent_size"); + convertor.convert("style/editor/tab/tabIndents", "style/editor/tab/tab_indents"); + convertor.convert ("style/editor/tab/tabSize", "style/editor/tab/tab_size"); + convertor.convert("style/editor/tab/useTabs", "style/editor/tab/use_tabs"); + + convertor.convert("style/editor/theme/backgroundColor", "style/editor/theme/background_color"); + convertor.convert("style/editor/theme/bookmarkBgColor", "style/editor/theme/bookmark_bg_color"); + convertor.convert("style/editor/theme/bookmarkFgColor", "style/editor/theme/bookmark_fg_color"); + convertor.convert ("style/editor/theme/bookmarkStyle", "style/editor/theme/bookmark_style"); + convertor.convert("style/editor/theme/caretColor", "style/editor/theme/caret_color"); + convertor.convert("style/editor/theme/colorColor", "style/editor/theme/color_color"); + convertor.convert("style/editor/theme/commentColor", "style/editor/theme/comment_color"); + convertor.convert ("style/editor/theme/commentFold", "style/editor/theme/comment_fold"); + convertor.convert ("style/editor/theme/commentStyle", "style/editor/theme/comment_style"); + convertor.convert("style/editor/theme/defaultColor", "style/editor/theme/default_color"); + convertor.convert ("style/editor/theme/defaultStyle", "style/editor/theme/default_style"); + convertor.convert("style/editor/theme/errorBgColor", "style/editor/theme/error_bg_color"); + convertor.convert("style/editor/theme/foldBgColor", "style/editor/theme/fold_bg_color"); + convertor.convert("style/editor/theme/foldFgColor", "style/editor/theme/fold_fg_color"); + convertor.convert ("style/editor/theme/foldStyle", "style/editor/theme/fold_style"); + convertor.convert("style/editor/theme/functionsColor", "style/editor/theme/functions_color"); + convertor.convert ("style/editor/theme/functionsStyle", "style/editor/theme/functions_style"); + convertor.convert("style/editor/theme/identifierColor", "style/editor/theme/identifier_color"); + convertor.convert ("style/editor/theme/identifierStyle", "style/editor/theme/identifier_style"); + convertor.convert("style/editor/theme/keywordColor", "style/editor/theme/keyword_color"); + convertor.convert ("style/editor/theme/keywordStyle", "style/editor/theme/keyword_style"); + convertor.convert("style/editor/theme/numberColor", "style/editor/theme/number_color"); + convertor.convert ("style/editor/theme/numberStyle", "style/editor/theme/number_style"); + convertor.convert("style/editor/theme/operatorColor", "style/editor/theme/operator_color"); + convertor.convert ("style/editor/theme/operatorStyle", "style/editor/theme/operator_style"); + convertor.convert("style/editor/theme/selectionBgColor", "style/editor/theme/selection_bg_color"); + convertor.convert("style/editor/theme/stringColor", "style/editor/theme/string_color"); + convertor.convert ("style/editor/theme/stringStyle", "style/editor/theme/string_style"); + convertor.convert("style/editor/theme/traceColor", "style/editor/theme/trace_color"); + + convertor.convert("style/editor/window/showHorzScrollBar", "style/editor/window/show_horz_scroll_bar"); + convertor.convert("style/editor/window/wordWrap", "style/editor/window/word_wrap"); + + convertor.convert("style/find/font/name", "style/find/font/name"); + convertor.convert ("style/find/font/size", "style/find/font/size"); + + convertor.convert("style/find/tab/autoIndent", "style/find/tab/auto_indent"); + convertor.convert("style/find/tab/backspaceUntabs", "style/find/tab/backspace_untabs"); + convertor.convert ("style/find/tab/indentSize", "style/find/tab/indent_size"); + convertor.convert("style/find/tab/tabIndents", "style/find/tab/tab_indents"); + convertor.convert ("style/find/tab/tabSize", "style/find/tab/tab_size"); + convertor.convert("style/find/tab/useTabs", "style/find/tab/use_tabs"); + + convertor.convert("style/find/theme/backgroundColor", "style/find/theme/background_color"); + convertor.convert("style/find/theme/bookmarkBgColor", "style/find/theme/bookmark_bg_color"); + convertor.convert("style/find/theme/bookmarkFgColor", "style/find/theme/bookmark_fg_color"); + convertor.convert ("style/find/theme/bookmarkStyle", "style/find/theme/bookmark_style"); + convertor.convert("style/find/theme/caretColor", "style/find/theme/caret_color"); + convertor.convert("style/find/theme/defaultColor", "style/find/theme/default_color"); + convertor.convert ("style/find/theme/defaultStyle", "style/find/theme/default_style"); + convertor.convert("style/find/theme/keywordColor", "style/find/theme/keyword_сolor"); + convertor.convert ("style/find/theme/keywordStyle", "style/find/theme/keyword_style"); + convertor.convert("style/find/theme/selectionBgColor", "style/find/theme/selection_bg_color"); + convertor.convert("style/find/theme/selectLineBgColor", "style/find/theme/select_line_bg_color"); + + convertor.convert("style/find/window/showHorzScrollBar", "style/find/window/show_horz_scroll_bar"); + convertor.convert("style/find/window/wordWrap", "style/find/window/word_wrap"); + + convertor.convert("style/frame/font/name", "style/frame/font/name"); + convertor.convert ("style/frame/font/size", "style/frame/font/size"); + + convertor.convert("style/frame/theme/backgroundColor", "style/frame/theme/background_color"); + convertor.convert("style/frame/theme/defaultColor", "style/frame/theme/default_color"); + convertor.convert ("style/frame/theme/defaultStyle", "style/frame/theme/default_style"); + + convertor.convert("style/results/font/name", "style/results/font/name"); + convertor.convert ("style/results/font/size", "style/results/font/size"); + + convertor.convert("style/results/tab/autoIndent", "style/results/tab/auto_indent"); + convertor.convert("style/results/tab/backspaceUntabs", "style/results/tab/backspace_untabs"); + convertor.convert ("style/results/tab/indentSize", "style/results/tab/indent_size"); + convertor.convert("style/results/tab/tabIndents", "style/results/tab/tab_indents"); + convertor.convert ("style/results/tab/tabSize", "style/results/tab/tab_size"); + convertor.convert("style/results/tab/useTabs", "style/results/tab/use_tabs"); + + convertor.convert("style/results/theme/backgroundColor", "style/results/theme/background_color"); + convertor.convert("style/results/theme/bookmarkBgColor", "style/results/theme/bookmark_bg_color"); + convertor.convert("style/results/theme/bookmarkFgColor", "style/results/theme/bookmark_fg_color"); + convertor.convert ("style/results/theme/bookmarkStyle", "style/results/theme/bookmark_style"); + convertor.convert("style/results/theme/caretColor", "style/results/theme/caret_color"); + convertor.convert("style/results/theme/colorColor", "style/results/theme/color_color"); + convertor.convert("style/results/theme/commentColor", "style/results/theme/comment_color"); + convertor.convert ("style/results/theme/commentStyle", "style/results/theme/comment_style"); + convertor.convert("style/results/theme/defaultColor", "style/results/theme/default_color"); + convertor.convert ("style/results/theme/defaultStyle", "style/results/theme/default_style"); + convertor.convert("style/results/theme/functionsColor", "style/results/theme/functions_color"); + convertor.convert ("style/results/theme/functionsStyle", "style/results/theme/functions_style"); + convertor.convert("style/results/theme/identifierColor", "style/results/theme/identifier_color"); + convertor.convert ("style/results/theme/identifierStyle", "style/results/theme/identifier_style"); + convertor.convert("style/results/theme/keywordColor", "style/results/theme/keyword_color"); + convertor.convert ("style/results/theme/keywordStyle", "style/results/theme/keyword_style"); + convertor.convert("style/results/theme/numberColor", "style/results/theme/number_color"); + convertor.convert ("style/results/theme/numberStyle", "style/results/theme/number_style"); + convertor.convert("style/results/theme/operatorColor", "style/results/theme/operator_color"); + convertor.convert ("style/results/theme/operatorStyle", "style/results/theme/operator_style"); + convertor.convert("style/results/theme/selectionBgColor", "style/results/theme/selection_bg_color"); + convertor.convert("style/results/theme/stringColor", "style/results/theme/string_color"); + convertor.convert ("style/results/theme/stringStyle", "style/results/theme/string_style"); + convertor.convert("style/results/theme/traceColor", "style/results/theme/trace_color"); + + convertor.convert("style/results/window/showHorzScrollBar", "style/results/window/show_horz_scroll_bar"); + convertor.convert("style/results/window/wordWrap", "style/results/window/word_wrap"); + + convertor.convert("style/trace/borders/horzBorder", "style/trace/borders/horz_border"); + convertor.convert("style/trace/borders/vertBorder", "style/trace/borders/vert_border"); + + convertor.convert("style/trace/font/name", "style/trace/font/name"); + convertor.convert ("style/trace/font/size", "style/trace/font/size"); + + convertor.convert("style/trace/theme/defaultColor_backgroundColor", "style/trace/theme/default_color_background_color"); + convertor.convert("style/trace/theme/defaultColor_foregroundColor", "style/trace/theme/default_color_foreground_color"); + convertor.convert("style/trace/theme/dps_backgroundColor", "style/trace/theme/dps_background_color"); + convertor.convert("style/trace/theme/dps_foregroundColor", "style/trace/theme/dps_foreground_color"); + convertor.convert("style/trace/theme/eb_backgroundColor", "style/trace/theme/eb_background_color"); + convertor.convert("style/trace/theme/eb_foregroundColor", "style/trace/theme/eb_foreground_color"); + convertor.convert("style/trace/theme/ef_backgroundColor", "style/trace/theme/ef_background_color"); + convertor.convert("style/trace/theme/ef_foregroundColor", "style/trace/theme/ef_foreground_color"); + convertor.convert("style/trace/theme/ei_backgroundColor", "style/trace/theme/ei_background_color"); + convertor.convert("style/trace/theme/ei_foregroundColor", "style/trace/theme/ei_foreground_color"); + convertor.convert("style/trace/theme/er_backgroundColor", "style/trace/theme/er_background_color"); + convertor.convert("style/trace/theme/er_foregroundColor", "style/trace/theme/er_foreground_color"); + convertor.convert("style/trace/theme/es_backgroundColor", "style/trace/theme/es_background_color"); + convertor.convert("style/trace/theme/es_foregroundColor", "style/trace/theme/es_foreground_color"); + convertor.convert("style/trace/theme/rc_backgroundColor", "style/trace/theme/rc_background_color"); + convertor.convert("style/trace/theme/rc_foregroundColor", "style/trace/theme/rc_foreground_color"); + convertor.convert("style/trace/theme/re_backgroundColor", "style/trace/theme/re_background_color"); + convertor.convert("style/trace/theme/re_foregroundColor", "style/trace/theme/re_foreground_color"); + convertor.convert("style/trace/theme/rk_backgroundColor", "style/trace/theme/rk_background_color"); + convertor.convert("style/trace/theme/rk_foregroundColor", "style/trace/theme/rk_foreground_color"); + convertor.convert("style/trace/theme/s_backgroundColor", "style/trace/theme/s_background_color"); + convertor.convert("style/trace/theme/s_foregroundColor", "style/trace/theme/s_foreground_color"); + convertor.convert("style/trace/theme/sb_backgroundColor", "style/trace/theme/sb_background_color"); + convertor.convert("style/trace/theme/sb_foregroundColor", "style/trace/theme/sb_foreground_color"); + convertor.convert("style/trace/theme/sd_backgroundColor", "style/trace/theme/sd_background_color"); + convertor.convert("style/trace/theme/sd_foregroundColor", "style/trace/theme/sd_foreground_color"); + convertor.convert("style/trace/theme/sef_backgroundColor", "style/trace/theme/sef_background_color"); + convertor.convert("style/trace/theme/sef_foregroundColor", "style/trace/theme/sef_foreground_color"); + convertor.convert("style/trace/theme/sem_backgroundColor", "style/trace/theme/sem_background_color"); + convertor.convert("style/trace/theme/sem_foregroundColor", "style/trace/theme/sem_foreground_color"); + convertor.convert("style/trace/theme/sen_backgroundColor", "style/trace/theme/sen_background_color"); + convertor.convert("style/trace/theme/sen_foregroundColor", "style/trace/theme/sen_foreground_color"); + convertor.convert("style/trace/theme/ses_backgroundColor", "style/trace/theme/ses_background_color"); + convertor.convert("style/trace/theme/ses_foregroundColor", "style/trace/theme/ses_foreground_color"); + convertor.convert("style/trace/theme/seu_backgroundColor", "style/trace/theme/seu_background_color"); + convertor.convert("style/trace/theme/seu_foregroundColor", "style/trace/theme/seu_foreground_color"); + convertor.convert("style/trace/theme/so_backgroundColor", "style/trace/theme/so_background_color"); + convertor.convert("style/trace/theme/so_foregroundColor", "style/trace/theme/so_foreground_color"); + convertor.convert("style/trace/theme/src_backgroundColor", "style/trace/theme/src_background_color"); + convertor.convert("style/trace/theme/src_foregroundColor", "style/trace/theme/src_foreground_color"); + convertor.convert("style/trace/theme/sre_backgroundColor", "style/trace/theme/sre_background_color"); + convertor.convert("style/trace/theme/sre_foregroundColor", "style/trace/theme/sre_foreground_color"); + convertor.convert("style/trace/theme/srk_backgroundColor", "style/trace/theme/srk_background_color"); + convertor.convert("style/trace/theme/srk_foregroundColor", "style/trace/theme/srk_foreground_color"); + convertor.convert("style/trace/theme/std_backgroundColor", "style/trace/theme/std_background_color"); + convertor.convert("style/trace/theme/std_foregroundColor", "style/trace/theme/std_foreground_color"); + convertor.convert("style/trace/theme/stn_backgroundColor", "style/trace/theme/stn_background_color"); + convertor.convert("style/trace/theme/stn_foregroundColor", "style/trace/theme/stn_foreground_color"); + convertor.convert("style/trace/theme/str_backgroundColor", "style/trace/theme/str_background_color"); + convertor.convert("style/trace/theme/str_foregroundColor", "style/trace/theme/str_foreground_color"); + convertor.convert ("style/trace/theme/style", "style/trace/theme/style"); + convertor.convert("style/trace/theme/v_backgroundColor", "style/trace/theme/v_background_color"); + convertor.convert("style/trace/theme/v_foregroundColor", "style/trace/theme/v_foreground_color"); + + convertor.remove("style"); + } } #endif diff --git a/app/rdo_studio/src/application.h b/app/rdo_studio/src/application.h index 9b9e31174..1f4531a57 100644 --- a/app/rdo_studio/src/application.h +++ b/app/rdo_studio/src/application.h @@ -1,9 +1,7 @@ -#ifndef _RDO_STUDIO_APPLICATION_H_ -#define _RDO_STUDIO_APPLICATION_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" -#include #include #include #include @@ -31,91 +29,79 @@ class Tracer; }}} class Application - : public QApplication - , public rdo::gui::ISharedObjectService + : public QApplication + , public rdo::gui::ISharedObjectService { public: - Application(int& argc, char** argv); - virtual ~Application(); + Application(int& argc, char** argv); + virtual ~Application(); - virtual RDOKernel* getKernel () const; - virtual rdo::gui::tracer::Tracer* getTracer () const; - virtual MainWindow* getMainWndUI() const; + virtual RDOKernel* getKernel () const; + virtual rdo::gui::tracer::Tracer* getTracer () const; + virtual MainWindow* getMainWndUI() const; - QMainWindow* getMainWnd (); - MainWindowBase* getIMainWnd(); - MainWindowBase* getStyle (); + QMainWindow* getMainWnd (); + MainWindowBase* getIMainWnd(); + MainWindowBase* getStyle (); - //! см. описание RDOKernelGUI - //! Главная треда самого приложения, т.е. кернет для win32-gui, но не кернел системы - RDOThread* m_pStudioGUI; + // см. описание RDOKernelGUI + // Главная треда самого приложения, т.е. кернет для win32-gui, но не кернел системы + RDOThread* m_pStudioGUI; - std::ofstream& log(); + void broadcastMessage(RDOThread::Message message, void* pParam = NULL); - void broadcastMessage(RDOThread::RDOTreadMessage message, void* pParam = NULL); + bool getFileAssociationSetup() const; + void setFileAssociationSetup(bool value); - bool getFileAssociationSetup() const; - void setFileAssociationSetup(bool value); + bool getFileAssociationCheckInFuture() const; + void setFileAssociationCheckInFuture(bool value); - bool getFileAssociationCheckInFuture() const; - void setFileAssociationCheckInFuture(bool value); + bool getOpenLastProject() const; + void setOpenLastProject(bool value); - bool getOpenLastProject() const; - void setOpenLastProject(bool value); + const QString& getLastProjectName() const; + void setLastProjectName(const QString& projectName); - const QString& getLastProjectName() const; - void setLastProjectName(const QString& projectName); + bool getShowCaptionFullName() const; + void setShowCaptionFullName(bool value); - bool getShowCaptionFullName() const; - void setShowCaptionFullName(bool value); + void autoCloseByModel (); - void autoCloseByModel (); + QString getFullHelpFileName (const QString& helpFileName = "RAO-help.qhc") const; + QString chkHelpExist (const QString& helpFileName) const; + void chkAndRunQtAssistant(); + QProcess* runQtAssistant () const; + void callQtAssistant (const QByteArray& ba); - QString getFullHelpFileName (const QString& helpFileName = "RAO-help.qhc") const; - QString chkHelpExist (const QString& helpFileName) const; - void chkAndRunQtAssistant(); - QProcess* runQtAssistant () const; - void callQtAssistant (const QByteArray& ba); - - const rdo::gui::editor::LPModelStyle& getModelStyle() const; - rdo::plugin::Loader& getPluginLoader(); + const rdo::gui::editor::LPModelStyle& getModelStyle() const; + rdo::plugin::Loader& getPluginLoader(); private: -#ifdef RDO_MT - // Используется для рассылки широковещательных уведомлений из приложения. - // При этом, не происходит остановки работы самого приложения, и имеется возможность - // обрабатывать новые присылаемые приложению сообщения. - ThreadStudio* m_pStudioMT; -#endif - - std::ofstream m_log; - bool m_fileAssociationSetup; - bool m_fileAssociationCheckInFuture; - bool m_openLastProject; - QString m_lastProjectName; - bool m_showCaptionFullName; - bool m_autoExitByModel; - bool m_dontCloseIfError; - rdo::simulation::report::RDOExitCode m_exitCode; - QProcess* m_pAssistant; - MainWindow* m_pMainFrame; - rdo::gui::editor::LPModelStyle m_pModelStyle; - QTimer m_initTimer; - QTimer m_idleTimer; - rdo::plugin::Loader m_pluginLoader; - - void onInit(int argc, char** argv); - - void setupFileAssociation(); + bool m_fileAssociationSetup; + bool m_fileAssociationCheckInFuture; + bool m_openLastProject; + QString m_lastProjectName; + bool m_showCaptionFullName; + bool m_autoExitByModel; + bool m_dontCloseIfError; + rdo::simulation::report::ExitCode m_exitCode; + QProcess* m_pAssistant; + MainWindow* m_pMainFrame; + rdo::gui::editor::LPModelStyle m_pModelStyle; + QTimer m_initTimer; + QTimer m_idleTimer; + rdo::plugin::Loader m_pluginLoader; + + void onInit(int argc, char** argv); + + void setupFileAssociation(); #ifdef Q_OS_WIN - void convertSettings() const; + void convertSettings() const; #endif private slots: - void onIdle(); + void onIdle(); }; // -------------------------------------------------------------------------------- extern Application* g_pApp; - -#endif // _RDO_STUDIO_APPLICATION_H_ diff --git a/app/rdo_studio/src/dialog/about_dialog.cpp b/app/rdo_studio/src/dialog/about_dialog.cpp index e4e5cd588..57067dee0 100644 --- a/app/rdo_studio/src/dialog/about_dialog.cpp +++ b/app/rdo_studio/src/dialog/about_dialog.cpp @@ -9,21 +9,21 @@ // -------------------------------------------------------------------------------- AboutDialog::AboutDialog(QWidget* pParent) - : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) + : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) { - setupUi(this); + setupUi(this); - version->setText(QString("Система имитационного моделирования\n\n%1") - .arg(QString::fromStdString(rdo::version::g_versionName))); + version->setText(QString("Система имитационного моделирования\n\n%1") + .arg(QString::fromStdString(rdo::version::g_versionName))); - www->setText(QString::fromStdString(boost::str( - boost::format("%2%") - % rdo::version::g_site - % boost::algorithm::erase_first_copy(rdo::version::g_site, "http://") - ))); + www->setText(QString::fromStdString(boost::str( + boost::format("%2%") + % rdo::version::g_site + % boost::algorithm::erase_first_copy(rdo::version::g_site, "http://") + ))); - if (pParent) - { - move(pParent->frameGeometry().center() - frameGeometry().center()); - } + if (pParent) + { + move(pParent->frameGeometry().center() - frameGeometry().center()); + } } diff --git a/app/rdo_studio/src/dialog/about_dialog.h b/app/rdo_studio/src/dialog/about_dialog.h index 7e954235b..f0889ca13 100644 --- a/app/rdo_studio/src/dialog/about_dialog.h +++ b/app/rdo_studio/src/dialog/about_dialog.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DIALOG_ABOUT_DIALOG_H_ -#define _RDO_STUDIO_DIALOG_ABOUT_DIALOG_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -14,7 +13,5 @@ class AboutDialog: public QDialog, private Ui::AboutDialog Q_OBJECT public: - explicit AboutDialog(QWidget* pParent = NULL); + explicit AboutDialog(QWidget* pParent = NULL); }; - -#endif // _RDO_STUDIO_DIALOG_ABOUT_DIALOG_H_ diff --git a/app/rdo_studio/src/dialog/file_association_dialog.cpp b/app/rdo_studio/src/dialog/file_association_dialog.cpp index 30a295164..65186ae0a 100644 --- a/app/rdo_studio/src/dialog/file_association_dialog.cpp +++ b/app/rdo_studio/src/dialog/file_association_dialog.cpp @@ -6,9 +6,9 @@ // -------------------------------------------------------------------------------- FileAssociationDialog::FileAssociationDialog(QWidget* pParent) - : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) + : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) { - setupUi(this); + setupUi(this); } FileAssociationDialog::~FileAssociationDialog() diff --git a/app/rdo_studio/src/dialog/file_association_dialog.h b/app/rdo_studio/src/dialog/file_association_dialog.h index 5ffd175f4..cb95835e8 100644 --- a/app/rdo_studio/src/dialog/file_association_dialog.h +++ b/app/rdo_studio/src/dialog/file_association_dialog.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DIALOG_FILE_ASSOCIATION_DIALOG_H_ -#define _RDO_STUDIO_DIALOG_FILE_ASSOCIATION_DIALOG_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -10,14 +9,12 @@ // -------------------------------------------------------------------------------- class FileAssociationDialog - : public QDialog - , public Ui::FileAssociationDialog + : public QDialog + , public Ui::FileAssociationDialog { Q_OBJECT public: - FileAssociationDialog(QWidget* pParent); - virtual ~FileAssociationDialog(); + FileAssociationDialog(QWidget* pParent); + virtual ~FileAssociationDialog(); }; - -#endif // _RDO_STUDIO_DIALOG_FILE_ASSOCIATION_DIALOG_H_ diff --git a/app/rdo_studio/src/dialog/find_dialog.cpp b/app/rdo_studio/src/dialog/find_dialog.cpp index d75bac7d3..98555a701 100644 --- a/app/rdo_studio/src/dialog/find_dialog.cpp +++ b/app/rdo_studio/src/dialog/find_dialog.cpp @@ -6,82 +6,82 @@ // -------------------------------------------------------------------------------- FindDialog::Settings::Settings() - : matchCase (false) - , matchWholeWord(false) - , searchDown (true ) + : matchCase (false) + , matchWholeWord(false) + , searchDown (true ) {} FindDialog::Settings::Settings(const Settings& settings) - : what (settings.what ) - , matchCase (settings.matchCase ) - , matchWholeWord(settings.matchWholeWord) - , searchDown (settings.searchDown ) + : what (settings.what ) + , matchCase (settings.matchCase ) + , matchWholeWord(settings.matchWholeWord) + , searchDown (settings.searchDown ) {} FindDialog::FindDialog(QWidget* pParent, const OnFindCallback& onFindCallback, const OnCloseCallback& onCloseCallback) - : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) - , m_onFindCallback (onFindCallback ) - , m_onCloseCallback(onCloseCallback) + : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) + , m_onFindCallback (onFindCallback ) + , m_onCloseCallback(onCloseCallback) { - setupUi(this); + setupUi(this); - layout()->setSizeConstraint(QLayout::SetFixedSize); + layout()->setSizeConstraint(QLayout::SetFixedSize); - connect(findButton, SIGNAL(clicked(bool)), this, SLOT(onFindButton())); - connect(cancelButton, SIGNAL(clicked(bool)), this, SLOT(reject())); - connect(lineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onWhatEdited(const QString&))); - connect(matchCase, SIGNAL(stateChanged(int)), this, SLOT(onMatchCaseChanged(int))); - connect(wholeWord, SIGNAL(stateChanged(int)), this, SLOT(onMatchWholeWordChanged(int))); - connect(directionDown, SIGNAL(toggled(bool)), this, SLOT(onDirectionDownToggled(bool))); + connect(findButton, SIGNAL(clicked(bool)), this, SLOT(onFindButton())); + connect(cancelButton, SIGNAL(clicked(bool)), this, SLOT(reject())); + connect(lineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onWhatEdited(const QString&))); + connect(matchCase, SIGNAL(stateChanged(int)), this, SLOT(onMatchCaseChanged(int))); + connect(wholeWord, SIGNAL(stateChanged(int)), this, SLOT(onMatchWholeWordChanged(int))); + connect(directionDown, SIGNAL(toggled(bool)), this, SLOT(onDirectionDownToggled(bool))); - setAttribute(Qt::WA_DeleteOnClose, true); + setAttribute(Qt::WA_DeleteOnClose, true); } FindDialog::~FindDialog() { - m_onCloseCallback(); + m_onCloseCallback(); } void FindDialog::setSettings(const Settings& settings) { - m_settings = settings; + m_settings = settings; - lineEdit->setText(m_settings.what); - lineEdit->setFocus(); - lineEdit->selectAll(); - matchCase->setChecked(m_settings.matchCase); - wholeWord->setChecked(m_settings.matchWholeWord); - if (m_settings.searchDown) - { - directionDown->setChecked(true); - } - else - { - directionUp->setChecked(true); - } + lineEdit->setText(m_settings.what); + lineEdit->setFocus(); + lineEdit->selectAll(); + matchCase->setChecked(m_settings.matchCase); + wholeWord->setChecked(m_settings.matchWholeWord); + if (m_settings.searchDown) + { + directionDown->setChecked(true); + } + else + { + directionUp->setChecked(true); + } } void FindDialog::onFindButton() { - m_onFindCallback(m_settings); + m_onFindCallback(m_settings); } void FindDialog::onWhatEdited(const QString& text) { - m_settings.what = text; + m_settings.what = text; } void FindDialog::onMatchCaseChanged(int value) { - m_settings.matchCase = value ? true : false; + m_settings.matchCase = value ? true : false; } void FindDialog::onMatchWholeWordChanged(int value) { - m_settings.matchWholeWord = value ? true : false; + m_settings.matchWholeWord = value ? true : false; } void FindDialog::onDirectionDownToggled(bool checked) { - m_settings.searchDown = checked; + m_settings.searchDown = checked; } diff --git a/app/rdo_studio/src/dialog/find_dialog.h b/app/rdo_studio/src/dialog/find_dialog.h index 6f44fa0b7..4ca5b789b 100644 --- a/app/rdo_studio/src/dialog/find_dialog.h +++ b/app/rdo_studio/src/dialog/find_dialog.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DIALOG_FIND_DIALOG_H_ -#define _RDO_STUDIO_DIALOG_FIND_DIALOG_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -11,42 +10,40 @@ // -------------------------------------------------------------------------------- class FindDialog - : public QDialog - , private Ui::FindDialog + : public QDialog + , private Ui::FindDialog { Q_OBJECT public: - struct Settings - { - QString what; - bool matchCase; - bool matchWholeWord; - bool searchDown; + struct Settings + { + QString what; + bool matchCase; + bool matchWholeWord; + bool searchDown; - Settings(); - Settings(const Settings& settings); - }; + Settings(); + Settings(const Settings& settings); + }; - typedef boost::function OnFindCallback; - typedef boost::function OnCloseCallback; + typedef boost::function OnFindCallback; + typedef boost::function OnCloseCallback; - FindDialog(QWidget* pParent, const OnFindCallback& onFindCallback, const OnCloseCallback& onCloseCallback); - virtual ~FindDialog(); + FindDialog(QWidget* pParent, const OnFindCallback& onFindCallback, const OnCloseCallback& onCloseCallback); + virtual ~FindDialog(); - void setSettings(const Settings& settings); + void setSettings(const Settings& settings); private: - Settings m_settings; - OnFindCallback m_onFindCallback; - OnCloseCallback m_onCloseCallback; + Settings m_settings; + OnFindCallback m_onFindCallback; + OnCloseCallback m_onCloseCallback; private slots: - void onFindButton (); - void onWhatEdited (const QString& text); - void onMatchCaseChanged (int value); - void onMatchWholeWordChanged(int value); - void onDirectionDownToggled (bool checked); + void onFindButton (); + void onWhatEdited (const QString& text); + void onMatchCaseChanged (int value); + void onMatchWholeWordChanged(int value); + void onDirectionDownToggled (bool checked); }; - -#endif // _RDO_STUDIO_DIALOG_FIND_DIALOG_H_ diff --git a/app/rdo_studio/src/dialog/find_replace_dialog.cpp b/app/rdo_studio/src/dialog/find_replace_dialog.cpp index 342cfab52..74dc31d70 100644 --- a/app/rdo_studio/src/dialog/find_replace_dialog.cpp +++ b/app/rdo_studio/src/dialog/find_replace_dialog.cpp @@ -9,86 +9,86 @@ FindReplaceDialog::Settings::Settings() {} FindReplaceDialog::Settings::Settings(const Settings& settings) - : FindDialog::Settings(settings) - , byWhat(settings.byWhat) + : FindDialog::Settings(settings) + , byWhat(settings.byWhat) {} FindReplaceDialog::FindReplaceDialog(QWidget* pParent, const OnFindCallback& onFindCallback, const OnFindCallback& onReplaceCallback, const OnFindCallback& onReplaceAllCallback, const OnCloseCallback& onCloseCallback) - : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) - , m_onFindCallback (onFindCallback ) - , m_onReplaceCallback (onReplaceCallback ) - , m_onReplaceAllCallback(onReplaceAllCallback) - , m_onCloseCallback (onCloseCallback ) + : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) + , m_onFindCallback (onFindCallback ) + , m_onReplaceCallback (onReplaceCallback ) + , m_onReplaceAllCallback(onReplaceAllCallback) + , m_onCloseCallback (onCloseCallback ) { - setupUi(this); + setupUi(this); - layout()->setSizeConstraint(QLayout::SetFixedSize); + layout()->setSizeConstraint(QLayout::SetFixedSize); - connect(findButton, SIGNAL(clicked()), this, SLOT(onFindButton())); - connect(replaceButton, SIGNAL(clicked()), this, SLOT(onReplaceButton())); - connect(replaceAllButton, SIGNAL(clicked()), this, SLOT(onReplaceAllButton())); - connect(whatLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onWhatEdited(const QString&))); - connect(byWhatLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onByWhatEdited(const QString&))); - connect(matchCase, SIGNAL(stateChanged(int)), this, SLOT(onMatchCaseChanged(int))); - connect(wholeWord, SIGNAL(stateChanged(int)), this, SLOT(onMatchWholeWordChanged(int))); - connect(directionDown, SIGNAL(toggled(bool)), this, SLOT(onDirectionDownToggled(bool))); + connect(findButton, SIGNAL(clicked()), this, SLOT(onFindButton())); + connect(replaceButton, SIGNAL(clicked()), this, SLOT(onReplaceButton())); + connect(replaceAllButton, SIGNAL(clicked()), this, SLOT(onReplaceAllButton())); + connect(whatLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onWhatEdited(const QString&))); + connect(byWhatLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onByWhatEdited(const QString&))); + connect(matchCase, SIGNAL(stateChanged(int)), this, SLOT(onMatchCaseChanged(int))); + connect(wholeWord, SIGNAL(stateChanged(int)), this, SLOT(onMatchWholeWordChanged(int))); + connect(directionDown, SIGNAL(toggled(bool)), this, SLOT(onDirectionDownToggled(bool))); - setAttribute(Qt::WA_DeleteOnClose, true); + setAttribute(Qt::WA_DeleteOnClose, true); } FindReplaceDialog::~FindReplaceDialog() { - m_onCloseCallback(); + m_onCloseCallback(); } void FindReplaceDialog::setSettings(const Settings& settings) { - m_settings = settings; - - whatLineEdit->setText(m_settings.what); - whatLineEdit->setFocus(); - whatLineEdit->selectAll(); - byWhatLineEdit->setText(m_settings.byWhat); - matchCase->setChecked(m_settings.matchCase); - wholeWord->setChecked(m_settings.matchWholeWord); + m_settings = settings; + + whatLineEdit->setText(m_settings.what); + whatLineEdit->setFocus(); + whatLineEdit->selectAll(); + byWhatLineEdit->setText(m_settings.byWhat); + matchCase->setChecked(m_settings.matchCase); + wholeWord->setChecked(m_settings.matchWholeWord); } void FindReplaceDialog::onFindButton() { - m_onFindCallback(m_settings); + m_onFindCallback(m_settings); } void FindReplaceDialog::onReplaceButton() { - m_onReplaceCallback(m_settings); + m_onReplaceCallback(m_settings); } void FindReplaceDialog::onReplaceAllButton() { - m_onReplaceAllCallback(m_settings); + m_onReplaceAllCallback(m_settings); } void FindReplaceDialog::onWhatEdited(const QString& text) { - m_settings.what = text; + m_settings.what = text; } void FindReplaceDialog::onByWhatEdited(const QString& text) { - m_settings.byWhat = text; + m_settings.byWhat = text; } void FindReplaceDialog::onMatchCaseChanged(int value) { - m_settings.matchCase = value ? true : false; + m_settings.matchCase = value ? true : false; } void FindReplaceDialog::onMatchWholeWordChanged(int value) { - m_settings.matchWholeWord = value ? true : false; + m_settings.matchWholeWord = value ? true : false; } void FindReplaceDialog::onDirectionDownToggled(bool checked) { - m_settings.searchDown = checked; + m_settings.searchDown = checked; } diff --git a/app/rdo_studio/src/dialog/find_replace_dialog.h b/app/rdo_studio/src/dialog/find_replace_dialog.h index 28864d10d..5998c6a8e 100644 --- a/app/rdo_studio/src/dialog/find_replace_dialog.h +++ b/app/rdo_studio/src/dialog/find_replace_dialog.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DIALOG_FIND_REPLACE_DIALOG_H_ -#define _RDO_STUDIO_DIALOG_FIND_REPLACE_DIALOG_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -12,44 +11,42 @@ // -------------------------------------------------------------------------------- class FindReplaceDialog - : public QDialog - , public Ui::FindReplaceDialog + : public QDialog + , public Ui::FindReplaceDialog { Q_OBJECT public: - struct Settings : public FindDialog::Settings - { - QString byWhat; + struct Settings : public FindDialog::Settings + { + QString byWhat; - Settings(); - Settings(const Settings& settings); - }; + Settings(); + Settings(const Settings& settings); + }; - typedef boost::function OnFindCallback; - typedef boost::function OnCloseCallback; + typedef boost::function OnFindCallback; + typedef boost::function OnCloseCallback; - FindReplaceDialog(QWidget* pParent, const OnFindCallback& onFindCallback, const OnFindCallback& onReplaceCallback, const OnFindCallback& onReplaceAllCallback, const OnCloseCallback& onCloseCallback); - virtual ~FindReplaceDialog(); + FindReplaceDialog(QWidget* pParent, const OnFindCallback& onFindCallback, const OnFindCallback& onReplaceCallback, const OnFindCallback& onReplaceAllCallback, const OnCloseCallback& onCloseCallback); + virtual ~FindReplaceDialog(); - void setSettings(const Settings& settings); + void setSettings(const Settings& settings); private: - Settings m_settings; - OnFindCallback m_onFindCallback; - OnFindCallback m_onReplaceCallback; - OnFindCallback m_onReplaceAllCallback; - OnCloseCallback m_onCloseCallback; + Settings m_settings; + OnFindCallback m_onFindCallback; + OnFindCallback m_onReplaceCallback; + OnFindCallback m_onReplaceAllCallback; + OnCloseCallback m_onCloseCallback; private slots: - void onFindButton(); - void onReplaceButton(); - void onReplaceAllButton(); - void onWhatEdited (const QString& text); - void onByWhatEdited (const QString& text); - void onMatchCaseChanged (int value); - void onMatchWholeWordChanged(int value); - void onDirectionDownToggled (bool checked); + void onFindButton(); + void onReplaceButton(); + void onReplaceAllButton(); + void onWhatEdited (const QString& text); + void onByWhatEdited (const QString& text); + void onMatchCaseChanged (int value); + void onMatchWholeWordChanged(int value); + void onDirectionDownToggled (bool checked); }; - -#endif // _RDO_STUDIO_DIALOG_FIND_REPLACE_DIALOG_H_ diff --git a/app/rdo_studio/src/dialog/goto_line_dialog.cpp b/app/rdo_studio/src/dialog/goto_line_dialog.cpp index 20b208a5a..9c0406bc2 100644 --- a/app/rdo_studio/src/dialog/goto_line_dialog.cpp +++ b/app/rdo_studio/src/dialog/goto_line_dialog.cpp @@ -6,36 +6,36 @@ // -------------------------------------------------------------------------------- GoToLineDialog::GoToLineDialog(QWidget* pParent, int line, int lineCount) - : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) - , m_line (line ) + : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) + , m_line (line ) { - setupUi(this); + setupUi(this); - layout()->setSizeConstraint(QLayout::SetFixedSize); + layout()->setSizeConstraint(QLayout::SetFixedSize); - label->setText(QString("Номер строки (1-%1):").arg(lineCount)); + label->setText(QString("Номер строки (1-%1):").arg(lineCount)); - lineEdit->setValidator(new QIntValidator(1, lineCount, this)); - lineEdit->setText(QString::number(m_line)); - lineEdit->setFocus(); - lineEdit->selectAll(); + lineEdit->setValidator(new QIntValidator(1, lineCount, this)); + lineEdit->setText(QString::number(m_line)); + lineEdit->setFocus(); + lineEdit->selectAll(); - connect(buttonOk, SIGNAL(clicked()), this, SLOT(onOkButtonClicked())); - connect(lineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); + connect(buttonOk, SIGNAL(clicked()), this, SLOT(onOkButtonClicked())); + connect(lineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); } void GoToLineDialog::onOkButtonClicked() { - m_line = lineEdit->text().toInt(); - done(Accepted); + m_line = lineEdit->text().toInt(); + done(Accepted); } void GoToLineDialog::onCheckInput(const QString& /*text*/) { - buttonOk->setEnabled(lineEdit->text().toInt() >= 1 ? true : false); + buttonOk->setEnabled(lineEdit->text().toInt() >= 1 ? true : false); } int GoToLineDialog::getLine() const { - return m_line; + return m_line; } diff --git a/app/rdo_studio/src/dialog/goto_line_dialog.h b/app/rdo_studio/src/dialog/goto_line_dialog.h index 97db0c6c8..ec23140e7 100644 --- a/app/rdo_studio/src/dialog/goto_line_dialog.h +++ b/app/rdo_studio/src/dialog/goto_line_dialog.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DIALOG_GO_TO_NEXT_LINE_DIALOG_H_ -#define _RDO_STUDIO_DIALOG_GO_TO_NEXT_LINE_DIALOG_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -10,22 +9,20 @@ // -------------------------------------------------------------------------------- class GoToLineDialog - : public QDialog - , private Ui::GoToLineDialog + : public QDialog + , private Ui::GoToLineDialog { Q_OBJECT public: - explicit GoToLineDialog(QWidget* pParent, int line, int lineCount); + explicit GoToLineDialog(QWidget* pParent, int line, int lineCount); - int getLine() const; + int getLine() const; private: - int m_line; + int m_line; private slots: - void onOkButtonClicked(); - void onCheckInput(const QString& text); + void onOkButtonClicked(); + void onCheckInput(const QString& text); }; - -#endif // _RDO_STUDIO_DIALOG_GO_TO_NEXT_LINE_DIALOG_H_ diff --git a/app/rdo_studio/src/dialog/new_model_dialog.cpp b/app/rdo_studio/src/dialog/new_model_dialog.cpp index a69369799..adac7e7ff 100644 --- a/app/rdo_studio/src/dialog/new_model_dialog.cpp +++ b/app/rdo_studio/src/dialog/new_model_dialog.cpp @@ -11,29 +11,29 @@ // -------------------------------------------------------------------------------- NewModelDialog::NewModelDialog(QWidget* pParent) - : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) + : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) { - setupUi(this); + setupUi(this); - layout()->setSizeConstraint(QLayout::SetFixedSize); + layout()->setSizeConstraint(QLayout::SetFixedSize); - m_font = labelError->font(); - m_fontRed = m_font; - m_fontRed.setBold(true); + m_font = labelError->font(); + m_fontRed = m_font; + m_fontRed.setBold(true); - m_palette = labelError->palette(); - m_paletteRed = m_palette; - m_paletteRed.setColor(labelError->foregroundRole(), Qt::red); + m_palette = labelError->palette(); + m_paletteRed = m_palette; + m_paletteRed.setColor(labelError->foregroundRole(), Qt::red); - connect(modelName, SIGNAL(textChanged(const QString&)), this, SLOT(updateUI())); - connect(modelPathButton, SIGNAL(clicked(bool)), this, SLOT(onPathButtonClicked())); + connect(modelName, SIGNAL(textChanged(const QString&)), this, SLOT(updateUI())); + connect(modelPathButton, SIGNAL(clicked(bool)), this, SLOT(onPathButtonClicked())); - QString path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); - if (path.isEmpty()) - { - path = QDir::homePath(); - } - setPath(path); + QString path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); + if (path.isEmpty()) + { + path = QDir::homePath(); + } + setPath(path); } NewModelDialog::~NewModelDialog() @@ -41,98 +41,98 @@ NewModelDialog::~NewModelDialog() void NewModelDialog::setPath(const QString& path) { - QString normPath(path); - if (!normPath.isEmpty()) - { - if (normPath.at(normPath.length()-1) != QChar('/') && normPath.at(normPath.length()-1) != QChar('\\')) - { - normPath += "/"; - } - } - modelPath->setText(normPath); - updateUI(); + QString normPath(path); + if (!normPath.isEmpty()) + { + if (normPath.at(normPath.length()-1) != QChar('/') && normPath.at(normPath.length()-1) != QChar('\\')) + { + normPath += "/"; + } + } + modelPath->setText(normPath); + updateUI(); } void NewModelDialog::updateUI() { - bool error = true; - if (modelName->text().isEmpty()) - { - labelError->setText("Необходимо указать имя модели"); - } - else - { - QString fullName(modelPath->text() + modelName->text()); - QFileInfo fileInfo(fullName); - if (fileInfo.exists()) - { - QString info = fileInfo.isDir() - ? "Такая директория уже существует: '%1'" - : "Такой файл уже существует: '%1'"; - - labelError->setText(info.arg(fullName)); - } - else - { - labelError->setText(QString("Будет создана директория: '%1'").arg(fullName)); - error = false; - } - } - - buttonOk->setEnabled(!error); - labelError->setFont (error ? m_fontRed : m_font ); - labelError->setPalette(error ? m_paletteRed : m_palette); + bool error = true; + if (modelName->text().isEmpty()) + { + labelError->setText("Необходимо указать имя модели"); + } + else + { + QString fullName(modelPath->text() + modelName->text()); + QFileInfo fileInfo(fullName); + if (fileInfo.exists()) + { + QString info = fileInfo.isDir() + ? "Такая директория уже существует: '%1'" + : "Такой файл уже существует: '%1'"; + + labelError->setText(info.arg(fullName)); + } + else + { + labelError->setText(QString("Будет создана директория: '%1'").arg(fullName)); + error = false; + } + } + + buttonOk->setEnabled(!error); + labelError->setFont (error ? m_fontRed : m_font ); + labelError->setPalette(error ? m_paletteRed : m_palette); } void NewModelDialog::onPathButtonClicked() { - QString path = QFileDialog::getExistingDirectory( - this, - "Выбор директории для модели", - modelPath->text(), - QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks - ); - if (!path.isEmpty()) - { - setPath(path); - } + QString path = QFileDialog::getExistingDirectory( + this, + "Выбор директории для модели", + modelPath->text(), + QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks + ); + if (!path.isEmpty()) + { + setPath(path); + } } QString NewModelDialog::getModelName() const { - return modelName->text(); + return modelName->text(); } QString NewModelDialog::getModelPath() const { - return modelPath->text(); + return modelPath->text(); } std::size_t NewModelDialog::getTemplateIndex() const { - std::size_t result = 0; - if (template2->isChecked()) - { - result = 2; - } - else if (template3->isChecked()) - { - result = 4; - } - else if (template4->isChecked()) - { - result = 6; - } - else - { - ASSERT(template1->isChecked()); - result = 0; - } - - if (comments->isChecked()) - { - ++result; - } - - return result; + std::size_t result = 0; + if (template2->isChecked()) + { + result = 2; + } + else if (template3->isChecked()) + { + result = 4; + } + else if (template4->isChecked()) + { + result = 6; + } + else + { + ASSERT(template1->isChecked()); + result = 0; + } + + if (comments->isChecked()) + { + ++result; + } + + return result; } diff --git a/app/rdo_studio/src/dialog/new_model_dialog.h b/app/rdo_studio/src/dialog/new_model_dialog.h index 28d74c88f..a13dd8e79 100644 --- a/app/rdo_studio/src/dialog/new_model_dialog.h +++ b/app/rdo_studio/src/dialog/new_model_dialog.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DIALOG_NEW_MODEL_DIALOG_H_ -#define _RDO_STUDIO_DIALOG_NEW_MODEL_DIALOG_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -10,30 +9,28 @@ // -------------------------------------------------------------------------------- class NewModelDialog - : public QDialog - , private Ui::NewModelDialog + : public QDialog + , private Ui::NewModelDialog { Q_OBJECT public: - NewModelDialog(QWidget* pParent); - virtual ~NewModelDialog(); + NewModelDialog(QWidget* pParent); + virtual ~NewModelDialog(); - QString getModelName() const; - QString getModelPath() const; - std::size_t getTemplateIndex() const; + QString getModelName() const; + QString getModelPath() const; + std::size_t getTemplateIndex() const; private: - QFont m_font; - QFont m_fontRed; - QPalette m_palette; - QPalette m_paletteRed; + QFont m_font; + QFont m_fontRed; + QPalette m_palette; + QPalette m_paletteRed; - void setPath(const QString& path); + void setPath(const QString& path); private slots: - void updateUI(); - void onPathButtonClicked(); + void updateUI(); + void onPathButtonClicked(); }; - -#endif // _RDO_STUDIO_DIALOG_NEW_MODEL_DIALOG_H_ diff --git a/app/rdo_studio/src/dock/dock_build.cpp b/app/rdo_studio/src/dock/dock_build.cpp index cc5ff0a31..06b6f9f50 100644 --- a/app/rdo_studio/src/dock/dock_build.cpp +++ b/app/rdo_studio/src/dock/dock_build.cpp @@ -13,14 +13,14 @@ // -------------------------------------------------------------------------------- DockBuild::DockBuild(QWidget* pParent) - : DockFocusable("Компилятор", pParent) + : DockFocusable("Компилятор", pParent) { - context_type* pWidget = new context_type(this); - pWidget->setMinimumSize(QSize(300, 110)); + context_type* pWidget = new context_type(this); + pWidget->setMinimumSize(QSize(300, 110)); - setWidget(pWidget); + setWidget(pWidget); - toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_build.png"))); + toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_build.png"))); } DockBuild::~DockBuild() @@ -28,32 +28,32 @@ DockBuild::~DockBuild() void DockBuild::appendString(const QString& str) { - rdo::simulation::report::BuildEditLineInfo* pLine = new rdo::simulation::report::BuildEditLineInfo(str.toStdString()); - getContext().appendLine(pLine); + rdo::simulation::report::BuildEditLineInfo* pLine = new rdo::simulation::report::BuildEditLineInfo(str.toStdString()); + getContext().appendLine(pLine); } void DockBuild::appendString(const rdo::simulation::report::FileMessage& message) { - QString qMessage = QString::fromStdString(message.getText()); - if (qMessage.contains("Сработало лицензионное ограничение")) - { - QMessageBox::critical(g_pApp->getMainWnd(), "Лицензионное ограничение", qMessage); - return; - } - - if (message.getType() == rdo::simulation::report::FileMessage::MT_ERROR || (message.getType() == rdo::simulation::report::FileMessage::MT_WARNING && static_cast(g_pApp->getStyle()->style_build).warning)) - { - rdo::simulation::report::BuildEditLineInfo* pLine = new rdo::simulation::report::BuildEditLineInfo(message); - getContext().appendLine(pLine); - } + QString qMessage = QString::fromStdString(message.getText()); + if (qMessage.contains("Сработало лицензионное ограничение")) + { + QMessageBox::critical(g_pApp->getMainWnd(), "Лицензионное ограничение", qMessage); + return; + } + + if (message.getType() == rdo::simulation::report::FileMessage::Type::MESSAGE_ERROR || (message.getType() == rdo::simulation::report::FileMessage::Type::MESSAGE_WARNING && static_cast(g_pApp->getStyle()->style_build).warning)) + { + rdo::simulation::report::BuildEditLineInfo* pLine = new rdo::simulation::report::BuildEditLineInfo(message); + getContext().appendLine(pLine); + } } void DockBuild::clear() { - getContext().clearAll(); + getContext().clearAll(); } DockBuild::context_type& DockBuild::getContext() { - return *static_cast(widget()); + return *static_cast(widget()); } \ No newline at end of file diff --git a/app/rdo_studio/src/dock/dock_build.h b/app/rdo_studio/src/dock/dock_build.h index 98efebe85..5b327aac2 100644 --- a/app/rdo_studio/src/dock/dock_build.h +++ b/app/rdo_studio/src/dock/dock_build.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DOCK_BUILD_H_ -#define _RDO_STUDIO_DOCK_BUILD_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -10,16 +9,14 @@ class DockBuild: public DockFocusable { public: - typedef rdo::gui::editor::Build context_type; + typedef rdo::gui::editor::Build context_type; - DockBuild(QWidget* pParent); - virtual ~DockBuild(); + DockBuild(QWidget* pParent); + virtual ~DockBuild(); - void appendString(const QString& str); - void appendString(const rdo::simulation::report::FileMessage& message); - void clear(); + void appendString(const QString& str); + void appendString(const rdo::simulation::report::FileMessage& message); + void clear(); - context_type& getContext(); + context_type& getContext(); }; - -#endif // _RDO_STUDIO_DOCK_BUILD_H_ diff --git a/app/rdo_studio/src/dock/dock_chart_tree.cpp b/app/rdo_studio/src/dock/dock_chart_tree.cpp index f2536ad4f..7f094815b 100644 --- a/app/rdo_studio/src/dock/dock_chart_tree.cpp +++ b/app/rdo_studio/src/dock/dock_chart_tree.cpp @@ -10,16 +10,16 @@ // -------------------------------------------------------------------------------- DockChartTree::DockChartTree(QWidget* pParent) - : DockFocusable("Графики", pParent) + : DockFocusable("Графики", pParent) { - context_type* pWidget = new context_type(this); - pWidget->setMinimumSize(QSize(150, 200)); + context_type* pWidget = new context_type(this); + pWidget->setMinimumSize(QSize(150, 200)); - setWidget(pWidget); + setWidget(pWidget); - toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_chart.png"))); + toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_chart.png"))); - g_pTracer->setTree(pWidget); + g_pTracer->setTree(pWidget); } DockChartTree::~DockChartTree() diff --git a/app/rdo_studio/src/dock/dock_chart_tree.h b/app/rdo_studio/src/dock/dock_chart_tree.h index a2c828a99..da9c187e8 100644 --- a/app/rdo_studio/src/dock/dock_chart_tree.h +++ b/app/rdo_studio/src/dock/dock_chart_tree.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DOCK_TRACE_TREE_H_ -#define _RDO_STUDIO_DOCK_TRACE_TREE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -10,10 +9,8 @@ class DockChartTree: public DockFocusable { public: - typedef rdo::gui::tracer::ChartTree context_type; + typedef rdo::gui::tracer::ChartTree context_type; - DockChartTree(QWidget* pParent); - virtual ~DockChartTree(); + DockChartTree(QWidget* pParent); + virtual ~DockChartTree(); }; - -#endif // _RDO_STUDIO_DOCK_TRACE_TREE_H_ diff --git a/app/rdo_studio/src/dock/dock_debug.cpp b/app/rdo_studio/src/dock/dock_debug.cpp index 7816e11df..f30b15c67 100644 --- a/app/rdo_studio/src/dock/dock_debug.cpp +++ b/app/rdo_studio/src/dock/dock_debug.cpp @@ -9,14 +9,14 @@ // -------------------------------------------------------------------------------- DockDebug::DockDebug(QWidget* pParent) - : DockFocusable("Вывод", pParent) + : DockFocusable("Вывод", pParent) { - context_type* pWidget = new context_type(this); - pWidget->setMinimumSize(QSize(300, 110)); + context_type* pWidget = new context_type(this); + pWidget->setMinimumSize(QSize(300, 110)); - setWidget(pWidget); + setWidget(pWidget); - toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_debug.png"))); + toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_debug.png"))); } DockDebug::~DockDebug() @@ -24,15 +24,15 @@ DockDebug::~DockDebug() void DockDebug::appendString(const QString& str) { - getContext().appendLine(str); + getContext().appendLine(str); } void DockDebug::clear() { - getContext().clearAll(); + getContext().clearAll(); } DockDebug::context_type& DockDebug::getContext() { - return *static_cast(widget()); + return *static_cast(widget()); } diff --git a/app/rdo_studio/src/dock/dock_debug.h b/app/rdo_studio/src/dock/dock_debug.h index eda9dfdc1..0095d7b36 100644 --- a/app/rdo_studio/src/dock/dock_debug.h +++ b/app/rdo_studio/src/dock/dock_debug.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DOCK_DEBUG_H_ -#define _RDO_STUDIO_DOCK_DEBUG_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -10,15 +9,13 @@ class DockDebug: public DockFocusable { public: - typedef rdo::gui::editor::Debug context_type; + typedef rdo::gui::editor::Debug context_type; - DockDebug(QWidget* pParent); - virtual ~DockDebug(); + DockDebug(QWidget* pParent); + virtual ~DockDebug(); - void appendString(const QString& str); - void clear(); + void appendString(const QString& str); + void clear(); - context_type& getContext(); + context_type& getContext(); }; - -#endif // _RDO_STUDIO_DOCK_DEBUG_H_ diff --git a/app/rdo_studio/src/dock/dock_find.cpp b/app/rdo_studio/src/dock/dock_find.cpp index 21c39b5fd..abdca8b38 100644 --- a/app/rdo_studio/src/dock/dock_find.cpp +++ b/app/rdo_studio/src/dock/dock_find.cpp @@ -10,41 +10,41 @@ // -------------------------------------------------------------------------------- DockFind::DockFind(QWidget* pParent) - : DockFocusable("Поиск", pParent) + : DockFocusable("Поиск", pParent) { - context_type* pWidget = new context_type(this); - pWidget->setMinimumSize(QSize(300, 110)); + context_type* pWidget = new context_type(this); + pWidget->setMinimumSize(QSize(300, 110)); - setWidget(pWidget); + setWidget(pWidget); - toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_find.png"))); + toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_find.png"))); } DockFind::~DockFind() {} void DockFind::appendString( - const QString& str, - rdo::model::FileType fileType, - int lineNumber, int posInLine) + const QString& str, + rdo::FileType fileType, + int lineNumber, int posInLine) { - rdo::simulation::report::LogEditLineInfo* pLine = new rdo::simulation::report::LogEditLineInfo( - rdo::simulation::report::FileMessage( - str.toStdString(), - fileType, - lineNumber, - posInLine - ) - ); - getContext().appendLine(pLine); + rdo::simulation::report::LogEditLineInfo* pLine = new rdo::simulation::report::LogEditLineInfo( + rdo::simulation::report::FileMessage( + str.toStdString(), + fileType, + lineNumber, + posInLine + ) + ); + getContext().appendLine(pLine); } void DockFind::clear() { - getContext().clearAll(); + getContext().clearAll(); } DockFind::context_type& DockFind::getContext() { - return *static_cast(widget()); + return *static_cast(widget()); } diff --git a/app/rdo_studio/src/dock/dock_find.h b/app/rdo_studio/src/dock/dock_find.h index 861575b44..5787de8e8 100644 --- a/app/rdo_studio/src/dock/dock_find.h +++ b/app/rdo_studio/src/dock/dock_find.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DOCK_FIND_H_ -#define _RDO_STUDIO_DOCK_FIND_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -10,18 +9,16 @@ class DockFind: public DockFocusable { public: - typedef rdo::gui::editor::Find context_type; + typedef rdo::gui::editor::Find context_type; - DockFind(QWidget* pParent); - virtual ~DockFind(); + DockFind(QWidget* pParent); + virtual ~DockFind(); - void appendString( - const QString& str, - rdo::model::FileType fileType = rdo::model::PAT, - int lineNumber = -1, int posInLine = 0); - void clear(); + void appendString( + const QString& str, + rdo::FileType fileType = rdo::FileType::PAT, + int lineNumber = -1, int posInLine = 0); + void clear(); - context_type& getContext(); + context_type& getContext(); }; - -#endif // _RDO_STUDIO_DOCK_FIND_H_ diff --git a/app/rdo_studio/src/dock/dock_focusable.cpp b/app/rdo_studio/src/dock/dock_focusable.cpp index cb56bbe88..0bad86824 100644 --- a/app/rdo_studio/src/dock/dock_focusable.cpp +++ b/app/rdo_studio/src/dock/dock_focusable.cpp @@ -6,9 +6,9 @@ // -------------------------------------------------------------------------------- DockFocusable::DockFocusable(const QString& title, QWidget* pParent) - : super(title, pParent) + : super(title, pParent) { - connect(this, SIGNAL(visibilityChanged(bool)), this, SLOT(onVisibilityChanged(bool))); + connect(this, SIGNAL(visibilityChanged(bool)), this, SLOT(onVisibilityChanged(bool))); } DockFocusable::~DockFocusable() @@ -16,12 +16,12 @@ DockFocusable::~DockFocusable() void DockFocusable::onVisibilityChanged(bool visible) { - if (visible) - { - widget()->setFocus(); - } - else - { - widget()->clearFocus(); - } + if (visible) + { + widget()->setFocus(); + } + else + { + widget()->clearFocus(); + } } diff --git a/app/rdo_studio/src/dock/dock_focusable.h b/app/rdo_studio/src/dock/dock_focusable.h index 5cc70cdb7..566c5b51f 100644 --- a/app/rdo_studio/src/dock/dock_focusable.h +++ b/app/rdo_studio/src/dock/dock_focusable.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DOCK_FOCUSABLE_H_ -#define _RDO_STUDIO_DOCK_FOCUSABLE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -12,13 +11,11 @@ class DockFocusable: public QDockWidget { Q_OBJECT public: - typedef QDockWidget super; + typedef QDockWidget super; - DockFocusable(const QString& title, QWidget* pParent); - virtual ~DockFocusable(); + DockFocusable(const QString& title, QWidget* pParent); + virtual ~DockFocusable(); private slots: - void onVisibilityChanged(bool visible); + void onVisibilityChanged(bool visible); }; - -#endif // _RDO_STUDIO_DOCK_FOCUSABLE_H_ diff --git a/app/rdo_studio/src/dock/dock_frame.cpp b/app/rdo_studio/src/dock/dock_frame.cpp index 56a74c5c3..ee3363e1e 100644 --- a/app/rdo_studio/src/dock/dock_frame.cpp +++ b/app/rdo_studio/src/dock/dock_frame.cpp @@ -9,14 +9,14 @@ // -------------------------------------------------------------------------------- DockFrame::DockFrame(QWidget* pParent) - : DockFocusable("Анимация", pParent) + : DockFocusable("Анимация", pParent) { - context_type* pWidget = new context_type(this); - pWidget->setMinimumSize(QSize(150, 200)); + context_type* pWidget = new context_type(this); + pWidget->setMinimumSize(QSize(150, 200)); - setWidget(pWidget); + setWidget(pWidget); - toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_frame.png"))); + toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_frame.png"))); } DockFrame::~DockFrame() @@ -24,5 +24,5 @@ DockFrame::~DockFrame() DockFrame::context_type& DockFrame::getContext() { - return *static_cast(widget()); + return *static_cast(widget()); } diff --git a/app/rdo_studio/src/dock/dock_frame.h b/app/rdo_studio/src/dock/dock_frame.h index 3d7c4e9a8..50807cdf1 100644 --- a/app/rdo_studio/src/dock/dock_frame.h +++ b/app/rdo_studio/src/dock/dock_frame.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DOCK_FRAME_H_ -#define _RDO_STUDIO_DOCK_FRAME_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -10,12 +9,10 @@ class DockFrame: public DockFocusable { public: - typedef rdo::gui::frame::TreeCtrl context_type; + typedef rdo::gui::frame::TreeCtrl context_type; - DockFrame(QWidget* pParent); - virtual ~DockFrame(); + DockFrame(QWidget* pParent); + virtual ~DockFrame(); - context_type& getContext(); + context_type& getContext(); }; - -#endif // _RDO_STUDIO_DOCK_FRAME_H_ diff --git a/app/rdo_studio/src/dock/dock_results.cpp b/app/rdo_studio/src/dock/dock_results.cpp index 0dc051079..2321c1a25 100644 --- a/app/rdo_studio/src/dock/dock_results.cpp +++ b/app/rdo_studio/src/dock/dock_results.cpp @@ -9,14 +9,14 @@ // -------------------------------------------------------------------------------- DockResults::DockResults(QWidget* pParent) - : DockFocusable("Результаты", pParent) + : DockFocusable("Результаты", pParent) { - context_type* pWidget = new context_type(this); - pWidget->setMinimumSize(QSize(300, 110)); + context_type* pWidget = new context_type(this); + pWidget->setMinimumSize(QSize(300, 110)); - setWidget(pWidget); + setWidget(pWidget); - toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_results.png"))); + toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_results.png"))); } DockResults::~DockResults() @@ -24,20 +24,20 @@ DockResults::~DockResults() void DockResults::appendString(const QString& str) { - int pos = getContext().getCurrentPos(); - getContext().setCurrentPos(getContext().getLength()); - getContext().setReadOnly (false); - getContext().appendText (str ); - getContext().setReadOnly (true ); - getContext().setCurrentPos(pos ); + int pos = getContext().getCurrentPos(); + getContext().setCurrentPos(getContext().getLength()); + getContext().setReadOnly (false); + getContext().appendText (str ); + getContext().setReadOnly (true ); + getContext().setCurrentPos(pos ); } void DockResults::clear() { - getContext().clearAll(); + getContext().clearAll(); } DockResults::context_type& DockResults::getContext() { - return *static_cast(widget()); + return *static_cast(widget()); } \ No newline at end of file diff --git a/app/rdo_studio/src/dock/dock_results.h b/app/rdo_studio/src/dock/dock_results.h index 7c25dce18..7eb043602 100644 --- a/app/rdo_studio/src/dock/dock_results.h +++ b/app/rdo_studio/src/dock/dock_results.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DOCK_RESULTS_H_ -#define _RDO_STUDIO_DOCK_RESULTS_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -10,15 +9,13 @@ class DockResults: public DockFocusable { public: - typedef rdo::gui::editor::Results context_type; + typedef rdo::gui::editor::Results context_type; - DockResults(QWidget* pParent); - virtual ~DockResults(); + DockResults(QWidget* pParent); + virtual ~DockResults(); - void appendString(const QString& str); - void clear(); + void appendString(const QString& str); + void clear(); - context_type& getContext(); + context_type& getContext(); }; - -#endif // _RDO_STUDIO_DOCK_RESULTS_H_ diff --git a/app/rdo_studio/src/dock/dock_trace.cpp b/app/rdo_studio/src/dock/dock_trace.cpp index ebe06fc40..d28e417a9 100644 --- a/app/rdo_studio/src/dock/dock_trace.cpp +++ b/app/rdo_studio/src/dock/dock_trace.cpp @@ -10,16 +10,16 @@ // -------------------------------------------------------------------------------- DockTrace::DockTrace(QWidget* pParent) - : DockFocusable("Трассировка", pParent) + : DockFocusable("Трассировка", pParent) { - context_type* pWidget = new context_type(this); - pWidget->setMinimumSize(QSize(300, 110)); + context_type* pWidget = new context_type(this); + pWidget->setMinimumSize(QSize(300, 110)); - setWidget(pWidget); + setWidget(pWidget); - toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_trace.png"))); + toggleViewAction()->setIcon(QIcon(QString::fromUtf8(":/images/images/dock_trace.png"))); - g_pTracer->setLog(&getContext()); + g_pTracer->setLog(&getContext()); } DockTrace::~DockTrace() @@ -27,5 +27,5 @@ DockTrace::~DockTrace() DockTrace::context_type& DockTrace::getContext() { - return *static_cast(widget()); + return *static_cast(widget()); } diff --git a/app/rdo_studio/src/dock/dock_trace.h b/app/rdo_studio/src/dock/dock_trace.h index e1049366e..243ad3531 100644 --- a/app/rdo_studio/src/dock/dock_trace.h +++ b/app/rdo_studio/src/dock/dock_trace.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_DOCK_TRACE_H_ -#define _RDO_STUDIO_DOCK_TRACE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -10,12 +9,10 @@ class DockTrace: public DockFocusable { public: - typedef rdo::gui::tracer::LogMainWnd context_type; + typedef rdo::gui::tracer::LogMainWnd context_type; - DockTrace(QWidget* pParent); - virtual ~DockTrace(); + DockTrace(QWidget* pParent); + virtual ~DockTrace(); - context_type& getContext(); + context_type& getContext(); }; - -#endif // _RDO_STUDIO_DOCK_TRACE_H_ diff --git a/app/rdo_studio/src/editor/build_edit.cpp b/app/rdo_studio/src/editor/build_edit.cpp index 09cff06b8..3b81faab2 100644 --- a/app/rdo_studio/src/editor/build_edit.cpp +++ b/app/rdo_studio/src/editor/build_edit.cpp @@ -16,8 +16,8 @@ using namespace rdo::simulation::report; using namespace rdo::gui::editor; Build::Build(QWidget* pParent) - : super(pParent) - , PopupMenu(pParent) + : super(pParent) + , PopupMenu(pParent) {} Build::~Build() @@ -25,80 +25,80 @@ Build::~Build() void Build::showFirstError() { - setCurrentLine(getCurrentLine() + 1); - LogEditLineInfoList lines; - getLines(lines); - std::list::iterator it = lines.begin(); - TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == RDOSyntaxMessage::MT_WARNING ? 1 : 0, (*it)->getText().c_str()); - int i; - for (i = 0; i < getCurrentLine(); i++) - { - if (it != lines.end()) - { - ++it; - TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == RDOSyntaxMessage::MT_WARNING ? 1 : 0, (*it)->getText().c_str()); - } - else - { - setCurrentLine(0); - break; - } - } - it = lines.begin(); - TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == RDOSyntaxMessage::MT_WARNING ? 1 : 0, (*it)->getText().c_str()); - for (i = 0; i < getCurrentLine(); i++) - { - ++it; - TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == RDOSyntaxMessage::MT_WARNING ? 1 : 0, (*it)->getText().c_str()); - } - while (it != lines.end() && ((*it)->getLineNumber() == std::size_t(~0) || static_cast(*it)->getType() == RDOSyntaxMessage::MT_WARNING)) - { - ++it; - if (it != lines.end()) - { - TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == RDOSyntaxMessage::MT_WARNING ? 1 : 0, (*it)->getText().c_str()); - } - setCurrentLine(getCurrentLine() + 1); - } - if (it == lines.end()) - { - it = lines.begin(); - TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == RDOSyntaxMessage::MT_WARNING ? 1 : 0, (*it)->getText().c_str()); - setCurrentLine(0); - while (it != lines.end() && ((*it)->getLineNumber() == std::size_t(~0) || static_cast(*it)->getType() == RDOSyntaxMessage::MT_WARNING)) - { - ++it; - if (it != lines.end()) - { - TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == RDOSyntaxMessage::MT_WARNING ? 1 : 0, (*it)->getText().c_str()); - } - setCurrentLine(getCurrentLine() + 1); - } - } - if (it != lines.end()) - { - TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == RDOSyntaxMessage::MT_WARNING ? 1 : 0, (*it)->getText().c_str()); - } - if (it != lines.end() && (*it)->getLineNumber() != std::size_t(~0) && static_cast(*it)->getType() == RDOSyntaxMessage::MT_ERROR) - { - setSelectLine(getCurrentLine(), *it, true); - } + setCurrentLine(getCurrentLine() + 1); + LogEditLineInfoList lines; + getLines(lines); + std::list::iterator it = lines.begin(); + TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == SyntaxMessage::Type::MESSAGE_WARNING ? 1 : 0, (*it)->getText().c_str()); + int i; + for (i = 0; i < getCurrentLine(); i++) + { + if (it != lines.end()) + { + ++it; + TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == SyntaxMessage::Type::MESSAGE_WARNING ? 1 : 0, (*it)->getText().c_str()); + } + else + { + setCurrentLine(0); + break; + } + } + it = lines.begin(); + TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == SyntaxMessage::Type::MESSAGE_WARNING ? 1 : 0, (*it)->getText().c_str()); + for (i = 0; i < getCurrentLine(); i++) + { + ++it; + TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == SyntaxMessage::Type::MESSAGE_WARNING ? 1 : 0, (*it)->getText().c_str()); + } + while (it != lines.end() && ((*it)->getLineNumber() == std::size_t(~0) || static_cast(*it)->getType() == SyntaxMessage::Type::MESSAGE_WARNING)) + { + ++it; + if (it != lines.end()) + { + TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == SyntaxMessage::Type::MESSAGE_WARNING ? 1 : 0, (*it)->getText().c_str()); + } + setCurrentLine(getCurrentLine() + 1); + } + if (it == lines.end()) + { + it = lines.begin(); + TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == SyntaxMessage::Type::MESSAGE_WARNING ? 1 : 0, (*it)->getText().c_str()); + setCurrentLine(0); + while (it != lines.end() && ((*it)->getLineNumber() == std::size_t(~0) || static_cast(*it)->getType() == SyntaxMessage::Type::MESSAGE_WARNING)) + { + ++it; + if (it != lines.end()) + { + TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == SyntaxMessage::Type::MESSAGE_WARNING ? 1 : 0, (*it)->getText().c_str()); + } + setCurrentLine(getCurrentLine() + 1); + } + } + if (it != lines.end()) + { + TRACE3("ln = %d, w = %d, msg = %s\n", (*it)->getLineNumber(), static_cast(*it)->getType() == SyntaxMessage::Type::MESSAGE_WARNING ? 1 : 0, (*it)->getText().c_str()); + } + if (it != lines.end() && (*it)->getLineNumber() != std::size_t(~0) && static_cast(*it)->getType() == SyntaxMessage::Type::MESSAGE_ERROR) + { + setSelectLine(getCurrentLine(), *it, true); + } } void Build::updateEdit(Model* pEdit, const LogEditLineInfo* pLineInfo) { - super::updateEdit(pEdit, pLineInfo); - pEdit->setErrorLine(pLineInfo->getLineNumber()); + super::updateEdit(pEdit, pLineInfo); + pEdit->setErrorLine(pLineInfo->getLineNumber()); } void Build::onHelpContext() { - QByteArray ba; - ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_run.htm#output_build\n"); - g_pApp->callQtAssistant(ba); + QByteArray ba; + ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_run.htm#output_build\n"); + g_pApp->callQtAssistant(ba); } void Build::contextMenuEvent(QContextMenuEvent* pEvent) { - m_pPopupMenu->exec(pEvent->globalPos()); + m_pPopupMenu->exec(pEvent->globalPos()); } diff --git a/app/rdo_studio/src/editor/build_edit.h b/app/rdo_studio/src/editor/build_edit.h index d3f6e27ec..d4868211b 100644 --- a/app/rdo_studio/src/editor/build_edit.h +++ b/app/rdo_studio/src/editor/build_edit.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_BUILD_EDIT_H_ -#define _RDO_STUDIO_EDITOR_BUILD_EDIT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -12,26 +11,24 @@ namespace rdo { namespace gui { namespace editor { class Build - : public Log - , public PopupMenu + : public Log + , public PopupMenu { public: - Build(QWidget* pParent); - virtual ~Build(); + Build(QWidget* pParent); + virtual ~Build(); - virtual void showFirstError(); + virtual void showFirstError(); protected: - virtual void updateEdit(Model* pEdit, const LogEditLineInfo* pLineInfo); + virtual void updateEdit(Model* pEdit, const LogEditLineInfo* pLineInfo); private: - typedef Log super; - typedef rdo::simulation::report::FileMessage RDOSyntaxMessage; + typedef Log super; + typedef rdo::simulation::report::FileMessage SyntaxMessage; - virtual void contextMenuEvent(QContextMenuEvent* pEvent); - virtual void onHelpContext (); + virtual void contextMenuEvent(QContextMenuEvent* pEvent); + virtual void onHelpContext (); }; }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_BUILD_EDIT_H_ diff --git a/app/rdo_studio/src/editor/build_edit_style.cpp b/app/rdo_studio/src/editor/build_edit_style.cpp index 54c02428a..0410e3397 100644 --- a/app/rdo_studio/src/editor/build_edit_style.cpp +++ b/app/rdo_studio/src/editor/build_edit_style.cpp @@ -12,7 +12,7 @@ using namespace rdo::gui::editor; // -------------------------------------------------------------------------------- BuildStyle::BuildStyle(): LogStyle() { - warning = true; + warning = true; } BuildStyle::~BuildStyle() @@ -21,76 +21,76 @@ BuildStyle::~BuildStyle() BuildStyle& BuildStyle::operator =( const BuildStyle& style ) { - LogStyle::operator=( style ); - warning = style.warning; + LogStyle::operator=( style ); + warning = style.warning; - return *this; + return *this; } bool BuildStyle::operator ==( const BuildStyle& style ) const { - bool flag = LogStyle::operator==( style ); - if ( flag ) flag &= warning == style.warning ? true : false; - return flag; + bool flag = LogStyle::operator==( style ); + if ( flag ) flag &= warning == style.warning ? true : false; + return flag; } bool BuildStyle::operator !=( const BuildStyle& style ) const { - return !(*this == style); + return !(*this == style); } BuildStyle BuildStyle::getDefaultStyle() { - BuildStyle style; - return style; + BuildStyle style; + return style; } BuildStyle BuildStyle::getClassicStyle() { - BuildStyle style; - *static_cast(&style) = LogStyle::getClassicStyle(); + BuildStyle style; + *static_cast(&style) = LogStyle::getClassicStyle(); - return style; + return style; } BuildStyle BuildStyle::getTwilightStyle() { - BuildStyle style; - *static_cast(&style) = LogStyle::getTwilightStyle(); + BuildStyle style; + *static_cast(&style) = LogStyle::getTwilightStyle(); - return style; + return style; } BuildStyle BuildStyle::getOceanStyle() { - BuildStyle style; - *static_cast(&style) = LogStyle::getOceanStyle(); + BuildStyle style; + *static_cast(&style) = LogStyle::getOceanStyle(); - return style; + return style; } namespace rdo { namespace gui { namespace editor { QSettings& operator<< (QSettings& settings, const BuildStyle& style) { - settings << static_cast(style); + settings << static_cast(style); - settings.beginGroup("theme"); - settings.setValue("warning", style.warning); - settings.endGroup(); + settings.beginGroup("theme"); + settings.setValue("warning", style.warning); + settings.endGroup(); - return settings; + return settings; } QSettings& operator>> (QSettings& settings, BuildStyle& style) { - settings >> static_cast(style); + settings >> static_cast(style); - settings.beginGroup("theme"); - style.warning = settings.value("warning", style.warning).toBool() ? true : false; - settings.endGroup(); + settings.beginGroup("theme"); + style.warning = settings.value("warning", style.warning).toBool() ? true : false; + settings.endGroup(); - return settings; + return settings; } }}} // namespace rdo::gui::editor \ No newline at end of file diff --git a/app/rdo_studio/src/editor/build_edit_style.h b/app/rdo_studio/src/editor/build_edit_style.h index cde1d9fde..e6361b35e 100644 --- a/app/rdo_studio/src/editor/build_edit_style.h +++ b/app/rdo_studio/src/editor/build_edit_style.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_BUILD_EDIT_STYLE_H_ -#define _RDO_STUDIO_EDITOR_BUILD_EDIT_STYLE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -14,24 +13,22 @@ namespace rdo { namespace gui { namespace editor { class BuildStyle: public LogStyle { public: - BuildStyle(); - ~BuildStyle(); + BuildStyle(); + ~BuildStyle(); - BuildStyle& operator =( const BuildStyle& style ); - bool operator ==( const BuildStyle& style ) const; - bool operator !=( const BuildStyle& style ) const; + BuildStyle& operator =( const BuildStyle& style ); + bool operator ==( const BuildStyle& style ) const; + bool operator !=( const BuildStyle& style ) const; - bool warning; + bool warning; - static BuildStyle getDefaultStyle(); - static BuildStyle getClassicStyle(); - static BuildStyle getTwilightStyle(); - static BuildStyle getOceanStyle(); + static BuildStyle getDefaultStyle(); + static BuildStyle getClassicStyle(); + static BuildStyle getTwilightStyle(); + static BuildStyle getOceanStyle(); }; QSettings& operator<< (QSettings& settings, const BuildStyle& style); QSettings& operator>> (QSettings& settings, BuildStyle& style); }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_BUILD_EDIT_STYLE_H_ diff --git a/app/rdo_studio/src/editor/debug_edit.cpp b/app/rdo_studio/src/editor/debug_edit.cpp index 6de5a6e36..6263e5fba 100644 --- a/app/rdo_studio/src/editor/debug_edit.cpp +++ b/app/rdo_studio/src/editor/debug_edit.cpp @@ -14,10 +14,10 @@ using namespace rdo::gui::editor; Debug::Debug(QWidget* pParent) - : super(pParent) - , PopupMenu(pParent) + : super(pParent) + , PopupMenu(pParent) { - setReadOnly(true); + setReadOnly(true); } Debug::~Debug() @@ -25,30 +25,30 @@ Debug::~Debug() void Debug::appendLine(const QString& str) { - bool readOnly = isReadOnly(); - setReadOnly(false); - bool scroll = isLineVisible( getLineCount() - 1 ); - setCurrentPos(getLength()); - appendText(str); - if (scroll) - { - int line = getLineCount(); - int line_to_scroll = line > 0 ? line - 1 : 0; - scrollToLine (line_to_scroll); - setCurrentPos(getLength()); - } - setReadOnly(readOnly); - onUpdateEditGUI(); + bool readOnly = isReadOnly(); + setReadOnly(false); + bool scroll = isLineVisible( getLineCount() - 1 ); + setCurrentPos(getLength()); + appendText(str); + if (scroll) + { + int line = getLineCount(); + int line_to_scroll = line > 0 ? line - 1 : 0; + scrollToLine (line_to_scroll); + setCurrentPos(getLength()); + } + setReadOnly(readOnly); + onUpdateEditGUI(); } void Debug::onHelpContext() { - QByteArray ba; - ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_run.htm#output_debug\n"); - g_pApp->callQtAssistant(ba); + QByteArray ba; + ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_run.htm#output_debug\n"); + g_pApp->callQtAssistant(ba); } void Debug::contextMenuEvent(QContextMenuEvent* pEvent) { - m_pPopupMenu->exec(pEvent->globalPos()); + m_pPopupMenu->exec(pEvent->globalPos()); } \ No newline at end of file diff --git a/app/rdo_studio/src/editor/debug_edit.h b/app/rdo_studio/src/editor/debug_edit.h index e278e51c8..5111e9369 100644 --- a/app/rdo_studio/src/editor/debug_edit.h +++ b/app/rdo_studio/src/editor/debug_edit.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_DEBUG_EDIT_H_ -#define _RDO_STUDIO_EDITOR_DEBUG_EDIT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -10,22 +9,20 @@ namespace rdo { namespace gui { namespace editor { class Debug - : public Edit - , public PopupMenu + : public Edit + , public PopupMenu { public: - Debug(QWidget* pParent); - virtual ~Debug(); + Debug(QWidget* pParent); + virtual ~Debug(); - void appendLine(const QString& str); + void appendLine(const QString& str); private: - typedef Edit super; + typedef Edit super; - virtual void contextMenuEvent(QContextMenuEvent* pEvent); - virtual void onHelpContext(); + virtual void contextMenuEvent(QContextMenuEvent* pEvent); + virtual void onHelpContext(); }; }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_DEBUG_EDIT_H_ diff --git a/app/rdo_studio/src/editor/edit.cpp b/app/rdo_studio/src/editor/edit.cpp index 113834e68..590724a9f 100644 --- a/app/rdo_studio/src/editor/edit.cpp +++ b/app/rdo_studio/src/editor/edit.cpp @@ -27,56 +27,56 @@ using namespace rdo::gui::style; // -------------------- Edit::Group // --------------------------------------------------------------------------- Edit::Group::Group() - : bMatchCase (false) - , bMatchWholeWord(false) - , bSearchDown (true ) + : bMatchCase (false) + , bMatchWholeWord(false) + , bSearchDown (true ) {} void Edit::Group::insert(Edit* pEdit) { - m_list.push_back(pEdit); + m_list.push_back(pEdit); } Edit::Group::List::const_iterator Edit::Group::begin() const { - return m_list.begin(); + return m_list.begin(); } Edit::Group::List::const_iterator Edit::Group::end() const { - return m_list.end(); + return m_list.end(); } Edit::Group::List::const_iterator Edit::Group::next(const List::const_iterator& it) const { - Edit::Group::List::const_iterator result(it); - ++result; - if (result == m_list.end()) - { - result = m_list.begin(); - } - return result; + Edit::Group::List::const_iterator result(it); + ++result; + if (result == m_list.end()) + { + result = m_list.begin(); + } + return result; } Edit::Group::List::const_iterator Edit::Group::prev(const List::const_iterator& it) const { - Edit::Group::List::const_iterator result(it); - if (result == m_list.begin()) - { - result = m_list.end(); - } - --result; - return result; + Edit::Group::List::const_iterator result(it); + if (result == m_list.begin()) + { + result = m_list.end(); + } + --result; + return result; } void Edit::Group::for_each(const this_method& fun) const { - boost::range::for_each(m_list, fun); + boost::range::for_each(m_list, fun); } Edit::Group::List::const_iterator Edit::Group::find_if(const this_predicate& fun) const { - return boost::range::find_if(m_list, fun); + return boost::range::find_if(m_list, fun); } // -------------------------------------------------------------------------------- @@ -120,28 +120,28 @@ Edit::Group::List::const_iterator Edit::Group::find_if(const this_predicate& fun // --------------- Edit::Edit(QWidget* pParent) - : super (pParent) - , m_pStyle (NULL ) - , m_pGroup (NULL ) - , m_firstFoundPos (-1 ) - , m_haveFound (false) - , m_markerCount (0 ) - , m_pFindDialog (NULL ) - , m_pFindReplaceDialog(NULL ) -{ - QObject::connect(this, SIGNAL(needShown(int, int)), this, SLOT(catchNeedShown(int, int))); - QObject::connect(this, SIGNAL(charAdded(int)), this, SLOT(catchCharAdded(int))); - QObject::connect(this, SIGNAL(updateUi()), this, SLOT(onUpdateEditGUI())); - QObject::connect(this, SIGNAL(modified(int, int, int, int, const QByteArray&, int, int, int)), this, SLOT(onUpdateModify())); - QObject::connect(this, SIGNAL(aboutToCopy(QMimeData*)), this, SLOT(onCopyAsRTF(QMimeData*))); - QObject::connect(this, SIGNAL(zoom(int)),this, SLOT(onViewZoomChanged(int))); - - m_sciMarkerBookmark = getNewMarker(); - - sendEditor(SCI_SETLEXER, SCLEX_NULL); - // int lexLanguage = sendEditor(SCI_GETLEXER); - sendEditor(SCI_SETMARGINWIDTHN, 1, 0); - sendEditor(SCI_USEPOPUP, 0); + : super (pParent) + , m_pStyle (NULL ) + , m_pGroup (NULL ) + , m_firstFoundPos (-1 ) + , m_haveFound (false) + , m_markerCount (0 ) + , m_pFindDialog (NULL ) + , m_pFindReplaceDialog(NULL ) +{ + QObject::connect(this, SIGNAL(needShown(int, int)), this, SLOT(catchNeedShown(int, int))); + QObject::connect(this, SIGNAL(charAdded(int)), this, SLOT(catchCharAdded(int))); + QObject::connect(this, SIGNAL(updateUi()), this, SLOT(onUpdateEditGUI())); + QObject::connect(this, SIGNAL(modified(int, int, int, int, const QByteArray&, int, int, int)), this, SLOT(onUpdateModify())); + QObject::connect(this, SIGNAL(aboutToCopy(QMimeData*)), this, SLOT(onCopyAsRTF(QMimeData*))); + QObject::connect(this, SIGNAL(zoom(int)),this, SLOT(onViewZoomChanged(int))); + + m_sciMarkerBookmark = getNewMarker(); + + sendEditor(SCI_SETLEXER, SCLEX_NULL); + // int lexLanguage = sendEditor(SCI_GETLEXER); + sendEditor(SCI_SETMARGINWIDTHN, 1, 0); + sendEditor(SCI_USEPOPUP, 0); } Edit::~Edit() @@ -149,660 +149,660 @@ Edit::~Edit() void Edit::catchNeedShown(int position, int length) { - ensureRangeVisible(position, position + length, false); + ensureRangeVisible(position, position + length, false); } void Edit::catchCharAdded(int ch) { - if (m_pStyle && m_pStyle->tab.autoIndent && (ch == '\r' || ch == '\n')) - { - autoIndent(); - } + if (m_pStyle && m_pStyle->tab.autoIndent && (ch == '\r' || ch == '\n')) + { + autoIndent(); + } } long Edit::sendEditorString(std::size_t msg, const std::string& str) const { - return super::sends(msg, str.length(), str.c_str()); + return super::sends(msg, str.length(), str.c_str()); } int Edit::getNewMarker() { - ++m_markerCount; - return m_markerCount; + ++m_markerCount; + return m_markerCount; } void Edit::defineMarker(int marker, int markerType, QColor fore, QColor back) const { - sendEditor(SCI_MARKERDEFINE, marker, markerType); - sendEditor(SCI_MARKERSETFORE, marker, convertColor(fore)); - sendEditor(SCI_MARKERSETBACK, marker, convertColor(back)); + sendEditor(SCI_MARKERDEFINE, marker, markerType); + sendEditor(SCI_MARKERSETFORE, marker, convertColor(fore)); + sendEditor(SCI_MARKERSETBACK, marker, convertColor(back)); } const EditStyle* Edit::getEditorStyle() const { - return m_pStyle; + return m_pStyle; } void Edit::setEditorStyle(EditStyle* pStyle) { - m_pStyle = pStyle; - if (!m_pStyle) - return; - - // ---------- - // Colors - EditStyle* style = static_cast(m_pStyle); - sendEditor(SCI_STYLESETBACK, STYLE_DEFAULT, convertColor(style->defaultColor)); - sendEditor(SCI_STYLESETBACK, STYLE_DEFAULT, convertColor(style->backgroundColor)); - sendEditor(SCI_STYLESETFORE, SCE_TEXT_DEFAULT, convertColor(style->defaultColor)); - sendEditor(SCI_STYLESETBACK, SCE_TEXT_DEFAULT, convertColor(style->backgroundColor)); - - // ---------- - // Styles - sendEditor(SCI_STYLESETBOLD , STYLE_DEFAULT, style->defaultStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , STYLE_DEFAULT, style->defaultStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, STYLE_DEFAULT, style->defaultStyle & StyleFont::UNDERLINE); - sendEditor(SCI_STYLESETBOLD , SCE_TEXT_DEFAULT, style->defaultStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_TEXT_DEFAULT, style->defaultStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_TEXT_DEFAULT, style->defaultStyle & StyleFont::UNDERLINE); - - // ---------- - // Font Name - sendEditorString(SCI_STYLESETFONT, STYLE_DEFAULT, m_pStyle->font.name.c_str()); - - // ---------- - // Font Size - sendEditor(SCI_STYLESETSIZE, STYLE_DEFAULT, m_pStyle->font.size); - - // ---------- - // Codepage and Characterset - sendEditor(SCI_SETCODEPAGE, SC_CP_UTF8); - - // ---------- - // Tabs - sendEditor(SCI_SETTABWIDTH, m_pStyle->tab.tabSize); - sendEditor(SCI_SETINDENT, m_pStyle->tab.indentSize); - sendEditor(SCI_SETUSETABS, m_pStyle->tab.useTabs); - sendEditor(SCI_SETTABINDENTS, m_pStyle->tab.tabIndents); - sendEditor(SCI_SETBACKSPACEUNINDENTS, !m_pStyle->tab.backspaceUntabs); - - // ---------- - // Caret - sendEditor(SCI_SETCARETFORE, convertColor(style->caretColor)); - sendEditor(SCI_SETSELBACK, true, convertColor(style->selectionBgColor)); - sendEditor(SCI_SETCARETWIDTH, 1); - - // ---------- - // Bookmark - QColor bookmarkFgColor = style->bookmarkFgColor; - QColor bookmarkBgColor = style->bookmarkBgColor; - switch (style->bookmarkStyle) - { - case EditStyle::B_NONE : defineMarker(m_sciMarkerBookmark, SC_MARK_EMPTY , bookmarkFgColor, bookmarkBgColor); break; - case EditStyle::B_CIRCLE : defineMarker(m_sciMarkerBookmark, SC_MARK_CIRCLE , bookmarkFgColor, bookmarkBgColor); break; - case EditStyle::B_RECT : defineMarker(m_sciMarkerBookmark, SC_MARK_SMALLRECT, bookmarkFgColor, bookmarkBgColor); break; - case EditStyle::B_ROUNDRECT: defineMarker(m_sciMarkerBookmark, SC_MARK_ROUNDRECT, bookmarkFgColor, bookmarkBgColor); break; - case EditStyle::B_ARROW : defineMarker(m_sciMarkerBookmark, SC_MARK_ARROW , bookmarkFgColor, bookmarkBgColor); break; - } - - // ---------- - // Window - sendEditor(SCI_SETWRAPMODE, m_pStyle->window.wordWrap ? SC_WRAP_WORD : SC_WRAP_NONE); - sendEditor(SCI_SETHSCROLLBAR, m_pStyle->window.showHorzScrollBar); + m_pStyle = pStyle; + if (!m_pStyle) + return; + + // ---------- + // Colors + EditStyle* style = static_cast(m_pStyle); + sendEditor(SCI_STYLESETBACK, STYLE_DEFAULT, convertColor(style->defaultColor)); + sendEditor(SCI_STYLESETBACK, STYLE_DEFAULT, convertColor(style->backgroundColor)); + sendEditor(SCI_STYLESETFORE, SCE_TEXT_DEFAULT, convertColor(style->defaultColor)); + sendEditor(SCI_STYLESETBACK, SCE_TEXT_DEFAULT, convertColor(style->backgroundColor)); + + // ---------- + // Styles + sendEditor(SCI_STYLESETBOLD , STYLE_DEFAULT, static_cast(style->defaultStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , STYLE_DEFAULT, static_cast(style->defaultStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, STYLE_DEFAULT, static_cast(style->defaultStyle) & static_cast(StyleFont::Style::UNDERLINE)); + sendEditor(SCI_STYLESETBOLD , SCE_TEXT_DEFAULT, static_cast(style->defaultStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_TEXT_DEFAULT, static_cast(style->defaultStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_TEXT_DEFAULT, static_cast(style->defaultStyle) & static_cast(StyleFont::Style::UNDERLINE)); + + // ---------- + // Font Name + sendEditorString(SCI_STYLESETFONT, STYLE_DEFAULT, m_pStyle->font.name.c_str()); + + // ---------- + // Font Size + sendEditor(SCI_STYLESETSIZE, STYLE_DEFAULT, m_pStyle->font.size); + + // ---------- + // Codepage and Characterset + sendEditor(SCI_SETCODEPAGE, SC_CP_UTF8); + + // ---------- + // Tabs + sendEditor(SCI_SETTABWIDTH, m_pStyle->tab.tabSize); + sendEditor(SCI_SETINDENT, m_pStyle->tab.indentSize); + sendEditor(SCI_SETUSETABS, m_pStyle->tab.useTabs); + sendEditor(SCI_SETTABINDENTS, m_pStyle->tab.tabIndents); + sendEditor(SCI_SETBACKSPACEUNINDENTS, !m_pStyle->tab.backspaceUntabs); + + // ---------- + // Caret + sendEditor(SCI_SETCARETFORE, convertColor(style->caretColor)); + sendEditor(SCI_SETSELBACK, true, convertColor(style->selectionBgColor)); + sendEditor(SCI_SETCARETWIDTH, 1); + + // ---------- + // Bookmark + QColor bookmarkFgColor = style->bookmarkFgColor; + QColor bookmarkBgColor = style->bookmarkBgColor; + switch (style->bookmarkStyle) + { + case EditStyle::Bookmark::NONE : defineMarker(m_sciMarkerBookmark, SC_MARK_EMPTY , bookmarkFgColor, bookmarkBgColor); break; + case EditStyle::Bookmark::CIRCLE : defineMarker(m_sciMarkerBookmark, SC_MARK_CIRCLE , bookmarkFgColor, bookmarkBgColor); break; + case EditStyle::Bookmark::RECT : defineMarker(m_sciMarkerBookmark, SC_MARK_SMALLRECT, bookmarkFgColor, bookmarkBgColor); break; + case EditStyle::Bookmark::ROUNDRECT: defineMarker(m_sciMarkerBookmark, SC_MARK_ROUNDRECT, bookmarkFgColor, bookmarkBgColor); break; + case EditStyle::Bookmark::ARROW : defineMarker(m_sciMarkerBookmark, SC_MARK_ARROW , bookmarkFgColor, bookmarkBgColor); break; + } + + // ---------- + // Window + sendEditor(SCI_SETWRAPMODE, m_pStyle->window.wordWrap ? SC_WRAP_WORD : SC_WRAP_NONE); + sendEditor(SCI_SETHSCROLLBAR, m_pStyle->window.showHorzScrollBar); } void Edit::setGroup(Group* pGroup) { - m_pGroup = pGroup; + m_pGroup = pGroup; } -void Edit::onEditUndo() +void Edit::onEditUndo() { - sendEditor(SCI_UNDO); + sendEditor(SCI_UNDO); } -void Edit::onEditRedo() +void Edit::onEditRedo() { - sendEditor(SCI_REDO); + sendEditor(SCI_REDO); } -void Edit::onEditCut() +void Edit::onEditCut() { - sendEditor(SCI_CUT); + sendEditor(SCI_CUT); } -void Edit::onEditCopy() +void Edit::onEditCopy() { - sendEditor(SCI_COPY); + sendEditor(SCI_COPY); } -void Edit::onEditPaste() +void Edit::onEditPaste() { - sendEditor(SCI_PASTE); + sendEditor(SCI_PASTE); } -void Edit::onEditDel() +void Edit::onEditDel() { - sendEditor(SCI_CLEAR); + sendEditor(SCI_CLEAR); } -void Edit::onEditSelectAll() +void Edit::onEditSelectAll() { - sendEditor(SCI_SELECTALL); + sendEditor(SCI_SELECTALL); } -void Edit::onEditUpperCase() +void Edit::onEditUpperCase() { - sendEditor(SCI_UPPERCASE); + sendEditor(SCI_UPPERCASE); } -void Edit::onEditLowerCase() +void Edit::onEditLowerCase() { - sendEditor(SCI_LOWERCASE); + sendEditor(SCI_LOWERCASE); } std::string Edit::getCurrentWord() const { - int pos_begin = sendEditor(SCI_WORDSTARTPOSITION, getCurrentPos(), true); - int pos_end = sendEditor(SCI_WORDENDPOSITION, getCurrentPos(), true); - int len = pos_end - pos_begin + 2; - char* word = new char[ len ]; - TextRange tr; - tr.lpstrText = word; - tr.chrg.cpMin = pos_begin; - tr.chrg.cpMax = pos_end; - sendEditor(SCI_GETTEXTRANGE, 0, (long)&tr); - std::string str(tr.lpstrText); - delete[] word; - return str; + int pos_begin = sendEditor(SCI_WORDSTARTPOSITION, getCurrentPos(), true); + int pos_end = sendEditor(SCI_WORDENDPOSITION, getCurrentPos(), true); + int len = pos_end - pos_begin + 2; + char* word = new char[ len ]; + TextRange tr; + tr.lpstrText = word; + tr.chrg.cpMin = pos_begin; + tr.chrg.cpMax = pos_end; + sendEditor(SCI_GETTEXTRANGE, 0, (long)&tr); + std::string str(tr.lpstrText); + delete[] word; + return str; } std::string Edit::getSelection() const { - CharacterRange cr = getSelectionRange(); - char* selection = new char[ cr.cpMax - cr.cpMin + 1 ]; - sendEditor(SCI_GETSELTEXT, 0, (long)selection); - std::string str = selection; - delete[] selection; - return str; + CharacterRange cr = getSelectionRange(); + char* selection = new char[ cr.cpMax - cr.cpMin + 1 ]; + sendEditor(SCI_GETSELTEXT, 0, (long)selection); + std::string str = selection; + delete[] selection; + return str; } std::string Edit::getCurrentOrSelectedWord() const { - return isSelected() - ? getSelection () - : getCurrentWord(); + return isSelected() + ? getSelection () + : getCurrentWord(); } QString Edit::getWordForFind() const { - return isSelected() - ? QString::fromStdString(getSelection()) - : !getCurrentWord().empty() - ? QString::fromStdString(getCurrentWord()) - : m_pGroup && !m_pGroup->findStr.isEmpty() - ? m_pGroup->findStr - : QString(); + return isSelected() + ? QString::fromStdString(getSelection()) + : !getCurrentWord().empty() + ? QString::fromStdString(getCurrentWord()) + : m_pGroup && !m_pGroup->findStr.isEmpty() + ? m_pGroup->findStr + : QString(); } CharacterRange Edit::getSelectionRange() const { - CharacterRange crange; - crange.cpMin = sendEditor(SCI_GETSELECTIONSTART); - crange.cpMax = sendEditor(SCI_GETSELECTIONEND); - return crange; + CharacterRange crange; + crange.cpMin = sendEditor(SCI_GETSELECTIONSTART); + crange.cpMax = sendEditor(SCI_GETSELECTIONEND); + return crange; } void Edit::gotoLineEnsureVisible(int line) const { - sendEditor(SCI_ENSUREVISIBLEENFORCEPOLICY, line); - sendEditor(SCI_GOTOLINE, line); + sendEditor(SCI_ENSUREVISIBLEENFORCEPOLICY, line); + sendEditor(SCI_GOTOLINE, line); } void Edit::ensureRangeVisible(int posStart, int posEnd, bool enforcePolicy) const { - int lineStart = getLineFromPosition(posStart < posEnd ? posStart : posEnd); - int lineEnd = getLineFromPosition(posStart > posEnd ? posStart : posEnd); - for (int line = lineStart; line <= lineEnd; ++line) - { - sendEditor(enforcePolicy ? SCI_ENSUREVISIBLEENFORCEPOLICY : SCI_ENSUREVISIBLE, line); - } + int lineStart = getLineFromPosition(posStart < posEnd ? posStart : posEnd); + int lineEnd = getLineFromPosition(posStart > posEnd ? posStart : posEnd); + for (int line = lineStart; line <= lineEnd; ++line) + { + sendEditor(enforcePolicy ? SCI_ENSUREVISIBLEENFORCEPOLICY : SCI_ENSUREVISIBLE, line); + } } -void Edit::onSearchFind() +void Edit::onSearchFind() { - m_findSettings.what = QString::fromStdString(getCurrentOrSelectedWord()); + m_findSettings.what = QString::fromStdString(getCurrentOrSelectedWord()); - if (!m_pFindDialog) - { - m_pFindDialog = new FindDialog( - this, - boost::bind(&Edit::onFindDlgFind, this, _1), - boost::bind(&Edit::onFindDlgClose, this) - ); - } + if (!m_pFindDialog) + { + m_pFindDialog = new FindDialog( + this, + boost::bind(&Edit::onFindDlgFind, this, _1), + boost::bind(&Edit::onFindDlgClose, this) + ); + } - if(m_pGroup) - { - m_findSettings.what.isEmpty() - ? m_findSettings.what = m_pGroup->findStr - : m_pGroup->findStr = m_findSettings.what; - m_findReplaceSettings.searchDown = m_pGroup->bSearchDown; - m_findReplaceSettings.matchCase = m_pGroup->bMatchCase; - m_findReplaceSettings.matchWholeWord = m_pGroup->bMatchWholeWord; - } + if(m_pGroup) + { + m_findSettings.what.isEmpty() + ? m_findSettings.what = m_pGroup->findStr + : m_pGroup->findStr = m_findSettings.what; + m_findReplaceSettings.searchDown = m_pGroup->bSearchDown; + m_findReplaceSettings.matchCase = m_pGroup->bMatchCase; + m_findReplaceSettings.matchWholeWord = m_pGroup->bMatchWholeWord; + } - m_pFindDialog->setSettings(m_findSettings); - m_pFindDialog->show(); - m_pFindDialog->raise(); - m_pFindDialog->activateWindow(); + m_pFindDialog->setSettings(m_findSettings); + m_pFindDialog->show(); + m_pFindDialog->raise(); + m_pFindDialog->activateWindow(); } void Edit::onFindDlgFind(const FindDialog::Settings& settings) { - m_findSettings = settings; - if (m_pGroup) - { - m_pGroup->findStr = m_findSettings.what; - } - onSearchFindNext(); - updateActionFind(isActivated()); + m_findSettings = settings; + if (m_pGroup) + { + m_pGroup->findStr = m_findSettings.what; + } + onSearchFindNext(); + updateActionFind(isActivated()); } void Edit::onFindDlgClose() { - m_pFindDialog = NULL; + m_pFindDialog = NULL; } -void Edit::onSearchFindNext() +void Edit::onSearchFindNext() { - findNext( - m_pGroup->findStr.isEmpty() - ? m_findSettings.what - : m_pGroup->findStr, - m_findSettings.searchDown, - m_findSettings.matchCase, - m_findSettings.matchWholeWord - ); + findNext( + m_pGroup->findStr.isEmpty() + ? m_findSettings.what + : m_pGroup->findStr, + m_findSettings.searchDown, + m_findSettings.matchCase, + m_findSettings.matchWholeWord + ); } -void Edit::onSearchFindPrevious() +void Edit::onSearchFindPrevious() { - findNext( - m_pGroup->findStr.isEmpty() - ? m_findSettings.what - : m_pGroup->findStr, - !m_findSettings.searchDown, - m_findSettings.matchCase, - m_findSettings.matchWholeWord - ); + findNext( + m_pGroup->findStr.isEmpty() + ? m_findSettings.what + : m_pGroup->findStr, + !m_findSettings.searchDown, + m_findSettings.matchCase, + m_findSettings.matchWholeWord + ); } -void Edit::onSearchFindNextCurrent() +void Edit::onSearchFindNextCurrent() { - if (m_pGroup) - { - m_pGroup->findStr = QString::fromStdString(getCurrentWord()); - m_pGroup->bSearchDown = true; - findNext(m_pGroup->findStr, m_pGroup->bSearchDown, m_pGroup->bMatchCase, m_pGroup->bMatchWholeWord); - } + if (m_pGroup) + { + m_pGroup->findStr = QString::fromStdString(getCurrentWord()); + m_pGroup->bSearchDown = true; + findNext(m_pGroup->findStr, m_pGroup->bSearchDown, m_pGroup->bMatchCase, m_pGroup->bMatchWholeWord); + } } -void Edit::onSearchFindPreviousCurrent() +void Edit::onSearchFindPreviousCurrent() { - if (m_pGroup) - { - m_pGroup->findStr = QString::fromStdString(getCurrentWord()); - m_pGroup->bSearchDown = true; - findNext(m_pGroup->findStr, !m_pGroup->bSearchDown, m_pGroup->bMatchCase, m_pGroup->bMatchWholeWord); - } + if (m_pGroup) + { + m_pGroup->findStr = QString::fromStdString(getCurrentWord()); + m_pGroup->bSearchDown = true; + findNext(m_pGroup->findStr, !m_pGroup->bSearchDown, m_pGroup->bMatchCase, m_pGroup->bMatchWholeWord); + } } void Edit::findNext(const QString& findWhat, bool searchDown, bool matchCase, bool matchWholeWord) { - if (findWhat.isEmpty()) - return; - - CharacterRange cr; - if (m_haveFound) - { - cr = getSelectionRange(); - } - else - { - CharacterRange crTemp; - if (!getSelection().empty()) - { - crTemp = getSelectionRange(); - } - else if (!getCurrentWord().empty()) - { - crTemp.cpMin = sendEditor(SCI_WORDSTARTPOSITION, getCurrentPos(), true); - crTemp.cpMax = sendEditor(SCI_WORDENDPOSITION, getCurrentPos(), true); - } - else - { - crTemp.cpMin = getCurrentPos(); - crTemp.cpMax = getCurrentPos(); - } - - cr.cpMin = std::min(crTemp.cpMin, crTemp.cpMax); - cr.cpMax = std::max(crTemp.cpMin, crTemp.cpMax); - } - - int startPosition = cr.cpMax; - int endPosition = getLength(); - if (!searchDown) - { - startPosition = cr.cpMin; - endPosition = 0; - } - - int flags = (matchCase ? SCFIND_MATCHCASE : 0) | (matchWholeWord ? SCFIND_WHOLEWORD : 0); - - sendEditor(SCI_SETTARGETSTART, startPosition); - sendEditor(SCI_SETTARGETEND, endPosition); - sendEditor(SCI_SETSEARCHFLAGS, flags); - int posFind = sendEditorString(SCI_SEARCHINTARGET, findWhat.toStdString()); - if (posFind == -1) - { - if (!searchDown) - { - startPosition = getLength(); - endPosition = 0; - } - else - { - startPosition = 0; - endPosition = getLength(); - } - sendEditor(SCI_SETTARGETSTART, startPosition); - sendEditor(SCI_SETTARGETEND, endPosition); - posFind = sendEditorString(SCI_SEARCHINTARGET, findWhat.toStdString()); - } - if (posFind == -1) - { - m_firstFoundPos = -1; - m_haveFound = false; - showFindWarning(findWhat); - //! @todo возможно, надо убрать - setFocus(); - } - else - { - if (m_firstFoundPos == -1) - { - m_firstFoundPos = posFind; - } - else if (posFind == m_firstFoundPos) - { - m_firstFoundPos = -1; - m_haveFound = false; - showFindWarning(findWhat); - //! @todo возможно, надо убрать - setFocus(); - return; - } - m_haveFound = true; - int start = sendEditor(SCI_GETTARGETSTART); - int end = sendEditor(SCI_GETTARGETEND); - ensureRangeVisible(start, end); - setSelection(start, end); - } -} - -void Edit::onSearchReplace() -{ - m_findReplaceSettings.what = QString::fromStdString(getCurrentOrSelectedWord()); - - if (!m_pFindReplaceDialog) - { - m_pFindReplaceDialog = new FindReplaceDialog( - this, - boost::bind(&Edit::onFindReplaceDlgFind, this, _1), - boost::bind(&Edit::onFindReplaceDlgReplace, this, _1), - boost::bind(&Edit::onFindReplaceDlgReplaceAll, this, _1), - boost::bind(&Edit::onFindReplaceDlgClose, this) - ); - } - - if(m_pGroup) - { - m_findReplaceSettings.what.isEmpty() - ? m_findReplaceSettings.what = m_pGroup->findStr - : m_pGroup->findStr = m_findReplaceSettings.what; - m_findReplaceSettings.searchDown = m_pGroup->bSearchDown; - m_findReplaceSettings.matchCase = m_pGroup->bMatchCase; - m_findReplaceSettings.matchWholeWord = m_pGroup->bMatchWholeWord; - } - - m_pFindReplaceDialog->setSettings(m_findReplaceSettings); - m_pFindReplaceDialog->show(); - m_pFindReplaceDialog->raise(); - m_pFindReplaceDialog->activateWindow(); + if (findWhat.isEmpty()) + return; + + CharacterRange cr; + if (m_haveFound) + { + cr = getSelectionRange(); + } + else + { + CharacterRange crTemp; + if (!getSelection().empty()) + { + crTemp = getSelectionRange(); + } + else if (!getCurrentWord().empty()) + { + crTemp.cpMin = sendEditor(SCI_WORDSTARTPOSITION, getCurrentPos(), true); + crTemp.cpMax = sendEditor(SCI_WORDENDPOSITION, getCurrentPos(), true); + } + else + { + crTemp.cpMin = getCurrentPos(); + crTemp.cpMax = getCurrentPos(); + } + + cr.cpMin = std::min(crTemp.cpMin, crTemp.cpMax); + cr.cpMax = std::max(crTemp.cpMin, crTemp.cpMax); + } + + int startPosition = cr.cpMax; + int endPosition = getLength(); + if (!searchDown) + { + startPosition = cr.cpMin; + endPosition = 0; + } + + int flags = (matchCase ? SCFIND_MATCHCASE : 0) | (matchWholeWord ? SCFIND_WHOLEWORD : 0); + + sendEditor(SCI_SETTARGETSTART, startPosition); + sendEditor(SCI_SETTARGETEND, endPosition); + sendEditor(SCI_SETSEARCHFLAGS, flags); + int posFind = sendEditorString(SCI_SEARCHINTARGET, findWhat.toStdString()); + if (posFind == -1) + { + if (!searchDown) + { + startPosition = getLength(); + endPosition = 0; + } + else + { + startPosition = 0; + endPosition = getLength(); + } + sendEditor(SCI_SETTARGETSTART, startPosition); + sendEditor(SCI_SETTARGETEND, endPosition); + posFind = sendEditorString(SCI_SEARCHINTARGET, findWhat.toStdString()); + } + if (posFind == -1) + { + m_firstFoundPos = -1; + m_haveFound = false; + showFindWarning(findWhat); + // TODO возможно, надо убрать + setFocus(); + } + else + { + if (m_firstFoundPos == -1) + { + m_firstFoundPos = posFind; + } + else if (posFind == m_firstFoundPos) + { + m_firstFoundPos = -1; + m_haveFound = false; + showFindWarning(findWhat); + // TODO возможно, надо убрать + setFocus(); + return; + } + m_haveFound = true; + int start = sendEditor(SCI_GETTARGETSTART); + int end = sendEditor(SCI_GETTARGETEND); + ensureRangeVisible(start, end); + setSelection(start, end); + } +} + +void Edit::onSearchReplace() +{ + m_findReplaceSettings.what = QString::fromStdString(getCurrentOrSelectedWord()); + + if (!m_pFindReplaceDialog) + { + m_pFindReplaceDialog = new FindReplaceDialog( + this, + boost::bind(&Edit::onFindReplaceDlgFind, this, _1), + boost::bind(&Edit::onFindReplaceDlgReplace, this, _1), + boost::bind(&Edit::onFindReplaceDlgReplaceAll, this, _1), + boost::bind(&Edit::onFindReplaceDlgClose, this) + ); + } + + if(m_pGroup) + { + m_findReplaceSettings.what.isEmpty() + ? m_findReplaceSettings.what = m_pGroup->findStr + : m_pGroup->findStr = m_findReplaceSettings.what; + m_findReplaceSettings.searchDown = m_pGroup->bSearchDown; + m_findReplaceSettings.matchCase = m_pGroup->bMatchCase; + m_findReplaceSettings.matchWholeWord = m_pGroup->bMatchWholeWord; + } + + m_pFindReplaceDialog->setSettings(m_findReplaceSettings); + m_pFindReplaceDialog->show(); + m_pFindReplaceDialog->raise(); + m_pFindReplaceDialog->activateWindow(); } void Edit::onFindReplaceDlgFind(const FindReplaceDialog::Settings& settings) { - m_findReplaceSettings = settings; - if (m_pGroup) - { - m_pGroup->findStr = m_findReplaceSettings.what; - } - findNext(m_findReplaceSettings.what, m_findReplaceSettings.searchDown, m_findReplaceSettings.matchCase, m_findReplaceSettings.matchWholeWord); - updateActionFind(isActivated()); + m_findReplaceSettings = settings; + if (m_pGroup) + { + m_pGroup->findStr = m_findReplaceSettings.what; + } + findNext(m_findReplaceSettings.what, m_findReplaceSettings.searchDown, m_findReplaceSettings.matchCase, m_findReplaceSettings.matchWholeWord); + updateActionFind(isActivated()); } void Edit::onFindReplaceDlgReplace(const FindReplaceDialog::Settings& settings) { - m_findReplaceSettings = settings; - if (m_pGroup) - { - m_pGroup->findStr = m_findReplaceSettings.what; - m_pGroup->replaceStr = m_findReplaceSettings.byWhat; - } - if ((!getSelection().empty() && !m_haveFound) || (!getCurrentWord().empty() && !m_haveFound)) - { - findNext(m_findReplaceSettings.what, m_findReplaceSettings.searchDown, m_findReplaceSettings.matchCase, m_findReplaceSettings.matchWholeWord); - } - replace(m_findReplaceSettings.what, m_findReplaceSettings.byWhat, m_findReplaceSettings.searchDown, m_findReplaceSettings.matchCase, m_findReplaceSettings.matchWholeWord); - updateActionFind(isActivated()); + m_findReplaceSettings = settings; + if (m_pGroup) + { + m_pGroup->findStr = m_findReplaceSettings.what; + m_pGroup->replaceStr = m_findReplaceSettings.byWhat; + } + if ((!getSelection().empty() && !m_haveFound) || (!getCurrentWord().empty() && !m_haveFound)) + { + findNext(m_findReplaceSettings.what, m_findReplaceSettings.searchDown, m_findReplaceSettings.matchCase, m_findReplaceSettings.matchWholeWord); + } + replace(m_findReplaceSettings.what, m_findReplaceSettings.byWhat, m_findReplaceSettings.searchDown, m_findReplaceSettings.matchCase, m_findReplaceSettings.matchWholeWord); + updateActionFind(isActivated()); } void Edit::onFindReplaceDlgReplaceAll(const FindReplaceDialog::Settings& settings) { - m_findReplaceSettings = settings; - if (m_pGroup) - { - m_pGroup->findStr = m_findReplaceSettings.what; - m_pGroup->replaceStr = m_findReplaceSettings.byWhat; - } - replaceAll(m_findReplaceSettings.what, m_findReplaceSettings.byWhat, m_findReplaceSettings.matchCase, m_findReplaceSettings.matchWholeWord); - updateActionFind(isActivated()); + m_findReplaceSettings = settings; + if (m_pGroup) + { + m_pGroup->findStr = m_findReplaceSettings.what; + m_pGroup->replaceStr = m_findReplaceSettings.byWhat; + } + replaceAll(m_findReplaceSettings.what, m_findReplaceSettings.byWhat, m_findReplaceSettings.matchCase, m_findReplaceSettings.matchWholeWord); + updateActionFind(isActivated()); } void Edit::onFindReplaceDlgClose() { - m_pFindReplaceDialog = NULL; + m_pFindReplaceDialog = NULL; } void Edit::showFindWarning(const QString& findWhat) { - QMessageBox::warning(this, "Результаты поиска", QString("Невозможно найти строчку '%1'.").arg(findWhat)); + QMessageBox::warning(this, "Результаты поиска", QString("Невозможно найти строчку '%1'.").arg(findWhat)); } void Edit::replace(const QString& findWhat, const QString& replaceWhat, bool searchDown, bool matchCase, bool matchWholeWord) { - if (m_haveFound) - { - CharacterRange cr = getSelectionRange(); - if (cr.cpMin == cr.cpMax) - { - cr.cpMin = sendEditor(SCI_WORDSTARTPOSITION, getCurrentPos(), true); - cr.cpMax = cr.cpMin + getCurrentWord().length(); - } - std::string replaceStr = replaceWhat.toStdString(); - sendEditor(SCI_SETTARGETSTART, cr.cpMin); - sendEditor(SCI_SETTARGETEND, cr.cpMax); - sendEditorString(SCI_REPLACETARGET, replaceStr); - setSelection(cr.cpMin + replaceStr.length(), cr.cpMin); - m_haveFound = false; - } - findNext(findWhat, searchDown, matchCase, matchWholeWord); + if (m_haveFound) + { + CharacterRange cr = getSelectionRange(); + if (cr.cpMin == cr.cpMax) + { + cr.cpMin = sendEditor(SCI_WORDSTARTPOSITION, getCurrentPos(), true); + cr.cpMax = cr.cpMin + getCurrentWord().length(); + } + std::string replaceStr = replaceWhat.toStdString(); + sendEditor(SCI_SETTARGETSTART, cr.cpMin); + sendEditor(SCI_SETTARGETEND, cr.cpMax); + sendEditorString(SCI_REPLACETARGET, replaceStr); + setSelection(cr.cpMin + replaceStr.length(), cr.cpMin); + m_haveFound = false; + } + findNext(findWhat, searchDown, matchCase, matchWholeWord); } void Edit::replaceAll(const QString& findWhat, const QString& replaceWhat, bool matchCase, bool matchWholeWord) { - if (findWhat.isEmpty()) - return; - - int startPosition = 0; - int endPosition = getLength(); - - std::string replaceStr = replaceWhat.toStdString(); - std::string::size_type replaceLen = replaceStr.length(); - int flags = (matchCase ? SCFIND_MATCHCASE : 0) | (matchWholeWord ? SCFIND_WHOLEWORD : 0); - - sendEditor(SCI_SETTARGETSTART, startPosition); - sendEditor(SCI_SETTARGETEND, endPosition); - sendEditor(SCI_SETSEARCHFLAGS, flags); - int posFind = sendEditorString(SCI_SEARCHINTARGET, findWhat.toStdString()); - - if ((posFind != -1) && (posFind <= endPosition)) - { - int lastMatch = posFind; - sendEditor(SCI_BEGINUNDOACTION); - while (posFind != -1) - { - int lenTarget = sendEditor(SCI_GETTARGETEND) - sendEditor(SCI_GETTARGETSTART); - sendEditorString(SCI_REPLACETARGET, replaceStr); - endPosition += replaceLen - lenTarget; - lastMatch = posFind + replaceLen; - if (lenTarget <= 0) - ++lastMatch; - sendEditor(SCI_SETTARGETSTART, lastMatch); - sendEditor(SCI_SETTARGETEND, endPosition); - posFind = sendEditorString(SCI_SEARCHINTARGET, findWhat.toStdString()); - } - setSelection(lastMatch, lastMatch); - sendEditor(SCI_ENDUNDOACTION); - } - else - { - showFindWarning(findWhat); - //! @todo возможно, надо убрать - setFocus(); - } + if (findWhat.isEmpty()) + return; + + int startPosition = 0; + int endPosition = getLength(); + + std::string replaceStr = replaceWhat.toStdString(); + std::string::size_type replaceLen = replaceStr.length(); + int flags = (matchCase ? SCFIND_MATCHCASE : 0) | (matchWholeWord ? SCFIND_WHOLEWORD : 0); + + sendEditor(SCI_SETTARGETSTART, startPosition); + sendEditor(SCI_SETTARGETEND, endPosition); + sendEditor(SCI_SETSEARCHFLAGS, flags); + int posFind = sendEditorString(SCI_SEARCHINTARGET, findWhat.toStdString()); + + if ((posFind != -1) && (posFind <= endPosition)) + { + int lastMatch = posFind; + sendEditor(SCI_BEGINUNDOACTION); + while (posFind != -1) + { + int lenTarget = sendEditor(SCI_GETTARGETEND) - sendEditor(SCI_GETTARGETSTART); + sendEditorString(SCI_REPLACETARGET, replaceStr); + endPosition += replaceLen - lenTarget; + lastMatch = posFind + replaceLen; + if (lenTarget <= 0) + ++lastMatch; + sendEditor(SCI_SETTARGETSTART, lastMatch); + sendEditor(SCI_SETTARGETEND, endPosition); + posFind = sendEditorString(SCI_SEARCHINTARGET, findWhat.toStdString()); + } + setSelection(lastMatch, lastMatch); + sendEditor(SCI_ENDUNDOACTION); + } + else + { + showFindWarning(findWhat); + // TODO возможно, надо убрать + setFocus(); + } } void Edit::clearAll() { - bool readOnly = isReadOnly(); - setReadOnly(false); - sendEditor(SCI_CLEARALL); - setReadOnly(readOnly); + bool readOnly = isReadOnly(); + setReadOnly(false); + sendEditor(SCI_CLEARALL); + setReadOnly(readOnly); } bool Edit::bookmarkToggle(int line) const { - if (line == -1) - { - line = getCurrentLineNumber(); - } - int state = sendEditor(SCI_MARKERGET, line); - if (state & (1 << m_sciMarkerBookmark)) - { - sendEditor(SCI_MARKERDELETE, line, m_sciMarkerBookmark); - return false; - } - else - { - sendEditor(SCI_MARKERADD, line, m_sciMarkerBookmark); - return true; - } + if (line == -1) + { + line = getCurrentLineNumber(); + } + int state = sendEditor(SCI_MARKERGET, line); + if (state & (1 << m_sciMarkerBookmark)) + { + sendEditor(SCI_MARKERDELETE, line, m_sciMarkerBookmark); + return false; + } + else + { + sendEditor(SCI_MARKERADD, line, m_sciMarkerBookmark); + return true; + } } bool Edit::bookmarkNext(bool canLoop, bool fromCurrentLine) const { - bool wasFound = false; - bool wasLoop = false; + bool wasFound = false; + bool wasLoop = false; - int line = fromCurrentLine - ? getCurrentLineNumber() - : -1; + int line = fromCurrentLine + ? getCurrentLineNumber() + : -1; - int nextLine = sendEditor(SCI_MARKERNEXT, line + 1, 1 << m_sciMarkerBookmark); - if (nextLine < 0) - { - wasLoop = true; - if (canLoop) - { - nextLine = sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerBookmark); - } - } - if (((canLoop && wasLoop) || !wasLoop) && nextLine >= 0 && nextLine != line) - { - gotoLineEnsureVisible(nextLine); - wasFound = true; - } + int nextLine = sendEditor(SCI_MARKERNEXT, line + 1, 1 << m_sciMarkerBookmark); + if (nextLine < 0) + { + wasLoop = true; + if (canLoop) + { + nextLine = sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerBookmark); + } + } + if (((canLoop && wasLoop) || !wasLoop) && nextLine >= 0 && nextLine != line) + { + gotoLineEnsureVisible(nextLine); + wasFound = true; + } - return wasFound; + return wasFound; } bool Edit::bookmarkPrev(bool canLoop, bool fromCurrentLine) const { - bool wasFound = false; - bool wasLoop = false; + bool wasFound = false; + bool wasLoop = false; - int lineCount = getLineCount(); - int line = fromCurrentLine - ? getCurrentLineNumber() - : lineCount + 1; + int lineCount = getLineCount(); + int line = fromCurrentLine + ? getCurrentLineNumber() + : lineCount + 1; - int prevLine = sendEditor(SCI_MARKERPREVIOUS, line - 1, 1 << m_sciMarkerBookmark); - if (prevLine < 0) - { - wasLoop = true; - if (canLoop) - { - prevLine = sendEditor(SCI_MARKERPREVIOUS, lineCount, 1 << m_sciMarkerBookmark); - } - } - if (((canLoop && wasLoop) || !wasLoop) && prevLine >= 0 && prevLine != line) - { - gotoLineEnsureVisible(prevLine); - wasFound = true; - } + int prevLine = sendEditor(SCI_MARKERPREVIOUS, line - 1, 1 << m_sciMarkerBookmark); + if (prevLine < 0) + { + wasLoop = true; + if (canLoop) + { + prevLine = sendEditor(SCI_MARKERPREVIOUS, lineCount, 1 << m_sciMarkerBookmark); + } + } + if (((canLoop && wasLoop) || !wasLoop) && prevLine >= 0 && prevLine != line) + { + gotoLineEnsureVisible(prevLine); + wasFound = true; + } - return wasFound; + return wasFound; } void Edit::bookmarkClearAll() const { - sendEditor(SCI_MARKERDELETEALL, m_sciMarkerBookmark); + sendEditor(SCI_MARKERDELETEALL, m_sciMarkerBookmark); } bool Edit::hasBookmarks() const { - int nextLine = sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerBookmark); - return nextLine >= 0; + int nextLine = sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerBookmark); + return nextLine >= 0; } void Edit::onCopyAsRTF(QMimeData* pMimeData) { - if (!isSelected()) - return; + if (!isSelected()) + return; - CharacterRange cr = getSelectionRange(); - std::string result = saveAsRTF(cr.cpMin, cr.cpMax); - if (result.empty()) - return; + CharacterRange cr = getSelectionRange(); + std::string result = saveAsRTF(cr.cpMin, cr.cpMax); + if (result.empty()) + return; - QByteArray ba; - ba.append(result.c_str()); - //! @todo для линуха надо будет использовать "text/rtf" ? - pMimeData->setData("Rich Text Format", ba); + QByteArray ba; + ba.append(result.c_str()); + // TODO для линуха надо будет использовать "text/rtf" ? + pMimeData->setData("Rich Text Format", ba); } // -------------------------------------------------------------------------------- @@ -810,136 +810,136 @@ void Edit::onCopyAsRTF(QMimeData* pMimeData) // -------------------------------------------------------------------------------- int GetHexChar(char ch) // 'H' { - return ch > '9' ? (ch | 0x20) - 'a' + 10 : ch - '0'; + return ch > '9' ? (ch | 0x20) - 'a' + 10 : ch - '0'; } int GetHexByte(const char *hexbyte) // "HH" { - return (GetHexChar(*hexbyte) << 4) | GetHexChar(hexbyte[1]); + return (GetHexChar(*hexbyte) << 4) | GetHexChar(hexbyte[1]); } #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable: 4996) + #pragma warning(disable: 4996) #endif void GetRTFStyleChange(char *delta, char *last, const char *current) // \f0\fs20\cf0\highlight0\b0\i0 { - int lastLen = strlen(last), offset = 2, lastOffset, currentOffset, len; - *delta = '\0'; - // font face - lastOffset = offset + 1; - while (last[lastOffset] != '\\') - lastOffset++; - currentOffset = offset + 1; - while (current[currentOffset] != '\\') - currentOffset++; - if (lastOffset != currentOffset || // change - strncmp(last + offset, current + offset, lastOffset - offset)) { - if (lastOffset != currentOffset) { - memmove(last + currentOffset, last + lastOffset, lastLen - lastOffset + 1); - lastLen += currentOffset - lastOffset; - } - len = currentOffset - offset; - memcpy(last + offset, current + offset, len); - strcat(delta, RTF_SETFONTFACE); - lastOffset = strlen(delta); - memcpy(delta + lastOffset, last + offset, len); - delta[lastOffset + len] = '\0'; - } - offset = currentOffset + 3; - // size - lastOffset = offset + 1; - while (last[lastOffset] != '\\') - lastOffset++; - currentOffset = offset + 1; - while (current[currentOffset] != '\\') - currentOffset++; - if (lastOffset != currentOffset || // change - strncmp(last + offset, current + offset, lastOffset - offset)) { - if (lastOffset != currentOffset) { - memmove(last + currentOffset, last + lastOffset, lastLen - lastOffset + 1); - lastLen += currentOffset - lastOffset; - } - len = currentOffset - offset; - memcpy(last + offset, current + offset, len); - strcat (delta, RTF_SETFONTSIZE); - lastOffset = strlen(delta); - memcpy(delta + lastOffset, last + offset, len); - delta[lastOffset + len] = '\0'; - } - offset = currentOffset + 3; - // color - lastOffset = offset + 1; - while (last[lastOffset] != '\\') - lastOffset++; - currentOffset = offset + 1; - while (current[currentOffset] != '\\') - currentOffset++; - if (lastOffset != currentOffset || // change - strncmp(last + offset, current + offset, lastOffset - offset)) { - if (lastOffset != currentOffset) { - memmove(last + currentOffset, last + lastOffset, lastLen - lastOffset + 1); - lastLen += currentOffset - lastOffset; - } - len = currentOffset - offset; - memcpy(last + offset, current + offset, len); - strcat (delta, RTF_SETCOLOR); - lastOffset = strlen(delta); - memcpy(delta + lastOffset, last + offset, len); - delta[lastOffset + len] = '\0'; - } - offset = currentOffset + 10; - // background - lastOffset = offset + 1; - while (last[lastOffset] != '\\') - lastOffset++; - currentOffset = offset + 1; - while (current[currentOffset] != '\\') - currentOffset++; - if (lastOffset != currentOffset || // change - strncmp(last + offset, current + offset, lastOffset - offset)) { - if (lastOffset != currentOffset) { - memmove(last + currentOffset, last + lastOffset, lastLen - lastOffset + 1); - lastLen += currentOffset - lastOffset; - } - len = currentOffset - offset; - memcpy(last + offset, current + offset, len); - strcat(delta, RTF_SETBACKGROUND); - lastOffset = strlen(delta); - memcpy(delta + lastOffset, last + offset, len); - delta[lastOffset + len] = '\0'; - } - offset = currentOffset + 2; - // bold - if (last[offset] != current[offset]) { - if (current[offset] == '\\') { // turn on - memmove(last + offset, last + offset + 1, lastLen-- - offset); - strcat (delta, RTF_BOLD_ON); - offset += 2; - } else { // turn off - memmove (last + offset + 1, last + offset, ++lastLen - offset); - last[offset] = '0'; - strcat(delta, RTF_BOLD_OFF); - offset += 3; - } - } else - offset += current[offset] == '\\' ? 2 : 3; - // italic - if (last[offset] != current[offset]) { - if (current[offset] == '\\') { // turn on - memmove(last + offset, last + offset + 1, lastLen-- - offset); - strcat (delta, RTF_ITALIC_ON); - } else { // turn off - memmove(last + offset + 1, last + offset, ++lastLen - offset); - last[offset] = '0'; - strcat(delta, RTF_ITALIC_OFF); - } - } - if (*delta) { - lastOffset = strlen(delta); - delta[lastOffset] = ' '; - delta[lastOffset + 1] = '\0'; - } + int lastLen = strlen(last), offset = 2, lastOffset, currentOffset, len; + *delta = '\0'; + // font face + lastOffset = offset + 1; + while (last[lastOffset] != '\\') + lastOffset++; + currentOffset = offset + 1; + while (current[currentOffset] != '\\') + currentOffset++; + if (lastOffset != currentOffset || // change + strncmp(last + offset, current + offset, lastOffset - offset)) { + if (lastOffset != currentOffset) { + memmove(last + currentOffset, last + lastOffset, lastLen - lastOffset + 1); + lastLen += currentOffset - lastOffset; + } + len = currentOffset - offset; + memcpy(last + offset, current + offset, len); + strcat(delta, RTF_SETFONTFACE); + lastOffset = strlen(delta); + memcpy(delta + lastOffset, last + offset, len); + delta[lastOffset + len] = '\0'; + } + offset = currentOffset + 3; + // size + lastOffset = offset + 1; + while (last[lastOffset] != '\\') + lastOffset++; + currentOffset = offset + 1; + while (current[currentOffset] != '\\') + currentOffset++; + if (lastOffset != currentOffset || // change + strncmp(last + offset, current + offset, lastOffset - offset)) { + if (lastOffset != currentOffset) { + memmove(last + currentOffset, last + lastOffset, lastLen - lastOffset + 1); + lastLen += currentOffset - lastOffset; + } + len = currentOffset - offset; + memcpy(last + offset, current + offset, len); + strcat (delta, RTF_SETFONTSIZE); + lastOffset = strlen(delta); + memcpy(delta + lastOffset, last + offset, len); + delta[lastOffset + len] = '\0'; + } + offset = currentOffset + 3; + // color + lastOffset = offset + 1; + while (last[lastOffset] != '\\') + lastOffset++; + currentOffset = offset + 1; + while (current[currentOffset] != '\\') + currentOffset++; + if (lastOffset != currentOffset || // change + strncmp(last + offset, current + offset, lastOffset - offset)) { + if (lastOffset != currentOffset) { + memmove(last + currentOffset, last + lastOffset, lastLen - lastOffset + 1); + lastLen += currentOffset - lastOffset; + } + len = currentOffset - offset; + memcpy(last + offset, current + offset, len); + strcat (delta, RTF_SETCOLOR); + lastOffset = strlen(delta); + memcpy(delta + lastOffset, last + offset, len); + delta[lastOffset + len] = '\0'; + } + offset = currentOffset + 10; + // background + lastOffset = offset + 1; + while (last[lastOffset] != '\\') + lastOffset++; + currentOffset = offset + 1; + while (current[currentOffset] != '\\') + currentOffset++; + if (lastOffset != currentOffset || // change + strncmp(last + offset, current + offset, lastOffset - offset)) { + if (lastOffset != currentOffset) { + memmove(last + currentOffset, last + lastOffset, lastLen - lastOffset + 1); + lastLen += currentOffset - lastOffset; + } + len = currentOffset - offset; + memcpy(last + offset, current + offset, len); + strcat(delta, RTF_SETBACKGROUND); + lastOffset = strlen(delta); + memcpy(delta + lastOffset, last + offset, len); + delta[lastOffset + len] = '\0'; + } + offset = currentOffset + 2; + // bold + if (last[offset] != current[offset]) { + if (current[offset] == '\\') { // turn on + memmove(last + offset, last + offset + 1, lastLen-- - offset); + strcat (delta, RTF_BOLD_ON); + offset += 2; + } else { // turn off + memmove (last + offset + 1, last + offset, ++lastLen - offset); + last[offset] = '0'; + strcat(delta, RTF_BOLD_OFF); + offset += 3; + } + } else + offset += current[offset] == '\\' ? 2 : 3; + // italic + if (last[offset] != current[offset]) { + if (current[offset] == '\\') { // turn on + memmove(last + offset, last + offset + 1, lastLen-- - offset); + strcat (delta, RTF_ITALIC_ON); + } else { // turn off + memmove(last + offset + 1, last + offset, ++lastLen - offset); + last[offset] = '0'; + strcat(delta, RTF_ITALIC_OFF); + } + } + if (*delta) { + lastOffset = strlen(delta); + delta[lastOffset] = ' '; + delta[lastOffset + 1] = '\0'; + } } // -------------------------------------------------------------------------------- @@ -948,711 +948,711 @@ void GetRTFStyleChange(char *delta, char *last, const char *current) // \f0\fs20 std::string Edit::saveAsRTF(int start, int end) const { - std::string saveStr; - - if (!m_pStyle) - { - return saveStr; - } - - int lengthDoc = getLength(); - if (end < 0) end = lengthDoc; - sendEditor(SCI_COLOURISE, 0, -1); - char styles[STYLE_DEFAULT + 1][MAX_STYLEDEF]; - char fonts[STYLE_DEFAULT + 1][MAX_FONTDEF]; - char colors[STYLE_DEFAULT + 1][MAX_COLORDEF]; - char lastStyle[MAX_STYLEDEF], deltaStyle[MAX_STYLEDEF]; - int fontCount = 1; - int colorCount = 1; - int i; - - saveStr = ""; - saveStr += RTF_HEADEROPEN; - saveStr += RTF_FONTDEFOPEN; - - strncpy(*fonts, m_pStyle->font.name.c_str(), MAX_FONTDEF); - saveStr += rdo::format(RTF_FONTDEF, 0, m_pStyle->font.name.c_str()); - strncpy(*colors, "#000000", MAX_COLORDEF); - - EditStyle* style = static_cast(m_pStyle); - - for (int istyle = 0; istyle <= STYLE_DEFAULT; istyle++) { - if (style->styleUsing(istyle)) { - sprintf(lastStyle, RTF_SETFONTFACE "%d", fontCount-1); - sprintf(lastStyle + strlen(lastStyle), RTF_SETFONTSIZE "%d", m_pStyle->font.size * 2); - if (style->styleDefault(istyle)) { - strncpy(colors[colorCount++], style->styleBGColorToHEX(istyle).c_str(), MAX_COLORDEF); - } - strncpy(colors[colorCount++], style->styleFGColorToHEX(istyle).c_str(), MAX_COLORDEF); - bool bold = style->styleBold(istyle); - bool italic = style->styleItalic(istyle); - sprintf(lastStyle + strlen(lastStyle), RTF_SETCOLOR "%d", colorCount-1); - sprintf(lastStyle + strlen(lastStyle), RTF_SETBACKGROUND "%d", 1); - strcat(lastStyle, bold ? RTF_BOLD_ON : RTF_BOLD_OFF); - strcat(lastStyle, italic ? RTF_ITALIC_ON : RTF_ITALIC_OFF); - strncpy(styles[istyle], lastStyle, MAX_STYLEDEF); - } - } - saveStr += RTF_FONTDEFCLOSE; - saveStr += RTF_COLORDEFOPEN; - - for (i = 0; i < colorCount; i++) { - saveStr += rdo::format(RTF_COLORDEF, GetHexByte(colors[i] + 1), GetHexByte(colors[i] + 3), GetHexByte(colors[i] + 5)); - } - - saveStr += rdo::format(RTF_COLORDEFCLOSE RTF_HEADERCLOSE RTF_BODYOPEN RTF_SETFONTFACE "0" RTF_SETFONTSIZE "%d" RTF_SETCOLOR "0 ", m_pStyle->font.size * 2); - - sprintf(lastStyle, RTF_SETFONTFACE "0" RTF_SETFONTSIZE "%d" RTF_SETCOLOR "0" RTF_SETBACKGROUND "0" RTF_BOLD_OFF RTF_ITALIC_OFF, m_pStyle->font.size * 2); - - std::string::size_type prevLength = saveStr.length(); - bool prevCR = false; - int styleCurrent = -1; - - //! @todo убрать копипаст - char* word = new char[end - start + 1]; - TextRange tr; - tr.lpstrText = word; - tr.chrg.cpMin = start; - tr.chrg.cpMax = end; - sendEditor(SCI_GETTEXTRANGE, 0, (long)&tr); - std::string str(tr.lpstrText); - delete[] word; - std::wstring wstr = rdo::locale::convertToWStr(str); - - i = start; - for (std::size_t chIndex = 0; chIndex < wstr.length(); ++chIndex) - { - int styleID = sendEditor(SCI_GETSTYLEAT, i); - if (!style->styleUsing(styleID)) - { - continue; - } - - if (styleID != styleCurrent) - { - GetRTFStyleChange(deltaStyle, lastStyle, styles[styleID]); - if (*deltaStyle) - { - saveStr += deltaStyle; - } - styleCurrent = styleID; - } - - wchar_t ch = wstr[chIndex]; - if (ch == L'\\') - { - saveStr += "\\\\"; - } - else if (ch == L'\t') - { - saveStr += RTF_TAB; - } - else if (ch == L'\n') - { - if (!prevCR) - { - saveStr += RTF_EOLN; - } - } - else if (ch == L'\r') - { - saveStr += RTF_EOLN; - } - else - { - saveStr += boost::str(boost::format("\\u%1%?") % + (std::size_t)ch); - } - - prevCR = ch == L'\r'; - - i += rdo::locale::convertFromWStr(wstr.substr(chIndex, 1)).size(); - } - bool wasGenerated = prevLength != saveStr.length(); - if (wasGenerated) - { - saveStr += RTF_BODYCLOSE; - } - else - { - saveStr.clear(); - } - - return saveStr; + std::string saveStr; + + if (!m_pStyle) + { + return saveStr; + } + + int lengthDoc = getLength(); + if (end < 0) end = lengthDoc; + sendEditor(SCI_COLOURISE, 0, -1); + char styles[STYLE_DEFAULT + 1][MAX_STYLEDEF]; + char fonts[STYLE_DEFAULT + 1][MAX_FONTDEF]; + char colors[STYLE_DEFAULT + 1][MAX_COLORDEF]; + char lastStyle[MAX_STYLEDEF], deltaStyle[MAX_STYLEDEF]; + int fontCount = 1; + int colorCount = 1; + int i; + + saveStr = ""; + saveStr += RTF_HEADEROPEN; + saveStr += RTF_FONTDEFOPEN; + + strncpy(*fonts, m_pStyle->font.name.c_str(), MAX_FONTDEF); + saveStr += rdo::format(RTF_FONTDEF, 0, m_pStyle->font.name.c_str()); + strncpy(*colors, "#000000", MAX_COLORDEF); + + EditStyle* style = static_cast(m_pStyle); + + for (int istyle = 0; istyle <= STYLE_DEFAULT; istyle++) { + if (style->styleUsing(istyle)) { + sprintf(lastStyle, RTF_SETFONTFACE "%d", fontCount-1); + sprintf(lastStyle + strlen(lastStyle), RTF_SETFONTSIZE "%d", m_pStyle->font.size * 2); + if (style->styleDefault(istyle)) { + strncpy(colors[colorCount++], style->styleBGColorToHEX(istyle).c_str(), MAX_COLORDEF); + } + strncpy(colors[colorCount++], style->styleFGColorToHEX(istyle).c_str(), MAX_COLORDEF); + bool bold = style->styleBold(istyle); + bool italic = style->styleItalic(istyle); + sprintf(lastStyle + strlen(lastStyle), RTF_SETCOLOR "%d", colorCount-1); + sprintf(lastStyle + strlen(lastStyle), RTF_SETBACKGROUND "%d", 1); + strcat(lastStyle, bold ? RTF_BOLD_ON : RTF_BOLD_OFF); + strcat(lastStyle, italic ? RTF_ITALIC_ON : RTF_ITALIC_OFF); + strncpy(styles[istyle], lastStyle, MAX_STYLEDEF); + } + } + saveStr += RTF_FONTDEFCLOSE; + saveStr += RTF_COLORDEFOPEN; + + for (i = 0; i < colorCount; i++) { + saveStr += rdo::format(RTF_COLORDEF, GetHexByte(colors[i] + 1), GetHexByte(colors[i] + 3), GetHexByte(colors[i] + 5)); + } + + saveStr += rdo::format(RTF_COLORDEFCLOSE RTF_HEADERCLOSE RTF_BODYOPEN RTF_SETFONTFACE "0" RTF_SETFONTSIZE "%d" RTF_SETCOLOR "0 ", m_pStyle->font.size * 2); + + sprintf(lastStyle, RTF_SETFONTFACE "0" RTF_SETFONTSIZE "%d" RTF_SETCOLOR "0" RTF_SETBACKGROUND "0" RTF_BOLD_OFF RTF_ITALIC_OFF, m_pStyle->font.size * 2); + + std::string::size_type prevLength = saveStr.length(); + bool prevCR = false; + int styleCurrent = -1; + + // TODO убрать копипаст + char* word = new char[end - start + 1]; + TextRange tr; + tr.lpstrText = word; + tr.chrg.cpMin = start; + tr.chrg.cpMax = end; + sendEditor(SCI_GETTEXTRANGE, 0, (long)&tr); + std::string str(tr.lpstrText); + delete[] word; + std::wstring wstr = rdo::locale::convertToWStr(str); + + i = start; + for (std::size_t chIndex = 0; chIndex < wstr.length(); ++chIndex) + { + int styleID = sendEditor(SCI_GETSTYLEAT, i); + if (!style->styleUsing(styleID)) + { + continue; + } + + if (styleID != styleCurrent) + { + GetRTFStyleChange(deltaStyle, lastStyle, styles[styleID]); + if (*deltaStyle) + { + saveStr += deltaStyle; + } + styleCurrent = styleID; + } + + wchar_t ch = wstr[chIndex]; + if (ch == L'\\') + { + saveStr += "\\\\"; + } + else if (ch == L'\t') + { + saveStr += RTF_TAB; + } + else if (ch == L'\n') + { + if (!prevCR) + { + saveStr += RTF_EOLN; + } + } + else if (ch == L'\r') + { + saveStr += RTF_EOLN; + } + else + { + saveStr += boost::str(boost::format("\\u%1%?") % + (std::size_t)ch); + } + + prevCR = ch == L'\r'; + + i += rdo::locale::convertFromWStr(wstr.substr(chIndex, 1)).size(); + } + bool wasGenerated = prevLength != saveStr.length(); + if (wasGenerated) + { + saveStr += RTF_BODYCLOSE; + } + else + { + saveStr.clear(); + } + + return saveStr; } #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(default: 4996) + #pragma warning(default: 4996) #endif void Edit::setCurrentPos(const int value) const { - sendEditor(SCI_SETCURRENTPOS, value); - sendEditor(SCI_SETSELECTIONSTART, value); - sendEditor(SCI_SETSELECTIONEND, value); + sendEditor(SCI_SETCURRENTPOS, value); + sendEditor(SCI_SETSELECTIONSTART, value); + sendEditor(SCI_SETSELECTIONEND, value); } void Edit::setCurrentPos(const int line, int pos_in_line, const bool convert_rdo_tab) const { - int pos = getPositionFromLine(line); - int line_length = sendEditor(SCI_LINELENGTH, line); - char currentLine[8000]; - bool canUseLine = false; - if (line_length < 8000) - { - sendEditor(SCI_GETLINE, line, (long)currentLine); - while (currentLine[line_length-1] == 0x0A || currentLine[line_length-1] == 0x0D) - { - --line_length; - } - canUseLine = true; - } - else - { - line_length -= 2; - } - - int new_line_length = line_length; - - if (canUseLine && convert_rdo_tab) - { - int tab_size = m_pStyle ? m_pStyle->tab.tabSize : 8; - int spaces = 0; - for (int i = 0; i < line_length; i++) - { - if (currentLine[i] == ' ') - { - spaces++; - } - else if (currentLine[i] == '\t') - { - int delta = spaces % 8; - pos_in_line -= 7 - delta; - new_line_length += tab_size + delta; - spaces = 0; - } - else - { - spaces = 0; - } - } - } - - pos += (std::min)(new_line_length, pos_in_line); - - int line_to_scroll = line > 0 ? line - 1 : 0; - scrollToLine(line_to_scroll); - sendEditor(SCI_GOTOPOS, pos); - - setCurrentPos(pos); + int pos = getPositionFromLine(line); + int line_length = sendEditor(SCI_LINELENGTH, line); + char currentLine[8000]; + bool canUseLine = false; + if (line_length < 8000) + { + sendEditor(SCI_GETLINE, line, (long)currentLine); + while (currentLine[line_length-1] == 0x0A || currentLine[line_length-1] == 0x0D) + { + --line_length; + } + canUseLine = true; + } + else + { + line_length -= 2; + } + + int new_line_length = line_length; + + if (canUseLine && convert_rdo_tab) + { + int tab_size = m_pStyle ? m_pStyle->tab.tabSize : 8; + int spaces = 0; + for (int i = 0; i < line_length; i++) + { + if (currentLine[i] == ' ') + { + spaces++; + } + else if (currentLine[i] == '\t') + { + int delta = spaces % 8; + pos_in_line -= 7 - delta; + new_line_length += tab_size + delta; + spaces = 0; + } + else + { + spaces = 0; + } + } + } + + pos += (std::min)(new_line_length, pos_in_line); + + int line_to_scroll = line > 0 ? line - 1 : 0; + scrollToLine(line_to_scroll); + sendEditor(SCI_GOTOPOS, pos); + + setCurrentPos(pos); } bool Edit::isLineVisible(const int line) const { - int first_line = sendEditor(SCI_GETFIRSTVISIBLELINE); - int last_line = first_line + sendEditor(SCI_LINESONSCREEN); - return line >= first_line && line <= last_line; + int first_line = sendEditor(SCI_GETFIRSTVISIBLELINE); + int last_line = first_line + sendEditor(SCI_LINESONSCREEN); + return line >= first_line && line <= last_line; } void Edit::appendText(const QString& str) const { - std::string text = str.toStdString(); - sendEditorString(SCI_ADDTEXT, text.length(), text.c_str()); + std::string text = str.toStdString(); + sendEditorString(SCI_ADDTEXT, text.length(), text.c_str()); } void Edit::scrollToLine(const int line) const { - sendEditor(SCI_LINESCROLL, 0, line - sendEditor(SCI_GETFIRSTVISIBLELINE) - sendEditor(SCI_LINESONSCREEN)/3); - setCurrentPos(getPositionFromLine(line)); + sendEditor(SCI_LINESCROLL, 0, line - sendEditor(SCI_GETFIRSTVISIBLELINE) - sendEditor(SCI_LINESONSCREEN)/3); + setCurrentPos(getPositionFromLine(line)); } void Edit::scrollToLine2(const int line) const { - sendEditor(SCI_LINESCROLL, 0, line); + sendEditor(SCI_LINESCROLL, 0, line); } void Edit::scrollToCarret() const { - sendEditor(SCI_SCROLLCARET); + sendEditor(SCI_SCROLLCARET); } void Edit::horzScrollToCurrentPos() const { - setCurrentPos(getCurrentPos()); - sendEditor(SCI_REPLACESEL, 0, 0); + setCurrentPos(getCurrentPos()); + sendEditor(SCI_REPLACESEL, 0, 0); } void Edit::load(const std::stringstream& stream) { - bool readOnly = isReadOnly(); - setReadOnly(false); + bool readOnly = isReadOnly(); + setReadOnly(false); - std::string text = stream.str(); - sendEditorString(SCI_ADDTEXT, text.length(), text.c_str()); + std::string text = stream.str(); + sendEditorString(SCI_ADDTEXT, text.length(), text.c_str()); - setReadOnly(readOnly); + setReadOnly(readOnly); } void Edit::save(std::stringstream& stream) const { - int len = getLength(); - std::vector str; - str.resize(len + 1); - sendEditorString(SCI_GETTEXT, len + 1, &str[0]); - stream.str(&str[0]); + int len = getLength(); + std::vector str; + str.resize(len + 1); + sendEditorString(SCI_GETTEXT, len + 1, &str[0]); + stream.str(&str[0]); } int Edit::indentOfBlock(int line) const { - if (line < 0) - return 0; + if (line < 0) + return 0; - return sendEditor(SCI_GETLINEINDENTATION, line); + return sendEditor(SCI_GETLINEINDENTATION, line); } void Edit::setLineIndentation(int line, int indent) const { - if (indent < 0) return; - CharacterRange crange = getSelectionRange(); - int posBefore = sendEditor(SCI_GETLINEINDENTPOSITION, line); - sendEditor(SCI_SETLINEINDENTATION, line, indent); - int posAfter = sendEditor(SCI_GETLINEINDENTPOSITION, line); - int posDifference = posAfter - posBefore; - if (posAfter > posBefore) - { - if (crange.cpMin >= posBefore) - { - crange.cpMin += posDifference; - } - if (crange.cpMax >= posBefore) - { - crange.cpMax += posDifference; - } - } - else if (posAfter < posBefore) - { - if (crange.cpMin >= posAfter) - { - if (crange.cpMin >= posBefore) - { - crange.cpMin += posDifference; - } - else - { - crange.cpMin = posAfter; - } - } - if (crange.cpMax >= posAfter) - { - if (crange.cpMax >= posBefore) - { - crange.cpMax += posDifference; - } - else - { - crange.cpMax = posAfter; - } - } - } - setSelection(crange.cpMin, crange.cpMax); + if (indent < 0) return; + CharacterRange crange = getSelectionRange(); + int posBefore = sendEditor(SCI_GETLINEINDENTPOSITION, line); + sendEditor(SCI_SETLINEINDENTATION, line, indent); + int posAfter = sendEditor(SCI_GETLINEINDENTPOSITION, line); + int posDifference = posAfter - posBefore; + if (posAfter > posBefore) + { + if (crange.cpMin >= posBefore) + { + crange.cpMin += posDifference; + } + if (crange.cpMax >= posBefore) + { + crange.cpMax += posDifference; + } + } + else if (posAfter < posBefore) + { + if (crange.cpMin >= posAfter) + { + if (crange.cpMin >= posBefore) + { + crange.cpMin += posDifference; + } + else + { + crange.cpMin = posAfter; + } + } + if (crange.cpMax >= posAfter) + { + if (crange.cpMax >= posBefore) + { + crange.cpMax += posDifference; + } + else + { + crange.cpMax = posAfter; + } + } + } + setSelection(crange.cpMin, crange.cpMax); } void Edit::autoIndent() const { - CharacterRange crange = getSelectionRange(); - int selStart = crange.cpMin; - int curLine = getCurrentLineNumber(); - int thisLineStart = getPositionFromLine(curLine); - int indentBlock = indentOfBlock(curLine - 1); + CharacterRange crange = getSelectionRange(); + int selStart = crange.cpMin; + int curLine = getCurrentLineNumber(); + int thisLineStart = getPositionFromLine(curLine); + int indentBlock = indentOfBlock(curLine - 1); - if (selStart == thisLineStart) - { - setLineIndentation(curLine, indentBlock); - } + if (selStart == thisLineStart) + { + setLineIndentation(curLine, indentBlock); + } } void Edit::onSearchBookmarkToggle() { - bookmarkToggle(); + bookmarkToggle(); } void Edit::onSearchBookmarkNext() const { - onSearchBookmarkNextPrev( - boost::bind(&Edit::bookmarkNext, _1, _2, _3), - boost::bind(&Edit::Group::next, m_pGroup, _1) - ); + onSearchBookmarkNextPrev( + boost::bind(&Edit::bookmarkNext, _1, _2, _3), + boost::bind(&Edit::Group::next, m_pGroup, _1) + ); } void Edit::onSearchBookmarkPrev() const { - onSearchBookmarkNextPrev( - boost::bind(&Edit::bookmarkPrev, _1, _2, _3), - boost::bind(&Edit::Group::prev, m_pGroup, _1) - ); + onSearchBookmarkNextPrev( + boost::bind(&Edit::bookmarkPrev, _1, _2, _3), + boost::bind(&Edit::Group::prev, m_pGroup, _1) + ); } void Edit::onSearchBookmarkNextPrev( - const boost::function& nextPrevFun, - const boost::function& nextPrevGroup + const boost::function& nextPrevFun, + const boost::function& nextPrevGroup ) const { - if (nextPrevFun(this, false, true)) - { - return; - } - - if (!m_pGroup) - { - nextPrevFun(this, true, true); - } - else - { - Group::List::const_iterator it = std::find(m_pGroup->begin(), m_pGroup->end(), this); - ASSERT(it != m_pGroup->end()); - - std::size_t thisBookmarkCount = 0; - for (;;) - { - it = nextPrevGroup(it); - - if (*it == this) - { - ++thisBookmarkCount; - if (thisBookmarkCount > 1) - { - break; - } - } - - if (nextPrevFun(*it, false, false)) - { - QWidget* pParent = (*it)->parentWidget()->parentWidget(); - ASSERT(pParent); - QTabWidget* pTabWidget = dynamic_cast(pParent); - if (pTabWidget) - { - pTabWidget->setCurrentWidget(*it); - } - break; - } - } - } + if (nextPrevFun(this, false, true)) + { + return; + } + + if (!m_pGroup) + { + nextPrevFun(this, true, true); + } + else + { + Group::List::const_iterator it = std::find(m_pGroup->begin(), m_pGroup->end(), this); + ASSERT(it != m_pGroup->end()); + + std::size_t thisBookmarkCount = 0; + for (;;) + { + it = nextPrevGroup(it); + + if (*it == this) + { + ++thisBookmarkCount; + if (thisBookmarkCount > 1) + { + break; + } + } + + if (nextPrevFun(*it, false, false)) + { + QWidget* pParent = (*it)->parentWidget()->parentWidget(); + ASSERT(pParent); + QTabWidget* pTabWidget = dynamic_cast(pParent); + if (pTabWidget) + { + pTabWidget->setCurrentWidget(*it); + } + break; + } + } + } } void Edit::onSearchBookmarkClearAll() { - methodOfGroup(boost::bind(&Edit::bookmarkClearAll, _1)); + methodOfGroup(boost::bind(&Edit::bookmarkClearAll, _1)); } void Edit::onUpdateEditGUI() { - onUpdateActions(isActivated()); + onUpdateActions(isActivated()); } -void Edit::onViewShowWhiteSpace() +void Edit::onViewShowWhiteSpace() { - methodOfGroup(boost::bind(&Edit::setViewWhiteSpace, _1, !isViewWhiteSpace())); + methodOfGroup(boost::bind(&Edit::setViewWhiteSpace, _1, !isViewWhiteSpace())); } -void Edit::onViewShowEndOfLine() +void Edit::onViewShowEndOfLine() { - methodOfGroup(boost::bind(&Edit::setViewEndOfLine, _1, !isViewEndOfLine())); + methodOfGroup(boost::bind(&Edit::setViewEndOfLine, _1, !isViewEndOfLine())); } void Edit::onViewZoomChanged(int) { - onUpdateActions(isActivated()); + onUpdateActions(isActivated()); } void Edit::onViewZoomInc() { - methodOfGroup(boost::bind(&Edit::zoomIn, _1)); - onUpdateActions(isActivated()); + methodOfGroup(boost::bind(&Edit::zoomIn, _1)); + onUpdateActions(isActivated()); } -void Edit::onViewZoomDec() +void Edit::onViewZoomDec() { - methodOfGroup(boost::bind(&Edit::zoomOut, _1)); - onUpdateActions(isActivated()); + methodOfGroup(boost::bind(&Edit::zoomOut, _1)); + onUpdateActions(isActivated()); } -void Edit::onViewZoomReset() +void Edit::onViewZoomReset() { - methodOfGroup(boost::bind(&Edit::resetZoom, _1)); - onUpdateActions(isActivated()); + methodOfGroup(boost::bind(&Edit::resetZoom, _1)); + onUpdateActions(isActivated()); } int Edit::findPos(const QString& findWhat, const int startFromLine, const bool matchCase, const bool matchWholeWord) const { - if (findWhat.isEmpty()) - return -1; + if (findWhat.isEmpty()) + return -1; - int startPosition = getPositionFromLine(startFromLine); - int endPosition = getLength(); + int startPosition = getPositionFromLine(startFromLine); + int endPosition = getLength(); - int flags = (matchCase ? SCFIND_MATCHCASE : 0) | (matchWholeWord ? SCFIND_WHOLEWORD : 0); + int flags = (matchCase ? SCFIND_MATCHCASE : 0) | (matchWholeWord ? SCFIND_WHOLEWORD : 0); - sendEditor(SCI_SETTARGETSTART, startPosition); - sendEditor(SCI_SETTARGETEND, endPosition); - sendEditor(SCI_SETSEARCHFLAGS, flags); - return sendEditorString(SCI_SEARCHINTARGET, findWhat.toStdString()); + sendEditor(SCI_SETTARGETSTART, startPosition); + sendEditor(SCI_SETTARGETEND, endPosition); + sendEditor(SCI_SETSEARCHFLAGS, flags); + return sendEditorString(SCI_SEARCHINTARGET, findWhat.toStdString()); } std::string Edit::getLine(const int line) const { - int length = sendEditor(SCI_LINELENGTH, line); - std::string str; - str.resize(length); - sendEditor(SCI_GETLINE, line, (long)str.data()); - return str; + int length = sendEditor(SCI_LINELENGTH, line); + std::string str; + str.resize(length); + sendEditor(SCI_GETLINE, line, (long)str.data()); + return str; } void Edit::onSearchGotoLine() { - GoToLineDialog dialog(this, getCurrentLineNumber() + 1, getLineCount()); - if (dialog.exec() == QDialog::Accepted) - { - setCurrentPos(dialog.getLine() - 1, 0); - } + GoToLineDialog dialog(this, getCurrentLineNumber() + 1, getLineCount()); + if (dialog.exec() == QDialog::Accepted) + { + setCurrentPos(dialog.getLine() - 1, 0); + } } void Edit::focusInEvent(QFocusEvent* pEvent) { - super::focusInEvent(pEvent); - activate(pEvent); + super::focusInEvent(pEvent); + activate(pEvent); } void Edit::focusOutEvent(QFocusEvent* pEvent) { - deactivate(pEvent); - super::focusOutEvent(pEvent); + deactivate(pEvent); + super::focusOutEvent(pEvent); } void Edit::onUpdateActions(bool activated) { - MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); - - updateAction( - pMainWindow->actEditUndo, - activated && sendEditor(SCI_CANUNDO), - this, &Edit::onEditUndo - ); - updateAction( - pMainWindow->actEditRedo, - activated && sendEditor(SCI_CANREDO), - this, &Edit::onEditRedo - ); - updateAction( - pMainWindow->actEditCut, - activated && !isReadOnly() && isSelected(), - this, &Edit::onEditCut - ); - updateAction( - pMainWindow->actEditCopy, - activated && isSelected(), - this, &Edit::onEditCopy - ); - updateAction( - pMainWindow->actEditPaste, - activated && sendEditor(SCI_CANPASTE), - this, &Edit::onEditPaste - ); - updateAction( - pMainWindow->actEditDel, - activated && !isReadOnly() && (getCurrentPos() != getLength() || isSelected()), - this, &Edit::onEditDel - ); - updateAction( - pMainWindow->actEditSelectAll, - activated && !isEmpty(), - this, &Edit::onEditSelectAll - ); - updateAction( - pMainWindow->actEditUpperCase, - activated && !isReadOnly() && isSelected(), - this, &Edit::onEditUpperCase - ); - updateAction( - pMainWindow->actEditLowerCase, - activated && !isReadOnly() && isSelected(), - this, &Edit::onEditLowerCase - ); - updateAction( - pMainWindow->actViewShowWhiteSpace, - activated, - this, &Edit::onViewShowWhiteSpace - ); - pMainWindow->actViewShowWhiteSpace->setChecked(isViewWhiteSpace()); - - updateAction( - pMainWindow->actViewShowEndOfLine, - activated, - this, &Edit::onViewShowEndOfLine - ); - pMainWindow->actViewShowEndOfLine->setChecked(isViewEndOfLine()); - - updateAction( - pMainWindow->actHelpContext, - activated, - this, &Edit::onHelpContext - ); - updateAction( - pMainWindow->actViewZoomInc, - activated && getZoom() < 20, - this, &Edit::onViewZoomInc - ); - updateAction( - pMainWindow->actViewZoomDec, - activated && getZoom() > -10, - this, &Edit::onViewZoomDec - ); - updateAction( - pMainWindow->actViewZoomReset, - activated && getZoom(), - this, &Edit::onViewZoomReset - ); - - bool hasBookmark = predicateOfGroup(boost::bind(&Edit::hasBookmarks, _1)); - - updateAction( - pMainWindow->actSearchBookmarkNext, - activated && hasBookmark, - this, &Edit::onSearchBookmarkNext - ); - updateAction( - pMainWindow->actSearchBookmarkPrev, - activated && hasBookmark, - this, &Edit::onSearchBookmarkPrev - ); - updateAction( - pMainWindow->actSearchBookmarksToggle, - activated, - this, &Edit::onSearchBookmarkToggle - ); - updateAction( - pMainWindow->actSearchBookmarksClearAll, - activated && hasBookmark, - this, &Edit::onSearchBookmarkClearAll - ); - updateAction( - pMainWindow->actSearchGotoLine, - activated, - this, &Edit::onSearchGotoLine - ); - updateAction( - pMainWindow->actSearchFind, - activated, - this, &Edit::onSearchFind - ); - - updateActionFind(activated); - - QString modify = activated - ? isReadOnly() - ? "Только чтение" - : isModify() - ? "Изменён" - : QString() - : QString(); - - pMainWindow->statusBar()->update(modify); - - QString coord = activated - ? QString("%1: %2").arg(getCurrentColumnNumber() + 1).arg(getCurrentLineNumber() + 1) - : QString(); - - pMainWindow->statusBar()->update(coord); - - QString overwrite = activated && sendEditor(SCI_GETOVERTYPE) - ? "Замена" - : QString(); - - pMainWindow->statusBar()->update(overwrite); + MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); + + updateAction( + pMainWindow->actEditUndo, + activated && sendEditor(SCI_CANUNDO), + this, &Edit::onEditUndo + ); + updateAction( + pMainWindow->actEditRedo, + activated && sendEditor(SCI_CANREDO), + this, &Edit::onEditRedo + ); + updateAction( + pMainWindow->actEditCut, + activated && !isReadOnly() && isSelected(), + this, &Edit::onEditCut + ); + updateAction( + pMainWindow->actEditCopy, + activated && isSelected(), + this, &Edit::onEditCopy + ); + updateAction( + pMainWindow->actEditPaste, + activated && sendEditor(SCI_CANPASTE), + this, &Edit::onEditPaste + ); + updateAction( + pMainWindow->actEditDel, + activated && !isReadOnly() && (getCurrentPos() != getLength() || isSelected()), + this, &Edit::onEditDel + ); + updateAction( + pMainWindow->actEditSelectAll, + activated && !isEmpty(), + this, &Edit::onEditSelectAll + ); + updateAction( + pMainWindow->actEditUpperCase, + activated && !isReadOnly() && isSelected(), + this, &Edit::onEditUpperCase + ); + updateAction( + pMainWindow->actEditLowerCase, + activated && !isReadOnly() && isSelected(), + this, &Edit::onEditLowerCase + ); + updateAction( + pMainWindow->actViewShowWhiteSpace, + activated, + this, &Edit::onViewShowWhiteSpace + ); + pMainWindow->actViewShowWhiteSpace->setChecked(isViewWhiteSpace()); + + updateAction( + pMainWindow->actViewShowEndOfLine, + activated, + this, &Edit::onViewShowEndOfLine + ); + pMainWindow->actViewShowEndOfLine->setChecked(isViewEndOfLine()); + + updateAction( + pMainWindow->actHelpContext, + activated, + this, &Edit::onHelpContext + ); + updateAction( + pMainWindow->actViewZoomInc, + activated && getZoom() < 20, + this, &Edit::onViewZoomInc + ); + updateAction( + pMainWindow->actViewZoomDec, + activated && getZoom() > -10, + this, &Edit::onViewZoomDec + ); + updateAction( + pMainWindow->actViewZoomReset, + activated && getZoom(), + this, &Edit::onViewZoomReset + ); + + bool hasBookmark = predicateOfGroup(boost::bind(&Edit::hasBookmarks, _1)); + + updateAction( + pMainWindow->actSearchBookmarkNext, + activated && hasBookmark, + this, &Edit::onSearchBookmarkNext + ); + updateAction( + pMainWindow->actSearchBookmarkPrev, + activated && hasBookmark, + this, &Edit::onSearchBookmarkPrev + ); + updateAction( + pMainWindow->actSearchBookmarksToggle, + activated, + this, &Edit::onSearchBookmarkToggle + ); + updateAction( + pMainWindow->actSearchBookmarksClearAll, + activated && hasBookmark, + this, &Edit::onSearchBookmarkClearAll + ); + updateAction( + pMainWindow->actSearchGotoLine, + activated, + this, &Edit::onSearchGotoLine + ); + updateAction( + pMainWindow->actSearchFind, + activated, + this, &Edit::onSearchFind + ); + + updateActionFind(activated); + + QString modify = activated + ? isReadOnly() + ? "Только чтение" + : isModify() + ? "Изменён" + : QString() + : QString(); + + pMainWindow->statusBar()->update(modify); + + QString coord = activated + ? QString("%1: %2").arg(getCurrentColumnNumber() + 1).arg(getCurrentLineNumber() + 1) + : QString(); + + pMainWindow->statusBar()->update(coord); + + QString overwrite = activated && sendEditor(SCI_GETOVERTYPE) + ? "Замена" + : QString(); + + pMainWindow->statusBar()->update(overwrite); } void Edit::updateActionFind(bool activated) { - Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); - - updateAction( - pMainWindow->actSearchFind, - activated && !isEmpty(), - this, &Edit::onSearchFind - ); - - updateAction( - pMainWindow->actSearchReplace, - activated && !isEmpty() && !isReadOnly(), - this, &Edit::onSearchReplace - ); - - bool findNextPrev = activated && (!m_findReplaceSettings.what.isEmpty() || !m_findSettings.what.isEmpty() || (m_pGroup && !m_pGroup->findStr.isEmpty())); - updateAction( - pMainWindow->actSearchFindNext, - findNextPrev, - this, &Edit::onSearchFindNext - ); - - updateAction( - pMainWindow->actSearchFindPrevious, - findNextPrev, - this, &Edit::onSearchFindPrevious - ); - - updateAction( - pMainWindow->actSearchFindNextCurrent, - activated, - this, &Edit::onSearchFindNextCurrent - ); - - updateAction( - pMainWindow->actSearchFindPreviousCurrent, - activated, - this, &Edit::onSearchFindPreviousCurrent - ); + Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); + + updateAction( + pMainWindow->actSearchFind, + activated && !isEmpty(), + this, &Edit::onSearchFind + ); + + updateAction( + pMainWindow->actSearchReplace, + activated && !isEmpty() && !isReadOnly(), + this, &Edit::onSearchReplace + ); + + bool findNextPrev = activated && (!m_findReplaceSettings.what.isEmpty() || !m_findSettings.what.isEmpty() || (m_pGroup && !m_pGroup->findStr.isEmpty())); + updateAction( + pMainWindow->actSearchFindNext, + findNextPrev, + this, &Edit::onSearchFindNext + ); + + updateAction( + pMainWindow->actSearchFindPrevious, + findNextPrev, + this, &Edit::onSearchFindPrevious + ); + + updateAction( + pMainWindow->actSearchFindNextCurrent, + activated, + this, &Edit::onSearchFindNextCurrent + ); + + updateAction( + pMainWindow->actSearchFindPreviousCurrent, + activated, + this, &Edit::onSearchFindPreviousCurrent + ); } void Edit::onUpdateModify() { - emit modifyChanged(isModify()); + emit modifyChanged(isModify()); } bool Edit::isViewWhiteSpace() const { - return sendEditor(SCI_GETVIEWWS) != SCWS_INVISIBLE; + return sendEditor(SCI_GETVIEWWS) != SCWS_INVISIBLE; } void Edit::setViewWhiteSpace(bool value) { - sendEditor(SCI_SETVIEWWS, value ? SCWS_VISIBLEALWAYS : SCWS_INVISIBLE); + sendEditor(SCI_SETVIEWWS, value ? SCWS_VISIBLEALWAYS : SCWS_INVISIBLE); } bool Edit::isViewEndOfLine() const { - return sendEditor(SCI_GETVIEWEOL) ? true : false; + return sendEditor(SCI_GETVIEWEOL) ? true : false; } void Edit::setViewEndOfLine(bool value) { - sendEditor(SCI_SETVIEWEOL, value); + sendEditor(SCI_SETVIEWEOL, value); } void Edit::methodOfGroup(const this_method& fun) { - m_pGroup - ? m_pGroup->for_each(fun) - : fun(this); + m_pGroup + ? m_pGroup->for_each(fun) + : fun(this); } bool Edit::predicateOfGroup(const this_predicate& fun) const { - return m_pGroup - ? m_pGroup->find_if(fun) != m_pGroup->end() - : fun(this); + return m_pGroup + ? m_pGroup->find_if(fun) != m_pGroup->end() + : fun(this); } std::size_t Edit::convertColor(const QColor& color) { - return color.red() | color.green() << 8 | color.blue() << 16; + return color.red() | color.green() << 8 | color.blue() << 16; } diff --git a/app/rdo_studio/src/editor/edit.h b/app/rdo_studio/src/editor/edit.h index b75a1f2ab..fc284a389 100644 --- a/app/rdo_studio/src/editor/edit.h +++ b/app/rdo_studio/src/editor/edit.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_EDIT_H_ -#define _RDO_STUDIO_EDITOR_EDIT_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM // ----------------------------------------------------------------------- INCLUDES @@ -19,224 +18,222 @@ namespace rdo { namespace gui { namespace editor { class Edit - : public ScintillaEditBase - , public ActionActivator + : public ScintillaEditBase + , public ActionActivator { Q_OBJECT private: - typedef boost::function this_method; - typedef boost::function this_predicate; + typedef boost::function this_method; + typedef boost::function this_predicate; public: - Edit(QWidget* pParent); - virtual ~Edit(); - - //! @todo Вынести класс в отдельный модуль - class Group - { - public: - typedef std::vector List; - - bool bMatchCase; - bool bMatchWholeWord; - bool bSearchDown; - QString findStr; - QString replaceStr; - - Group(); - - void insert(Edit* pEdit); - - List::const_iterator begin() const; - List::const_iterator end () const; - List::const_iterator next (const List::const_iterator& it) const; - List::const_iterator prev (const List::const_iterator& it) const; - - void for_each(const this_method& fun) const; - List::const_iterator find_if (const this_predicate& fun) const; - - private: - List m_list; - }; - - const EditStyle* getEditorStyle() const; - void setEditorStyle(EditStyle* pStyle); - - void setGroup(Group* pGroup); - - bool isEmpty() const { return getLength() == 0; } - bool isSelected() const { return sendEditor(SCI_GETSELECTIONSTART) != sendEditor(SCI_GETSELECTIONEND); } - - bool isModify() const { return sendEditor(SCI_GETMODIFY) ? true : false; } - void setModifyFalse() { sendEditor(SCI_SETSAVEPOINT); } - - virtual void clearAll(); - void clearUndoBuffer() const { sendEditor(SCI_EMPTYUNDOBUFFER); } - - bool isReadOnly() const { return sendEditor(SCI_GETREADONLY) ? true : false; } - void setReadOnly(const bool value) { sendEditor(SCI_SETREADONLY, value); } - - void appendText(const QString& str) const; - - int getZoom() const { return sendEditor(SCI_GETZOOM); } - void setZoom(const int value) const { sendEditor(SCI_SETZOOM, value); } - void zoomIn() const { sendEditor(SCI_ZOOMIN); } - void zoomOut() const { sendEditor(SCI_ZOOMOUT); } - void resetZoom() const { sendEditor(SCI_SETZOOM, 0); } - - bool bookmarkToggle (int line = -1) const; - bool bookmarkNext (bool canLoop = true, bool fromCurrentLine = true) const; - bool bookmarkPrev (bool canLoop = true, bool fromCurrentLine = true) const; - void bookmarkClearAll() const; - bool hasBookmarks () const; - - int getLength() const { return sendEditor(SCI_GETLENGTH); } - int getLineCount() const { return sendEditor(SCI_GETLINECOUNT); } - int getCurrentPos() const { return sendEditor(SCI_GETCURRENTPOS); } - int getPositionFromLine(const int line) const { return sendEditor(SCI_POSITIONFROMLINE, line); } - int getLineFromPosition(const int pos) const { return sendEditor(SCI_LINEFROMPOSITION, pos); } - int isEndOfWord(int pos) const { return sendEditor(SCI_WORDENDPOSITION, pos, true); } - void setCurrentPos (const int value) const; - void setCurrentPos (const int line, int pos_in_line, const bool convert_rdo_tab = false) const; - bool isLineVisible(const int line) const; - void scrollToLine (const int line) const; - void scrollToLine2 (const int line) const; - void scrollToCarret() const; - void horzScrollToCurrentPos() const; - - std::string getCurrentWord() const; - std::string getSelection () const; - std::string getCurrentOrSelectedWord() const; - QString getWordForFind() const; - - int findPos(const QString& findWhat, const int startFromLine = 0, const bool matchCase = false, const bool matchWholeWord = false) const; - std::string getLine(const int line) const; - - void load(const std::stringstream& stream); - void save(std::stringstream& stream) const; - std::string saveAsRTF(int start, int end) const; + Edit(QWidget* pParent); + virtual ~Edit(); + + // TODO Вынести класс в отдельный модуль + class Group + { + public: + typedef std::vector List; + + bool bMatchCase; + bool bMatchWholeWord; + bool bSearchDown; + QString findStr; + QString replaceStr; + + Group(); + + void insert(Edit* pEdit); + + List::const_iterator begin() const; + List::const_iterator end () const; + List::const_iterator next (const List::const_iterator& it) const; + List::const_iterator prev (const List::const_iterator& it) const; + + void for_each(const this_method& fun) const; + List::const_iterator find_if (const this_predicate& fun) const; + + private: + List m_list; + }; + + const EditStyle* getEditorStyle() const; + void setEditorStyle(EditStyle* pStyle); + + void setGroup(Group* pGroup); + + bool isEmpty() const { return getLength() == 0; } + bool isSelected() const { return sendEditor(SCI_GETSELECTIONSTART) != sendEditor(SCI_GETSELECTIONEND); } + + bool isModify() const { return sendEditor(SCI_GETMODIFY) ? true : false; } + void setModifyFalse() { sendEditor(SCI_SETSAVEPOINT); } + + virtual void clearAll(); + void clearUndoBuffer() const { sendEditor(SCI_EMPTYUNDOBUFFER); } + + bool isReadOnly() const { return sendEditor(SCI_GETREADONLY) ? true : false; } + void setReadOnly(const bool value) { sendEditor(SCI_SETREADONLY, value); } + + void appendText(const QString& str) const; + + int getZoom() const { return sendEditor(SCI_GETZOOM); } + void setZoom(const int value) const { sendEditor(SCI_SETZOOM, value); } + void zoomIn() const { sendEditor(SCI_ZOOMIN); } + void zoomOut() const { sendEditor(SCI_ZOOMOUT); } + void resetZoom() const { sendEditor(SCI_SETZOOM, 0); } + + bool bookmarkToggle (int line = -1) const; + bool bookmarkNext (bool canLoop = true, bool fromCurrentLine = true) const; + bool bookmarkPrev (bool canLoop = true, bool fromCurrentLine = true) const; + void bookmarkClearAll() const; + bool hasBookmarks () const; + + int getLength() const { return sendEditor(SCI_GETLENGTH); } + int getLineCount() const { return sendEditor(SCI_GETLINECOUNT); } + int getCurrentPos() const { return sendEditor(SCI_GETCURRENTPOS); } + int getPositionFromLine(const int line) const { return sendEditor(SCI_POSITIONFROMLINE, line); } + int getLineFromPosition(const int pos) const { return sendEditor(SCI_LINEFROMPOSITION, pos); } + int isEndOfWord(int pos) const { return sendEditor(SCI_WORDENDPOSITION, pos, true); } + void setCurrentPos (const int value) const; + void setCurrentPos (const int line, int pos_in_line, const bool convert_rdo_tab = false) const; + bool isLineVisible(const int line) const; + void scrollToLine (const int line) const; + void scrollToLine2 (const int line) const; + void scrollToCarret() const; + void horzScrollToCurrentPos() const; + + std::string getCurrentWord() const; + std::string getSelection () const; + std::string getCurrentOrSelectedWord() const; + QString getWordForFind() const; + + int findPos(const QString& findWhat, const int startFromLine = 0, const bool matchCase = false, const bool matchWholeWord = false) const; + std::string getLine(const int line) const; + + void load(const std::stringstream& stream); + void save(std::stringstream& stream) const; + std::string saveAsRTF(int start, int end) const; protected: - EditStyle* m_pStyle; + EditStyle* m_pStyle; - long sendEditor(std::size_t msg, unsigned long wParam = 0, long lParam = 0) const { return super::send (msg, wParam, lParam); } - long sendEditorString(std::size_t msg, unsigned long wParam, const char* str) const { return super::sends(msg, wParam, str); } - long sendEditorString(std::size_t msg, const std::string& str) const; + long sendEditor(std::size_t msg, unsigned long wParam = 0, long lParam = 0) const { return super::send (msg, wParam, lParam); } + long sendEditorString(std::size_t msg, unsigned long wParam, const char* str) const { return super::sends(msg, wParam, str); } + long sendEditorString(std::size_t msg, const std::string& str) const; - int getNewMarker(); - void defineMarker(int marker, int markerType, QColor fore, QColor back) const; + int getNewMarker(); + void defineMarker(int marker, int markerType, QColor fore, QColor back) const; - CharacterRange getSelectionRange() const; - void setSelection(int anchor, int currentPos) const { sendEditor(SCI_SETSEL, anchor, currentPos); } + CharacterRange getSelectionRange() const; + void setSelection(int anchor, int currentPos) const { sendEditor(SCI_SETSEL, anchor, currentPos); } - int getCurrentLineNumber () const { return getLineFromPosition(getCurrentPos()); } - int getCurrentColumnNumber() const { return sendEditor(SCI_GETCOLUMN, getCurrentPos()); } + int getCurrentLineNumber () const { return getLineFromPosition(getCurrentPos()); } + int getCurrentColumnNumber() const { return sendEditor(SCI_GETCOLUMN, getCurrentPos()); } - virtual void onUpdateActions(bool activated); + virtual void onUpdateActions(bool activated); - static std::size_t convertColor(const QColor& color); + static std::size_t convertColor(const QColor& color); protected slots: - void onUpdateEditGUI(); - virtual void onHelpContext () = 0; + void onUpdateEditGUI(); + virtual void onHelpContext () = 0; private: - typedef ScintillaEditBase super; + typedef ScintillaEditBase super; - Group* m_pGroup; - int m_sciMarkerBookmark; - int m_firstFoundPos; - bool m_haveFound; + Group* m_pGroup; + int m_sciMarkerBookmark; + int m_firstFoundPos; + bool m_haveFound; - void gotoLineEnsureVisible(int line) const; - void ensureRangeVisible(int posStart, int posEnd, bool enforcePolicy = true) const; + void gotoLineEnsureVisible(int line) const; + void ensureRangeVisible(int posStart, int posEnd, bool enforcePolicy = true) const; - void findNext (const QString& findWhat, bool searchDown, bool matchCase, bool matchWholeWord); - void replace (const QString& findWhat, const QString& replaceWhat, bool searchDown, bool matchCase, bool matchWholeWord); - void replaceAll(const QString& findWhat, const QString& replaceWhat, bool matchCase, bool matchWholeWord); + void findNext (const QString& findWhat, bool searchDown, bool matchCase, bool matchWholeWord); + void replace (const QString& findWhat, const QString& replaceWhat, bool searchDown, bool matchCase, bool matchWholeWord); + void replaceAll(const QString& findWhat, const QString& replaceWhat, bool matchCase, bool matchWholeWord); - int indentOfBlock (int line) const; - void setLineIndentation(int line, int indent) const; - void autoIndent () const; + int indentOfBlock (int line) const; + void setLineIndentation(int line, int indent) const; + void autoIndent () const; - bool isViewWhiteSpace () const; - void setViewWhiteSpace(bool value); + bool isViewWhiteSpace () const; + void setViewWhiteSpace(bool value); - bool isViewEndOfLine () const; - void setViewEndOfLine(bool value); + bool isViewEndOfLine () const; + void setViewEndOfLine(bool value); - void onSearchBookmarkNextPrev( - const boost::function& nextPrevFun, - const boost::function& nextPrevGroup - ) const; + void onSearchBookmarkNextPrev( + const boost::function& nextPrevFun, + const boost::function& nextPrevGroup + ) const; - int m_markerCount; + int m_markerCount; - FindDialog* m_pFindDialog; - FindDialog::Settings m_findSettings; + FindDialog* m_pFindDialog; + FindDialog::Settings m_findSettings; - FindReplaceDialog* m_pFindReplaceDialog; - FindReplaceDialog::Settings m_findReplaceSettings; + FindReplaceDialog* m_pFindReplaceDialog; + FindReplaceDialog::Settings m_findReplaceSettings; - void onFindDlgFind(const FindDialog::Settings& settings); - void onFindDlgClose(); + void onFindDlgFind(const FindDialog::Settings& settings); + void onFindDlgClose(); - void onFindReplaceDlgFind (const FindReplaceDialog::Settings& settings); - void onFindReplaceDlgReplace (const FindReplaceDialog::Settings& settings); - void onFindReplaceDlgReplaceAll(const FindReplaceDialog::Settings& settings); - void onFindReplaceDlgClose (); - void showFindWarning (const QString& findWhat); + void onFindReplaceDlgFind (const FindReplaceDialog::Settings& settings); + void onFindReplaceDlgReplace (const FindReplaceDialog::Settings& settings); + void onFindReplaceDlgReplaceAll(const FindReplaceDialog::Settings& settings); + void onFindReplaceDlgClose (); + void showFindWarning (const QString& findWhat); - void updateActionFind(bool activated); + void updateActionFind(bool activated); - void methodOfGroup (const this_method& fun); - bool predicateOfGroup(const this_predicate& fun) const; + void methodOfGroup (const this_method& fun); + bool predicateOfGroup(const this_predicate& fun) const; - virtual void focusInEvent (QFocusEvent* pEvent); - virtual void focusOutEvent(QFocusEvent* pEvent); + virtual void focusInEvent (QFocusEvent* pEvent); + virtual void focusOutEvent(QFocusEvent* pEvent); private slots: - void catchNeedShown(int position, int length); - void catchCharAdded(int ch); - - void onEditUndo (); - void onEditRedo (); - void onEditCut (); - void onEditCopy (); - void onEditPaste (); - void onEditDel (); - void onEditSelectAll(); - void onEditUpperCase(); - void onEditLowerCase(); - - void onSearchFind (); - void onSearchFindNext (); - void onSearchFindPrevious (); - void onSearchFindNextCurrent (); - void onSearchFindPreviousCurrent(); - void onSearchReplace (); - void onSearchBookmarkToggle (); - void onSearchBookmarkNext () const; - void onSearchBookmarkPrev () const; - void onSearchBookmarkClearAll (); - void onSearchGotoLine (); - - void onViewZoomChanged (int zoom); - void onViewZoomInc (); - void onViewZoomDec (); - void onViewZoomReset (); - void onViewShowWhiteSpace(); - void onViewShowEndOfLine (); - - void onCopyAsRTF(QMimeData* pMimeData); - - void onUpdateModify(); + void catchNeedShown(int position, int length); + void catchCharAdded(int ch); + + void onEditUndo (); + void onEditRedo (); + void onEditCut (); + void onEditCopy (); + void onEditPaste (); + void onEditDel (); + void onEditSelectAll(); + void onEditUpperCase(); + void onEditLowerCase(); + + void onSearchFind (); + void onSearchFindNext (); + void onSearchFindPrevious (); + void onSearchFindNextCurrent (); + void onSearchFindPreviousCurrent(); + void onSearchReplace (); + void onSearchBookmarkToggle (); + void onSearchBookmarkNext () const; + void onSearchBookmarkPrev () const; + void onSearchBookmarkClearAll (); + void onSearchGotoLine (); + + void onViewZoomChanged (int zoom); + void onViewZoomInc (); + void onViewZoomDec (); + void onViewZoomReset (); + void onViewShowWhiteSpace(); + void onViewShowEndOfLine (); + + void onCopyAsRTF(QMimeData* pMimeData); + + void onUpdateModify(); signals: - void modifyChanged(bool value); + void modifyChanged(bool value); }; }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_EDIT_H_ diff --git a/app/rdo_studio/src/editor/edit_popup_menu.cpp b/app/rdo_studio/src/editor/edit_popup_menu.cpp index f53b7c9c1..68de21317 100644 --- a/app/rdo_studio/src/editor/edit_popup_menu.cpp +++ b/app/rdo_studio/src/editor/edit_popup_menu.cpp @@ -10,23 +10,23 @@ using namespace rdo::gui::editor; PopupMenu::PopupMenu(QWidget* pParent) - : m_pPopupMenu(NULL) + : m_pPopupMenu(NULL) { - Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); + Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); - m_pPopupMenu = new QMenu(pParent); - m_pPopupMenu->addAction(pMainWindow->actEditCopy); - m_pPopupMenu->addAction(pMainWindow->actEditSelectAll); - m_pPopupMenu->addSeparator(); - m_pPopupMenu->addAction(pMainWindow->actSearchFind); - m_pPopupMenu->addAction(pMainWindow->actSearchFindNext); - m_pPopupMenu->addAction(pMainWindow->actSearchFindPrevious); - m_pPopupMenu->addSeparator(); - m_pPopupMenu->addAction(pMainWindow->actSearchBookmarksToggle); - m_pPopupMenu->addAction(pMainWindow->actSearchBookmarkNext); - m_pPopupMenu->addAction(pMainWindow->actSearchBookmarkPrev); - m_pPopupMenu->addAction(pMainWindow->actSearchBookmarksClearAll); + m_pPopupMenu = new QMenu(pParent); + m_pPopupMenu->addAction(pMainWindow->actEditCopy); + m_pPopupMenu->addAction(pMainWindow->actEditSelectAll); + m_pPopupMenu->addSeparator(); + m_pPopupMenu->addAction(pMainWindow->actSearchFind); + m_pPopupMenu->addAction(pMainWindow->actSearchFindNext); + m_pPopupMenu->addAction(pMainWindow->actSearchFindPrevious); + m_pPopupMenu->addSeparator(); + m_pPopupMenu->addAction(pMainWindow->actSearchBookmarksToggle); + m_pPopupMenu->addAction(pMainWindow->actSearchBookmarkNext); + m_pPopupMenu->addAction(pMainWindow->actSearchBookmarkPrev); + m_pPopupMenu->addAction(pMainWindow->actSearchBookmarksClearAll); } PopupMenu::~PopupMenu() diff --git a/app/rdo_studio/src/editor/edit_popup_menu.h b/app/rdo_studio/src/editor/edit_popup_menu.h index 978a4371d..5505af95a 100644 --- a/app/rdo_studio/src/editor/edit_popup_menu.h +++ b/app/rdo_studio/src/editor/edit_popup_menu.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_EDIT_POPUP_MENU_H_ -#define _RDO_STUDIO_EDITOR_EDIT_POPUP_MENU_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM // ----------------------------------------------------------------------- INCLUDES @@ -15,12 +14,10 @@ namespace rdo { namespace gui { namespace editor { class PopupMenu { protected: - PopupMenu(QWidget* pParent); - virtual ~PopupMenu(); + PopupMenu(QWidget* pParent); + virtual ~PopupMenu(); - QMenu* m_pPopupMenu; + QMenu* m_pPopupMenu; }; }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_EDIT_POPUP_MENU_H_ diff --git a/app/rdo_studio/src/editor/edit_style.cpp b/app/rdo_studio/src/editor/edit_style.cpp index c8701fb6b..9a70ddacf 100644 --- a/app/rdo_studio/src/editor/edit_style.cpp +++ b/app/rdo_studio/src/editor/edit_style.cpp @@ -13,78 +13,78 @@ using namespace rdo::gui::editor; // -------------------------------------------------------------------------------- EditTab::EditTab() { - tabSize = 4; - indentSize = 4; - useTabs = true; - tabIndents = true; - backspaceUntabs = false; - autoIndent = true; + tabSize = 4; + indentSize = 4; + useTabs = false; + tabIndents = false; + backspaceUntabs = false; + autoIndent = true; } EditTab::~EditTab() {} -EditTab& EditTab::operator =( const EditTab& tab ) +EditTab& EditTab::operator =(const EditTab& tab) { - tabSize = tab.tabSize; - indentSize = tab.indentSize; - useTabs = tab.useTabs; - tabIndents = tab.tabIndents; - backspaceUntabs = tab.backspaceUntabs; - autoIndent = tab.autoIndent; + tabSize = tab.tabSize; + indentSize = tab.indentSize; + useTabs = tab.useTabs; + tabIndents = tab.tabIndents; + backspaceUntabs = tab.backspaceUntabs; + autoIndent = tab.autoIndent; - return *this; + return *this; } -bool EditTab::operator ==( const EditTab& tab ) const +bool EditTab::operator ==(const EditTab& tab) const { - return tabSize == tab.tabSize && - indentSize == tab.indentSize && - useTabs == tab.useTabs && - tabIndents == tab.tabIndents && - backspaceUntabs == tab.backspaceUntabs && - autoIndent == tab.autoIndent; + return tabSize == tab.tabSize && + indentSize == tab.indentSize && + useTabs == tab.useTabs && + tabIndents == tab.tabIndents && + backspaceUntabs == tab.backspaceUntabs && + autoIndent == tab.autoIndent; } -bool EditTab::operator !=( const EditTab& tab ) const +bool EditTab::operator !=(const EditTab& tab) const { - return !(*this == tab); + return !(*this == tab); } void EditTab::load(QSettings& settings) { - settings >> *this; + settings >> *this; } void EditTab::save(QSettings& settings) const { - settings << *this; + settings << *this; } namespace rdo { namespace gui { namespace editor { QSettings& operator<< (QSettings& settings, const EditTab& tab) { - settings.setValue("tab_size", tab.tabSize); - settings.setValue("indent_size", tab.indentSize); - settings.setValue("use_tabs", tab.useTabs); - settings.setValue("tab_indents", tab.tabIndents); - settings.setValue("backspace_untabs", tab.backspaceUntabs); - settings.setValue("auto_indent", tab.autoIndent); + settings.setValue("tab_size", tab.tabSize); + settings.setValue("indent_size", tab.indentSize); + settings.setValue("use_tabs", tab.useTabs); + settings.setValue("tab_indents", tab.tabIndents); + settings.setValue("backspace_untabs", tab.backspaceUntabs); + settings.setValue("auto_indent", tab.autoIndent); - return settings; + return settings; } QSettings& operator>> (QSettings& settings, EditTab& tab) { - tab.tabSize = settings.value("tab_size", tab.tabSize).toInt(); - tab.indentSize = settings.value("indent_size", tab.indentSize).toInt(); - tab.useTabs = settings.value("use_tabs", tab.useTabs).toBool() ? true : false; - tab.tabIndents = settings.value("tab_indents", tab.tabIndents).toBool() ? true : false; - tab.backspaceUntabs = settings.value("backspace_untabs", tab.backspaceUntabs).toBool() ? true : false; - tab.autoIndent = settings.value("auto_indent", tab.autoIndent).toBool() ? true : false; + tab.tabSize = settings.value("tab_size", tab.tabSize).toInt(); + tab.indentSize = settings.value("indent_size", tab.indentSize).toInt(); + tab.useTabs = settings.value("use_tabs", tab.useTabs).toBool() ? true : false; + tab.tabIndents = settings.value("tab_indents", tab.tabIndents).toBool() ? true : false; + tab.backspaceUntabs = settings.value("backspace_untabs", tab.backspaceUntabs).toBool() ? true : false; + tab.autoIndent = settings.value("auto_indent", tab.autoIndent).toBool() ? true : false; - return settings; + return settings; } }}} // namespace rdo::gui::editor @@ -94,58 +94,58 @@ QSettings& operator>> (QSettings& settings, EditTab& tab) // -------------------------------------------------------------------------------- EditWindow::EditWindow() { - wordWrap = false; - showHorzScrollBar = true; + wordWrap = false; + showHorzScrollBar = true; } EditWindow::~EditWindow() {} -EditWindow& EditWindow::operator =( const EditWindow& window ) +EditWindow& EditWindow::operator =(const EditWindow& window) { - wordWrap = window.wordWrap; - showHorzScrollBar = window.showHorzScrollBar; + wordWrap = window.wordWrap; + showHorzScrollBar = window.showHorzScrollBar; - return *this; + return *this; } -bool EditWindow::operator ==( const EditWindow& window ) const +bool EditWindow::operator ==(const EditWindow& window) const { - return wordWrap == window.wordWrap && - showHorzScrollBar == window.showHorzScrollBar; + return wordWrap == window.wordWrap && + showHorzScrollBar == window.showHorzScrollBar; } -bool EditWindow::operator !=( const EditWindow& window ) const +bool EditWindow::operator !=(const EditWindow& window) const { - return !(*this == window); + return !(*this == window); } void EditWindow::load(QSettings& settings) { - settings >> *this; + settings >> *this; } void EditWindow::save(QSettings& settings) const { - settings << *this; + settings << *this; } namespace rdo { namespace gui { namespace editor { QSettings& operator<< (QSettings& settings, const EditWindow& window) { - settings.setValue("word_wrap", window.wordWrap); - settings.setValue("show_horz_scroll_bar", window.showHorzScrollBar); + settings.setValue("word_wrap", window.wordWrap); + settings.setValue("show_horz_scroll_bar", window.showHorzScrollBar); - return settings; + return settings; } QSettings& operator>> (QSettings& settings, EditWindow& window) { - window.wordWrap = settings.value("word_wrap", window.wordWrap).toBool() ? true : false; - window.showHorzScrollBar = settings.value("show_horz_scroll_bar", window.showHorzScrollBar).toBool() ? true : false; + window.wordWrap = settings.value("word_wrap", window.wordWrap).toBool() ? true : false; + window.showHorzScrollBar = settings.value("show_horz_scroll_bar", window.showHorzScrollBar).toBool() ? true : false; - return settings; + return settings; } }}} // namespace rdo::gui::editor @@ -154,213 +154,213 @@ QSettings& operator>> (QSettings& settings, EditWindow& window) // -------------------- EditStyle // -------------------------------------------------------------------------------- EditStyle::EditStyle() - : StyleBase() - , tab () - , window() + : StyleBase() + , tab () + , window() { - defaultColor = QColor( 0x00, 0x00, 0x00 ); - backgroundColor = QColor( 0xFF, 0xFF, 0xFF ); + defaultColor = QColor(0x00, 0x00, 0x00); + backgroundColor = QColor(0xFF, 0xFF, 0xFF); - caretColor = QColor( 0x00, 0x00, 0x00 ); - selectionBgColor = QColor( 0xC0, 0xC0, 0xC0 ); - bookmarkFgColor = QColor( 0x00, 0x00, 0x00 ); - bookmarkBgColor = QColor( 0x00, 0xFF, 0xFF ); + caretColor = QColor(0x00, 0x00, 0x00); + selectionBgColor = QColor(0xC0, 0xC0, 0xC0); + bookmarkFgColor = QColor(0x00, 0x00, 0x00); + bookmarkBgColor = QColor(0x00, 0xFF, 0xFF); - defaultStyle = StyleFont::NONE; - bookmarkStyle = EditStyle::B_CIRCLE; + defaultStyle = StyleFont::Style::NONE; + bookmarkStyle = EditStyle::Bookmark::CIRCLE; } EditStyle::~EditStyle() {} -EditStyle& EditStyle::operator =( const EditStyle& style ) +EditStyle& EditStyle::operator =(const EditStyle& style) { - StyleBase::operator=( style ); - - defaultColor = style.defaultColor; - backgroundColor = style.backgroundColor; + StyleBase::operator=(style); - caretColor = style.caretColor; - selectionBgColor = style.selectionBgColor; - bookmarkFgColor = style.bookmarkFgColor; - bookmarkBgColor = style.bookmarkBgColor; + defaultColor = style.defaultColor; + backgroundColor = style.backgroundColor; - defaultStyle = style.defaultStyle; + caretColor = style.caretColor; + selectionBgColor = style.selectionBgColor; + bookmarkFgColor = style.bookmarkFgColor; + bookmarkBgColor = style.bookmarkBgColor; - bookmarkStyle = style.bookmarkStyle; - - tab = style.tab; - window = style.window; + defaultStyle = style.defaultStyle; - return *this; + bookmarkStyle = style.bookmarkStyle; + + tab = style.tab; + window = style.window; + + return *this; } -bool EditStyle::operator ==( const EditStyle& style ) const +bool EditStyle::operator ==(const EditStyle& style) const { - return - StyleBase::operator==(style) && - tab == style.tab && - window == style.window && - defaultColor == style.defaultColor && - backgroundColor == style.backgroundColor && - caretColor == style.caretColor && - selectionBgColor == style.selectionBgColor && - bookmarkFgColor == style.bookmarkFgColor && - bookmarkBgColor == style.bookmarkBgColor && - defaultStyle == style.defaultStyle && - bookmarkStyle == style.bookmarkStyle; + return + StyleBase::operator==(style) && + tab == style.tab && + window == style.window && + defaultColor == style.defaultColor && + backgroundColor == style.backgroundColor && + caretColor == style.caretColor && + selectionBgColor == style.selectionBgColor && + bookmarkFgColor == style.bookmarkFgColor && + bookmarkBgColor == style.bookmarkBgColor && + defaultStyle == style.defaultStyle && + bookmarkStyle == style.bookmarkStyle; } -bool EditStyle::operator !=( const EditStyle& style ) const +bool EditStyle::operator !=(const EditStyle& style) const { - return !(*this == style); + return !(*this == style); } -bool EditStyle::styleDefault( const int styleType ) const +bool EditStyle::styleDefault(const int styleType) const { - return styleType == STYLE_DEFAULT; + return styleType == STYLE_DEFAULT; } -bool EditStyle::styleUsing( const int styleType ) const +bool EditStyle::styleUsing(const int styleType) const { - return styleType == STYLE_DEFAULT; + return styleType == STYLE_DEFAULT; } -bool EditStyle::styleBold( const int /*styleType*/ ) const +bool EditStyle::styleBold(const int /*styleType*/) const { - return defaultStyle & StyleFont::BOLD ? true : false; + return static_cast(defaultStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; } -bool EditStyle::styleItalic( const int /*styleType*/ ) const +bool EditStyle::styleItalic(const int /*styleType*/) const { - return defaultStyle & StyleFont::ITALIC ? true : false; + return static_cast(defaultStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; } -std::string EditStyle::styleFGColorToHEX( const int /*styleType*/ ) const +std::string EditStyle::styleFGColorToHEX(const int /*styleType*/) const { - return colorToHEX( defaultColor ); + return colorToHEX(defaultColor); } -std::string EditStyle::styleBGColorToHEX( const int /*styleType*/ ) const +std::string EditStyle::styleBGColorToHEX(const int /*styleType*/) const { - return colorToHEX( backgroundColor ); + return colorToHEX(backgroundColor); } EditStyle EditStyle::getDefaultStyle() { - EditStyle style; - return style; + EditStyle style; + return style; } EditStyle EditStyle::getClassicStyle() { - EditStyle style; + EditStyle style; - style.defaultColor = QColor( 0xFF, 0xFF, 0x00 ); - style.backgroundColor = QColor( 0x00, 0x00, 0x80 ); + style.defaultColor = QColor(0xFF, 0xFF, 0x00); + style.backgroundColor = QColor(0x00, 0x00, 0x80); - style.caretColor = QColor( 0xFF, 0xFF, 0x00 ); - style.selectionBgColor = QColor( 0x00, 0x00, 0x40 ); - style.bookmarkFgColor = QColor( 0x00, 0x00, 0x00 ); - style.bookmarkBgColor = QColor( 0x80, 0x80, 0x00 ); + style.caretColor = QColor(0xFF, 0xFF, 0x00); + style.selectionBgColor = QColor(0x00, 0x00, 0x40); + style.bookmarkFgColor = QColor(0x00, 0x00, 0x00); + style.bookmarkBgColor = QColor(0x80, 0x80, 0x00); - style.defaultStyle = StyleFont::NONE; - style.bookmarkStyle = EditStyle::B_CIRCLE; + style.defaultStyle = StyleFont::Style::NONE; + style.bookmarkStyle = EditStyle::Bookmark::CIRCLE; - return style; + return style; } EditStyle EditStyle::getTwilightStyle() { - EditStyle style; + EditStyle style; - style.defaultColor = QColor( 0xFF, 0xFF, 0xFF ); - style.backgroundColor = QColor( 0x00, 0x00, 0x00 ); + style.defaultColor = QColor(0xFF, 0xFF, 0xFF); + style.backgroundColor = QColor(0x00, 0x00, 0x00); - style.caretColor = QColor( 0xFF, 0xFF, 0xFF ); - style.selectionBgColor = QColor( 0x70, 0x70, 0x70 ); - style.bookmarkFgColor = QColor( 0x00, 0x00, 0x00 ); - style.bookmarkBgColor = QColor( 0x00, 0x00, 0xFF ); + style.caretColor = QColor(0xFF, 0xFF, 0xFF); + style.selectionBgColor = QColor(0x70, 0x70, 0x70); + style.bookmarkFgColor = QColor(0x00, 0x00, 0x00); + style.bookmarkBgColor = QColor(0x00, 0x00, 0xFF); - style.defaultStyle = StyleFont::NONE; - style.bookmarkStyle = EditStyle::B_CIRCLE; + style.defaultStyle = StyleFont::Style::NONE; + style.bookmarkStyle = EditStyle::Bookmark::CIRCLE; - return style; + return style; } EditStyle EditStyle::getOceanStyle() { - EditStyle style; + EditStyle style; - style.defaultColor = QColor( 0x00, 0x00, 0xFF ); - style.backgroundColor = QColor( 0x00, 0xFF, 0xFF ); + style.defaultColor = QColor(0x00, 0x00, 0xFF); + style.backgroundColor = QColor(0x00, 0xFF, 0xFF); - style.caretColor = QColor( 0x00, 0x00, 0x00 ); - style.selectionBgColor = QColor( 0xC0, 0xC0, 0xD0 ); - style.bookmarkFgColor = QColor( 0x00, 0x00, 0x00 ); - style.bookmarkBgColor = QColor( 0xBA, 0xCC, 0xFC ); + style.caretColor = QColor(0x00, 0x00, 0x00); + style.selectionBgColor = QColor(0xC0, 0xC0, 0xD0); + style.bookmarkFgColor = QColor(0x00, 0x00, 0x00); + style.bookmarkBgColor = QColor(0xBA, 0xCC, 0xFC); - style.defaultStyle = StyleFont::NONE; - style.bookmarkStyle = EditStyle::B_CIRCLE; + style.defaultStyle = StyleFont::Style::NONE; + style.bookmarkStyle = EditStyle::Bookmark::CIRCLE; - return style; + return style; } -std::string EditStyle::colorToHEX( const QColor color ) +std::string EditStyle::colorToHEX(const QColor color) { - return rdo::format( "#%02X%02X%02X", color.red(), color.green(), color.blue() ); + return rdo::format("#%02X%02X%02X", color.red(), color.green(), color.blue()); } namespace rdo { namespace gui { namespace editor { QSettings& operator<< (QSettings& settings, const EditStyle& style) { - settings << static_cast(style); + settings << static_cast(style); - settings.beginGroup("tab"); - settings << style.tab; - settings.endGroup(); - settings.beginGroup("window"); - settings << style.window; - settings.endGroup(); + settings.beginGroup("tab"); + settings << style.tab; + settings.endGroup(); + settings.beginGroup("window"); + settings << style.window; + settings.endGroup(); - settings.beginGroup("theme"); - settings.setValue("default_color", style.defaultColor.name()); - settings.setValue("background_color", style.backgroundColor.name()); - settings.setValue("caret_color", style.caretColor.name()); - settings.setValue("selection_bg_color", style.selectionBgColor.name()); - settings.setValue("bookmark_fg_color", style.bookmarkFgColor.name()); - settings.setValue("bookmark_bg_color", style.bookmarkBgColor.name()); - settings.setValue("default_style", style.defaultStyle); - settings.setValue("bookmark_style", style.bookmarkStyle); - settings.endGroup(); + settings.beginGroup("theme"); + settings.setValue("default_color", style.defaultColor.name()); + settings.setValue("background_color", style.backgroundColor.name()); + settings.setValue("caret_color", style.caretColor.name()); + settings.setValue("selection_bg_color", style.selectionBgColor.name()); + settings.setValue("bookmark_fg_color", style.bookmarkFgColor.name()); + settings.setValue("bookmark_bg_color", style.bookmarkBgColor.name()); + settings.setValue("default_style", static_cast(style.defaultStyle)); + settings.setValue("bookmark_style", static_cast(style.bookmarkStyle)); + settings.endGroup(); - return settings; + return settings; } QSettings& operator>> (QSettings& settings, EditStyle& style) { - settings >> static_cast(style); - - settings.beginGroup("tab"); - settings >> style.tab; - settings.endGroup(); - settings.beginGroup("window"); - settings >> style.window; - settings.endGroup(); - - settings.beginGroup("theme"); - style.defaultColor = QColor(settings.value("default_color", style.defaultColor.name()).toString()); - style.backgroundColor = QColor(settings.value("background_color", style.backgroundColor.name()).toString()); - style.caretColor = QColor(settings.value("caret_color", style.caretColor.name()).toString()); - style.selectionBgColor = QColor(settings.value("selection_bg_color", style.selectionBgColor.name()).toString()); - style.bookmarkFgColor = QColor(settings.value("bookmark_fg_color", style.bookmarkFgColor.name()).toString()); - style.bookmarkBgColor = QColor(settings.value("bookmark_bg_color", style.bookmarkBgColor.name()).toString()); - style.defaultStyle = static_cast(settings.value("default_style", style.defaultStyle).toInt()); - style.bookmarkStyle = static_cast(settings.value("bookmark_style", style.bookmarkStyle).toInt()); - settings.endGroup(); - - return settings; + settings >> static_cast(style); + + settings.beginGroup("tab"); + settings >> style.tab; + settings.endGroup(); + settings.beginGroup("window"); + settings >> style.window; + settings.endGroup(); + + settings.beginGroup("theme"); + style.defaultColor = QColor(settings.value("default_color", style.defaultColor.name()).toString()); + style.backgroundColor = QColor(settings.value("background_color", style.backgroundColor.name()).toString()); + style.caretColor = QColor(settings.value("caret_color", style.caretColor.name()).toString()); + style.selectionBgColor = QColor(settings.value("selection_bg_color", style.selectionBgColor.name()).toString()); + style.bookmarkFgColor = QColor(settings.value("bookmark_fg_color", style.bookmarkFgColor.name()).toString()); + style.bookmarkBgColor = QColor(settings.value("bookmark_bg_color", style.bookmarkBgColor.name()).toString()); + style.defaultStyle = static_cast(settings.value("default_style", static_cast(style.defaultStyle)).toInt()); + style.bookmarkStyle = static_cast(settings.value("bookmark_style", static_cast(style.bookmarkStyle)).toInt()); + settings.endGroup(); + + return settings; } }}} // namespace rdo::gui::editor diff --git a/app/rdo_studio/src/editor/edit_style.h b/app/rdo_studio/src/editor/edit_style.h index 79d73c1be..43aaac4b9 100644 --- a/app/rdo_studio/src/editor/edit_style.h +++ b/app/rdo_studio/src/editor/edit_style.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_EDIT_STYLE_H_ -#define _RDO_STUDIO_EDITOR_EDIT_STYLE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -15,22 +14,22 @@ namespace rdo { namespace gui { namespace editor { class EditTab { public: - EditTab(); - virtual ~EditTab(); - - EditTab& operator =( const EditTab& tab ); - bool operator ==( const EditTab& tab ) const; - bool operator !=( const EditTab& tab ) const; - - void load(QSettings& settings); - void save(QSettings& settings) const; - - int tabSize; - int indentSize; - bool useTabs; - bool tabIndents; - bool backspaceUntabs; - bool autoIndent; + EditTab(); + virtual ~EditTab(); + + EditTab& operator =(const EditTab& tab); + bool operator ==(const EditTab& tab) const; + bool operator !=(const EditTab& tab) const; + + void load(QSettings& settings); + void save(QSettings& settings) const; + + int tabSize; + int indentSize; + bool useTabs; + bool tabIndents; + bool backspaceUntabs; + bool autoIndent; }; QSettings& operator<< (QSettings& settings, const EditTab& tab); @@ -42,18 +41,18 @@ QSettings& operator>> (QSettings& settings, EditTab& tab); class EditWindow { public: - EditWindow(); - virtual ~EditWindow(); + EditWindow(); + virtual ~EditWindow(); - EditWindow& operator =( const EditWindow& window ); - bool operator ==( const EditWindow& window ) const; - bool operator !=( const EditWindow& window ) const; + EditWindow& operator =(const EditWindow& window); + bool operator ==(const EditWindow& window) const; + bool operator !=(const EditWindow& window) const; - void load(QSettings& settings); - void save(QSettings& settings) const; + void load(QSettings& settings); + void save(QSettings& settings) const; - bool wordWrap; - bool showHorzScrollBar; + bool wordWrap; + bool showHorzScrollBar; }; QSettings& operator<< (QSettings& settings, const EditWindow& window); @@ -65,51 +64,48 @@ QSettings& operator>> (QSettings& settings, EditWindow& window); class EditStyle: public style::StyleBase { public: - - enum Bookmark - { - B_NONE = 0, - B_CIRCLE, - B_RECT, - B_ROUNDRECT, - B_ARROW - }; - - EditStyle(); - ~EditStyle(); - - EditStyle& operator =( const EditStyle& style ); - bool operator ==( const EditStyle& style ) const; - bool operator !=( const EditStyle& style ) const; - - virtual bool styleDefault( const int styleType ) const; - virtual bool styleUsing( const int styleType ) const; - virtual bool styleBold( const int styleType = STYLE_DEFAULT ) const; - virtual bool styleItalic( const int styleType = STYLE_DEFAULT ) const; - virtual std::string styleFGColorToHEX( const int styleType = STYLE_DEFAULT ) const; - virtual std::string styleBGColorToHEX( const int styleType = STYLE_DEFAULT ) const; - - static EditStyle getDefaultStyle(); - static EditStyle getClassicStyle(); - static EditStyle getTwilightStyle(); - static EditStyle getOceanStyle(); - - static std::string colorToHEX( const QColor color ); - - QColor caretColor; - QColor selectionBgColor; - QColor bookmarkFgColor; - QColor bookmarkBgColor; - - Bookmark bookmarkStyle; - - EditTab tab; - EditWindow window; + enum class Bookmark + { + NONE = 0, + CIRCLE, + RECT, + ROUNDRECT, + ARROW + }; + + EditStyle(); + ~EditStyle(); + + EditStyle& operator= (const EditStyle& style); + bool operator== (const EditStyle& style) const; + bool operator!= (const EditStyle& style) const; + + virtual bool styleDefault(const int styleType) const; + virtual bool styleUsing(const int styleType) const; + virtual bool styleBold(const int styleType = STYLE_DEFAULT) const; + virtual bool styleItalic(const int styleType = STYLE_DEFAULT) const; + virtual std::string styleFGColorToHEX(const int styleType = STYLE_DEFAULT) const; + virtual std::string styleBGColorToHEX(const int styleType = STYLE_DEFAULT) const; + + static EditStyle getDefaultStyle(); + static EditStyle getClassicStyle(); + static EditStyle getTwilightStyle(); + static EditStyle getOceanStyle(); + + static std::string colorToHEX(const QColor color); + + QColor caretColor; + QColor selectionBgColor; + QColor bookmarkFgColor; + QColor bookmarkBgColor; + + Bookmark bookmarkStyle; + + EditTab tab; + EditWindow window; }; QSettings& operator<< (QSettings& settings, const EditStyle& style); QSettings& operator>> (QSettings& settings, EditStyle& style); }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_EDIT_STYLE_H_ diff --git a/app/rdo_studio/src/editor/find_edit.cpp b/app/rdo_studio/src/editor/find_edit.cpp index f6c55713f..70c6e36fc 100644 --- a/app/rdo_studio/src/editor/find_edit.cpp +++ b/app/rdo_studio/src/editor/find_edit.cpp @@ -18,13 +18,13 @@ using namespace rdo::gui::style; static std::string wordCharacters("0123456789_$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZАаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя"); Find::Find(QWidget* pParent) - : super(pParent) - , PopupMenu(pParent) + : super(pParent) + , PopupMenu(pParent) { - sendEditor(SCI_SETLEXER, SCLEX_FIND); - // int lexLanguage = sendEditor(SCI_GETLEXER); - sendEditor(SCI_SETSTYLEBITS, 5); - sendEditorString(SCI_SETWORDCHARS, 0, wordCharacters.c_str()); + sendEditor(SCI_SETLEXER, SCLEX_FIND); + // int lexLanguage = sendEditor(SCI_GETLEXER); + sendEditor(SCI_SETSTYLEBITS, 5); + sendEditorString(SCI_SETWORDCHARS, 0, wordCharacters.c_str()); } Find::~Find() @@ -32,54 +32,54 @@ Find::~Find() void Find::setEditorStyle(FindStyle* pStyle) { - super::setEditorStyle(pStyle); - if (!m_pStyle) - { - return; - } + super::setEditorStyle(pStyle); + if (!m_pStyle) + { + return; + } - // ---------- - // Colors - FindStyle* style = static_cast(m_pStyle); - sendEditor(SCI_STYLESETFORE, SCE_FIND_DEFAULT, convertColor(style->defaultColor)); - sendEditor(SCI_STYLESETBACK, SCE_FIND_DEFAULT, convertColor(style->backgroundColor)); - sendEditor(SCI_STYLESETFORE, SCE_FIND_KEYWORD, convertColor(style->keywordColor)); - sendEditor(SCI_STYLESETBACK, SCE_FIND_KEYWORD, convertColor(style->backgroundColor)); + // ---------- + // Colors + FindStyle* style = static_cast(m_pStyle); + sendEditor(SCI_STYLESETFORE, SCE_FIND_DEFAULT, convertColor(style->defaultColor)); + sendEditor(SCI_STYLESETBACK, SCE_FIND_DEFAULT, convertColor(style->backgroundColor)); + sendEditor(SCI_STYLESETFORE, SCE_FIND_KEYWORD, convertColor(style->keywordColor)); + sendEditor(SCI_STYLESETBACK, SCE_FIND_KEYWORD, convertColor(style->backgroundColor)); - // ---------- - // Styles - sendEditor(SCI_STYLESETBOLD , SCE_FIND_DEFAULT, style->defaultStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_FIND_DEFAULT, style->defaultStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_FIND_DEFAULT, style->defaultStyle & StyleFont::UNDERLINE); - sendEditor(SCI_STYLESETBOLD , SCE_FIND_KEYWORD, style->keywordStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_FIND_KEYWORD, style->keywordStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_FIND_KEYWORD, style->keywordStyle & StyleFont::UNDERLINE); + // ---------- + // Styles + sendEditor(SCI_STYLESETBOLD , SCE_FIND_DEFAULT, static_cast(style->defaultStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_FIND_DEFAULT, static_cast(style->defaultStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_FIND_DEFAULT, static_cast(style->defaultStyle) & static_cast(StyleFont::Style::UNDERLINE)); + sendEditor(SCI_STYLESETBOLD , SCE_FIND_KEYWORD, static_cast(style->keywordStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_FIND_KEYWORD, static_cast(style->keywordStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_FIND_KEYWORD, static_cast(style->keywordStyle) & static_cast(StyleFont::Style::UNDERLINE)); - // ---------- - // Font Name - sendEditorString(SCI_STYLESETFONT, SCE_FIND_DEFAULT, m_pStyle->font.name.c_str()); - sendEditorString(SCI_STYLESETFONT, SCE_FIND_KEYWORD, m_pStyle->font.name.c_str()); + // ---------- + // Font Name + sendEditorString(SCI_STYLESETFONT, SCE_FIND_DEFAULT, m_pStyle->font.name.c_str()); + sendEditorString(SCI_STYLESETFONT, SCE_FIND_KEYWORD, m_pStyle->font.name.c_str()); - // ---------- - // Font Size - sendEditor(SCI_STYLESETSIZE, SCE_FIND_DEFAULT, m_pStyle->font.size); - sendEditor(SCI_STYLESETSIZE, SCE_FIND_KEYWORD, m_pStyle->font.size); + // ---------- + // Font Size + sendEditor(SCI_STYLESETSIZE, SCE_FIND_DEFAULT, m_pStyle->font.size); + sendEditor(SCI_STYLESETSIZE, SCE_FIND_KEYWORD, m_pStyle->font.size); } void Find::setKeyword(const QString& keyword, const bool matchCase) const { - sendEditorString(SCI_SETPROPERTY, reinterpret_cast("find_matchcase"), matchCase ? "1" : "0"); - sendEditorString(SCI_SETKEYWORDS, SCI_RDO_ENDOFLINEONLY_KEYWORDSINDEX, keyword.toStdString().c_str()); + sendEditorString(SCI_SETPROPERTY, reinterpret_cast("find_matchcase"), matchCase ? "1" : "0"); + sendEditorString(SCI_SETKEYWORDS, SCI_RDO_ENDOFLINEONLY_KEYWORDSINDEX, keyword.toStdString().c_str()); } void Find::onHelpContext() { - QByteArray ba; - ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_run.htm#output_find\n"); - g_pApp->callQtAssistant(ba); + QByteArray ba; + ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_run.htm#output_find\n"); + g_pApp->callQtAssistant(ba); } void Find::contextMenuEvent(QContextMenuEvent* pEvent) { - m_pPopupMenu->exec(pEvent->globalPos()); + m_pPopupMenu->exec(pEvent->globalPos()); } diff --git a/app/rdo_studio/src/editor/find_edit.h b/app/rdo_studio/src/editor/find_edit.h index d2a58829c..fefd85c77 100644 --- a/app/rdo_studio/src/editor/find_edit.h +++ b/app/rdo_studio/src/editor/find_edit.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_FIND_EDIT_H_ -#define _RDO_STUDIO_EDITOR_FIND_EDIT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -11,24 +10,22 @@ namespace rdo { namespace gui { namespace editor { class Find - : public Log - , public PopupMenu + : public Log + , public PopupMenu { public: - Find(QWidget* pParent); - virtual ~Find(); + Find(QWidget* pParent); + virtual ~Find(); - void setEditorStyle(FindStyle* pStyle); + void setEditorStyle(FindStyle* pStyle); - void setKeyword(const QString& keyword, const bool matchCase = false) const; + void setKeyword(const QString& keyword, const bool matchCase = false) const; private: - typedef Log super; + typedef Log super; - virtual void contextMenuEvent(QContextMenuEvent* pEvent); - virtual void onHelpContext(); + virtual void contextMenuEvent(QContextMenuEvent* pEvent); + virtual void onHelpContext(); }; }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_FIND_EDIT_H_ diff --git a/app/rdo_studio/src/editor/find_edit_style.cpp b/app/rdo_studio/src/editor/find_edit_style.cpp index bfee57504..c846e1029 100644 --- a/app/rdo_studio/src/editor/find_edit_style.cpp +++ b/app/rdo_studio/src/editor/find_edit_style.cpp @@ -14,139 +14,142 @@ using namespace rdo::gui::style; // -------------------------------------------------------------------------------- FindStyle::FindStyle(): LogStyle() { - keywordColor = QColor( 0x00, 0x00, 0x00 ); - keywordStyle = StyleFont::BOLD; + keywordColor = QColor(0x00, 0x00, 0x00); + keywordStyle = StyleFont::Style::BOLD; } FindStyle::~FindStyle() {} -FindStyle& FindStyle::operator =( const FindStyle& style ) +FindStyle& FindStyle::operator =(const FindStyle& style) { - LogStyle::operator=( style ); + LogStyle::operator=(style); - keywordColor = style.keywordColor; - keywordStyle = style.keywordStyle; + keywordColor = style.keywordColor; + keywordStyle = style.keywordStyle; - return *this; + return *this; } -bool FindStyle::operator ==( const FindStyle& style ) const +bool FindStyle::operator ==(const FindStyle& style) const { - bool flag = LogStyle::operator==( style ); + bool flag = LogStyle::operator==(style); - if ( flag ) flag &= keywordColor == style.keywordColor && - keywordStyle == style.keywordStyle; + if (flag) + flag &= keywordColor == style.keywordColor && + keywordStyle == style.keywordStyle; - return flag; + return flag; } -bool FindStyle::operator !=( const FindStyle& style ) const +bool FindStyle::operator !=(const FindStyle& style) const { - return !(*this == style); + return !(*this == style); } -bool FindStyle::styleDefault( const int styleType ) const +bool FindStyle::styleDefault(const int styleType) const { - return styleType == SCE_FIND_DEFAULT; + return styleType == SCE_FIND_DEFAULT; } -bool FindStyle::styleUsing( const int styleType ) const +bool FindStyle::styleUsing(const int styleType) const { - return styleType == SCE_FIND_DEFAULT || styleType == SCE_FIND_KEYWORD; + return styleType == SCE_FIND_DEFAULT || styleType == SCE_FIND_KEYWORD; } -bool FindStyle::styleBold( const int styleType ) const +bool FindStyle::styleBold(const int styleType) const { - switch ( styleType ) { - case SCE_FIND_DEFAULT: return defaultStyle & StyleFont::BOLD ? true : false; - case SCE_FIND_KEYWORD: return keywordStyle & StyleFont::BOLD ? true : false; - } - return false; + switch (styleType) + { + case SCE_FIND_DEFAULT: return static_cast(defaultStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; + case SCE_FIND_KEYWORD: return static_cast(keywordStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; + } + return false; } -bool FindStyle::styleItalic( const int styleType ) const +bool FindStyle::styleItalic(const int styleType) const { - switch ( styleType ) { - case SCE_FIND_DEFAULT: return defaultStyle & StyleFont::ITALIC ? true : false; - case SCE_FIND_KEYWORD: return keywordStyle & StyleFont::ITALIC ? true : false; - } - return false; + switch (styleType) + { + case SCE_FIND_DEFAULT: return static_cast(defaultStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; + case SCE_FIND_KEYWORD: return static_cast(keywordStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; + } + return false; } -std::string FindStyle::styleFGColorToHEX( const int styleType ) const +std::string FindStyle::styleFGColorToHEX(const int styleType) const { - switch ( styleType ) { - case SCE_FIND_DEFAULT: return colorToHEX( defaultColor ); - case SCE_FIND_KEYWORD: return colorToHEX( keywordColor ); - } - return LogStyle::styleFGColorToHEX( styleType ); + switch (styleType) + { + case SCE_FIND_DEFAULT: return colorToHEX(defaultColor); + case SCE_FIND_KEYWORD: return colorToHEX(keywordColor); + } + return LogStyle::styleFGColorToHEX(styleType); } FindStyle FindStyle::getDefaultStyle() { - FindStyle style; - return style; + FindStyle style; + return style; } FindStyle FindStyle::getClassicStyle() { - FindStyle style; - *static_cast(&style) = LogStyle::getClassicStyle(); + FindStyle style; + *static_cast(&style) = LogStyle::getClassicStyle(); - style.keywordColor = QColor( 0xFF, 0xFF, 0xFF ); - style.keywordStyle = StyleFont::NONE; + style.keywordColor = QColor(0xFF, 0xFF, 0xFF); + style.keywordStyle = StyleFont::Style::NONE; - return style; + return style; } FindStyle FindStyle::getTwilightStyle() { - FindStyle style; - *static_cast(&style) = LogStyle::getTwilightStyle(); + FindStyle style; + *static_cast(&style) = LogStyle::getTwilightStyle(); - style.keywordColor = QColor( 0x00, 0xFF, 0xFF ); - style.keywordStyle = StyleFont::BOLD; + style.keywordColor = QColor(0x00, 0xFF, 0xFF); + style.keywordStyle = StyleFont::Style::BOLD; - return style; + return style; } FindStyle FindStyle::getOceanStyle() { - FindStyle style; - *static_cast(&style) = LogStyle::getOceanStyle(); + FindStyle style; + *static_cast(&style) = LogStyle::getOceanStyle(); - style.keywordColor = QColor( 0x00, 0x00, 0x00 ); - style.keywordStyle = StyleFont::BOLD; + style.keywordColor = QColor(0x00, 0x00, 0x00); + style.keywordStyle = StyleFont::Style::BOLD; - return style; + return style; } namespace rdo { namespace gui { namespace editor { QSettings& operator<< (QSettings& settings, const FindStyle& style) { - settings << static_cast(style); + settings << static_cast(style); - settings.beginGroup("theme"); - settings.setValue("keyword_color", style.keywordColor.name()); - settings.setValue("keyword_style", style.keywordStyle); - settings.endGroup(); + settings.beginGroup("theme"); + settings.setValue("keyword_color", style.keywordColor.name()); + settings.setValue("keyword_style", static_cast(style.keywordStyle)); + settings.endGroup(); - - return settings; + return settings; } QSettings& operator>> (QSettings& settings, FindStyle& style) { - settings >> static_cast(style); + settings >> static_cast(style); - settings.beginGroup("theme"); - style.keywordColor = QColor(settings.value("keyword_color", style.keywordColor.name()).toString()); - style.keywordStyle = static_cast(settings.value("keyword_style", style.keywordStyle).toInt()); - settings.endGroup(); + settings.beginGroup("theme"); + style.keywordColor = QColor(settings.value("keyword_color", style.keywordColor.name()).toString()); + style.keywordStyle = static_cast(settings.value("keyword_style", static_cast(style.keywordStyle)).toInt()); + settings.endGroup(); - return settings; + return settings; } -}}} // namespace rdo::gui::editor \ No newline at end of file +}}} // namespace rdo::gui::editor diff --git a/app/rdo_studio/src/editor/find_edit_style.h b/app/rdo_studio/src/editor/find_edit_style.h index 113e47f5c..9f8c9593a 100644 --- a/app/rdo_studio/src/editor/find_edit_style.h +++ b/app/rdo_studio/src/editor/find_edit_style.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_FIND_EDIT_STYLE_H_ -#define _RDO_STUDIO_EDITOR_FIND_EDIT_STYLE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -14,32 +13,30 @@ namespace rdo { namespace gui { namespace editor { class FindStyle: public LogStyle { public: - FindStyle(); - ~FindStyle(); + FindStyle(); + ~FindStyle(); - FindStyle& operator =( const FindStyle& style ); - bool operator ==( const FindStyle& style ) const; - bool operator !=( const FindStyle& style ) const; + FindStyle& operator =(const FindStyle& style); + bool operator ==(const FindStyle& style) const; + bool operator !=(const FindStyle& style) const; - virtual bool styleDefault( const int styleType ) const; - virtual bool styleUsing( const int styleType ) const; - virtual bool styleBold( const int styleType = STYLE_DEFAULT ) const; - virtual bool styleItalic( const int styleType = STYLE_DEFAULT ) const; - virtual std::string styleFGColorToHEX( const int styleType = STYLE_DEFAULT ) const; + virtual bool styleDefault(const int styleType) const; + virtual bool styleUsing(const int styleType) const; + virtual bool styleBold(const int styleType = STYLE_DEFAULT) const; + virtual bool styleItalic(const int styleType = STYLE_DEFAULT) const; + virtual std::string styleFGColorToHEX(const int styleType = STYLE_DEFAULT) const; - static FindStyle getDefaultStyle(); - static FindStyle getClassicStyle(); - static FindStyle getTwilightStyle(); - static FindStyle getOceanStyle(); + static FindStyle getDefaultStyle(); + static FindStyle getClassicStyle(); + static FindStyle getTwilightStyle(); + static FindStyle getOceanStyle(); - QColor keywordColor; + QColor keywordColor; - style::StyleFont::style keywordStyle; + style::StyleFont::Style keywordStyle; }; QSettings& operator<< (QSettings& settings, const FindStyle& style); QSettings& operator>> (QSettings& settings, FindStyle& style); }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_FIND_EDIT_STYLE_H_ diff --git a/app/rdo_studio/src/editor/lexer/lexer_find.cpp b/app/rdo_studio/src/editor/lexer/lexer_find.cpp index 9e0029f00..78de1118a 100644 --- a/app/rdo_studio/src/editor/lexer/lexer_find.cpp +++ b/app/rdo_studio/src/editor/lexer/lexer_find.cpp @@ -23,58 +23,58 @@ static void lexerRDOFindColor( unsigned int startPos, int length, int initStyle, WordList *keywordlists[], Accessor &styler ) { - WordList& keywords = *keywordlists[ SCI_RDO_ENDOFLINEONLY_KEYWORDSINDEX ]; - if ( !keywords ) return; - const char* findKeyword = *keywords.words; - const int findKeywordLen = strlen( findKeyword ); - bool matchCase = styler.GetPropertyInt( "find_matchcase", 0 ) ? true : false; + WordList& keywords = *keywordlists[ SCI_RDO_ENDOFLINEONLY_KEYWORDSINDEX ]; + if ( !keywords ) return; + const char* findKeyword = *keywords.words; + const int findKeywordLen = strlen( findKeyword ); + bool matchCase = styler.GetPropertyInt( "find_matchcase", 0 ) ? true : false; - styler.StartAt( startPos ); - styler.StartSegment( startPos ); - int state = initStyle; - unsigned int lengthDoc = startPos + length; - for ( unsigned int i = startPos; i < lengthDoc; i++ ) { + styler.StartAt( startPos ); + styler.StartSegment( startPos ); + int state = initStyle; + unsigned int lengthDoc = startPos + length; + for ( unsigned int i = startPos; i < lengthDoc; i++ ) { - char ch = styler.SafeGetCharAt( i ); + char ch = styler.SafeGetCharAt( i ); - if ( styler.IsLeadByte( ch ) ) { - i += 1; - continue; - } + if ( styler.IsLeadByte( ch ) ) { + i += 1; + continue; + } - if ( state == SCE_FIND_DEFAULT ) { - if ( (matchCase && ch == findKeyword[0]) || (!matchCase && boost::locale::to_lower(std::string(1, ch)) == boost::locale::to_lower(std::string(1, findKeyword[0]))) ) { - bool flag = true; - for ( int j = 0; j < findKeywordLen; j++ ) { - char c1 = styler.SafeGetCharAt( i + j ); - char c2 = findKeyword[j]; - if ( (matchCase && c1 != c2) || (!matchCase && boost::locale::to_lower(std::string(1, c1)) != boost::locale::to_lower(std::string(1, c2))) ) { - flag = false; - break; - } - } - if ( flag ) { - int lineCurrent = styler.GetLine( i ); - int posInLine = i - styler.LineStart( lineCurrent ); - if ( posInLine < 3 ) { - flag = false; - } - } + if ( state == SCE_FIND_DEFAULT ) { + if ( (matchCase && ch == findKeyword[0]) || (!matchCase && boost::locale::to_lower(std::string(1, ch)) == boost::locale::to_lower(std::string(1, findKeyword[0]))) ) { + bool flag = true; + for ( int j = 0; j < findKeywordLen; j++ ) { + char c1 = styler.SafeGetCharAt( i + j ); + char c2 = findKeyword[j]; + if ( (matchCase && c1 != c2) || (!matchCase && boost::locale::to_lower(std::string(1, c1)) != boost::locale::to_lower(std::string(1, c2))) ) { + flag = false; + break; + } + } + if ( flag ) { + int lineCurrent = styler.GetLine( i ); + int posInLine = i - styler.LineStart( lineCurrent ); + if ( posInLine < 3 ) { + flag = false; + } + } - styler.ColourTo( i - 1, state ); - if ( flag ) { - styler.ColourTo( i + findKeywordLen - 1, SCE_FIND_KEYWORD ); - i += findKeywordLen - 1; - } - state = SCE_FIND_DEFAULT; - } else { - styler.ColourTo( i - 1, state ); - state = SCE_FIND_DEFAULT; - } - } + styler.ColourTo( i - 1, state ); + if ( flag ) { + styler.ColourTo( i + findKeywordLen - 1, SCE_FIND_KEYWORD ); + i += findKeywordLen - 1; + } + state = SCE_FIND_DEFAULT; + } else { + styler.ColourTo( i - 1, state ); + state = SCE_FIND_DEFAULT; + } + } - } - styler.ColourTo( lengthDoc - 1, state ); + } + styler.ColourTo( lengthDoc - 1, state ); } LexerModule lexerRDOFind(SCLEX_FIND, lexerRDOFindColor, "find"); diff --git a/app/rdo_studio/src/editor/lexer/lexer_find.h b/app/rdo_studio/src/editor/lexer/lexer_find.h index 0d78e6b00..9007738e7 100644 --- a/app/rdo_studio/src/editor/lexer/lexer_find.h +++ b/app/rdo_studio/src/editor/lexer/lexer_find.h @@ -1,15 +1,12 @@ -#ifndef _RDO_STUDIO_EDITOR_LEXER_FIND_H_ -#define _RDO_STUDIO_EDITOR_LEXER_FIND_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS #include "thirdparty/scintilla/include/ILexer.h" #ifndef NULL - #define NULL 0 + #define NULL 0 #endif #include "thirdparty/scintilla/lexlib/LexerModule.h" // -------------------------------------------------------------------------------- extern LexerModule lexerRDOFind; - -#endif // _RDO_STUDIO_EDITOR_LEXER_FIND_H_ diff --git a/app/rdo_studio/src/editor/lexer/lexer_model.cpp b/app/rdo_studio/src/editor/lexer/lexer_model.cpp index 0cc5b98cb..e8c945aa9 100644 --- a/app/rdo_studio/src/editor/lexer/lexer_model.cpp +++ b/app/rdo_studio/src/editor/lexer/lexer_model.cpp @@ -24,206 +24,206 @@ namespace rdo { namespace gui { namespace lexer { void SyntaxColor(unsigned int startPos, int length, int initStyle, WordList* keywordlists[], Accessor& styler) { - WordList& keywords = *keywordlists[0]; - WordList& functions = *keywordlists[1]; - WordList& traces = *keywordlists[2]; - WordList& colors = *keywordlists[3]; + WordList& keywords = *keywordlists[0]; + WordList& functions = *keywordlists[1]; + WordList& traces = *keywordlists[2]; + WordList& colors = *keywordlists[3]; - styler.StartAt(startPos); + styler.StartAt(startPos); - StyleContext sc(startPos, length, initStyle, styler); + StyleContext sc(startPos, length, initStyle, styler); - bool flag = sc.More(); - for (; flag; sc.Forward()) - { + bool flag = sc.More(); + for (; flag; sc.Forward()) + { - if (sc.state == SCE_RDO_OPERATOR) - { - sc.SetState(SCE_RDO_DEFAULT); - } - else if (sc.state == SCE_RDO_IDENTIFIER) - { - if (!isIdentifier(sc.ch)) - { - char s[100]; - sc.GetCurrent(s, sizeof(s)); - if (keywords.InList(s)) - { - sc.ChangeState(SCE_RDO_KEYWORD); - } - else if (functions.InList(s)) - { - sc.ChangeState(SCE_RDO_FUNCTION); - } - else if (traces.InList(s)) - { - sc.ChangeState(SCE_RDO_TRACE); - } - else if (colors.InList(s)) - { - sc.ChangeState(SCE_RDO_FRAME_COLOR); - } - sc.SetState(SCE_RDO_DEFAULT); - } - } - else if (sc.state == SCE_RDO_NUMBER) - { - if (!isDigit(sc.ch) && sc.ch != '.' && !(sc.ch == 'e' || sc.ch == 'E') && !((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E'))) - { - sc.SetState(SCE_RDO_DEFAULT); - } - } - else if (sc.state == SCE_RDO_STRING) - { - if (sc.ch == '\'') - { - sc.ForwardSetState(SCE_RDO_DEFAULT); - } - } - else if (sc.state == SCE_RDO_COMMENT_CPP) - { - if (sc.Match('*', '/')) - { - sc.Forward(); - sc.ForwardSetState(SCE_RDO_DEFAULT); - } - } - else if (sc.state == SCE_RDO_COMMENT_LINE) - { - if (sc.ch == '\r' || sc.ch == '\n') - { - sc.ForwardSetState(SCE_RDO_DEFAULT); - } - } + if (sc.state == SCE_RDO_OPERATOR) + { + sc.SetState(SCE_RDO_DEFAULT); + } + else if (sc.state == SCE_RDO_IDENTIFIER) + { + if (!isIdentifier(sc.ch)) + { + char s[100]; + sc.GetCurrent(s, sizeof(s)); + if (keywords.InList(s)) + { + sc.ChangeState(SCE_RDO_KEYWORD); + } + else if (functions.InList(s)) + { + sc.ChangeState(SCE_RDO_FUNCTION); + } + else if (traces.InList(s)) + { + sc.ChangeState(SCE_RDO_TRACE); + } + else if (colors.InList(s)) + { + sc.ChangeState(SCE_RDO_FRAME_COLOR); + } + sc.SetState(SCE_RDO_DEFAULT); + } + } + else if (sc.state == SCE_RDO_NUMBER) + { + if (!isDigit(sc.ch) && sc.ch != '.' && !(sc.ch == 'e' || sc.ch == 'E') && !((sc.ch == '+' || sc.ch == '-') && (sc.chPrev == 'e' || sc.chPrev == 'E'))) + { + sc.SetState(SCE_RDO_DEFAULT); + } + } + else if (sc.state == SCE_RDO_STRING) + { + if (sc.ch == '\'') + { + sc.ForwardSetState(SCE_RDO_DEFAULT); + } + } + else if (sc.state == SCE_RDO_COMMENT_CPP) + { + if (sc.Match('*', '/')) + { + sc.Forward(); + sc.ForwardSetState(SCE_RDO_DEFAULT); + } + } + else if (sc.state == SCE_RDO_COMMENT_LINE) + { + if (sc.ch == '\r' || sc.ch == '\n') + { + sc.ForwardSetState(SCE_RDO_DEFAULT); + } + } - if (sc.state == SCE_RDO_DEFAULT) - { - if (sc.ch == '\'') - { - sc.SetState(SCE_RDO_STRING); - } - else if (sc.Match('/', '*')) - { - sc.SetState(SCE_RDO_COMMENT_CPP); - sc.Forward(); // Eat the * so it isn't used for the end of the comment - } - else if (sc.Match('/', '/')) - { - sc.SetState(SCE_RDO_COMMENT_LINE); - } - else if (isDigit(sc.ch) || ((sc.ch == '-' || sc.ch == '+') && isDigit(sc.chNext))) - { - sc.SetState(SCE_RDO_NUMBER); - } - else if (isOperator(sc.ch)) - { - sc.SetState(SCE_RDO_OPERATOR); - } - else if (isIdentifier(sc.ch)) - sc.SetState(SCE_RDO_IDENTIFIER); - } + if (sc.state == SCE_RDO_DEFAULT) + { + if (sc.ch == '\'') + { + sc.SetState(SCE_RDO_STRING); + } + else if (sc.Match('/', '*')) + { + sc.SetState(SCE_RDO_COMMENT_CPP); + sc.Forward(); // Eat the * so it isn't used for the end of the comment + } + else if (sc.Match('/', '/')) + { + sc.SetState(SCE_RDO_COMMENT_LINE); + } + else if (isDigit(sc.ch) || ((sc.ch == '-' || sc.ch == '+') && isDigit(sc.chNext))) + { + sc.SetState(SCE_RDO_NUMBER); + } + else if (isOperator(sc.ch)) + { + sc.SetState(SCE_RDO_OPERATOR); + } + else if (isIdentifier(sc.ch)) + sc.SetState(SCE_RDO_IDENTIFIER); + } - flag = sc.More(); - } - sc.Complete(); + flag = sc.More(); + } + sc.Complete(); } void SyntaxFold(unsigned int startPos, int length, int initStyle, WordList *[], Accessor &styler) { - unsigned int endPos = startPos + length; - int visibleChars = 0; - int lineCurrent = styler.GetLine(startPos); - int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; - int levelCurrent = levelPrev; - char chNext = styler[startPos]; - int styleNext = styler.StyleAt(startPos); - int style = initStyle; - std::string str; - for (unsigned int i = startPos; i < endPos; i++) - { - char ch = chNext; - chNext = styler.SafeGetCharAt(i + 1); - int stylePrev = style; - style = styleNext; - styleNext = styler.StyleAt(i + 1); - bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); - if (style == SCE_RDO_COMMENT_CPP && styler.GetPropertyInt("CommentFold") != 0) - { - if (style != stylePrev) - { - levelCurrent++; - } - else if ((style != styleNext) && !atEOL) - { - levelCurrent--; - } - } - if (style == SCE_RDO_KEYWORD) - { - str += ch; - } - else - { - if (str.length()) - { - if (str == "$Pattern" || str == "$Resource_type" || str == "$Resources" || str == "$Operations" || str == "$Frame" || str == "$Constant" || str == "$Sequence" || str == "$Function" || str == "$Decision_point" || str == "$Process" || str == "$Results" || str == "$Sprite" - || str == "$pattern" || str == "$resource_type" || str == "$resources" || str == "$operations" || str == "$frame" || str == "$constant" || str == "$sequence" || str == "$function" || str == "$decision_point" || str == "$Process" || str == "$results" || str == "$sprite") - { - levelCurrent++; - } - else if (str == "$End") - { - levelCurrent--; - } - str = ""; - } - } - if (atEOL) - { - int lev = levelPrev; - if ((levelCurrent > levelPrev) && (visibleChars > 0)) - { - lev |= SC_FOLDLEVELHEADERFLAG; - } - if (lev != styler.LevelAt(lineCurrent)) - { - styler.SetLevel(lineCurrent, lev); - } - lineCurrent++; - levelPrev = levelCurrent; - visibleChars = 0; - } - if (!isspacechar(ch)) - { - visibleChars++; - } - } - // Fill in the real level of the next line, keeping the current flags as they will be filled in later - int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; - styler.SetLevel(lineCurrent, levelPrev | flagsNext); + unsigned int endPos = startPos + length; + int visibleChars = 0; + int lineCurrent = styler.GetLine(startPos); + int levelPrev = styler.LevelAt(lineCurrent) & SC_FOLDLEVELNUMBERMASK; + int levelCurrent = levelPrev; + char chNext = styler[startPos]; + int styleNext = styler.StyleAt(startPos); + int style = initStyle; + std::string str; + for (unsigned int i = startPos; i < endPos; i++) + { + char ch = chNext; + chNext = styler.SafeGetCharAt(i + 1); + int stylePrev = style; + style = styleNext; + styleNext = styler.StyleAt(i + 1); + bool atEOL = (ch == '\r' && chNext != '\n') || (ch == '\n'); + if (style == SCE_RDO_COMMENT_CPP && styler.GetPropertyInt("CommentFold") != 0) + { + if (style != stylePrev) + { + levelCurrent++; + } + else if ((style != styleNext) && !atEOL) + { + levelCurrent--; + } + } + if (style == SCE_RDO_KEYWORD) + { + str += ch; + } + else + { + if (str.length()) + { + if (str == "$Pattern" || str == "$Resource_type" || str == "$Resources" || str == "$Operations" || str == "$Frame" || str == "$Constant" || str == "$Sequence" || str == "$Function" || str == "$Decision_point" || str == "$Process" || str == "$Results" || str == "$Sprite" + || str == "$pattern" || str == "$resource_type" || str == "$resources" || str == "$operations" || str == "$frame" || str == "$constant" || str == "$sequence" || str == "$function" || str == "$decision_point" || str == "$Process" || str == "$results" || str == "$sprite") + { + levelCurrent++; + } + else if (str == "$End") + { + levelCurrent--; + } + str = ""; + } + } + if (atEOL) + { + int lev = levelPrev; + if ((levelCurrent > levelPrev) && (visibleChars > 0)) + { + lev |= SC_FOLDLEVELHEADERFLAG; + } + if (lev != styler.LevelAt(lineCurrent)) + { + styler.SetLevel(lineCurrent, lev); + } + lineCurrent++; + levelPrev = levelCurrent; + visibleChars = 0; + } + if (!isspacechar(ch)) + { + visibleChars++; + } + } + // Fill in the real level of the next line, keeping the current flags as they will be filled in later + int flagsNext = styler.LevelAt(lineCurrent) & ~SC_FOLDLEVELNUMBERMASK; + styler.SetLevel(lineCurrent, levelPrev | flagsNext); } bool isOperator(int ch) { - return - ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == ':' || - ch == '[' || ch == ']' || ch == '(' || ch == ')' || ch == ',' || - ch == '<' || ch == '>' || ch == '=' || ch == ';' || ch == '!' || - ch == '{' || ch == '}' || ch == '.'; + return + ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == ':' || + ch == '[' || ch == ']' || ch == '(' || ch == ')' || ch == ',' || + ch == '<' || ch == '>' || ch == '=' || ch == ';' || ch == '!' || + ch == '{' || ch == '}' || ch == '.'; } bool isIdentifier(int ch) { - return - iswalnum(ch) || - ch == '_' || - ch == '$' || - ch == '%'; + return + iswalnum(ch) || + ch == '_' || + ch == '$' || + ch == '%'; } bool isDigit(int ch) { - return iswdigit(ch) ? true : false; + return iswdigit(ch) ? true : false; } }}} // namespace rdo::gui::lexer diff --git a/app/rdo_studio/src/editor/lexer/lexer_model.h b/app/rdo_studio/src/editor/lexer/lexer_model.h index 364c2dce1..be029e4e4 100644 --- a/app/rdo_studio/src/editor/lexer/lexer_model.h +++ b/app/rdo_studio/src/editor/lexer/lexer_model.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_LEXER_MODEL_H_ -#define _RDO_STUDIO_EDITOR_LEXER_MODEL_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -17,5 +16,3 @@ bool isDigit (int ch); }}} // namespace rdo::gui::lexer extern LexerModule lexerRDOSyntax; - -#endif // _RDO_STUDIO_EDITOR_LEXER_MODEL_H_ diff --git a/app/rdo_studio/src/editor/lexer/word_list_util.cpp b/app/rdo_studio/src/editor/lexer/word_list_util.cpp index 9c563fc8d..8fd0009f6 100644 --- a/app/rdo_studio/src/editor/lexer/word_list_util.cpp +++ b/app/rdo_studio/src/editor/lexer/word_list_util.cpp @@ -8,74 +8,74 @@ // -------------------------------------------------------------------------------- WordListUtil::WordListUtil(const WordList& wordlist) - : wl(wordlist) + : wl(wordlist) {} std::vector WordListUtil::getNearestWords(const std::string& userPattern) const { - struct PriorityResultItem - { - std::string value; - float priority; + struct PriorityResultItem + { + std::string value; + float priority; - PriorityResultItem() - : priority(0.0) - {} - PriorityResultItem(const std::string& value, float priority) - : value (value ) - , priority(priority) - {} + PriorityResultItem() + : priority(0.0) + {} + PriorityResultItem(const std::string& value, float priority) + : value (value ) + , priority(priority) + {} - bool operator< (const PriorityResultItem& item) const - { - return priority == item.priority - ? value < item.value - : priority > item.priority; - } - }; + bool operator< (const PriorityResultItem& item) const + { + return priority == item.priority + ? value < item.value + : priority > item.priority; + } + }; - typedef std::vector result_type; - result_type result; + typedef std::vector result_type; + result_type result; - if (wl.words == 0) - return result; + if (wl.words == 0) + return result; - if (userPattern.empty()) - { - for (int i = 0; i < wl.len; ++i) - { - result.push_back(wl.words[i]); - } - return result; - } + if (userPattern.empty()) + { + for (int i = 0; i < wl.len; ++i) + { + result.push_back(wl.words[i]); + } + return result; + } - std::vector priorityResult; - for (int i = 0; i < wl.len; ++i) - { - boost::iterator_range findPatternIt = boost::ifind_first(wl.words[i], userPattern); - if (!findPatternIt.empty()) - { - boost::iterator_range fullKeywordIt(wl.words[i], wl.words[i] + strlen(wl.words[i])); - std::size_t position = findPatternIt.begin() - fullKeywordIt.begin(); - std::size_t diff = position + (fullKeywordIt.end() - findPatternIt.end()); - std::size_t wLen = fullKeywordIt.end() - fullKeywordIt.begin(); - float positionPart = float(position) / float(wLen); - float diffPart = float(diff) / float(wLen); - float priority = 1 - (positionPart + diffPart) / 2; - priorityResult.push_back(PriorityResultItem(wl.words[i], priority)); - } - else - { - priorityResult.push_back(PriorityResultItem(wl.words[i], 0.0)); - } - } - std::sort(priorityResult.begin(), priorityResult.end()); - float const minPriority = 0.3f; + std::vector priorityResult; + for (int i = 0; i < wl.len; ++i) + { + boost::iterator_range findPatternIt = boost::ifind_first(wl.words[i], userPattern); + if (!findPatternIt.empty()) + { + boost::iterator_range fullKeywordIt(wl.words[i], wl.words[i] + strlen(wl.words[i])); + std::size_t position = findPatternIt.begin() - fullKeywordIt.begin(); + std::size_t diff = position + (fullKeywordIt.end() - findPatternIt.end()); + std::size_t wLen = fullKeywordIt.end() - fullKeywordIt.begin(); + float positionPart = float(position) / float(wLen); + float diffPart = float(diff) / float(wLen); + float priority = 1 - (positionPart + diffPart) / 2; + priorityResult.push_back(PriorityResultItem(wl.words[i], priority)); + } + else + { + priorityResult.push_back(PriorityResultItem(wl.words[i], 0.0)); + } + } + std::sort(priorityResult.begin(), priorityResult.end()); + float const minPriority = 0.3f; - for (const PriorityResultItem& item: priorityResult) - { - if(item.priority >= minPriority) - result.push_back(item.value); - } - return result; + for (const PriorityResultItem& item: priorityResult) + { + if(item.priority >= minPriority) + result.push_back(item.value); + } + return result; } diff --git a/app/rdo_studio/src/editor/lexer/word_list_util.h b/app/rdo_studio/src/editor/lexer/word_list_util.h index b6a041d94..c1d280c08 100644 --- a/app/rdo_studio/src/editor/lexer/word_list_util.h +++ b/app/rdo_studio/src/editor/lexer/word_list_util.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_LEXER_WORD_LIST_UTIL_H_ -#define _RDO_STUDIO_EDITOR_LEXER_WORD_LIST_UTIL_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -9,14 +8,12 @@ #include "thirdparty/scintilla/lexlib/WordList.h" // -------------------------------------------------------------------------------- -class WordListUtil: public boost::noncopyable +class WordListUtil: private boost::noncopyable { public: - WordListUtil(const WordList& wordlist); - std::vector getNearestWords(const std::string& userPattern) const; + WordListUtil(const WordList& wordlist); + std::vector getNearestWords(const std::string& userPattern) const; private: - const WordList& wl; + const WordList& wl; }; - -#endif // _RDO_STUDIO_EDITOR_LEXER_WORD_LIST_UTIL_H_ diff --git a/app/rdo_studio/src/editor/log_edit.cpp b/app/rdo_studio/src/editor/log_edit.cpp index 46b5d0bd2..3607550a8 100644 --- a/app/rdo_studio/src/editor/log_edit.cpp +++ b/app/rdo_studio/src/editor/log_edit.cpp @@ -14,263 +14,263 @@ using namespace rdo::gui::editor; Log::Log(QWidget* pParent) - : Edit(pParent) - , m_currentLine(-1) + : Edit(pParent) + , m_currentLine(-1) { - setCurrentLine(-1); - m_sciMarkerLine = getNewMarker(); + setCurrentLine(-1); + m_sciMarkerLine = getNewMarker(); - sendEditor(SCI_SETMODEVENTMASK, SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT); + sendEditor(SCI_SETMODEVENTMASK, SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT); - setReadOnly(true); + setReadOnly(true); - QObject::connect(this, SIGNAL(doubleClick(int, int)), this, SLOT(catchDoubleClick(int, int))); - QObject::connect(this, SIGNAL(modified(int, int, int, int, const QByteArray&, int, int, int)), this, SLOT(catchModified())); + QObject::connect(this, SIGNAL(doubleClick(int, int)), this, SLOT(catchDoubleClick(int, int))); + QObject::connect(this, SIGNAL(modified(int, int, int, int, const QByteArray&, int, int, int)), this, SLOT(catchModified())); } void Log::catchDoubleClick(int position, int line) { - m_currentLine = line; + m_currentLine = line; - LogEditLineInfoList::iterator it = m_lines.begin(); - for (int i = 0; i < line; i++) - { - if (it != m_lines.end()) - { - ++it; - } - } - if (it != m_lines.end() && (*it)->getLineNumber() != std::size_t(~0)) - { - setSelectLine(line, *it); - } + LogEditLineInfoList::iterator it = m_lines.begin(); + for (int i = 0; i < line; i++) + { + if (it != m_lines.end()) + { + ++it; + } + } + if (it != m_lines.end() && (*it)->getLineNumber() != std::size_t(~0)) + { + setSelectLine(line, *it); + } - sendEditor(SCI_SETSELECTIONSTART, position); - sendEditor(SCI_SETSELECTIONEND , position); + sendEditor(SCI_SETSELECTIONSTART, position); + sendEditor(SCI_SETSELECTIONEND , position); } void Log::catchModified() { - if (hasSelectLine()) - { - clearSelectLine(); - } + if (hasSelectLine()) + { + clearSelectLine(); + } } Log::~Log() { - clearLines(); + clearLines(); } void Log::setEditorStyle(LogStyle* pStyle) { - Edit::setEditorStyle(pStyle); - if (!m_pStyle) - return; + Edit::setEditorStyle(pStyle); + if (!m_pStyle) + return; - // ---------- - // Selected Line - defineMarker(m_sciMarkerLine, SC_MARK_BACKGROUND, QColor(0xFF, 0xFF, 0xFF), static_cast(m_pStyle)->selectLineBgColor); + // ---------- + // Selected Line + defineMarker(m_sciMarkerLine, SC_MARK_BACKGROUND, QColor(0xFF, 0xFF, 0xFF), static_cast(m_pStyle)->selectLineBgColor); } void Log::gotoPrev() { - m_currentLine--; - if (m_currentLine < 0) - { - m_currentLine = m_lines.size() - 1; - } - if (m_currentLine < 0) - return; + m_currentLine--; + if (m_currentLine < 0) + { + m_currentLine = m_lines.size() - 1; + } + if (m_currentLine < 0) + return; - LogEditLineInfoList::iterator it = m_lines.begin(); - int i; - for (i = 0; i < m_currentLine; i++) - { - ++it; - } - while (it != m_lines.begin() && (*it)->getLineNumber() == std::size_t(~0)) - { - --it; - --m_currentLine; - } - if (it == m_lines.begin() && (*it)->getLineNumber() == std::size_t(~0)) - { - it = m_lines.end(); - m_currentLine = m_lines.size(); - while (it == m_lines.end() || (it != m_lines.begin() && (*it)->getLineNumber() == std::size_t(~0))) - { - --it; - --m_currentLine; - } - } - if (it != m_lines.end() && (*it)->getLineNumber() != std::size_t(~0)) - { - setSelectLine(m_currentLine, *it, true); - } + LogEditLineInfoList::iterator it = m_lines.begin(); + int i; + for (i = 0; i < m_currentLine; i++) + { + ++it; + } + while (it != m_lines.begin() && (*it)->getLineNumber() == std::size_t(~0)) + { + --it; + --m_currentLine; + } + if (it == m_lines.begin() && (*it)->getLineNumber() == std::size_t(~0)) + { + it = m_lines.end(); + m_currentLine = m_lines.size(); + while (it == m_lines.end() || (it != m_lines.begin() && (*it)->getLineNumber() == std::size_t(~0))) + { + --it; + --m_currentLine; + } + } + if (it != m_lines.end() && (*it)->getLineNumber() != std::size_t(~0)) + { + setSelectLine(m_currentLine, *it, true); + } } void Log::getLines(LogEditLineInfoList& lines) const { - lines = m_lines; + lines = m_lines; } int Log::getCurrentLine() const { - return m_currentLine; + return m_currentLine; } int Log::getSciMarkerLine() const { - return m_sciMarkerLine; + return m_sciMarkerLine; } void Log::setCurrentLine(int currentLine) { - m_currentLine = currentLine; + m_currentLine = currentLine; } void Log::setSciMarkerLine(int sciMarkerLine) { - m_sciMarkerLine = sciMarkerLine; + m_sciMarkerLine = sciMarkerLine; } void Log::gotoNext() { - m_currentLine++; - LogEditLineInfoList::iterator it = m_lines.begin(); - int i; - for (i = 0; i < m_currentLine; i++) - { - if (it != m_lines.end()) - { - ++it; - } - else - { - m_currentLine = 0; - break; - } - } - it = m_lines.begin(); - for (i = 0; i < m_currentLine; i++) - { - ++it; - } - while (it != m_lines.end() && (*it)->getLineNumber() == std::size_t(~0)) - { - ++it; - ++m_currentLine; - } - if (it == m_lines.end()) - { - it = m_lines.begin(); - m_currentLine = 0; - while (it != m_lines.end() && (*it)->getLineNumber() == std::size_t(~0)) - { - ++it; - ++m_currentLine; - } - } - if (it != m_lines.end() && (*it)->getLineNumber() != std::size_t(~0)) - { - setSelectLine(m_currentLine, *it, true); - } + m_currentLine++; + LogEditLineInfoList::iterator it = m_lines.begin(); + int i; + for (i = 0; i < m_currentLine; i++) + { + if (it != m_lines.end()) + { + ++it; + } + else + { + m_currentLine = 0; + break; + } + } + it = m_lines.begin(); + for (i = 0; i < m_currentLine; i++) + { + ++it; + } + while (it != m_lines.end() && (*it)->getLineNumber() == std::size_t(~0)) + { + ++it; + ++m_currentLine; + } + if (it == m_lines.end()) + { + it = m_lines.begin(); + m_currentLine = 0; + while (it != m_lines.end() && (*it)->getLineNumber() == std::size_t(~0)) + { + ++it; + ++m_currentLine; + } + } + if (it != m_lines.end() && (*it)->getLineNumber() != std::size_t(~0)) + { + setSelectLine(m_currentLine, *it, true); + } } void Log::clearAll() { - Edit::clearAll(); - clearLines(); + Edit::clearAll(); + clearLines(); } void Log::appendLine(LogEditLineInfo* pLine) { - m_lines.push_back(pLine); - bool readOnly = isReadOnly(); - if (readOnly) - { - setReadOnly(false); - } - std::string str = boost::algorithm::trim_right_copy(pLine->getMessage()); - str += "\r\n"; - setCurrentPos(getLength()); - appendText(QString::fromStdString(str)); - pLine->setPosInLog(getLength()); - scrollToLine2(getLineCount()); - setCurrentPos(pLine->getPosInLog()); - if (readOnly) - { - setReadOnly(true); - } - onUpdateEditGUI(); + m_lines.push_back(pLine); + bool readOnly = isReadOnly(); + if (readOnly) + { + setReadOnly(false); + } + std::string str = boost::algorithm::trim_right_copy(pLine->getMessage()); + str += "\r\n"; + setCurrentPos(getLength()); + appendText(QString::fromStdString(str)); + pLine->setPosInLog(getLength()); + scrollToLine2(getLineCount()); + setCurrentPos(pLine->getPosInLog()); + if (readOnly) + { + setReadOnly(true); + } + onUpdateEditGUI(); } void Log::setSelectLine(int line, const LogEditLineInfo* pLineInfo, bool useScroll) { - if (pLineInfo->getLineNumber() != std::size_t(~0)) - { - if (sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerLine) != line) - { - clearSelectLine(); - sendEditor(SCI_MARKERADD, line, m_sciMarkerLine); - if (useScroll) - { - setCurrentPos(pLineInfo->getPosInLog()); - scrollToCarret(); - } - } - model::TabCtrl* pTab = g_pModel->getTab(); - if (pTab) - { - if (pTab->getCurrentRDOItem() != pLineInfo->getFileType()) - { - Model* pEdit = pTab->getCurrentEdit(); - if (!pEdit || (pEdit && pEdit->getLog() == this)) - { - pTab->setCurrentRDOItem(pLineInfo->getFileType()); - } - } - Model* pEdit = pTab->getCurrentEdit(); - if (pEdit && pEdit->getLog() == this) - { - updateEdit(pEdit, pLineInfo); - } - } - } + if (pLineInfo->getLineNumber() != std::size_t(~0)) + { + if (sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerLine) != line) + { + clearSelectLine(); + sendEditor(SCI_MARKERADD, line, m_sciMarkerLine); + if (useScroll) + { + setCurrentPos(pLineInfo->getPosInLog()); + scrollToCarret(); + } + } + model::TabCtrl* pTab = g_pModel->getTab(); + if (pTab) + { + if (pTab->getCurrentRDOItem() != pLineInfo->getFileType()) + { + Model* pEdit = pTab->getCurrentEdit(); + if (!pEdit || (pEdit && pEdit->getLog() == this)) + { + pTab->setCurrentRDOItem(pLineInfo->getFileType()); + } + } + Model* pEdit = pTab->getCurrentEdit(); + if (pEdit && pEdit->getLog() == this) + { + updateEdit(pEdit, pLineInfo); + } + } + } } void Log::updateEdit(Model* pEdit, const LogEditLineInfo* pLineInfo) { - pEdit->scrollToLine(pLineInfo->getLineNumber()); - int pos = pEdit->getPositionFromLine(pLineInfo->getLineNumber()) + pLineInfo->getPosInLine(); - pEdit->setCurrentPos(pos); - pEdit->horzScrollToCurrentPos(); - pEdit->setFocus(); + pEdit->scrollToLine(pLineInfo->getLineNumber()); + int pos = pEdit->getPositionFromLine(pLineInfo->getLineNumber()) + pLineInfo->getPosInLine(); + pEdit->setCurrentPos(pos); + pEdit->horzScrollToCurrentPos(); + pEdit->setFocus(); } void Log::clearSelectLine() { - int nextLine = sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerLine); - if (nextLine >= 0) - { - sendEditor(SCI_MARKERDELETE, nextLine, m_sciMarkerLine); - update(); - } + int nextLine = sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerLine); + if (nextLine >= 0) + { + sendEditor(SCI_MARKERDELETE, nextLine, m_sciMarkerLine); + update(); + } } bool Log::hasSelectLine() const { - int nextLine = sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerLine); - return nextLine >= 0; + int nextLine = sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerLine); + return nextLine >= 0; } void Log::clearLines() { - for (LogEditLineInfo* pInfo: m_lines) - { - delete pInfo; - } - m_lines.clear(); - m_currentLine = 0; + for (LogEditLineInfo* pInfo: m_lines) + { + delete pInfo; + } + m_lines.clear(); + m_currentLine = 0; } diff --git a/app/rdo_studio/src/editor/log_edit.h b/app/rdo_studio/src/editor/log_edit.h index 9d0fe5272..0b17fa5ca 100644 --- a/app/rdo_studio/src/editor/log_edit.h +++ b/app/rdo_studio/src/editor/log_edit.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_LOG_EDIT_H_ -#define _RDO_STUDIO_EDITOR_LOG_EDIT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -18,46 +17,44 @@ class Log: public Edit Q_OBJECT public: - typedef rdo::simulation::report::LogEditLineInfo LogEditLineInfo; - typedef std::list LogEditLineInfoList; + typedef rdo::simulation::report::LogEditLineInfo LogEditLineInfo; + typedef std::list LogEditLineInfoList; - Log(QWidget* pParent); - virtual ~Log(); + Log(QWidget* pParent); + virtual ~Log(); - virtual void setEditorStyle(LogStyle* pStyle); + virtual void setEditorStyle(LogStyle* pStyle); - void gotoNext(); - void gotoPrev(); + void gotoNext(); + void gotoPrev(); - virtual void clearAll(); - virtual void appendLine(LogEditLineInfo* pLine); + virtual void clearAll(); + virtual void appendLine(LogEditLineInfo* pLine); protected: - void getLines(LogEditLineInfoList& pLines) const; - int getCurrentLine() const; - int getSciMarkerLine() const; + void getLines(LogEditLineInfoList& pLines) const; + int getCurrentLine() const; + int getSciMarkerLine() const; - void setCurrentLine(int currentLine); - void setSciMarkerLine(int sciMarkerLine); + void setCurrentLine(int currentLine); + void setSciMarkerLine(int sciMarkerLine); protected: - virtual void updateEdit(Model* pEdit, const LogEditLineInfo* pLineInfo); + virtual void updateEdit(Model* pEdit, const LogEditLineInfo* pLineInfo); - void clearLines (); - void setSelectLine (int line, const LogEditLineInfo* pLineInfo, bool useScroll = false); - void clearSelectLine(); - bool hasSelectLine () const; + void clearLines (); + void setSelectLine (int line, const LogEditLineInfo* pLineInfo, bool useScroll = false); + void clearSelectLine(); + bool hasSelectLine () const; private: - LogEditLineInfoList m_lines; - int m_currentLine; - int m_sciMarkerLine; + LogEditLineInfoList m_lines; + int m_currentLine; + int m_sciMarkerLine; private slots: - void catchDoubleClick(int position, int line); - void catchModified (); + void catchDoubleClick(int position, int line); + void catchModified (); }; }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_LOG_EDIT_H_ diff --git a/app/rdo_studio/src/editor/log_edit_style.cpp b/app/rdo_studio/src/editor/log_edit_style.cpp index c1d057420..6d5d727a9 100644 --- a/app/rdo_studio/src/editor/log_edit_style.cpp +++ b/app/rdo_studio/src/editor/log_edit_style.cpp @@ -12,7 +12,7 @@ using namespace rdo::gui::editor; // -------------------------------------------------------------------------------- LogStyle::LogStyle(): EditStyle() { - selectLineBgColor = QColor( 0x00, 0xC0, 0xEF ); + selectLineBgColor = QColor( 0x00, 0xC0, 0xEF ); } LogStyle::~LogStyle() @@ -20,80 +20,80 @@ LogStyle::~LogStyle() LogStyle& LogStyle::operator =( const LogStyle& style ) { - EditStyle::operator=( style ); - selectLineBgColor = style.selectLineBgColor; + EditStyle::operator=( style ); + selectLineBgColor = style.selectLineBgColor; - return *this; + return *this; } bool LogStyle::operator ==( const LogStyle& style ) const { - bool flag = EditStyle::operator==( style ); - return flag && selectLineBgColor == style.selectLineBgColor; + bool flag = EditStyle::operator==( style ); + return flag && selectLineBgColor == style.selectLineBgColor; } bool LogStyle::operator !=( const LogStyle& style ) const { - return !(*this == style); + return !(*this == style); } LogStyle LogStyle::getDefaultStyle() { - LogStyle style; - return style; + LogStyle style; + return style; } LogStyle LogStyle::getClassicStyle() { - LogStyle style; - *static_cast(&style) = EditStyle::getClassicStyle(); + LogStyle style; + *static_cast(&style) = EditStyle::getClassicStyle(); - style.selectLineBgColor = QColor( 0x00, 0xC0, 0xEF ); + style.selectLineBgColor = QColor( 0x00, 0xC0, 0xEF ); - return style; + return style; } LogStyle LogStyle::getTwilightStyle() { - LogStyle style; - *static_cast(&style) = EditStyle::getTwilightStyle(); + LogStyle style; + *static_cast(&style) = EditStyle::getTwilightStyle(); - style.selectLineBgColor = QColor( 0x00, 0x96, 0xBB ); + style.selectLineBgColor = QColor( 0x00, 0x96, 0xBB ); - return style; + return style; } LogStyle LogStyle::getOceanStyle() { - LogStyle style; - *static_cast(&style) = EditStyle::getOceanStyle(); + LogStyle style; + *static_cast(&style) = EditStyle::getOceanStyle(); - style.selectLineBgColor = QColor( 0xCA, 0xF4, 0xFF ); + style.selectLineBgColor = QColor( 0xCA, 0xF4, 0xFF ); - return style; + return style; } namespace rdo { namespace gui { namespace editor { QSettings& operator<< (QSettings& settings, const LogStyle& style) { - settings << static_cast(style); - - settings.beginGroup("theme"); - settings.setValue("select_line_bg_color", style.selectLineBgColor.name()); - settings.endGroup(); - return settings; + settings << static_cast(style); + + settings.beginGroup("theme"); + settings.setValue("select_line_bg_color", style.selectLineBgColor.name()); + settings.endGroup(); + return settings; } QSettings& operator>> (QSettings& settings, LogStyle& style) { - settings >> static_cast(style); - - settings.beginGroup("theme"); - style.selectLineBgColor = QColor(settings.value("select_line_bg_color", style.selectLineBgColor.name()).toString()); - settings.endGroup(); + settings >> static_cast(style); + + settings.beginGroup("theme"); + style.selectLineBgColor = QColor(settings.value("select_line_bg_color", style.selectLineBgColor.name()).toString()); + settings.endGroup(); - return settings; + return settings; } }}} // namespace rdo::gui::editor diff --git a/app/rdo_studio/src/editor/log_edit_style.h b/app/rdo_studio/src/editor/log_edit_style.h index 48366e0b2..c816f6799 100644 --- a/app/rdo_studio/src/editor/log_edit_style.h +++ b/app/rdo_studio/src/editor/log_edit_style.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_LOG_EDIT_STYLE_H_ -#define _RDO_STUDIO_EDITOR_LOG_EDIT_STYLE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -14,24 +13,22 @@ namespace rdo { namespace gui { namespace editor { class LogStyle: public EditStyle { public: - LogStyle(); - ~LogStyle(); + LogStyle(); + ~LogStyle(); - LogStyle& operator =( const LogStyle& style ); - bool operator ==( const LogStyle& style ) const; - bool operator !=( const LogStyle& style ) const; + LogStyle& operator =( const LogStyle& style ); + bool operator ==( const LogStyle& style ) const; + bool operator !=( const LogStyle& style ) const; - static LogStyle getDefaultStyle(); - static LogStyle getClassicStyle(); - static LogStyle getTwilightStyle(); - static LogStyle getOceanStyle(); + static LogStyle getDefaultStyle(); + static LogStyle getClassicStyle(); + static LogStyle getTwilightStyle(); + static LogStyle getOceanStyle(); - QColor selectLineBgColor; + QColor selectLineBgColor; }; QSettings& operator<< (QSettings& settings, const LogStyle& style); QSettings& operator>> (QSettings& settings, LogStyle& style); }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_LOG_EDIT_STYLE_H_ diff --git a/app/rdo_studio/src/editor/model_edit.cpp b/app/rdo_studio/src/editor/model_edit.cpp index c0af9a834..07b3911d4 100644 --- a/app/rdo_studio/src/editor/model_edit.cpp +++ b/app/rdo_studio/src/editor/model_edit.cpp @@ -18,51 +18,51 @@ using namespace rdo::gui::editor; Model::Model(QWidget* pParent, QWidget* pView) - : super (pParent) - , m_pView (pView ) - , m_pLog (NULL ) - , m_pPopupMenu (NULL ) - , m_canClearErrorLine(true ) + : super (pParent) + , m_pView (pView ) + , m_pLog (NULL ) + , m_pPopupMenu (NULL ) + , m_canClearErrorLine(true ) { - m_sciFoldMarginID = getNewMarker(); - m_sciMarkerError = getNewMarker(); - - sendEditor(SCI_SETMODEVENTMASK, SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT | SC_MOD_CHANGEFOLD); - - sendEditor(SCI_SETMARGINTYPEN , m_sciFoldMarginID, SC_MARGIN_SYMBOL); - sendEditor(SCI_SETFOLDFLAGS, 16); - sendEditor(SCI_SETMARGINMASKN , m_sciFoldMarginID, SC_MASK_FOLDERS); - sendEditor(SCI_SETMARGINSENSITIVEN, m_sciFoldMarginID, 1); - - sendEditor(SCI_AUTOCSETIGNORECASE , 1); - sendEditor(SCI_AUTOCSETCHOOSESINGLE , 0); - sendEditor(SCI_AUTOCSETDROPRESTOFWORD, true ); - sendEditor(SCI_AUTOCSETCANCELATSTART , false); - sendEditor(SCI_AUTOCSETAUTOHIDE , false); - sendEditor(SCI_AUTOCSTOPS , 0, reinterpret_cast("+-*/:[](),<>=.")); - - QObject::connect(this, SIGNAL(modified(int, int, int, int, const QByteArray&, int, int, int)), this, SLOT(catchModified(int, int, int, int, const QByteArray&, int, int, int))); - QObject::connect(this, SIGNAL(marginClicked(int, int, int)), this, SLOT(catchMarginClick(int, int, int))); - - Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); - m_pPopupMenu = new QMenu(this); - m_pPopupMenu->addMenu(pMainWindow->menuInsert); - m_pPopupMenu->addSeparator(); - m_pPopupMenu->addAction(pMainWindow->actEditCut); - m_pPopupMenu->addAction(pMainWindow->actEditCopy); - m_pPopupMenu->addAction(pMainWindow->actEditPaste); - m_pPopupMenu->addSeparator(); - m_pPopupMenu->addAction(pMainWindow->actEditSelectAll); - m_pPopupMenu->addSeparator(); - m_pPopupMenu->addAction(pMainWindow->actSearchFind); - m_pPopupMenu->addAction(pMainWindow->actSearchReplace); - m_pPopupMenu->addAction(pMainWindow->actSearchFindNext); - m_pPopupMenu->addSeparator(); - m_pPopupMenu->addAction(pMainWindow->actSearchBookmarksToggle); - m_pPopupMenu->addAction(pMainWindow->actSearchBookmarkNext); - m_pPopupMenu->addAction(pMainWindow->actSearchBookmarkPrev); - m_pPopupMenu->addAction(pMainWindow->actSearchBookmarksClearAll); + m_sciFoldMarginID = getNewMarker(); + m_sciMarkerError = getNewMarker(); + + sendEditor(SCI_SETMODEVENTMASK, SC_MOD_INSERTTEXT | SC_MOD_DELETETEXT | SC_MOD_CHANGEFOLD); + + sendEditor(SCI_SETMARGINTYPEN , m_sciFoldMarginID, SC_MARGIN_SYMBOL); + sendEditor(SCI_SETFOLDFLAGS, 16); + sendEditor(SCI_SETMARGINMASKN , m_sciFoldMarginID, SC_MASK_FOLDERS); + sendEditor(SCI_SETMARGINSENSITIVEN, m_sciFoldMarginID, 1); + + sendEditor(SCI_AUTOCSETIGNORECASE , 1); + sendEditor(SCI_AUTOCSETCHOOSESINGLE , 0); + sendEditor(SCI_AUTOCSETDROPRESTOFWORD, true ); + sendEditor(SCI_AUTOCSETCANCELATSTART , false); + sendEditor(SCI_AUTOCSETAUTOHIDE , false); + sendEditor(SCI_AUTOCSTOPS , 0, reinterpret_cast("+-*/:[](),<>=.")); + + QObject::connect(this, SIGNAL(modified(int, int, int, int, const QByteArray&, int, int, int)), this, SLOT(catchModified(int, int, int, int, const QByteArray&, int, int, int))); + QObject::connect(this, SIGNAL(marginClicked(int, int, int)), this, SLOT(catchMarginClick(int, int, int))); + + Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); + m_pPopupMenu = new QMenu(this); + m_pPopupMenu->addMenu(pMainWindow->menuInsert); + m_pPopupMenu->addSeparator(); + m_pPopupMenu->addAction(pMainWindow->actEditCut); + m_pPopupMenu->addAction(pMainWindow->actEditCopy); + m_pPopupMenu->addAction(pMainWindow->actEditPaste); + m_pPopupMenu->addSeparator(); + m_pPopupMenu->addAction(pMainWindow->actEditSelectAll); + m_pPopupMenu->addSeparator(); + m_pPopupMenu->addAction(pMainWindow->actSearchFind); + m_pPopupMenu->addAction(pMainWindow->actSearchReplace); + m_pPopupMenu->addAction(pMainWindow->actSearchFindNext); + m_pPopupMenu->addSeparator(); + m_pPopupMenu->addAction(pMainWindow->actSearchBookmarksToggle); + m_pPopupMenu->addAction(pMainWindow->actSearchBookmarkNext); + m_pPopupMenu->addAction(pMainWindow->actSearchBookmarkPrev); + m_pPopupMenu->addAction(pMainWindow->actSearchBookmarksClearAll); } Model::~Model() @@ -70,607 +70,598 @@ Model::~Model() void Model::catchModified(int modificationType, int /*position*/, int /*length*/, int /*linesAdded*/, const QByteArray& /*bytes*/, int line, int foldLevelNow, int foldLevelPrev) { - if (modificationType & SC_MOD_CHANGEFOLD) - { - foldChanged(line, foldLevelNow, foldLevelPrev); - } - if (m_canClearErrorLine && hasErrorLine()) - { - clearErrorLine(); - } + if (modificationType & SC_MOD_CHANGEFOLD) + { + foldChanged(line, foldLevelNow, foldLevelPrev); + } + if (m_canClearErrorLine && hasErrorLine()) + { + clearErrorLine(); + } } void Model::catchMarginClick(int position, int modifiers, int margin) { - if (margin == m_sciFoldMarginID) - { - foldMarginClick(position, modifiers); - } + if (margin == m_sciFoldMarginID) + { + foldMarginClick(position, modifiers); + } } void Model::setEditorStyle(ModelStyle* pStyle) { - super::setEditorStyle(pStyle); - if (!m_pStyle) - return; - - // ---------- - // Fold - ModelStyle* style = static_cast(m_pStyle); - QColor foldFgColor = style->foldFgColor; - QColor foldBgColor = style->foldBgColor; - switch (style->foldStyle) - { - case ModelStyle::F_NONE: - defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_EMPTY, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDER , SC_MARK_EMPTY, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_EMPTY, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_EMPTY, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_EMPTY, foldFgColor, foldBgColor); - break; - - case ModelStyle::F_PLUS: - defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_MINUS, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDER , SC_MARK_PLUS , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_EMPTY, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_EMPTY, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_EMPTY, foldFgColor, foldBgColor); - break; - - case ModelStyle::F_PLUSCONNECTED: - defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_MINUS , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDER , SC_MARK_PLUS , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_VLINE , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_LCORNER, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_LCORNER, foldFgColor, foldBgColor); - break; - - case ModelStyle::F_ARROW: - defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_ARROWDOWN, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDER , SC_MARK_ARROW , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_EMPTY , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_EMPTY , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_EMPTY , foldFgColor, foldBgColor); - break; - - case ModelStyle::F_ARROWCONNECTED: - defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_ARROWDOWN, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDER , SC_MARK_ARROW , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_VLINE , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_LCORNER , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_LCORNER , foldFgColor, foldBgColor); - break; - - case ModelStyle::F_BOXCONNECTED: - defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_BOXMINUS, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDER , SC_MARK_BOXPLUS , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_VLINE , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_LCORNER , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_LCORNER , foldFgColor, foldBgColor); - break; - - case ModelStyle::F_CIRCLECONNECTED: - defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_CIRCLEMINUS, foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDER , SC_MARK_CIRCLEPLUS , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_VLINE , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_LCORNER , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY , foldFgColor, foldBgColor); - defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_LCORNER , foldFgColor, foldBgColor); - break; - } - std::string cf_prop("CommentFold"); - std::string cf_val_1("1"); - std::string cf_val_0("0"); - sendEditorString(SCI_SETPROPERTY, reinterpret_cast(cf_prop.c_str()), style->commentFold ? cf_val_1.c_str() : cf_val_0.c_str()); - sendEditor(SCI_COLOURISE, 0, -1); - - // ---------- - // Margin - sendEditor(SCI_SETMARGINWIDTHN, 2, static_cast(m_pStyle)->margin.fold ? 16 : 0); - sendEditor(SCI_SETMARGINWIDTHN, 1, static_cast(m_pStyle)->margin.bookmark ? 16 : 0); - sendEditor(SCI_SETMARGINWIDTHN, 0, static_cast(m_pStyle)->margin.lineNumber ? 40 : 0); - - // ---------- - // Error - defineMarker(m_sciMarkerError, SC_MARK_BACKGROUND, QColor(0xFF, 0xFF, 0xFF), static_cast(m_pStyle)->errorBgColor); + super::setEditorStyle(pStyle); + if (!m_pStyle) + return; + + // ---------- + // Fold + ModelStyle* style = static_cast(m_pStyle); + QColor foldFgColor = style->foldFgColor; + QColor foldBgColor = style->foldBgColor; + switch (style->foldStyle) + { + case ModelStyle::Fold::NONE: + defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_EMPTY, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDER , SC_MARK_EMPTY, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_EMPTY, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_EMPTY, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_EMPTY, foldFgColor, foldBgColor); + break; + + case ModelStyle::Fold::PLUS: + defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_MINUS, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDER , SC_MARK_PLUS , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_EMPTY, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_EMPTY, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_EMPTY, foldFgColor, foldBgColor); + break; + + case ModelStyle::Fold::PLUS_CONNECTED: + defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_MINUS , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDER , SC_MARK_PLUS , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_VLINE , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_LCORNER, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_LCORNER, foldFgColor, foldBgColor); + break; + + case ModelStyle::Fold::ARROW: + defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_ARROWDOWN, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDER , SC_MARK_ARROW , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_EMPTY , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_EMPTY , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_EMPTY , foldFgColor, foldBgColor); + break; + + case ModelStyle::Fold::ARROW_CONNECTED: + defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_ARROWDOWN, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDER , SC_MARK_ARROW , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_VLINE , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_LCORNER , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_LCORNER , foldFgColor, foldBgColor); + break; + + case ModelStyle::Fold::BOX_CONNECTED: + defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_BOXMINUS, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDER , SC_MARK_BOXPLUS , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_VLINE , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_LCORNER , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_LCORNER , foldFgColor, foldBgColor); + break; + + case ModelStyle::Fold::CIRCLE_CONNECTED: + defineMarker(SC_MARKNUM_FOLDEROPEN , SC_MARK_CIRCLEMINUS, foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDER , SC_MARK_CIRCLEPLUS , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERSUB , SC_MARK_VLINE , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERTAIL , SC_MARK_LCORNER , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEREND , SC_MARK_EMPTY , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDEROPENMID, SC_MARK_EMPTY , foldFgColor, foldBgColor); + defineMarker(SC_MARKNUM_FOLDERMIDTAIL, SC_MARK_LCORNER , foldFgColor, foldBgColor); + break; + } + std::string cf_prop("CommentFold"); + std::string cf_val_1("1"); + std::string cf_val_0("0"); + sendEditorString(SCI_SETPROPERTY, reinterpret_cast(cf_prop.c_str()), style->commentFold ? cf_val_1.c_str() : cf_val_0.c_str()); + sendEditor(SCI_COLOURISE, 0, -1); + + // ---------- + // Margin + sendEditor(SCI_SETMARGINWIDTHN, 2, static_cast(m_pStyle)->margin.fold ? 16 : 0); + sendEditor(SCI_SETMARGINWIDTHN, 1, static_cast(m_pStyle)->margin.bookmark ? 16 : 0); + sendEditor(SCI_SETMARGINWIDTHN, 0, static_cast(m_pStyle)->margin.lineNumber ? 40 : 0); + + // ---------- + // Error + defineMarker(m_sciMarkerError, SC_MARK_BACKGROUND, QColor(0xFF, 0xFF, 0xFF), static_cast(m_pStyle)->errorBgColor); } void Model::expand(int& line, bool doExpand, bool force, int visLevels, int level) const { - int lineMaxSubord = sendEditor(SCI_GETLASTCHILD, line, level & SC_FOLDLEVELNUMBERMASK); - line++; - while (line <= lineMaxSubord) - { - if (force) - { - sendEditor( - visLevels > 0 - ? SCI_SHOWLINES - : SCI_HIDELINES, - line, - line - ); - } - else - { - if (doExpand) - { - sendEditor(SCI_SHOWLINES, line, line); - } - } - int levelLine = level; - if (levelLine == -1) - { - levelLine = sendEditor(SCI_GETFOLDLEVEL, line); - } - if (levelLine & SC_FOLDLEVELHEADERFLAG) - { - if (force) - { - sendEditor( - SCI_SETFOLDEXPANDED, - line, - visLevels > 1 - ? 1 - : 0 - ); - expand(line, doExpand, force, visLevels - 1); - } - else - { - if (doExpand) - { - if (!sendEditor(SCI_GETFOLDEXPANDED, line)) - { - sendEditor(SCI_SETFOLDEXPANDED, line, 1); - } - expand(line, true, force, visLevels - 1); - } - else - { - expand(line, false, force, visLevels - 1); - } - } - } - else - { - line++; - } - } + int lineMaxSubord = sendEditor(SCI_GETLASTCHILD, line, level & SC_FOLDLEVELNUMBERMASK); + line++; + while (line <= lineMaxSubord) + { + if (force) + { + sendEditor( + visLevels > 0 + ? SCI_SHOWLINES + : SCI_HIDELINES, + line, + line + ); + } + else + { + if (doExpand) + sendEditor(SCI_SHOWLINES, line, line); + } + int levelLine = level; + if (levelLine == -1) + levelLine = sendEditor(SCI_GETFOLDLEVEL, line); + + if (levelLine & SC_FOLDLEVELHEADERFLAG) + { + if (force) + { + sendEditor( + SCI_SETFOLDEXPANDED, + line, + visLevels > 1 + ? 1 + : 0 + ); + expand(line, doExpand, force, visLevels - 1); + } + else + { + if (doExpand) + { + if (!sendEditor(SCI_GETFOLDEXPANDED, line)) + sendEditor(SCI_SETFOLDEXPANDED, line, 1); + expand(line, true, force, visLevels - 1); + } + else + { + expand(line, false, force, visLevels - 1); + } + } + } + else + { + line++; + } + } } void Model::foldChanged(int line, int levelNow, int levelPrev) const { - if (levelNow & SC_FOLDLEVELHEADERFLAG) - { - if (!(levelPrev & SC_FOLDLEVELHEADERFLAG)) - { - sendEditor(SCI_SETFOLDEXPANDED, line, 1); - } - } - else if (levelPrev & SC_FOLDLEVELHEADERFLAG) - { - if (!sendEditor(SCI_GETFOLDEXPANDED, line)) - { - expand(line, true, false, 0, levelPrev); - } - } + if (levelNow & SC_FOLDLEVELHEADERFLAG) + { + if (!(levelPrev & SC_FOLDLEVELHEADERFLAG)) + sendEditor(SCI_SETFOLDEXPANDED, line, 1); + } + else if (levelPrev & SC_FOLDLEVELHEADERFLAG) + { + if (!sendEditor(SCI_GETFOLDEXPANDED, line)) + expand(line, true, false, 0, levelPrev); + } } void Model::onToggleCurrentFold() const { - sendEditor(SCI_TOGGLEFOLD, getCurrentLineNumber()); + sendEditor(SCI_TOGGLEFOLD, getCurrentLineNumber()); } void Model::onToggleAllFolds() const { - sendEditor(SCI_COLOURISE, 0, -1); - int maxLine = getLineCount(); - bool expanding = true; - for (int lineSeek = 0; lineSeek < maxLine; lineSeek++) - { - if (sendEditor(SCI_GETFOLDLEVEL, lineSeek) & SC_FOLDLEVELHEADERFLAG) - { - expanding = !sendEditor(SCI_GETFOLDEXPANDED, lineSeek); - break; - } - } - for (int line = 0; line < maxLine; line++) - { - int level = sendEditor(SCI_GETFOLDLEVEL, line); - if ((level & SC_FOLDLEVELHEADERFLAG) && - (SC_FOLDLEVELBASE == (level & SC_FOLDLEVELNUMBERMASK))) - { - if (expanding) - { - sendEditor(SCI_SETFOLDEXPANDED, line, 1); - expand(line, true, false, 0, level); - line--; - } - else - { - int lineMaxSubord = sendEditor(SCI_GETLASTCHILD, line, -1); - sendEditor(SCI_SETFOLDEXPANDED, line, 0); - if (lineMaxSubord > line) - { - sendEditor(SCI_HIDELINES, line + 1, lineMaxSubord); - } - } - } - } + sendEditor(SCI_COLOURISE, 0, -1); + int maxLine = getLineCount(); + bool expanding = true; + for (int lineSeek = 0; lineSeek < maxLine; lineSeek++) + { + if (sendEditor(SCI_GETFOLDLEVEL, lineSeek) & SC_FOLDLEVELHEADERFLAG) + { + expanding = !sendEditor(SCI_GETFOLDEXPANDED, lineSeek); + break; + } + } + for (int line = 0; line < maxLine; line++) + { + int level = sendEditor(SCI_GETFOLDLEVEL, line); + if ((level & SC_FOLDLEVELHEADERFLAG) && + (SC_FOLDLEVELBASE == (level & SC_FOLDLEVELNUMBERMASK))) + { + if (expanding) + { + sendEditor(SCI_SETFOLDEXPANDED, line, 1); + expand(line, true, false, 0, level); + line--; + } + else + { + int lineMaxSubord = sendEditor(SCI_GETLASTCHILD, line, -1); + sendEditor(SCI_SETFOLDEXPANDED, line, 0); + if (lineMaxSubord > line) + { + sendEditor(SCI_HIDELINES, line + 1, lineMaxSubord); + } + } + } + } } void Model::foldMarginClick(int position, int modifiers) const { - int lineClick = getLineFromPosition(position); - if ((modifiers & SCMOD_SHIFT) && (modifiers & SCMOD_CTRL)) - { - onToggleAllFolds(); - } - else - { - int levelClick = sendEditor(SCI_GETFOLDLEVEL, lineClick); - if (levelClick & SC_FOLDLEVELHEADERFLAG) - { - if (modifiers & SCMOD_SHIFT) - { - // Ensure all children visible - sendEditor(SCI_SETFOLDEXPANDED, lineClick, 1); - expand(lineClick, true, true, 100, levelClick); - } - else if (modifiers & SCMOD_CTRL) - { - if (sendEditor(SCI_GETFOLDEXPANDED, lineClick)) - { - // Contract this line and all children - sendEditor(SCI_SETFOLDEXPANDED, lineClick, 0); - expand(lineClick, false, true, 0, levelClick); - } - else - { - // Expand this line and all children - sendEditor(SCI_SETFOLDEXPANDED, lineClick, 1); - expand(lineClick, true, true, 100, levelClick); - } - } - else - { - // Toggle this line - sendEditor(SCI_TOGGLEFOLD, lineClick); - } - } - } + int lineClick = getLineFromPosition(position); + if ((modifiers & SCMOD_SHIFT) && (modifiers & SCMOD_CTRL)) + { + onToggleAllFolds(); + } + else + { + int levelClick = sendEditor(SCI_GETFOLDLEVEL, lineClick); + if (levelClick & SC_FOLDLEVELHEADERFLAG) + { + if (modifiers & SCMOD_SHIFT) + { + // Ensure all children visible + sendEditor(SCI_SETFOLDEXPANDED, lineClick, 1); + expand(lineClick, true, true, 100, levelClick); + } + else if (modifiers & SCMOD_CTRL) + { + if (sendEditor(SCI_GETFOLDEXPANDED, lineClick)) + { + // Contract this line and all children + sendEditor(SCI_SETFOLDEXPANDED, lineClick, 0); + expand(lineClick, false, true, 0, levelClick); + } + else + { + // Expand this line and all children + sendEditor(SCI_SETFOLDEXPANDED, lineClick, 1); + expand(lineClick, true, true, 100, levelClick); + } + } + else + { + // Toggle this line + sendEditor(SCI_TOGGLEFOLD, lineClick); + } + } + } } void Model::onEditCommentSelection() const { - if (!isSelected()) - return; - - std::string startComment("/*"); - std::string endComment("*/"); - int startCommentLength = startComment.length(); - CharacterRange cr = getSelectionRange(); - int caretPosition = getCurrentPos(); - bool moveCaret = caretPosition < cr.cpMax; - sendEditor(SCI_BEGINUNDOACTION); - sendEditorString(SCI_INSERTTEXT, cr.cpMin, startComment.c_str()); - cr.cpMax += startCommentLength; - cr.cpMin += startCommentLength; - sendEditorString(SCI_INSERTTEXT, cr.cpMax, endComment.c_str()); - if (moveCaret) - { - sendEditor(SCI_GOTOPOS, cr.cpMax); - sendEditor(SCI_SETCURRENTPOS, cr.cpMin); - } - else - { - setSelection(cr.cpMin, cr.cpMax); - } - sendEditor(SCI_ENDUNDOACTION); + if (!isSelected()) + return; + + std::string startComment("/*"); + std::string endComment("*/"); + int startCommentLength = startComment.length(); + CharacterRange cr = getSelectionRange(); + int caretPosition = getCurrentPos(); + bool moveCaret = caretPosition < cr.cpMax; + sendEditor(SCI_BEGINUNDOACTION); + sendEditorString(SCI_INSERTTEXT, cr.cpMin, startComment.c_str()); + cr.cpMax += startCommentLength; + cr.cpMin += startCommentLength; + sendEditorString(SCI_INSERTTEXT, cr.cpMax, endComment.c_str()); + if (moveCaret) + { + sendEditor(SCI_GOTOPOS, cr.cpMax); + sendEditor(SCI_SETCURRENTPOS, cr.cpMin); + } + else + { + setSelection(cr.cpMin, cr.cpMax); + } + sendEditor(SCI_ENDUNDOACTION); } void Model::onEditCompleteWord() { - if (!static_cast(m_pStyle)->autoComplete.useAutoComplete) - return; - - setFocus(); - std::string primaryKwList = getAllKW(); - WordList fullWordList; - fullWordList.Set(primaryKwList.c_str()); - fullWordList.InList(""); - primaryKwList = ""; - - typedef std::vector string_list; - - class compareStringScintilla { - public: - bool operator()(std::string A, std::string B) { - return CompareNCaseInsensitive(A.c_str(), B.c_str(), A.length()) < 0; - } - }; - - compareStringScintilla functor; - - WordListUtil getList(fullWordList); - string_list basicList = getList.getNearestWords(std::string()); - std::sort(basicList.begin(), basicList.end(), functor); - for (string_list::const_iterator it = basicList.begin(); it != basicList.end(); ++it) - { - primaryKwList += *it; - if (it != basicList.end() - 1) - { - primaryKwList += " "; - } - } - char currentLine[8000]; - int line = getCurrentLineNumber(); - sendEditor(SCI_GETLINE, line, reinterpret_cast(currentLine)); - - int currentPos = getCurrentPos() - getPositionFromLine(line); - currentLine[currentPos] = '\0'; - - int startPos = currentPos; - int identifierLength = 0; - std::wstring wCurrentLine = rdo::locale::convertToWStr(currentLine); - std::wstring::const_reverse_iterator wCharIt = wCurrentLine.rbegin(); - while (wCharIt != wCurrentLine.rend()) - { - if (!rdo::gui::lexer::isIdentifier(*wCharIt)) - break; - ++identifierLength; - ++wCharIt; - } - startPos -= rdo::locale::convertFromWStr(wCurrentLine.substr(wCurrentLine.length() - identifierLength)).length(); - - const char* userPattern = currentLine + startPos; - unsigned int userPatternLength = currentPos - startPos; - - string_list prioritySortedKwList = getList.getNearestWords(userPattern); - if (prioritySortedKwList.empty()) - { - prioritySortedKwList = basicList; - } - - string_list::const_iterator it = prioritySortedKwList.begin(); - std::string stWord = *it; - std::sort(prioritySortedKwList.begin(), prioritySortedKwList.end(), functor); - - std::string foundKeyWords = ""; - for (string_list::const_iterator it = prioritySortedKwList.begin(); it != prioritySortedKwList.end(); ++it) - { - foundKeyWords += (*it); - if (it != prioritySortedKwList.end() - 1) - { - foundKeyWords += " "; - } - } - const char* list; - - if (static_cast(m_pStyle)->autoComplete.showFullList) - { - list = primaryKwList.c_str(); - } - else - { - list = foundKeyWords.c_str(); - if (!list) - { - list = primaryKwList.c_str(); - } - } - - if (list) - { - std::string startKeyWord = ""; - std::string startKeyWordScroll = stWord; - bool useReplace = false; - if (foundKeyWords.c_str()) - { - fullWordList.Clear(); - fullWordList.Set(foundKeyWords.c_str()); - fullWordList.InList(""); - startKeyWord = stWord; - if (prioritySortedKwList.size() == 1 && userPatternLength <= startKeyWord.length() && boost::ifind_first(startKeyWord, userPattern).begin() == startKeyWord.begin()) - { - useReplace = true; - } - } - - while (startKeyWord.find('?') != std::string::npos) - { - std::string::size_type pos1 = startKeyWord.find('?'); - std::string::size_type pos2 = startKeyWord.find(' ', pos1); - startKeyWord.erase(pos1, pos2 - pos1); - } - while (startKeyWordScroll.find('?') != std::string::npos) - { - std::string::size_type pos1 = startKeyWordScroll.find('?'); - std::string::size_type pos2 = startKeyWordScroll.find(' ', pos1); - startKeyWordScroll.erase(pos1, pos2 - pos1); - } - - if (useReplace) - { - setSelection (getCurrentPos(), getCurrentPos() - userPatternLength); - replaceCurrent(QString::fromStdString(startKeyWord)); - } - else - { - sendEditor (SCI_AUTOCSHOW, userPatternLength, (long)list); - sendEditorString(SCI_AUTOCSELECT, 0, startKeyWord.c_str()); - } - } + if (!static_cast(m_pStyle)->autoComplete.useAutoComplete) + return; + + setFocus(); + std::string primaryKwList = getAllKW(); + WordList fullWordList; + fullWordList.Set(primaryKwList.c_str()); + fullWordList.InList(""); + primaryKwList = ""; + + typedef std::vector string_list; + + class compareStringScintilla { + public: + bool operator()(std::string A, std::string B) { + return CompareNCaseInsensitive(A.c_str(), B.c_str(), A.length()) < 0; + } + }; + + compareStringScintilla functor; + + WordListUtil getList(fullWordList); + string_list basicList = getList.getNearestWords(std::string()); + std::sort(basicList.begin(), basicList.end(), functor); + for (string_list::const_iterator it = basicList.begin(); it != basicList.end(); ++it) + { + primaryKwList += *it; + if (it != basicList.end() - 1) + { + primaryKwList += " "; + } + } + char currentLine[8000]; + int line = getCurrentLineNumber(); + sendEditor(SCI_GETLINE, line, reinterpret_cast(currentLine)); + + int currentPos = getCurrentPos() - getPositionFromLine(line); + currentLine[currentPos] = '\0'; + + int startPos = currentPos; + int identifierLength = 0; + std::wstring wCurrentLine = rdo::locale::convertToWStr(currentLine); + std::wstring::const_reverse_iterator wCharIt = wCurrentLine.rbegin(); + while (wCharIt != wCurrentLine.rend()) + { + if (!rdo::gui::lexer::isIdentifier(*wCharIt)) + break; + ++identifierLength; + ++wCharIt; + } + startPos -= rdo::locale::convertFromWStr(wCurrentLine.substr(wCurrentLine.length() - identifierLength)).length(); + + const char* userPattern = currentLine + startPos; + unsigned int userPatternLength = currentPos - startPos; + + string_list prioritySortedKwList = getList.getNearestWords(userPattern); + if (prioritySortedKwList.empty()) + { + prioritySortedKwList = basicList; + } + + string_list::const_iterator it = prioritySortedKwList.begin(); + std::string stWord = *it; + std::sort(prioritySortedKwList.begin(), prioritySortedKwList.end(), functor); + + std::string foundKeyWords = ""; + for (string_list::const_iterator it = prioritySortedKwList.begin(); it != prioritySortedKwList.end(); ++it) + { + foundKeyWords += (*it); + if (it != prioritySortedKwList.end() - 1) + { + foundKeyWords += " "; + } + } + const char* list; + + if (static_cast(m_pStyle)->autoComplete.showFullList) + { + list = primaryKwList.c_str(); + } + else + { + list = foundKeyWords.c_str(); + if (!list) + { + list = primaryKwList.c_str(); + } + } + + if (list) + { + std::string startKeyWord = ""; + std::string startKeyWordScroll = stWord; + bool useReplace = false; + if (foundKeyWords.c_str()) + { + fullWordList.Clear(); + fullWordList.Set(foundKeyWords.c_str()); + fullWordList.InList(""); + startKeyWord = stWord; + if (prioritySortedKwList.size() == 1 && userPatternLength <= startKeyWord.length() && boost::ifind_first(startKeyWord, userPattern).begin() == startKeyWord.begin()) + { + useReplace = true; + } + } + + while (startKeyWord.find('?') != std::string::npos) + { + std::string::size_type pos1 = startKeyWord.find('?'); + std::string::size_type pos2 = startKeyWord.find(' ', pos1); + startKeyWord.erase(pos1, pos2 - pos1); + } + while (startKeyWordScroll.find('?') != std::string::npos) + { + std::string::size_type pos1 = startKeyWordScroll.find('?'); + std::string::size_type pos2 = startKeyWordScroll.find(' ', pos1); + startKeyWordScroll.erase(pos1, pos2 - pos1); + } + + if (useReplace) + { + setSelection (getCurrentPos(), getCurrentPos() - userPatternLength); + replaceCurrent(QString::fromStdString(startKeyWord)); + } + else + { + sendEditor (SCI_AUTOCSHOW, userPatternLength, (long)list); + sendEditorString(SCI_AUTOCSELECT, 0, startKeyWord.c_str()); + } + } } void Model::setErrorLine(int line) { - clearErrorLine(); - if (line == -1) - { - line = getCurrentLineNumber(); - } - sendEditor(SCI_MARKERADD, line, m_sciMarkerError); + clearErrorLine(); + if (line == -1) + { + line = getCurrentLineNumber(); + } + sendEditor(SCI_MARKERADD, line, m_sciMarkerError); } void Model::clearErrorLine() { - int nextLine = sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerError); - if (nextLine >= 0) - { - sendEditor(SCI_MARKERDELETE, nextLine, m_sciMarkerError); - QWidget::update(); - } + int nextLine = sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerError); + if (nextLine >= 0) + { + sendEditor(SCI_MARKERDELETE, nextLine, m_sciMarkerError); + QWidget::update(); + } } bool Model::hasErrorLine() const { - int nextLine = sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerError); - return nextLine >= 0; + int nextLine = sendEditor(SCI_MARKERNEXT, 0, 1 << m_sciMarkerError); + return nextLine >= 0; } void Model::onInsertCommand(QObject* pObject) { - MainWindow::InsertMenuData* pInsertMenuData = dynamic_cast(pObject); - ASSERT(pInsertMenuData); - - replaceCurrent( - pInsertMenuData->text(), - pInsertMenuData->position().is_initialized() - ? pInsertMenuData->position().get() - : -1 - ); + MainWindow::InsertMenuData* pInsertMenuData = dynamic_cast(pObject); + ASSERT(pInsertMenuData); + + replaceCurrent( + pInsertMenuData->text(), + pInsertMenuData->position().is_initialized() + ? pInsertMenuData->position().get() + : -1 + ); } const Log* Model::getLog() const { - return m_pLog; + return m_pLog; } void Model::setLog(Log& pLog) { - m_pLog = &pLog; + m_pLog = &pLog; } void Model::setCanClearErrorLine(bool value) { - m_canClearErrorLine = value; + m_canClearErrorLine = value; } void Model::onGotoNext() { - if (m_pLog) - { - m_pLog->gotoNext(); - } + if (m_pLog) + { + m_pLog->gotoNext(); + } } void Model::onGotoPrev() { - if (m_pLog) - { - m_pLog->gotoPrev(); - } + if (m_pLog) + { + m_pLog->gotoPrev(); + } } void Model::onHelpContext() { - std::string keyword = getCurrentOrSelectedWord(); - std::string s = getAllKW(); - - if (s.find_first_of(keyword) == std::string::npos || keyword.empty()) - { - model::TabCtrl* pTab = g_pModel->getTab(); - if (pTab) - { - switch(pTab->getCurrentRDOItem()) - { - case rdo::model::RTP: keyword = "rtp"; break; - case rdo::model::RSS: keyword = "rss"; break; - case rdo::model::EVN: keyword = "evn"; break; - case rdo::model::PAT: keyword = "pat"; break; - case rdo::model::DPT: keyword = "dpt"; break; - case rdo::model::PRC: keyword = "prc"; break; - case rdo::model::FRM: keyword = "frm"; break; - case rdo::model::FUN: keyword = "fun"; break; - case rdo::model::SMR: keyword = "smr"; break; - case rdo::model::PMD: keyword = "pmd"; break; - default: keyword = ""; break; - } - } - } - - QByteArray ba; - ba.append("activateKeyword "); - ba.append(keyword.c_str()); - ba.append("\n"); - g_pApp->callQtAssistant(ba); + std::string keyword = getCurrentOrSelectedWord(); + std::string s = getAllKW(); + + if (s.find_first_of(keyword) == std::string::npos || keyword.empty()) + { + model::TabCtrl* pTab = g_pModel->getTab(); + if (pTab) + { + switch(pTab->getCurrentRDOItem()) + { + case rdo::FileType::RTP: keyword = "rtp"; break; + case rdo::FileType::RSS: keyword = "rss"; break; + case rdo::FileType::EVN: keyword = "evn"; break; + case rdo::FileType::PAT: keyword = "pat"; break; + case rdo::FileType::DPT: keyword = "dpt"; break; + case rdo::FileType::PRC: keyword = "prc"; break; + case rdo::FileType::FRM: keyword = "frm"; break; + case rdo::FileType::FUN: keyword = "fun"; break; + case rdo::FileType::SMR: keyword = "smr"; break; + case rdo::FileType::PMD: keyword = "pmd"; break; + default: keyword = ""; break; + } + } + } + + QByteArray ba; + ba.append("activateKeyword "); + ba.append(keyword.c_str()); + ba.append("\n"); + g_pApp->callQtAssistant(ba); } void Model::onUpdateActions(bool activated) { - super::onUpdateActions(activated); - - MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); - - updateAction( - pMainWindow->actEditCommentSelection, - activated && isSelected(), - this, &Model::onEditCommentSelection - ); - - updateAction( - pMainWindow->actEditCompleteWord, - activated && g_pApp->getStyle()->style_editor.autoComplete.useAutoComplete, - this, &Model::onEditCompleteWord - ); - - updateAction( - pMainWindow->actViewToggleCurrentFold, - activated && !isEmpty(), - this, &Model::onToggleCurrentFold - ); - - updateAction( - pMainWindow->actViewToggleAllFolds, - activated && !isEmpty(), - this, &Model::onToggleAllFolds - ); - - updateAction( - pMainWindow->actSearchLogNext, - activated && m_pLog, - this, &Model::onGotoNext - ); - - updateAction( - pMainWindow->actSearchLogPrev, - activated && m_pLog, - this, &Model::onGotoPrev - ); - - pMainWindow->updateInsertMenu( - activated, - this, &Model::onInsertCommand - ); + super::onUpdateActions(activated); + + MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); + + updateAction( + pMainWindow->actEditCommentSelection, + activated && isSelected(), + this, &Model::onEditCommentSelection + ); + + updateAction( + pMainWindow->actEditCompleteWord, + activated && g_pApp->getStyle()->style_editor.autoComplete.useAutoComplete, + this, &Model::onEditCompleteWord + ); + + updateAction( + pMainWindow->actViewToggleCurrentFold, + activated && !isEmpty(), + this, &Model::onToggleCurrentFold + ); + + updateAction( + pMainWindow->actViewToggleAllFolds, + activated && !isEmpty(), + this, &Model::onToggleAllFolds + ); + + updateAction( + pMainWindow->actSearchLogNext, + activated && m_pLog, + this, &Model::onGotoNext + ); + + updateAction( + pMainWindow->actSearchLogPrev, + activated && m_pLog, + this, &Model::onGotoPrev + ); + + pMainWindow->updateInsertMenu( + activated, + this, &Model::onInsertCommand + ); } void Model::contextMenuEvent(QContextMenuEvent* pEvent) { - m_pPopupMenu->exec(pEvent->globalPos()); + m_pPopupMenu->exec(pEvent->globalPos()); } diff --git a/app/rdo_studio/src/editor/model_edit.h b/app/rdo_studio/src/editor/model_edit.h index 18ecb6a34..f05849375 100644 --- a/app/rdo_studio/src/editor/model_edit.h +++ b/app/rdo_studio/src/editor/model_edit.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_MODEL_EDIT_H_ -#define _RDO_STUDIO_EDITOR_MODEL_EDIT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -19,52 +18,50 @@ class Model: public Parser Q_OBJECT public: - Model(QWidget* pParent, QWidget* pView = NULL); - virtual ~Model(); + Model(QWidget* pParent, QWidget* pView = NULL); + virtual ~Model(); - void setEditorStyle(ModelStyle* pStyle); + void setEditorStyle(ModelStyle* pStyle); - void setErrorLine(int line = -1); + void setErrorLine(int line = -1); - const Log* getLog() const; - void setLog(Log& log); + const Log* getLog() const; + void setLog(Log& log); - void setCanClearErrorLine(bool value); + void setCanClearErrorLine(bool value); private: - typedef Parser super; + typedef Parser super; - QWidget* m_pView; - Log* m_pLog; - QMenu* m_pPopupMenu; - int m_sciFoldMarginID; - int m_sciMarkerError; - bool m_canClearErrorLine; + QWidget* m_pView; + Log* m_pLog; + QMenu* m_pPopupMenu; + int m_sciFoldMarginID; + int m_sciMarkerError; + bool m_canClearErrorLine; - void expand (int& line, bool doExpand, bool force = false, int visLevels = 0, int level = -1) const; - void foldChanged (int line, int levelNow, int levelPrev) const; - void foldMarginClick(int position, int modifiers) const; + void expand (int& line, bool doExpand, bool force = false, int visLevels = 0, int level = -1) const; + void foldChanged (int line, int levelNow, int levelPrev) const; + void foldMarginClick(int position, int modifiers) const; - void clearErrorLine(); - bool hasErrorLine () const; + void clearErrorLine(); + bool hasErrorLine () const; - virtual void contextMenuEvent(QContextMenuEvent* pEvent); - virtual void onUpdateActions (bool activated); - virtual void onHelpContext (); + virtual void contextMenuEvent(QContextMenuEvent* pEvent); + virtual void onUpdateActions (bool activated); + virtual void onHelpContext (); private slots: - void onEditCommentSelection() const; - void onEditCompleteWord (); - void onToggleAllFolds () const; - void onToggleCurrentFold () const; - void onGotoNext (); - void onGotoPrev (); - void onInsertCommand (QObject* pObject); - - void catchModified (int modificationType, int position, int length, int linesAdded, const QByteArray& bytes, int line, int foldLevelNow, int foldLevelPrev); - void catchMarginClick(int position, int modifiers, int margin); + void onEditCommentSelection() const; + void onEditCompleteWord (); + void onToggleAllFolds () const; + void onToggleCurrentFold () const; + void onGotoNext (); + void onGotoPrev (); + void onInsertCommand (QObject* pObject); + + void catchModified (int modificationType, int position, int length, int linesAdded, const QByteArray& bytes, int line, int foldLevelNow, int foldLevelPrev); + void catchMarginClick(int position, int modifiers, int margin); }; }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_MODEL_EDIT_H_ diff --git a/app/rdo_studio/src/editor/model_edit_style.cpp b/app/rdo_studio/src/editor/model_edit_style.cpp index 8a6b564e8..7d2d2e034 100644 --- a/app/rdo_studio/src/editor/model_edit_style.cpp +++ b/app/rdo_studio/src/editor/model_edit_style.cpp @@ -12,8 +12,8 @@ using namespace rdo::gui::editor; // -------------------------------------------------------------------------------- ModelAutoComplete::ModelAutoComplete() { - useAutoComplete = true; - showFullList = true; + useAutoComplete = true; + showFullList = true; } ModelAutoComplete::~ModelAutoComplete() @@ -21,49 +21,49 @@ ModelAutoComplete::~ModelAutoComplete() ModelAutoComplete& ModelAutoComplete::operator =( const ModelAutoComplete& autoComplete ) { - useAutoComplete = autoComplete.useAutoComplete; - showFullList = autoComplete.showFullList; + useAutoComplete = autoComplete.useAutoComplete; + showFullList = autoComplete.showFullList; - return *this; + return *this; } bool ModelAutoComplete::operator ==( const ModelAutoComplete& autoComplete ) const { - return useAutoComplete == autoComplete.useAutoComplete && - showFullList == autoComplete.showFullList; + return useAutoComplete == autoComplete.useAutoComplete && + showFullList == autoComplete.showFullList; } bool ModelAutoComplete::operator !=( const ModelAutoComplete& autoComplete ) const { - return !(*this == autoComplete); + return !(*this == autoComplete); } void ModelAutoComplete::load(QSettings& settings) { - settings >> *this; + settings >> *this; } void ModelAutoComplete::save(QSettings& settings) const { - settings << *this; + settings << *this; } namespace rdo { namespace gui { namespace editor { QSettings& operator<< (QSettings& settings, const ModelAutoComplete& auto_complete) { - settings.setValue("use_auto_complete", auto_complete.useAutoComplete); - settings.setValue("show_full_list", auto_complete.showFullList); + settings.setValue("use_auto_complete", auto_complete.useAutoComplete); + settings.setValue("show_full_list", auto_complete.showFullList); - return settings; + return settings; } QSettings& operator>> (QSettings& settings, ModelAutoComplete& auto_complete) { - auto_complete.useAutoComplete = settings.value("use_auto_complete", auto_complete.useAutoComplete).toBool() ? true : false; - auto_complete.showFullList = settings.value("show_full_list", auto_complete.showFullList).toBool() ? true : false; + auto_complete.useAutoComplete = settings.value("use_auto_complete", auto_complete.useAutoComplete).toBool() ? true : false; + auto_complete.showFullList = settings.value("show_full_list", auto_complete.showFullList).toBool() ? true : false; - return settings; + return settings; } }}} // namespace rdo::gui::editor @@ -73,9 +73,9 @@ QSettings& operator>> (QSettings& settings, ModelAutoComplete& auto_complete) // -------------------------------------------------------------------------------- ModelMargin::ModelMargin() { - fold = true; - bookmark = true; - lineNumber = false; + fold = true; + bookmark = true; + lineNumber = false; } ModelMargin::~ModelMargin() @@ -83,53 +83,53 @@ ModelMargin::~ModelMargin() ModelMargin& ModelMargin::operator =( const ModelMargin& margin ) { - fold = margin.fold; - bookmark = margin.bookmark; - lineNumber = margin.lineNumber; + fold = margin.fold; + bookmark = margin.bookmark; + lineNumber = margin.lineNumber; - return *this; + return *this; } bool ModelMargin::operator ==( const ModelMargin& margin ) const { - return fold == margin.fold && - bookmark == margin.bookmark && - lineNumber == margin.lineNumber; + return fold == margin.fold && + bookmark == margin.bookmark && + lineNumber == margin.lineNumber; } bool ModelMargin::operator !=( const ModelMargin& margin ) const { - return !(*this == margin); + return !(*this == margin); } void ModelMargin::load(QSettings& settings) { - settings >> *this; + settings >> *this; } void ModelMargin::save(QSettings& settings) const { - settings << *this; + settings << *this; } namespace rdo { namespace gui { namespace editor { QSettings& operator<< (QSettings& settings, const ModelMargin& margin) { - settings.setValue("fold", margin.fold); - settings.setValue("bookmark", margin.bookmark); - settings.setValue("line_number", margin.lineNumber); + settings.setValue("fold", margin.fold); + settings.setValue("bookmark", margin.bookmark); + settings.setValue("line_number", margin.lineNumber); - return settings; + return settings; } QSettings& operator>> (QSettings& settings, ModelMargin& margin) { - margin.fold = settings.value("fold", margin.fold).toBool() ? true : false; - margin.bookmark = settings.value("bookmark", margin.bookmark).toBool() ? true : false; - margin.lineNumber = settings.value("line_number", margin.lineNumber).toBool() ? true : false; + margin.fold = settings.value("fold", margin.fold).toBool() ? true : false; + margin.bookmark = settings.value("bookmark", margin.bookmark).toBool() ? true : false; + margin.lineNumber = settings.value("line_number", margin.lineNumber).toBool() ? true : false; - return settings; + return settings; } }}} // namespace rdo::gui::editor @@ -138,17 +138,17 @@ QSettings& operator>> (QSettings& settings, ModelMargin& margin) // -------------------- ModelStyle // -------------------------------------------------------------------------------- ModelStyle::ModelStyle(): - ParserStyle(), - autoComplete(), - margin() + ParserStyle(), + autoComplete(), + margin() { - foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); - foldBgColor = QColor( 0x00, 0x00, 0x00 ); + foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); + foldBgColor = QColor( 0x00, 0x00, 0x00 ); - errorBgColor = QColor( 0xFF, 0x80, 0x80 ); + errorBgColor = QColor( 0xFF, 0x80, 0x80 ); - foldStyle = F_PLUS; - commentFold = false; + foldStyle = Fold::PLUS; + commentFold = false; } ModelStyle::~ModelStyle() @@ -157,182 +157,182 @@ ModelStyle::~ModelStyle() ModelStyle& ModelStyle::operator =( const ModelStyle& style ) { - ParserStyle::operator=( style ); - - foldFgColor = style.foldFgColor; - foldBgColor = style.foldBgColor; + ParserStyle::operator=( style ); - errorBgColor = style.errorBgColor; + foldFgColor = style.foldFgColor; + foldBgColor = style.foldBgColor; - foldStyle = style.foldStyle; - commentFold = style.commentFold; - autoComplete = style.autoComplete; - margin = style.margin; + errorBgColor = style.errorBgColor; - return *this; + foldStyle = style.foldStyle; + commentFold = style.commentFold; + autoComplete = style.autoComplete; + margin = style.margin; + + return *this; } bool ModelStyle::operator ==( const ModelStyle& style ) const { - bool flag = ParserStyle::operator==( style ); - flag &= autoComplete == style.autoComplete; - flag &= margin == style.margin; - if ( flag ) flag &= foldFgColor == style.foldFgColor && - foldBgColor == style.foldBgColor && - errorBgColor == style.errorBgColor && - foldStyle == style.foldStyle && - commentFold == style.commentFold; - return flag; + bool flag = ParserStyle::operator==( style ); + flag &= autoComplete == style.autoComplete; + flag &= margin == style.margin; + if ( flag ) flag &= foldFgColor == style.foldFgColor && + foldBgColor == style.foldBgColor && + errorBgColor == style.errorBgColor && + foldStyle == style.foldStyle && + commentFold == style.commentFold; + return flag; } bool ModelStyle::operator !=( const ModelStyle& style ) const { - return !(*this == style); + return !(*this == style); } ModelStyle ModelStyle::getDefaultStyle() { - ModelStyle style; - return style; + ModelStyle style; + return style; } ModelStyle ModelStyle::getCppStyle() { - ModelStyle style; - *static_cast(&style) = ParserStyle::getCppStyle(); + ModelStyle style; + *static_cast(&style) = ParserStyle::getCppStyle(); - style.foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); - style.foldBgColor = QColor( 0x00, 0x00, 0x00 ); - style.errorBgColor = QColor( 0xFF, 0x80, 0x80 ); + style.foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); + style.foldBgColor = QColor( 0x00, 0x00, 0x00 ); + style.errorBgColor = QColor( 0xFF, 0x80, 0x80 ); - style.foldStyle = F_PLUS; - style.commentFold = false; + style.foldStyle = Fold::PLUS; + style.commentFold = false; - return style; + return style; } ModelStyle ModelStyle::getPascalStyle() { - ModelStyle style; - *static_cast(&style) = ParserStyle::getPascalStyle(); + ModelStyle style; + *static_cast(&style) = ParserStyle::getPascalStyle(); - style.foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); - style.foldBgColor = QColor( 0x00, 0x00, 0x00 ); - style.errorBgColor = QColor( 0xFF, 0x80, 0x80 ); + style.foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); + style.foldBgColor = QColor( 0x00, 0x00, 0x00 ); + style.errorBgColor = QColor( 0xFF, 0x80, 0x80 ); - style.foldStyle = F_PLUS; - style.commentFold = false; + style.foldStyle = Fold::PLUS; + style.commentFold = false; - return style; + return style; } ModelStyle ModelStyle::getHtmlStyle() { - ModelStyle style; - *static_cast(&style) = ParserStyle::getHtmlStyle(); + ModelStyle style; + *static_cast(&style) = ParserStyle::getHtmlStyle(); - style.foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); - style.foldBgColor = QColor( 0x00, 0x00, 0x00 ); - style.errorBgColor = QColor( 0xFF, 0x80, 0x80 ); + style.foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); + style.foldBgColor = QColor( 0x00, 0x00, 0x00 ); + style.errorBgColor = QColor( 0xFF, 0x80, 0x80 ); - style.foldStyle = F_PLUS; - style.commentFold = false; + style.foldStyle = Fold::PLUS; + style.commentFold = false; - return style; + return style; } ModelStyle ModelStyle::getClassicStyle() { - ModelStyle style; - *static_cast(&style) = ParserStyle::getClassicStyle(); + ModelStyle style; + *static_cast(&style) = ParserStyle::getClassicStyle(); - style.foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); - style.foldBgColor = QColor( 0x00, 0x00, 0x00 ); - style.errorBgColor = QColor( 0xE6, 0x05, 0xF8 ); + style.foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); + style.foldBgColor = QColor( 0x00, 0x00, 0x00 ); + style.errorBgColor = QColor( 0xE6, 0x05, 0xF8 ); - style.foldStyle = F_PLUS; - style.commentFold = false; + style.foldStyle = Fold::PLUS; + style.commentFold = false; - return style; + return style; } ModelStyle ModelStyle::getTwilightStyle() { - ModelStyle style; - *static_cast(&style) = ParserStyle::getTwilightStyle(); + ModelStyle style; + *static_cast(&style) = ParserStyle::getTwilightStyle(); - style.foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); - style.foldBgColor = QColor( 0x00, 0x00, 0x00 ); - style.errorBgColor = QColor( 0xFF, 0x80, 0x80 ); + style.foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); + style.foldBgColor = QColor( 0x00, 0x00, 0x00 ); + style.errorBgColor = QColor( 0xFF, 0x80, 0x80 ); - style.foldStyle = F_PLUS; - style.commentFold = false; + style.foldStyle = Fold::PLUS; + style.commentFold = false; - return style; + return style; } ModelStyle ModelStyle::getOceanStyle() { - ModelStyle style; - *static_cast(&style) = ParserStyle::getOceanStyle(); + ModelStyle style; + *static_cast(&style) = ParserStyle::getOceanStyle(); - style.foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); - style.foldBgColor = QColor( 0x00, 0x00, 0x00 ); - style.errorBgColor = QColor( 0xFF, 0xFF, 0x00 ); + style.foldFgColor = QColor( 0xFF, 0xFF, 0xFF ); + style.foldBgColor = QColor( 0x00, 0x00, 0x00 ); + style.errorBgColor = QColor( 0xFF, 0xFF, 0x00 ); - style.foldStyle = F_PLUS; - style.commentFold = false; + style.foldStyle = Fold::PLUS; + style.commentFold = false; - return style; + return style; } namespace rdo { namespace gui { namespace editor { QSettings& operator<< (QSettings& settings, const ModelStyle& style) { - settings << static_cast(style); + settings << static_cast(style); - settings.beginGroup("theme"); - settings.setValue("fold_fg_color", style.foldFgColor.name()); - settings.setValue("fold_bg_color", style.foldBgColor.name()); - settings.setValue("error_bg_color", style.errorBgColor.name()); - settings.setValue("fold_style", style.foldStyle); - settings.setValue("comment_fold", style.commentFold); - settings.endGroup(); + settings.beginGroup("theme"); + settings.setValue("fold_fg_color", style.foldFgColor.name()); + settings.setValue("fold_bg_color", style.foldBgColor.name()); + settings.setValue("error_bg_color", style.errorBgColor.name()); + settings.setValue("fold_style", static_cast(style.foldStyle)); + settings.setValue("comment_fold", style.commentFold); + settings.endGroup(); - settings.beginGroup("auto_complete"); - settings << style.autoComplete; - settings.endGroup(); + settings.beginGroup("auto_complete"); + settings << style.autoComplete; + settings.endGroup(); - settings.beginGroup("margin"); - settings << style.margin; - settings.endGroup(); + settings.beginGroup("margin"); + settings << style.margin; + settings.endGroup(); - return settings; + return settings; } QSettings& operator>> (QSettings& settings, ModelStyle& style) { - settings >> static_cast(style); + settings >> static_cast(style); - settings.beginGroup("theme"); - style.foldFgColor = QColor(settings.value("fold_fg_color", style.foldFgColor.name()).toString()); - style.foldBgColor = QColor(settings.value("fold_bg_color", style.foldBgColor.name()).toString()); - style.errorBgColor = QColor(settings.value("error_bg_color", style.errorBgColor.name()).toString()); - style.foldStyle = (ModelStyle::Fold)settings.value("fold_style", style.foldStyle).toInt(); - style.commentFold = settings.value("comment_fold", style.commentFold).toBool() ? true : false; - settings.endGroup(); + settings.beginGroup("theme"); + style.foldFgColor = QColor(settings.value("fold_fg_color", style.foldFgColor.name()).toString()); + style.foldBgColor = QColor(settings.value("fold_bg_color", style.foldBgColor.name()).toString()); + style.errorBgColor = QColor(settings.value("error_bg_color", style.errorBgColor.name()).toString()); + style.foldStyle = static_cast(settings.value("fold_style", static_cast(style.foldStyle)).toInt()); + style.commentFold = settings.value("comment_fold", style.commentFold).toBool() ? true : false; + settings.endGroup(); - settings.beginGroup("auto_complete"); - settings >> style.autoComplete; - settings.endGroup(); + settings.beginGroup("auto_complete"); + settings >> style.autoComplete; + settings.endGroup(); - settings.beginGroup("margin"); - settings >> style.margin; - settings.endGroup(); + settings.beginGroup("margin"); + settings >> style.margin; + settings.endGroup(); - return settings; + return settings; } }}} // namespace rdo::gui::editor \ No newline at end of file diff --git a/app/rdo_studio/src/editor/model_edit_style.h b/app/rdo_studio/src/editor/model_edit_style.h index 5ebada5f2..e410aff2c 100644 --- a/app/rdo_studio/src/editor/model_edit_style.h +++ b/app/rdo_studio/src/editor/model_edit_style.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_MODEL_EDIT_STYLE_H_ -#define _RDO_STUDIO_EDITOR_MODEL_EDIT_STYLE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,18 +12,18 @@ namespace rdo { namespace gui { namespace editor { class ModelAutoComplete { public: - ModelAutoComplete(); - virtual ~ModelAutoComplete(); + ModelAutoComplete(); + virtual ~ModelAutoComplete(); - ModelAutoComplete& operator =( const ModelAutoComplete& autoComplete ); - bool operator ==( const ModelAutoComplete& autoComplete ) const; - bool operator !=( const ModelAutoComplete& autoComplete ) const; + ModelAutoComplete& operator =( const ModelAutoComplete& autoComplete ); + bool operator ==( const ModelAutoComplete& autoComplete ) const; + bool operator !=( const ModelAutoComplete& autoComplete ) const; - void load(QSettings& settings); - void save(QSettings& settings) const; + void load(QSettings& settings); + void save(QSettings& settings) const; - bool useAutoComplete; - bool showFullList; + bool useAutoComplete; + bool showFullList; }; QSettings& operator<< (QSettings& settings, const ModelAutoComplete& auto_complete); @@ -36,19 +35,19 @@ QSettings& operator>> (QSettings& settings, ModelAutoComplete& auto_comple class ModelMargin { public: - ModelMargin(); - virtual ~ModelMargin(); + ModelMargin(); + virtual ~ModelMargin(); - ModelMargin& operator =( const ModelMargin& margin ); - bool operator ==( const ModelMargin& margin ) const; - bool operator !=( const ModelMargin& margin ) const; + ModelMargin& operator =( const ModelMargin& margin ); + bool operator ==( const ModelMargin& margin ) const; + bool operator !=( const ModelMargin& margin ) const; - void load(QSettings& settings); - void save(QSettings& settings) const; + void load(QSettings& settings); + void save(QSettings& settings) const; - bool fold; - bool bookmark; - bool lineNumber; + bool fold; + bool bookmark; + bool lineNumber; }; QSettings& operator<< (QSettings& settings, const ModelMargin& margin); @@ -62,40 +61,40 @@ class ModelStyle: public ParserStyle protected: public: - enum Fold - { - F_NONE = 0, - F_PLUS, - F_PLUSCONNECTED, - F_ARROW, - F_ARROWCONNECTED, - F_BOXCONNECTED, - F_CIRCLECONNECTED - }; - - ModelStyle(); - ~ModelStyle(); - - ModelStyle& operator =( const ModelStyle& style ); - bool operator ==( const ModelStyle& style ) const; - bool operator !=( const ModelStyle& style ) const; - - ModelAutoComplete autoComplete; - ModelMargin margin; - - QColor foldFgColor; - QColor foldBgColor; - QColor errorBgColor; - Fold foldStyle; - bool commentFold; - - static ModelStyle getDefaultStyle(); - static ModelStyle getCppStyle(); - static ModelStyle getPascalStyle(); - static ModelStyle getHtmlStyle(); - static ModelStyle getClassicStyle(); - static ModelStyle getTwilightStyle(); - static ModelStyle getOceanStyle(); + enum class Fold + { + NONE = 0, + PLUS, + PLUS_CONNECTED, + ARROW, + ARROW_CONNECTED, + BOX_CONNECTED, + CIRCLE_CONNECTED + }; + + ModelStyle(); + ~ModelStyle(); + + ModelStyle& operator =( const ModelStyle& style ); + bool operator ==( const ModelStyle& style ) const; + bool operator !=( const ModelStyle& style ) const; + + ModelAutoComplete autoComplete; + ModelMargin margin; + + QColor foldFgColor; + QColor foldBgColor; + QColor errorBgColor; + Fold foldStyle; + bool commentFold; + + static ModelStyle getDefaultStyle(); + static ModelStyle getCppStyle(); + static ModelStyle getPascalStyle(); + static ModelStyle getHtmlStyle(); + static ModelStyle getClassicStyle(); + static ModelStyle getTwilightStyle(); + static ModelStyle getOceanStyle(); }; @@ -105,5 +104,3 @@ QSettings& operator<< (QSettings& settings, const ModelStyle& style); QSettings& operator>> (QSettings& settings, ModelStyle& style); }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_MODEL_EDIT_STYLE_H_ diff --git a/app/rdo_studio/src/editor/parser_edit.cpp b/app/rdo_studio/src/editor/parser_edit.cpp index 1d9658224..cb81b4b8a 100644 --- a/app/rdo_studio/src/editor/parser_edit.cpp +++ b/app/rdo_studio/src/editor/parser_edit.cpp @@ -14,8 +14,8 @@ using namespace rdo::gui::editor; using namespace rdo::gui::style; Parser::Parser(QWidget* pParent) - : super(pParent) - , kw0("$Activities?0 $Back_picture?0 $Body?0 $Changes?0 $Compare_tops?0 $Condition?0 \ + : super(pParent) + , kw0("$Activities?0 $Back_picture?0 $Body?0 $Changes?0 $Compare_tops?0 $Condition?0 \ $Constant?0 $Decision_point?0 $Default?0 $End?0 $End_picture?0 $Evaluate_by?0 $Frame?0 $Function?0 \ $Include?0 $Multithreading?0 $multithreading?0 $Operations?0 $Parameters?0 $Fuzzy_Parameters?0 Term?0 $Pattern?0 $Process?0 $Relevant_resources?0 $Resource_type?0 \ $Resources?0 $Result_values?0 $Results?0 $Sequence?0 $Status?0 $Term_condition?0 $Time?0 $Tracing?0 \ @@ -33,29 +33,29 @@ Terminate_if?0 text?0 Time_now?0 Trace_EndTime?2 Trace_file?2 Trace_StartTime?2 uniform?0 until?0 value?0 watch_par?0 watch_quant?0 watch_state?0 watch_value?0 with_max?0 \ with_min?0 YES?0 Seed?0 Системное_время?0 not?0 if?0 else?0 for?0 return?0 break?0 result?0 ruler?0 space?0 string?0 bool?0 true?0 false?0 \ External_Model?0 external_model?0 $Priority?0 $Parent?0 prior?0 cf?0 Terminate_counter?0 typedef?0 $Typedef?0 $Sprite?0") - , kw1("Abs?1 ArcCos?1 ArcSin?1 ArcTan?1 Cos?1 Cotan?1 Exist?1 Exp?1 Floor?1 For_All?1 Frac?1 \ + , kw1("Abs?1 ArcCos?1 ArcSin?1 ArcTan?1 Cos?1 Cotan?1 Exist?1 Exp?1 Floor?1 For_All?1 Frac?1 \ GetRelResNumber?1 GetResNumber?1 IAbs?1 IMax?1 IMin?1 Int?1 IntPower?1 Ln?1 Log10?1 Log2?1 LogN?1 Max?1 Min?1 \ Not_Exist?1 Not_For_All?1 Power?1 Round?1 Sin?1 Sqrt?1 Tan?1 Select?1 Size?1 Empty?1") - , kw2("no_trace?2 trace?2 trace_all?2 trace_stat?2 trace_tops?2") - , kw3("transparent last white black red green blue cyan magenta yellow gray") + , kw2("no_trace?2 trace?2 trace_all?2 trace_stat?2 trace_tops?2") + , kw3("transparent last white black red green blue cyan magenta yellow gray") { - sendEditor(SCI_SETLEXER, SCLEX_RDO); - sendEditor(SCI_GETLEXER); + sendEditor(SCI_SETLEXER, SCLEX_RDO); + sendEditor(SCI_GETLEXER); - sendEditorString(SCI_SETPROPERTY, reinterpret_cast("fold"), "1"); + sendEditorString(SCI_SETPROPERTY, reinterpret_cast("fold"), "1"); - sendEditor(SCI_SETMARGINWIDTHN, 1, 0); + sendEditor(SCI_SETMARGINWIDTHN, 1, 0); - sendEditor(SCI_SETSTYLEBITS, 5); + sendEditor(SCI_SETSTYLEBITS, 5); - sendEditorString(SCI_SETKEYWORDS, 0, Parser::convertToLexer(kw0).c_str()); - sendEditorString(SCI_SETKEYWORDS, 1, Parser::convertToLexer(kw1).c_str()); - sendEditorString(SCI_SETKEYWORDS, 2, Parser::convertToLexer(kw2).c_str()); - sendEditorString(SCI_SETKEYWORDS, 3, Parser::convertToLexer(kw3).c_str()); + sendEditorString(SCI_SETKEYWORDS, 0, Parser::convertToLexer(kw0).c_str()); + sendEditorString(SCI_SETKEYWORDS, 1, Parser::convertToLexer(kw1).c_str()); + sendEditorString(SCI_SETKEYWORDS, 2, Parser::convertToLexer(kw2).c_str()); + sendEditorString(SCI_SETKEYWORDS, 3, Parser::convertToLexer(kw3).c_str()); - sendEditor(SCI_REGISTERIMAGE, 0, reinterpret_cast(xpm_ac_function)); - sendEditor(SCI_REGISTERIMAGE, 1, reinterpret_cast(xpm_ac_data)); - sendEditor(SCI_REGISTERIMAGE, 2, reinterpret_cast(xpm_ac_trace)); + sendEditor(SCI_REGISTERIMAGE, 0, reinterpret_cast(xpm_ac_function)); + sendEditor(SCI_REGISTERIMAGE, 1, reinterpret_cast(xpm_ac_data)); + sendEditor(SCI_REGISTERIMAGE, 2, reinterpret_cast(xpm_ac_trace)); } Parser::~Parser() @@ -63,129 +63,129 @@ Parser::~Parser() std::string Parser::getAllKW() const { - return rdo::format("%s %s %s %s", kw0.c_str(), kw1.c_str(), kw2.c_str(), kw3.c_str()); + return rdo::format("%s %s %s %s", kw0.c_str(), kw1.c_str(), kw2.c_str(), kw3.c_str()); } std::string Parser::convertToLexer(const std::string& kw) { - std::string s = kw; - while (s.find('?') != std::string::npos) - { - std::string::size_type pos1 = s.find('?'); - std::string::size_type pos2 = s.find(' ', pos1); - s.erase(pos1, pos2 - pos1); - } - std::string str_big = boost::algorithm::to_lower_copy(s); - return str_big + " " + s; + std::string s = kw; + while (s.find('?') != std::string::npos) + { + std::string::size_type pos1 = s.find('?'); + std::string::size_type pos2 = s.find(' ', pos1); + s.erase(pos1, pos2 - pos1); + } + std::string str_big = boost::algorithm::to_lower_copy(s); + return str_big + " " + s; } void Parser::setEditorStyle(ParserStyle* pStyle) { - super::setEditorStyle(pStyle); - if (!m_pStyle) - return; - - // ---------- - // Colors - sendEditor(SCI_STYLESETFORE, SCE_RDO_DEFAULT, convertColor(static_cast(m_pStyle)->defaultColor)); - sendEditor(SCI_STYLESETBACK, SCE_RDO_DEFAULT, convertColor(static_cast(m_pStyle)->backgroundColor)); - sendEditor(SCI_STYLESETFORE, SCE_RDO_IDENTIFIER, convertColor(static_cast(m_pStyle)->identifierColor)); - sendEditor(SCI_STYLESETBACK, SCE_RDO_IDENTIFIER, convertColor(static_cast(m_pStyle)->backgroundColor)); - sendEditor(SCI_STYLESETFORE, SCE_RDO_KEYWORD, convertColor(static_cast(m_pStyle)->keywordColor)); - sendEditor(SCI_STYLESETBACK, SCE_RDO_KEYWORD, convertColor(static_cast(m_pStyle)->backgroundColor)); - sendEditor(SCI_STYLESETFORE, SCE_RDO_FUNCTION, convertColor(static_cast(m_pStyle)->functionsColor)); - sendEditor(SCI_STYLESETBACK, SCE_RDO_FUNCTION, convertColor(static_cast(m_pStyle)->backgroundColor)); - sendEditor(SCI_STYLESETFORE, SCE_RDO_TRACE, convertColor(static_cast(m_pStyle)->traceColor)); - sendEditor(SCI_STYLESETBACK, SCE_RDO_TRACE, convertColor(static_cast(m_pStyle)->backgroundColor)); - sendEditor(SCI_STYLESETFORE, SCE_RDO_FRAME_COLOR, convertColor(static_cast(m_pStyle)->colorColor)); - sendEditor(SCI_STYLESETBACK, SCE_RDO_FRAME_COLOR, convertColor(static_cast(m_pStyle)->backgroundColor)); - sendEditor(SCI_STYLESETFORE, SCE_RDO_COMMENT_CPP, convertColor(static_cast(m_pStyle)->commentColor)); - sendEditor(SCI_STYLESETBACK, SCE_RDO_COMMENT_CPP, convertColor(static_cast(m_pStyle)->backgroundColor)); - sendEditor(SCI_STYLESETFORE, SCE_RDO_COMMENT_LINE, convertColor(static_cast(m_pStyle)->commentColor)); - sendEditor(SCI_STYLESETBACK, SCE_RDO_COMMENT_LINE, convertColor(static_cast(m_pStyle)->backgroundColor)); - sendEditor(SCI_STYLESETFORE, SCE_RDO_NUMBER, convertColor(static_cast(m_pStyle)->numberColor)); - sendEditor(SCI_STYLESETBACK, SCE_RDO_NUMBER, convertColor(static_cast(m_pStyle)->backgroundColor)); - sendEditor(SCI_STYLESETFORE, SCE_RDO_STRING, convertColor(static_cast(m_pStyle)->stringColor)); - sendEditor(SCI_STYLESETBACK, SCE_RDO_STRING, convertColor(static_cast(m_pStyle)->backgroundColor)); - sendEditor(SCI_STYLESETFORE, SCE_RDO_OPERATOR, convertColor(static_cast(m_pStyle)->operatorColor)); - sendEditor(SCI_STYLESETBACK, SCE_RDO_OPERATOR, convertColor(static_cast(m_pStyle)->backgroundColor)); - - // ---------- - // Styles - sendEditor(SCI_STYLESETBOLD , SCE_RDO_DEFAULT, static_cast(m_pStyle)->defaultStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_RDO_DEFAULT, static_cast(m_pStyle)->defaultStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_DEFAULT, static_cast(m_pStyle)->defaultStyle & StyleFont::UNDERLINE); - sendEditor(SCI_STYLESETBOLD , SCE_RDO_IDENTIFIER, static_cast(m_pStyle)->identifierStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_RDO_IDENTIFIER, static_cast(m_pStyle)->identifierStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_IDENTIFIER, static_cast(m_pStyle)->identifierStyle & StyleFont::UNDERLINE); - sendEditor(SCI_STYLESETBOLD , SCE_RDO_KEYWORD, static_cast(m_pStyle)->keywordStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_RDO_KEYWORD, static_cast(m_pStyle)->keywordStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_KEYWORD, static_cast(m_pStyle)->keywordStyle & StyleFont::UNDERLINE); - sendEditor(SCI_STYLESETBOLD , SCE_RDO_FUNCTION, static_cast(m_pStyle)->functionsStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_RDO_FUNCTION, static_cast(m_pStyle)->functionsStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_FUNCTION, static_cast(m_pStyle)->functionsStyle & StyleFont::UNDERLINE); - sendEditor(SCI_STYLESETBOLD , SCE_RDO_TRACE, static_cast(m_pStyle)->traceStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_RDO_TRACE, static_cast(m_pStyle)->traceStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_TRACE, static_cast(m_pStyle)->traceStyle & StyleFont::UNDERLINE); - sendEditor(SCI_STYLESETBOLD , SCE_RDO_FRAME_COLOR, static_cast(m_pStyle)->colorStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_RDO_FRAME_COLOR, static_cast(m_pStyle)->colorStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_FRAME_COLOR, static_cast(m_pStyle)->colorStyle & StyleFont::UNDERLINE); - sendEditor(SCI_STYLESETBOLD , SCE_RDO_COMMENT_CPP, static_cast(m_pStyle)->commentStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_RDO_COMMENT_CPP, static_cast(m_pStyle)->commentStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_COMMENT_CPP, static_cast(m_pStyle)->commentStyle & StyleFont::UNDERLINE); - sendEditor(SCI_STYLESETBOLD , SCE_RDO_COMMENT_LINE, static_cast(m_pStyle)->commentStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_RDO_COMMENT_LINE, static_cast(m_pStyle)->commentStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_COMMENT_LINE, static_cast(m_pStyle)->commentStyle & StyleFont::UNDERLINE); - sendEditor(SCI_STYLESETBOLD , SCE_RDO_NUMBER, static_cast(m_pStyle)->numberStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_RDO_NUMBER, static_cast(m_pStyle)->numberStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_NUMBER, static_cast(m_pStyle)->numberStyle & StyleFont::UNDERLINE); - sendEditor(SCI_STYLESETBOLD , SCE_RDO_STRING, static_cast(m_pStyle)->stringStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_RDO_STRING, static_cast(m_pStyle)->stringStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_STRING, static_cast(m_pStyle)->stringStyle & StyleFont::UNDERLINE); - sendEditor(SCI_STYLESETBOLD , SCE_RDO_OPERATOR, static_cast(m_pStyle)->operatorStyle & StyleFont::BOLD ); - sendEditor(SCI_STYLESETITALIC , SCE_RDO_OPERATOR, static_cast(m_pStyle)->operatorStyle & StyleFont::ITALIC ); - sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_OPERATOR, static_cast(m_pStyle)->operatorStyle & StyleFont::UNDERLINE); - - // ---------- - // Font Name - sendEditorString(SCI_STYLESETFONT, SCE_RDO_DEFAULT, m_pStyle->font.name.c_str()); - sendEditorString(SCI_STYLESETFONT, SCE_RDO_IDENTIFIER, m_pStyle->font.name.c_str()); - sendEditorString(SCI_STYLESETFONT, SCE_RDO_KEYWORD, m_pStyle->font.name.c_str()); - sendEditorString(SCI_STYLESETFONT, SCE_RDO_FUNCTION, m_pStyle->font.name.c_str()); - sendEditorString(SCI_STYLESETFONT, SCE_RDO_TRACE, m_pStyle->font.name.c_str()); - sendEditorString(SCI_STYLESETFONT, SCE_RDO_FRAME_COLOR, m_pStyle->font.name.c_str()); - sendEditorString(SCI_STYLESETFONT, SCE_RDO_COMMENT_CPP, m_pStyle->font.name.c_str()); - sendEditorString(SCI_STYLESETFONT, SCE_RDO_COMMENT_LINE, m_pStyle->font.name.c_str()); - sendEditorString(SCI_STYLESETFONT, SCE_RDO_NUMBER, m_pStyle->font.name.c_str()); - sendEditorString(SCI_STYLESETFONT, SCE_RDO_STRING, m_pStyle->font.name.c_str()); - sendEditorString(SCI_STYLESETFONT, SCE_RDO_OPERATOR, m_pStyle->font.name.c_str()); - - // ---------- - // Font Size - sendEditor(SCI_STYLESETSIZE, SCE_RDO_DEFAULT, m_pStyle->font.size); - sendEditor(SCI_STYLESETSIZE, SCE_RDO_IDENTIFIER, m_pStyle->font.size); - sendEditor(SCI_STYLESETSIZE, SCE_RDO_KEYWORD, m_pStyle->font.size); - sendEditor(SCI_STYLESETSIZE, SCE_RDO_FUNCTION, m_pStyle->font.size); - sendEditor(SCI_STYLESETSIZE, SCE_RDO_TRACE, m_pStyle->font.size); - sendEditor(SCI_STYLESETSIZE, SCE_RDO_FRAME_COLOR, m_pStyle->font.size); - sendEditor(SCI_STYLESETSIZE, SCE_RDO_COMMENT_CPP, m_pStyle->font.size); - sendEditor(SCI_STYLESETSIZE, SCE_RDO_COMMENT_LINE, m_pStyle->font.size); - sendEditor(SCI_STYLESETSIZE, SCE_RDO_NUMBER, m_pStyle->font.size); - sendEditor(SCI_STYLESETSIZE, SCE_RDO_STRING, m_pStyle->font.size); - sendEditor(SCI_STYLESETSIZE, SCE_RDO_OPERATOR, m_pStyle->font.size); + super::setEditorStyle(pStyle); + if (!m_pStyle) + return; + + // ---------- + // Colors + sendEditor(SCI_STYLESETFORE, SCE_RDO_DEFAULT, convertColor(static_cast(m_pStyle)->defaultColor)); + sendEditor(SCI_STYLESETBACK, SCE_RDO_DEFAULT, convertColor(static_cast(m_pStyle)->backgroundColor)); + sendEditor(SCI_STYLESETFORE, SCE_RDO_IDENTIFIER, convertColor(static_cast(m_pStyle)->identifierColor)); + sendEditor(SCI_STYLESETBACK, SCE_RDO_IDENTIFIER, convertColor(static_cast(m_pStyle)->backgroundColor)); + sendEditor(SCI_STYLESETFORE, SCE_RDO_KEYWORD, convertColor(static_cast(m_pStyle)->keywordColor)); + sendEditor(SCI_STYLESETBACK, SCE_RDO_KEYWORD, convertColor(static_cast(m_pStyle)->backgroundColor)); + sendEditor(SCI_STYLESETFORE, SCE_RDO_FUNCTION, convertColor(static_cast(m_pStyle)->functionsColor)); + sendEditor(SCI_STYLESETBACK, SCE_RDO_FUNCTION, convertColor(static_cast(m_pStyle)->backgroundColor)); + sendEditor(SCI_STYLESETFORE, SCE_RDO_TRACE, convertColor(static_cast(m_pStyle)->traceColor)); + sendEditor(SCI_STYLESETBACK, SCE_RDO_TRACE, convertColor(static_cast(m_pStyle)->backgroundColor)); + sendEditor(SCI_STYLESETFORE, SCE_RDO_FRAME_COLOR, convertColor(static_cast(m_pStyle)->colorColor)); + sendEditor(SCI_STYLESETBACK, SCE_RDO_FRAME_COLOR, convertColor(static_cast(m_pStyle)->backgroundColor)); + sendEditor(SCI_STYLESETFORE, SCE_RDO_COMMENT_CPP, convertColor(static_cast(m_pStyle)->commentColor)); + sendEditor(SCI_STYLESETBACK, SCE_RDO_COMMENT_CPP, convertColor(static_cast(m_pStyle)->backgroundColor)); + sendEditor(SCI_STYLESETFORE, SCE_RDO_COMMENT_LINE, convertColor(static_cast(m_pStyle)->commentColor)); + sendEditor(SCI_STYLESETBACK, SCE_RDO_COMMENT_LINE, convertColor(static_cast(m_pStyle)->backgroundColor)); + sendEditor(SCI_STYLESETFORE, SCE_RDO_NUMBER, convertColor(static_cast(m_pStyle)->numberColor)); + sendEditor(SCI_STYLESETBACK, SCE_RDO_NUMBER, convertColor(static_cast(m_pStyle)->backgroundColor)); + sendEditor(SCI_STYLESETFORE, SCE_RDO_STRING, convertColor(static_cast(m_pStyle)->stringColor)); + sendEditor(SCI_STYLESETBACK, SCE_RDO_STRING, convertColor(static_cast(m_pStyle)->backgroundColor)); + sendEditor(SCI_STYLESETFORE, SCE_RDO_OPERATOR, convertColor(static_cast(m_pStyle)->operatorColor)); + sendEditor(SCI_STYLESETBACK, SCE_RDO_OPERATOR, convertColor(static_cast(m_pStyle)->backgroundColor)); + + // ---------- + // Styles + sendEditor(SCI_STYLESETBOLD , SCE_RDO_DEFAULT, static_cast(static_cast(m_pStyle)->defaultStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_RDO_DEFAULT, static_cast(static_cast(m_pStyle)->defaultStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_DEFAULT, static_cast(static_cast(m_pStyle)->defaultStyle) & static_cast(StyleFont::Style::UNDERLINE)); + sendEditor(SCI_STYLESETBOLD , SCE_RDO_IDENTIFIER, static_cast(static_cast(m_pStyle)->identifierStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_RDO_IDENTIFIER, static_cast(static_cast(m_pStyle)->identifierStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_IDENTIFIER, static_cast(static_cast(m_pStyle)->identifierStyle) & static_cast(StyleFont::Style::UNDERLINE)); + sendEditor(SCI_STYLESETBOLD , SCE_RDO_KEYWORD, static_cast(static_cast(m_pStyle)->keywordStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_RDO_KEYWORD, static_cast(static_cast(m_pStyle)->keywordStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_KEYWORD, static_cast(static_cast(m_pStyle)->keywordStyle) & static_cast(StyleFont::Style::UNDERLINE)); + sendEditor(SCI_STYLESETBOLD , SCE_RDO_FUNCTION, static_cast(static_cast(m_pStyle)->functionsStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_RDO_FUNCTION, static_cast(static_cast(m_pStyle)->functionsStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_FUNCTION, static_cast(static_cast(m_pStyle)->functionsStyle) & static_cast(StyleFont::Style::UNDERLINE)); + sendEditor(SCI_STYLESETBOLD , SCE_RDO_TRACE, static_cast(static_cast(m_pStyle)->traceStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_RDO_TRACE, static_cast(static_cast(m_pStyle)->traceStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_TRACE, static_cast(static_cast(m_pStyle)->traceStyle) & static_cast(StyleFont::Style::UNDERLINE)); + sendEditor(SCI_STYLESETBOLD , SCE_RDO_FRAME_COLOR, static_cast(static_cast(m_pStyle)->colorStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_RDO_FRAME_COLOR, static_cast(static_cast(m_pStyle)->colorStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_FRAME_COLOR, static_cast(static_cast(m_pStyle)->colorStyle) & static_cast(StyleFont::Style::UNDERLINE)); + sendEditor(SCI_STYLESETBOLD , SCE_RDO_COMMENT_CPP, static_cast(static_cast(m_pStyle)->commentStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_RDO_COMMENT_CPP, static_cast(static_cast(m_pStyle)->commentStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_COMMENT_CPP, static_cast(static_cast(m_pStyle)->commentStyle) & static_cast(StyleFont::Style::UNDERLINE)); + sendEditor(SCI_STYLESETBOLD , SCE_RDO_COMMENT_LINE, static_cast(static_cast(m_pStyle)->commentStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_RDO_COMMENT_LINE, static_cast(static_cast(m_pStyle)->commentStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_COMMENT_LINE, static_cast(static_cast(m_pStyle)->commentStyle) & static_cast(StyleFont::Style::UNDERLINE)); + sendEditor(SCI_STYLESETBOLD , SCE_RDO_NUMBER, static_cast(static_cast(m_pStyle)->numberStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_RDO_NUMBER, static_cast(static_cast(m_pStyle)->numberStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_NUMBER, static_cast(static_cast(m_pStyle)->numberStyle) & static_cast(StyleFont::Style::UNDERLINE)); + sendEditor(SCI_STYLESETBOLD , SCE_RDO_STRING, static_cast(static_cast(m_pStyle)->stringStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_RDO_STRING, static_cast(static_cast(m_pStyle)->stringStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_STRING, static_cast(static_cast(m_pStyle)->stringStyle) & static_cast(StyleFont::Style::UNDERLINE)); + sendEditor(SCI_STYLESETBOLD , SCE_RDO_OPERATOR, static_cast(static_cast(m_pStyle)->operatorStyle) & static_cast(StyleFont::Style::BOLD) ); + sendEditor(SCI_STYLESETITALIC , SCE_RDO_OPERATOR, static_cast(static_cast(m_pStyle)->operatorStyle) & static_cast(StyleFont::Style::ITALIC) ); + sendEditor(SCI_STYLESETUNDERLINE, SCE_RDO_OPERATOR, static_cast(static_cast(m_pStyle)->operatorStyle) & static_cast(StyleFont::Style::UNDERLINE)); + + // ---------- + // Font Name + sendEditorString(SCI_STYLESETFONT, SCE_RDO_DEFAULT, m_pStyle->font.name.c_str()); + sendEditorString(SCI_STYLESETFONT, SCE_RDO_IDENTIFIER, m_pStyle->font.name.c_str()); + sendEditorString(SCI_STYLESETFONT, SCE_RDO_KEYWORD, m_pStyle->font.name.c_str()); + sendEditorString(SCI_STYLESETFONT, SCE_RDO_FUNCTION, m_pStyle->font.name.c_str()); + sendEditorString(SCI_STYLESETFONT, SCE_RDO_TRACE, m_pStyle->font.name.c_str()); + sendEditorString(SCI_STYLESETFONT, SCE_RDO_FRAME_COLOR, m_pStyle->font.name.c_str()); + sendEditorString(SCI_STYLESETFONT, SCE_RDO_COMMENT_CPP, m_pStyle->font.name.c_str()); + sendEditorString(SCI_STYLESETFONT, SCE_RDO_COMMENT_LINE, m_pStyle->font.name.c_str()); + sendEditorString(SCI_STYLESETFONT, SCE_RDO_NUMBER, m_pStyle->font.name.c_str()); + sendEditorString(SCI_STYLESETFONT, SCE_RDO_STRING, m_pStyle->font.name.c_str()); + sendEditorString(SCI_STYLESETFONT, SCE_RDO_OPERATOR, m_pStyle->font.name.c_str()); + + // ---------- + // Font Size + sendEditor(SCI_STYLESETSIZE, SCE_RDO_DEFAULT, m_pStyle->font.size); + sendEditor(SCI_STYLESETSIZE, SCE_RDO_IDENTIFIER, m_pStyle->font.size); + sendEditor(SCI_STYLESETSIZE, SCE_RDO_KEYWORD, m_pStyle->font.size); + sendEditor(SCI_STYLESETSIZE, SCE_RDO_FUNCTION, m_pStyle->font.size); + sendEditor(SCI_STYLESETSIZE, SCE_RDO_TRACE, m_pStyle->font.size); + sendEditor(SCI_STYLESETSIZE, SCE_RDO_FRAME_COLOR, m_pStyle->font.size); + sendEditor(SCI_STYLESETSIZE, SCE_RDO_COMMENT_CPP, m_pStyle->font.size); + sendEditor(SCI_STYLESETSIZE, SCE_RDO_COMMENT_LINE, m_pStyle->font.size); + sendEditor(SCI_STYLESETSIZE, SCE_RDO_NUMBER, m_pStyle->font.size); + sendEditor(SCI_STYLESETSIZE, SCE_RDO_STRING, m_pStyle->font.size); + sendEditor(SCI_STYLESETSIZE, SCE_RDO_OPERATOR, m_pStyle->font.size); } void Parser::replaceCurrent(const QString& str, int changePosValue) const { - int pos = changePosValue != -1 - ? getCurrentPos() - : 0; + int pos = changePosValue != -1 + ? getCurrentPos() + : 0; - sendEditorString(SCI_REPLACESEL, str.toStdString()); + sendEditorString(SCI_REPLACESEL, str.toStdString()); - if (changePosValue != -1) - { - pos += changePosValue; - setCurrentPos(pos); - } + if (changePosValue != -1) + { + pos += changePosValue; + setCurrentPos(pos); + } } diff --git a/app/rdo_studio/src/editor/parser_edit.h b/app/rdo_studio/src/editor/parser_edit.h index 90570eeff..89f89c211 100644 --- a/app/rdo_studio/src/editor/parser_edit.h +++ b/app/rdo_studio/src/editor/parser_edit.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_RDO_EDIT_RDOEDITORBASEEDIT_H_ -#define _RDO_STUDIO_RDO_EDIT_RDOEDITORBASEEDIT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -12,26 +11,24 @@ namespace rdo { namespace gui { namespace editor { class Parser: public Edit { public: - Parser(QWidget* pParent); - virtual ~Parser(); + Parser(QWidget* pParent); + virtual ~Parser(); - void setEditorStyle(ParserStyle* pStyle); + void setEditorStyle(ParserStyle* pStyle); - void replaceCurrent(const QString& str, int changePosValue = -1) const; + void replaceCurrent(const QString& str, int changePosValue = -1) const; protected: - std::string kw0; - std::string kw1; - std::string kw2; - std::string kw3; - std::string getAllKW() const; + std::string kw0; + std::string kw1; + std::string kw2; + std::string kw3; + std::string getAllKW() const; - static std::string convertToLexer(const std::string& kw); + static std::string convertToLexer(const std::string& kw); private: - typedef Edit super; + typedef Edit super; }; }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_RDO_EDIT_RDOEDITORBASEEDIT_H_ diff --git a/app/rdo_studio/src/editor/parser_edit_style.cpp b/app/rdo_studio/src/editor/parser_edit_style.cpp index 2e18b724f..cd26e1545 100644 --- a/app/rdo_studio/src/editor/parser_edit_style.cpp +++ b/app/rdo_studio/src/editor/parser_edit_style.cpp @@ -14,390 +14,390 @@ using namespace rdo::gui::editor; // -------------------------------------------------------------------------------- ParserStyle::ParserStyle(): EditStyle() { - defaultColor = QColor( 0x80, 0x80, 0x80 ); - identifierColor = QColor( 0x00, 0x00, 0x00 ); - keywordColor = QColor( 0x00, 0x00, 0x00 ); - functionsColor = QColor( 0x00, 0x80, 0x00 ); - traceColor = QColor( 0x80, 0x00, 0x00 ); - colorColor = QColor( 0x09, 0x26, 0xB0 ); - commentColor = QColor( 0x00, 0x80, 0x00 ); - numberColor = QColor( 0x00, 0x00, 0x80 ); - stringColor = QColor( 0x80, 0x00, 0x80 ); - operatorColor = QColor( 0x00, 0x00, 0x00 ); - - identifierStyle = StyleFont::NONE; - keywordStyle = StyleFont::BOLD; - functionsStyle = StyleFont::BOLD; - traceStyle = StyleFont::BOLD; - colorStyle = StyleFont::BOLD; - commentStyle = StyleFont::ITALIC; - numberStyle = StyleFont::NONE; - stringStyle = StyleFont::NONE; - operatorStyle = StyleFont::NONE; + defaultColor = QColor(0x80, 0x80, 0x80); + identifierColor = QColor(0x00, 0x00, 0x00); + keywordColor = QColor(0x00, 0x00, 0x00); + functionsColor = QColor(0x00, 0x80, 0x00); + traceColor = QColor(0x80, 0x00, 0x00); + colorColor = QColor(0x09, 0x26, 0xB0); + commentColor = QColor(0x00, 0x80, 0x00); + numberColor = QColor(0x00, 0x00, 0x80); + stringColor = QColor(0x80, 0x00, 0x80); + operatorColor = QColor(0x00, 0x00, 0x00); + + identifierStyle = StyleFont::Style::NONE; + keywordStyle = StyleFont::Style::BOLD; + functionsStyle = StyleFont::Style::BOLD; + traceStyle = StyleFont::Style::BOLD; + colorStyle = StyleFont::Style::BOLD; + commentStyle = StyleFont::Style::ITALIC; + numberStyle = StyleFont::Style::NONE; + stringStyle = StyleFont::Style::NONE; + operatorStyle = StyleFont::Style::NONE; } ParserStyle::~ParserStyle() {} -ParserStyle& ParserStyle::operator =( const ParserStyle& style ) +ParserStyle& ParserStyle::operator =(const ParserStyle& style) { - EditStyle::operator=( style ); - - identifierColor = style.identifierColor; - keywordColor = style.keywordColor; - functionsColor = style.functionsColor; - traceColor = style.traceColor; - colorColor = style.colorColor; - commentColor = style.commentColor; - numberColor = style.numberColor; - stringColor = style.stringColor; - operatorColor = style.operatorColor; - - identifierStyle = style.identifierStyle; - keywordStyle = style.keywordStyle; - functionsStyle = style.functionsStyle; - traceStyle = style.traceStyle; - colorStyle = style.colorStyle; - commentStyle = style.commentStyle; - numberStyle = style.numberStyle; - stringStyle = style.stringStyle; - operatorStyle = style.operatorStyle; - - return *this; + EditStyle::operator=(style); + + identifierColor = style.identifierColor; + keywordColor = style.keywordColor; + functionsColor = style.functionsColor; + traceColor = style.traceColor; + colorColor = style.colorColor; + commentColor = style.commentColor; + numberColor = style.numberColor; + stringColor = style.stringColor; + operatorColor = style.operatorColor; + + identifierStyle = style.identifierStyle; + keywordStyle = style.keywordStyle; + functionsStyle = style.functionsStyle; + traceStyle = style.traceStyle; + colorStyle = style.colorStyle; + commentStyle = style.commentStyle; + numberStyle = style.numberStyle; + stringStyle = style.stringStyle; + operatorStyle = style.operatorStyle; + + return *this; } -bool ParserStyle::operator ==( const ParserStyle& style ) const +bool ParserStyle::operator ==(const ParserStyle& style) const { - - return EditStyle::operator==( style ) && - identifierColor == style.identifierColor && - keywordColor == style.keywordColor && - functionsColor == style.functionsColor && - traceColor == style.traceColor && - colorColor == style.colorColor && - commentColor == style.commentColor && - numberColor == style.numberColor && - stringColor == style.stringColor && - operatorColor == style.operatorColor && - - identifierStyle == style.identifierStyle && - keywordStyle == style.keywordStyle && - functionsStyle == style.functionsStyle && - traceStyle == style.traceStyle && - colorStyle == style.colorStyle && - commentStyle == style.commentStyle && - numberStyle == style.numberStyle && - stringStyle == style.stringStyle && - operatorStyle == style.operatorStyle; + + return EditStyle::operator==(style) && + identifierColor == style.identifierColor && + keywordColor == style.keywordColor && + functionsColor == style.functionsColor && + traceColor == style.traceColor && + colorColor == style.colorColor && + commentColor == style.commentColor && + numberColor == style.numberColor && + stringColor == style.stringColor && + operatorColor == style.operatorColor && + + identifierStyle == style.identifierStyle && + keywordStyle == style.keywordStyle && + functionsStyle == style.functionsStyle && + traceStyle == style.traceStyle && + colorStyle == style.colorStyle && + commentStyle == style.commentStyle && + numberStyle == style.numberStyle && + stringStyle == style.stringStyle && + operatorStyle == style.operatorStyle; } -bool ParserStyle::operator !=( const ParserStyle& style ) const +bool ParserStyle::operator !=(const ParserStyle& style) const { - return !(*this == style); + return !(*this == style); } -bool ParserStyle::styleDefault( const int styleType ) const +bool ParserStyle::styleDefault(const int styleType) const { - return styleType == SCE_RDO_DEFAULT; + return styleType == SCE_RDO_DEFAULT; } -bool ParserStyle::styleUsing( const int styleType ) const +bool ParserStyle::styleUsing(const int styleType) const { - return - styleType == SCE_RDO_DEFAULT || styleType == SCE_RDO_IDENTIFIER || - styleType == SCE_RDO_KEYWORD || styleType == SCE_RDO_FUNCTION || - styleType == SCE_RDO_TRACE || styleType == SCE_RDO_COMMENT_CPP || - styleType == SCE_RDO_COMMENT_LINE || styleType == SCE_RDO_NUMBER || - styleType == SCE_RDO_STRING || styleType == SCE_RDO_OPERATOR || - styleType == SCE_RDO_FRAME_COLOR; + return + styleType == SCE_RDO_DEFAULT || styleType == SCE_RDO_IDENTIFIER || + styleType == SCE_RDO_KEYWORD || styleType == SCE_RDO_FUNCTION || + styleType == SCE_RDO_TRACE || styleType == SCE_RDO_COMMENT_CPP || + styleType == SCE_RDO_COMMENT_LINE || styleType == SCE_RDO_NUMBER || + styleType == SCE_RDO_STRING || styleType == SCE_RDO_OPERATOR || + styleType == SCE_RDO_FRAME_COLOR; } -bool ParserStyle::styleBold( const int styleType ) const +bool ParserStyle::styleBold(const int styleType) const { - switch ( styleType ) { - case SCE_RDO_DEFAULT : return defaultStyle & StyleFont::BOLD ? true : false; - case SCE_RDO_IDENTIFIER : return identifierStyle & StyleFont::BOLD ? true : false; - case SCE_RDO_KEYWORD : return keywordStyle & StyleFont::BOLD ? true : false; - case SCE_RDO_FUNCTION : return functionsStyle & StyleFont::BOLD ? true : false; - case SCE_RDO_TRACE : return traceStyle & StyleFont::BOLD ? true : false; - case SCE_RDO_FRAME_COLOR : return colorStyle & StyleFont::BOLD ? true : false; - case SCE_RDO_COMMENT_CPP : return commentStyle & StyleFont::BOLD ? true : false; - case SCE_RDO_COMMENT_LINE: return commentStyle & StyleFont::BOLD ? true : false; - case SCE_RDO_NUMBER : return numberStyle & StyleFont::BOLD ? true : false; - case SCE_RDO_STRING : return stringStyle & StyleFont::BOLD ? true : false; - case SCE_RDO_OPERATOR : return operatorStyle & StyleFont::BOLD ? true : false; - } - return false; + switch (styleType) { + case SCE_RDO_DEFAULT : return static_cast(defaultStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; + case SCE_RDO_IDENTIFIER : return static_cast(identifierStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; + case SCE_RDO_KEYWORD : return static_cast(keywordStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; + case SCE_RDO_FUNCTION : return static_cast(functionsStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; + case SCE_RDO_TRACE : return static_cast(traceStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; + case SCE_RDO_FRAME_COLOR : return static_cast(colorStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; + case SCE_RDO_COMMENT_CPP : return static_cast(commentStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; + case SCE_RDO_COMMENT_LINE: return static_cast(commentStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; + case SCE_RDO_NUMBER : return static_cast(numberStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; + case SCE_RDO_STRING : return static_cast(stringStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; + case SCE_RDO_OPERATOR : return static_cast(operatorStyle) & static_cast(StyleFont::Style::BOLD) ? true : false; + } + return false; } -bool ParserStyle::styleItalic( const int styleType ) const +bool ParserStyle::styleItalic(const int styleType) const { - switch ( styleType ) { - case SCE_RDO_DEFAULT : return defaultStyle & StyleFont::ITALIC ? true : false; - case SCE_RDO_IDENTIFIER : return identifierStyle & StyleFont::ITALIC ? true : false; - case SCE_RDO_KEYWORD : return keywordStyle & StyleFont::ITALIC ? true : false; - case SCE_RDO_FUNCTION : return functionsStyle & StyleFont::ITALIC ? true : false; - case SCE_RDO_TRACE : return traceStyle & StyleFont::ITALIC ? true : false; - case SCE_RDO_FRAME_COLOR : return colorStyle & StyleFont::ITALIC ? true : false; - case SCE_RDO_COMMENT_CPP : return commentStyle & StyleFont::ITALIC ? true : false; - case SCE_RDO_COMMENT_LINE: return commentStyle & StyleFont::ITALIC ? true : false; - case SCE_RDO_NUMBER : return numberStyle & StyleFont::ITALIC ? true : false; - case SCE_RDO_STRING : return stringStyle & StyleFont::ITALIC ? true : false; - case SCE_RDO_OPERATOR : return operatorStyle & StyleFont::ITALIC ? true : false; - } - return false; + switch (styleType) { + case SCE_RDO_DEFAULT : return static_cast(defaultStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; + case SCE_RDO_IDENTIFIER : return static_cast(identifierStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; + case SCE_RDO_KEYWORD : return static_cast(keywordStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; + case SCE_RDO_FUNCTION : return static_cast(functionsStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; + case SCE_RDO_TRACE : return static_cast(traceStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; + case SCE_RDO_FRAME_COLOR : return static_cast(colorStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; + case SCE_RDO_COMMENT_CPP : return static_cast(commentStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; + case SCE_RDO_COMMENT_LINE: return static_cast(commentStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; + case SCE_RDO_NUMBER : return static_cast(numberStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; + case SCE_RDO_STRING : return static_cast(stringStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; + case SCE_RDO_OPERATOR : return static_cast(operatorStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false; + } + return false; } -std::string ParserStyle::styleFGColorToHEX( const int styleType ) const +std::string ParserStyle::styleFGColorToHEX(const int styleType) const { - switch ( styleType ) { - case SCE_RDO_DEFAULT : return colorToHEX( defaultColor ); - case SCE_RDO_IDENTIFIER : return colorToHEX( identifierColor ); - case SCE_RDO_KEYWORD : return colorToHEX( keywordColor ); - case SCE_RDO_FUNCTION : return colorToHEX( functionsColor ); - case SCE_RDO_TRACE : return colorToHEX( traceColor ); - case SCE_RDO_FRAME_COLOR : return colorToHEX( colorColor ); - case SCE_RDO_COMMENT_CPP : return colorToHEX( commentColor ); - case SCE_RDO_COMMENT_LINE: return colorToHEX( commentColor ); - case SCE_RDO_NUMBER : return colorToHEX( numberColor ); - case SCE_RDO_STRING : return colorToHEX( stringColor ); - case SCE_RDO_OPERATOR : return colorToHEX( operatorColor ); - } - return EditStyle::styleFGColorToHEX( styleType ); + switch (styleType) { + case SCE_RDO_DEFAULT : return colorToHEX(defaultColor); + case SCE_RDO_IDENTIFIER : return colorToHEX(identifierColor); + case SCE_RDO_KEYWORD : return colorToHEX(keywordColor); + case SCE_RDO_FUNCTION : return colorToHEX(functionsColor); + case SCE_RDO_TRACE : return colorToHEX(traceColor); + case SCE_RDO_FRAME_COLOR : return colorToHEX(colorColor); + case SCE_RDO_COMMENT_CPP : return colorToHEX(commentColor); + case SCE_RDO_COMMENT_LINE: return colorToHEX(commentColor); + case SCE_RDO_NUMBER : return colorToHEX(numberColor); + case SCE_RDO_STRING : return colorToHEX(stringColor); + case SCE_RDO_OPERATOR : return colorToHEX(operatorColor); + } + return EditStyle::styleFGColorToHEX(styleType); } ParserStyle ParserStyle::getDefaultStyle() { - ParserStyle style; - return style; + ParserStyle style; + return style; } ParserStyle ParserStyle::getCppStyle() { - ParserStyle style; - *static_cast(&style) = EditStyle::getDefaultStyle(); - - style.identifierColor = QColor( 0x00, 0x00, 0x00 ); - style.keywordColor = QColor( 0x00, 0x00, 0xFF ); - style.functionsColor = QColor( 0x00, 0x00, 0xFF ); - style.traceColor = QColor( 0x00, 0x00, 0xFF ); - style.colorColor = QColor( 0x00, 0x00, 0xFF ); - style.commentColor = QColor( 0x00, 0x80, 0x00 ); - style.numberColor = QColor( 0x00, 0x00, 0x00 ); - style.stringColor = QColor( 0x00, 0x00, 0x00 ); - style.operatorColor = QColor( 0x00, 0x00, 0x00 ); - - style.identifierStyle = StyleFont::NONE; - style.keywordStyle = StyleFont::NONE; - style.functionsStyle = StyleFont::NONE; - style.traceStyle = StyleFont::NONE; - style.colorStyle = StyleFont::NONE; - style.commentStyle = StyleFont::NONE; - style.numberStyle = StyleFont::NONE; - style.stringStyle = StyleFont::NONE; - style.operatorStyle = StyleFont::NONE; - - return style; + ParserStyle style; + *static_cast(&style) = EditStyle::getDefaultStyle(); + + style.identifierColor = QColor(0x00, 0x00, 0x00); + style.keywordColor = QColor(0x00, 0x00, 0xFF); + style.functionsColor = QColor(0x00, 0x00, 0xFF); + style.traceColor = QColor(0x00, 0x00, 0xFF); + style.colorColor = QColor(0x00, 0x00, 0xFF); + style.commentColor = QColor(0x00, 0x80, 0x00); + style.numberColor = QColor(0x00, 0x00, 0x00); + style.stringColor = QColor(0x00, 0x00, 0x00); + style.operatorColor = QColor(0x00, 0x00, 0x00); + + style.identifierStyle = StyleFont::Style::NONE; + style.keywordStyle = StyleFont::Style::NONE; + style.functionsStyle = StyleFont::Style::NONE; + style.traceStyle = StyleFont::Style::NONE; + style.colorStyle = StyleFont::Style::NONE; + style.commentStyle = StyleFont::Style::NONE; + style.numberStyle = StyleFont::Style::NONE; + style.stringStyle = StyleFont::Style::NONE; + style.operatorStyle = StyleFont::Style::NONE; + + return style; } ParserStyle ParserStyle::getPascalStyle() { - ParserStyle style; - *static_cast(&style) = EditStyle::getDefaultStyle(); - - style.identifierColor = QColor( 0x00, 0x00, 0x00 ); - style.keywordColor = QColor( 0x00, 0x00, 0x00 ); - style.functionsColor = QColor( 0x00, 0x00, 0x00 ); - style.traceColor = QColor( 0x00, 0x00, 0x00 ); - style.colorColor = QColor( 0x00, 0x00, 0x00 ); - style.commentColor = QColor( 0x00, 0x00, 0x80 ); - style.numberColor = QColor( 0x00, 0x00, 0x00 ); - style.stringColor = QColor( 0x00, 0x00, 0x00 ); - style.operatorColor = QColor( 0x00, 0x00, 0x00 ); - - style.identifierStyle = StyleFont::NONE; - style.keywordStyle = StyleFont::BOLD; - style.functionsStyle = StyleFont::BOLD; - style.traceStyle = StyleFont::BOLD; - style.colorStyle = StyleFont::BOLD; - style.commentStyle = StyleFont::ITALIC; - style.numberStyle = StyleFont::NONE; - style.stringStyle = StyleFont::NONE; - style.operatorStyle = StyleFont::NONE; - - return style; + ParserStyle style; + *static_cast(&style) = EditStyle::getDefaultStyle(); + + style.identifierColor = QColor(0x00, 0x00, 0x00); + style.keywordColor = QColor(0x00, 0x00, 0x00); + style.functionsColor = QColor(0x00, 0x00, 0x00); + style.traceColor = QColor(0x00, 0x00, 0x00); + style.colorColor = QColor(0x00, 0x00, 0x00); + style.commentColor = QColor(0x00, 0x00, 0x80); + style.numberColor = QColor(0x00, 0x00, 0x00); + style.stringColor = QColor(0x00, 0x00, 0x00); + style.operatorColor = QColor(0x00, 0x00, 0x00); + + style.identifierStyle = StyleFont::Style::NONE; + style.keywordStyle = StyleFont::Style::BOLD; + style.functionsStyle = StyleFont::Style::BOLD; + style.traceStyle = StyleFont::Style::BOLD; + style.colorStyle = StyleFont::Style::BOLD; + style.commentStyle = StyleFont::Style::ITALIC; + style.numberStyle = StyleFont::Style::NONE; + style.stringStyle = StyleFont::Style::NONE; + style.operatorStyle = StyleFont::Style::NONE; + + return style; } ParserStyle ParserStyle::getHtmlStyle() { - ParserStyle style; - *static_cast(&style) = EditStyle::getDefaultStyle(); - - style.identifierColor = QColor( 0x00, 0x00, 0x00 ); - style.keywordColor = QColor( 0x80, 0x00, 0x80 ); - style.functionsColor = QColor( 0xFF, 0x00, 0x00 ); - style.traceColor = QColor( 0xFF, 0x00, 0x00 ); - style.colorColor = QColor( 0xFF, 0x00, 0x00 ); - style.commentColor = QColor( 0x00, 0x80, 0x00 ); - style.numberColor = QColor( 0x00, 0x00, 0xFF ); - style.stringColor = QColor( 0x00, 0x00, 0xFF ); - style.operatorColor = QColor( 0x00, 0x00, 0x00 ); - - style.identifierStyle = StyleFont::NONE; - style.keywordStyle = StyleFont::NONE; - style.functionsStyle = StyleFont::NONE; - style.traceStyle = StyleFont::NONE; - style.colorStyle = StyleFont::NONE; - style.commentStyle = StyleFont::NONE; - style.numberStyle = StyleFont::NONE; - style.stringStyle = StyleFont::NONE; - style.operatorStyle = StyleFont::NONE; - - return style; + ParserStyle style; + *static_cast(&style) = EditStyle::getDefaultStyle(); + + style.identifierColor = QColor(0x00, 0x00, 0x00); + style.keywordColor = QColor(0x80, 0x00, 0x80); + style.functionsColor = QColor(0xFF, 0x00, 0x00); + style.traceColor = QColor(0xFF, 0x00, 0x00); + style.colorColor = QColor(0xFF, 0x00, 0x00); + style.commentColor = QColor(0x00, 0x80, 0x00); + style.numberColor = QColor(0x00, 0x00, 0xFF); + style.stringColor = QColor(0x00, 0x00, 0xFF); + style.operatorColor = QColor(0x00, 0x00, 0x00); + + style.identifierStyle = StyleFont::Style::NONE; + style.keywordStyle = StyleFont::Style::NONE; + style.functionsStyle = StyleFont::Style::NONE; + style.traceStyle = StyleFont::Style::NONE; + style.colorStyle = StyleFont::Style::NONE; + style.commentStyle = StyleFont::Style::NONE; + style.numberStyle = StyleFont::Style::NONE; + style.stringStyle = StyleFont::Style::NONE; + style.operatorStyle = StyleFont::Style::NONE; + + return style; } ParserStyle ParserStyle::getClassicStyle() { - ParserStyle style; - *static_cast(&style) = EditStyle::getClassicStyle(); - - style.identifierColor = QColor( 0xFF, 0xFF, 0x00 ); - style.keywordColor = QColor( 0xFF, 0xFF, 0xFF ); - style.functionsColor = QColor( 0xFF, 0xFF, 0xFF ); - style.traceColor = QColor( 0xFF, 0xFF, 0xFF ); - style.colorColor = QColor( 0xFF, 0xFF, 0xFF ); - style.commentColor = QColor( 0xC0, 0xC0, 0xC0 ); - style.numberColor = QColor( 0xFF, 0xFF, 0x00 ); - style.stringColor = QColor( 0xFF, 0xFF, 0x00 ); - style.operatorColor = QColor( 0xFF, 0xFF, 0x00 ); - - style.identifierStyle = StyleFont::NONE; - style.keywordStyle = StyleFont::NONE; - style.functionsStyle = StyleFont::NONE; - style.traceStyle = StyleFont::NONE; - style.colorStyle = StyleFont::NONE; - style.commentStyle = StyleFont::NONE; - style.numberStyle = StyleFont::NONE; - style.stringStyle = StyleFont::NONE; - style.operatorStyle = StyleFont::NONE; - - return style; + ParserStyle style; + *static_cast(&style) = EditStyle::getClassicStyle(); + + style.identifierColor = QColor(0xFF, 0xFF, 0x00); + style.keywordColor = QColor(0xFF, 0xFF, 0xFF); + style.functionsColor = QColor(0xFF, 0xFF, 0xFF); + style.traceColor = QColor(0xFF, 0xFF, 0xFF); + style.colorColor = QColor(0xFF, 0xFF, 0xFF); + style.commentColor = QColor(0xC0, 0xC0, 0xC0); + style.numberColor = QColor(0xFF, 0xFF, 0x00); + style.stringColor = QColor(0xFF, 0xFF, 0x00); + style.operatorColor = QColor(0xFF, 0xFF, 0x00); + + style.identifierStyle = StyleFont::Style::NONE; + style.keywordStyle = StyleFont::Style::NONE; + style.functionsStyle = StyleFont::Style::NONE; + style.traceStyle = StyleFont::Style::NONE; + style.colorStyle = StyleFont::Style::NONE; + style.commentStyle = StyleFont::Style::NONE; + style.numberStyle = StyleFont::Style::NONE; + style.stringStyle = StyleFont::Style::NONE; + style.operatorStyle = StyleFont::Style::NONE; + + return style; } ParserStyle ParserStyle::getTwilightStyle() { - ParserStyle style; - *static_cast(&style) = EditStyle::getTwilightStyle(); - - style.identifierColor = QColor( 0xFF, 0xFF, 0xFF ); - style.keywordColor = QColor( 0x00, 0xFF, 0xFF ); - style.functionsColor = QColor( 0xFF, 0xFF, 0x00 ); - style.traceColor = QColor( 0x00, 0xFF, 0x00 ); - style.colorColor = QColor( 0x00, 0xFF, 0x00 ); - style.commentColor = QColor( 0xC0, 0xC0, 0xC0 ); - style.numberColor = QColor( 0xC0, 0xC0, 0xC0 ); - style.stringColor = QColor( 0xFF, 0xFF, 0xFF ); - style.operatorColor = QColor( 0xFF, 0xFF, 0xFF ); - - style.identifierStyle = StyleFont::NONE; - style.keywordStyle = StyleFont::BOLD; - style.functionsStyle = StyleFont::BOLD; - style.traceStyle = static_cast(StyleFont::BOLD | StyleFont::ITALIC); - style.colorStyle = StyleFont::BOLD; - style.commentStyle = StyleFont::ITALIC; - style.numberStyle = StyleFont::NONE; - style.stringStyle = StyleFont::NONE; - style.operatorStyle = StyleFont::NONE; - - return style; + ParserStyle style; + *static_cast(&style) = EditStyle::getTwilightStyle(); + + style.identifierColor = QColor(0xFF, 0xFF, 0xFF); + style.keywordColor = QColor(0x00, 0xFF, 0xFF); + style.functionsColor = QColor(0xFF, 0xFF, 0x00); + style.traceColor = QColor(0x00, 0xFF, 0x00); + style.colorColor = QColor(0x00, 0xFF, 0x00); + style.commentColor = QColor(0xC0, 0xC0, 0xC0); + style.numberColor = QColor(0xC0, 0xC0, 0xC0); + style.stringColor = QColor(0xFF, 0xFF, 0xFF); + style.operatorColor = QColor(0xFF, 0xFF, 0xFF); + + style.identifierStyle = StyleFont::Style::NONE; + style.keywordStyle = StyleFont::Style::BOLD; + style.functionsStyle = StyleFont::Style::BOLD; + style.traceStyle = static_cast(static_cast(StyleFont::Style::BOLD) | static_cast(StyleFont::Style::ITALIC)); + style.colorStyle = StyleFont::Style::BOLD; + style.commentStyle = StyleFont::Style::ITALIC; + style.numberStyle = StyleFont::Style::NONE; + style.stringStyle = StyleFont::Style::NONE; + style.operatorStyle = StyleFont::Style::NONE; + + return style; } ParserStyle ParserStyle::getOceanStyle() { - ParserStyle style; - *static_cast(&style) = EditStyle::getOceanStyle(); - - style.identifierColor = QColor( 0x00, 0x00, 0xFF ); - style.keywordColor = QColor( 0x00, 0x00, 0x00 ); - style.functionsColor = QColor( 0x00, 0x00, 0x00 ); - style.traceColor = QColor( 0x00, 0x00, 0x00 ); - style.colorColor = QColor( 0x00, 0x00, 0x00 ); - style.commentColor = QColor( 0x00, 0x80, 0x80 ); - style.numberColor = QColor( 0x00, 0x00, 0xFF ); - style.stringColor = QColor( 0x00, 0x00, 0xFF ); - style.operatorColor = QColor( 0x00, 0x00, 0xFF ); - - style.identifierStyle = StyleFont::NONE; - style.keywordStyle = StyleFont::BOLD; - style.functionsStyle = StyleFont::BOLD; - style.traceStyle = StyleFont::BOLD; - style.colorStyle = StyleFont::BOLD; - style.commentStyle = StyleFont::ITALIC; - style.numberStyle = StyleFont::NONE; - style.stringStyle = StyleFont::NONE; - style.operatorStyle = StyleFont::NONE; - - return style; + ParserStyle style; + *static_cast(&style) = EditStyle::getOceanStyle(); + + style.identifierColor = QColor(0x00, 0x00, 0xFF); + style.keywordColor = QColor(0x00, 0x00, 0x00); + style.functionsColor = QColor(0x00, 0x00, 0x00); + style.traceColor = QColor(0x00, 0x00, 0x00); + style.colorColor = QColor(0x00, 0x00, 0x00); + style.commentColor = QColor(0x00, 0x80, 0x80); + style.numberColor = QColor(0x00, 0x00, 0xFF); + style.stringColor = QColor(0x00, 0x00, 0xFF); + style.operatorColor = QColor(0x00, 0x00, 0xFF); + + style.identifierStyle = StyleFont::Style::NONE; + style.keywordStyle = StyleFont::Style::BOLD; + style.functionsStyle = StyleFont::Style::BOLD; + style.traceStyle = StyleFont::Style::BOLD; + style.colorStyle = StyleFont::Style::BOLD; + style.commentStyle = StyleFont::Style::ITALIC; + style.numberStyle = StyleFont::Style::NONE; + style.stringStyle = StyleFont::Style::NONE; + style.operatorStyle = StyleFont::Style::NONE; + + return style; } namespace rdo { namespace gui { namespace editor { QSettings& operator<< (QSettings& settings, const ParserStyle& style) { - settings << static_cast(style); - - settings.beginGroup("theme"); - settings.setValue("identifier_color", style.identifierColor.name()); - settings.setValue("keyword_color", style.keywordColor.name()); - settings.setValue("functions_color", style.functionsColor.name()); - settings.setValue("trace_color", style.traceColor.name()); - settings.setValue("color_color", style.colorColor.name()); - settings.setValue("comment_color", style.commentColor.name()); - settings.setValue("number_color", style.numberColor.name()); - settings.setValue("string_color", style.stringColor.name()); - settings.setValue("operator_color", style.operatorColor.name()); - - settings.setValue("identifier_style", style.identifierStyle); - settings.setValue("keyword_style", style.keywordStyle); - settings.setValue("functions_style", style.functionsStyle); - settings.setValue("trace_style", style.traceStyle); - settings.setValue("color_style", style.colorStyle); - settings.setValue("comment_style", style.commentStyle); - settings.setValue("number_style", style.numberStyle); - settings.setValue("string_style", style.stringStyle); - settings.setValue("operator_style", style.operatorStyle); - settings.endGroup(); - - return settings; + settings << static_cast(style); + + settings.beginGroup("theme"); + settings.setValue("identifier_color", style.identifierColor.name()); + settings.setValue("keyword_color", style.keywordColor.name()); + settings.setValue("functions_color", style.functionsColor.name()); + settings.setValue("trace_color", style.traceColor.name()); + settings.setValue("color_color", style.colorColor.name()); + settings.setValue("comment_color", style.commentColor.name()); + settings.setValue("number_color", style.numberColor.name()); + settings.setValue("string_color", style.stringColor.name()); + settings.setValue("operator_color", style.operatorColor.name()); + + settings.setValue("identifier_style", static_cast(style.identifierStyle)); + settings.setValue("keyword_style", static_cast(style.keywordStyle)); + settings.setValue("functions_style", static_cast(style.functionsStyle)); + settings.setValue("trace_style", static_cast(style.traceStyle)); + settings.setValue("color_style", static_cast(style.colorStyle)); + settings.setValue("comment_style", static_cast(style.commentStyle)); + settings.setValue("number_style", static_cast(style.numberStyle)); + settings.setValue("string_style", static_cast(style.stringStyle)); + settings.setValue("operator_style", static_cast(style.operatorStyle)); + settings.endGroup(); + + return settings; } QSettings& operator>> (QSettings& settings, ParserStyle& style) { - settings >> static_cast(style); - - settings.beginGroup("theme"); - style.identifierColor = QColor(settings.value("identifier_color", style.identifierColor.name()).toString()); - style.keywordColor = QColor(settings.value("keyword_color", style.keywordColor.name()).toString()); - style.functionsColor = QColor(settings.value("functions_color", style.functionsColor.name()).toString()); - style.traceColor = QColor(settings.value("trace_color", style.traceColor.name()).toString()); - style.colorColor = QColor(settings.value("color_color", style.colorColor.name()).toString()); - style.commentColor = QColor(settings.value("comment_color", style.commentColor.name()).toString()); - style.numberColor = QColor(settings.value("number_color", style.numberColor.name()).toString()); - style.stringColor = QColor(settings.value("string_color", style.stringColor.name()).toString()); - style.operatorColor = QColor(settings.value("operator_color", style.operatorColor.name()).toString()); - - style.identifierStyle = static_cast(settings.value("identifier_style", style.identifierStyle).toInt()); - style.keywordStyle = static_cast(settings.value("keyword_style", style.keywordStyle).toInt()); - style.functionsStyle = static_cast(settings.value("functions_style", style.functionsStyle).toInt()); - style.traceStyle = static_cast(settings.value("trace_style", style.traceStyle).toInt()); - style.colorStyle = static_cast(settings.value("color_style", style.colorStyle).toInt()); - style.commentStyle = static_cast(settings.value("comment_style", style.commentStyle).toInt()); - style.numberStyle = static_cast(settings.value("number_style", style.numberStyle).toInt()); - style.stringStyle = static_cast(settings.value("string_style", style.stringStyle).toInt()); - style.operatorStyle = static_cast(settings.value("operator_style", style.operatorStyle).toInt()); - settings.endGroup(); - - return settings; + settings >> static_cast(style); + + settings.beginGroup("theme"); + style.identifierColor = QColor(settings.value("identifier_color", style.identifierColor.name()).toString()); + style.keywordColor = QColor(settings.value("keyword_color", style.keywordColor.name()).toString()); + style.functionsColor = QColor(settings.value("functions_color", style.functionsColor.name()).toString()); + style.traceColor = QColor(settings.value("trace_color", style.traceColor.name()).toString()); + style.colorColor = QColor(settings.value("color_color", style.colorColor.name()).toString()); + style.commentColor = QColor(settings.value("comment_color", style.commentColor.name()).toString()); + style.numberColor = QColor(settings.value("number_color", style.numberColor.name()).toString()); + style.stringColor = QColor(settings.value("string_color", style.stringColor.name()).toString()); + style.operatorColor = QColor(settings.value("operator_color", style.operatorColor.name()).toString()); + + style.identifierStyle = static_cast(settings.value("identifier_style", static_cast(style.identifierStyle)).toInt()); + style.keywordStyle = static_cast(settings.value("keyword_style", static_cast(style.keywordStyle)).toInt()); + style.functionsStyle = static_cast(settings.value("functions_style", static_cast(style.functionsStyle)).toInt()); + style.traceStyle = static_cast(settings.value("trace_style", static_cast(style.traceStyle)).toInt()); + style.colorStyle = static_cast(settings.value("color_style", static_cast(style.colorStyle)).toInt()); + style.commentStyle = static_cast(settings.value("comment_style", static_cast(style.commentStyle)).toInt()); + style.numberStyle = static_cast(settings.value("number_style", static_cast(style.numberStyle)).toInt()); + style.stringStyle = static_cast(settings.value("string_style", static_cast(style.stringStyle)).toInt()); + style.operatorStyle = static_cast(settings.value("operator_style", static_cast(style.operatorStyle)).toInt()); + settings.endGroup(); + + return settings; } }}} // namespace rdo::gui::editor diff --git a/app/rdo_studio/src/editor/parser_edit_style.h b/app/rdo_studio/src/editor/parser_edit_style.h index 5a9261f4f..8b05062e8 100644 --- a/app/rdo_studio/src/editor/parser_edit_style.h +++ b/app/rdo_studio/src/editor/parser_edit_style.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_RDO_EDIT_RDOEDITORBASEEDITSTYLE_H_ -#define _RDO_STUDIO_RDO_EDIT_RDOEDITORBASEEDITSTYLE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -17,51 +16,49 @@ namespace rdo { namespace gui { namespace editor { class ParserStyle: public EditStyle { public: - ParserStyle(); - ~ParserStyle(); + ParserStyle(); + ~ParserStyle(); - ParserStyle& operator =( const ParserStyle& style ); - bool operator ==( const ParserStyle& style ) const; - bool operator !=( const ParserStyle& style ) const; + ParserStyle& operator =(const ParserStyle& style); + bool operator ==(const ParserStyle& style) const; + bool operator !=(const ParserStyle& style) const; - virtual bool styleDefault( const int styleType ) const; - virtual bool styleUsing( const int styleType ) const; - virtual bool styleBold( const int styleType = STYLE_DEFAULT ) const; - virtual bool styleItalic( const int styleType = STYLE_DEFAULT ) const; - virtual std::string styleFGColorToHEX( const int styleType = STYLE_DEFAULT ) const; + virtual bool styleDefault(const int styleType) const; + virtual bool styleUsing(const int styleType) const; + virtual bool styleBold(const int styleType = STYLE_DEFAULT) const; + virtual bool styleItalic(const int styleType = STYLE_DEFAULT) const; + virtual std::string styleFGColorToHEX(const int styleType = STYLE_DEFAULT) const; - static ParserStyle getDefaultStyle(); - static ParserStyle getCppStyle(); - static ParserStyle getPascalStyle(); - static ParserStyle getHtmlStyle(); - static ParserStyle getClassicStyle(); - static ParserStyle getTwilightStyle(); - static ParserStyle getOceanStyle(); + static ParserStyle getDefaultStyle(); + static ParserStyle getCppStyle(); + static ParserStyle getPascalStyle(); + static ParserStyle getHtmlStyle(); + static ParserStyle getClassicStyle(); + static ParserStyle getTwilightStyle(); + static ParserStyle getOceanStyle(); - QColor identifierColor; - QColor keywordColor; - QColor functionsColor; - QColor traceColor; - QColor colorColor; - QColor commentColor; - QColor numberColor; - QColor stringColor; - QColor operatorColor; + QColor identifierColor; + QColor keywordColor; + QColor functionsColor; + QColor traceColor; + QColor colorColor; + QColor commentColor; + QColor numberColor; + QColor stringColor; + QColor operatorColor; - style::StyleFont::style identifierStyle; - style::StyleFont::style keywordStyle; - style::StyleFont::style functionsStyle; - style::StyleFont::style traceStyle; - style::StyleFont::style colorStyle; - style::StyleFont::style commentStyle; - style::StyleFont::style numberStyle; - style::StyleFont::style stringStyle; - style::StyleFont::style operatorStyle; + style::StyleFont::Style identifierStyle; + style::StyleFont::Style keywordStyle; + style::StyleFont::Style functionsStyle; + style::StyleFont::Style traceStyle; + style::StyleFont::Style colorStyle; + style::StyleFont::Style commentStyle; + style::StyleFont::Style numberStyle; + style::StyleFont::Style stringStyle; + style::StyleFont::Style operatorStyle; }; QSettings& operator<< (QSettings& settings, const ParserStyle& style); QSettings& operator>> (QSettings& settings, ParserStyle& style); }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_RDO_EDIT_RDOEDITORBASEEDITSTYLE_H_ diff --git a/app/rdo_studio/src/editor/results_edit.cpp b/app/rdo_studio/src/editor/results_edit.cpp index aabde62f5..4061d7a5f 100644 --- a/app/rdo_studio/src/editor/results_edit.cpp +++ b/app/rdo_studio/src/editor/results_edit.cpp @@ -10,15 +10,15 @@ using namespace rdo::gui::editor; Results::Results(QWidget* pParent) - : super(pParent) - , PopupMenu(pParent) + : super(pParent) + , PopupMenu(pParent) { - kw0 = "TRUE FALSE"; - kw1 = ""; - kw2 = ""; - kw3 = ""; + kw0 = "TRUE FALSE"; + kw1 = ""; + kw2 = ""; + kw3 = ""; - setReadOnly( true ); + setReadOnly( true ); } Results::~Results() @@ -26,27 +26,27 @@ Results::~Results() void Results::setEditorStyle(ResultsStyle* pStyle) { - super::setEditorStyle(pStyle); + super::setEditorStyle(pStyle); } void Results::onHelpContext() { - std::string keyword = getCurrentOrSelectedWord(); - std::string s = getAllKW(); - - if (s.find_first_of(keyword) == std::string::npos || keyword.empty()) - { - keyword = "pmv"; - } - - QByteArray ba; - ba.append("activateKeyword "); - ba.append(keyword.c_str()); - ba.append("\n"); - g_pApp->callQtAssistant(ba); + std::string keyword = getCurrentOrSelectedWord(); + std::string s = getAllKW(); + + if (s.find_first_of(keyword) == std::string::npos || keyword.empty()) + { + keyword = "pmv"; + } + + QByteArray ba; + ba.append("activateKeyword "); + ba.append(keyword.c_str()); + ba.append("\n"); + g_pApp->callQtAssistant(ba); } void Results::contextMenuEvent(QContextMenuEvent *pEvent) { - m_pPopupMenu->exec(pEvent->globalPos()); + m_pPopupMenu->exec(pEvent->globalPos()); } diff --git a/app/rdo_studio/src/editor/results_edit.h b/app/rdo_studio/src/editor/results_edit.h index 85e13b8f7..a7ad90f7e 100644 --- a/app/rdo_studio/src/editor/results_edit.h +++ b/app/rdo_studio/src/editor/results_edit.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_PARSER_EDIT_H_ -#define _RDO_STUDIO_EDITOR_PARSER_EDIT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -11,22 +10,20 @@ namespace rdo { namespace gui { namespace editor { class Results - : public Parser - , public PopupMenu + : public Parser + , public PopupMenu { public: - Results(QWidget* pParent); - virtual ~Results(); + Results(QWidget* pParent); + virtual ~Results(); - void setEditorStyle(ResultsStyle* pStyle); + void setEditorStyle(ResultsStyle* pStyle); private: - typedef Parser super; + typedef Parser super; - virtual void contextMenuEvent(QContextMenuEvent* pEvent); - virtual void onHelpContext(); + virtual void contextMenuEvent(QContextMenuEvent* pEvent); + virtual void onHelpContext(); }; }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_PARSER_EDIT_H_ diff --git a/app/rdo_studio/src/editor/results_edit_style.cpp b/app/rdo_studio/src/editor/results_edit_style.cpp index 8caacea98..f6ec26a06 100644 --- a/app/rdo_studio/src/editor/results_edit_style.cpp +++ b/app/rdo_studio/src/editor/results_edit_style.cpp @@ -16,174 +16,174 @@ ResultsStyle::~ResultsStyle() ResultsStyle ResultsStyle::getDefaultStyle() { - ResultsStyle style; - return style; + ResultsStyle style; + return style; } ResultsStyle ResultsStyle::getCppStyle() { - ResultsStyle style; - *static_cast(&style) = ParserStyle::getDefaultStyle(); - - style.identifierColor = QColor( 0x00, 0x00, 0x00 ); - style.keywordColor = QColor( 0x00, 0x00, 0xFF ); - style.functionsColor = QColor( 0x00, 0x00, 0xFF ); - style.traceColor = QColor( 0x00, 0x00, 0xFF ); - style.colorColor = QColor( 0x00, 0x00, 0xFF ); - style.commentColor = QColor( 0x00, 0x80, 0x00 ); - style.numberColor = QColor( 0x00, 0x00, 0x00 ); - style.stringColor = QColor( 0x00, 0x00, 0x00 ); - style.operatorColor = QColor( 0x00, 0x00, 0x00 ); - - style.identifierStyle = StyleFont::NONE; - style.keywordStyle = StyleFont::NONE; - style.functionsStyle = StyleFont::NONE; - style.traceStyle = StyleFont::NONE; - style.colorStyle = StyleFont::NONE; - style.commentStyle = StyleFont::NONE; - style.numberStyle = StyleFont::NONE; - style.stringStyle = StyleFont::NONE; - style.operatorStyle = StyleFont::NONE; - - return style; + ResultsStyle style; + *static_cast(&style) = ParserStyle::getDefaultStyle(); + + style.identifierColor = QColor( 0x00, 0x00, 0x00 ); + style.keywordColor = QColor( 0x00, 0x00, 0xFF ); + style.functionsColor = QColor( 0x00, 0x00, 0xFF ); + style.traceColor = QColor( 0x00, 0x00, 0xFF ); + style.colorColor = QColor( 0x00, 0x00, 0xFF ); + style.commentColor = QColor( 0x00, 0x80, 0x00 ); + style.numberColor = QColor( 0x00, 0x00, 0x00 ); + style.stringColor = QColor( 0x00, 0x00, 0x00 ); + style.operatorColor = QColor( 0x00, 0x00, 0x00 ); + + style.identifierStyle = StyleFont::Style::NONE; + style.keywordStyle = StyleFont::Style::NONE; + style.functionsStyle = StyleFont::Style::NONE; + style.traceStyle = StyleFont::Style::NONE; + style.colorStyle = StyleFont::Style::NONE; + style.commentStyle = StyleFont::Style::NONE; + style.numberStyle = StyleFont::Style::NONE; + style.stringStyle = StyleFont::Style::NONE; + style.operatorStyle = StyleFont::Style::NONE; + + return style; } ResultsStyle ResultsStyle::getPascalStyle() { - ResultsStyle style; - *static_cast(&style) = ParserStyle::getDefaultStyle(); - - style.identifierColor = QColor( 0x00, 0x00, 0x00 ); - style.keywordColor = QColor( 0x00, 0x00, 0x00 ); - style.functionsColor = QColor( 0x00, 0x00, 0x00 ); - style.traceColor = QColor( 0x00, 0x00, 0x00 ); - style.colorColor = QColor( 0x00, 0x00, 0x00 ); - style.commentColor = QColor( 0x00, 0x00, 0x80 ); - style.numberColor = QColor( 0x00, 0x00, 0x00 ); - style.stringColor = QColor( 0x00, 0x00, 0x00 ); - style.operatorColor = QColor( 0x00, 0x00, 0x00 ); - - style.identifierStyle = StyleFont::NONE; - style.keywordStyle = StyleFont::BOLD; - style.functionsStyle = StyleFont::BOLD; - style.traceStyle = StyleFont::BOLD; - style.colorStyle = StyleFont::BOLD; - style.commentStyle = StyleFont::ITALIC; - style.numberStyle = StyleFont::NONE; - style.stringStyle = StyleFont::NONE; - style.operatorStyle = StyleFont::NONE; - - return style; + ResultsStyle style; + *static_cast(&style) = ParserStyle::getDefaultStyle(); + + style.identifierColor = QColor( 0x00, 0x00, 0x00 ); + style.keywordColor = QColor( 0x00, 0x00, 0x00 ); + style.functionsColor = QColor( 0x00, 0x00, 0x00 ); + style.traceColor = QColor( 0x00, 0x00, 0x00 ); + style.colorColor = QColor( 0x00, 0x00, 0x00 ); + style.commentColor = QColor( 0x00, 0x00, 0x80 ); + style.numberColor = QColor( 0x00, 0x00, 0x00 ); + style.stringColor = QColor( 0x00, 0x00, 0x00 ); + style.operatorColor = QColor( 0x00, 0x00, 0x00 ); + + style.identifierStyle = StyleFont::Style::NONE; + style.keywordStyle = StyleFont::Style::BOLD; + style.functionsStyle = StyleFont::Style::BOLD; + style.traceStyle = StyleFont::Style::BOLD; + style.colorStyle = StyleFont::Style::BOLD; + style.commentStyle = StyleFont::Style::ITALIC; + style.numberStyle = StyleFont::Style::NONE; + style.stringStyle = StyleFont::Style::NONE; + style.operatorStyle = StyleFont::Style::NONE; + + return style; } ResultsStyle ResultsStyle::getHtmlStyle() { - ResultsStyle style; - *static_cast(&style) = ParserStyle::getDefaultStyle(); - - style.identifierColor = QColor( 0x00, 0x00, 0x00 ); - style.keywordColor = QColor( 0x80, 0x00, 0x80 ); - style.functionsColor = QColor( 0xFF, 0x00, 0x00 ); - style.traceColor = QColor( 0xFF, 0x00, 0x00 ); - style.colorColor = QColor( 0xFF, 0x00, 0x00 ); - style.commentColor = QColor( 0x00, 0x80, 0x00 ); - style.numberColor = QColor( 0x00, 0x00, 0xFF ); - style.stringColor = QColor( 0x00, 0x00, 0xFF ); - style.operatorColor = QColor( 0x00, 0x00, 0x00 ); - - style.identifierStyle = StyleFont::NONE; - style.keywordStyle = StyleFont::NONE; - style.functionsStyle = StyleFont::NONE; - style.traceStyle = StyleFont::NONE; - style.colorStyle = StyleFont::NONE; - style.commentStyle = StyleFont::NONE; - style.numberStyle = StyleFont::NONE; - style.stringStyle = StyleFont::NONE; - style.operatorStyle = StyleFont::NONE; - - return style; + ResultsStyle style; + *static_cast(&style) = ParserStyle::getDefaultStyle(); + + style.identifierColor = QColor( 0x00, 0x00, 0x00 ); + style.keywordColor = QColor( 0x80, 0x00, 0x80 ); + style.functionsColor = QColor( 0xFF, 0x00, 0x00 ); + style.traceColor = QColor( 0xFF, 0x00, 0x00 ); + style.colorColor = QColor( 0xFF, 0x00, 0x00 ); + style.commentColor = QColor( 0x00, 0x80, 0x00 ); + style.numberColor = QColor( 0x00, 0x00, 0xFF ); + style.stringColor = QColor( 0x00, 0x00, 0xFF ); + style.operatorColor = QColor( 0x00, 0x00, 0x00 ); + + style.identifierStyle = StyleFont::Style::NONE; + style.keywordStyle = StyleFont::Style::NONE; + style.functionsStyle = StyleFont::Style::NONE; + style.traceStyle = StyleFont::Style::NONE; + style.colorStyle = StyleFont::Style::NONE; + style.commentStyle = StyleFont::Style::NONE; + style.numberStyle = StyleFont::Style::NONE; + style.stringStyle = StyleFont::Style::NONE; + style.operatorStyle = StyleFont::Style::NONE; + + return style; } ResultsStyle ResultsStyle::getClassicStyle() { - ResultsStyle style; - *static_cast(&style) = ParserStyle::getClassicStyle(); - - style.identifierColor = QColor( 0xFF, 0xFF, 0x00 ); - style.keywordColor = QColor( 0xFF, 0xFF, 0xFF ); - style.functionsColor = QColor( 0xFF, 0xFF, 0xFF ); - style.traceColor = QColor( 0xFF, 0xFF, 0xFF ); - style.colorColor = QColor( 0xFF, 0xFF, 0xFF ); - style.commentColor = QColor( 0xC0, 0xC0, 0xC0 ); - style.numberColor = QColor( 0xFF, 0xFF, 0x00 ); - style.stringColor = QColor( 0xFF, 0xFF, 0x00 ); - style.operatorColor = QColor( 0xFF, 0xFF, 0x00 ); - - style.identifierStyle = StyleFont::NONE; - style.keywordStyle = StyleFont::NONE; - style.functionsStyle = StyleFont::NONE; - style.traceStyle = StyleFont::NONE; - style.colorStyle = StyleFont::NONE; - style.commentStyle = StyleFont::NONE; - style.numberStyle = StyleFont::NONE; - style.stringStyle = StyleFont::NONE; - style.operatorStyle = StyleFont::NONE; - - return style; + ResultsStyle style; + *static_cast(&style) = ParserStyle::getClassicStyle(); + + style.identifierColor = QColor( 0xFF, 0xFF, 0x00 ); + style.keywordColor = QColor( 0xFF, 0xFF, 0xFF ); + style.functionsColor = QColor( 0xFF, 0xFF, 0xFF ); + style.traceColor = QColor( 0xFF, 0xFF, 0xFF ); + style.colorColor = QColor( 0xFF, 0xFF, 0xFF ); + style.commentColor = QColor( 0xC0, 0xC0, 0xC0 ); + style.numberColor = QColor( 0xFF, 0xFF, 0x00 ); + style.stringColor = QColor( 0xFF, 0xFF, 0x00 ); + style.operatorColor = QColor( 0xFF, 0xFF, 0x00 ); + + style.identifierStyle = StyleFont::Style::NONE; + style.keywordStyle = StyleFont::Style::NONE; + style.functionsStyle = StyleFont::Style::NONE; + style.traceStyle = StyleFont::Style::NONE; + style.colorStyle = StyleFont::Style::NONE; + style.commentStyle = StyleFont::Style::NONE; + style.numberStyle = StyleFont::Style::NONE; + style.stringStyle = StyleFont::Style::NONE; + style.operatorStyle = StyleFont::Style::NONE; + + return style; } ResultsStyle ResultsStyle::getTwilightStyle() { - ResultsStyle style; - *static_cast(&style) = ParserStyle::getTwilightStyle(); - - style.identifierColor = QColor( 0xFF, 0xFF, 0xFF ); - style.keywordColor = QColor( 0x00, 0xFF, 0xFF ); - style.functionsColor = QColor( 0xFF, 0xFF, 0x00 ); - style.traceColor = QColor( 0x00, 0xFF, 0x00 ); - style.colorColor = QColor( 0x00, 0xFF, 0x00 ); - style.commentColor = QColor( 0xC0, 0xC0, 0xC0 ); - style.numberColor = QColor( 0xC0, 0xC0, 0xC0 ); - style.stringColor = QColor( 0xFF, 0xFF, 0xFF ); - style.operatorColor = QColor( 0xFF, 0xFF, 0xFF ); - - style.identifierStyle = StyleFont::NONE; - style.keywordStyle = StyleFont::BOLD; - style.functionsStyle = StyleFont::BOLD; - style.traceStyle = static_cast(StyleFont::BOLD | StyleFont::ITALIC); - style.colorStyle = StyleFont::BOLD; - style.commentStyle = StyleFont::ITALIC; - style.numberStyle = StyleFont::NONE; - style.stringStyle = StyleFont::NONE; - style.operatorStyle = StyleFont::NONE; - - return style; + ResultsStyle style; + *static_cast(&style) = ParserStyle::getTwilightStyle(); + + style.identifierColor = QColor( 0xFF, 0xFF, 0xFF ); + style.keywordColor = QColor( 0x00, 0xFF, 0xFF ); + style.functionsColor = QColor( 0xFF, 0xFF, 0x00 ); + style.traceColor = QColor( 0x00, 0xFF, 0x00 ); + style.colorColor = QColor( 0x00, 0xFF, 0x00 ); + style.commentColor = QColor( 0xC0, 0xC0, 0xC0 ); + style.numberColor = QColor( 0xC0, 0xC0, 0xC0 ); + style.stringColor = QColor( 0xFF, 0xFF, 0xFF ); + style.operatorColor = QColor( 0xFF, 0xFF, 0xFF ); + + style.identifierStyle = StyleFont::Style::NONE; + style.keywordStyle = StyleFont::Style::BOLD; + style.functionsStyle = StyleFont::Style::BOLD; + style.traceStyle = static_cast(static_cast(StyleFont::Style::BOLD) | static_cast(StyleFont::Style::ITALIC)); + style.colorStyle = StyleFont::Style::BOLD; + style.commentStyle = StyleFont::Style::ITALIC; + style.numberStyle = StyleFont::Style::NONE; + style.stringStyle = StyleFont::Style::NONE; + style.operatorStyle = StyleFont::Style::NONE; + + return style; } ResultsStyle ResultsStyle::getOceanStyle() { - ResultsStyle style; - *static_cast(&style) = ParserStyle::getOceanStyle(); - - style.identifierColor = QColor( 0x00, 0x00, 0xFF ); - style.keywordColor = QColor( 0x00, 0x00, 0x00 ); - style.functionsColor = QColor( 0x00, 0x00, 0x00 ); - style.traceColor = QColor( 0x00, 0x00, 0x00 ); - style.colorColor = QColor( 0x00, 0x00, 0x00 ); - style.commentColor = QColor( 0x00, 0x80, 0x80 ); - style.numberColor = QColor( 0x00, 0x00, 0xFF ); - style.stringColor = QColor( 0x00, 0x00, 0xFF ); - style.operatorColor = QColor( 0x00, 0x00, 0xFF ); - - style.identifierStyle = StyleFont::NONE; - style.keywordStyle = StyleFont::BOLD; - style.functionsStyle = StyleFont::BOLD; - style.traceStyle = StyleFont::BOLD; - style.colorStyle = StyleFont::BOLD; - style.commentStyle = StyleFont::ITALIC; - style.numberStyle = StyleFont::NONE; - style.stringStyle = StyleFont::NONE; - style.operatorStyle = StyleFont::NONE; - - return style; + ResultsStyle style; + *static_cast(&style) = ParserStyle::getOceanStyle(); + + style.identifierColor = QColor( 0x00, 0x00, 0xFF ); + style.keywordColor = QColor( 0x00, 0x00, 0x00 ); + style.functionsColor = QColor( 0x00, 0x00, 0x00 ); + style.traceColor = QColor( 0x00, 0x00, 0x00 ); + style.colorColor = QColor( 0x00, 0x00, 0x00 ); + style.commentColor = QColor( 0x00, 0x80, 0x80 ); + style.numberColor = QColor( 0x00, 0x00, 0xFF ); + style.stringColor = QColor( 0x00, 0x00, 0xFF ); + style.operatorColor = QColor( 0x00, 0x00, 0xFF ); + + style.identifierStyle = StyleFont::Style::NONE; + style.keywordStyle = StyleFont::Style::BOLD; + style.functionsStyle = StyleFont::Style::BOLD; + style.traceStyle = StyleFont::Style::BOLD; + style.colorStyle = StyleFont::Style::BOLD; + style.commentStyle = StyleFont::Style::ITALIC; + style.numberStyle = StyleFont::Style::NONE; + style.stringStyle = StyleFont::Style::NONE; + style.operatorStyle = StyleFont::Style::NONE; + + return style; } \ No newline at end of file diff --git a/app/rdo_studio/src/editor/results_edit_style.h b/app/rdo_studio/src/editor/results_edit_style.h index 86151dd2c..bb2d0f5fd 100644 --- a/app/rdo_studio/src/editor/results_edit_style.h +++ b/app/rdo_studio/src/editor/results_edit_style.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_EDITOR_RESULTS_EDIT_STYLE_H_ -#define _RDO_STUDIO_EDITOR_RESULTS_EDIT_STYLE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -11,18 +10,16 @@ namespace rdo { namespace gui { namespace editor { class ResultsStyle: public ParserStyle { public: - ResultsStyle(); - ~ResultsStyle(); + ResultsStyle(); + ~ResultsStyle(); - static ResultsStyle getDefaultStyle(); - static ResultsStyle getCppStyle(); - static ResultsStyle getPascalStyle(); - static ResultsStyle getHtmlStyle(); - static ResultsStyle getClassicStyle(); - static ResultsStyle getTwilightStyle(); - static ResultsStyle getOceanStyle(); + static ResultsStyle getDefaultStyle(); + static ResultsStyle getCppStyle(); + static ResultsStyle getPascalStyle(); + static ResultsStyle getHtmlStyle(); + static ResultsStyle getClassicStyle(); + static ResultsStyle getTwilightStyle(); + static ResultsStyle getOceanStyle(); }; }}} // namespace rdo::gui::editor - -#endif // _RDO_STUDIO_EDITOR_RESULTS_EDIT_STYLE_H_ diff --git a/app/rdo_studio/src/frame/frame_manager.cpp b/app/rdo_studio/src/frame/frame_manager.cpp index ee4923f14..8675efe39 100644 --- a/app/rdo_studio/src/frame/frame_manager.cpp +++ b/app/rdo_studio/src/frame/frame_manager.cpp @@ -20,423 +20,423 @@ using namespace rdo::gui::frame; // -------------------- Manager::Frame // -------------------------------------------------------------------------------- Manager::Frame::Frame() - : m_pTreeWidgetItem(NULL) - , m_pView (NULL) - , m_pContent (NULL) + : m_pTreeWidgetItem(NULL) + , m_pView (NULL) + , m_pContent (NULL) {} Manager::Frame::~Frame() { - clear(); + clear(); } void Manager::Frame::clear() { - m_areaList.clear(); + m_areaList.clear(); } // -------------------------------------------------------------------------------- // -------------------- Manager // -------------------------------------------------------------------------------- Manager::Manager(const OnChangeFrame& onChangeFrame) - : m_lastShowedFrame(std::size_t(~0)) - , m_currentShowingFrame(std::size_t(~0)) - , m_changed(false) - , m_onChangeFrame(onChangeFrame) + : m_lastShowedFrame(std::size_t(~0)) + , m_currentShowingFrame(std::size_t(~0)) + , m_changed(false) + , m_onChangeFrame(onChangeFrame) { - //! @todo А почему объект не удаляется ? Это происходит автоматически ? + // TODO А почему объект не удаляется ? Это происходит автоматически ? - QObject::connect(g_pApp->getMainWndUI()->mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(onSubWindowActivated(QMdiSubWindow*))); + QObject::connect(g_pApp->getMainWndUI()->mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(onSubWindowActivated(QMdiSubWindow*))); - QObject::connect( - &g_pApp->getIMainWnd()->getDockFrame().getContext(), &TreeCtrl::itemDoubleClicked, - this, &Manager::onTreeWidgetItemDoubleClicked - ); + QObject::connect( + &g_pApp->getIMainWnd()->getDockFrame().getContext(), &TreeCtrl::itemDoubleClicked, + this, &Manager::onTreeWidgetItemDoubleClicked + ); } Manager::~Manager() { - clear(); + clear(); - for (Frame* pFrame: m_frameList) - { - delete pFrame; - } + for (Frame* pFrame: m_frameList) + { + delete pFrame; + } } void Manager::insertFrame(const QString& frameName) { - Frame* item = new Frame(); - item->m_pTreeWidgetItem = g_pApp->getIMainWnd()->getDockFrame().getContext().insertFrame(frameName); - item->m_name = frameName; - m_frameList.push_back(item); + Frame* item = new Frame(); + item->m_pTreeWidgetItem = g_pApp->getIMainWnd()->getDockFrame().getContext().insertFrame(frameName); + item->m_name = frameName; + m_frameList.push_back(item); } std::size_t Manager::findFrameIndex(const QTreeWidgetItem* pTreeWidgetItem) const { - std::size_t index = 0; - for (const Frame* pFrame: m_frameList) - { - if (pFrame->m_pTreeWidgetItem == pTreeWidgetItem) - { - return index; - } - index++; - } - return std::size_t(~0); + std::size_t index = 0; + for (const Frame* pFrame: m_frameList) + { + if (pFrame->m_pTreeWidgetItem == pTreeWidgetItem) + { + return index; + } + index++; + } + return std::size_t(~0); } std::size_t Manager::findFrameIndex(const View* pView) const { - std::size_t index = 0; - for (const Frame* pFrame: m_frameList) - { - if (pFrame->m_pView == pView) - { - return index; - } - index++; - } - return std::size_t(~0); + std::size_t index = 0; + for (const Frame* pFrame: m_frameList) + { + if (pFrame->m_pView == pView) + { + return index; + } + index++; + } + return std::size_t(~0); } std::size_t Manager::findFrameIndex(const Content* pContent) const { - std::size_t index = 0; - for (const Frame* pFrame: m_frameList) - { - if (pFrame->m_pContent == pContent) - { - return index; - } - index++; - } - return std::size_t(~0); + std::size_t index = 0; + for (const Frame* pFrame: m_frameList) + { + if (pFrame->m_pContent == pContent) + { + return index; + } + index++; + } + return std::size_t(~0); } const QString& Manager::getFrameName(std::size_t index) const { - ASSERT(index < m_frameList.size()); - return m_frameList[index]->m_name; + ASSERT(index < m_frameList.size()); + return m_frameList[index]->m_name; } View* Manager::getFrameView(std::size_t index) const { - ASSERT(index < m_frameList.size()); - return m_frameList[index]->m_pView; + ASSERT(index < m_frameList.size()); + return m_frameList[index]->m_pView; } View* Manager::getFrameViewFirst() const { - if (m_frameList.empty()) - return NULL; + if (m_frameList.empty()) + return NULL; - return m_frameList.front()->m_pView; + return m_frameList.front()->m_pView; } std::size_t Manager::count() const { - return m_frameList.size(); + return m_frameList.size(); } bool Manager::isChanged() { - bool res = m_changed; - m_changed = false; - return res; + bool res = m_changed; + m_changed = false; + return res; } void Manager::areaDown(std::size_t frameIndex, const QPoint& point) const { - ASSERT(frameIndex != std::size_t(~0) && frameIndex < m_frameList.size()); + ASSERT(frameIndex != std::size_t(~0) && frameIndex < m_frameList.size()); - const rdo::gui::animation::AreaList& areaList = m_frameList[frameIndex]->m_areaList; - for (const rdo::gui::animation::AreaList::value_type& area: areaList) - { - if (area.second.m_rect.contains(point)) - { - std::string areaName = area.first.toStdString(); - g_pModel->sendMessage(kernel->runtime(), RDOThread::RT_RUNTIME_FRAME_AREA_DOWN, &areaName); - } - } + const rdo::gui::animation::AreaList& areaList = m_frameList[frameIndex]->m_areaList; + for (const rdo::gui::animation::AreaList::value_type& area: areaList) + { + if (area.second.m_rect.contains(point)) + { + std::string areaName = area.first.toStdString(); + g_pModel->sendMessage(kernel->runtime(), RDOThread::Message::RUNTIME_FRAME_AREA_DOWN, &areaName); + } + } } View* Manager::createView(std::size_t index) { - View* pView = NULL; - if (index != std::size_t(~0)) - { - pView = new View(NULL); - g_pApp->getIMainWnd()->addSubWindow(pView); - pView->parentWidget()->setWindowIcon (QIcon(QString::fromUtf8(":/images/images/mdi_frame.png"))); - pView->parentWidget()->setWindowTitle(QString("кадр: %1").arg(getFrameName(index))); + View* pView = NULL; + if (index != std::size_t(~0)) + { + pView = new View(NULL); + g_pApp->getIMainWnd()->addSubWindow(pView); + pView->parentWidget()->setWindowIcon (QIcon(QString::fromUtf8(":/images/images/mdi_frame.png"))); + pView->parentWidget()->setWindowTitle(QString("кадр: %1").arg(getFrameName(index))); - m_frameList[index]->m_pView = pView; - m_frameList[index]->m_pContent = pView->getContent(); - m_lastShowedFrame = index; - setCurrentShowingFrame(index); - } - return pView; + m_frameList[index]->m_pView = pView; + m_frameList[index]->m_pContent = pView->getContent(); + m_lastShowedFrame = index; + setCurrentShowingFrame(index); + } + return pView; } bool Manager::isShowing() const { - for (const Frame* pFrame: m_frameList) - { - if (pFrame->m_pView && pFrame->m_pView->isVisible()) - return true; - } - return false; + for (const Frame* pFrame: m_frameList) + { + if (pFrame->m_pView && pFrame->m_pView->isVisible()) + return true; + } + return false; } void Manager::disconnectView(const View* pView) { - std::size_t index = findFrameIndex(pView); - if (index != std::size_t(~0)) - { - m_frameList[index]->m_pView = NULL; - } - m_changed = true; + std::size_t index = findFrameIndex(pView); + if (index != std::size_t(~0)) + { + m_frameList[index]->m_pView = NULL; + } + m_changed = true; } void Manager::closeAll() { - std::size_t backup = m_lastShowedFrame; - for (Frame* pFrame: m_frameList) - { - if (pFrame->m_pView) - { - pFrame->m_pView->parentWidget()->close(); - pFrame->m_pView = NULL; - } - } - m_lastShowedFrame = backup; + std::size_t backup = m_lastShowedFrame; + for (Frame* pFrame: m_frameList) + { + if (pFrame->m_pView) + { + pFrame->m_pView->parentWidget()->close(); + pFrame->m_pView = NULL; + } + } + m_lastShowedFrame = backup; } void Manager::clear() { - if (g_pApp->getStyle()) - { - g_pApp->getIMainWnd()->getDockFrame().getContext().clear(); - } - for (Frame* pFrame: m_frameList) - { - if (pFrame->m_pView) - { - pFrame->m_pView->parentWidget()->close(); - pFrame->m_pView = NULL; - } - delete pFrame; - } + if (g_pApp->getStyle()) + { + g_pApp->getIMainWnd()->getDockFrame().getContext().clear(); + } + for (Frame* pFrame: m_frameList) + { + if (pFrame->m_pView) + { + pFrame->m_pView->parentWidget()->close(); + pFrame->m_pView = NULL; + } + delete pFrame; + } - m_frameList .clear(); - m_bitmapList.clear(); + m_frameList .clear(); + m_bitmapList.clear(); - m_lastShowedFrame = std::size_t(~0); - setCurrentShowingFrame(std::size_t(~0)); + m_lastShowedFrame = std::size_t(~0); + setCurrentShowingFrame(std::size_t(~0)); } std::size_t Manager::getLastShowedFrame() const { - return m_lastShowedFrame; + return m_lastShowedFrame; } void Manager::setLastShowedFrame(std::size_t index) { - if (index != std::size_t(~0) && index < count()) - { - m_lastShowedFrame = index; - } + if (index != std::size_t(~0) && index < count()) + { + m_lastShowedFrame = index; + } } void Manager::setCurrentShowingFrame(std::size_t index) { - if (index == std::size_t(~0) || (index != std::size_t(~0) && index < count())) - { - m_currentShowingFrame = index; - if (g_pApp->getStyle()) - { - if (m_currentShowingFrame != std::size_t(~0)) - { - g_pApp->getIMainWnd()->getDockFrame().getContext().setCurrentItem(m_frameList[m_currentShowingFrame]->m_pTreeWidgetItem); - } - else - { - g_pApp->getIMainWnd()->getDockFrame().getContext().setCurrentItem(NULL); - } - } - m_onChangeFrame(index); - } + if (index == std::size_t(~0) || (index != std::size_t(~0) && index < count())) + { + m_currentShowingFrame = index; + if (g_pApp->getStyle()) + { + if (m_currentShowingFrame != std::size_t(~0)) + { + g_pApp->getIMainWnd()->getDockFrame().getContext().setCurrentItem(m_frameList[m_currentShowingFrame]->m_pTreeWidgetItem); + } + else + { + g_pApp->getIMainWnd()->getDockFrame().getContext().setCurrentItem(NULL); + } + } + m_onChangeFrame(index); + } } void Manager::resetCurrentShowingFrame(std::size_t index) { - if (index == m_currentShowingFrame) - { - setCurrentShowingFrame(std::size_t(~0)); - } + if (index == m_currentShowingFrame) + { + setCurrentShowingFrame(std::size_t(~0)); + } } void Manager::insertBitmap(const QString& bitmapName) { - if (m_bitmapList.find(bitmapName) != m_bitmapList.end()) - return; + if (m_bitmapList.find(bitmapName) != m_bitmapList.end()) + return; - g_pApp->getIMainWnd()->getDockDebug().appendString(QString("Загрузка %1...").arg(bitmapName)); - g_pApp->getIMainWnd()->getDockDebug().getContext().update(); + g_pApp->getIMainWnd()->getDockDebug().appendString(QString("Загрузка %1...").arg(bitmapName)); + g_pApp->getIMainWnd()->getDockDebug().getContext().update(); - std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); - rdo::repository::RDOThreadRepository::BinaryFile data(bitmapName.toStdWString(), stream); - g_pModel->sendMessage(kernel->repository(), RDOThread::RT_REPOSITORY_LOAD_BINARY, &data); + std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); + rdo::repository::RDOThreadRepository::BinaryFile data(bitmapName.toStdWString(), stream); + g_pModel->sendMessage(kernel->repository(), RDOThread::Message::REPOSITORY_LOAD_BINARY, &data); - bool ok = false; - QPixmap pixmap(QString::fromStdWString(data.m_name.wstring())); - if (!pixmap.isNull()) - { - std::pair result = - m_bitmapList.insert(rdo::gui::BitmapList::value_type(bitmapName, pixmap)); - if (result.second) - { - ok = true; - } - } + bool ok = false; + QPixmap pixmap(QString::fromStdWString(data.m_name.wstring())); + if (!pixmap.isNull()) + { + std::pair result = + m_bitmapList.insert(rdo::gui::BitmapList::value_type(bitmapName, pixmap)); + if (result.second) + { + ok = true; + } + } - g_pApp->getIMainWnd()->getDockDebug().appendString(ok ? " ok\n" : " failed\n"); - g_pApp->getIMainWnd()->getDockDebug().getContext().update(); + g_pApp->getIMainWnd()->getDockDebug().appendString(ok ? " ok\n" : " failed\n"); + g_pApp->getIMainWnd()->getDockDebug().getContext().update(); } void Manager::showFrame(const rdo::animation::Frame* const pFrame, std::size_t index) { - if (index < count()) - { - View* pFrameView = getFrameView(index); - ASSERT(pFrameView); - rdo::gui::BitmapList bitmapGeneratedList; - pFrameView->update(pFrame, m_bitmapList, bitmapGeneratedList, m_frameList[index]->m_areaList); - if (!bitmapGeneratedList.empty()) - { - std::copy(bitmapGeneratedList.begin(), bitmapGeneratedList.end(), std::inserter(m_bitmapList, m_bitmapList.begin())); - } - } + if (index < count()) + { + View* pFrameView = getFrameView(index); + ASSERT(pFrameView); + rdo::gui::BitmapList bitmapGeneratedList; + pFrameView->update(pFrame, m_bitmapList, bitmapGeneratedList, m_frameList[index]->m_areaList); + if (!bitmapGeneratedList.empty()) + { + std::copy(bitmapGeneratedList.begin(), bitmapGeneratedList.end(), std::inserter(m_bitmapList, m_bitmapList.begin())); + } + } } void Manager::showNextFrame() { - std::size_t cnt = count(); - if (g_pModel->isRunning() && g_pModel->getRuntimeMode() != rdo::runtime::RTM_MaxSpeed && cnt > 1 && m_currentShowingFrame < cnt-1) - { - std::size_t index = m_currentShowingFrame + 1; - View* pView = getFrameView(index); - if (!pView) - { - pView = createView(index); - } - else - { - pView->parentWidget()->raise(); - pView->parentWidget()->activateWindow(); - setLastShowedFrame (index); - setCurrentShowingFrame(index); - } - } + std::size_t cnt = count(); + if (g_pModel->isRunning() && g_pModel->getRuntimeMode() != rdo::runtime::RunTimeMode::MAX_SPEED && cnt > 1 && m_currentShowingFrame < cnt-1) + { + std::size_t index = m_currentShowingFrame + 1; + View* pView = getFrameView(index); + if (!pView) + { + pView = createView(index); + } + else + { + pView->parentWidget()->raise(); + pView->parentWidget()->activateWindow(); + setLastShowedFrame (index); + setCurrentShowingFrame(index); + } + } } void Manager::showPrevFrame() { - std::size_t cnt = count(); - if (g_pModel->isRunning() && g_pModel->getRuntimeMode() != rdo::runtime::RTM_MaxSpeed && cnt > 1 && m_currentShowingFrame != std::size_t(~0)) - { - std::size_t index = m_currentShowingFrame - 1; - View* pView = getFrameView(index); - if (!pView) - { - pView = createView(index); - } - else - { - pView->parentWidget()->raise(); - pView->parentWidget()->activateWindow(); - setLastShowedFrame (index); - setCurrentShowingFrame(index); - } - } + std::size_t cnt = count(); + if (g_pModel->isRunning() && g_pModel->getRuntimeMode() != rdo::runtime::RunTimeMode::MAX_SPEED && cnt > 1 && m_currentShowingFrame != std::size_t(~0)) + { + std::size_t index = m_currentShowingFrame - 1; + View* pView = getFrameView(index); + if (!pView) + { + pView = createView(index); + } + else + { + pView->parentWidget()->raise(); + pView->parentWidget()->activateWindow(); + setLastShowedFrame (index); + setCurrentShowingFrame(index); + } + } } void Manager::showFrame(std::size_t index) { - std::size_t cnt = count(); - if (g_pModel->isRunning() && g_pModel->getRuntimeMode() != rdo::runtime::RTM_MaxSpeed && cnt > 1 && index >= 0 && index < cnt) - { - View* pView = getFrameView(index); - if (!pView) - { - pView = createView(index); - } - else - { - pView->parentWidget()->raise(); - pView->parentWidget()->activateWindow(); - setLastShowedFrame (index); - setCurrentShowingFrame(index); - } - } + std::size_t cnt = count(); + if (g_pModel->isRunning() && g_pModel->getRuntimeMode() != rdo::runtime::RunTimeMode::MAX_SPEED && cnt > 1 && index >= 0 && index < cnt) + { + View* pView = getFrameView(index); + if (!pView) + { + pView = createView(index); + } + else + { + pView->parentWidget()->raise(); + pView->parentWidget()->activateWindow(); + setLastShowedFrame (index); + setCurrentShowingFrame(index); + } + } } bool Manager::canShowNextFrame() const { - std::size_t cnt = count(); - return g_pModel->isRunning() && g_pModel->getRuntimeMode() != rdo::runtime::RTM_MaxSpeed && cnt > 1 && (m_currentShowingFrame == std::size_t(~0) || m_currentShowingFrame < cnt-1); + std::size_t cnt = count(); + return g_pModel->isRunning() && g_pModel->getRuntimeMode() != rdo::runtime::RunTimeMode::MAX_SPEED && cnt > 1 && (m_currentShowingFrame == std::size_t(~0) || m_currentShowingFrame < cnt-1); } bool Manager::canShowPrevFrame() const { - int cnt = count(); - return g_pModel->isRunning() && g_pModel->getRuntimeMode() != rdo::runtime::RTM_MaxSpeed && cnt > 1 && (m_currentShowingFrame != std::size_t(~0) && m_currentShowingFrame > 0); + int cnt = count(); + return g_pModel->isRunning() && g_pModel->getRuntimeMode() != rdo::runtime::RunTimeMode::MAX_SPEED && cnt > 1 && (m_currentShowingFrame != std::size_t(~0) && m_currentShowingFrame > 0); } void Manager::updateStyles() const { - for (Frame* pFrame: m_frameList) - { - View* pFrameView = pFrame->m_pView; - if (pFrameView) - { - pFrameView->updateFont(); - pFrameView->update (); - } - } + for (Frame* pFrame: m_frameList) + { + View* pFrameView = pFrame->m_pView; + if (pFrameView) + { + pFrameView->updateFont(); + pFrameView->update (); + } + } } void Manager::onSubWindowActivated(QMdiSubWindow* pWindow) { - if (!pWindow) - return; + if (!pWindow) + return; - View* pFrameAnimationWnd = dynamic_cast(pWindow->widget()); - if (!pFrameAnimationWnd) - return; + View* pFrameAnimationWnd = dynamic_cast(pWindow->widget()); + if (!pFrameAnimationWnd) + return; - std::size_t index = findFrameIndex(pFrameAnimationWnd); - setLastShowedFrame(index); - setCurrentShowingFrame(index); + std::size_t index = findFrameIndex(pFrameAnimationWnd); + setLastShowedFrame(index); + setCurrentShowingFrame(index); } void Manager::onTreeWidgetItemDoubleClicked(QTreeWidgetItem* pTreeWidgetItem, int) { - if (g_pModel->getRuntimeMode() == rdo::runtime::RTM_MaxSpeed) - return; - - std::size_t index = findFrameIndex(pTreeWidgetItem); - if (index == std::size_t(~0)) - return; - - View* pView = getFrameView(index); - if (!pView) - { - createView(index); - } - else - { - g_pApp->getIMainWnd()->activateSubWindow(pView->parentWidget()); - } + if (g_pModel->getRuntimeMode() == rdo::runtime::RunTimeMode::MAX_SPEED) + return; + + std::size_t index = findFrameIndex(pTreeWidgetItem); + if (index == std::size_t(~0)) + return; + + View* pView = getFrameView(index); + if (!pView) + { + createView(index); + } + else + { + g_pApp->getIMainWnd()->activateSubWindow(pView->parentWidget()); + } } diff --git a/app/rdo_studio/src/frame/frame_manager.h b/app/rdo_studio/src/frame/frame_manager.h index 60d726602..1629020c9 100644 --- a/app/rdo_studio/src/frame/frame_manager.h +++ b/app/rdo_studio/src/frame/frame_manager.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_FRAME_MANAGER_H_ -#define _RDO_STUDIO_FRAME_MANAGER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -28,74 +27,72 @@ class Manager: public QObject Q_OBJECT public: - typedef boost::function OnChangeFrame; - - Manager(const OnChangeFrame& onChangeFrame); - virtual ~Manager(); - - void insertFrame (const QString& frameName ); - void insertBitmap(const QString& bitmapName); - - std::size_t findFrameIndex(const QTreeWidgetItem* pTreeWidgetItem) const; - std::size_t findFrameIndex(const View* pView) const; - std::size_t findFrameIndex(const Content* pContent) const; - - bool isShowing() const; - const QString& getFrameName(std::size_t index) const; - View* getFrameView(std::size_t index) const; - View* getFrameViewFirst() const; - std::size_t count() const; - bool isChanged(); - - void areaDown(std::size_t frameIndex, const QPoint& point) const; - - View* createView(std::size_t index); - void disconnectView(const View* pView); - void closeAll(); - void clear(); - - std::size_t getLastShowedFrame() const; - void setLastShowedFrame(std::size_t index); - void setCurrentShowingFrame(std::size_t index); - void resetCurrentShowingFrame(std::size_t index); - void showFrame(const rdo::animation::Frame* const pFrame, std::size_t index); - void showNextFrame(); - void showPrevFrame(); - void showFrame(std::size_t index); - bool canShowNextFrame() const; - bool canShowPrevFrame() const; - void updateStyles() const; + typedef boost::function OnChangeFrame; + + Manager(const OnChangeFrame& onChangeFrame); + virtual ~Manager(); + + void insertFrame (const QString& frameName ); + void insertBitmap(const QString& bitmapName); + + std::size_t findFrameIndex(const QTreeWidgetItem* pTreeWidgetItem) const; + std::size_t findFrameIndex(const View* pView) const; + std::size_t findFrameIndex(const Content* pContent) const; + + bool isShowing() const; + const QString& getFrameName(std::size_t index) const; + View* getFrameView(std::size_t index) const; + View* getFrameViewFirst() const; + std::size_t count() const; + bool isChanged(); + + void areaDown(std::size_t frameIndex, const QPoint& point) const; + + View* createView(std::size_t index); + void disconnectView(const View* pView); + void closeAll(); + void clear(); + + std::size_t getLastShowedFrame() const; + void setLastShowedFrame(std::size_t index); + void setCurrentShowingFrame(std::size_t index); + void resetCurrentShowingFrame(std::size_t index); + void showFrame(const rdo::animation::Frame* const pFrame, std::size_t index); + void showNextFrame(); + void showPrevFrame(); + void showFrame(std::size_t index); + bool canShowNextFrame() const; + bool canShowPrevFrame() const; + void updateStyles() const; private: - struct Frame - { - Frame(); - ~Frame(); - - QTreeWidgetItem* m_pTreeWidgetItem; - QString m_name; - View* m_pView; - Content* m_pContent; - rdo::gui::animation::AreaList m_areaList; - - private: - void clear(); - }; - - typedef std::vector FrameList; - - FrameList m_frameList; - rdo::gui::BitmapList m_bitmapList; - std::size_t m_lastShowedFrame; - std::size_t m_currentShowingFrame; - bool m_changed; - OnChangeFrame m_onChangeFrame; + struct Frame + { + Frame(); + ~Frame(); + + QTreeWidgetItem* m_pTreeWidgetItem; + QString m_name; + View* m_pView; + Content* m_pContent; + rdo::gui::animation::AreaList m_areaList; + + private: + void clear(); + }; + + typedef std::vector FrameList; + + FrameList m_frameList; + rdo::gui::BitmapList m_bitmapList; + std::size_t m_lastShowedFrame; + std::size_t m_currentShowingFrame; + bool m_changed; + OnChangeFrame m_onChangeFrame; private slots: - void onSubWindowActivated (QMdiSubWindow* pWindow); - void onTreeWidgetItemDoubleClicked(QTreeWidgetItem* pTreeWidgetItem, int); + void onSubWindowActivated (QMdiSubWindow* pWindow); + void onTreeWidgetItemDoubleClicked(QTreeWidgetItem* pTreeWidgetItem, int); }; }}} // namespace rdo::gui::frame - -#endif // _RDO_STUDIO_FRAME_MANAGER_H_ diff --git a/app/rdo_studio/src/frame/frame_options_view.cpp b/app/rdo_studio/src/frame/frame_options_view.cpp index a8ec0ad83..a9d249fd4 100644 --- a/app/rdo_studio/src/frame/frame_options_view.cpp +++ b/app/rdo_studio/src/frame/frame_options_view.cpp @@ -15,35 +15,35 @@ using namespace rdo::gui::frame; using namespace rdo::gui::style; OptionsView::OptionsView(QWidget* pParent) - : QWidget(pParent) - , m_style(NULL) + : QWidget(pParent) + , m_style(NULL) { - setupUi(this); - englishSampleLabel->setText("Sample of drawing text"); - russianSampleLabel->setText("Пример текста"); + setupUi(this); + englishSampleLabel->setText("Sample of drawing text"); + russianSampleLabel->setText("Пример текста"); } void OptionsView::setStyle(FrameStyle* style) { - m_style = style; + m_style = style; - QFont font(QString::fromStdString(m_style->font.name), m_style->font.size); + QFont font(QString::fromStdString(m_style->font.name), m_style->font.size); - font.setWeight((m_style->defaultStyle & StyleFont::BOLD) != 0 ? QFont::Bold : QFont::Normal); - font.setItalic((m_style->defaultStyle & StyleFont::ITALIC) != 0 ? true : false); - font.setUnderline((m_style->defaultStyle & StyleFont::UNDERLINE) != 0 ? true : false); + font.setWeight((static_cast(m_style->defaultStyle) & static_cast(StyleFont::Style::BOLD)) != 0 ? QFont::Bold : QFont::Normal); + font.setItalic((static_cast(m_style->defaultStyle) & static_cast(StyleFont::Style::ITALIC)) != 0 ? true : false); + font.setUnderline((static_cast(m_style->defaultStyle) & static_cast(StyleFont::Style::UNDERLINE)) != 0 ? true : false); - QPalette* fontPalette = new QPalette(); - fontPalette->setColor(QPalette::WindowText, Qt::yellow); - englishSampleLabel->setPalette(*fontPalette); - russianSampleLabel->setPalette(*fontPalette); - englishSampleLabel->setFont(font); - russianSampleLabel->setFont(font); + QPalette* fontPalette = new QPalette(); + fontPalette->setColor(QPalette::WindowText, Qt::yellow); + englishSampleLabel->setPalette(*fontPalette); + russianSampleLabel->setPalette(*fontPalette); + englishSampleLabel->setFont(font); + russianSampleLabel->setFont(font); - pictureLabel->setStyleSheet("border: 1px solid "+m_style->defaultColor.name()+";"); + pictureLabel->setStyleSheet("border: 1px solid "+m_style->defaultColor.name()+";"); - QPalette* palette = new QPalette(); - palette->setColor(QPalette::Background, m_style->backgroundColor); - setAutoFillBackground(true); - setPalette(*palette); + QPalette* palette = new QPalette(); + palette->setColor(QPalette::Background, m_style->backgroundColor); + setAutoFillBackground(true); + setPalette(*palette); } \ No newline at end of file diff --git a/app/rdo_studio/src/frame/frame_options_view.h b/app/rdo_studio/src/frame/frame_options_view.h index 6aa884e33..7b07ebb36 100644 --- a/app/rdo_studio/src/frame/frame_options_view.h +++ b/app/rdo_studio/src/frame/frame_options_view.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_FRAME_OPTIONS_VIEW_H_ -#define _RDO_STUDIO_FRAME_OPTIONS_VIEW_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -13,19 +12,17 @@ namespace rdo { namespace gui { namespace frame { class OptionsView - : public QWidget - , private Ui::FrameOptionsWidget + : public QWidget + , private Ui::FrameOptionsWidget { private: - QFont font; - FrameStyle* m_style; + QFont font; + FrameStyle* m_style; public: - explicit OptionsView(QWidget* pParent); + explicit OptionsView(QWidget* pParent); - void setStyle(FrameStyle* style); + void setStyle(FrameStyle* style); }; }}} // namespace rdo::gui::frame - -#endif // _RDO_STUDIO_FRAME_OPTIONS_VIEW_H_ diff --git a/app/rdo_studio/src/frame/frame_style.cpp b/app/rdo_studio/src/frame/frame_style.cpp index aed3245a2..163840917 100644 --- a/app/rdo_studio/src/frame/frame_style.cpp +++ b/app/rdo_studio/src/frame/frame_style.cpp @@ -13,11 +13,11 @@ using namespace rdo::gui::style; // -------------------------------------------------------------------------------- FrameStyle::FrameStyle(): StyleBase() { - defaultColor = QColor( 0x00, 0x00, 0x00 ); - backgroundColor = QColor( 0x00, 0x80, 0x80 ); + defaultColor = QColor(0x00, 0x00, 0x00); + backgroundColor = QColor(0x00, 0x80, 0x80); - defaultStyle = StyleFont::NONE; - font = StyleFont::getFrameFont(); + defaultStyle = StyleFont::Style::NONE; + font = StyleFont::getFrameFont(); } FrameStyle::~FrameStyle() @@ -25,25 +25,25 @@ FrameStyle::~FrameStyle() FrameStyle& FrameStyle::operator =( const FrameStyle& style ) { - StyleBase::operator=( style ); + StyleBase::operator=( style ); - return *this; + return *this; } bool FrameStyle::operator ==( const FrameStyle& style ) const { - bool flag = StyleBase::operator==( style ); + bool flag = StyleBase::operator==( style ); - return flag; + return flag; } bool FrameStyle::operator !=( const FrameStyle& style ) const { - return !(*this == style); + return !(*this == style); } FrameStyle FrameStyle::getDefaultStyle() { - FrameStyle style; - return style; + FrameStyle style; + return style; } \ No newline at end of file diff --git a/app/rdo_studio/src/frame/frame_style.h b/app/rdo_studio/src/frame/frame_style.h index fbde7c429..9522748a8 100644 --- a/app/rdo_studio/src/frame/frame_style.h +++ b/app/rdo_studio/src/frame/frame_style.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_FRAME_STYLE_H_ -#define _RDO_STUDIO_FRAME_STYLE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -14,16 +13,14 @@ namespace rdo { namespace gui { namespace frame { class FrameStyle: public rdo::gui::style::StyleBase { public: - FrameStyle(); - ~FrameStyle(); + FrameStyle(); + ~FrameStyle(); - FrameStyle& operator =( const FrameStyle& style ); - bool operator ==( const FrameStyle& style ) const; - bool operator !=( const FrameStyle& style ) const; + FrameStyle& operator =( const FrameStyle& style ); + bool operator ==( const FrameStyle& style ) const; + bool operator !=( const FrameStyle& style ) const; - static FrameStyle getDefaultStyle(); + static FrameStyle getDefaultStyle(); }; }}} // namespace rdo::gui::frame - -#endif // _RDO_STUDIO_FRAME_STYLE_H_ diff --git a/app/rdo_studio/src/frame/frame_tree_ctrl.cpp b/app/rdo_studio/src/frame/frame_tree_ctrl.cpp index 3c307c967..c037e1aec 100644 --- a/app/rdo_studio/src/frame/frame_tree_ctrl.cpp +++ b/app/rdo_studio/src/frame/frame_tree_ctrl.cpp @@ -10,16 +10,16 @@ using namespace rdo::gui::frame; TreeCtrl::TreeCtrl(QWidget* pParent) - : parent_type(pParent) + : parent_type(pParent) { - setColumnCount (1); - setHeaderHidden (true); - setRootIsDecorated(false); + setColumnCount (1); + setHeaderHidden (true); + setRootIsDecorated(false); - m_pRootItem = new QTreeWidgetItem(this); - m_pRootItem->setText(0, "Кадры"); - m_pRootItem->setIcon(0, QIcon(QString::fromUtf8(":/images/images/tree_frame_root.png"))); - addTopLevelItem(m_pRootItem); + m_pRootItem = new QTreeWidgetItem(this); + m_pRootItem->setText(0, "Кадры"); + m_pRootItem->setIcon(0, QIcon(QString::fromUtf8(":/images/images/tree_frame_root.png"))); + addTopLevelItem(m_pRootItem); } TreeCtrl::~TreeCtrl() @@ -27,49 +27,49 @@ TreeCtrl::~TreeCtrl() QTreeWidgetItem* TreeCtrl::insertFrame(const QString& name) { - QTreeWidgetItem* pItem = new QTreeWidgetItem(m_pRootItem); - ASSERT(pItem); - pItem->setText(0, name); - pItem->setIcon(0, QIcon(QString::fromUtf8(":/images/images/tree_frame_item.png"))); - return pItem; + QTreeWidgetItem* pItem = new QTreeWidgetItem(m_pRootItem); + ASSERT(pItem); + pItem->setText(0, name); + pItem->setIcon(0, QIcon(QString::fromUtf8(":/images/images/tree_frame_item.png"))); + return pItem; } void TreeCtrl::clear() { - QList children = m_pRootItem->takeChildren(); - for (QTreeWidgetItem* item: children) - { - m_pRootItem->removeChild(item); - } + QList children = m_pRootItem->takeChildren(); + for (QTreeWidgetItem* item: children) + { + m_pRootItem->removeChild(item); + } } void TreeCtrl::focusInEvent(QFocusEvent* pEvent) { - parent_type::focusInEvent(pEvent); - activate(pEvent); + parent_type::focusInEvent(pEvent); + activate(pEvent); } void TreeCtrl::focusOutEvent(QFocusEvent* pEvent) { - deactivate(pEvent); - parent_type::focusOutEvent(pEvent); + deactivate(pEvent); + parent_type::focusOutEvent(pEvent); } void TreeCtrl::onUpdateActions(bool activated) { - MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); + MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); - updateAction( - pMainWindow->actHelpContext, - activated, - this, &TreeCtrl::onHelpContext - ); + updateAction( + pMainWindow->actHelpContext, + activated, + this, &TreeCtrl::onHelpContext + ); } void TreeCtrl::onHelpContext() { - QByteArray ba; - ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_model/work_model_frame.htm#frame\n"); - g_pApp->callQtAssistant(ba); + QByteArray ba; + ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_model/work_model_frame.htm#frame\n"); + g_pApp->callQtAssistant(ba); } diff --git a/app/rdo_studio/src/frame/frame_tree_ctrl.h b/app/rdo_studio/src/frame/frame_tree_ctrl.h index b8525477f..08f6d05e1 100644 --- a/app/rdo_studio/src/frame/frame_tree_ctrl.h +++ b/app/rdo_studio/src/frame/frame_tree_ctrl.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_FRAME_TREE_CTRL_H_ -#define _RDO_STUDIO_FRAME_TREE_CTRL_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -12,32 +11,30 @@ namespace rdo { namespace gui { namespace frame { class TreeCtrl - : public QTreeWidget - , public ActionActivator + : public QTreeWidget + , public ActionActivator { Q_OBJECT public: - TreeCtrl(QWidget* pParent); - virtual ~TreeCtrl(); + TreeCtrl(QWidget* pParent); + virtual ~TreeCtrl(); - QTreeWidgetItem* insertFrame(const QString& name); + QTreeWidgetItem* insertFrame(const QString& name); - void clear(); + void clear(); private: - typedef QTreeWidget parent_type; + typedef QTreeWidget parent_type; - QTreeWidgetItem* m_pRootItem; + QTreeWidgetItem* m_pRootItem; - virtual void focusInEvent (QFocusEvent* pEvent); - virtual void focusOutEvent (QFocusEvent* pEvent); - virtual void onUpdateActions(bool activated); + virtual void focusInEvent (QFocusEvent* pEvent); + virtual void focusOutEvent (QFocusEvent* pEvent); + virtual void onUpdateActions(bool activated); private slots: - void onHelpContext(); + void onHelpContext(); }; }}} // namespace rdo::gui::frame - -#endif // _RDO_STUDIO_FRAME_TREE_CTRL_H_ diff --git a/app/rdo_studio/src/frame/frame_view.cpp b/app/rdo_studio/src/frame/frame_view.cpp index ad12c2b0d..f11fc7dae 100644 --- a/app/rdo_studio/src/frame/frame_view.cpp +++ b/app/rdo_studio/src/frame/frame_view.cpp @@ -21,15 +21,15 @@ using namespace rdo::gui::frame; // -------------------- Content // -------------------------------------------------------------------------------- Content::Content(QWidget* pParent) - : parent_type(pParent) - , m_size (QSize (0, 0)) - , m_pos (QPoint(0, 0)) + : parent_type(pParent) + , m_size (QSize (0, 0)) + , m_pos (QPoint(0, 0)) { - setAttribute(Qt::WA_NoSystemBackground, true); + setAttribute(Qt::WA_NoSystemBackground, true); - m_bgColor = QColor(g_pApp->getStyle()->style_frame.backgroundColor); + m_bgColor = QColor(g_pApp->getStyle()->style_frame.backgroundColor); - updateFont(); + updateFont(); } Content::~Content() @@ -37,577 +37,567 @@ Content::~Content() bool Content::valid() const { - return m_memDC.valid(); + return m_memDC.valid(); } void Content::init(const rdo::animation::Frame* const pFrame, const rdo::gui::BitmapList& bitmapList) { - ASSERT(pFrame); - - QSize size; - bool imageFound = false; - if (pFrame->hasBgImage()) - { - rdo::gui::BitmapList::const_iterator bmpIt = bitmapList.find(QString::fromStdString(pFrame->m_bgImageName)); - if (bmpIt != bitmapList.end()) - { - size.setWidth (bmpIt->second.width ()); - size.setHeight(bmpIt->second.height()); - imageFound = true; - } - } - if (!imageFound) - { - size.setWidth((std::size_t)pFrame->m_size.m_width); - size.setHeight((std::size_t)pFrame->m_size.m_height); - } - - QColor bgColor; - if (pFrame->m_bgColor.m_transparent) - { - bgColor = QColor(g_pApp->getStyle()->style_frame.backgroundColor); - } - else - { - bgColor = QColor(pFrame->m_bgColor.m_r, pFrame->m_bgColor.m_g, pFrame->m_bgColor.m_b); - } - setBGColor(bgColor); - - init(size); + ASSERT(pFrame); + + QSize size; + bool imageFound = false; + if (pFrame->hasBgImage()) + { + rdo::gui::BitmapList::const_iterator bmpIt = bitmapList.find(QString::fromStdString(pFrame->m_bgImageName)); + if (bmpIt != bitmapList.end()) + { + size.setWidth (bmpIt->second.width ()); + size.setHeight(bmpIt->second.height()); + imageFound = true; + } + } + if (!imageFound) + { + size.setWidth((std::size_t)pFrame->m_size.m_width); + size.setHeight((std::size_t)pFrame->m_size.m_height); + } + + QColor bgColor; + if (pFrame->m_bgColor.m_transparent) + { + bgColor = QColor(g_pApp->getStyle()->style_frame.backgroundColor); + } + else + { + bgColor = QColor(pFrame->m_bgColor.m_r, pFrame->m_bgColor.m_g, pFrame->m_bgColor.m_b); + } + setBGColor(bgColor); + + init(size); } void Content::init(const QSize& size) { - m_memDC.resize(size.width(), size.height()); - setMinimumSize(size); + m_memDC.resize(size.width(), size.height()); + setMinimumSize(size); } void Content::updateFont() { - FrameStyle* pStyle = &g_pApp->getStyle()->style_frame; - ASSERT(pStyle); - - m_font = QFont(pStyle->font.name.c_str()); - m_font.setBold (pStyle->defaultStyle & rdo::gui::style::StyleFont::BOLD ? true : false); - m_font.setItalic (pStyle->defaultStyle & rdo::gui::style::StyleFont::ITALIC ? true : false); - m_font.setUnderline(pStyle->defaultStyle & rdo::gui::style::StyleFont::UNDERLINE ? true : false); - m_font.setPointSize(pStyle->font.size); + FrameStyle* pStyle = &g_pApp->getStyle()->style_frame; + ASSERT(pStyle); + + m_font = QFont(pStyle->font.name.c_str()); + m_font.setBold (static_cast(pStyle->defaultStyle) & static_cast(rdo::gui::style::StyleFont::Style::BOLD) ? true : false); + m_font.setItalic (static_cast(pStyle->defaultStyle) & static_cast(rdo::gui::style::StyleFont::Style::ITALIC) ? true : false); + m_font.setUnderline(static_cast(pStyle->defaultStyle) & static_cast(rdo::gui::style::StyleFont::Style::UNDERLINE) ? true : false); + m_font.setPointSize(pStyle->font.size); } void Content::setBGColor(const QColor& color) { - m_bgColor = color; + m_bgColor = color; } void Content::resizeEvent(QResizeEvent* pEvent) { - m_size = pEvent->size(); - parent_type::resizeEvent(pEvent); + m_size = pEvent->size(); + parent_type::resizeEvent(pEvent); } void Content::paintEvent(QPaintEvent* pEvent) { - QPainter painter(this); - onDraw(painter); + QPainter painter(this); + onDraw(painter); - parent_type::paintEvent(pEvent); + parent_type::paintEvent(pEvent); } void Content::mousePressEvent(QMouseEvent* pEvent) { - ASSERT(pEvent); - if (pEvent->button() == Qt::LeftButton) - { - std::size_t index = g_pModel->getFrameManager().findFrameIndex(this); - if (index != std::size_t(~0)) - { - g_pModel->getFrameManager().areaDown(index, pEvent->pos()); - } - } - - parent_type::mousePressEvent(pEvent); + ASSERT(pEvent); + if (pEvent->button() == Qt::LeftButton) + { + std::size_t index = g_pModel->getFrameManager().findFrameIndex(this); + if (index != std::size_t(~0)) + g_pModel->getFrameManager().areaDown(index, pEvent->pos()); + } + + parent_type::mousePressEvent(pEvent); } void Content::onDraw(QPainter& painter) { - if (valid()) - { - painter.drawPixmap(-m_pos.x(), -m_pos.y(), m_memDC.buffer()); - - if (m_size.width() - m_memDC.width() > 0) - { - painter.fillRect(m_memDC.width(), 0, m_size.width() - m_memDC.width(), m_size.height(), m_bgColor); - } - if (m_size.height() - m_memDC.height() > 0) - { - painter.fillRect(0, m_memDC.height(), m_size.width(), m_size.height() - m_memDC.height(), m_bgColor); - } - } - else - { - painter.fillRect(0, 0, m_size.width(), m_size.height(), m_bgColor); - } + if (valid()) + { + painter.drawPixmap(-m_pos.x(), -m_pos.y(), m_memDC.buffer()); + + if (m_size.width() - m_memDC.width() > 0) + { + painter.fillRect(m_memDC.width(), 0, m_size.width() - m_memDC.width(), m_size.height(), m_bgColor); + } + if (m_size.height() - m_memDC.height() > 0) + { + painter.fillRect(0, m_memDC.height(), m_size.width(), m_size.height() - m_memDC.height(), m_bgColor); + } + } + else + { + painter.fillRect(0, 0, m_size.width(), m_size.height(), m_bgColor); + } } void Content::update( - const rdo::animation::Frame* const pFrame, - const rdo::gui::BitmapList& bitmapList, - rdo::gui::BitmapList& bitmapGeneratedList, - rdo::gui::animation::AreaList& areaList + const rdo::animation::Frame* const pFrame, + const rdo::gui::BitmapList& bitmapList, + rdo::gui::BitmapList& bitmapGeneratedList, + rdo::gui::animation::AreaList& areaList ) { - ASSERT(pFrame); - - if (!valid()) - { - init(pFrame, bitmapList); - } - - m_memDC.dc().begin(&m_memDC.buffer()); - - drawBackground(pFrame, bitmapList); - - m_memDC.dc().setFont(m_font); - - for (rdo::animation::FrameItem* pCurrElement: pFrame->m_elements) - { - ASSERT(pCurrElement); - switch (pCurrElement->getType()) - { - case rdo::animation::FrameItem::FIT_TEXT : elementText (static_cast(pCurrElement)); break; - case rdo::animation::FrameItem::FIT_RECT : elementRect (static_cast(pCurrElement)); break; - case rdo::animation::FrameItem::FIT_R_RECT : elementRoundRect(static_cast(pCurrElement)); break; - case rdo::animation::FrameItem::FIT_LINE : elementLine (static_cast(pCurrElement)); break; - case rdo::animation::FrameItem::FIT_TRIANG : elementTriang (static_cast(pCurrElement)); break; - case rdo::animation::FrameItem::FIT_CIRCLE : elementCircle (static_cast(pCurrElement)); break; - case rdo::animation::FrameItem::FIT_ELLIPSE: elementEllipse (static_cast(pCurrElement)); break; - case rdo::animation::FrameItem::FIT_BMP : elementBMP (static_cast(pCurrElement), bitmapList, bitmapGeneratedList); break; - case rdo::animation::FrameItem::FIT_S_BMP : elementSBMP (static_cast(pCurrElement), bitmapList, bitmapGeneratedList); break; - case rdo::animation::FrameItem::FIT_ACTIVE : elementActive (static_cast(pCurrElement), areaList); break; - case rdo::animation::FrameItem::FIT_NULL : break; - } - } - - m_memDC.dc().end(); - - parent_type::update(); + ASSERT(pFrame); + + if (!valid()) + init(pFrame, bitmapList); + + m_memDC.dc().begin(&m_memDC.buffer()); + + drawBackground(pFrame, bitmapList); + + m_memDC.dc().setFont(m_font); + + for (rdo::animation::FrameItem* pCurrElement: pFrame->m_elements) + { + ASSERT(pCurrElement); + switch (pCurrElement->getType()) + { + case rdo::animation::FrameItem::Type::TEXT : elementText (static_cast(pCurrElement)); break; + case rdo::animation::FrameItem::Type::RECT : elementRect (static_cast(pCurrElement)); break; + case rdo::animation::FrameItem::Type::ROUND_RECT: elementRoundRect(static_cast(pCurrElement)); break; + case rdo::animation::FrameItem::Type::LINE : elementLine (static_cast(pCurrElement)); break; + case rdo::animation::FrameItem::Type::TRIANG : elementTriang (static_cast(pCurrElement)); break; + case rdo::animation::FrameItem::Type::CIRCLE : elementCircle (static_cast(pCurrElement)); break; + case rdo::animation::FrameItem::Type::ELLIPSE : elementEllipse (static_cast(pCurrElement)); break; + case rdo::animation::FrameItem::Type::BMP : elementBMP (static_cast(pCurrElement), bitmapList, bitmapGeneratedList); break; + case rdo::animation::FrameItem::Type::S_BMP : elementSBMP (static_cast(pCurrElement), bitmapList, bitmapGeneratedList); break; + case rdo::animation::FrameItem::Type::ACTIVE : elementActive (static_cast(pCurrElement), areaList); break; + case rdo::animation::FrameItem::Type::NONE : break; + } + } + + m_memDC.dc().end(); + + parent_type::update(); } void Content::drawBackground(const rdo::animation::Frame* const pFrame, const rdo::gui::BitmapList& bitmapList) { - ASSERT(pFrame); - - bool bgImage = false; - if (pFrame->hasBgImage()) - { - rdo::gui::BitmapList::const_iterator bmpIt = bitmapList.find(QString::fromStdString(pFrame->m_bgImageName)); - if (bmpIt != bitmapList.end()) - { - m_memDC.dc().drawPixmap(0, 0, bmpIt->second); - bgImage = true; - } - } - - if (!bgImage) - { - m_memDC.dc().setPen(QColor(g_pApp->getStyle()->style_frame.defaultColor)); - m_memDC.dc().setBrush(m_bgColor); - - const std::size_t pountListCount = 4; - QPoint pointList[pountListCount]; - pointList[0].setX(0); - pointList[0].setY(0); - pointList[1].setX(m_memDC.width () - 1); - pointList[1].setY(0); - pointList[2].setX(m_memDC.width () - 1); - pointList[2].setY(m_memDC.height() - 1); - pointList[3].setX(0); - pointList[3].setY(m_memDC.height() - 1); - - m_memDC.dc().drawPolygon(&pointList[0], pountListCount); - } + ASSERT(pFrame); + + bool bgImage = false; + if (pFrame->hasBgImage()) + { + rdo::gui::BitmapList::const_iterator bmpIt = bitmapList.find(QString::fromStdString(pFrame->m_bgImageName)); + if (bmpIt != bitmapList.end()) + { + m_memDC.dc().drawPixmap(0, 0, bmpIt->second); + bgImage = true; + } + } + + if (!bgImage) + { + m_memDC.dc().setPen(QColor(g_pApp->getStyle()->style_frame.defaultColor)); + m_memDC.dc().setBrush(m_bgColor); + + const std::size_t pountListCount = 4; + QPoint pointList[pountListCount]; + pointList[0].setX(0); + pointList[0].setY(0); + pointList[1].setX(m_memDC.width () - 1); + pointList[1].setY(0); + pointList[2].setX(m_memDC.width () - 1); + pointList[2].setY(m_memDC.height() - 1); + pointList[3].setX(0); + pointList[3].setY(m_memDC.height() - 1); + + m_memDC.dc().drawPolygon(&pointList[0], pountListCount); + } } template void Content::drawColoredElement(const rdo::animation::ColoredElement* pColor, F drawMethod) { - setColors(pColor); - drawMethod(m_memDC.dc()); + setColors(pColor); + drawMethod(m_memDC.dc()); } void Content::setColors(const rdo::animation::ColoredElement* pColor) { - ASSERT(pColor); - if (!pColor->m_foreground.m_transparent) - { - m_memDC.dc().setPen(QColor( - pColor->m_foreground.m_r, - pColor->m_foreground.m_g, - pColor->m_foreground.m_b - )); - } - else - { - m_memDC.dc().setPen(Qt::NoPen); - } - - if (!pColor->m_background.m_transparent) - { - m_memDC.dc().setBrush(QColor( - pColor->m_background.m_r, - pColor->m_background.m_g, - pColor->m_background.m_b - )); - } - else - { - m_memDC.dc().setBrush(Qt::NoBrush); - } + ASSERT(pColor); + if (!pColor->m_foreground.m_transparent) + { + m_memDC.dc().setPen(QColor( + pColor->m_foreground.m_r, + pColor->m_foreground.m_g, + pColor->m_foreground.m_b + )); + } + else + { + m_memDC.dc().setPen(Qt::NoPen); + } + + if (!pColor->m_background.m_transparent) + { + m_memDC.dc().setBrush(QColor( + pColor->m_background.m_r, + pColor->m_background.m_g, + pColor->m_background.m_b + )); + } + else + { + m_memDC.dc().setBrush(Qt::NoBrush); + } } void Content::elementText(rdo::animation::TextElement* pElement) { - ASSERT(pElement); - - if (pElement->m_foreground.m_transparent) - return; - - if (!pElement->m_background.m_transparent) - { - m_memDC.dc().setBackgroundMode(Qt::OpaqueMode); - m_memDC.dc().setBackground(QColor(pElement->m_background.m_r, pElement->m_background.m_g, pElement->m_background.m_b)); - } - else - { - m_memDC.dc().setBackgroundMode(Qt::TransparentMode); - } - - if (!pElement->m_foreground.m_transparent) - { - m_memDC.dc().setPen(QColor(pElement->m_foreground.m_r, pElement->m_foreground.m_g, pElement->m_foreground.m_b)); - } - - int flags = Qt::TextSingleLine | Qt::AlignVCenter; - switch (pElement->m_align) - { - case rdo::animation::TextElement::TETA_LEFT : flags |= Qt::AlignLeft; break; - case rdo::animation::TextElement::TETA_RIGHT : flags |= Qt::AlignRight; break; - case rdo::animation::TextElement::TETA_CENTER: flags |= Qt::AlignHCenter; break; - } - - QRectF rect( - pElement->m_point.m_x, - pElement->m_point.m_y, - pElement->m_size.m_width, - pElement->m_size.m_height - ); - - m_memDC.dc().drawText(rect, flags, QString::fromStdString(pElement->m_text), &rect); + ASSERT(pElement); + + if (pElement->m_foreground.m_transparent) + return; + + if (!pElement->m_background.m_transparent) + { + m_memDC.dc().setBackgroundMode(Qt::OpaqueMode); + m_memDC.dc().setBackground(QColor(pElement->m_background.m_r, pElement->m_background.m_g, pElement->m_background.m_b)); + } + else + { + m_memDC.dc().setBackgroundMode(Qt::TransparentMode); + } + + if (!pElement->m_foreground.m_transparent) + { + m_memDC.dc().setPen(QColor(pElement->m_foreground.m_r, pElement->m_foreground.m_g, pElement->m_foreground.m_b)); + } + + int flags = Qt::TextSingleLine | Qt::AlignVCenter; + switch (pElement->m_align) + { + case rdo::animation::TextElement::Align::LEFT : flags |= Qt::AlignLeft; break; + case rdo::animation::TextElement::Align::RIGHT : flags |= Qt::AlignRight; break; + case rdo::animation::TextElement::Align::CENTER: flags |= Qt::AlignHCenter; break; + } + + QRectF rect( + pElement->m_point.m_x, + pElement->m_point.m_y, + pElement->m_size.m_width, + pElement->m_size.m_height + ); + + m_memDC.dc().drawText(rect, flags, QString::fromStdString(pElement->m_text), &rect); } void Content::elementRect(rdo::animation::RectElement* pElement) { - ASSERT(pElement); - - drawColoredElement( - pElement, - boost::bind(&QPainter::drawRect, - _1, - (int)pElement->m_point.m_x, - (int)pElement->m_point.m_y, - (int)pElement->m_size.m_width - 1, - (int)pElement->m_size.m_height - 1 - ) - ); + ASSERT(pElement); + + drawColoredElement( + pElement, + boost::bind(&QPainter::drawRect, + _1, + (int)pElement->m_point.m_x, + (int)pElement->m_point.m_y, + (int)pElement->m_size.m_width - 1, + (int)pElement->m_size.m_height - 1 + ) + ); } void Content::elementRoundRect(rdo::animation::RoundRectElement* pElement) { - ASSERT(pElement); - - double radius = std::min(pElement->m_size.m_width, pElement->m_size.m_height) / 3.0f; - - drawColoredElement( - pElement, - boost::bind(&QPainter::drawRoundedRect, - _1, - (int)pElement->m_point.m_x, - (int)pElement->m_point.m_y, - (int)pElement->m_size.m_width, - (int)pElement->m_size.m_height, - radius, - radius, - Qt::AbsoluteSize - ) - ); + ASSERT(pElement); + + const double radius = std::min(pElement->m_size.m_width, pElement->m_size.m_height) / 3.0f; + + drawColoredElement( + pElement, + boost::bind(&QPainter::drawRoundedRect, + _1, + (int)pElement->m_point.m_x, + (int)pElement->m_point.m_y, + (int)pElement->m_size.m_width, + (int)pElement->m_size.m_height, + radius, + radius, + Qt::AbsoluteSize + ) + ); } void Content::elementLine(rdo::animation::LineElement* pElement) { - ASSERT(pElement); - - if (!pElement->m_color.m_transparent) - { - m_memDC.dc().setPen(QColor(pElement->m_color.m_r, pElement->m_color.m_g, pElement->m_color.m_b)); - m_memDC.dc().drawLine( - (int)(pElement->m_point1.m_x), (int)(pElement->m_point1.m_y), - (int)(pElement->m_point2.m_x), (int)(pElement->m_point2.m_y) - ); - } + ASSERT(pElement); + + if (!pElement->m_color.m_transparent) + { + m_memDC.dc().setPen(QColor(pElement->m_color.m_r, pElement->m_color.m_g, pElement->m_color.m_b)); + m_memDC.dc().drawLine( + (int)(pElement->m_point1.m_x), (int)(pElement->m_point1.m_y), + (int)(pElement->m_point2.m_x), (int)(pElement->m_point2.m_y) + ); + } } void Content::elementTriang(rdo::animation::TriangElement* pElement) { - ASSERT(pElement); - - const std::size_t pountListCount = 3; - QPoint pointList[pountListCount]; - pointList[0].setX((int)(pElement->m_point1.m_x)); - pointList[0].setY((int)(pElement->m_point1.m_y)); - pointList[1].setX((int)(pElement->m_point2.m_x)); - pointList[1].setY((int)(pElement->m_point2.m_y)); - pointList[2].setX((int)(pElement->m_point3.m_x)); - pointList[2].setY((int)(pElement->m_point3.m_y)); - - void (QPainter::*pMethod)(const QPoint*, int, Qt::FillRule) = &QPainter::drawPolygon; - - drawColoredElement( - pElement, - boost::bind(pMethod, - _1, - &pointList[0], - pountListCount, - Qt::OddEvenFill - ) - ); + ASSERT(pElement); + + const std::size_t pountListCount = 3; + QPoint pointList[pountListCount]; + pointList[0].setX((int)(pElement->m_point1.m_x)); + pointList[0].setY((int)(pElement->m_point1.m_y)); + pointList[1].setX((int)(pElement->m_point2.m_x)); + pointList[1].setY((int)(pElement->m_point2.m_y)); + pointList[2].setX((int)(pElement->m_point3.m_x)); + pointList[2].setY((int)(pElement->m_point3.m_y)); + + void (QPainter::*pMethod)(const QPoint*, int, Qt::FillRule) = &QPainter::drawPolygon; + + drawColoredElement( + pElement, + boost::bind(pMethod, + _1, + &pointList[0], + pountListCount, + Qt::OddEvenFill + ) + ); } void Content::elementCircle(rdo::animation::CircleElement* pElement) { - ASSERT(pElement); - - QRect rect( - (int)(pElement->m_center.m_x - pElement->m_radius.m_radius), - (int)(pElement->m_center.m_y - pElement->m_radius.m_radius), - (int)(pElement->m_radius.m_radius * 2), - (int)(pElement->m_radius.m_radius * 2) - ); - - void (QPainter::*pMethod)(const QRect&) = &QPainter::drawEllipse; - - drawColoredElement( - pElement, - boost::bind(pMethod, - _1, - rect - ) - ); + ASSERT(pElement); + + QRect rect( + (int)(pElement->m_center.m_x - pElement->m_radius.m_radius), + (int)(pElement->m_center.m_y - pElement->m_radius.m_radius), + (int)(pElement->m_radius.m_radius * 2), + (int)(pElement->m_radius.m_radius * 2) + ); + + void (QPainter::*pMethod)(const QRect&) = &QPainter::drawEllipse; + + drawColoredElement( + pElement, + boost::bind(pMethod, + _1, + rect + ) + ); } void Content::elementEllipse(rdo::animation::EllipseElement* pElement) { - ASSERT(pElement); - - QRect rect( - (int)(pElement->m_point.m_x), - (int)(pElement->m_point.m_y), - (int)(pElement->m_size.m_width), - (int)(pElement->m_size.m_height) - ); - - void (QPainter::*pMethod)(const QRect&) = &QPainter::drawEllipse; - - drawColoredElement( - pElement, - boost::bind(pMethod, - _1, - rect - ) - ); + ASSERT(pElement); + + QRect rect( + (int)(pElement->m_point.m_x), + (int)(pElement->m_point.m_y), + (int)(pElement->m_size.m_width), + (int)(pElement->m_size.m_height) + ); + + void (QPainter::*pMethod)(const QRect&) = &QPainter::drawEllipse; + + drawColoredElement( + pElement, + boost::bind(pMethod, + _1, + rect + ) + ); } void Content::elementBMP( - rdo::animation::BmpElement* pElement, - const rdo::gui::BitmapList& bitmapList, - rdo::gui::BitmapList& bitmapGeneratedList) + rdo::animation::BmpElement* pElement, + const rdo::gui::BitmapList& bitmapList, + rdo::gui::BitmapList& bitmapGeneratedList) { - ASSERT(pElement); - - QPixmap pixmap = Content::getBitmap( - QString::fromStdString(pElement->m_bmp_name), - pElement->hasMask() ? QString::fromStdString(pElement->m_mask_name) : QString(), - bitmapList, - bitmapGeneratedList - ); - - if (!pixmap.isNull()) - { - m_memDC.dc().drawPixmap((int)(pElement->m_point.m_x), (int)(pElement->m_point.m_y), pixmap); - } + ASSERT(pElement); + + QPixmap pixmap = Content::getBitmap( + QString::fromStdString(pElement->m_bmp_name), + pElement->hasMask() ? QString::fromStdString(pElement->m_mask_name) : QString(), + bitmapList, + bitmapGeneratedList + ); + + if (!pixmap.isNull()) + m_memDC.dc().drawPixmap((int)(pElement->m_point.m_x), (int)(pElement->m_point.m_y), pixmap); } void Content::elementSBMP( - rdo::animation::ScaledBmpElement* pElement, - const rdo::gui::BitmapList& bitmapList, - rdo::gui::BitmapList& bitmapGeneratedList) + rdo::animation::ScaledBmpElement* pElement, + const rdo::gui::BitmapList& bitmapList, + rdo::gui::BitmapList& bitmapGeneratedList) { - ASSERT(pElement); - - QPixmap pixmap = Content::getBitmap( - QString::fromStdString(pElement->m_bmp_name), - pElement->hasMask() ? QString::fromStdString(pElement->m_mask_name) : QString(), - bitmapList, - bitmapGeneratedList - ); - - if (!pixmap.isNull()) - { - m_memDC.dc().drawPixmap((int)(pElement->m_point.m_x), (int)(pElement->m_point.m_y), (int)(pElement->m_size.m_width), (int)(pElement->m_size.m_height), pixmap); - } + ASSERT(pElement); + + QPixmap pixmap = Content::getBitmap( + QString::fromStdString(pElement->m_bmp_name), + pElement->hasMask() ? QString::fromStdString(pElement->m_mask_name) : QString(), + bitmapList, + bitmapGeneratedList + ); + + if (!pixmap.isNull()) + { + m_memDC.dc().drawPixmap((int)(pElement->m_point.m_x), (int)(pElement->m_point.m_y), (int)(pElement->m_size.m_width), (int)(pElement->m_size.m_height), pixmap); + } } QPixmap Content::getBitmap( - const QString& bitmapName, - const QString& maskName, - const rdo::gui::BitmapList& bitmapList, - rdo::gui::BitmapList& bitmapGeneratedList) + const QString& bitmapName, + const QString& maskName, + const rdo::gui::BitmapList& bitmapList, + rdo::gui::BitmapList& bitmapGeneratedList) { - rdo::gui::BitmapList::const_iterator bmpIt = bitmapList.find(bitmapName); - if (bmpIt == bitmapList.end()) - return QPixmap(); - - if (!maskName.isEmpty()) - { - QString maskedBitmapName = QString("%1%2").arg(bitmapName).arg(maskName); - - rdo::gui::BitmapList::const_iterator generatedIt = bitmapList.find(maskedBitmapName); - if (generatedIt != bitmapList.end()) - { - return generatedIt->second; - } - - generatedIt = bitmapGeneratedList.find(maskedBitmapName); - if (generatedIt != bitmapGeneratedList.end()) - { - return generatedIt->second; - } - - rdo::gui::BitmapList::const_iterator maskIt = bitmapList.find(maskName); - if (maskIt != bitmapList.end()) - { - QPixmap pixmap = rdo::gui::Bitmap::transparent(bmpIt->second, maskIt->second); - if (!pixmap.isNull()) - { - std::pair result = - bitmapGeneratedList.insert(rdo::gui::BitmapList::value_type(maskedBitmapName, pixmap)); - (void)result; - ASSERT(result.second); - return pixmap; - } - } - } - - return bmpIt->second; + rdo::gui::BitmapList::const_iterator bmpIt = bitmapList.find(bitmapName); + if (bmpIt == bitmapList.end()) + return QPixmap(); + + if (!maskName.isEmpty()) + { + QString maskedBitmapName = QString("%1%2").arg(bitmapName).arg(maskName); + + rdo::gui::BitmapList::const_iterator generatedIt = bitmapList.find(maskedBitmapName); + if (generatedIt != bitmapList.end()) + return generatedIt->second; + + generatedIt = bitmapGeneratedList.find(maskedBitmapName); + if (generatedIt != bitmapGeneratedList.end()) + return generatedIt->second; + + rdo::gui::BitmapList::const_iterator maskIt = bitmapList.find(maskName); + if (maskIt != bitmapList.end()) + { + QPixmap pixmap = rdo::gui::Bitmap::transparent(bmpIt->second, maskIt->second); + if (!pixmap.isNull()) + { + std::pair result = + bitmapGeneratedList.insert(rdo::gui::BitmapList::value_type(maskedBitmapName, pixmap)); + (void)result; + ASSERT(result.second); + return pixmap; + } + } + } + + return bmpIt->second; } void Content::elementActive(rdo::animation::ActiveElement* pElement, rdo::gui::animation::AreaList& areaList) { - ASSERT(pElement); - - QString oprName(QString::fromStdString(pElement->m_opr_name)); - rdo::gui::animation::AreaList::iterator it = areaList.find(oprName); - if (it == areaList.end()) - { - std::pair result = - areaList.insert(rdo::gui::animation::AreaList::value_type(oprName, rdo::gui::animation::Area())); - ASSERT(result.second); - it = result.first; - } - it->second.m_rect = QRect( - (int)(pElement->m_point.m_x), - (int)(pElement->m_point.m_y), - (int)(pElement->m_size.m_width), - (int)(pElement->m_size.m_height) - ); + ASSERT(pElement); + + QString oprName(QString::fromStdString(pElement->m_opr_name)); + rdo::gui::animation::AreaList::iterator it = areaList.find(oprName); + if (it == areaList.end()) + { + std::pair result = + areaList.insert(rdo::gui::animation::AreaList::value_type(oprName, rdo::gui::animation::Area())); + ASSERT(result.second); + it = result.first; + } + it->second.m_rect = QRect( + (int)(pElement->m_point.m_x), + (int)(pElement->m_point.m_y), + (int)(pElement->m_size.m_width), + (int)(pElement->m_size.m_height) + ); } // -------------------------------------------------------------------------------- // -------------------- View // -------------------------------------------------------------------------------- View::View(QWidget* pParent) - : parent_type(pParent) + : parent_type(pParent) { - setAutoFillBackground(false); - setAttribute(Qt::WA_OpaquePaintEvent, true); - setAttribute(Qt::WA_NoSystemBackground, true); + setAutoFillBackground(false); + setAttribute(Qt::WA_OpaquePaintEvent, true); + setAttribute(Qt::WA_NoSystemBackground, true); - setWidgetResizable(true); - setFrameShadow(QFrame::Plain ); - setFrameShape (QFrame::NoFrame); + setWidgetResizable(true); + setFrameShadow(QFrame::Plain ); + setFrameShape (QFrame::NoFrame); - m_pContent = new Content(this); - ASSERT(m_pContent); - setWidget(m_pContent); + m_pContent = new Content(this); + ASSERT(m_pContent); + setWidget(m_pContent); - updateFont(); + updateFont(); } View::~View() { - std::size_t index = g_pModel->getFrameManager().findFrameIndex(this); - if (index != std::size_t(~0)) - { - g_pModel->getFrameManager().disconnectView(this); - g_pModel->getFrameManager().resetCurrentShowingFrame(index); - } + std::size_t index = g_pModel->getFrameManager().findFrameIndex(this); + if (index != std::size_t(~0)) + { + g_pModel->getFrameManager().disconnectView(this); + g_pModel->getFrameManager().resetCurrentShowingFrame(index); + } } Content* View::getContent() { - Content* pContent = static_cast(widget()); - ASSERT(pContent); - return pContent; + Content* pContent = static_cast(widget()); + ASSERT(pContent); + return pContent; } void View::update( - const rdo::animation::Frame* const pFrame, - const rdo::gui::BitmapList& bitmapList, - rdo::gui::BitmapList& bitmapGeneratedList, - rdo::gui::animation::AreaList& areaList + const rdo::animation::Frame* const pFrame, + const rdo::gui::BitmapList& bitmapList, + rdo::gui::BitmapList& bitmapGeneratedList, + rdo::gui::animation::AreaList& areaList ) { - getContent()->update(pFrame, bitmapList, bitmapGeneratedList, areaList); + getContent()->update(pFrame, bitmapList, bitmapGeneratedList, areaList); } void View::updateFont() { - getContent()->updateFont(); + getContent()->updateFont(); } bool View::event(QEvent* pEvent) { - if (pEvent->type() == QEvent::KeyPress || pEvent->type() == QEvent::ShortcutOverride) - { - QKeyEvent* pKeyEvent = static_cast(pEvent); - std::size_t scanCode = pKeyEvent->nativeVirtualKey(); - g_pModel->sendMessage(kernel->runtime(), RDOThread::RT_RUNTIME_KEY_DOWN, &scanCode); - - if (pKeyEvent->key() == Qt::Key_F1) - { - QByteArray ba; - ba.append("setSource qthelp://language/doc/rdo_studio_rus/html/work_model/work_model_frame.htm\n"); - g_pApp->callQtAssistant(ba); - } - - return true; - } - else if (pEvent->type() == QEvent::KeyRelease) - { - QKeyEvent* pKeyEvent = static_cast(pEvent); - std::size_t scanCode = pKeyEvent->nativeVirtualKey(); - g_pModel->sendMessage(kernel->runtime(), RDOThread::RT_RUNTIME_KEY_UP, &scanCode); - return true; - } - - return parent_type::event(pEvent); + if (pEvent->type() == QEvent::KeyPress || pEvent->type() == QEvent::ShortcutOverride) + { + QKeyEvent* pKeyEvent = static_cast(pEvent); + std::size_t scanCode = pKeyEvent->nativeVirtualKey(); + g_pModel->sendMessage(kernel->runtime(), RDOThread::Message::RUNTIME_KEY_DOWN, &scanCode); + + if (pKeyEvent->key() == Qt::Key_F1) + { + QByteArray ba; + ba.append("setSource qthelp://language/doc/rdo_studio_rus/html/work_model/work_model_frame.htm\n"); + g_pApp->callQtAssistant(ba); + } + + return true; + } + else if (pEvent->type() == QEvent::KeyRelease) + { + QKeyEvent* pKeyEvent = static_cast(pEvent); + std::size_t scanCode = pKeyEvent->nativeVirtualKey(); + g_pModel->sendMessage(kernel->runtime(), RDOThread::Message::RUNTIME_KEY_UP, &scanCode); + return true; + } + + return parent_type::event(pEvent); } diff --git a/app/rdo_studio/src/frame/frame_view.h b/app/rdo_studio/src/frame/frame_view.h index 04d5318d5..5a30ba40e 100644 --- a/app/rdo_studio/src/frame/frame_view.h +++ b/app/rdo_studio/src/frame/frame_view.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_FRAME_VIEW_H_ -#define _RDO_STUDIO_FRAME_VIEW_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -23,56 +22,56 @@ namespace rdo { namespace gui { namespace frame { class Content: public QWidget { private: - Q_OBJECT - typedef QWidget parent_type; + Q_OBJECT + typedef QWidget parent_type; public: - Content(QWidget* pParent); - virtual ~Content(); + Content(QWidget* pParent); + virtual ~Content(); - void update(const rdo::animation::Frame* const pFrame, - const rdo::gui::BitmapList& bitmapList, - rdo::gui::BitmapList& bitmapGeneratedList, - rdo::gui::animation::AreaList& areaList); - void updateFont(); + void update(const rdo::animation::Frame* const pFrame, + const rdo::gui::BitmapList& bitmapList, + rdo::gui::BitmapList& bitmapGeneratedList, + rdo::gui::animation::AreaList& areaList); + void updateFont(); private: - rdo::gui::QtMemDC m_memDC; - QColor m_bgColor; - QSize m_size; - QPoint m_pos; - QFont m_font; - - bool valid () const; - void init (const rdo::animation::Frame* const pFrame, const rdo::gui::BitmapList& bitmapList); - void init (const QSize& size); - void setBGColor (const QColor& color); - void onDraw (QPainter& painter); - - void drawBackground (const rdo::animation::Frame* const pFrame, const rdo::gui::BitmapList& bitmapList); - template - void drawColoredElement(const rdo::animation::ColoredElement* pColor, F drawMethod); - void setColors (const rdo::animation::ColoredElement* pColor); - void elementText (rdo::animation::TextElement* pElement); - void elementRect (rdo::animation::RectElement* pElement); - void elementRoundRect (rdo::animation::RoundRectElement* pElement); - void elementLine (rdo::animation::LineElement* pElement); - void elementTriang (rdo::animation::TriangElement* pElement); - void elementCircle (rdo::animation::CircleElement* pElement); - void elementEllipse (rdo::animation::EllipseElement* pElement); - void elementBMP (rdo::animation::BmpElement* pElement, const rdo::gui::BitmapList& bitmapList, rdo::gui::BitmapList& bitmapGeneratedList); - void elementSBMP (rdo::animation::ScaledBmpElement* pElement, const rdo::gui::BitmapList& bitmapList, rdo::gui::BitmapList& bitmapGeneratedList); - void elementActive (rdo::animation::ActiveElement* pElement, rdo::gui::animation::AreaList& areaList); - - static QPixmap getBitmap(const QString& bitmapName, - const QString& maskName, - const rdo::gui::BitmapList& bitmapList, - rdo::gui::BitmapList& bitmapGeneratedList); + rdo::gui::QtMemDC m_memDC; + QColor m_bgColor; + QSize m_size; + QPoint m_pos; + QFont m_font; + + bool valid () const; + void init (const rdo::animation::Frame* const pFrame, const rdo::gui::BitmapList& bitmapList); + void init (const QSize& size); + void setBGColor (const QColor& color); + void onDraw (QPainter& painter); + + void drawBackground (const rdo::animation::Frame* const pFrame, const rdo::gui::BitmapList& bitmapList); + template + void drawColoredElement(const rdo::animation::ColoredElement* pColor, F drawMethod); + void setColors (const rdo::animation::ColoredElement* pColor); + void elementText (rdo::animation::TextElement* pElement); + void elementRect (rdo::animation::RectElement* pElement); + void elementRoundRect (rdo::animation::RoundRectElement* pElement); + void elementLine (rdo::animation::LineElement* pElement); + void elementTriang (rdo::animation::TriangElement* pElement); + void elementCircle (rdo::animation::CircleElement* pElement); + void elementEllipse (rdo::animation::EllipseElement* pElement); + void elementBMP (rdo::animation::BmpElement* pElement, const rdo::gui::BitmapList& bitmapList, rdo::gui::BitmapList& bitmapGeneratedList); + void elementSBMP (rdo::animation::ScaledBmpElement* pElement, const rdo::gui::BitmapList& bitmapList, rdo::gui::BitmapList& bitmapGeneratedList); + void elementActive (rdo::animation::ActiveElement* pElement, rdo::gui::animation::AreaList& areaList); + + static QPixmap getBitmap(const QString& bitmapName, + const QString& maskName, + const rdo::gui::BitmapList& bitmapList, + rdo::gui::BitmapList& bitmapGeneratedList); private: - virtual void resizeEvent (QResizeEvent* pEvent); - virtual void paintEvent (QPaintEvent* pEvent); - virtual void mousePressEvent(QMouseEvent* pEvent); + virtual void resizeEvent (QResizeEvent* pEvent); + virtual void paintEvent (QPaintEvent* pEvent); + virtual void mousePressEvent(QMouseEvent* pEvent); }; // -------------------------------------------------------------------------------- @@ -81,30 +80,28 @@ class Content: public QWidget class View: public QScrollArea { private: - Q_OBJECT - typedef QScrollArea parent_type; + Q_OBJECT + typedef QScrollArea parent_type; public: - View(QWidget* pParent); - virtual ~View(); + View(QWidget* pParent); + virtual ~View(); - Content* getContent(); + Content* getContent(); - using QWidget::update; + using QWidget::update; - void updateFont(); + void updateFont(); - void update(const rdo::animation::Frame* const pFrame, - const rdo::gui::BitmapList& bitmapList, - rdo::gui::BitmapList& bitmapGeneratedList, - rdo::gui::animation::AreaList& areaList); + void update(const rdo::animation::Frame* const pFrame, + const rdo::gui::BitmapList& bitmapList, + rdo::gui::BitmapList& bitmapGeneratedList, + rdo::gui::animation::AreaList& areaList); private: - QWidget* m_pContent; + QWidget* m_pContent; - virtual bool event(QEvent* pEvent); + virtual bool event(QEvent* pEvent); }; }}} // namespace rdo::gui::frame - -#endif // _RDO_STUDIO_FRAME_VIEW_H_ diff --git a/app/rdo_studio/src/main.cpp b/app/rdo_studio/src/main.cpp index dd53f9f9e..91c2524a9 100644 --- a/app/rdo_studio/src/main.cpp +++ b/app/rdo_studio/src/main.cpp @@ -8,10 +8,10 @@ int main(int argc, char** argv) { - rdo::locale::init(); + rdo::locale::init(); - Application app(argc, argv); - Q_INIT_RESOURCE(rdo_studio); + Application app(argc, argv); + Q_INIT_RESOURCE(rdo_studio); - return app.exec(); + return app.exec(); } diff --git a/app/rdo_studio/src/main_window.cpp b/app/rdo_studio/src/main_window.cpp index f68c6f347..8ad978ddc 100644 --- a/app/rdo_studio/src/main_window.cpp +++ b/app/rdo_studio/src/main_window.cpp @@ -4,10 +4,11 @@ #include "utils/src/common/warning_disable.h" #include #include +#include #include -#include #include -#include +#include +#include #include "utils/src/common/warning_enable.h" // ----------------------------------------------------------------------- SYNOPSIS #include "app/rdo_studio/src/main_window.h" @@ -27,596 +28,563 @@ // -------------------- MainWindow::InsertMenuData // -------------------------------------------------------------------------------- MainWindow::InsertMenuData::InsertMenuData(QObject* pParent, const QString& text, const Position& position) - : QObject (pParent ) - , m_text (text ) - , m_position(position) + : QObject (pParent ) + , m_text (text ) + , m_position(position) {} const QString& MainWindow::InsertMenuData::text() const { - return m_text; + return m_text; } const MainWindow::InsertMenuData::Position& MainWindow::InsertMenuData::position() const { - return m_position; + return m_position; } // -------------------------------------------------------------------------------- // -------------------- MainWindow::SubWindowToAction // -------------------------------------------------------------------------------- MainWindow::SubWindowToAction::SubWindowToAction(MainWindow* pMainWindow) - : m_pMainWindow(pMainWindow) - , m_pSeparator(NULL) + : m_pMainWindow(pMainWindow) + , m_pSeparator(NULL) { - ASSERT(m_pMainWindow); - ASSERT(m_pMainWindow->menuWindow); - m_pActionGroup = new QActionGroup(m_pMainWindow->menuWindow); - m_pActionGroup->setExclusive(true); + ASSERT(m_pMainWindow); + ASSERT(m_pMainWindow->menuWindow); + m_pActionGroup = new QActionGroup(m_pMainWindow->menuWindow); + m_pActionGroup->setExclusive(true); } void MainWindow::SubWindowToAction::onSubWindowActivated(QMdiSubWindow* pSubWindow) { - if (pSubWindow) - { - Map::const_iterator it = m_map.find(pSubWindow); - if (it == m_map.end()) - { - it = addNewSubWindow(pSubWindow); - } - ASSERT(it != m_map.end()); - it->second->setChecked(true); - } - updateList(); + if (pSubWindow) + { + Map::const_iterator it = m_map.find(pSubWindow); + if (it == m_map.end()) + it = addNewSubWindow(pSubWindow); + + ASSERT(it != m_map.end()); + it->second->setChecked(true); + } + updateList(); } void MainWindow::SubWindowToAction::onTitleChanged(QMdiSubWindow* pSubWindow) { - ASSERT(pSubWindow); - Map::const_iterator it = m_map.find(pSubWindow); - ASSERT(it != m_map.end()); - it->second->setText(pSubWindow->windowTitle()); + ASSERT(pSubWindow); + Map::const_iterator it = m_map.find(pSubWindow); + ASSERT(it != m_map.end()); + it->second->setText(pSubWindow->windowTitle()); } MainWindow::SubWindowToAction::Map::const_iterator MainWindow::SubWindowToAction::addNewSubWindow(QMdiSubWindow* pSubWindow) { - ASSERT(pSubWindow); + ASSERT(pSubWindow); - QList windowList = m_pMainWindow->mdiArea->subWindowList(); + QList windowList = m_pMainWindow->mdiArea->subWindowList(); - if (windowList.count() == 1 && m_pSeparator == NULL) - { - addFirstSubWindow(); - } + if (windowList.count() == 1 && m_pSeparator == NULL) + addFirstSubWindow(); - pSubWindow->installEventFilter(m_pMainWindow); + pSubWindow->installEventFilter(m_pMainWindow); - QAction* pAction = m_pMainWindow->menuWindow->addAction(pSubWindow->windowTitle()); - QObject::connect(pAction, &QAction::triggered, boost::function(boost::bind(&QMdiArea::setActiveSubWindow, m_pMainWindow->mdiArea, pSubWindow))); + QAction* pAction = m_pMainWindow->menuWindow->addAction(pSubWindow->windowTitle()); + QObject::connect(pAction, &QAction::triggered, boost::function(boost::bind(&QMdiArea::setActiveSubWindow, m_pMainWindow->mdiArea, pSubWindow))); - std::pair result = m_map.insert(Map::value_type(pSubWindow, pAction)); - ASSERT(result.second); + std::pair result = m_map.insert(Map::value_type(pSubWindow, pAction)); + ASSERT(result.second); - m_pActionGroup->addAction(pAction); - pAction->setCheckable(true); + m_pActionGroup->addAction(pAction); + pAction->setCheckable(true); - return result.first; + return result.first; } void MainWindow::SubWindowToAction::updateList() { - QList windowList = m_pMainWindow->mdiArea->subWindowList(); - - for (SubWindowToAction::Map::const_iterator it = m_map.begin(); it != m_map.end();) - { - if (!windowList.contains(it->first)) - { - QObject::disconnect(it->second, &QAction::triggered, NULL, NULL); - m_pMainWindow->menuWindow->removeAction(it->second); - m_pActionGroup->removeAction(it->second); - m_map.erase(it++); - } - else - { - ++it; - } - } - - if (windowList.empty() && m_pSeparator) - { - removeLastSubWindow(); - } + QList windowList = m_pMainWindow->mdiArea->subWindowList(); + + for (SubWindowToAction::Map::const_iterator it = m_map.begin(); it != m_map.end();) + { + if (!windowList.contains(it->first)) + { + QObject::disconnect(it->second, &QAction::triggered, NULL, NULL); + m_pMainWindow->menuWindow->removeAction(it->second); + m_pActionGroup->removeAction(it->second); + m_map.erase(it++); + } + else + { + ++it; + } + } + + if (windowList.empty() && m_pSeparator) + removeLastSubWindow(); } void MainWindow::SubWindowToAction::addFirstSubWindow() { - ASSERT(m_pSeparator == NULL); - m_pSeparator = m_pMainWindow->menuWindow->addSeparator(); + ASSERT(m_pSeparator == NULL); + m_pSeparator = m_pMainWindow->menuWindow->addSeparator(); } void MainWindow::SubWindowToAction::removeLastSubWindow() { - ASSERT(m_pSeparator); - m_pMainWindow->menuWindow->removeAction(m_pSeparator); - m_pSeparator = NULL; + ASSERT(m_pSeparator); + m_pMainWindow->menuWindow->removeAction(m_pSeparator); + m_pSeparator = NULL; } // -------------------------------------------------------------------------------- // -------------------- MainWindow // -------------------------------------------------------------------------------- MainWindow::MainWindow() - : m_pModel(NULL) - , m_updateTimerID(0) - , m_pInsertMenuSignalMapper(NULL) + : m_pModel(NULL) + , m_updateTimerID(0) + , m_pInsertMenuSignalMapper(NULL) { - setupUi(this); - installEventFilter(this); - m_subWindowToAction.reset(new SubWindowToAction(this)); - mdiArea->setOption(QMdiArea::DontMaximizeSubWindowOnActivation); - mdiArea->setTabsClosable(true); - mdiArea->setTabsMovable(true); + setupUi(this); + installEventFilter(this); + m_subWindowToAction.reset(new SubWindowToAction(this)); + mdiArea->setOption(QMdiArea::DontMaximizeSubWindowOnActivation); + mdiArea->setTabsClosable(true); + mdiArea->setTabsMovable(true); - createStatusBar (); - createToolBar (); - createInsertMenu(); + createStatusBar(); + createToolBar(); + createInsertMenu(); - addAction(actSearchFindNextCurrent); - addAction(actSearchFindPreviousCurrent); - addAction(actSearchLogNext); - addAction(actSearchLogPrev); + addAction(actSearchFindNextCurrent); + addAction(actSearchFindPreviousCurrent); + addAction(actSearchLogNext); + addAction(actSearchLogPrev); - connect(menuFileReopen, &QMenu::triggered, this, &MainWindow::onMenuFileReopen); - connect(actFileExit, &QAction::triggered, this, &QMainWindow::close); + connect(menuFileReopen, &QMenu::triggered, this, &MainWindow::onMenuFileReopen); + connect(actFileExit, &QAction::triggered, this, &QMainWindow::close); - connect(mdiArea, &QMdiArea::subWindowActivated, this, &MainWindow::onSubWindowActivated); + connect(mdiArea, &QMdiArea::subWindowActivated, this, &MainWindow::onSubWindowActivated); - connect(actViewSettings, &QAction::triggered, this, &MainWindow::onViewOptions); - connect(actHelpWhatsNew, &QAction::triggered, this, &MainWindow::onHelpWhatsNew); - connect(actHelpAbout, &QAction::triggered, this, &MainWindow::onHelpAbout); + connect(actViewSettings, &QAction::triggered, this, &MainWindow::onViewOptions); + connect(actHelpWhatsNew, &QAction::triggered, this, &MainWindow::onHelpWhatsNew); + connect(actHelpAbout, &QAction::triggered, this, &MainWindow::onHelpAbout); - connect(toolBarModel, &QToolBar::orientationChanged, this, &MainWindow::onToolBarModelOrientationChanged); + connect(toolBarModel, &QToolBar::orientationChanged, this, &MainWindow::onToolBarModelOrientationChanged); - Catalogue::AddLexerModule(&lexerRDOSyntax); - Catalogue::AddLexerModule(&lexerRDOFind); - Scintilla_LinkLexers(); + Catalogue::AddLexerModule(&lexerRDOSyntax); + Catalogue::AddLexerModule(&lexerRDOFind); + Scintilla_LinkLexers(); - loadMenuFileReopen (); - updateMenuFileReopen(); + loadMenuFileReopen (); + updateMenuFileReopen(); } -//! todo не вызывается диструктор +// TODO не вызывается диструктор MainWindow::~MainWindow() {} void MainWindow::createStatusBar() { - m_pStatusBar = rdo::Factory::create(this); + m_pStatusBar = rdo::Factory::create(this); } void MainWindow::createToolBar() { - m_pModelSpeedSlider = new QSlider(Qt::Horizontal, this); - m_pModelSpeedSlider->setRange(0, 100); - m_pModelSpeedSlider->setValue(100); - m_pModelSpeedSlider->setMaximumSize(100, 100); + m_pModelSpeedSlider = new QSlider(Qt::Horizontal, this); + m_pModelSpeedSlider->setRange(0, 100); + m_pModelSpeedSlider->setValue(100); + m_pModelSpeedSlider->setMaximumSize(100, 100); - toolBarModel->insertWidget(actModelFrameNext, m_pModelSpeedSlider); - toolBarModel->insertSeparator(actModelFrameNext); + toolBarModel->insertWidget(actModelFrameNext, m_pModelSpeedSlider); + toolBarModel->insertSeparator(actModelFrameNext); } void MainWindow::createInsertMenu() { - ASSERT(!m_pInsertMenuSignalMapper); - m_pInsertMenuSignalMapper = new QSignalMapper(this); - - class MenuItem - { - public: - typedef InsertMenuData::Position Position; - - MenuItem(const char* title, const QString& resourceName = QString(), const Position& position = Position()) - : m_title (title ) - , m_position(position) - { - init(resourceName); - } - - MenuItem(const QString& title, const QString& resourceName = QString(), const Position& position = Position()) - : m_title (title ) - , m_position(position) - { - init(resourceName); - } - - const QString& title() const - { - return m_title; - } - - const QString textForInsert() const - { - return !m_textForInsert.isEmpty() - ? m_textForInsert - : m_title; - } - - const Position& position() const - { - return m_position; - } - - private: - QString m_title; - QString m_textForInsert; - Position m_position; - - void init(const QString& resourceName) - { - if (!resourceName.isEmpty()) - { - QFile file(":/insert_menu_template/insert_menu_template/" + resourceName); - if (file.open(QIODevice::ReadOnly) && file.isOpen()) - { - m_textForInsert = file.readAll(); - } - } - } - }; - - typedef rdo::vector MenuItemList; - typedef std::list > MenuList; - - MenuList menuList; - menuList.push_back( - std::make_pair( - "PAT", - MenuItemList - (MenuItem("PAT operation", "pat_operation.txt", 9)) - (MenuItem("PAT rule", "pat_rule.txt", 9)) - (MenuItem("PAT keyboard", "pat_keyboard.txt", 9)) - ("$Pattern")("operation")("event")("rule")("keyboard")("trace")("no_trace")("$Parameters") - ("$Relevant_resources")("Keep")("NoChange")("Create")("Erase")("NonExist")("$Time")("$Body") - ("Convert_begin")("Convert_end")("Convert_event")("Convert_rule")("Choice from") - ("Choice NoCheck")("first")("with_max")("with_min")("set")("$End") - ) - ); - menuList.push_back( - std::make_pair( - "EVN", - MenuItemList - (MenuItem("EVN", "pat_event.txt", 9)) - ("$Pattern")("trace")("no_trace")("$Parameters")("$Relevant_resources")("Keep")("NoChange") - ("Create")("Erase")("NonExist")("$Body")("Convert_event")("$End") - ) - ); - menuList.push_back( - std::make_pair( - "PRC", - MenuItemList - (MenuItem("PRC", "prc.txt", 9)) - ("$Process")("GENERATE")("SEIZE")("RELEASE")("ADVANCE")("QUEUE")("DEPART")("ASSIGN")("TERMINATE") - ) - ); - menuList.push_back( - std::make_pair( - "RTP", - MenuItemList - (MenuItem("RTP permanent", "rtp_permanent.txt", 15)) - (MenuItem("RTP temporary", "rtp_temporary.txt", 15)) - ("$Resource_type")("permanent")("temporary")("$Parameters")("integer")("real")("enum")("string") - ("bool")("true")("false")("such_as")("$End") - ) - ); - menuList.push_back( - std::make_pair( - "RSS", - MenuItemList - (MenuItem("RSS", "rss.txt", 13)) - ("$Resources")("trace")("no_trace")("$End") - ) - ); - menuList.push_back( - std::make_pair( - "FRM", - MenuItemList - (MenuItem("FRM", "frm.txt", 7)) - ("$Frame")("$Sprite")("$Back_picture")("bitmap")("text")("line")("rect")("circle")("ellipse")("r_rect") - ("triang")("s_bmp")("active")("$End") - ) - ); - menuList.push_back( - std::make_pair( - "FUN", - MenuItemList - (MenuItem("FUN algorithmic", "fun_algorithmic.txt", 10)) - (MenuItem("SQN", "fun_sequence.txt", 10)) - (MenuItem("CNS", "fun_const.txt", 12)) - ("$Function")("$Type")("algorithmic")("list")("table")("normal")("uniform")("exponential") - ("triangular")("by_hist")("enumerative")("$Parameters")("$Body")("$Sequence")("$Constant") - ("$End") - ) - ); - menuList.push_back( - std::make_pair( - "DPT", - MenuItemList - (MenuItem("DPT some", "dtp_some.txt", 16)) - (MenuItem("DPT prior", "dtp_prior.txt", 16)) - (MenuItem("DPT search", "dtp_search.txt", 16)) - ("$Decision_point")("some")("search")("prior")("no_trace")("trace_stat")("trace_tops")("trace_all") - ("$Condition")("$Term_condition")("$Evaluate_by")("$Compare_tops")("YES")("NO")("$Activities") - ("value before")("value after")("$End") - ) - ); - menuList.push_back( - std::make_pair( - "SMR", - MenuItemList - (MenuItem("SMR", "smr.txt", 17)) - ("Frame_number")("Show_mode")("Animation")("Monitor")("NoShow")("Show_rate")("Run_StartTime") - ("Trace_StartTime")("Trace_EndTime")("Terminate_if")("Time_now")("Seconds")("Break_point") - ) - ); - menuList.push_back( - std::make_pair( - "PMD", - MenuItemList - (MenuItem("PMD", "pmd.txt", 11)) - ("$Results")("watch_par")("watch_state")("watch_quant")("watch_value")("get_value")("trace") - ("no_trace")("$End") - ) - ); - menuList.push_back(std::make_pair("", MenuItemList())); - menuList.push_back( - std::make_pair( - "Встроенные функции", - MenuItemList("Abs")("ArcCos")("ArcSin")("ArcTan")("Cos")("Cotan")("Exist")("Exp")("Floor")("For_All")("Frac") - ("IAbs")("IMax")("IMin")("Int")("IntPower")("Ln")("Log10")("Log2")("LogN")("Max")("Min")("Not_Exist") - ("Not_For_All")("Power")("Round")("Select")("Sin")("Sqrt")("Tan") - ) - ); - menuList.push_back( - std::make_pair( - "Процедурный язык", - MenuItemList - (MenuItem("if", "algo_if.txt", 4)) - ("else") - (MenuItem("if-else", "algo_if_else.txt", 4)) - (MenuItem("for", "algo_for.txt", 5)) - ("return") - (MenuItem("Локальная переменная", "algo_local_variable.txt")) - ) - ); - - for (const MenuList::value_type& menu: menuList) - { - if (menu.first.isEmpty()) - { - ASSERT(menu.second.empty()); - menuInsert->addSeparator(); - continue; - } - - QMenu* pMenu = new QMenu(menu.first, this); - menuInsert->addMenu(pMenu); - - for (const MenuItem& menuItem: menu.second) - { - QAction* pAction = pMenu->addAction(menuItem.title()); - pAction->setEnabled(false); - QObject::connect(pAction, SIGNAL(triggered(bool)), m_pInsertMenuSignalMapper, SLOT(map())); - InsertMenuData* pInsertMenuData = new InsertMenuData(this, menuItem.textForInsert(), menuItem.position()); - m_pInsertMenuSignalMapper->setMapping(pAction, pInsertMenuData); - } - } + ASSERT(!m_pInsertMenuSignalMapper); + m_pInsertMenuSignalMapper = new QSignalMapper(this); + + class MenuItem + { + public: + typedef InsertMenuData::Position Position; + + MenuItem(const char* title, const QString& resourceName = QString(), const Position& position = Position()) + : m_title(title) + , m_position(position) + { + if (!resourceName.isEmpty()) + { + QFile file(":/insert_menu_template/insert_menu_template/" + resourceName); + if (file.open(QIODevice::ReadOnly) && file.isOpen()) + m_textForInsert = file.readAll(); + } + } + + const QString& title() const + { + return m_title; + } + + const QString textForInsert() const + { + return !m_textForInsert.isEmpty() + ? m_textForInsert + : m_title; + } + + const Position& position() const + { + return m_position; + } + + private: + QString m_title; + QString m_textForInsert; + Position m_position; + }; + + typedef std::vector MenuItemList; + typedef std::list> MenuList; + + MenuList menuList; + menuList.push_back(std::make_pair( + "PAT", + MenuItemList({ + MenuItem("PAT operation", "pat_operation.txt", 9), + MenuItem("PAT rule", "pat_rule.txt", 9), + MenuItem("PAT keyboard", "pat_keyboard.txt", 9), + "$Pattern", "operation", "event", "rule", "keyboard", "trace", "no_trace", "$Parameters", + "$Relevant_resources", "Keep", "NoChange", "Create", "Erase", "NonExist", "$Time", "$Body", + "Convert_begin", "Convert_end", "Convert_event", "Convert_rule", "Choice from", + "Choice NoCheck", "first", "with_max", "with_min", "set", "$End" + }))); + + menuList.push_back(std::make_pair( + "EVN", + MenuItemList({ + MenuItem("EVN", "pat_event.txt", 9), + "$Pattern", "trace", "no_trace", "$Parameters", "$Relevant_resources", "Keep", "NoChange", + "Create", "Erase", "NonExist", "$Body", "Convert_event", "$End" + }))); + + menuList.push_back(std::make_pair( + "PRC", + MenuItemList({ + MenuItem("PRC", "prc.txt", 9), + "$Process", "GENERATE", "SEIZE", "RELEASE", "ADVANCE", "QUEUE", "DEPART", "ASSIGN", "TERMINATE" + }))); + + menuList.push_back(std::make_pair( + "RTP", + MenuItemList({ + MenuItem("RTP permanent", "rtp_permanent.txt", 15), + MenuItem("RTP temporary", "rtp_temporary.txt", 15), + "$Resource_type", "permanent", "temporary", "$Parameters", "integer", "real", "enum", "string", + "bool", "true", "false", "such_as", "$End" + }))); + + menuList.push_back(std::make_pair( + "RSS", + MenuItemList({ + MenuItem("RSS", "rss.txt", 16), + "$Resources", "trace", "no_trace", "$End" + }))); + + menuList.push_back(std::make_pair( + "FRM", + MenuItemList({ + MenuItem("FRM", "frm.txt", 7), + "$Frame", "$Sprite", "$Back_picture", "bitmap", "text", "line", "rect", "circle", "ellipse", "r_rect", + "triang", "s_bmp", "active", "$End" + }))); + + menuList.push_back(std::make_pair( + "FUN", + MenuItemList({ + MenuItem("FUN algorithmic", "fun_algorithmic.txt", 10), + MenuItem("SQN", "fun_sequence.txt", 10), + MenuItem("CNS", "fun_const.txt", 15), + "$Function", "$Type", "algorithmic", "list", "table", "normal", "uniform", "exponential", + "triangular", "by_hist", "enumerative", "$Parameters", "$Body", "$Sequence", "$Constant", + "$End" + }))); + + menuList.push_back(std::make_pair( + "DPT", + MenuItemList({ + MenuItem("DPT some", "dpt_some.txt", 16), + MenuItem("DPT prior", "dpt_prior.txt", 16), + MenuItem("DPT search", "dpt_search.txt", 16), + "$Decision_point", "some", "search", "prior", "no_trace", "trace_stat", "trace_tops", "trace_all", + "$Condition", "$Term_condition", "$Evaluate_by", "$Compare_tops", "YES", "NO", "$Activities", + "value before", "value after", "$End" + }))); + + menuList.push_back(std::make_pair( + "SMR", + MenuItemList({ + MenuItem("SMR", "smr.txt", 17), + "Frame_number", "Show_mode", "Animation", "Monitor", "NoShow", "Show_rate", "Run_StartTime", + "Trace_StartTime", "Trace_EndTime", "Terminate_if", "Time_now", "Seconds", "Break_point" + }))); + + menuList.push_back(std::make_pair( + "PMD", + MenuItemList({ + MenuItem("PMD", "pmd.txt", 14), + "$Results", "watch_par", "watch_state", "watch_quant", "watch_value", "get_value", "trace", + "no_trace", "$End" + }))); + + menuList.push_back(std::make_pair("", MenuItemList())); + menuList.push_back(std::make_pair( + "Встроенные функции", + MenuItemList({ + "Abs", "ArcCos", "ArcSin", "ArcTan", "Cos", "Cotan", "Exist", "Exp", "Floor", "For_All", "Frac", + "IAbs", "IMax", "IMin", "Int", "IntPower", "Ln", "Log10", "Log2", "LogN", "Max", "Min", "Not_Exist", + "Not_For_All", "Power", "Round", "Select", "Sin", "Sqrt", "Tan" + }))); + + menuList.push_back(std::make_pair( + "Процедурный язык", + MenuItemList({ + MenuItem("if", "algo_if.txt", 4), + "else", + MenuItem("if-else", "algo_if_else.txt", 4), + MenuItem("for", "algo_for.txt", 5), + "return", + MenuItem("Локальная переменная", "algo_local_variable.txt") + }))); + + for (const MenuList::value_type& menu: menuList) + { + if (menu.first.isEmpty()) + { + ASSERT(menu.second.empty()); + menuInsert->addSeparator(); + continue; + } + + QMenu* pMenu = new QMenu(menu.first, this); + menuInsert->addMenu(pMenu); + + for (const MenuItem& menuItem: menu.second) + { + QAction* pAction = pMenu->addAction(menuItem.title()); + pAction->setEnabled(false); + QObject::connect(pAction, SIGNAL(triggered(bool)), m_pInsertMenuSignalMapper, SLOT(map())); + InsertMenuData* pInsertMenuData = new InsertMenuData(this, menuItem.textForInsert(), menuItem.position()); + m_pInsertMenuSignalMapper->setMapping(pAction, pInsertMenuData); + } + } } void MainWindow::init() { - QSettings settings; - settings.beginGroup("style"); - - settings.beginGroup("editor"); - settings >> style_editor; - settings.endGroup(); - - settings.beginGroup("build"); - style_build.window.wordWrap = true; - style_build.window.showHorzScrollBar = false; - settings >> style_build; - settings.endGroup(); - - settings.beginGroup("debug"); - style_debug.window.wordWrap = true; - style_debug.window.showHorzScrollBar = false; - settings >> style_debug; - settings.endGroup(); - - settings.beginGroup("trace"); - settings >> style_trace; - settings.endGroup(); - - settings.beginGroup("results"); - settings >> style_results; - settings.endGroup(); - - settings.beginGroup("find"); - settings >> style_find; - settings.endGroup(); - - settings.beginGroup("frame"); - settings >> style_frame; - settings.endGroup(); - - settings.beginGroup("chart"); - settings >> style_chart; - settings.endGroup(); - - settings.endGroup(); - - m_pDockBuild = new DockBuild (this); - m_pDockDebug = new DockDebug (this); - m_pDockTrace = new DockTrace (this); - m_pDockResults = new DockResults(this); - m_pDockFind = new DockFind (this); - - QObject::connect(m_pDockBuild, &QDockWidget::visibilityChanged, this, &MainWindow::onDockVisibleChanged); - QObject::connect(m_pDockFind, &QDockWidget::visibilityChanged, this, &MainWindow::onDockVisibleChanged); - - addDockWidget(Qt::BottomDockWidgetArea, m_pDockBuild); - tabifyDockWidget(m_pDockBuild, m_pDockDebug ); - tabifyDockWidget(m_pDockBuild, m_pDockTrace ); - tabifyDockWidget(m_pDockBuild, m_pDockResults); - tabifyDockWidget(m_pDockBuild, m_pDockFind ); - m_pDockDebug->raise(); - - m_pDockChartTree = new DockChartTree(this); - m_pDockFrame = new DockFrame (this); - addDockWidget(Qt::LeftDockWidgetArea, m_pDockChartTree); - tabifyDockWidget(m_pDockChartTree, m_pDockFrame); - m_pDockChartTree->raise(); - - QMenu* pMenuDockView = new QMenu("Окна"); - ASSERT(pMenuDockView); - menuView->insertMenu(actViewSettings, pMenuDockView); - pMenuDockView->addAction(m_pDockBuild->toggleViewAction()); - pMenuDockView->addAction(m_pDockDebug->toggleViewAction()); - pMenuDockView->addAction(m_pDockTrace->toggleViewAction()); - pMenuDockView->addAction(m_pDockResults->toggleViewAction()); - pMenuDockView->addAction(m_pDockFind->toggleViewAction()); - pMenuDockView->addAction(m_pDockChartTree->toggleViewAction()); - pMenuDockView->addAction(m_pDockFrame->toggleViewAction()); - - QMenu* pMenuToolbarView = new QMenu("Панели"); - ASSERT(pMenuToolbarView); - menuView->insertMenu(actViewSettings, pMenuToolbarView); - pMenuToolbarView->addAction(toolBarFile->toggleViewAction()); - pMenuToolbarView->addAction(toolBarEdit->toggleViewAction()); - pMenuToolbarView->addAction(toolBarZoom->toggleViewAction()); - pMenuToolbarView->addAction(toolBarModel->toggleViewAction()); - - menuView->insertSeparator(actViewSettings); - - new rdo::gui::model::Model(); - m_pModel = g_pModel; - updateAllStyles(); + QSettings settings; + settings.beginGroup("style"); + + settings.beginGroup("editor"); + settings >> style_editor; + settings.endGroup(); + + settings.beginGroup("build"); + style_build.window.wordWrap = true; + style_build.window.showHorzScrollBar = false; + settings >> style_build; + settings.endGroup(); + + settings.beginGroup("debug"); + style_debug.window.wordWrap = true; + style_debug.window.showHorzScrollBar = false; + settings >> style_debug; + settings.endGroup(); + + settings.beginGroup("trace"); + settings >> style_trace; + settings.endGroup(); + + settings.beginGroup("results"); + settings >> style_results; + settings.endGroup(); + + settings.beginGroup("find"); + settings >> style_find; + settings.endGroup(); + + settings.beginGroup("frame"); + settings >> style_frame; + settings.endGroup(); + + settings.beginGroup("chart"); + settings >> style_chart; + settings.endGroup(); + + settings.endGroup(); + + m_pDockBuild = new DockBuild (this); + m_pDockDebug = new DockDebug (this); + m_pDockTrace = new DockTrace (this); + m_pDockResults = new DockResults(this); + m_pDockFind = new DockFind (this); + + QObject::connect(m_pDockBuild, &QDockWidget::visibilityChanged, this, &MainWindow::onDockVisibleChanged); + QObject::connect(m_pDockFind, &QDockWidget::visibilityChanged, this, &MainWindow::onDockVisibleChanged); + + addDockWidget(Qt::BottomDockWidgetArea, m_pDockBuild); + tabifyDockWidget(m_pDockBuild, m_pDockDebug ); + tabifyDockWidget(m_pDockBuild, m_pDockTrace ); + tabifyDockWidget(m_pDockBuild, m_pDockResults); + tabifyDockWidget(m_pDockBuild, m_pDockFind ); + m_pDockDebug->raise(); + + m_pDockChartTree = new DockChartTree(this); + m_pDockFrame = new DockFrame (this); + addDockWidget(Qt::LeftDockWidgetArea, m_pDockChartTree); + tabifyDockWidget(m_pDockChartTree, m_pDockFrame); + m_pDockChartTree->raise(); + + QMenu* pMenuDockView = new QMenu("Окна"); + ASSERT(pMenuDockView); + menuView->insertMenu(actViewSettings, pMenuDockView); + pMenuDockView->addAction(m_pDockBuild->toggleViewAction()); + pMenuDockView->addAction(m_pDockDebug->toggleViewAction()); + pMenuDockView->addAction(m_pDockTrace->toggleViewAction()); + pMenuDockView->addAction(m_pDockResults->toggleViewAction()); + pMenuDockView->addAction(m_pDockFind->toggleViewAction()); + pMenuDockView->addAction(m_pDockChartTree->toggleViewAction()); + pMenuDockView->addAction(m_pDockFrame->toggleViewAction()); + + QMenu* pMenuToolbarView = new QMenu("Панели"); + ASSERT(pMenuToolbarView); + menuView->insertMenu(actViewSettings, pMenuToolbarView); + pMenuToolbarView->addAction(toolBarFile->toggleViewAction()); + pMenuToolbarView->addAction(toolBarEdit->toggleViewAction()); + pMenuToolbarView->addAction(toolBarZoom->toggleViewAction()); + pMenuToolbarView->addAction(toolBarModel->toggleViewAction()); + + menuView->insertSeparator(actViewSettings); + + new rdo::gui::model::Model(); + m_pModel = g_pModel; + updateAllStyles(); } void MainWindow::setVisible(bool visible) { - parent_type::setVisible(visible); + parent_type::setVisible(visible); } void MainWindow::closeEvent(QCloseEvent* event) { - if (g_pModel && !g_pModel->closeModel()) - { - event->ignore(); - } - - if (event->isAccepted()) - { - update_stop(); - - QSettings settings; - settings.beginGroup("style"); - - settings.beginGroup("editor"); - settings << style_editor; - settings.endGroup(); - - settings.beginGroup("build"); - settings << style_build; - settings.endGroup(); - - settings.beginGroup("debug"); - settings << style_debug; - settings.endGroup(); - - settings.beginGroup("trace"); - settings << style_trace; - settings.endGroup(); - - settings.beginGroup("results"); - settings << style_results; - settings.endGroup(); - - settings.beginGroup("find"); - settings << style_find; - settings.endGroup(); - - settings.beginGroup("frame"); - settings << style_frame; - settings.endGroup(); - - settings.beginGroup("chart"); - settings << style_chart; - settings.endGroup(); - - settings.endGroup(); - } + if (g_pModel && !g_pModel->closeModel()) + event->ignore(); + + if (event->isAccepted()) + { + update_stop(); + + QSettings settings; + settings.beginGroup("style"); + + settings.beginGroup("editor"); + settings << style_editor; + settings.endGroup(); + + settings.beginGroup("build"); + settings << style_build; + settings.endGroup(); + + settings.beginGroup("debug"); + settings << style_debug; + settings.endGroup(); + + settings.beginGroup("trace"); + settings << style_trace; + settings.endGroup(); + + settings.beginGroup("results"); + settings << style_results; + settings.endGroup(); + + settings.beginGroup("find"); + settings << style_find; + settings.endGroup(); + + settings.beginGroup("frame"); + settings << style_frame; + settings.endGroup(); + + settings.beginGroup("chart"); + settings << style_chart; + settings.endGroup(); + + settings.endGroup(); + } } void MainWindow::onViewOptions() { - ViewPreferences dlg(this); - dlg.exec(); + ViewPreferences dlg(this); + dlg.exec(); } void MainWindow::updateAllStyles() { - g_pModel->updateStyleOfAllModel(); - getDockBuild ().getContext().setEditorStyle (&style_build ); - getDockDebug ().getContext().setEditorStyle (&style_debug ); - getDockTrace ().getContext().view().setStyle(&style_trace ); - getDockResults().getContext().setEditorStyle (&style_results); - getDockFind ().getContext().setEditorStyle (&style_find ); - g_pTracer->updateChartsStyles(); + g_pModel->updateStyleOfAllModel(); + getDockBuild ().getContext().setEditorStyle (&style_build ); + getDockDebug ().getContext().setEditorStyle (&style_debug ); + getDockTrace ().getContext().view().setStyle(&style_trace ); + getDockResults().getContext().setEditorStyle (&style_results); + getDockFind ().getContext().setEditorStyle (&style_find ); + g_pTracer->updateChartsStyles(); } const LPStatusBar& MainWindow::statusBar() const { - return m_pStatusBar; + return m_pStatusBar; } void MainWindow::onHelpWhatsNew() { - QByteArray ba; - ba.append("setSource qthelp://language/doc/rdo_studio_rus/html/rdo_whats_new.htm\n"); - g_pApp->callQtAssistant(ba); + QByteArray ba; + ba.append("setSource qthelp://language/doc/rdo_studio_rus/html/rdo_whats_new.htm\n"); + g_pApp->callQtAssistant(ba); } void MainWindow::onHelpAbout() { - AboutDialog dlg(this); - dlg.exec(); + AboutDialog dlg(this); + dlg.exec(); } void MainWindow::update_start() { - m_updateTimerID = startTimer(1000 / 30); + m_updateTimerID = startTimer(1000 / 30); } void MainWindow::update_stop() { - if (m_updateTimerID) - { - killTimer(m_updateTimerID); - m_updateTimerID = 0; - } + if (m_updateTimerID) + { + killTimer(m_updateTimerID); + m_updateTimerID = 0; + } } void MainWindow::timerEvent(QTimerEvent* event) { - parent_type::timerEvent(event); + parent_type::timerEvent(event); - if (event->timerId() == m_updateTimerID) - { - update_stop(); - g_pModel->update(); - update_start(); - } + if (event->timerId() == m_updateTimerID) + { + update_stop(); + g_pModel->update(); + update_start(); + } } void MainWindow::showEvent(QShowEvent*) @@ -627,308 +595,283 @@ void MainWindow::hideEvent(QHideEvent*) void MainWindow::addSubWindow(QWidget* pWidget) { - ASSERT(pWidget); + ASSERT(pWidget); - QList frameList = mdiArea->subWindowList(); + QList frameList = mdiArea->subWindowList(); - bool maximized = frameList.empty(); - if (!maximized) - { - maximized = frameList.front()->isMaximized(); - } + bool maximized = frameList.empty(); + if (!maximized) + maximized = frameList.front()->isMaximized(); - QMdiSubWindow* pFrame = mdiArea->addSubWindow(pWidget); - QObject::connect(pFrame, &QMdiSubWindow::windowStateChanged, this, &MainWindow::onSubWindowStateChanged); + QMdiSubWindow* pFrame = mdiArea->addSubWindow(pWidget); + QObject::connect(pFrame, &QMdiSubWindow::windowStateChanged, this, &MainWindow::onSubWindowStateChanged); - pWidget->show(); + pWidget->show(); - static const float sizeScale = 0.9f; - QSize size(mdiArea->size()); - size.setWidth (int(float(size.width ()) * sizeScale)); - size.setHeight(int(float(size.height()) * sizeScale)); - pFrame->move (frameList.size() * 4, frameList.size() * 4); - pFrame->resize(size); + static const float sizeScale = 0.9f; + QSize size(mdiArea->size()); + size.setWidth (int(float(size.width ()) * sizeScale)); + size.setHeight(int(float(size.height()) * sizeScale)); + pFrame->move (frameList.size() * 4, frameList.size() * 4); + pFrame->resize(size); - if (maximized) - { - pFrame->showMaximized(); - } + if (maximized) + pFrame->showMaximized(); } void MainWindow::activateSubWindow(QWidget* pWidget) { - QMdiSubWindow* pSubWindow = dynamic_cast(pWidget); - if (!pSubWindow) - return; + QMdiSubWindow* pSubWindow = dynamic_cast(pWidget); + if (!pSubWindow) + return; - mdiArea->setActiveSubWindow(pSubWindow); + mdiArea->setActiveSubWindow(pSubWindow); } void MainWindow::onDockVisibleChanged(bool visible) { - if (!visible) - return; + if (!visible) + return; - QDockWidget* pDock = dynamic_cast(sender()); - ASSERT(pDock); + QDockWidget* pDock = dynamic_cast(sender()); + ASSERT(pDock); - rdo::gui::editor::Log* pLog = NULL; + rdo::gui::editor::Log* pLog = NULL; - if (pDock == &getDockBuild()) - { - pLog = &getDockBuild().getContext(); - } - else if (pDock == &getDockFind()) - { - pLog = &getDockFind().getContext(); - } + if (pDock == &getDockBuild()) + { + pLog = &getDockBuild().getContext(); + } + else if (pDock == &getDockFind()) + { + pLog = &getDockFind().getContext(); + } - if (!pLog) - return; + if (!pLog) + return; - rdo::gui::model::TabCtrl* pEditorTab = g_pModel->getTab(); - if (pEditorTab) - { - for (int i = 0; i < pEditorTab->count(); ++i) - { - pEditorTab->getItemEdit(i)->setLog(*pLog); - } - } + rdo::gui::model::TabCtrl* pEditorTab = g_pModel->getTab(); + if (pEditorTab) + { + for (int i = 0; i < pEditorTab->count(); ++i) + pEditorTab->getItemEdit(i)->setLog(*pLog); + } } void MainWindow::onToolBarModelOrientationChanged(Qt::Orientation orientation) { - m_pModelSpeedSlider->setOrientation(orientation); + m_pModelSpeedSlider->setOrientation(orientation); } void MainWindow::onMenuFileReopen(QAction* pAction) { - QString menuName = pAction->text(); - int pos = menuName.indexOf(' '); - if (pos == -1) - return; + QString menuName = pAction->text(); + int pos = menuName.indexOf(' '); + if (pos == -1) + return; + + QString fileName = menuName.midRef(pos + 1).toString(); + if (!g_pModel->openModel(fileName) && g_pModel->isPrevModelClosed()) + { + ReopenList::iterator it = std::find(m_reopenList.begin(), m_reopenList.end(), fileName); + if (it != m_reopenList.end()) + m_reopenList.erase(it); - QString fileName = menuName.midRef(pos + 1).toString(); - if (!g_pModel->openModel(fileName) && g_pModel->isPrevModelClosed()) - { - ReopenList::iterator it = std::find(m_reopenList.begin(), m_reopenList.end(), fileName); - if (it != m_reopenList.end()) - { - m_reopenList.erase(it); - } - updateMenuFileReopen(); - } + updateMenuFileReopen(); + } } void MainWindow::insertMenuFileReopenItem(const QString& item) { - if (!item.isEmpty()) - { - ReopenList::iterator it = boost::range::find(m_reopenList, item); - if (it != m_reopenList.end()) - { - m_reopenList.erase(it); - } + if (!item.isEmpty()) + { + ReopenList::iterator it = boost::range::find(m_reopenList, item); + if (it != m_reopenList.end()) + m_reopenList.erase(it); - m_reopenList.push_front(item); + m_reopenList.push_front(item); - while (m_reopenList.size() > 10) - { - ReopenList::iterator it = m_reopenList.end(); - --it; - m_reopenList.erase(it); - } + while (m_reopenList.size() > 10) + { + ReopenList::iterator it = m_reopenList.end(); + --it; + m_reopenList.erase(it); + } - updateMenuFileReopen(); - } + updateMenuFileReopen(); + } } void MainWindow::updateMenuFileReopen() { - menuFileReopen->clear(); + menuFileReopen->clear(); - for (ReopenList::size_type reopenIndex = 0; reopenIndex < m_reopenList.size(); ++reopenIndex) - { - if (reopenIndex == 4) - { - menuFileReopen->addSeparator(); - } - menuFileReopen->addAction(QString("%1. %2").arg(reopenIndex+1).arg(m_reopenList[reopenIndex])); - } + for (ReopenList::size_type reopenIndex = 0; reopenIndex < m_reopenList.size(); ++reopenIndex) + { + if (reopenIndex == 4) + menuFileReopen->addSeparator(); - menuFileReopen->setEnabled(!menuFileReopen->isEmpty()); + menuFileReopen->addAction(QString("%1. %2").arg(reopenIndex+1).arg(m_reopenList[reopenIndex])); + } - saveMenuFileReopen(); + menuFileReopen->setEnabled(!menuFileReopen->isEmpty()); + + saveMenuFileReopen(); } void MainWindow::loadMenuFileReopen() { - m_reopenList.clear(); + m_reopenList.clear(); + + QSettings settings; + settings.beginGroup("reopen"); - QSettings settings; - settings.beginGroup("reopen"); + QStringList groupList = settings.childKeys(); + std::vector indexList; + for (const QString& index: groupList) + indexList.push_back(index.toInt()); - QStringList groupList = settings.childKeys(); - std::vector indexList; - for (const QString& index: groupList) - { - indexList.push_back(index.toInt()); - } - std::sort(indexList.begin(), indexList.end()); + std::sort(indexList.begin(), indexList.end()); - for (int index: indexList) - { - QString value = settings.value(QString::number(index), QString()).toString(); - if (!value.isEmpty()) - { - m_reopenList.push_back(value); - } - } + for (int index: indexList) + { + QString value = settings.value(QString::number(index), QString()).toString(); + if (!value.isEmpty()) + m_reopenList.push_back(value); + } - settings.endGroup(); + settings.endGroup(); } void MainWindow::saveMenuFileReopen() const { - QSettings settings; - settings.beginGroup("reopen"); + QSettings settings; + settings.beginGroup("reopen"); - std::size_t index = 1; - for (const QString& fileName: m_reopenList) - { - settings.setValue(QString::number(index++), fileName); - } + std::size_t index = 1; + for (const QString& fileName: m_reopenList) + settings.setValue(QString::number(index++), fileName); - settings.endGroup(); + settings.endGroup(); } void MainWindow::updateInsertMenu(bool enabled) { - QList menuList = menuInsert->actions(); - for (const QAction* pMenu: menuList) - { - if (pMenu->isSeparator()) - continue; + QList menuList = menuInsert->actions(); + for (const QAction* pMenu: menuList) + { + if (pMenu->isSeparator()) + continue; - QList itemList = pMenu->menu()->actions(); - for (QAction* pItem: itemList) - { - pItem->setEnabled(enabled); - } - } + QList itemList = pMenu->menu()->actions(); + for (QAction* pItem: itemList) + pItem->setEnabled(enabled); + } } void MainWindow::onUpdateCascadeTitle(bool activated) { - ActionActivator::updateAction( - actWindowCascade, - activated && mdiArea->viewMode() == QMdiArea::SubWindowView, - mdiArea, &QMdiArea::cascadeSubWindows - ); - ActionActivator::updateAction( - actWindowTitle, - activated && mdiArea->viewMode() == QMdiArea::SubWindowView, - mdiArea, &QMdiArea::tileSubWindows - ); + ActionActivator::updateAction( + actWindowCascade, + activated && mdiArea->viewMode() == QMdiArea::SubWindowView, + mdiArea, &QMdiArea::cascadeSubWindows + ); + ActionActivator::updateAction( + actWindowTitle, + activated && mdiArea->viewMode() == QMdiArea::SubWindowView, + mdiArea, &QMdiArea::tileSubWindows + ); } void MainWindow::onUpdateTabMode(bool activated) { - ActionActivator::updateAction( - actWindowTabbedViewMode, - activated, - boost::function(boost::bind(&MainWindow::onSetTabbedViewMode, this, _1)) - ); - actWindowTabbedViewMode->setCheckable(activated); + ActionActivator::updateAction( + actWindowTabbedViewMode, + activated, + boost::function(boost::bind(&MainWindow::onSetTabbedViewMode, this, _1)) + ); + actWindowTabbedViewMode->setCheckable(activated); } void MainWindow::onSetTabbedViewMode(bool checked) { - mdiArea->setViewMode(checked ? QMdiArea::TabbedView : QMdiArea::SubWindowView); - onUpdateCascadeTitle(!checked); - forAllSubWindows(boost::bind(&QWidget::showMaximized, _1), mdiArea->currentSubWindow()); + mdiArea->setViewMode(checked ? QMdiArea::TabbedView : QMdiArea::SubWindowView); + onUpdateCascadeTitle(!checked); + forAllSubWindows(boost::bind(&QWidget::showMaximized, _1), mdiArea->currentSubWindow()); } void MainWindow::onSubWindowActivated(QMdiSubWindow* window) { - m_subWindowToAction->onSubWindowActivated(window); - bool hasWindows = !mdiArea->subWindowList().isEmpty(); - onUpdateCascadeTitle(hasWindows); - onUpdateTabMode(hasWindows); - updateWindowTitle(); + m_subWindowToAction->onSubWindowActivated(window); + bool hasWindows = !mdiArea->subWindowList().isEmpty(); + onUpdateCascadeTitle(hasWindows); + onUpdateTabMode(hasWindows); + updateWindowTitle(); } void MainWindow::onSubWindowStateChanged(Qt::WindowStates oldState, Qt::WindowStates newState) { - if (mdiArea->viewMode() != QMdiArea::SubWindowView) - return; + if (mdiArea->viewMode() != QMdiArea::SubWindowView) + return; - if ((newState & Qt::WindowMaximized) && !(oldState & Qt::WindowMaximized)) - { - forAllSubWindows(boost::bind(&QWidget::showMaximized, _1), dynamic_cast(sender())); - } - else if ((newState & ~Qt::WindowActive) == Qt::WindowNoState && (oldState & ~Qt::WindowActive) != Qt::WindowNoState) - { - forAllSubWindows(boost::bind(&QWidget::showNormal, _1), dynamic_cast(sender())); - } + if ((newState & Qt::WindowMaximized) && !(oldState & Qt::WindowMaximized)) + { + forAllSubWindows(boost::bind(&QWidget::showMaximized, _1), dynamic_cast(sender())); + } + else if ((newState & ~Qt::WindowActive) == Qt::WindowNoState && (oldState & ~Qt::WindowActive) != Qt::WindowNoState) + { + forAllSubWindows(boost::bind(&QWidget::showNormal, _1), dynamic_cast(sender())); + } } template void MainWindow::forAllSubWindows(F functor, QMdiSubWindow* pTopSubWindow) { - static bool firstCall = true; - if (firstCall) - { - firstCall = false; - QList windowList = mdiArea->subWindowList(); - for (QMdiSubWindow* pSubWindow: windowList) - { - if (pSubWindow != pTopSubWindow) - { - functor(pSubWindow); - } - } - if (pTopSubWindow) - { - functor(pTopSubWindow); - pTopSubWindow->raise(); - pTopSubWindow->setFocus(); - } - firstCall = true; - } + static bool firstCall = true; + if (firstCall) + { + firstCall = false; + QList windowList = mdiArea->subWindowList(); + for (QMdiSubWindow* pSubWindow: windowList) + { + if (pSubWindow != pTopSubWindow) + functor(pSubWindow); + } + if (pTopSubWindow) + { + functor(pTopSubWindow); + pTopSubWindow->raise(); + pTopSubWindow->setFocus(); + } + firstCall = true; + } } void MainWindow::updateWindowTitle() { - QString appName("RAO Studio"); - QString normalTitle = g_pModel->hasModel() - ? QString("%1 - %2").arg(appName).arg(g_pModel->getName()) - : appName; + QString appName("RAO Studio"); + QString normalTitle = g_pModel->hasModel() + ? QString("%1 - %2").arg(appName).arg(g_pModel->getName()) + : appName; - if (windowTitle() != normalTitle) - { - setWindowTitle(normalTitle); - } + if (windowTitle() != normalTitle) + setWindowTitle(normalTitle); } bool MainWindow::eventFilter(QObject* target, QEvent* event) { - if (event->type() == QEvent::WindowTitleChange) - { - if (dynamic_cast(target)) - { - m_subWindowToAction->onTitleChanged(static_cast(target)); - } - else - { - updateWindowTitle(); - } - } + if (event->type() == QEvent::WindowTitleChange) + { + if (dynamic_cast(target)) + m_subWindowToAction->onTitleChanged(static_cast(target)); + else + updateWindowTitle(); + } - return parent_type::eventFilter(target, event); + return parent_type::eventFilter(target, event); } rdo::gui::model::Model* MainWindow::getModel() { - return m_pModel; + return m_pModel; } diff --git a/app/rdo_studio/src/main_window.h b/app/rdo_studio/src/main_window.h index 2fe8fdfa8..a4ff6cd18 100644 --- a/app/rdo_studio/src/main_window.h +++ b/app/rdo_studio/src/main_window.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_MAIN_WINDOW_H_ -#define _RDO_STUDIO_MAIN_WINDOW_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -17,140 +16,138 @@ // -------------------------------------------------------------------------------- namespace rdo { - namespace gui { - namespace model { - class Model; - }; - }; + namespace gui { + namespace model { + class Model; + }; + }; }; class MainWindow - : public QMainWindow - , public MainWindowBase - , public Ui::MainWindow + : public QMainWindow + , public MainWindowBase + , public Ui::MainWindow { Q_OBJECT public: - MainWindow(); - virtual ~MainWindow(); + MainWindow(); + virtual ~MainWindow(); - void init(); + void init(); - virtual void updateAllStyles(); + virtual void updateAllStyles(); - virtual void setVisible(bool visible); + virtual void setVisible(bool visible); - const LPStatusBar& statusBar() const; + const LPStatusBar& statusBar() const; - void update_start(); - void update_stop (); + void update_start(); + void update_stop (); - virtual void addSubWindow (QWidget* pWidget); - virtual void activateSubWindow(QWidget* pWidget); + virtual void addSubWindow (QWidget* pWidget); + virtual void activateSubWindow(QWidget* pWidget); - QSlider* m_pModelSpeedSlider; + QSlider* m_pModelSpeedSlider; - void insertMenuFileReopenItem(const QString& item); + void insertMenuFileReopenItem(const QString& item); - template - void updateInsertMenu(bool enabled, const typename QtPrivate::FunctionPointer::Object* pObject, SlotFun pSlot) - { - updateInsertMenu(enabled); - void (QSignalMapper::*pSignal)(QObject*) = &QSignalMapper::mapped; - if (enabled) - { - ASSERT(pObject); - QObject::connect(m_pInsertMenuSignalMapper, pSignal, pObject, pSlot, Qt::UniqueConnection); - } - else - { - QObject::disconnect(m_pInsertMenuSignalMapper, pSignal, NULL, NULL); - } - } + template + void updateInsertMenu(bool enabled, const typename QtPrivate::FunctionPointer::Object* pObject, SlotFun pSlot) + { + updateInsertMenu(enabled); + void (QSignalMapper::*pSignal)(QObject*) = &QSignalMapper::mapped; + if (enabled) + { + ASSERT(pObject); + QObject::connect(m_pInsertMenuSignalMapper, pSignal, pObject, pSlot, Qt::UniqueConnection); + } + else + { + QObject::disconnect(m_pInsertMenuSignalMapper, pSignal, NULL, NULL); + } + } - rdo::gui::model::Model* getModel(); + rdo::gui::model::Model* getModel(); - class InsertMenuData: public QObject - { - public: - typedef boost::optional Position; + class InsertMenuData: public QObject + { + public: + typedef boost::optional Position; - InsertMenuData(QObject* pParent, const QString& text, const Position& position = Position()); + InsertMenuData(QObject* pParent, const QString& text, const Position& position = Position()); - const QString& text () const; - const Position& position() const; + const QString& text () const; + const Position& position() const; - private: - QString m_text; - Position m_position; - }; + private: + QString m_text; + Position m_position; + }; private: - typedef QMainWindow parent_type; - typedef QStringList ReopenList; - rdo::gui::model::Model* m_pModel; - - struct SubWindowToAction - { - typedef std::map Map; - - SubWindowToAction(MainWindow* pMainWindow); - - void onSubWindowActivated(QMdiSubWindow* pSubWindow); - void onTitleChanged (QMdiSubWindow* pSubWindow); - - private: - MainWindow* m_pMainWindow; - Map m_map; - QAction* m_pSeparator; - QActionGroup* m_pActionGroup; - - Map::const_iterator addNewSubWindow(QMdiSubWindow* pSubWindow); - void updateList(); - void addFirstSubWindow(); - void removeLastSubWindow(); - }; - - std::auto_ptr m_subWindowToAction; - int m_updateTimerID; - LPStatusBar m_pStatusBar; - ReopenList m_reopenList; - QSignalMapper* m_pInsertMenuSignalMapper; - - void createStatusBar (); - void createToolBar (); - void createInsertMenu(); - - void updateMenuFileReopen(); - void loadMenuFileReopen (); - void saveMenuFileReopen () const; - - virtual void closeEvent (QCloseEvent* event); - virtual void showEvent (QShowEvent* event); - virtual void hideEvent (QHideEvent* event); - virtual void timerEvent (QTimerEvent* event); - virtual bool eventFilter(QObject* target, QEvent* event); - - void onViewOptions (); - void onHelpWhatsNew(); - void onHelpAbout (); - - void onDockVisibleChanged(bool visible); - void onToolBarModelOrientationChanged(Qt::Orientation orientation); - - void onMenuFileReopen(QAction* pAction); - void updateInsertMenu(bool enabled); - - void onUpdateCascadeTitle (bool activated); - void onUpdateTabMode (bool activated); - void onSetTabbedViewMode (bool checked); - void onSubWindowActivated (QMdiSubWindow* window); - void onSubWindowStateChanged(Qt::WindowStates oldState, Qt::WindowStates newState); - template - void forAllSubWindows(F functor, QMdiSubWindow* pTopSubWindow); - - void updateWindowTitle(); + typedef QMainWindow parent_type; + typedef QStringList ReopenList; + rdo::gui::model::Model* m_pModel; + + struct SubWindowToAction + { + typedef std::map Map; + + SubWindowToAction(MainWindow* pMainWindow); + + void onSubWindowActivated(QMdiSubWindow* pSubWindow); + void onTitleChanged (QMdiSubWindow* pSubWindow); + + private: + MainWindow* m_pMainWindow; + Map m_map; + QAction* m_pSeparator; + QActionGroup* m_pActionGroup; + + Map::const_iterator addNewSubWindow(QMdiSubWindow* pSubWindow); + void updateList(); + void addFirstSubWindow(); + void removeLastSubWindow(); + }; + + std::auto_ptr m_subWindowToAction; + int m_updateTimerID; + LPStatusBar m_pStatusBar; + ReopenList m_reopenList; + QSignalMapper* m_pInsertMenuSignalMapper; + + void createStatusBar (); + void createToolBar (); + void createInsertMenu(); + + void updateMenuFileReopen(); + void loadMenuFileReopen (); + void saveMenuFileReopen () const; + + virtual void closeEvent (QCloseEvent* event); + virtual void showEvent (QShowEvent* event); + virtual void hideEvent (QHideEvent* event); + virtual void timerEvent (QTimerEvent* event); + virtual bool eventFilter(QObject* target, QEvent* event); + + void onViewOptions (); + void onHelpWhatsNew(); + void onHelpAbout (); + + void onDockVisibleChanged(bool visible); + void onToolBarModelOrientationChanged(Qt::Orientation orientation); + + void onMenuFileReopen(QAction* pAction); + void updateInsertMenu(bool enabled); + + void onUpdateCascadeTitle (bool activated); + void onUpdateTabMode (bool activated); + void onSetTabbedViewMode (bool checked); + void onSubWindowActivated (QMdiSubWindow* window); + void onSubWindowStateChanged(Qt::WindowStates oldState, Qt::WindowStates newState); + template + void forAllSubWindows(F functor, QMdiSubWindow* pTopSubWindow); + + void updateWindowTitle(); }; - -#endif // _RDO_STUDIO_MAIN_WINDOW_H_ diff --git a/app/rdo_studio/src/main_window_base.h b/app/rdo_studio/src/main_window_base.h index dd8a7d90f..e584bca2d 100644 --- a/app/rdo_studio/src/main_window_base.h +++ b/app/rdo_studio/src/main_window_base.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_MAIN_WINDOW_BASE_H_ -#define _RDO_STUDIO_MAIN_WINDOW_BASE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -24,41 +23,39 @@ class MainWindowBase { public: - rdo::gui::editor::ModelStyle style_editor; - rdo::gui::editor::BuildStyle style_build; - rdo::gui::editor::EditStyle style_debug; - rdo::gui::tracer::LogStyle style_trace; - rdo::gui::editor::ResultsStyle style_results; - rdo::gui::editor::FindStyle style_find; - rdo::gui::frame::FrameStyle style_frame; - rdo::gui::tracer::ChartViewStyle style_chart; + rdo::gui::editor::ModelStyle style_editor; + rdo::gui::editor::BuildStyle style_build; + rdo::gui::editor::EditStyle style_debug; + rdo::gui::tracer::LogStyle style_trace; + rdo::gui::editor::ResultsStyle style_results; + rdo::gui::editor::FindStyle style_find; + rdo::gui::frame::FrameStyle style_frame; + rdo::gui::tracer::ChartViewStyle style_chart; - bool isMDIMaximazed() const { return true; } + bool isMDIMaximazed() const { return true; } - DockBuild& getDockBuild () { ASSERT(m_pDockBuild ); return *m_pDockBuild; } - DockDebug& getDockDebug () { ASSERT(m_pDockDebug ); return *m_pDockDebug; } - DockTrace& getDockTrace () { ASSERT(m_pDockTrace ); return *m_pDockTrace; } - DockResults& getDockResults () { ASSERT(m_pDockResults ); return *m_pDockResults; } - DockFind& getDockFind () { ASSERT(m_pDockFind ); return *m_pDockFind; } - DockChartTree& getDockChartTree() { ASSERT(m_pDockChartTree); return *m_pDockChartTree; } - DockFrame& getDockFrame () { ASSERT(m_pDockFrame ); return *m_pDockFrame; } + DockBuild& getDockBuild () { ASSERT(m_pDockBuild ); return *m_pDockBuild; } + DockDebug& getDockDebug () { ASSERT(m_pDockDebug ); return *m_pDockDebug; } + DockTrace& getDockTrace () { ASSERT(m_pDockTrace ); return *m_pDockTrace; } + DockResults& getDockResults () { ASSERT(m_pDockResults ); return *m_pDockResults; } + DockFind& getDockFind () { ASSERT(m_pDockFind ); return *m_pDockFind; } + DockChartTree& getDockChartTree() { ASSERT(m_pDockChartTree); return *m_pDockChartTree; } + DockFrame& getDockFrame () { ASSERT(m_pDockFrame ); return *m_pDockFrame; } - virtual void updateAllStyles() = 0; + virtual void updateAllStyles() = 0; - virtual void update_start() = 0; - virtual void update_stop () = 0; + virtual void update_start() = 0; + virtual void update_stop () = 0; - virtual void addSubWindow (QWidget* pWidget) = 0; - virtual void activateSubWindow(QWidget* pWidget) = 0; + virtual void addSubWindow (QWidget* pWidget) = 0; + virtual void activateSubWindow(QWidget* pWidget) = 0; protected: - DockBuild* m_pDockBuild; - DockDebug* m_pDockDebug; - DockTrace* m_pDockTrace; - DockResults* m_pDockResults; - DockFind* m_pDockFind; - DockChartTree* m_pDockChartTree; - DockFrame* m_pDockFrame; + DockBuild* m_pDockBuild; + DockDebug* m_pDockDebug; + DockTrace* m_pDockTrace; + DockResults* m_pDockResults; + DockFind* m_pDockFind; + DockChartTree* m_pDockChartTree; + DockFrame* m_pDockFrame; }; - -#endif // _RDO_STUDIO_MAIN_WINDOW_BASE_H_ diff --git a/app/rdo_studio/src/model/model.cpp b/app/rdo_studio/src/model/model.cpp index 6731bb701..31ec8c5a5 100644 --- a/app/rdo_studio/src/model/model.cpp +++ b/app/rdo_studio/src/model/model.cpp @@ -17,7 +17,6 @@ #include "simulator/runtime/rdo_exception.h" #include "app/rdo_studio/src/model/model.h" #include "app/rdo_studio/src/model/model_view.h" -#include "app/rdo_studio/src/thread.h" #include "app/rdo_studio/src/main_window.h" #include "app/rdo_studio/src/frame/frame_view.h" #include "app/rdo_studio/src/dialog/new_model_dialog.h" @@ -39,17 +38,17 @@ Model::ModelTemplateItem::ModelTemplateItem() {} Model::ModelTemplateItem::ModelTemplateItem(const ModelTemplateItem& copy) - : resName (copy.resName ) - , position(copy.position) + : resName (copy.resName ) + , position(copy.position) {} Model::ModelTemplateItem::ModelTemplateItem(const QString& resName) - : resName(resName) + : resName(resName) {} Model::ModelTemplateItem::ModelTemplateItem(const QString& resName, std::size_t position) - : resName (resName ) - , position(position) + : resName (resName ) + , position(position) {} // -------------------------------------------------------------------------------- @@ -58,1421 +57,1421 @@ Model::ModelTemplateItem::ModelTemplateItem(const QString& resName, std::size_t Model* g_pModel = NULL; Model::Model() - : RDOThreadGUI("RDOThreadModelGUI", static_cast(g_pApp->m_pStudioGUI)) - , m_frameManager (boost::bind(&Model::onChangeFrame, this, _1)) - , m_GUI_HAS_MODEL (false ) - , m_GUI_CAN_RUN (true ) - , m_GUI_IS_RUNNING (false ) - , m_buildState (BS_UNDEFINED ) - , m_openError (false ) - , m_smrEmptyError (false ) - , m_modelClosed (true ) - , m_frmDescribed (false ) - , m_timeNow (0 ) - , m_speed (1 ) - , m_showRate (60 ) - , m_runtimeMode (rdo::runtime::RTM_MaxSpeed) - , m_exitCode (rdo::simulation::report::EC_ModelNotFound) - , m_modify (false ) - , m_pView (NULL ) - , m_name ("") -{ - g_pModel = this; - - Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); - - connect(pMainWindow->actFileNew, SIGNAL(triggered(bool)), this, SLOT(onFileNew ())); - connect(pMainWindow->actFileOpen, SIGNAL(triggered(bool)), this, SLOT(onFileOpen ())); - connect(pMainWindow->actFileClose, SIGNAL(triggered(bool)), this, SLOT(onFileClose ())); - connect(pMainWindow->actFileSaveAll, SIGNAL(triggered(bool)), this, SLOT(onFileSaveAll())); - - connect(pMainWindow->actModelBuild, SIGNAL(triggered(bool)), this, SLOT(onModelBuild())); - connect(pMainWindow->actModelRun, SIGNAL(triggered(bool)), this, SLOT(onModelRun ())); - connect(pMainWindow->actModelStop, SIGNAL(triggered(bool)), this, SLOT(onModelStop ())); - - connect(pMainWindow->actModelRuntimeMaxSpeed, SIGNAL(triggered(bool)), this, SLOT(onModelRuntimeMaxSpeed())); - connect(pMainWindow->actModelRuntimeJump, SIGNAL(triggered(bool)), this, SLOT(onModelRuntimeJump())); - connect(pMainWindow->actModelRuntimeSync, SIGNAL(triggered(bool)), this, SLOT(onModelRuntimeSync())); - connect(pMainWindow->actModelRuntimePause, SIGNAL(triggered(bool)), this, SLOT(onModelRuntimePause())); - - connect(pMainWindow->actModelShowRateInc, SIGNAL(triggered(bool)), this, SLOT(onModelShowRateInc())); - connect(pMainWindow->actModelShowRateIncFour, SIGNAL(triggered(bool)), this, SLOT(onModelShowRateIncFour())); - connect(pMainWindow->actModelShowRateDecFour, SIGNAL(triggered(bool)), this, SLOT(onModelShowRateDecFour())); - connect(pMainWindow->actModelShowRateDec, SIGNAL(triggered(bool)), this, SLOT(onModelShowRateDec())); - - connect(g_pApp->getMainWndUI()->m_pModelSpeedSlider, SIGNAL(valueChanged(int)), this, SLOT(onModelSpeedValueChanged(int))); - - QActionGroup* runtimeGroup = new QActionGroup(this); - runtimeGroup->addAction(pMainWindow->actModelRuntimeMaxSpeed); - runtimeGroup->addAction(pMainWindow->actModelRuntimeJump); - runtimeGroup->addAction(pMainWindow->actModelRuntimeSync); - runtimeGroup->addAction(pMainWindow->actModelRuntimePause); - - connect(pMainWindow->actModelFrameNext, SIGNAL(triggered(bool)), this, SLOT(onShowNextFrame())); - connect(pMainWindow->actModelFramePrev, SIGNAL(triggered(bool)), this, SLOT(onShowPrevFrame())); - - setHasModel (m_GUI_HAS_MODEL ); - setCanRun (m_GUI_CAN_RUN ); - setIsRunning(m_GUI_IS_RUNNING); - - ModelTemplate modelTemplate; - modelTemplate[rdo::model::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_0/template_0.smr"); - m_modelTemplates[0] = modelTemplate; - - modelTemplate.clear(); - modelTemplate[rdo::model::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_1/template_1.smr"); - m_modelTemplates[1] = modelTemplate; - - modelTemplate.clear(); - modelTemplate[rdo::model::RTP] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.rtp", 15); - modelTemplate[rdo::model::RSS] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.rss", 12); - modelTemplate[rdo::model::EVN] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.evn", 9); - modelTemplate[rdo::model::PAT] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.pat", 9); - modelTemplate[rdo::model::DPT] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.dpt", 16); - modelTemplate[rdo::model::PRC] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.prc", 10); - modelTemplate[rdo::model::FRM] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.frm", 7); - modelTemplate[rdo::model::FUN] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.fun", 10); - modelTemplate[rdo::model::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.smr"); - modelTemplate[rdo::model::PMD] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.pmd", 10); - m_modelTemplates[2] = modelTemplate; - - modelTemplate.clear(); - modelTemplate[rdo::model::RTP] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.rtp", 98); - modelTemplate[rdo::model::RSS] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.rss", 58); - modelTemplate[rdo::model::EVN] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.evn", 67); - modelTemplate[rdo::model::PAT] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.pat", 89); - modelTemplate[rdo::model::DPT] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.dpt", 132); - modelTemplate[rdo::model::PRC] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.prc", 75); - modelTemplate[rdo::model::FRM] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.frm", 84); - modelTemplate[rdo::model::FUN] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.fun", 44); - modelTemplate[rdo::model::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.smr"); - modelTemplate[rdo::model::PMD] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.pmd", 43); - m_modelTemplates[3] = modelTemplate; - - modelTemplate.clear(); - modelTemplate[rdo::model::RTP] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.rtp"); - modelTemplate[rdo::model::RSS] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.rss"); - modelTemplate[rdo::model::EVN] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.evn"); - modelTemplate[rdo::model::PAT] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.pat"); - modelTemplate[rdo::model::DPT] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.dpt"); - modelTemplate[rdo::model::FUN] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.fun"); - modelTemplate[rdo::model::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.smr"); - modelTemplate[rdo::model::PMD] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.pmd"); - m_modelTemplates[4] = modelTemplate; - - modelTemplate.clear(); - modelTemplate[rdo::model::RTP] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.rtp"); - modelTemplate[rdo::model::RSS] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.rss"); - modelTemplate[rdo::model::EVN] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.evn"); - modelTemplate[rdo::model::PAT] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.pat"); - modelTemplate[rdo::model::DPT] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.dpt"); - modelTemplate[rdo::model::FUN] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.fun"); - modelTemplate[rdo::model::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.smr"); - modelTemplate[rdo::model::PMD] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.pmd"); - m_modelTemplates[5] = modelTemplate; - - modelTemplate.clear(); - modelTemplate[rdo::model::RTP] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.rtp"); - modelTemplate[rdo::model::RSS] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.rss"); - modelTemplate[rdo::model::EVN] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.evn"); - modelTemplate[rdo::model::PAT] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.pat"); - modelTemplate[rdo::model::DPT] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.dpt"); - modelTemplate[rdo::model::FUN] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.fun"); - modelTemplate[rdo::model::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.smr"); - modelTemplate[rdo::model::PMD] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.pmd"); - m_modelTemplates[6] = modelTemplate; - - modelTemplate.clear(); - modelTemplate[rdo::model::RTP] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.rtp"); - modelTemplate[rdo::model::RSS] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.rss"); - modelTemplate[rdo::model::EVN] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.evn"); - modelTemplate[rdo::model::PAT] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.pat"); - modelTemplate[rdo::model::DPT] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.dpt"); - modelTemplate[rdo::model::FUN] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.fun"); - modelTemplate[rdo::model::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.smr"); - modelTemplate[rdo::model::PMD] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.pmd"); - m_modelTemplates[7] = modelTemplate; - - notifies.push_back(RT_STUDIO_MODEL_GET_TEXT ); - notifies.push_back(RT_REPOSITORY_MODEL_NEW ); - notifies.push_back(RT_REPOSITORY_MODEL_OPEN ); - notifies.push_back(RT_REPOSITORY_MODEL_OPEN_GET_NAME ); - notifies.push_back(RT_REPOSITORY_MODEL_OPEN_ERROR ); - notifies.push_back(RT_REPOSITORY_MODEL_CLOSE ); - notifies.push_back(RT_REPOSITORY_MODEL_SAVE ); - notifies.push_back(RT_SIMULATOR_PARSE_STRING ); - notifies.push_back(RT_SIMULATOR_PARSE_OK ); - notifies.push_back(RT_SIMULATOR_PARSE_ERROR ); - notifies.push_back(RT_SIMULATOR_PARSE_ERROR_SMR_EMPTY ); - notifies.push_back(RT_SIMULATOR_MODEL_STOP_OK ); - notifies.push_back(RT_SIMULATOR_MODEL_STOP_BY_USER ); - notifies.push_back(RT_SIMULATOR_MODEL_STOP_RUNTIME_ERROR); - notifies.push_back(RT_RUNTIME_MODEL_START_BEFORE ); - notifies.push_back(RT_RUNTIME_MODEL_START_AFTER ); - notifies.push_back(RT_RUNTIME_MODEL_STOP_BEFORE ); - notifies.push_back(RT_DEBUG_STRING ); - notifies.push_back(RT_RESULT_STRING ); - - after_constructor(); + : RDOThreadGUI("RDOThreadModelGUI", static_cast(g_pApp->m_pStudioGUI)) + , m_frameManager (boost::bind(&Model::onChangeFrame, this, _1)) + , m_GUI_HAS_MODEL (false ) + , m_GUI_CAN_RUN (true ) + , m_GUI_IS_RUNNING (false ) + , m_buildState (BuildState::UNDEFINED) + , m_openError (false ) + , m_smrEmptyError (false ) + , m_modelClosed (true ) + , m_frmDescribed (false ) + , m_timeNow (0 ) + , m_speed (1 ) + , m_showRate (60 ) + , m_runtimeMode (rdo::runtime::RunTimeMode::MAX_SPEED) + , m_exitCode (rdo::simulation::report::ExitCode::MODEL_NOTFOUND) + , m_modify (false ) + , m_pView (NULL ) + , m_name ("") +{ + g_pModel = this; + + Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); + + connect(pMainWindow->actFileNew, SIGNAL(triggered(bool)), this, SLOT(onFileNew ())); + connect(pMainWindow->actFileOpen, SIGNAL(triggered(bool)), this, SLOT(onFileOpen ())); + connect(pMainWindow->actFileClose, SIGNAL(triggered(bool)), this, SLOT(onFileClose ())); + connect(pMainWindow->actFileSaveAll, SIGNAL(triggered(bool)), this, SLOT(onFileSaveAll())); + + connect(pMainWindow->actModelBuild, SIGNAL(triggered(bool)), this, SLOT(onModelBuild())); + connect(pMainWindow->actModelRun, SIGNAL(triggered(bool)), this, SLOT(onModelRun ())); + connect(pMainWindow->actModelStop, SIGNAL(triggered(bool)), this, SLOT(onModelStop ())); + + connect(pMainWindow->actModelRuntimeMaxSpeed, SIGNAL(triggered(bool)), this, SLOT(onModelRuntimeMaxSpeed())); + connect(pMainWindow->actModelRuntimeJump, SIGNAL(triggered(bool)), this, SLOT(onModelRuntimeJump())); + connect(pMainWindow->actModelRuntimeSync, SIGNAL(triggered(bool)), this, SLOT(onModelRuntimeSync())); + connect(pMainWindow->actModelRuntimePause, SIGNAL(triggered(bool)), this, SLOT(onModelRuntimePause())); + + connect(pMainWindow->actModelShowRateInc, SIGNAL(triggered(bool)), this, SLOT(onModelShowRateInc())); + connect(pMainWindow->actModelShowRateIncFour, SIGNAL(triggered(bool)), this, SLOT(onModelShowRateIncFour())); + connect(pMainWindow->actModelShowRateDecFour, SIGNAL(triggered(bool)), this, SLOT(onModelShowRateDecFour())); + connect(pMainWindow->actModelShowRateDec, SIGNAL(triggered(bool)), this, SLOT(onModelShowRateDec())); + + connect(g_pApp->getMainWndUI()->m_pModelSpeedSlider, SIGNAL(valueChanged(int)), this, SLOT(onModelSpeedValueChanged(int))); + + QActionGroup* runtimeGroup = new QActionGroup(this); + runtimeGroup->addAction(pMainWindow->actModelRuntimeMaxSpeed); + runtimeGroup->addAction(pMainWindow->actModelRuntimeJump); + runtimeGroup->addAction(pMainWindow->actModelRuntimeSync); + runtimeGroup->addAction(pMainWindow->actModelRuntimePause); + + connect(pMainWindow->actModelFrameNext, SIGNAL(triggered(bool)), this, SLOT(onShowNextFrame())); + connect(pMainWindow->actModelFramePrev, SIGNAL(triggered(bool)), this, SLOT(onShowPrevFrame())); + + setHasModel (m_GUI_HAS_MODEL ); + setCanRun (m_GUI_CAN_RUN ); + setIsRunning(m_GUI_IS_RUNNING); + + ModelTemplate modelTemplate; + modelTemplate[rdo::FileType::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_0/template_0.smr"); + m_modelTemplates[0] = modelTemplate; + + modelTemplate.clear(); + modelTemplate[rdo::FileType::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_1/template_1.smr"); + m_modelTemplates[1] = modelTemplate; + + modelTemplate.clear(); + modelTemplate[rdo::FileType::RTP] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.rtp", 15); + modelTemplate[rdo::FileType::RSS] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.rss", 12); + modelTemplate[rdo::FileType::EVN] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.evn", 9); + modelTemplate[rdo::FileType::PAT] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.pat", 9); + modelTemplate[rdo::FileType::DPT] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.dpt", 16); + modelTemplate[rdo::FileType::PRC] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.prc", 10); + modelTemplate[rdo::FileType::FRM] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.frm", 7); + modelTemplate[rdo::FileType::FUN] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.fun", 10); + modelTemplate[rdo::FileType::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.smr"); + modelTemplate[rdo::FileType::PMD] = ModelTemplateItem(":/new_model_template/new_model_template/template_2/template_2.pmd", 10); + m_modelTemplates[2] = modelTemplate; + + modelTemplate.clear(); + modelTemplate[rdo::FileType::RTP] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.rtp", 168); + modelTemplate[rdo::FileType::RSS] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.rss", 95); + modelTemplate[rdo::FileType::EVN] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.evn", 108); + modelTemplate[rdo::FileType::PAT] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.pat", 150); + modelTemplate[rdo::FileType::DPT] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.dpt", 230); + modelTemplate[rdo::FileType::PRC] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.prc", 128); + modelTemplate[rdo::FileType::FRM] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.frm", 148); + modelTemplate[rdo::FileType::FUN] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.fun", 71); + modelTemplate[rdo::FileType::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.smr"); + modelTemplate[rdo::FileType::PMD] = ModelTemplateItem(":/new_model_template/new_model_template/template_3/template_3.pmd", 69); + m_modelTemplates[3] = modelTemplate; + + modelTemplate.clear(); + modelTemplate[rdo::FileType::RTP] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.rtp"); + modelTemplate[rdo::FileType::RSS] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.rss"); + modelTemplate[rdo::FileType::EVN] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.evn"); + modelTemplate[rdo::FileType::PAT] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.pat"); + modelTemplate[rdo::FileType::DPT] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.dpt"); + modelTemplate[rdo::FileType::FUN] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.fun"); + modelTemplate[rdo::FileType::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.smr"); + modelTemplate[rdo::FileType::PMD] = ModelTemplateItem(":/new_model_template/new_model_template/template_4/template_4.pmd"); + m_modelTemplates[4] = modelTemplate; + + modelTemplate.clear(); + modelTemplate[rdo::FileType::RTP] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.rtp"); + modelTemplate[rdo::FileType::RSS] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.rss"); + modelTemplate[rdo::FileType::EVN] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.evn"); + modelTemplate[rdo::FileType::PAT] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.pat"); + modelTemplate[rdo::FileType::DPT] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.dpt"); + modelTemplate[rdo::FileType::FUN] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.fun"); + modelTemplate[rdo::FileType::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.smr"); + modelTemplate[rdo::FileType::PMD] = ModelTemplateItem(":/new_model_template/new_model_template/template_5/template_5.pmd"); + m_modelTemplates[5] = modelTemplate; + + modelTemplate.clear(); + modelTemplate[rdo::FileType::RTP] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.rtp"); + modelTemplate[rdo::FileType::RSS] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.rss"); + modelTemplate[rdo::FileType::EVN] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.evn"); + modelTemplate[rdo::FileType::PAT] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.pat"); + modelTemplate[rdo::FileType::DPT] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.dpt"); + modelTemplate[rdo::FileType::FUN] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.fun"); + modelTemplate[rdo::FileType::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.smr"); + modelTemplate[rdo::FileType::PMD] = ModelTemplateItem(":/new_model_template/new_model_template/template_6/template_6.pmd"); + m_modelTemplates[6] = modelTemplate; + + modelTemplate.clear(); + modelTemplate[rdo::FileType::RTP] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.rtp"); + modelTemplate[rdo::FileType::RSS] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.rss"); + modelTemplate[rdo::FileType::EVN] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.evn"); + modelTemplate[rdo::FileType::PAT] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.pat"); + modelTemplate[rdo::FileType::DPT] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.dpt"); + modelTemplate[rdo::FileType::FUN] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.fun"); + modelTemplate[rdo::FileType::SMR] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.smr"); + modelTemplate[rdo::FileType::PMD] = ModelTemplateItem(":/new_model_template/new_model_template/template_7/template_7.pmd"); + m_modelTemplates[7] = modelTemplate; + + notifies.push_back(Message::STUDIO_MODEL_GET_TEXT ); + notifies.push_back(Message::REPOSITORY_MODEL_NEW ); + notifies.push_back(Message::REPOSITORY_MODEL_OPEN ); + notifies.push_back(Message::REPOSITORY_MODEL_OPEN_GET_NAME ); + notifies.push_back(Message::REPOSITORY_MODEL_OPEN_ERROR ); + notifies.push_back(Message::REPOSITORY_MODEL_CLOSE ); + notifies.push_back(Message::REPOSITORY_MODEL_SAVE ); + notifies.push_back(Message::SIMULATOR_PARSE_STRING ); + notifies.push_back(Message::SIMULATOR_PARSE_OK ); + notifies.push_back(Message::SIMULATOR_PARSE_ERROR ); + notifies.push_back(Message::SIMULATOR_PARSE_ERROR_SMR_EMPTY ); + notifies.push_back(Message::SIMULATOR_MODEL_STOP_OK ); + notifies.push_back(Message::SIMULATOR_MODEL_STOP_BY_USER ); + notifies.push_back(Message::SIMULATOR_MODEL_STOP_RUNTIME_ERROR); + notifies.push_back(Message::RUNTIME_MODEL_START_BEFORE ); + notifies.push_back(Message::RUNTIME_MODEL_START_AFTER ); + notifies.push_back(Message::RUNTIME_MODEL_STOP_BEFORE ); + notifies.push_back(Message::DEBUG_STRING ); + notifies.push_back(Message::RESULT_STRING ); + + after_constructor(); } Model::~Model() { - g_pModel = NULL; -// closeModel(); + g_pModel = NULL; +// closeModel(); } void Model::proc(RDOThread::RDOMessageInfo& msg) { - switch (msg.message) - { - case RDOThread::RT_STUDIO_MODEL_GET_TEXT: - { - msg.lock(); - rdo::repository::RDOThreadRepository::FileData* fdata = static_cast(msg.param); - editor::Model* pEdit = m_pView->getTab().getItemEdit(fdata->m_type); - if (pEdit) - { - pEdit->save(fdata->m_stream); - } - msg.unlock(); - break; - } - case RDOThread::RT_REPOSITORY_MODEL_NEW: - { - newModelFromRepository(); - break; - } - case RDOThread::RT_REPOSITORY_MODEL_OPEN: - { - openModelFromRepository(); - break; - } - case RDOThread::RT_REPOSITORY_MODEL_OPEN_ERROR: - { - QMessageBox::critical( - g_pApp->getMainWnd(), - "Ошибка открытия модели", - QString("Невозможно открыть модель '%1'.").arg(QString::fromStdWString(static_cast(msg.param)->wstring())) - ); - break; - } - case RDOThread::RT_REPOSITORY_MODEL_SAVE: - { - saveModelToRepository(); - break; - } - case RDOThread::RT_REPOSITORY_MODEL_OPEN_GET_NAME: - { - msg.lock(); - rdo::repository::RDOThreadRepository::OpenFile* data = static_cast(msg.param); - - QString modelName = QFileDialog::getOpenFileName( - NULL, - "Открыть модель", - QString(), - "РДО-проект (*.rdox);;РДО-конвертор (*.smr);;Все файлы (*.*)" - ); - data->m_result = !modelName.isEmpty(); - data->m_name = modelName.toStdWString(); - data->m_readOnly = false; - - msg.unlock(); - break; - } - case RDOThread::RT_REPOSITORY_MODEL_CLOSE: - { - closeModelFromRepository(); - break; - } - case RDOThread::RT_RUNTIME_MODEL_START_BEFORE: - { - break; - } - case RDOThread::RT_RUNTIME_MODEL_START_AFTER: - { - setIsRunning(true); - sendMessage(kernel->runtime(), RT_RUNTIME_GET_MODE, &m_runtimeMode); - setRuntimeMode(m_runtimeMode); - sendMessage(kernel->runtime(), RT_RUNTIME_GET_SHOWRATE, &m_showRate); - setSpeed(m_speed); - afterModelStart(); - g_pApp->getIMainWnd()->getDockDebug().raise(); - g_pApp->getIMainWnd()->getDockDebug().appendString("Модель запущена\n"); - g_pApp->getIMainWnd()->getDockDebug().getContext().update(); - int index = m_frameManager.getLastShowedFrame(); - if (index != -1) - { - rdo::gui::frame::View* pView = m_frameManager.getFrameView(index); - if (pView) pView->setFocus(); - } - g_pApp->getIMainWnd()->update_start(); - break; - } - case RDOThread::RT_RUNTIME_MODEL_STOP_BEFORE: - { - g_pApp->getIMainWnd()->update_stop(); - updateTimeNow(); - m_frameManager.clear(); - boost::chrono::system_clock::time_point time_stop = boost::chrono::system_clock::now(); - boost::chrono::milliseconds duration = boost::chrono::duration_cast(time_stop - m_timeStart); - g_pApp->getIMainWnd()->getDockDebug().appendString(QString::fromStdString( - boost::str(boost::format("Длительность прогона: %1% мсек.\n") % duration.count()) - )); - setCanRun (true ); - setIsRunning(false); - emit stopped(); - break; - } - case RDOThread::RT_SIMULATOR_MODEL_STOP_OK: - { - g_pApp->getIMainWnd()->getDockDebug().appendString("Модель завершена\n"); - g_pApp->getIMainWnd()->getDockDebug().getContext().update(); - - show_result(); - - g_pApp->autoCloseByModel(); - break; - } - case RDOThread::RT_SIMULATOR_MODEL_STOP_BY_USER: - { - sendMessage(kernel->simulator(), RT_SIMULATOR_GET_MODEL_EXITCODE, &m_exitCode); - g_pApp->getIMainWnd()->getDockDebug().appendString("Модель завершена\n"); - g_pApp->getIMainWnd()->getDockDebug().getContext().update(); - - show_result(); - - break; - } - case RDOThread::RT_SIMULATOR_MODEL_STOP_RUNTIME_ERROR: - { - sendMessage(kernel->simulator(), RT_SIMULATOR_GET_MODEL_EXITCODE, &m_exitCode); - show_result(); - g_pApp->getIMainWnd()->getDockDebug().appendString("Модель остановлена из-за ошибки прогона"); - g_pApp->getIMainWnd()->getDockBuild().clear(); - g_pApp->getIMainWnd()->getDockBuild().raise(); - g_pApp->getIMainWnd()->getDockBuild().appendString("Ошибка прогона..."); - std::vector errors; - g_pApp->m_pStudioGUI->sendMessage(kernel->simulator(), RDOThread::RT_SIMULATOR_GET_ERRORS, &errors); - int errors_cnt = 0; - int warnings_cnt = 0; - for (const FileMessage& message: errors) - { - g_pApp->getIMainWnd()->getDockBuild().appendString(message); - if (message.getType() == FileMessage::MT_WARNING) - { - warnings_cnt++; - } - else - { - errors_cnt++; - } - } - if (errors_cnt || warnings_cnt) - { -// const_cast(output->getBuild())->showFirstError(); - } - - g_pApp->autoCloseByModel(); - break; - } - case RDOThread::RT_SIMULATOR_PARSE_OK: - { - sendMessage(kernel->simulator(), RT_SIMULATOR_GET_MODEL_EXITCODE, &m_exitCode); - std::vector errors; - g_pApp->m_pStudioGUI->sendMessage(kernel->simulator(), RDOThread::RT_SIMULATOR_GET_ERRORS, &errors); - int errors_cnt = 0; - int warnings_cnt = 0; - for (const FileMessage& message: errors) - { - g_pApp->getIMainWnd()->getDockBuild().appendString(message); - if (message.getType() == FileMessage::MT_WARNING) - { - warnings_cnt++; - } - else - { - errors_cnt++; - } - } - g_pApp->getIMainWnd()->getDockBuild().appendString( - QString("найдено ошибок: %1, предупреждений: %2").arg(errors_cnt).arg(warnings_cnt) - ); - if (errors_cnt || warnings_cnt) - { -// g_pApp->getIMainWnd()->getDockBuild().getContext().showFirstError(); - } - m_buildState = BS_COMPLETE; - m_timeStart = boost::chrono::system_clock::now(); - break; - } - case RDOThread::RT_SIMULATOR_PARSE_ERROR: - { - setIsRunning(false); - sendMessage(kernel->simulator(), RT_SIMULATOR_GET_MODEL_EXITCODE, &m_exitCode); - std::vector errors; - g_pApp->m_pStudioGUI->sendMessage(kernel->simulator(), RDOThread::RT_SIMULATOR_GET_ERRORS, &errors); - int errors_cnt = 0; - int warnings_cnt = 0; - for (const FileMessage& message: errors) - { - g_pApp->getIMainWnd()->getDockBuild().appendString(message); - if (message.getType() == FileMessage::MT_WARNING) - { - warnings_cnt++; - } - else - { - errors_cnt++; - } - } - g_pApp->getIMainWnd()->getDockBuild().appendString( - QString("найдено ошибок: %1, предупреждений: %2").arg(errors_cnt).arg(warnings_cnt) - ); - if (errors_cnt || warnings_cnt) - { - g_pApp->getIMainWnd()->getDockBuild().getContext().showFirstError(); - } - - setCanRun(true); - m_buildState = BS_ERROR; - g_pApp->autoCloseByModel(); - break; - } - case RDOThread::RT_SIMULATOR_PARSE_ERROR_SMR_EMPTY: - { - m_smrEmptyError = true; - m_buildState = BS_ERROR; - break; - } - case RDOThread::RT_SIMULATOR_PARSE_STRING: - { - msg.lock(); - g_pApp->getIMainWnd()->getDockBuild().appendString(QString::fromStdString(*static_cast(msg.param))); - msg.unlock(); - break; - } - case RDOThread::RT_DEBUG_STRING: - { - msg.lock(); - g_pApp->getIMainWnd()->getDockDebug().appendString(QString::fromStdString(*static_cast(msg.param))); - msg.unlock(); - break; - } - case RDOThread::RT_RESULT_STRING: - { - msg.lock(); - g_pApp->getIMainWnd()->getDockResults().appendString(QString::fromStdString(*static_cast(msg.param))); - msg.unlock(); - break; - } - default: - break; - } + switch (msg.message) + { + case RDOThread::Message::STUDIO_MODEL_GET_TEXT: + { + msg.lock(); + rdo::repository::RDOThreadRepository::FileData* fdata = static_cast(msg.param); + editor::Model* pEdit = m_pView->getTab().getItemEdit(fdata->m_type); + if (pEdit) + { + pEdit->save(fdata->m_stream); + } + msg.unlock(); + break; + } + case RDOThread::Message::REPOSITORY_MODEL_NEW: + { + newModelFromRepository(); + break; + } + case RDOThread::Message::REPOSITORY_MODEL_OPEN: + { + openModelFromRepository(); + break; + } + case RDOThread::Message::REPOSITORY_MODEL_OPEN_ERROR: + { + QMessageBox::critical( + g_pApp->getMainWnd(), + "Ошибка открытия модели", + QString("Невозможно открыть модель '%1'.").arg(QString::fromStdWString(static_cast(msg.param)->wstring())) + ); + break; + } + case RDOThread::Message::REPOSITORY_MODEL_SAVE: + { + saveModelToRepository(); + break; + } + case RDOThread::Message::REPOSITORY_MODEL_OPEN_GET_NAME: + { + msg.lock(); + rdo::repository::RDOThreadRepository::OpenFile* data = static_cast(msg.param); + + QString modelName = QFileDialog::getOpenFileName( + NULL, + "Открыть модель", + QString(), + "РДО-проект (*.rdox);;РДО-конвертор (*.smr);;Все файлы (*.*)" + ); + data->m_result = !modelName.isEmpty(); + data->m_name = modelName.toStdWString(); + data->m_readOnly = false; + + msg.unlock(); + break; + } + case RDOThread::Message::REPOSITORY_MODEL_CLOSE: + { + closeModelFromRepository(); + break; + } + case RDOThread::Message::RUNTIME_MODEL_START_BEFORE: + { + break; + } + case RDOThread::Message::RUNTIME_MODEL_START_AFTER: + { + setIsRunning(true); + sendMessage(kernel->runtime(), Message::RUNTIME_GET_MODE, &m_runtimeMode); + setRuntimeMode(m_runtimeMode); + sendMessage(kernel->runtime(), Message::RUNTIME_GET_SHOWRATE, &m_showRate); + setSpeed(m_speed); + afterModelStart(); + g_pApp->getIMainWnd()->getDockDebug().raise(); + g_pApp->getIMainWnd()->getDockDebug().appendString("Модель запущена\n"); + g_pApp->getIMainWnd()->getDockDebug().getContext().update(); + int index = m_frameManager.getLastShowedFrame(); + if (index != -1) + { + rdo::gui::frame::View* pView = m_frameManager.getFrameView(index); + if (pView) pView->setFocus(); + } + g_pApp->getIMainWnd()->update_start(); + break; + } + case RDOThread::Message::RUNTIME_MODEL_STOP_BEFORE: + { + g_pApp->getIMainWnd()->update_stop(); + updateTimeNow(); + m_frameManager.clear(); + boost::chrono::system_clock::time_point time_stop = boost::chrono::system_clock::now(); + boost::chrono::milliseconds duration = boost::chrono::duration_cast(time_stop - m_timeStart); + g_pApp->getIMainWnd()->getDockDebug().appendString(QString::fromStdString( + boost::str(boost::format("Длительность прогона: %1% мсек.\n") % duration.count()) + )); + setCanRun (true ); + setIsRunning(false); + emit stopped(); + break; + } + case RDOThread::Message::SIMULATOR_MODEL_STOP_OK: + { + g_pApp->getIMainWnd()->getDockDebug().appendString("Модель завершена\n"); + g_pApp->getIMainWnd()->getDockDebug().getContext().update(); + + show_result(); + + g_pApp->autoCloseByModel(); + break; + } + case RDOThread::Message::SIMULATOR_MODEL_STOP_BY_USER: + { + sendMessage(kernel->simulator(), Message::SIMULATOR_GET_MODEL_EXITCODE, &m_exitCode); + g_pApp->getIMainWnd()->getDockDebug().appendString("Модель завершена\n"); + g_pApp->getIMainWnd()->getDockDebug().getContext().update(); + + show_result(); + + break; + } + case RDOThread::Message::SIMULATOR_MODEL_STOP_RUNTIME_ERROR: + { + sendMessage(kernel->simulator(), Message::SIMULATOR_GET_MODEL_EXITCODE, &m_exitCode); + show_result(); + g_pApp->getIMainWnd()->getDockDebug().appendString("Модель остановлена из-за ошибки прогона"); + g_pApp->getIMainWnd()->getDockBuild().clear(); + g_pApp->getIMainWnd()->getDockBuild().raise(); + g_pApp->getIMainWnd()->getDockBuild().appendString("Ошибка прогона..."); + std::vector errors; + g_pApp->m_pStudioGUI->sendMessage(kernel->simulator(), RDOThread::Message::SIMULATOR_GET_ERRORS, &errors); + int errors_cnt = 0; + int warnings_cnt = 0; + for (const FileMessage& message: errors) + { + g_pApp->getIMainWnd()->getDockBuild().appendString(message); + if (message.getType() == FileMessage::Type::MESSAGE_WARNING) + { + warnings_cnt++; + } + else + { + errors_cnt++; + } + } + if (errors_cnt || warnings_cnt) + { +// const_cast(output->getBuild())->showFirstError(); + } + + g_pApp->autoCloseByModel(); + break; + } + case RDOThread::Message::SIMULATOR_PARSE_OK: + { + sendMessage(kernel->simulator(), Message::SIMULATOR_GET_MODEL_EXITCODE, &m_exitCode); + std::vector errors; + g_pApp->m_pStudioGUI->sendMessage(kernel->simulator(), RDOThread::Message::SIMULATOR_GET_ERRORS, &errors); + int errors_cnt = 0; + int warnings_cnt = 0; + for (const FileMessage& message: errors) + { + g_pApp->getIMainWnd()->getDockBuild().appendString(message); + if (message.getType() == FileMessage::Type::MESSAGE_WARNING) + { + warnings_cnt++; + } + else + { + errors_cnt++; + } + } + g_pApp->getIMainWnd()->getDockBuild().appendString( + QString("найдено ошибок: %1, предупреждений: %2").arg(errors_cnt).arg(warnings_cnt) + ); + if (errors_cnt || warnings_cnt) + { +// g_pApp->getIMainWnd()->getDockBuild().getContext().showFirstError(); + } + m_buildState = BuildState::COMPLETE; + m_timeStart = boost::chrono::system_clock::now(); + break; + } + case RDOThread::Message::SIMULATOR_PARSE_ERROR: + { + setIsRunning(false); + sendMessage(kernel->simulator(), Message::SIMULATOR_GET_MODEL_EXITCODE, &m_exitCode); + std::vector errors; + g_pApp->m_pStudioGUI->sendMessage(kernel->simulator(), RDOThread::Message::SIMULATOR_GET_ERRORS, &errors); + int errors_cnt = 0; + int warnings_cnt = 0; + for (const FileMessage& message: errors) + { + g_pApp->getIMainWnd()->getDockBuild().appendString(message); + if (message.getType() == FileMessage::Type::MESSAGE_WARNING) + { + warnings_cnt++; + } + else + { + errors_cnt++; + } + } + g_pApp->getIMainWnd()->getDockBuild().appendString( + QString("найдено ошибок: %1, предупреждений: %2").arg(errors_cnt).arg(warnings_cnt) + ); + if (errors_cnt || warnings_cnt) + { + g_pApp->getIMainWnd()->getDockBuild().getContext().showFirstError(); + } + + setCanRun(true); + m_buildState = BuildState::BUILD_ERROR; + g_pApp->autoCloseByModel(); + break; + } + case RDOThread::Message::SIMULATOR_PARSE_ERROR_SMR_EMPTY: + { + m_smrEmptyError = true; + m_buildState = BuildState::BUILD_ERROR; + break; + } + case RDOThread::Message::SIMULATOR_PARSE_STRING: + { + msg.lock(); + g_pApp->getIMainWnd()->getDockBuild().appendString(QString::fromStdString(*static_cast(msg.param))); + msg.unlock(); + break; + } + case RDOThread::Message::DEBUG_STRING: + { + msg.lock(); + g_pApp->getIMainWnd()->getDockDebug().appendString(QString::fromStdString(*static_cast(msg.param))); + msg.unlock(); + break; + } + case RDOThread::Message::RESULT_STRING: + { + msg.lock(); + g_pApp->getIMainWnd()->getDockResults().appendString(QString::fromStdString(*static_cast(msg.param))); + msg.unlock(); + break; + } + default: + break; + } } void Model::show_result() { - std::stringstream modelResults; - sendMessage(kernel->simulator(), RT_SIMULATOR_GET_MODEL_RESULTS, &modelResults); - QString str = QString::fromStdString(modelResults.str()); - if (!str.isEmpty()) - { - rdo::repository::RDOThreadRepository::FileInfo data(rdo::model::PMV); - g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::RT_REPOSITORY_MODEL_GET_FILEINFO, &data); - if (!data.m_described) - { - g_pApp->getIMainWnd()->getDockDebug().appendString("Результаты не будут записаны в файл, т.к. в SMR не определен Results_file\n"); - } - g_pApp->getIMainWnd()->getDockResults().getContext().clearAll(); - g_pApp->getIMainWnd()->getDockResults().raise(); - g_pApp->getIMainWnd()->getDockResults().appendString(str); - } + std::stringstream modelResults; + sendMessage(kernel->simulator(), Message::SIMULATOR_GET_MODEL_RESULTS, &modelResults); + QString str = QString::fromStdString(modelResults.str()); + if (!str.isEmpty()) + { + rdo::repository::RDOThreadRepository::FileInfo data(rdo::FileType::PMV); + g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::Message::REPOSITORY_MODEL_GET_FILEINFO, &data); + if (!data.m_described) + { + g_pApp->getIMainWnd()->getDockDebug().appendString("Результаты не будут записаны в файл, т.к. в SMR не определен Results_file\n"); + } + g_pApp->getIMainWnd()->getDockResults().getContext().clearAll(); + g_pApp->getIMainWnd()->getDockResults().raise(); + g_pApp->getIMainWnd()->getDockResults().appendString(str); + } } bool Model::newModel(const QString& modelName, const QString& modelPath, std::size_t templateIndex) { - m_templateIndex = templateIndex; - g_pApp->getIMainWnd()->getDockBuild ().clear(); - g_pApp->getIMainWnd()->getDockDebug ().clear(); - g_pApp->getIMainWnd()->getDockResults().clear(); - g_pApp->getIMainWnd()->getDockFind ().clear(); - rdo::repository::RDOThreadRepository::NewModel data; - data.m_name = modelName.toStdWString(); - data.m_path = modelPath.toStdWString(); - g_pApp->broadcastMessage(RDOThread::RT_STUDIO_MODEL_NEW, &data); - return true; + m_templateIndex = templateIndex; + g_pApp->getIMainWnd()->getDockBuild ().clear(); + g_pApp->getIMainWnd()->getDockDebug ().clear(); + g_pApp->getIMainWnd()->getDockResults().clear(); + g_pApp->getIMainWnd()->getDockFind ().clear(); + rdo::repository::RDOThreadRepository::NewModel data; + data.m_name = modelName.toStdWString(); + data.m_path = modelPath.toStdWString(); + g_pApp->broadcastMessage(RDOThread::Message::STUDIO_MODEL_NEW, &data); + return true; } bool Model::openModel(const QString& modelName) { - if (isRunning()) - { - QMessageBox::warning(g_pApp->getMainWnd(), "RAO-Studio", "Работает модель. Перед открытием её необходимо остановить."); - return false; - } - if (!closeModel()) - { - return false; - } - g_pApp->getIMainWnd()->getDockBuild ().clear(); - g_pApp->getIMainWnd()->getDockDebug ().clear(); - g_pApp->getIMainWnd()->getDockResults().clear(); - g_pApp->getIMainWnd()->getDockFind ().clear(); - g_pApp->getIMainWnd()->getDockDebug().raise(); - g_pApp->getIMainWnd()->getDockDebug().appendString("Загрузка модели...\n"); - g_pApp->getIMainWnd()->getDockDebug().getContext().update(); - m_openError = false; - m_smrEmptyError = false; - m_modelClosed = false; - rdo::repository::RDOThreadRepository::OpenFile data(modelName.toStdWString()); - g_pApp->broadcastMessage(RDOThread::RT_STUDIO_MODEL_OPEN, &data); - if (data.m_result && !m_openError && !m_smrEmptyError) - { - std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); - rdo::repository::RDOThreadRepository::FileData fileData(rdo::model::PMV, stream); - g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::RT_REPOSITORY_LOAD, &fileData); - g_pApp->getIMainWnd()->getDockResults().appendString(QString::fromStdString(stream.str())); - g_pApp->getIMainWnd()->getDockDebug().appendString("Загрузка модели... ok\n"); - g_pApp->setLastProjectName(getFullName()); - } - else - { - m_modelClosed = true; - if (m_smrEmptyError) - { - QMessageBox::critical(g_pApp->getMainWnd(), "Ошибка открытия модели", "В smr-файле не найдено имя модели"); - closeModel(); - } - else - { - g_pApp->getIMainWnd()->getDockDebug().appendString("Загрузка модели... failed\n"); - } - } - return data.m_result; + if (isRunning()) + { + QMessageBox::warning(g_pApp->getMainWnd(), "RAO-Studio", "Работает модель. Перед открытием её необходимо остановить."); + return false; + } + if (!closeModel()) + { + return false; + } + g_pApp->getIMainWnd()->getDockBuild ().clear(); + g_pApp->getIMainWnd()->getDockDebug ().clear(); + g_pApp->getIMainWnd()->getDockResults().clear(); + g_pApp->getIMainWnd()->getDockFind ().clear(); + g_pApp->getIMainWnd()->getDockDebug().raise(); + g_pApp->getIMainWnd()->getDockDebug().appendString("Загрузка модели...\n"); + g_pApp->getIMainWnd()->getDockDebug().getContext().update(); + m_openError = false; + m_smrEmptyError = false; + m_modelClosed = false; + rdo::repository::RDOThreadRepository::OpenFile data(modelName.toStdWString()); + g_pApp->broadcastMessage(RDOThread::Message::STUDIO_MODEL_OPEN, &data); + if (data.m_result && !m_openError && !m_smrEmptyError) + { + std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); + rdo::repository::RDOThreadRepository::FileData fileData(rdo::FileType::PMV, stream); + g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::Message::REPOSITORY_LOAD, &fileData); + g_pApp->getIMainWnd()->getDockResults().appendString(QString::fromStdString(stream.str())); + g_pApp->getIMainWnd()->getDockDebug().appendString("Загрузка модели... ok\n"); + g_pApp->setLastProjectName(getFullName()); + } + else + { + m_modelClosed = true; + if (m_smrEmptyError) + { + QMessageBox::critical(g_pApp->getMainWnd(), "Ошибка открытия модели", "В smr-файле не найдено имя модели"); + closeModel(); + } + else + { + g_pApp->getIMainWnd()->getDockDebug().appendString("Загрузка модели... failed\n"); + } + } + return data.m_result; } bool Model::saveModel() const { - bool res = true; - g_pApp->broadcastMessage(RDOThread::RT_STUDIO_MODEL_SAVE, &res); - return res; + bool res = true; + g_pApp->broadcastMessage(RDOThread::Message::STUDIO_MODEL_SAVE, &res); + return res; } bool Model::closeModel() { - if (isRunning()) - { - QMessageBox::warning(g_pApp->getMainWnd(), "RAO-Studio", "Работает модель. Перед закрытием её необходимо остановить."); - return false; - } + if (isRunning()) + { + QMessageBox::warning(g_pApp->getMainWnd(), "RAO-Studio", "Работает модель. Перед закрытием её необходимо остановить."); + return false; + } - if (!canCloseModel()) - { - return false; - } + if (!canCloseModel()) + { + return false; + } - setHasModel(false); - resetView(); - stopModel(); - g_pApp->getIMainWnd()->getDockBuild ().clear(); - g_pApp->getIMainWnd()->getDockDebug ().clear(); - g_pApp->getIMainWnd()->getDockResults().clear(); - g_pApp->getIMainWnd()->getDockFind ().clear(); + setHasModel(false); + resetView(); + stopModel(); + g_pApp->getIMainWnd()->getDockBuild ().clear(); + g_pApp->getIMainWnd()->getDockDebug ().clear(); + g_pApp->getIMainWnd()->getDockResults().clear(); + g_pApp->getIMainWnd()->getDockFind ().clear(); - g_pApp->getMainWndUI()->statusBar()->update(QString()); - g_pApp->getMainWndUI()->statusBar()->update(QString()); - g_pApp->getMainWndUI()->statusBar()->update(QString()); - g_pApp->getMainWndUI()->statusBar()->update(QString()); + g_pApp->getMainWndUI()->statusBar()->update(QString()); + g_pApp->getMainWndUI()->statusBar()->update(QString()); + g_pApp->getMainWndUI()->statusBar()->update(QString()); + g_pApp->getMainWndUI()->statusBar()->update(QString()); - g_pApp->broadcastMessage(RDOThread::RT_STUDIO_MODEL_CLOSE); - return true; + g_pApp->broadcastMessage(RDOThread::Message::STUDIO_MODEL_CLOSE); + return true; } bool Model::buildModel() { - if (hasModel() && !isRunning() && saveModel()) - { - g_pApp->getIMainWnd()->getDockBuild().clear(); - g_pApp->getIMainWnd()->getDockDebug().clear(); - g_pApp->getIMainWnd()->getDockResults().clear(); - g_pApp->getIMainWnd()->getDockBuild().raise(); - g_pApp->getIMainWnd()->getDockBuild().appendString("Компиляция..."); - g_pApp->getIMainWnd()->getDockBuild().getContext().update(); - m_buildState = BS_UNDEFINED; - g_pApp->broadcastMessage(RDOThread::RT_STUDIO_MODEL_BUILD); - return m_buildState == BS_COMPLETE; - } - return false; + if (hasModel() && !isRunning() && saveModel()) + { + g_pApp->getIMainWnd()->getDockBuild().clear(); + g_pApp->getIMainWnd()->getDockDebug().clear(); + g_pApp->getIMainWnd()->getDockResults().clear(); + g_pApp->getIMainWnd()->getDockBuild().raise(); + g_pApp->getIMainWnd()->getDockBuild().appendString("Компиляция..."); + g_pApp->getIMainWnd()->getDockBuild().getContext().update(); + m_buildState = BuildState::UNDEFINED; + g_pApp->broadcastMessage(RDOThread::Message::STUDIO_MODEL_BUILD); + return m_buildState == BuildState::COMPLETE; + } + return false; } bool Model::runModel() { - if (buildModel()) - { - setCanRun(false); - g_pApp->getIMainWnd()->getDockBuild().clear(); - g_pApp->getIMainWnd()->getDockDebug().clear(); - g_pApp->getIMainWnd()->getDockResults().clear(); - g_pApp->getIMainWnd()->getDockBuild().raise(); - g_pApp->getIMainWnd()->getDockBuild().getContext().update(); - g_pApp->broadcastMessage(RDOThread::RT_STUDIO_MODEL_RUN); - return true; - } - return false; + if (buildModel()) + { + setCanRun(false); + g_pApp->getIMainWnd()->getDockBuild().clear(); + g_pApp->getIMainWnd()->getDockDebug().clear(); + g_pApp->getIMainWnd()->getDockResults().clear(); + g_pApp->getIMainWnd()->getDockBuild().raise(); + g_pApp->getIMainWnd()->getDockBuild().getContext().update(); + g_pApp->broadcastMessage(RDOThread::Message::STUDIO_MODEL_RUN); + return true; + } + return false; } bool Model::stopModel() const { - if (hasModel() && isRunning()) - { - g_pApp->broadcastMessage(RDOThread::RT_STUDIO_MODEL_STOP); - return true; - } - return false; + if (hasModel() && isRunning()) + { + g_pApp->broadcastMessage(RDOThread::Message::STUDIO_MODEL_STOP); + return true; + } + return false; } void Model::createView() { - ASSERT(m_pView == NULL); - m_pView = new View(NULL); - m_pView->setModel(this); - g_pApp->getIMainWnd()->addSubWindow(m_pView); - m_pView->parentWidget()->setWindowIcon(QIcon(QString::fromUtf8(":/images/images/mdi_model.png"))); + ASSERT(m_pView == NULL); + m_pView = new View(NULL); + m_pView->setModel(this); + g_pApp->getIMainWnd()->addSubWindow(m_pView); + m_pView->parentWidget()->setWindowIcon(QIcon(QString::fromUtf8(":/images/images/mdi_model.png"))); - for (int i = 0; i < m_pView->getTab().count(); i++) - { - editor::Model* pEdit = m_pView->getTab().getItemEdit(i); - connect(pEdit, SIGNAL(modifyChanged(bool)), this, SLOT(onEditModifyChanged(bool))); - } + for (int i = 0; i < m_pView->getTab().count(); i++) + { + editor::Model* pEdit = m_pView->getTab().getItemEdit(i); + connect(pEdit, SIGNAL(modifyChanged(bool)), this, SLOT(onEditModifyChanged(bool))); + } } void Model::resetView() { - if (m_pView) - { - for (int i = 0; i < m_pView->getTab().count(); i++) - { - editor::Model* pEdit = m_pView->getTab().getItemEdit(i); - disconnect(pEdit, SIGNAL(modifyChanged(bool)), this, SLOT(onEditModifyChanged(bool))); - } - m_pView->setModel(NULL); - } + if (m_pView) + { + for (int i = 0; i < m_pView->getTab().count(); i++) + { + editor::Model* pEdit = m_pView->getTab().getItemEdit(i); + disconnect(pEdit, SIGNAL(modifyChanged(bool)), this, SLOT(onEditModifyChanged(bool))); + } + m_pView->setModel(NULL); + } } void Model::newModelFromRepository() { - setHasModel(true); - - createView(); - rdo::repository::RDOThreadRepository::FileInfo data_smr(rdo::model::RDOX); - g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::RT_REPOSITORY_MODEL_GET_FILEINFO, &data_smr); - setName(QString::fromStdWString(data_smr.m_name.wstring())); - - ModelTemplateList::const_iterator templateIt = m_templateIndex.is_initialized() - ? m_modelTemplates.find(*m_templateIndex) - : m_modelTemplates.end(); - - for (int i = 0; i < m_pView->getTab().count(); i++) - { - editor::Model* pEdit = m_pView->getTab().getItemEdit(i); - pEdit->setReadOnly(false); - pEdit->clearAll(); - if (templateIt != m_modelTemplates.end()) - { - ModelTemplate::const_iterator it = templateIt->second.find(m_pView->getTab().indexToType(i)); - if (it != templateIt->second.end()) - { - ASSERT(!it->second.resName.isEmpty()) - QString resourceData; - QFile file(it->second.resName); - if (file.open(QIODevice::ReadOnly) && file.isOpen()) - { - resourceData = file.readAll(); - } - if (!resourceData.isEmpty()) - { - pEdit->replaceCurrent(resourceData); - pEdit->scrollToLine(0); - if (it->second.position.is_initialized()) - { - pEdit->setCurrentPos(*it->second.position); - } - } - } - } - } - - g_pApp->setLastProjectName(getFullName()); - if (templateIt != m_modelTemplates.end()) - { - saveModel(); - for (int i = 0; i < m_pView->getTab().count(); i++) - { - editor::Model* pEdit = m_pView->getTab().getItemEdit(i); - pEdit->clearUndoBuffer(); - } - } + setHasModel(true); + + createView(); + rdo::repository::RDOThreadRepository::FileInfo data_smr(rdo::FileType::RDOX); + g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::Message::REPOSITORY_MODEL_GET_FILEINFO, &data_smr); + setName(QString::fromStdWString(data_smr.m_name.wstring())); + + ModelTemplateList::const_iterator templateIt = m_templateIndex.is_initialized() + ? m_modelTemplates.find(*m_templateIndex) + : m_modelTemplates.end(); + + for (int i = 0; i < m_pView->getTab().count(); i++) + { + editor::Model* pEdit = m_pView->getTab().getItemEdit(i); + pEdit->setReadOnly(false); + pEdit->clearAll(); + if (templateIt != m_modelTemplates.end()) + { + ModelTemplate::const_iterator it = templateIt->second.find(m_pView->getTab().indexToType(i)); + if (it != templateIt->second.end()) + { + ASSERT(!it->second.resName.isEmpty()) + QString resourceData; + QFile file(it->second.resName); + if (file.open(QIODevice::ReadOnly) && file.isOpen()) + { + resourceData = file.readAll(); + } + if (!resourceData.isEmpty()) + { + pEdit->replaceCurrent(resourceData); + pEdit->scrollToLine(0); + if (it->second.position.is_initialized()) + { + pEdit->setCurrentPos(*it->second.position); + } + } + } + } + } + + g_pApp->setLastProjectName(getFullName()); + if (templateIt != m_modelTemplates.end()) + { + saveModel(); + for (int i = 0; i < m_pView->getTab().count(); i++) + { + editor::Model* pEdit = m_pView->getTab().getItemEdit(i); + pEdit->clearUndoBuffer(); + } + } } void Model::openModelFromRepository() { - setHasModel(true); - - createView(); - rdo::repository::RDOThreadRepository::FileInfo data_smr(rdo::model::RDOX); - g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::RT_REPOSITORY_MODEL_GET_FILEINFO, &data_smr); - setName(QString::fromStdWString(data_smr.m_name.wstring())); - - int cnt = m_pView->getTab().count(); - g_pApp->getMainWndUI()->statusBar()->beginProgress(0, cnt * 2 + 1); - g_pApp->getMainWndUI()->statusBar()->stepProgress(); - for (int i = 0; i < cnt; i++) - { - editor::Model* pEdit = m_pView->getTab().getItemEdit(i); - pEdit->setReadOnly(false); - pEdit->clearAll(); - std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); - bool canLoad = true; - rdo::model::FileType type = m_pView->getTab().indexToType(i); - if (m_pView->getTab().typeSupported(type)) - { - rdo::repository::RDOThreadRepository::FileData fileData(type, stream); - g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::RT_REPOSITORY_LOAD, &fileData); - } - else - { - canLoad = false; - } - g_pApp->getMainWndUI()->statusBar()->stepProgress(); - if (canLoad) - { - rdo::repository::RDOThreadRepository::FileInfo data(type); - g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::RT_REPOSITORY_MODEL_GET_FILEINFO, &data); - bool stream_error = stream.rdstate() & std::ios_base::failbit ? true : false; - if (!stream_error) - { - pEdit->load(stream); - pEdit->setReadOnly(data.m_readOnly); - if (data.m_readOnly) - { - g_pApp->getIMainWnd()->getDockDebug().appendString(QString("%1 - только чтение\n").arg(QString::fromStdWString((data.m_name / data.m_extension).wstring()))); - } - } - else - { - QString objName; - switch (type) - { - case rdo::model::RTP: objName = "типы ресурсов"; break; - case rdo::model::RSS: objName = "ресурсы"; break; - case rdo::model::EVN: objName = "события"; break; - case rdo::model::PAT: objName = "образцы"; break; - case rdo::model::DPT: objName = "точки принятия решений"; break; - case rdo::model::FRM: objName = "кадры"; break; - case rdo::model::FUN: objName = "функции"; break; - case rdo::model::PMD: objName = "описание показателей"; break; - default : objName = "неизвестный объект"; break; - } - if (!objName.isEmpty()) - { - g_pApp->getIMainWnd()->getDockDebug().appendString(QString("Невозможно загрузить %1 (%2)\n").arg(objName).arg(QString::fromStdWString(data.m_fullName.wstring()))); - g_pApp->getIMainWnd()->getDockDebug().getContext().update(); - } - m_openError = true; - } - } - pEdit->setCurrentPos(0); - pEdit->setModifyFalse(); - pEdit->clearUndoBuffer(); - g_pApp->getMainWndUI()->statusBar()->stepProgress(); - } - g_pApp->getMainWndUI()->statusBar()->endProgress(); - - updateFrmDescribed(); - updateActions(); + setHasModel(true); + + createView(); + rdo::repository::RDOThreadRepository::FileInfo data_smr(rdo::FileType::RDOX); + g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::Message::REPOSITORY_MODEL_GET_FILEINFO, &data_smr); + setName(QString::fromStdWString(data_smr.m_name.wstring())); + + int cnt = m_pView->getTab().count(); + g_pApp->getMainWndUI()->statusBar()->beginProgress(0, cnt * 2 + 1); + g_pApp->getMainWndUI()->statusBar()->stepProgress(); + for (int i = 0; i < cnt; i++) + { + editor::Model* pEdit = m_pView->getTab().getItemEdit(i); + pEdit->setReadOnly(false); + pEdit->clearAll(); + std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); + bool canLoad = true; + rdo::FileType type = m_pView->getTab().indexToType(i); + if (m_pView->getTab().typeSupported(type)) + { + rdo::repository::RDOThreadRepository::FileData fileData(type, stream); + g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::Message::REPOSITORY_LOAD, &fileData); + } + else + { + canLoad = false; + } + g_pApp->getMainWndUI()->statusBar()->stepProgress(); + if (canLoad) + { + rdo::repository::RDOThreadRepository::FileInfo data(type); + g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::Message::REPOSITORY_MODEL_GET_FILEINFO, &data); + bool stream_error = stream.rdstate() & std::ios_base::failbit ? true : false; + if (!stream_error) + { + pEdit->load(stream); + pEdit->setReadOnly(data.m_readOnly); + if (data.m_readOnly) + { + g_pApp->getIMainWnd()->getDockDebug().appendString(QString("%1 - только чтение\n").arg(QString::fromStdWString((data.m_name / data.m_extension).wstring()))); + } + } + else + { + QString objName; + switch (type) + { + case rdo::FileType::RTP: objName = "типы ресурсов"; break; + case rdo::FileType::RSS: objName = "ресурсы"; break; + case rdo::FileType::EVN: objName = "события"; break; + case rdo::FileType::PAT: objName = "образцы"; break; + case rdo::FileType::DPT: objName = "точки принятия решений"; break; + case rdo::FileType::FRM: objName = "кадры"; break; + case rdo::FileType::FUN: objName = "функции"; break; + case rdo::FileType::PMD: objName = "описание показателей"; break; + default: objName = "неизвестный объект"; break; + } + if (!objName.isEmpty()) + { + g_pApp->getIMainWnd()->getDockDebug().appendString(QString("Невозможно загрузить %1 (%2)\n").arg(objName).arg(QString::fromStdWString(data.m_fullName.wstring()))); + g_pApp->getIMainWnd()->getDockDebug().getContext().update(); + } + m_openError = true; + } + } + pEdit->setCurrentPos(0); + pEdit->setModifyFalse(); + pEdit->clearUndoBuffer(); + g_pApp->getMainWndUI()->statusBar()->stepProgress(); + } + g_pApp->getMainWndUI()->statusBar()->endProgress(); + + updateFrmDescribed(); + updateActions(); } void Model::saveModelToRepository() { - bool smr_modified = false; - editor::Model* pSmrEdit = m_pView->getTab().getItemEdit(rdo::model::SMR); - if (pSmrEdit->isModify()) - { - std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); - pSmrEdit->save(stream); - m_smrEmptyError = false; - rdo::repository::RDOThreadRepository::FileData fileData(rdo::model::SMR, stream); - g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::RT_REPOSITORY_SAVE, &fileData); - if (m_smrEmptyError) - { - QMessageBox::critical(g_pApp->getMainWnd(), "Ошибка записи модели", "В smr-файле не найдено имя модели, модель не будет записана"); - return; - } - smr_modified = true; - } - - int cnt = m_pView->getTab().count(); - int progress_cnt = 0; - for (int i = 0; i < cnt; i++) - { - if (smr_modified || m_pView->getTab().getItemEdit(i)->isModify()) - { - progress_cnt++; - } - } - if (progress_cnt) - { - g_pApp->getMainWndUI()->statusBar()->beginProgress(0, progress_cnt * 2 + 1); - g_pApp->getMainWndUI()->statusBar()->stepProgress(); - for (int i = 0; i < cnt; i++) - { - editor::Model* pEdit = m_pView->getTab().getItemEdit(i); - if (smr_modified || pEdit->isModify()) - { - std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); - pEdit->save(stream); - g_pApp->getMainWndUI()->statusBar()->stepProgress(); - rdo::model::FileType type = m_pView->getTab().indexToType(i); - switch (type) - { - case rdo::model::RTP: - case rdo::model::RSS: - case rdo::model::EVN: - case rdo::model::PAT: - case rdo::model::DPT: - case rdo::model::PRC: - case rdo::model::FRM: - case rdo::model::FUN: - case rdo::model::PMD: - { - rdo::repository::RDOThreadRepository::FileData fileData(type, stream); - g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::RT_REPOSITORY_SAVE, &fileData); - break; - } - default: break; - } - pEdit->setModifyFalse(); - } - g_pApp->getMainWndUI()->statusBar()->stepProgress(); - } - g_pApp->getMainWndUI()->statusBar()->endProgress(); - } - - rdo::repository::RDOThreadRepository::FileInfo data(rdo::model::RDOX); - g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::RT_REPOSITORY_MODEL_GET_FILEINFO, &data); - setName(QString::fromStdWString(data.m_name.wstring())); - - g_pApp->getMainWndUI()->insertMenuFileReopenItem(getFullName()); - - if (smr_modified) - { - updateFrmDescribed(); - } - updateActions(); + bool smr_modified = false; + editor::Model* pSmrEdit = m_pView->getTab().getItemEdit(rdo::FileType::SMR); + if (pSmrEdit->isModify()) + { + std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); + pSmrEdit->save(stream); + m_smrEmptyError = false; + rdo::repository::RDOThreadRepository::FileData fileData(rdo::FileType::SMR, stream); + g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::Message::REPOSITORY_SAVE, &fileData); + if (m_smrEmptyError) + { + QMessageBox::critical(g_pApp->getMainWnd(), "Ошибка записи модели", "В smr-файле не найдено имя модели, модель не будет записана"); + return; + } + smr_modified = true; + } + + int cnt = m_pView->getTab().count(); + int progress_cnt = 0; + for (int i = 0; i < cnt; i++) + { + if (smr_modified || m_pView->getTab().getItemEdit(i)->isModify()) + { + progress_cnt++; + } + } + if (progress_cnt) + { + g_pApp->getMainWndUI()->statusBar()->beginProgress(0, progress_cnt * 2 + 1); + g_pApp->getMainWndUI()->statusBar()->stepProgress(); + for (int i = 0; i < cnt; i++) + { + editor::Model* pEdit = m_pView->getTab().getItemEdit(i); + if (smr_modified || pEdit->isModify()) + { + std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); + pEdit->save(stream); + g_pApp->getMainWndUI()->statusBar()->stepProgress(); + rdo::FileType type = m_pView->getTab().indexToType(i); + switch (type) + { + case rdo::FileType::RTP: + case rdo::FileType::RSS: + case rdo::FileType::EVN: + case rdo::FileType::PAT: + case rdo::FileType::DPT: + case rdo::FileType::PRC: + case rdo::FileType::FRM: + case rdo::FileType::FUN: + case rdo::FileType::PMD: + { + rdo::repository::RDOThreadRepository::FileData fileData(type, stream); + g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::Message::REPOSITORY_SAVE, &fileData); + break; + } + default: break; + } + pEdit->setModifyFalse(); + } + g_pApp->getMainWndUI()->statusBar()->stepProgress(); + } + g_pApp->getMainWndUI()->statusBar()->endProgress(); + } + + rdo::repository::RDOThreadRepository::FileInfo data(rdo::FileType::RDOX); + g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::Message::REPOSITORY_MODEL_GET_FILEINFO, &data); + setName(QString::fromStdWString(data.m_name.wstring())); + + g_pApp->getMainWndUI()->insertMenuFileReopenItem(getFullName()); + + if (smr_modified) + { + updateFrmDescribed(); + } + updateActions(); } QString Model::getFullName() const { - rdo::repository::RDOThreadRepository::FileInfo data(rdo::model::RDOX); - g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::RT_REPOSITORY_MODEL_GET_FILEINFO, &data); - return QString::fromStdWString(data.m_fullName.wstring()); + rdo::repository::RDOThreadRepository::FileInfo data(rdo::FileType::RDOX); + g_pApp->m_pStudioGUI->sendMessage(kernel->repository(), RDOThread::Message::REPOSITORY_MODEL_GET_FILEINFO, &data); + return QString::fromStdWString(data.m_fullName.wstring()); } void Model::updateFrmDescribed() { - m_frmDescribed = true; + m_frmDescribed = true; } bool Model::canCloseModel() { - bool result = true; - if (isModify()) - { - switch (QMessageBox::question(g_pApp->getMainWnd(), "RAO-Studio", "Сохранить модель ?", QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel)) - { - case QMessageBox::Yes : result = saveModel(); break; - case QMessageBox::No : result = true; break; - case QMessageBox::Cancel: result = false; break; - default: break; - } - } - return result; + bool result = true; + if (isModify()) + { + switch (QMessageBox::question(g_pApp->getMainWnd(), "RAO-Studio", "Сохранить модель ?", QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel)) + { + case QMessageBox::Yes : result = saveModel(); break; + case QMessageBox::No : result = true; break; + case QMessageBox::Cancel: result = false; break; + default: break; + } + } + return result; } void Model::closeModelFromRepository() { - setHasModel(false); - if (m_pView) - { - m_pView->parentWidget()->close(); - m_pView = NULL; - } - m_modelClosed = true; - setName(""); + setHasModel(false); + if (m_pView) + { + m_pView->parentWidget()->close(); + m_pView = NULL; + } + m_modelClosed = true; + setName(""); } const QString& Model::getName() const { - return m_name; + return m_name; } void Model::setName(const QString& name) { - QString newName = name.trimmed(); + QString newName = name.trimmed(); - if (m_name != newName) - { - m_name = newName; + if (m_name != newName) + { + m_name = newName; - if (m_pView) - { - m_pView->parentWidget()->setWindowTitle(QString("модель: %1").arg( - g_pApp->getShowCaptionFullName() - ? getFullName() - : m_name - )); - } - } + if (m_pView) + { + m_pView->parentWidget()->setWindowTitle(QString("модель: %1").arg( + g_pApp->getShowCaptionFullName() + ? getFullName() + : m_name + )); + } + } } void Model::afterModelStart() { - m_frameManager.clear(); - - if (isFrmDescribed()) - { - g_pApp->getIMainWnd()->getDockDebug().raise(); - g_pApp->getIMainWnd()->getDockDebug().appendString("Загрузка ресурсов для анимации...\n"); - g_pApp->getIMainWnd()->getDockDebug().getContext().update(); - - std::list frames; - std::list bitmaps; - rdo::service::simulation::RDOThreadSimulator::GetList getListFrames (rdo::service::simulation::RDOThreadSimulator::GetList::frames, &frames ); - rdo::service::simulation::RDOThreadSimulator::GetList getListBitmaps(rdo::service::simulation::RDOThreadSimulator::GetList::bitmaps, &bitmaps); - sendMessage(kernel->simulator(), RT_SIMULATOR_GET_LIST, &getListFrames ); - sendMessage(kernel->simulator(), RT_SIMULATOR_GET_LIST, &getListBitmaps); - for (const std::string& name: bitmaps) - { - m_frameManager.insertBitmap(QString::fromStdString(name)); - } - for (const std::string& name: frames) - { - m_frameManager.insertFrame(QString::fromStdString(name)); - } - m_timeNow = 0; - std::size_t initFrameNumber = kernel->simulator()->getInitialFrameNumber(); - if (initFrameNumber != std::size_t(~0)) - { - --initFrameNumber; - } - m_frameManager.setLastShowedFrame(initFrameNumber); - if (getRuntimeMode() != rdo::runtime::RTM_MaxSpeed && initFrameNumber < m_frameManager.count()) - { - rdo::gui::frame::View* pView = m_frameManager.createView(initFrameNumber); - if (pView) - { - m_frameManager.getFrameView(initFrameNumber)->setFocus(); - } - } - g_pApp->getIMainWnd()->getDockDebug().appendString("Загрузка ресурсов для анимации... ok\n"); - g_pApp->getIMainWnd()->getDockDebug().getContext().update(); - } - else - { - m_timeNow = 0; - m_frameManager.setLastShowedFrame(std::size_t(~0)); - } + m_frameManager.clear(); + + if (isFrmDescribed()) + { + g_pApp->getIMainWnd()->getDockDebug().raise(); + g_pApp->getIMainWnd()->getDockDebug().appendString("Загрузка ресурсов для анимации...\n"); + g_pApp->getIMainWnd()->getDockDebug().getContext().update(); + + std::list frames; + std::list bitmaps; + rdo::service::simulation::RDOThreadSimulator::GetList getListFrames (rdo::service::simulation::RDOThreadSimulator::GetList::Type::FRAMES, &frames ); + rdo::service::simulation::RDOThreadSimulator::GetList getListBitmaps(rdo::service::simulation::RDOThreadSimulator::GetList::Type::BITMAPS, &bitmaps); + sendMessage(kernel->simulator(), Message::SIMULATOR_GET_LIST, &getListFrames ); + sendMessage(kernel->simulator(), Message::SIMULATOR_GET_LIST, &getListBitmaps); + for (const std::string& name: bitmaps) + { + m_frameManager.insertBitmap(QString::fromStdString(name)); + } + for (const std::string& name: frames) + { + m_frameManager.insertFrame(QString::fromStdString(name)); + } + m_timeNow = 0; + std::size_t initFrameNumber = kernel->simulator()->getInitialFrameNumber(); + if (initFrameNumber != std::size_t(~0)) + { + --initFrameNumber; + } + m_frameManager.setLastShowedFrame(initFrameNumber); + if (getRuntimeMode() != rdo::runtime::RunTimeMode::MAX_SPEED && initFrameNumber < m_frameManager.count()) + { + rdo::gui::frame::View* pView = m_frameManager.createView(initFrameNumber); + if (pView) + { + m_frameManager.getFrameView(initFrameNumber)->setFocus(); + } + } + g_pApp->getIMainWnd()->getDockDebug().appendString("Загрузка ресурсов для анимации... ok\n"); + g_pApp->getIMainWnd()->getDockDebug().getContext().update(); + } + else + { + m_timeNow = 0; + m_frameManager.setLastShowedFrame(std::size_t(~0)); + } } void Model::updateStyleOfAllModel() const { - if (m_pView) - { - for (int i = 0; i < m_pView->getTab().count(); i++) - { - m_pView->getTab().getItemEdit(i)->setEditorStyle(&g_pApp->getStyle()->style_editor); - } - } + if (m_pView) + { + for (int i = 0; i < m_pView->getTab().count(); i++) + { + m_pView->getTab().getItemEdit(i)->setEditorStyle(&g_pApp->getStyle()->style_editor); + } + } - m_frameManager.updateStyles(); + m_frameManager.updateStyles(); } bool Model::isPrevModelClosed() const { - return m_modelClosed; + return m_modelClosed; } void Model::setRuntimeMode(const rdo::runtime::RunTimeMode value) { - if (isRunning()) - { - m_runtimeMode = value; - sendMessage(kernel->runtime(), RT_RUNTIME_SET_MODE, &m_runtimeMode); - g_pTracer->setRuntimeMode(getRuntimeMode()); - switch (getRuntimeMode()) - { - case rdo::runtime::RTM_MaxSpeed: closeAllFrame(); break; - default: - { - rdo::gui::frame::View* pView = m_frameManager.getFrameViewFirst(); - if (!pView) - { - m_frameManager.createView(m_frameManager.getLastShowedFrame()); - } - break; - } - } - } - updateActions(); + if (isRunning()) + { + m_runtimeMode = value; + sendMessage(kernel->runtime(), Message::RUNTIME_SET_MODE, &m_runtimeMode); + g_pTracer->setRuntimeMode(getRuntimeMode()); + switch (getRuntimeMode()) + { + case rdo::runtime::RunTimeMode::MAX_SPEED: closeAllFrame(); break; + default: + { + rdo::gui::frame::View* pView = m_frameManager.getFrameViewFirst(); + if (!pView) + { + m_frameManager.createView(m_frameManager.getLastShowedFrame()); + } + break; + } + } + } + updateActions(); } QString Model::getLastBreakPointName() { - std::string str; - sendMessage(kernel->runtime(), RT_RUNTIME_GET_LAST_BREAKPOINT, &str); - return QString::fromStdString(str); + std::string str; + sendMessage(kernel->runtime(), Message::RUNTIME_GET_LAST_BREAKPOINT, &str); + return QString::fromStdString(str); } double Model::getSpeed() const { - return m_speed; + return m_speed; } void Model::setSpeed(double persent) { - if (persent >= 0 && persent <= 1) - { - m_speed = persent; - if (isRunning()) - { - sendMessage(kernel->runtime(), RT_RUNTIME_SET_SPEED, &m_speed); - } - updateActions(); - } + if (persent >= 0 && persent <= 1) + { + m_speed = persent; + if (isRunning()) + { + sendMessage(kernel->runtime(), Message::RUNTIME_SET_SPEED, &m_speed); + } + updateActions(); + } } double Model::getShowRate() const { - return m_showRate; + return m_showRate; } void Model::setShowRate(double value) { - if (!isRunning()) - return; + if (!isRunning()) + return; - if (value >= boost::numeric::bounds::lowest() && value <= boost::numeric::bounds::highest()) - { - m_showRate = value; - sendMessage(kernel->runtime(), RT_RUNTIME_SET_SHOWRATE, &m_showRate); - updateActions(); - } + if (value >= boost::numeric::bounds::lowest() && value <= boost::numeric::bounds::highest()) + { + m_showRate = value; + sendMessage(kernel->runtime(), Message::RUNTIME_SET_SHOWRATE, &m_showRate); + updateActions(); + } } void Model::onShowNextFrame() { - m_frameManager.showNextFrame(); + m_frameManager.showNextFrame(); } void Model::onShowPrevFrame() { - m_frameManager.showPrevFrame(); + m_frameManager.showPrevFrame(); } int Model::getFrameCount() const { - return m_frameManager.count(); + return m_frameManager.count(); } const QString& Model::getFrameName(int index) const { - return m_frameManager.getFrameName(index); + return m_frameManager.getFrameName(index); } void Model::showFrame(int index) { - m_frameManager.showFrame(index); + m_frameManager.showFrame(index); } void Model::closeAllFrame() { - m_frameManager.closeAll(); + m_frameManager.closeAll(); } bool Model::hasModel() const { - return m_GUI_HAS_MODEL; + return m_GUI_HAS_MODEL; } void Model::setHasModel(bool value) { - m_GUI_HAS_MODEL = value; - updateActions(); + m_GUI_HAS_MODEL = value; + updateActions(); } void Model::setCanRun(bool value) { - m_GUI_CAN_RUN = value; - updateActions(); + m_GUI_CAN_RUN = value; + updateActions(); } void Model::updateActions() { - Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); - if (!pMainWindow) - return; - pMainWindow->actFileNew->setEnabled(canNew()); - pMainWindow->actFileOpen->setEnabled(canOpen()); - pMainWindow->actFileSaveAll->setEnabled(canSave()); - pMainWindow->actFileClose->setEnabled(canClose()); - - pMainWindow->actModelBuild->setEnabled(canBuild()); - pMainWindow->actModelRun->setEnabled(canRun()); - pMainWindow->actModelStop->setEnabled(isRunning()); - - pMainWindow->actModelRuntimeMaxSpeed->setEnabled(isRunning()); - pMainWindow->actModelRuntimeJump->setEnabled (isRunning()); - pMainWindow->actModelRuntimeSync->setEnabled (isRunning()); - pMainWindow->actModelRuntimePause->setEnabled (isRunning()); - pMainWindow->actModelRuntimeMaxSpeed->setChecked(getRuntimeMode() == rdo::runtime::RTM_MaxSpeed); - pMainWindow->actModelRuntimeJump->setChecked (getRuntimeMode() == rdo::runtime::RTM_Jump); - pMainWindow->actModelRuntimeSync->setChecked (getRuntimeMode() == rdo::runtime::RTM_Sync); - pMainWindow->actModelRuntimePause->setChecked (getRuntimeMode() == rdo::runtime::RTM_Pause || getRuntimeMode() == rdo::runtime::RTM_BreakPoint); - - bool canShowRate = isRunning() && getRuntimeMode() == rdo::runtime::RTM_Sync; - pMainWindow->actModelShowRateInc->setEnabled (canShowRate && getShowRate() * 1.5 <= boost::numeric::bounds::highest()); - pMainWindow->actModelShowRateIncFour->setEnabled(canShowRate && getShowRate() * 4.0 <= boost::numeric::bounds::highest()); - pMainWindow->actModelShowRateDecFour->setEnabled(canShowRate && getShowRate() / 4.0 >= boost::numeric::bounds::lowest()); - pMainWindow->actModelShowRateDec->setEnabled (canShowRate && getShowRate() / 1.5 >= boost::numeric::bounds::lowest()); - - pMainWindow->actModelFrameNext->setEnabled(m_frameManager.canShowNextFrame()); - pMainWindow->actModelFramePrev->setEnabled(m_frameManager.canShowPrevFrame()); - - QString runTimeMode; - if (isRunning()) - { - switch (getRuntimeMode()) - { - case rdo::runtime::RTM_MaxSpeed : runTimeMode = "Без анимации"; break; - case rdo::runtime::RTM_Jump : runTimeMode = "Дискретная имитация"; break; - case rdo::runtime::RTM_Sync : runTimeMode = "Синхронная имитация"; break; - case rdo::runtime::RTM_Pause : runTimeMode = "Пауза"; break; - case rdo::runtime::RTM_BreakPoint: runTimeMode = QString("Точка останова: %1").arg(getLastBreakPointName()); break; - } - } - g_pApp->getMainWndUI()->statusBar()->update(runTimeMode); - - g_pApp->getMainWndUI()->statusBar()->update( - getRuntimeMode() != rdo::runtime::RTM_MaxSpeed || !isRunning() - ? QString("Скорость: %1%").arg(int(getSpeed() * 100)) - : "" - ); - - QString showRateStr; - if (isRunning()) - { - showRateStr = "Масштаб: "; - switch (getRuntimeMode()) - { - case rdo::runtime::RTM_MaxSpeed: - case rdo::runtime::RTM_Jump : - showRateStr += "Бесконечность"; - break; - - case rdo::runtime::RTM_Pause : - case rdo::runtime::RTM_BreakPoint: - showRateStr += "0.0"; - break; - - case rdo::runtime::RTM_Sync: - { - double showRate = g_pModel->getShowRate(); - if (showRate < 1e-10 || showRate > 1e10) - { - showRateStr += QString::number(showRate, 'e'); - } - else if (showRate >= 1) - { - showRateStr += QString::number(showRate, 'f', 1); - } - else - { - showRateStr += QString::number(showRate, 'f', 10); - } - } - break; - } - } - g_pApp->getMainWndUI()->statusBar()->update(showRateStr); - emit actionUpdated(); + Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); + if (!pMainWindow) + return; + pMainWindow->actFileNew->setEnabled(canNew()); + pMainWindow->actFileOpen->setEnabled(canOpen()); + pMainWindow->actFileSaveAll->setEnabled(canSave()); + pMainWindow->actFileClose->setEnabled(canClose()); + + pMainWindow->actModelBuild->setEnabled(canBuild()); + pMainWindow->actModelRun->setEnabled(canRun()); + pMainWindow->actModelStop->setEnabled(isRunning()); + + pMainWindow->actModelRuntimeMaxSpeed->setEnabled(isRunning()); + pMainWindow->actModelRuntimeJump->setEnabled (isRunning()); + pMainWindow->actModelRuntimeSync->setEnabled (isRunning()); + pMainWindow->actModelRuntimePause->setEnabled (isRunning()); + pMainWindow->actModelRuntimeMaxSpeed->setChecked(getRuntimeMode() == rdo::runtime::RunTimeMode::MAX_SPEED); + pMainWindow->actModelRuntimeJump->setChecked (getRuntimeMode() == rdo::runtime::RunTimeMode::JUMP); + pMainWindow->actModelRuntimeSync->setChecked (getRuntimeMode() == rdo::runtime::RunTimeMode::SYNC); + pMainWindow->actModelRuntimePause->setChecked (getRuntimeMode() == rdo::runtime::RunTimeMode::PAUSE || getRuntimeMode() == rdo::runtime::RunTimeMode::BREAKPOINT); + + bool canShowRate = isRunning() && getRuntimeMode() == rdo::runtime::RunTimeMode::SYNC; + pMainWindow->actModelShowRateInc->setEnabled (canShowRate && getShowRate() * 1.5 <= boost::numeric::bounds::highest()); + pMainWindow->actModelShowRateIncFour->setEnabled(canShowRate && getShowRate() * 4.0 <= boost::numeric::bounds::highest()); + pMainWindow->actModelShowRateDecFour->setEnabled(canShowRate && getShowRate() / 4.0 >= boost::numeric::bounds::lowest()); + pMainWindow->actModelShowRateDec->setEnabled (canShowRate && getShowRate() / 1.5 >= boost::numeric::bounds::lowest()); + + pMainWindow->actModelFrameNext->setEnabled(m_frameManager.canShowNextFrame()); + pMainWindow->actModelFramePrev->setEnabled(m_frameManager.canShowPrevFrame()); + + QString runTimeMode; + if (isRunning()) + { + switch (getRuntimeMode()) + { + case rdo::runtime::RunTimeMode::MAX_SPEED : runTimeMode = "Без анимации"; break; + case rdo::runtime::RunTimeMode::JUMP : runTimeMode = "Дискретная имитация"; break; + case rdo::runtime::RunTimeMode::SYNC : runTimeMode = "Синхронная имитация"; break; + case rdo::runtime::RunTimeMode::PAUSE : runTimeMode = "Пауза"; break; + case rdo::runtime::RunTimeMode::BREAKPOINT: runTimeMode = QString("Точка останова: %1").arg(getLastBreakPointName()); break; + } + } + g_pApp->getMainWndUI()->statusBar()->update(runTimeMode); + + g_pApp->getMainWndUI()->statusBar()->update( + getRuntimeMode() != rdo::runtime::RunTimeMode::MAX_SPEED || !isRunning() + ? QString("Скорость: %1%").arg(int(getSpeed() * 100)) + : "" + ); + + QString showRateStr; + if (isRunning()) + { + showRateStr = "Масштаб: "; + switch (getRuntimeMode()) + { + case rdo::runtime::RunTimeMode::MAX_SPEED: + case rdo::runtime::RunTimeMode::JUMP : + showRateStr += "Бесконечность"; + break; + + case rdo::runtime::RunTimeMode::PAUSE : + case rdo::runtime::RunTimeMode::BREAKPOINT: + showRateStr += "0.0"; + break; + + case rdo::runtime::RunTimeMode::SYNC: + { + double showRate = g_pModel->getShowRate(); + if (showRate < 1e-10 || showRate > 1e10) + { + showRateStr += QString::number(showRate, 'e'); + } + else if (showRate >= 1) + { + showRateStr += QString::number(showRate, 'f', 1); + } + else + { + showRateStr += QString::number(showRate, 'f', 10); + } + } + break; + } + } + g_pApp->getMainWndUI()->statusBar()->update(showRateStr); + emit actionUpdated(); } void Model::update() { - updateTimeNow(); - rdo::runtime::RunTimeMode rm; - sendMessage(kernel->runtime(), RT_RUNTIME_GET_MODE, &rm); - if (rm != getRuntimeMode()) - { - if (rm == rdo::runtime::RTM_BreakPoint) - { - g_pApp->getIMainWnd()->getDockDebug().appendString(QString("Пауза в %1 из-за точки '%2'\n").arg(getTimeNow()).arg(getLastBreakPointName())); - } - setRuntimeMode(rm); - } - if (getRuntimeMode() == rdo::runtime::RTM_MaxSpeed) - { - return; - } - int frames = getFrameCount(); - for (int i = 0; i < frames; i++) - { - if (m_frameManager.isChanged()) - { - break; - } - rdo::gui::frame::View* pView = m_frameManager.getFrameView(i); - if (pView) - { - //! @todo qt: переделать модель отрисовки. - //! В pView::paintEvent запрашивать RT_RUNTIME_GET_FRAME, если был тик от таймера. - //! Иначе отрисовывать текущий буфер. - if (pView->isVisible()) - { - try - { - rdo::animation::Frame frame; - rdo::runtime::RDOThreadRunTime::GetFrame getFrame(&frame, i); - sendMessage(kernel->runtime(), RT_RUNTIME_GET_FRAME, &getFrame); - m_frameManager.showFrame(&frame, i); - } - catch (const rdo::runtime::RDORuntimeException&) - { - sendMessage(kernel->runtime(), RT_SIMULATOR_MODEL_STOP_RUNTIME_DELAY); - return; - } - } - } - } + updateTimeNow(); + rdo::runtime::RunTimeMode rm; + sendMessage(kernel->runtime(), Message::RUNTIME_GET_MODE, &rm); + if (rm != getRuntimeMode()) + { + if (rm == rdo::runtime::RunTimeMode::BREAKPOINT) + { + g_pApp->getIMainWnd()->getDockDebug().appendString(QString("Пауза в %1 из-за точки '%2'\n").arg(getTimeNow()).arg(getLastBreakPointName())); + } + setRuntimeMode(rm); + } + if (getRuntimeMode() == rdo::runtime::RunTimeMode::MAX_SPEED) + { + return; + } + int frames = getFrameCount(); + for (int i = 0; i < frames; i++) + { + if (m_frameManager.isChanged()) + { + break; + } + rdo::gui::frame::View* pView = m_frameManager.getFrameView(i); + if (pView) + { + // TODO qt: переделать модель отрисовки. + // В pView::paintEvent запрашивать Message::RUNTIME_GET_FRAME, если был тик от таймера. + // Иначе отрисовывать текущий буфер. + if (pView->isVisible()) + { + try + { + rdo::animation::Frame frame; + rdo::runtime::RDOThreadRunTime::GetFrame getFrame(&frame, i); + sendMessage(kernel->runtime(), Message::RUNTIME_GET_FRAME, &getFrame); + m_frameManager.showFrame(&frame, i); + } + catch (const rdo::runtime::RDORuntimeException&) + { + sendMessage(kernel->runtime(), Message::SIMULATOR_MODEL_STOP_RUNTIME_DELAY); + return; + } + } + } + } } void Model::updateTimeNow() { - sendMessage(kernel->runtime(), RT_RUNTIME_GET_TIMENOW, &m_timeNow); - g_pApp->getMainWndUI()->statusBar()->update(QString("Время: %1").arg(m_timeNow)); + sendMessage(kernel->runtime(), Message::RUNTIME_GET_TIMENOW, &m_timeNow); + g_pApp->getMainWndUI()->statusBar()->update(QString("Время: %1").arg(m_timeNow)); } bool Model::isModify() const { - if (!m_pView) - return false; + if (!m_pView) + return false; - bool result = false; + bool result = false; - for (int i = 0; i < getTab()->count(); i++) - { - if (getTab()->getItemEdit(i)->isModify()) - { - result = true; - break; - } - } + for (int i = 0; i < getTab()->count(); i++) + { + if (getTab()->getItemEdit(i)->isModify()) + { + result = true; + break; + } + } - if (m_modify != result) - { - m_modify = result; - } + if (m_modify != result) + { + m_modify = result; + } - return result; + return result; } bool Model::canNew() const { - return (canRun() || !hasModel()); + return (canRun() || !hasModel()); } bool Model::canOpen() const { - return (canRun() || !hasModel()); + return (canRun() || !hasModel()); } bool Model::canSave() const { - return hasModel() && isModify(); + return hasModel() && isModify(); } bool Model::canClose() const { - return hasModel() && !isRunning(); + return hasModel() && !isRunning(); } bool Model::canBuild() const { - return canRun(); + return canRun(); } bool Model::canRun() const { - return hasModel() && m_GUI_CAN_RUN; + return hasModel() && m_GUI_CAN_RUN; } bool Model::isRunning() const { - return m_GUI_IS_RUNNING; + return m_GUI_IS_RUNNING; } void Model::setIsRunning(bool value) { - m_GUI_IS_RUNNING = value; - updateActions(); + m_GUI_IS_RUNNING = value; + updateActions(); } bool Model::isFrmDescribed() const { - return m_frmDescribed; + return m_frmDescribed; } double Model::getTimeNow() const { - return m_timeNow; + return m_timeNow; } -rdo::simulation::report::RDOExitCode Model::getExitCode() const +rdo::simulation::report::ExitCode Model::getExitCode() const { - return m_exitCode; + return m_exitCode; } rdo::runtime::RunTimeMode Model::getRuntimeMode() const { - return m_runtimeMode; + return m_runtimeMode; } rdo::gui::frame::Manager& Model::getFrameManager() { - return m_frameManager; + return m_frameManager; } void Model::onChangeFrame(std::size_t) { - updateActions(); + updateActions(); } TabCtrl* Model::getTab() { - if (!m_pView) - return NULL; + if (!m_pView) + return NULL; - return &m_pView->getTab(); + return &m_pView->getTab(); } const TabCtrl* Model::getTab() const { - if (!m_pView) - return NULL; + if (!m_pView) + return NULL; - return &m_pView->getTab(); + return &m_pView->getTab(); } void Model::onFileNew() { - NewModelDialog dlg(g_pApp->getMainWndUI()); - if (dlg.exec() == QDialog::Accepted) - { - newModel(dlg.getModelName(), dlg.getModelPath() + dlg.getModelName(), dlg.getTemplateIndex()); - } + NewModelDialog dlg(g_pApp->getMainWndUI()); + if (dlg.exec() == QDialog::Accepted) + { + newModel(dlg.getModelName(), dlg.getModelPath() + dlg.getModelName(), dlg.getTemplateIndex()); + } } void Model::onFileOpen() { - openModel(); + openModel(); } void Model::onFileClose() { - closeModel(); + closeModel(); } void Model::onFileSaveAll() { - saveModel(); + saveModel(); } void Model::onModelBuild() { - buildModel(); + buildModel(); } void Model::onModelRun() { - runModel(); + runModel(); } void Model::onModelStop() { - stopModel(); + stopModel(); } void Model::onModelRuntimeMaxSpeed() { - setRuntimeMode(rdo::runtime::RTM_MaxSpeed); + setRuntimeMode(rdo::runtime::RunTimeMode::MAX_SPEED); } void Model::onModelRuntimeJump() { - setRuntimeMode(rdo::runtime::RTM_Jump); + setRuntimeMode(rdo::runtime::RunTimeMode::JUMP); } void Model::onModelRuntimeSync() { - setRuntimeMode(rdo::runtime::RTM_Sync); + setRuntimeMode(rdo::runtime::RunTimeMode::SYNC); } void Model::onModelRuntimePause() { - setRuntimeMode(rdo::runtime::RTM_Pause); + setRuntimeMode(rdo::runtime::RunTimeMode::PAUSE); } void Model::onModelShowRateInc() { - setShowRate(getShowRate() * 1.5); + setShowRate(getShowRate() * 1.5); } void Model::onModelShowRateIncFour() { - setShowRate(getShowRate() * 4); + setShowRate(getShowRate() * 4); } void Model::onModelShowRateDecFour() { - setShowRate(getShowRate() / 4); + setShowRate(getShowRate() / 4); } void Model::onModelShowRateDec() { - setShowRate(getShowRate() / 1.5); + setShowRate(getShowRate() / 1.5); } void Model::onModelSpeedValueChanged(int value) { - setSpeed(log( double(value + 1) ) / log(101.0)); + setSpeed(log( double(value + 1) ) / log(101.0)); } void Model::onEditModifyChanged(bool) { - updateActions(); + updateActions(); } bool Model::isEmpty() const { - for (int i = 0; i < getTab()->count(); i++) - { - if (!(getTab()->getItemEdit(i)->isEmpty())) - { - return false; - } - } + for (int i = 0; i < getTab()->count(); i++) + { + if (!(getTab()->getItemEdit(i)->isEmpty())) + { + return false; + } + } - return true; + return true; } diff --git a/app/rdo_studio/src/model/model.h b/app/rdo_studio/src/model/model.h index 4184d4a73..0c2119590 100644 --- a/app/rdo_studio/src/model/model.h +++ b/app/rdo_studio/src/model/model.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_MODEL_MODEL_H_ -#define _RDO_STUDIO_MODEL_MODEL_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -20,174 +19,172 @@ class TabCtrl; class View; class Model - : public QObject - , public RDOThreadGUI + : public QObject + , public RDOThreadGUI { Q_OBJECT friend class ThreadStudioGUI; public: - Model(); - virtual ~Model(); + Model(); + virtual ~Model(); - bool openModel (const QString& modelName = QString()); - bool runModel (); - bool closeModel(); - void update (); + bool openModel (const QString& modelName = QString()); + bool runModel (); + bool closeModel(); + void update (); - void resetView(); + void resetView(); - const QString& getName () const; - void setName (const QString& str); - QString getFullName() const; + const QString& getName () const; + void setName (const QString& str); + QString getFullName() const; - bool isRunning () const; - bool isFrmDescribed() const; - double getTimeNow () const; + bool isRunning () const; + bool isFrmDescribed() const; + double getTimeNow () const; - rdo::simulation::report::RDOExitCode getExitCode () const; - rdo::runtime::RunTimeMode getRuntimeMode() const; - void setRuntimeMode (const rdo::runtime::RunTimeMode value); - QString getLastBreakPointName(); - double getShowRate () const; - void setShowRate (double value); + rdo::simulation::report::ExitCode getExitCode () const; + rdo::runtime::RunTimeMode getRuntimeMode() const; + void setRuntimeMode (const rdo::runtime::RunTimeMode value); + QString getLastBreakPointName(); + double getShowRate () const; + void setShowRate (double value); - int getFrameCount () const; - const QString& getFrameName (int index) const; - void showFrame (int index); - void closeAllFrame (); - bool hasModel () const; - bool isModify () const; - bool isEmpty () const; + int getFrameCount () const; + const QString& getFrameName (int index) const; + void showFrame (int index); + void closeAllFrame (); + bool hasModel () const; + bool isModify () const; + bool isEmpty () const; - TabCtrl* getTab(); - const TabCtrl* getTab() const; + TabCtrl* getTab(); + const TabCtrl* getTab() const; - void updateStyleOfAllModel() const; - bool isPrevModelClosed () const; + void updateStyleOfAllModel() const; + bool isPrevModelClosed () const; - rdo::gui::frame::Manager& getFrameManager(); - void onChangeFrame(std::size_t index); + rdo::gui::frame::Manager& getFrameManager(); + void onChangeFrame(std::size_t index); - bool canNew () const; - bool canOpen () const; - bool canSave () const; - bool canClose () const; - bool canBuild () const; - bool canRun () const; + bool canNew () const; + bool canOpen () const; + bool canSave () const; + bool canClose () const; + bool canBuild () const; + bool canRun () const; - bool saveModel () const; + bool saveModel () const; protected: - virtual void proc(RDOThread::RDOMessageInfo& msg); + virtual void proc(RDOThread::RDOMessageInfo& msg); private: - enum BuildState - { - BS_UNDEFINED, - BS_COMPLETE, - BS_ERROR - }; - - rdo::gui::frame::Manager m_frameManager; - boost::optional m_templateIndex; - bool m_GUI_HAS_MODEL; - bool m_GUI_CAN_RUN; - bool m_GUI_IS_RUNNING; - - void setHasModel (bool value); - void setCanRun (bool value); - void setIsRunning (bool value); - void updateActions(); - - boost::chrono::system_clock::time_point m_timeStart; - BuildState m_buildState; - - mutable bool m_openError; - mutable bool m_smrEmptyError; - mutable bool m_modelClosed; - - bool m_frmDescribed; - double m_timeNow; - double m_speed; - double m_showRate; - rdo::runtime::RunTimeMode m_runtimeMode; - rdo::simulation::report::RDOExitCode m_exitCode; - mutable bool m_modify; - View* m_pView; - QString m_name; - - bool newModel (const QString& modelName, const QString& modelPath, std::size_t templateIndex); - bool buildModel(); - bool stopModel () const; - - void updateFrmDescribed (); - void newModelFromRepository (); - void openModelFromRepository (); - void saveModelToRepository (); - void closeModelFromRepository(); - bool canCloseModel (); - void afterModelStart (); - - double getSpeed() const; - void setSpeed(double persent); - - void updateTimeNow(); - - struct ModelTemplateItem - { - QString resName; - boost::optional position; - - ModelTemplateItem(); - ModelTemplateItem(const ModelTemplateItem& copy); - ModelTemplateItem(const QString& resName); - ModelTemplateItem(const QString& resName, std::size_t position); - }; - typedef std::map ModelTemplate; - typedef std::map ModelTemplateList; - ModelTemplateList m_modelTemplates; - - void show_result(); - - void createView(); + enum class BuildState + { + UNDEFINED, + COMPLETE, + BUILD_ERROR + }; + + rdo::gui::frame::Manager m_frameManager; + boost::optional m_templateIndex; + bool m_GUI_HAS_MODEL; + bool m_GUI_CAN_RUN; + bool m_GUI_IS_RUNNING; + + void setHasModel (bool value); + void setCanRun (bool value); + void setIsRunning (bool value); + void updateActions(); + + boost::chrono::system_clock::time_point m_timeStart; + BuildState m_buildState; + + mutable bool m_openError; + mutable bool m_smrEmptyError; + mutable bool m_modelClosed; + + bool m_frmDescribed; + double m_timeNow; + double m_speed; + double m_showRate; + rdo::runtime::RunTimeMode m_runtimeMode; + rdo::simulation::report::ExitCode m_exitCode; + mutable bool m_modify; + View* m_pView; + QString m_name; + + bool newModel (const QString& modelName, const QString& modelPath, std::size_t templateIndex); + bool buildModel(); + bool stopModel () const; + + void updateFrmDescribed (); + void newModelFromRepository (); + void openModelFromRepository (); + void saveModelToRepository (); + void closeModelFromRepository(); + bool canCloseModel (); + void afterModelStart (); + + double getSpeed() const; + void setSpeed(double persent); + + void updateTimeNow(); + + struct ModelTemplateItem + { + QString resName; + boost::optional position; + + ModelTemplateItem(); + ModelTemplateItem(const ModelTemplateItem& copy); + ModelTemplateItem(const QString& resName); + ModelTemplateItem(const QString& resName, std::size_t position); + }; + typedef std::map ModelTemplate; + typedef std::map ModelTemplateList; + ModelTemplateList m_modelTemplates; + + void show_result(); + + void createView(); private slots: - void onFileNew (); - void onFileOpen (); - void onFileClose (); - void onFileSaveAll(); + void onFileNew (); + void onFileOpen (); + void onFileClose (); + void onFileSaveAll(); - void onModelBuild(); - void onModelRun (); - void onModelStop (); + void onModelBuild(); + void onModelRun (); + void onModelStop (); - void onModelRuntimeMaxSpeed(); - void onModelRuntimeJump (); - void onModelRuntimeSync (); - void onModelRuntimePause (); + void onModelRuntimeMaxSpeed(); + void onModelRuntimeJump (); + void onModelRuntimeSync (); + void onModelRuntimePause (); - void onModelShowRateInc (); - void onModelShowRateIncFour(); - void onModelShowRateDecFour(); - void onModelShowRateDec (); + void onModelShowRateInc (); + void onModelShowRateIncFour(); + void onModelShowRateDecFour(); + void onModelShowRateDec (); - void onShowNextFrame(); - void onShowPrevFrame(); + void onShowNextFrame(); + void onShowPrevFrame(); - void onModelSpeedValueChanged(int value); + void onModelSpeedValueChanged(int value); - void onEditModifyChanged(bool value); + void onEditModifyChanged(bool value); signals: - void actionUpdated(); - void stopped(); + void actionUpdated(); + void stopped(); }; }}} // namespace rdo::gui::model // -------------------------------------------------------------------------------- extern rdo::gui::model::Model* g_pModel; - -#endif // _RDO_STUDIO_MODEL_MODEL_H_ diff --git a/app/rdo_studio/src/model/model_tab_ctrl.cpp b/app/rdo_studio/src/model/model_tab_ctrl.cpp index 5e7cc79a0..889778572 100644 --- a/app/rdo_studio/src/model/model_tab_ctrl.cpp +++ b/app/rdo_studio/src/model/model_tab_ctrl.cpp @@ -11,20 +11,20 @@ using namespace rdo::gui::model; TabCtrl::TabCtrl(QWidget* pParent, QWidget* pView) - : QTabWidget(pParent) + : QTabWidget(pParent) { - createPage(pView, "RTP"); - createPage(pView, "RSS"); - createPage(pView, "EVN"); - createPage(pView, "PAT"); - createPage(pView, "DPT"); - createPage(pView, "PRC"); - createPage(pView, "FRM"); - createPage(pView, "FUN"); - createPage(pView, "SMR"); - createPage(pView, "PMD"); + createPage(pView, "RTP"); + createPage(pView, "RSS"); + createPage(pView, "EVN"); + createPage(pView, "PAT"); + createPage(pView, "DPT"); + createPage(pView, "PRC"); + createPage(pView, "FRM"); + createPage(pView, "FUN"); + createPage(pView, "SMR"); + createPage(pView, "PMD"); - setCurrentRDOItem(rdo::model::RTP); + setCurrentRDOItem(rdo::FileType::RTP); } TabCtrl::~TabCtrl() @@ -32,79 +32,79 @@ TabCtrl::~TabCtrl() void TabCtrl::createPage(QWidget* pView, const QString& name) { - context_type* pPage = new context_type(this, pView); + context_type* pPage = new context_type(this, pView); - ASSERT(pPage); + ASSERT(pPage); - addTab(pPage, name); + addTab(pPage, name); - pPage->setEditorStyle(&g_pApp->getStyle()->style_editor); - pPage->show(); - //! @todo qt - //pPage->getContext().setPopupMenu(&pView->popupMenu); + pPage->setEditorStyle(&g_pApp->getStyle()->style_editor); + pPage->show(); + // TODO qt + //pPage->getContext().setPopupMenu(&pView->popupMenu); - m_group.insert(pPage); - pPage->setGroup(&m_group); + m_group.insert(pPage); + pPage->setGroup(&m_group); } -rdo::model::FileType TabCtrl::indexToType(int index) const +rdo::FileType TabCtrl::indexToType(int index) const { - switch (index) - { - case 0: return rdo::model::RTP; - case 1: return rdo::model::RSS; - case 2: return rdo::model::EVN; - case 3: return rdo::model::PAT; - case 4: return rdo::model::DPT; - case 5: return rdo::model::PRC; - case 6: return rdo::model::FRM; - case 7: return rdo::model::FUN; - case 8: return rdo::model::SMR; - case 9: return rdo::model::PMD; - default: return rdo::model::PAT; - } + switch (index) + { + case 0: return rdo::FileType::RTP; + case 1: return rdo::FileType::RSS; + case 2: return rdo::FileType::EVN; + case 3: return rdo::FileType::PAT; + case 4: return rdo::FileType::DPT; + case 5: return rdo::FileType::PRC; + case 6: return rdo::FileType::FRM; + case 7: return rdo::FileType::FUN; + case 8: return rdo::FileType::SMR; + case 9: return rdo::FileType::PMD; + default: return rdo::FileType::PAT; + } } -int TabCtrl::typeToIndex(rdo::model::FileType type) const +int TabCtrl::typeToIndex(rdo::FileType type) const { - switch (type) - { - case rdo::model::RTP: return 0; - case rdo::model::RSS: return 1; - case rdo::model::EVN: return 2; - case rdo::model::PAT: return 3; - case rdo::model::DPT: return 4; - case rdo::model::PRC: return 5; - case rdo::model::FRM: return 6; - case rdo::model::FUN: return 7; - case rdo::model::SMR: return 8; - case rdo::model::PMD: return 9; - default: break; - } - return -1; + switch (type) + { + case rdo::FileType::RTP: return 0; + case rdo::FileType::RSS: return 1; + case rdo::FileType::EVN: return 2; + case rdo::FileType::PAT: return 3; + case rdo::FileType::DPT: return 4; + case rdo::FileType::PRC: return 5; + case rdo::FileType::FRM: return 6; + case rdo::FileType::FUN: return 7; + case rdo::FileType::SMR: return 8; + case rdo::FileType::PMD: return 9; + default: break; + } + return -1; } -void TabCtrl::setCurrentRDOItem(rdo::model::FileType type) +void TabCtrl::setCurrentRDOItem(rdo::FileType type) { - int index = typeToIndex(type); - if (index != -1) - setCurrentIndex(index); + int index = typeToIndex(type); + if (index != -1) + setCurrentIndex(index); } -TabCtrl::context_type* TabCtrl::getItemEdit(rdo::model::FileType type) const +TabCtrl::context_type* TabCtrl::getItemEdit(rdo::FileType type) const { - int index = typeToIndex(type); - return index != -1 - ? getItemEdit(index) - : NULL; + int index = typeToIndex(type); + return index != -1 + ? getItemEdit(index) + : NULL; } TabCtrl::context_type* TabCtrl::getCurrentEdit() const { - return static_cast(currentWidget()); + return static_cast(currentWidget()); } TabCtrl::context_type* TabCtrl::getItemEdit(int index) const { - return static_cast(widget(index)); + return static_cast(widget(index)); } diff --git a/app/rdo_studio/src/model/model_tab_ctrl.h b/app/rdo_studio/src/model/model_tab_ctrl.h index 56d6d5281..b499df2b8 100644 --- a/app/rdo_studio/src/model/model_tab_ctrl.h +++ b/app/rdo_studio/src/model/model_tab_ctrl.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_MODEL_TAB_CTRL_H_ -#define _RDO_STUDIO_MODEL_TAB_CTRL_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -14,28 +13,26 @@ namespace rdo { namespace gui { namespace model { class TabCtrl: public QTabWidget { public: - typedef editor::Model context_type; + typedef editor::Model context_type; - TabCtrl(QWidget* pParent, QWidget* pView); - virtual ~TabCtrl(); + TabCtrl(QWidget* pParent, QWidget* pView); + virtual ~TabCtrl(); - rdo::model::FileType indexToType(int index) const; - int typeToIndex(rdo::model::FileType type) const; - bool typeSupported(rdo::model::FileType type) const { return typeToIndex(type) != -1; } + rdo::FileType indexToType(int index) const; + int typeToIndex(rdo::FileType type) const; + bool typeSupported(rdo::FileType type) const { return typeToIndex(type) != -1; } - rdo::model::FileType getCurrentRDOItem() const { return indexToType(currentIndex()); } - void setCurrentRDOItem(rdo::model::FileType type); + rdo::FileType getCurrentRDOItem() const { return indexToType(currentIndex()); } + void setCurrentRDOItem(rdo::FileType type); - context_type* getCurrentEdit() const; - context_type* getItemEdit(int index) const; - context_type* getItemEdit(rdo::model::FileType type) const; + context_type* getCurrentEdit() const; + context_type* getItemEdit(int index) const; + context_type* getItemEdit(rdo::FileType type) const; private: - editor::Edit::Group m_group; + editor::Edit::Group m_group; - void createPage(QWidget* pView, const QString& name); + void createPage(QWidget* pView, const QString& name); }; }}} // namespace rdo::gui::model - -#endif // _RDO_STUDIO_MODEL_TAB_CTRL_H_ diff --git a/app/rdo_studio/src/model/model_view.cpp b/app/rdo_studio/src/model/model_view.cpp index 4f25b0cae..372148bcc 100644 --- a/app/rdo_studio/src/model/model_view.cpp +++ b/app/rdo_studio/src/model/model_view.cpp @@ -17,126 +17,126 @@ using namespace rdo::gui::model; View::View(QWidget* pParent) - : parent_type(pParent) - , m_pFindDialog(NULL) - , m_pTabCtrl (NULL) - , m_pModel (NULL) + : parent_type(pParent) + , m_pFindDialog(NULL) + , m_pTabCtrl (NULL) + , m_pModel (NULL) { - m_pTabCtrl = new TabCtrl(this, this); + m_pTabCtrl = new TabCtrl(this, this); - QVBoxLayout* pLayout = new QVBoxLayout(this); - pLayout->setSpacing(0); - pLayout->setContentsMargins(0, 0, 0, 0); - pLayout->addWidget(m_pTabCtrl); + QVBoxLayout* pLayout = new QVBoxLayout(this); + pLayout->setSpacing(0); + pLayout->setContentsMargins(0, 0, 0, 0); + pLayout->addWidget(m_pTabCtrl); - MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); - pMainWindow->actSearchFindInModel->setEnabled(true); - connect(pMainWindow->actSearchFindInModel, SIGNAL(triggered(bool)), this, SLOT(onSearchFindInModel())); + MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); + pMainWindow->actSearchFindInModel->setEnabled(true); + connect(pMainWindow->actSearchFindInModel, SIGNAL(triggered(bool)), this, SLOT(onSearchFindInModel())); } View::~View() { - MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); - pMainWindow->actSearchFindInModel->setEnabled(false); - disconnect(pMainWindow->actSearchFindInModel, SIGNAL(triggered(bool)), this, SLOT(onSearchFindInModel())); + MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); + pMainWindow->actSearchFindInModel->setEnabled(false); + disconnect(pMainWindow->actSearchFindInModel, SIGNAL(triggered(bool)), this, SLOT(onSearchFindInModel())); } void View::setModel(Model* pModel) { - ASSERT(m_pModel != pModel); - m_pModel = pModel; + ASSERT(m_pModel != pModel); + m_pModel = pModel; } void View::closeEvent(QCloseEvent* event) { - if (m_pModel) - { - if (m_pModel->closeModel()) - { - event->accept(); - } - else - { - event->ignore(); - } - } + if (m_pModel) + { + if (m_pModel->closeModel()) + { + event->accept(); + } + else + { + event->ignore(); + } + } } TabCtrl& View::getTab() { - return *m_pTabCtrl; + return *m_pTabCtrl; } void View::onSearchFindInModel() { - m_findSettings.what = m_pTabCtrl->getCurrentEdit()->getWordForFind(); + m_findSettings.what = m_pTabCtrl->getCurrentEdit()->getWordForFind(); - if (!m_pFindDialog) - { - m_pFindDialog = new FindDialog( - this, - boost::bind(&View::onFindDlgFind, this, _1), - boost::bind(&View::onFindDlgClose, this) - ); - } + if (!m_pFindDialog) + { + m_pFindDialog = new FindDialog( + this, + boost::bind(&View::onFindDlgFind, this, _1), + boost::bind(&View::onFindDlgClose, this) + ); + } - m_pFindDialog->setSettings(m_findSettings); - m_pFindDialog->show(); - m_pFindDialog->raise(); - m_pFindDialog->activateWindow(); + m_pFindDialog->setSettings(m_findSettings); + m_pFindDialog->show(); + m_pFindDialog->raise(); + m_pFindDialog->activateWindow(); } void View::onFindDlgFind(const FindDialog::Settings& settings) { - m_findSettings = settings; - onSearchFindAll(); + m_findSettings = settings; + onSearchFindAll(); } void View::onFindDlgClose() { - m_pFindDialog = NULL; + m_pFindDialog = NULL; } void View::onSearchFindAll() { - g_pApp->getIMainWnd()->getDockFind().clear(); - g_pApp->getIMainWnd()->getDockFind().raise(); - QString findStr = m_findSettings.what; - bool bMatchCase = m_findSettings.matchCase; - bool bMatchWholeWord = m_findSettings.matchWholeWord; - g_pApp->getIMainWnd()->getDockFind().getContext().setKeyword(findStr, bMatchCase); - g_pApp->getIMainWnd()->getDockFind().appendString(QString("Поиск '%1'...\r\n").arg(findStr)); - int count = 0; - for (int i = 0; i < m_pTabCtrl->count(); i++) - { - editor::Model* pEdit = m_pTabCtrl->getItemEdit(i); - int pos = 0; - int line = 0; - while (pos != -1) - { - pos = pEdit->findPos(findStr, line, bMatchCase, bMatchWholeWord); - if (pos != -1) - { - int endPos = pEdit->isEndOfWord(pos); - ASSERT(endPos != -1); - line = pEdit->getLineFromPosition(pos); - g_pApp->getIMainWnd()->getDockFind().appendString( - QString::fromStdString(pEdit->getLine(line)), - m_pTabCtrl->indexToType(i), - line, - endPos - pEdit->getPositionFromLine(line) - ); - line++; - count++; - } - } - } - m_pFindDialog = NULL; + g_pApp->getIMainWnd()->getDockFind().clear(); + g_pApp->getIMainWnd()->getDockFind().raise(); + QString findStr = m_findSettings.what; + bool bMatchCase = m_findSettings.matchCase; + bool bMatchWholeWord = m_findSettings.matchWholeWord; + g_pApp->getIMainWnd()->getDockFind().getContext().setKeyword(findStr, bMatchCase); + g_pApp->getIMainWnd()->getDockFind().appendString(QString("Поиск '%1'...\r\n").arg(findStr)); + int count = 0; + for (int i = 0; i < m_pTabCtrl->count(); i++) + { + editor::Model* pEdit = m_pTabCtrl->getItemEdit(i); + int pos = 0; + int line = 0; + while (pos != -1) + { + pos = pEdit->findPos(findStr, line, bMatchCase, bMatchWholeWord); + if (pos != -1) + { + int endPos = pEdit->isEndOfWord(pos); + ASSERT(endPos != -1); + line = pEdit->getLineFromPosition(pos); + g_pApp->getIMainWnd()->getDockFind().appendString( + QString::fromStdString(pEdit->getLine(line)), + m_pTabCtrl->indexToType(i), + line, + endPos - pEdit->getPositionFromLine(line) + ); + line++; + count++; + } + } + } + m_pFindDialog = NULL; - QString s = count - ? QString(QString("'%1' раз было найдено.\r\n").arg(count)) - : QString(QString("Не получилось найти строчку '%1'.\r\n").arg(findStr)); - g_pApp->getIMainWnd()->getDockFind().appendString(s); + QString s = count + ? QString(QString("'%1' раз было найдено.\r\n").arg(count)) + : QString(QString("Не получилось найти строчку '%1'.\r\n").arg(findStr)); + g_pApp->getIMainWnd()->getDockFind().appendString(s); } diff --git a/app/rdo_studio/src/model/model_view.h b/app/rdo_studio/src/model/model_view.h index eed8f54c4..a6a012e67 100644 --- a/app/rdo_studio/src/model/model_view.h +++ b/app/rdo_studio/src/model/model_view.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_MODEL_VIEW_H_ -#define _RDO_STUDIO_MODEL_VIEW_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -19,32 +18,30 @@ class View: public QWidget Q_OBJECT public: - View(QWidget* pParent); - virtual ~View(); + View(QWidget* pParent); + virtual ~View(); - void setModel(Model* pModel); + void setModel(Model* pModel); - TabCtrl& getTab(); + TabCtrl& getTab(); private: - typedef QWidget parent_type; + typedef QWidget parent_type; - FindDialog* m_pFindDialog; - FindDialog::Settings m_findSettings; - TabCtrl* m_pTabCtrl; - Model* m_pModel; + FindDialog* m_pFindDialog; + FindDialog::Settings m_findSettings; + TabCtrl* m_pTabCtrl; + Model* m_pModel; - void closeEvent(QCloseEvent* event); + void closeEvent(QCloseEvent* event); - void onFindDlgFind(const FindDialog::Settings& settings); - void onFindDlgClose(); + void onFindDlgFind(const FindDialog::Settings& settings); + void onFindDlgClose(); - void onSearchFindAll(); + void onSearchFindAll(); private slots: - void onSearchFindInModel(); + void onSearchFindInModel(); }; }}} // namespace rdo::gui::model - -#endif // RDOSTUDIOMODELVIEW_H diff --git a/app/rdo_studio/src/plugins/plugin_info.cpp b/app/rdo_studio/src/plugins/plugin_info.cpp index d3b965b6c..a4115163c 100644 --- a/app/rdo_studio/src/plugins/plugin_info.cpp +++ b/app/rdo_studio/src/plugins/plugin_info.cpp @@ -6,15 +6,15 @@ // -------------------------------------------------------------------------------- PluginInfo::PluginInfo(const QString& name, QPluginLoader* loader, bool autoload, - const QUuid& GUID, const QString& author, const QString& version, int state) - : pluginName (name) - , pluginLoader (loader) - , pluginAutoload(autoload) - , pluginGUID (GUID) - , pluginAuthor (author) - , pluginVersion (version) - , pluginState (state) - , pluginIsActive(false) + const QUuid& GUID, const QString& author, const QString& version, PluginInfo::State state) + : pluginName (name) + , pluginLoader (loader) + , pluginAutoload(autoload) + , pluginGUID (GUID) + , pluginAuthor (author) + , pluginVersion (version) + , pluginState (state) + , pluginIsActive(false) {} PluginInfo::~PluginInfo() @@ -22,80 +22,80 @@ PluginInfo::~PluginInfo() const QString& PluginInfo::getName() const { - return pluginName; + return pluginName; } QPluginLoader* PluginInfo::getLoader() { - return pluginLoader; + return pluginLoader; } bool PluginInfo::getAutoload() const { - return pluginAutoload; + return pluginAutoload; } const QUuid& PluginInfo::getGUID() const { - return pluginGUID; + return pluginGUID; } -int PluginInfo::getState() const +PluginInfo::State PluginInfo::getState() const { - return pluginState; + return pluginState; } const QString& PluginInfo::getVersion() const { - return pluginVersion; + return pluginVersion; } const QString& PluginInfo::getAuthor() const { - return pluginAuthor; + return pluginAuthor; } -void PluginInfo::setState(int value) +void PluginInfo::setState(PluginInfo::State value) { - pluginState = value; + pluginState = value; } void PluginInfo::setAutoload(bool value) { - pluginAutoload = value; + pluginAutoload = value; } bool PluginInfo::isActive() const { - return pluginIsActive; + return pluginIsActive; } void PluginInfo::setActive(bool value) { - pluginIsActive = value; + pluginIsActive = value; } bool PluginInfo::pluginSignInfoIsEqual(const PluginInfo& pluginInfo) { - return pluginName == pluginInfo.getName() && - pluginAuthor == pluginInfo.getAuthor() && - pluginVersion == pluginInfo.getVersion(); + return pluginName == pluginInfo.getName() && + pluginAuthor == pluginInfo.getAuthor() && + pluginVersion == pluginInfo.getVersion(); } bool PluginInfo::isAvailable() const { - return !(pluginState == rdo::plugin::Deleted || - pluginState == rdo::plugin::IdOnlyMatched); + return !(pluginState == State::DELETED || + pluginState == State::ID_ONLY_MATCHED); } bool PluginInfo::operator==(const PluginInfo& other) { - return pluginName == other.pluginName && - pluginVersion == other.pluginVersion && - pluginAuthor == other.pluginAuthor && - pluginAutoload == other.pluginAutoload && - pluginIsActive == other.pluginIsActive && - pluginGUID == other.pluginGUID && - pluginState == other.pluginState && - pluginLoader == other.pluginLoader; + return pluginName == other.pluginName && + pluginVersion == other.pluginVersion && + pluginAuthor == other.pluginAuthor && + pluginAutoload == other.pluginAutoload && + pluginIsActive == other.pluginIsActive && + pluginGUID == other.pluginGUID && + pluginState == other.pluginState && + pluginLoader == other.pluginLoader; } diff --git a/app/rdo_studio/src/plugins/plugin_info.h b/app/rdo_studio/src/plugins/plugin_info.h index 2b8dde12f..2afcdccb5 100644 --- a/app/rdo_studio/src/plugins/plugin_info.h +++ b/app/rdo_studio/src/plugins/plugin_info.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_PLUGIN_INFO_H_ -#define _RDO_STUDIO_PLUGIN_INFO_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -16,59 +15,51 @@ class PluginInfo: public rdo::counter_reference { DECLARE_FACTORY(PluginInfo); public: - PluginInfo(const QString& name, QPluginLoader* loader, bool autoload, const QUuid& GUID, - const QString& author, const QString& version, int state); - ~PluginInfo(); - const QString& getName () const; - const QString& getAuthor () const; - const QString& getVersion () const; - bool getAutoload() const; - const QUuid& getGUID () const; - int getState () const; - bool isActive () const; - QPluginLoader* getLoader (); - - void setAutoload(bool value); - void setState (int value); - void setActive (bool value); + enum class State + { + UNIQUE = -52, + ID_ONLY_MATCHED, + EXACT_MATCHED, + DELETED + }; - bool pluginSignInfoIsEqual(const PluginInfo& pluginInfo); - bool isAvailable() const; - bool operator==(const PluginInfo& other); + PluginInfo(const QString& name, QPluginLoader* loader, bool autoload, const QUuid& GUID, + const QString& author, const QString& version, PluginInfo::State state); + ~PluginInfo(); + const QString& getName () const; + const QString& getAuthor () const; + const QString& getVersion () const; + bool getAutoload() const; + const QUuid& getGUID () const; + State getState () const; + bool isActive () const; + QPluginLoader* getLoader (); + + void setAutoload(bool value); + void setState (PluginInfo::State value); + void setActive (bool value); + + bool pluginSignInfoIsEqual(const PluginInfo& pluginInfo); + bool isAvailable() const; + bool operator==(const PluginInfo& other); private: - QString pluginName; - QPluginLoader* pluginLoader; - bool pluginAutoload; - QUuid pluginGUID; - QString pluginAuthor; - QString pluginVersion; - int pluginState; - bool pluginIsActive; + QString pluginName; + QPluginLoader* pluginLoader; + bool pluginAutoload; + QUuid pluginGUID; + QString pluginAuthor; + QString pluginVersion; + State pluginState; + bool pluginIsActive; }; PREDECLARE_POINTER(PluginInfoList); class PluginInfoList - : public rdo::counter_reference - , public std::list -{ - DECLARE_FACTORY(PluginInfo); -}; - -namespace rdo + : public rdo::counter_reference + , public std::list { - namespace plugin - { - enum LoadState - { - Unique = -52, - IdOnlyMatched, - ExactMatched, - Deleted - }; - } + DECLARE_FACTORY(PluginInfo); }; Q_DECLARE_METATYPE(LPPluginInfo) - -#endif // _RDO_STUDIO_PLUGIN_INFO_H_ diff --git a/app/rdo_studio/src/plugins/plugin_interface.h b/app/rdo_studio/src/plugins/plugin_interface.h index 0858439fa..21e3a6c15 100644 --- a/app/rdo_studio/src/plugins/plugin_interface.h +++ b/app/rdo_studio/src/plugins/plugin_interface.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_PLUGIN_INTERFACE_H_ -#define _RDO_STUDIO_PLUGIN_INTERFACE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -13,16 +12,14 @@ class PluginInterface { public: - virtual ~PluginInterface() {} - virtual QUuid getGUID () const = 0; - virtual QString getPluginName() const = 0; - virtual QString getAuthor () const = 0; - virtual QString getVersion () const = 0; + virtual ~PluginInterface() {} + virtual QUuid getGUID () const = 0; + virtual QString getPluginName() const = 0; + virtual QString getAuthor () const = 0; + virtual QString getVersion () const = 0; - virtual void pluginStartAction(QWidget* parent, const std::string& commandLine) = 0; - virtual void pluginStopAction (QWidget* parent) = 0; + virtual void pluginStartAction(QWidget* parent, const std::string& commandLine) = 0; + virtual void pluginStopAction (QWidget* parent) = 0; }; Q_DECLARE_INTERFACE(PluginInterface, "RDO_PLUGIN_INTERFACE"); - -#endif // _RDO_STUDIO_PLUGIN_INTERFACE_H_ diff --git a/app/rdo_studio/src/plugins/plugin_loader.cpp b/app/rdo_studio/src/plugins/plugin_loader.cpp index f339dce24..e6091981e 100644 --- a/app/rdo_studio/src/plugins/plugin_loader.cpp +++ b/app/rdo_studio/src/plugins/plugin_loader.cpp @@ -13,223 +13,223 @@ using namespace rdo::plugin; Loader::Loader() - : m_pPluginsParent(NULL) + : m_pPluginsParent(NULL) {} Loader::~Loader() { - for (const LPPluginInfo& pluginInfo: *m_pMergedPluginInfoList) - { - if (pluginInfo->isActive()) - stopPlugin(pluginInfo); - } + for (const LPPluginInfo& pluginInfo: *m_pMergedPluginInfoList) + { + if (pluginInfo->isActive()) + stopPlugin(pluginInfo); + } } PluginInfoList Loader::getMergedPluginInfoList() const { - PluginInfoList pluginHistory = getPluginsHistory(); - PluginInfoList currentLoadedPlugin = getCurrentPlugins(); - PluginInfoList mergedPlugin; - for (const LPPluginInfo& pluginInfo: currentLoadedPlugin) - { - matchPluginInfo(pluginHistory, pluginInfo); - mergedPlugin.push_back(pluginInfo); - } - for (const LPPluginInfo& pluginInfo: pluginHistory) - { - if (matchPluginInfo(mergedPlugin, pluginInfo) != rdo::plugin::ExactMatched) - { - pluginInfo->setState(rdo::plugin::Deleted); - mergedPlugin.push_back(pluginInfo); - } - } - return mergedPlugin; + PluginInfoList pluginHistory = getPluginsHistory(); + PluginInfoList currentLoadedPlugin = getCurrentPlugins(); + PluginInfoList mergedPlugin; + for (const LPPluginInfo& pluginInfo: currentLoadedPlugin) + { + matchPluginInfo(pluginHistory, pluginInfo); + mergedPlugin.push_back(pluginInfo); + } + for (const LPPluginInfo& pluginInfo: pluginHistory) + { + if (matchPluginInfo(mergedPlugin, pluginInfo) != PluginInfo::State::EXACT_MATCHED) + { + pluginInfo->setState(PluginInfo::State::DELETED); + mergedPlugin.push_back(pluginInfo); + } + } + return mergedPlugin; } PluginInfoList Loader::getPluginsHistory() const { - QSettings settings; - PluginInfoList list; - int size = settings.beginReadArray("plugins"); - for (int i = 0; i < size; ++i) - { - settings.setArrayIndex(i); - QString pluginName = settings.value("pluginName" , "").toString(); - bool pluginAutoLoad = settings.value("pluginAutoLoad", false).toBool(); - QString pluginAuthor = settings.value("pluginAuthor" , "").toString(); - QString pluginVer = settings.value("pluginVer" , "").toString(); - QUuid pluginGUID = settings.value("pluginGUID" , QUuid()).toUuid(); - PluginInfo pluginInfo(pluginName, NULL, pluginAutoLoad, pluginGUID, pluginAuthor, pluginVer, rdo::plugin::Unique); - list.push_back(rdo::Factory::create(pluginInfo)); - } - return list; + QSettings settings; + PluginInfoList list; + int size = settings.beginReadArray("plugins"); + for (int i = 0; i < size; ++i) + { + settings.setArrayIndex(i); + QString pluginName = settings.value("pluginName" , "").toString(); + bool pluginAutoLoad = settings.value("pluginAutoLoad", false).toBool(); + QString pluginAuthor = settings.value("pluginAuthor" , "").toString(); + QString pluginVer = settings.value("pluginVer" , "").toString(); + QUuid pluginGUID = settings.value("pluginGUID" , QUuid()).toUuid(); + PluginInfo pluginInfo(pluginName, NULL, pluginAutoLoad, pluginGUID, pluginAuthor, pluginVer, PluginInfo::State::UNIQUE); + list.push_back(rdo::Factory::create(pluginInfo)); + } + return list; } void Loader::setPluginInfoList(const PluginInfoList& value) const { - QSettings settings; - settings.remove("plugins"); - settings.beginWriteArray("plugins"); - int index = 0; - for (const LPPluginInfo& pluginInfo: value) - { - if (pluginInfo->getState() != rdo::plugin::IdOnlyMatched) - { - settings.setArrayIndex(index); - settings.setValue("pluginName" , pluginInfo->getName()); - settings.setValue("pluginAutoLoad", pluginInfo->getAutoload()); - settings.setValue("pluginGUID" , pluginInfo->getGUID()); - settings.setValue("pluginAuthor" , pluginInfo->getAuthor()); - settings.setValue("pluginVer" , pluginInfo->getVersion()); - index++; - } - } - settings.endArray(); + QSettings settings; + settings.remove("plugins"); + settings.beginWriteArray("plugins"); + int index = 0; + for (const LPPluginInfo& pluginInfo: value) + { + if (pluginInfo->getState() != PluginInfo::State::ID_ONLY_MATCHED) + { + settings.setArrayIndex(index); + settings.setValue("pluginName" , pluginInfo->getName()); + settings.setValue("pluginAutoLoad", pluginInfo->getAutoload()); + settings.setValue("pluginGUID" , pluginInfo->getGUID()); + settings.setValue("pluginAuthor" , pluginInfo->getAuthor()); + settings.setValue("pluginVer" , pluginInfo->getVersion()); + index++; + } + } + settings.endArray(); } PluginInfoList Loader::getCurrentPlugins() const { - PluginInfoList list; - QDir dir(qApp->applicationDirPath()); - if (dir.cd("plugins")) - { - QStringList fileList = getFileList(dir.path()); - for (const QString& filePath: fileList) - { - QPluginLoader* pluginLoader = new QPluginLoader(filePath); - PluginInterface* pluginInterface = loadPlugin(pluginLoader); - if (pluginInterface) - { - PluginInfo pluginInfo = generatePluginInfo(pluginInterface, pluginLoader); - LPPluginInfo pPlgnInfo = rdo::Factory::create(pluginInfo); - pluginLoader->unload(); - if (matchPluginInfo(list, pPlgnInfo) != rdo::plugin::ExactMatched) - { - list.push_back(pPlgnInfo); - } - else - { - delete pluginLoader; - } - } - } - } - return list; + PluginInfoList list; + QDir dir(qApp->applicationDirPath()); + if (dir.cd("plugins")) + { + QStringList fileList = getFileList(dir.path()); + for (const QString& filePath: fileList) + { + QPluginLoader* pluginLoader = new QPluginLoader(filePath); + PluginInterface* pluginInterface = loadPlugin(pluginLoader); + if (pluginInterface) + { + PluginInfo pluginInfo = generatePluginInfo(pluginInterface, pluginLoader); + LPPluginInfo pPlgnInfo = rdo::Factory::create(pluginInfo); + pluginLoader->unload(); + if (matchPluginInfo(list, pPlgnInfo) != PluginInfo::State::EXACT_MATCHED) + { + list.push_back(pPlgnInfo); + } + else + { + delete pluginLoader; + } + } + } + } + return list; } -int Loader::matchPluginInfo(const PluginInfoList& list, const LPPluginInfo& matchingPluginInfo) const +PluginInfo::State Loader::matchPluginInfo(const PluginInfoList& list, const LPPluginInfo& matchingPluginInfo) const { - int pluginState = matchingPluginInfo->getState(); - for (const LPPluginInfo& pluginInfo: list) - { - if (matchingPluginInfo->getGUID() == pluginInfo->getGUID()) - { - if (matchingPluginInfo->pluginSignInfoIsEqual(*pluginInfo)) - { - matchingPluginInfo->setAutoload(pluginInfo->getAutoload()); - pluginState = rdo::plugin::ExactMatched; - break; - } - else - { - pluginState = rdo::plugin::IdOnlyMatched; - } - } - } - matchingPluginInfo->setState(pluginState); - return pluginState; + PluginInfo::State pluginState = matchingPluginInfo->getState(); + for (const LPPluginInfo& pluginInfo: list) + { + if (matchingPluginInfo->getGUID() == pluginInfo->getGUID()) + { + if (matchingPluginInfo->pluginSignInfoIsEqual(*pluginInfo)) + { + matchingPluginInfo->setAutoload(pluginInfo->getAutoload()); + pluginState = PluginInfo::State::EXACT_MATCHED; + break; + } + else + { + pluginState = PluginInfo::State::ID_ONLY_MATCHED; + } + } + } + matchingPluginInfo->setState(pluginState); + return pluginState; } QStringList Loader::getFileList(const QString& startDir) const { - QDir dir(startDir); - QStringList list; - - for (const QString& file: dir.entryList(QDir::Files)) - { - list += dir.absoluteFilePath(file); - } - - for (const QString& subdir: dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) - { - list += getFileList(startDir + "/" + subdir); - } - return list; + QDir dir(startDir); + QStringList list; + + for (const QString& file: dir.entryList(QDir::Files)) + { + list += dir.absoluteFilePath(file); + } + + for (const QString& subdir: dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) + { + list += getFileList(startDir + "/" + subdir); + } + return list; } PluginInterface* Loader::loadPlugin(QPluginLoader* pluginLoader) const { - QObject* plugin = pluginLoader->instance(); - if (plugin) - { - PluginInterface* pluginInterface = qobject_cast(plugin); - return pluginInterface; - } - return NULL; + QObject* plugin = pluginLoader->instance(); + if (plugin) + { + PluginInterface* pluginInterface = qobject_cast(plugin); + return pluginInterface; + } + return NULL; } PluginInfo Loader::generatePluginInfo(PluginInterface* pluginInterface, QPluginLoader* pluginLoader) const { - QString pluginName = pluginInterface->getPluginName(); - QUuid pluginGUID = pluginInterface->getGUID(); - QString pluginAuthor = pluginInterface->getAuthor(); - QString pluginVersion = pluginInterface->getVersion(); - bool pluginAutoload = false; - PluginInfo pluginInfo(pluginName, pluginLoader, pluginAutoload, pluginGUID, pluginAuthor, pluginVersion, rdo::plugin::Unique); - return pluginInfo; + QString pluginName = pluginInterface->getPluginName(); + QUuid pluginGUID = pluginInterface->getGUID(); + QString pluginAuthor = pluginInterface->getAuthor(); + QString pluginVersion = pluginInterface->getVersion(); + bool pluginAutoload = false; + PluginInfo pluginInfo(pluginName, pluginLoader, pluginAutoload, pluginGUID, pluginAuthor, pluginVersion, PluginInfo::State::UNIQUE); + return pluginInfo; } void Loader::stopPlugin(const LPPluginInfo& pluginInfo) { - PluginInterface* pluginInterface = loadPlugin(pluginInfo->getLoader()); - if (pluginInterface && pluginInfo->isActive()) - { - pluginInterface->pluginStopAction(m_pPluginsParent); - pluginInfo->setActive(false); - } + PluginInterface* pluginInterface = loadPlugin(pluginInfo->getLoader()); + if (pluginInterface && pluginInfo->isActive()) + { + pluginInterface->pluginStopAction(m_pPluginsParent); + pluginInfo->setActive(false); + } } void Loader::startPlugin(const LPPluginInfo& pluginInfo, const std::string& commandLine) { - PluginInterface* pluginInterface = loadPlugin(pluginInfo->getLoader()); - if (pluginInterface && !pluginInfo->isActive()) - { - pluginInterface->pluginStartAction(m_pPluginsParent, commandLine); - pluginInfo->setActive(true); - } + PluginInterface* pluginInterface = loadPlugin(pluginInfo->getLoader()); + if (pluginInterface && !pluginInfo->isActive()) + { + pluginInterface->pluginStartAction(m_pPluginsParent, commandLine); + pluginInfo->setActive(true); + } } void Loader::autoStartPlugins(const std::map& options) { - int index = 0; - for (const LPPluginInfo& pluginInfo: *m_pMergedPluginInfoList) - { - if (options.count(index)) - { - startPlugin(pluginInfo, options.at(index)); - } - else - { - if (pluginInfo->getAutoload() && pluginInfo->isAvailable()) - { - startPlugin(pluginInfo); - } - } - - index++; - } + int index = 0; + for (const LPPluginInfo& pluginInfo: *m_pMergedPluginInfoList) + { + if (options.count(index)) + { + startPlugin(pluginInfo, options.at(index)); + } + else + { + if (pluginInfo->getAutoload() && pluginInfo->isAvailable()) + { + startPlugin(pluginInfo); + } + } + + index++; + } } const LPPluginInfoList& Loader::getPluginInfoList() const { - return m_pMergedPluginInfoList; + return m_pMergedPluginInfoList; } void Loader::init(QWidget* pParent) { - m_pMergedPluginInfoList = rdo::Factory::create(getMergedPluginInfoList()); + m_pMergedPluginInfoList = rdo::Factory::create(getMergedPluginInfoList()); - ASSERT(!m_pPluginsParent); - ASSERT(pParent); - m_pPluginsParent = pParent; + ASSERT(!m_pPluginsParent); + ASSERT(pParent); + m_pPluginsParent = pParent; } diff --git a/app/rdo_studio/src/plugins/plugin_loader.h b/app/rdo_studio/src/plugins/plugin_loader.h index 9963893e9..41547a13f 100644 --- a/app/rdo_studio/src/plugins/plugin_loader.h +++ b/app/rdo_studio/src/plugins/plugin_loader.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_PLUGIN_LOADER_H_ -#define _RDO_STUDIO_PLUGIN_LOADER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,37 +8,35 @@ namespace rdo { - namespace plugin - { - class Loader; - }; + namespace plugin + { + class Loader; + }; }; class rdo::plugin::Loader { public: - Loader (); - virtual ~Loader(); + Loader (); + virtual ~Loader(); - const LPPluginInfoList& getPluginInfoList () const; - void stopPlugin (const LPPluginInfo& pluginInfo); - void startPlugin (const LPPluginInfo& pluginInfo, const std::string& commandLine = ""); - void autoStartPlugins(const std::map& options); - void setPluginInfoList (const PluginInfoList& value) const; - void init (QWidget* pParent); + const LPPluginInfoList& getPluginInfoList () const; + void stopPlugin (const LPPluginInfo& pluginInfo); + void startPlugin (const LPPluginInfo& pluginInfo, const std::string& commandLine = ""); + void autoStartPlugins(const std::map& options); + void setPluginInfoList (const PluginInfoList& value) const; + void init (QWidget* pParent); private: - LPPluginInfoList m_pMergedPluginInfoList; - QWidget* m_pPluginsParent; + LPPluginInfoList m_pMergedPluginInfoList; + QWidget* m_pPluginsParent; - QStringList getFileList (const QString& startDir) const; - PluginInfoList getMergedPluginInfoList() const; - PluginInfoList getPluginsHistory () const; - PluginInfoList getCurrentPlugins () const; + QStringList getFileList (const QString& startDir) const; + PluginInfoList getMergedPluginInfoList() const; + PluginInfoList getPluginsHistory () const; + PluginInfoList getCurrentPlugins () const; - PluginInterface* loadPlugin (QPluginLoader* pluginLoader) const; - PluginInfo generatePluginInfo (PluginInterface* pluginInterface, QPluginLoader* pluginLoader) const; - int matchPluginInfo (const PluginInfoList& list, const LPPluginInfo& pluginInfo) const; + PluginInterface* loadPlugin (QPluginLoader* pluginLoader) const; + PluginInfo generatePluginInfo (PluginInterface* pluginInterface, QPluginLoader* pluginLoader) const; + PluginInfo::State matchPluginInfo (const PluginInfoList& list, const LPPluginInfo& pluginInfo) const; }; - -#endif // _RDO_STUDIO_PLUGIN_LOADER_H_ diff --git a/app/rdo_studio/src/shared_object_service.h b/app/rdo_studio/src/shared_object_service.h index 9a51c37bb..4047f95ac 100644 --- a/app/rdo_studio/src/shared_object_service.h +++ b/app/rdo_studio/src/shared_object_service.h @@ -9,19 +9,19 @@ class MainWindow; namespace rdo { - namespace gui - { - namespace tracer - { - class Tracer; - } + namespace gui + { + namespace tracer + { + class Tracer; + } - struct ISharedObjectService - { - virtual RDOKernel* getKernel () const = 0; - virtual MainWindow* getMainWndUI() const = 0; - virtual rdo::gui::tracer::Tracer* getTracer () const = 0; - }; + struct ISharedObjectService + { + virtual RDOKernel* getKernel () const = 0; + virtual MainWindow* getMainWndUI() const = 0; + virtual rdo::gui::tracer::Tracer* getTracer () const = 0; + }; - } // namespace gui + } // namespace gui } // namespace gui diff --git a/app/rdo_studio/src/status_bar.cpp b/app/rdo_studio/src/status_bar.cpp index b448e764a..5d3260a44 100644 --- a/app/rdo_studio/src/status_bar.cpp +++ b/app/rdo_studio/src/status_bar.cpp @@ -9,35 +9,35 @@ // -------------------------------------------------------------------------------- StatusBar::StatusBar(QMainWindow* pParent) - : m_pParent(pParent) + : m_pParent(pParent) { - m_pSBCoord = new QLabel(m_pParent); - m_pSBModify = new QLabel(m_pParent); - m_pSBOverwrite = new QLabel(m_pParent); - m_pSBModelTime = new QLabel(m_pParent); - m_pSBModelRuntype = new QLabel(m_pParent); - m_pSBModelSpeed = new QLabel(m_pParent); - m_pSBModelShowRate = new QLabel(m_pParent); - - m_pParent->statusBar()->addWidget(m_pSBCoord, 5); - m_pParent->statusBar()->addWidget(m_pSBModify, 5); - m_pParent->statusBar()->addWidget(m_pSBOverwrite, 3); - m_pParent->statusBar()->addWidget(m_pSBModelTime, 5); - m_pParent->statusBar()->addWidget(m_pSBModelRuntype, 7); - m_pParent->statusBar()->addWidget(m_pSBModelSpeed, 5); - m_pParent->statusBar()->addWidget(m_pSBModelShowRate, 7); - - m_pProgressBar = new QProgressBar(m_pParent); - m_pProgressBar->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - m_pProgressBar->setMaximumSize(QWIDGETSIZE_MAX, 15); - m_pProgressBar->setVisible(false); - - m_pProgressBarFakeWidget = new QWidget(m_pParent); - m_pProgressBarFakeWidget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - m_pProgressBarFakeWidget->setMaximumSize(QWIDGETSIZE_MAX, 15); - m_pProgressBarFakeWidget->setVisible(true); - - m_pParent->statusBar()->addWidget(m_pProgressBarFakeWidget, 7); + m_pSBCoord = new QLabel(m_pParent); + m_pSBModify = new QLabel(m_pParent); + m_pSBOverwrite = new QLabel(m_pParent); + m_pSBModelTime = new QLabel(m_pParent); + m_pSBModelRuntype = new QLabel(m_pParent); + m_pSBModelSpeed = new QLabel(m_pParent); + m_pSBModelShowRate = new QLabel(m_pParent); + + m_pParent->statusBar()->addWidget(m_pSBCoord, 5); + m_pParent->statusBar()->addWidget(m_pSBModify, 5); + m_pParent->statusBar()->addWidget(m_pSBOverwrite, 3); + m_pParent->statusBar()->addWidget(m_pSBModelTime, 5); + m_pParent->statusBar()->addWidget(m_pSBModelRuntype, 7); + m_pParent->statusBar()->addWidget(m_pSBModelSpeed, 5); + m_pParent->statusBar()->addWidget(m_pSBModelShowRate, 7); + + m_pProgressBar = new QProgressBar(m_pParent); + m_pProgressBar->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); + m_pProgressBar->setMaximumSize(QWIDGETSIZE_MAX, 15); + m_pProgressBar->setVisible(false); + + m_pProgressBarFakeWidget = new QWidget(m_pParent); + m_pProgressBarFakeWidget->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); + m_pProgressBarFakeWidget->setMaximumSize(QWIDGETSIZE_MAX, 15); + m_pProgressBarFakeWidget->setVisible(true); + + m_pParent->statusBar()->addWidget(m_pProgressBarFakeWidget, 7); } StatusBar::~StatusBar() @@ -45,69 +45,69 @@ StatusBar::~StatusBar() void StatusBar::beginProgress(int lower, int upper) { - m_pProgressBar->setRange(lower, upper); - m_pProgressBar->setValue(lower); - m_pProgressBar->setVisible(true); + m_pProgressBar->setRange(lower, upper); + m_pProgressBar->setValue(lower); + m_pProgressBar->setVisible(true); - m_pParent->statusBar()->removeWidget(m_pProgressBarFakeWidget); - m_pParent->statusBar()->addWidget(m_pProgressBar, 7); + m_pParent->statusBar()->removeWidget(m_pProgressBarFakeWidget); + m_pParent->statusBar()->addWidget(m_pProgressBar, 7); - m_pProgressBarFakeWidget->setVisible(false); + m_pProgressBarFakeWidget->setVisible(false); } void StatusBar::stepProgress() { - m_pProgressBar->setValue(m_pProgressBar->value() + 1); + m_pProgressBar->setValue(m_pProgressBar->value() + 1); } void StatusBar::endProgress() { - m_pProgressBarFakeWidget->setVisible(true); + m_pProgressBarFakeWidget->setVisible(true); - m_pParent->statusBar()->removeWidget(m_pProgressBar); - m_pParent->statusBar()->addWidget(m_pProgressBarFakeWidget, 7); + m_pParent->statusBar()->removeWidget(m_pProgressBar); + m_pParent->statusBar()->addWidget(m_pProgressBarFakeWidget, 7); - m_pProgressBar->setVisible(false); + m_pProgressBar->setVisible(false); } template <> QLabel* StatusBar::getLabel(StatusBarType) { - return m_pSBCoord; + return m_pSBCoord; } template <> QLabel* StatusBar::getLabel(StatusBarType) { - return m_pSBModify; + return m_pSBModify; } template <> QLabel* StatusBar::getLabel(StatusBarType) { - return m_pSBOverwrite; + return m_pSBOverwrite; } template <> QLabel* StatusBar::getLabel(StatusBarType) { - return m_pSBModelTime; + return m_pSBModelTime; } template <> QLabel* StatusBar::getLabel(StatusBarType) { - return m_pSBModelRuntype; + return m_pSBModelRuntype; } template <> QLabel* StatusBar::getLabel(StatusBarType) { - return m_pSBModelSpeed; + return m_pSBModelSpeed; } template <> QLabel* StatusBar::getLabel(StatusBarType) { - return m_pSBModelShowRate; + return m_pSBModelShowRate; } diff --git a/app/rdo_studio/src/status_bar.h b/app/rdo_studio/src/status_bar.h index 4e42c2c09..0b4c5b6ce 100644 --- a/app/rdo_studio/src/status_bar.h +++ b/app/rdo_studio/src/status_bar.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_STATUS_BAR_H_ -#define _RDO_STUDIO_STATUS_BAR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -17,56 +16,54 @@ class StatusBar: public rdo::counter_reference { DECLARE_FACTORY(StatusBar) public: - enum Type - { - SB_COORD, - SB_MODIFY, - SB_OVERWRITE, - SB_MODEL_TIME, - SB_MODEL_RUNTYPE, - SB_MODEL_SPEED, - SB_MODEL_SHOWRATE - }; + enum Type + { + SB_COORD, + SB_MODIFY, + SB_OVERWRITE, + SB_MODEL_TIME, + SB_MODEL_RUNTYPE, + SB_MODEL_SPEED, + SB_MODEL_SHOWRATE + }; - template - void update(const QString& message) - { - update(StatusBarType(), message); - } + template + void update(const QString& message) + { + update(StatusBarType(), message); + } - void beginProgress(int lower, int upper); - void stepProgress(); - void endProgress(); + void beginProgress(int lower, int upper); + void stepProgress(); + void endProgress(); private: - StatusBar(QMainWindow* pParent); - virtual ~StatusBar(); + StatusBar(QMainWindow* pParent); + virtual ~StatusBar(); - QMainWindow* m_pParent; - QLabel* m_pSBCoord; - QLabel* m_pSBModify; - QLabel* m_pSBOverwrite; - QLabel* m_pSBModelTime; - QLabel* m_pSBModelRuntype; - QLabel* m_pSBModelSpeed; - QLabel* m_pSBModelShowRate; - QProgressBar* m_pProgressBar; - QWidget* m_pProgressBarFakeWidget; + QMainWindow* m_pParent; + QLabel* m_pSBCoord; + QLabel* m_pSBModify; + QLabel* m_pSBOverwrite; + QLabel* m_pSBModelTime; + QLabel* m_pSBModelRuntype; + QLabel* m_pSBModelSpeed; + QLabel* m_pSBModelShowRate; + QProgressBar* m_pProgressBar; + QWidget* m_pProgressBarFakeWidget; - template - struct StatusBarType: boost::mpl::integral_c - {}; + template + struct StatusBarType: boost::mpl::integral_c + {}; - template - void update(StatusBarType statusBar, const QString& message) - { - QLabel* pLabel = getLabel(statusBar); - ASSERT(pLabel); - pLabel->setText(message); - } + template + void update(StatusBarType statusBar, const QString& message) + { + QLabel* pLabel = getLabel(statusBar); + ASSERT(pLabel); + pLabel->setText(message); + } - template - QLabel* getLabel(StatusBarType); + template + QLabel* getLabel(StatusBarType); }; - -#endif // _RDO_STUDIO_STATUS_BAR_H_ diff --git a/app/rdo_studio/src/style.cpp b/app/rdo_studio/src/style.cpp index caf5d6fa1..da6a2ad68 100644 --- a/app/rdo_studio/src/style.cpp +++ b/app/rdo_studio/src/style.cpp @@ -14,171 +14,169 @@ namespace rdo { namespace gui { namespace style { // -------------------- StyleFont // -------------------------------------------------------------------------------- StyleFont::StyleFont() - : size(10) + : size(10) { #if defined(Q_OS_WIN) - name = "Courier New"; - size = 10; + name = "Courier New"; + size = 10; #elif defined(Q_OS_LINUX) - name = "Courier"; - size = 11; + name = "Courier"; + size = 11; #else - STATIC_ASSERT(UndefinedOS); + STATIC_ASSERT(UndefinedOS); #endif } StyleFont::~StyleFont() {} -StyleFont& StyleFont::operator =( const StyleFont& font ) +StyleFont& StyleFont::operator =(const StyleFont& font) { - name = font.name; - size = font.size; + name = font.name; + size = font.size; - return *this; + return *this; } -bool StyleFont::operator ==( const StyleFont& font ) const +bool StyleFont::operator ==(const StyleFont& font) const { - return name == font.name && - size == font.size; + return name == font.name && + size == font.size; } -bool StyleFont::operator !=( const StyleFont& font ) const +bool StyleFont::operator !=(const StyleFont& font) const { - return !(*this == font); + return !(*this == font); } void StyleFont::load(QSettings& settings) { - settings >> *this; + settings >> *this; } void StyleFont::save(QSettings& settings) const { - settings << *this; + settings << *this; } StyleFont StyleFont::getDefaultFont() { - StyleFont font; - return font; + StyleFont font; + return font; } StyleFont StyleFont::getClassicFont() { - StyleFont font; - font.name = "Fixedsys"; + StyleFont font; + font.name = "Fixedsys"; - return font; + return font; } StyleFont StyleFont::getTracerLogFont() { - StyleFont font; - font.name = "Courier"; + StyleFont font; + font.name = "Courier"; - return font; + return font; } StyleFont StyleFont::getChartViewFont() { - StyleFont font; - font.name = "Tahoma"; + StyleFont font; + font.name = "Tahoma"; - return font; + return font; } StyleFont StyleFont::getFrameFont() { - StyleFont font; + StyleFont font; - font.name = "Verdana"; - font.size = 8; + font.name = "Verdana"; + font.size = 8; - return font; + return font; } QSettings& operator<< (QSettings& settings, const StyleFont& font) { - settings.setValue("name", QString::fromStdString(font.name)); - settings.setValue("size", font.size); - return settings; + settings.setValue("name", QString::fromStdString(font.name)); + settings.setValue("size", font.size); + return settings; } QSettings& operator>> (QSettings& settings, StyleFont& font) { - font.name = settings.value("name", QString::fromStdString(font.name)).toString().toStdString(); - font.size = settings.value("size", font.size).toInt(); - return settings; + font.name = settings.value("name", QString::fromStdString(font.name)).toString().toStdString(); + font.size = settings.value("size", font.size).toInt(); + return settings; } // -------------------------------------------------------------------------------- // -------------------- StyleBase // -------------------------------------------------------------------------------- StyleBase::StyleBase() - : font() { - defaultColor = QColor( 0x00, 0x00, 0x00 ); - backgroundColor = QColor( 0xFF, 0xFF, 0xFF ); - defaultStyle = StyleFont::NONE; + defaultColor = QColor(0x00, 0x00, 0x00); + backgroundColor = QColor(0xFF, 0xFF, 0xFF); + defaultStyle = StyleFont::Style::NONE; } StyleBase::~StyleBase() -{ -} +{} -StyleBase& StyleBase::operator =( const StyleBase& style ) +StyleBase& StyleBase::operator =(const StyleBase& style) { - font = style.font; - defaultStyle = style.defaultStyle; - defaultColor = style.defaultColor; - backgroundColor = style.backgroundColor; - return *this; + font = style.font; + defaultStyle = style.defaultStyle; + defaultColor = style.defaultColor; + backgroundColor = style.backgroundColor; + return *this; } -bool StyleBase::operator ==( const StyleBase& style ) const +bool StyleBase::operator ==(const StyleBase& style) const { - return - font == style.font && - defaultColor == style.defaultColor && - backgroundColor == style.backgroundColor && - defaultStyle == style.defaultStyle; + return + font == style.font && + defaultColor == style.defaultColor && + backgroundColor == style.backgroundColor && + defaultStyle == style.defaultStyle; } -bool StyleBase::operator !=( const StyleBase& style ) const +bool StyleBase::operator !=(const StyleBase& style) const { - return !(*this == style); + return !(*this == style); } QSettings& operator<< (QSettings& settings, const StyleBase& style) { - settings.beginGroup("font"); - settings << style.font; - settings.endGroup(); + settings.beginGroup("font"); + settings << style.font; + settings.endGroup(); - settings.beginGroup("theme"); - settings.setValue("default_color", style.defaultColor.name()); - settings.setValue("background_color", style.backgroundColor.name()); - settings.setValue("default_style", style.defaultStyle); - settings.endGroup(); + settings.beginGroup("theme"); + settings.setValue("default_color", style.defaultColor.name()); + settings.setValue("background_color", style.backgroundColor.name()); + settings.setValue("default_style", static_cast(style.defaultStyle)); + settings.endGroup(); - return settings; + return settings; } QSettings& operator>> (QSettings& settings, StyleBase& style) { - settings.beginGroup("font"); - settings >> style.font; - settings.endGroup(); + settings.beginGroup("font"); + settings >> style.font; + settings.endGroup(); - settings.beginGroup("theme"); - style.defaultColor = QColor(settings.value("default_color", style.defaultColor.name()).toString()); - style.backgroundColor = QColor(settings.value("background_color", style.backgroundColor.name()).toString()); - style.defaultStyle = static_cast(settings.value("default_style", style.defaultStyle).toInt()); - settings.endGroup(); + settings.beginGroup("theme"); + style.defaultColor = QColor(settings.value("default_color", style.defaultColor.name()).toString()); + style.backgroundColor = QColor(settings.value("background_color", style.backgroundColor.name()).toString()); + style.defaultStyle = static_cast(settings.value("default_style", static_cast(style.defaultStyle)).toInt()); + settings.endGroup(); - return settings; + return settings; } }}} // namespace rdo::gui::style diff --git a/app/rdo_studio/src/style.h b/app/rdo_studio/src/style.h index 98ec8a07e..07b207b16 100644 --- a/app/rdo_studio/src/style.h +++ b/app/rdo_studio/src/style.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_STYLE_H_ -#define _RDO_STUDIO_STYLE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -19,26 +18,32 @@ namespace rdo { namespace gui { namespace style { class StyleFont { public: - StyleFont(); - virtual ~StyleFont(); - - StyleFont& operator =(const StyleFont& font); - bool operator ==(const StyleFont& font) const; - bool operator !=(const StyleFont& font) const; - - void load(QSettings& settings); - void save(QSettings& settings) const; - - enum style { NONE = 0x00, BOLD = 0x01, ITALIC = 0x02, UNDERLINE = 0x04 }; - - std::string name; - int size; - - static StyleFont getDefaultFont(); - static StyleFont getClassicFont(); - static StyleFont getTracerLogFont(); - static StyleFont getChartViewFont(); - static StyleFont getFrameFont(); + StyleFont(); + virtual ~StyleFont(); + + StyleFont& operator =(const StyleFont& font); + bool operator ==(const StyleFont& font) const; + bool operator !=(const StyleFont& font) const; + + void load(QSettings& settings); + void save(QSettings& settings) const; + + enum class Style + { + NONE = 0x00, + BOLD = 0x01, + ITALIC = 0x02, + UNDERLINE = 0x04 + }; + + std::string name; + int size; + + static StyleFont getDefaultFont(); + static StyleFont getClassicFont(); + static StyleFont getTracerLogFont(); + static StyleFont getChartViewFont(); + static StyleFont getFrameFont(); }; QSettings& operator<< (QSettings& settings, const StyleFont& font); @@ -51,23 +56,21 @@ PREDECLARE_POINTER(StyleBase); class StyleBase: public rdo::counter_reference { public: - StyleBase(); - ~StyleBase(); + StyleBase(); + ~StyleBase(); - StyleBase& operator =(const StyleBase& style); - bool operator ==(const StyleBase& style) const; - bool operator !=(const StyleBase& style) const; + StyleBase& operator =(const StyleBase& style); + bool operator ==(const StyleBase& style) const; + bool operator !=(const StyleBase& style) const; - StyleFont font; - StyleFont::style defaultStyle; + StyleFont font; + StyleFont::Style defaultStyle; - QColor defaultColor; - QColor backgroundColor; + QColor defaultColor; + QColor backgroundColor; }; QSettings& operator<< (QSettings& settings, const StyleBase& style); QSettings& operator>> (QSettings& settings, StyleBase& style); }}} // namespace rdo::gui::style - -#endif // _RDO_STUDIO_STYLE_H_ diff --git a/app/rdo_studio/src/thread.cpp b/app/rdo_studio/src/thread.cpp deleted file mode 100644 index 1998a3d46..000000000 --- a/app/rdo_studio/src/thread.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// ---------------------------------------------------------------------------- PCH -#include "app/rdo_studio/pch/application_pch.h" -// ----------------------------------------------------------------------- INCLUDES -// ----------------------------------------------------------------------- SYNOPSIS -#include "app/rdo_studio/src/thread.h" -#include "app/rdo_studio/src/model/model.h" -#include "app/rdo_studio/src/tracer/tracer.h" -// -------------------------------------------------------------------------------- - -#ifdef RDO_MT -// -------------------------------------------------------------------------------- -// -------------------- ThreadStudio -// -------------------------------------------------------------------------------- -ThreadStudio::ThreadStudio(): RDOThread( "ThreadStudio", RDOThread::threadFun ) -{ - after_constructor(); -} - -void ThreadStudio::proc( RDOMessageInfo& msg ) -{ - switch ( msg.message ) { - case RT_STUDIO_MODEL_NEW : - case RT_STUDIO_MODEL_OPEN : - case RT_STUDIO_MODEL_SAVE : - case RT_STUDIO_MODEL_CLOSE: - case RT_STUDIO_MODEL_BUILD: - case RT_STUDIO_MODEL_RUN : - case RT_STUDIO_MODEL_STOP : - { - broadcastMessage( msg.message, msg.param, true ); - break; - } - } -} - -// -------------------------------------------------------------------------------- -// -------------------- ThreadStudioGUI -// -------------------------------------------------------------------------------- -ThreadStudioGUI::ThreadStudioGUI(): RDOKernelGUI( "ThreadStudioGUI" ) -{ - after_constructor(); -} -#endif diff --git a/app/rdo_studio/src/thread.h b/app/rdo_studio/src/thread.h deleted file mode 100644 index 62cc8c1c1..000000000 --- a/app/rdo_studio/src/thread.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef _RDO_STUDIO_THREAD_H_ -#define _RDO_STUDIO_THREAD_H_ - -// ----------------------------------------------------------------------- INCLUDES -// ----------------------------------------------------------------------- SYNOPSIS -#include "kernel/rdothread.h" -#include "kernel/rdokernel.h" -// -------------------------------------------------------------------------------- - -#ifdef RDO_MT -// -------------------------------------------------------------------------------- -// -------------------- ThreadStudio -// -------------------------------------------------------------------------------- -class ThreadStudio: public RDOThread -{ -friend class Application; -protected: - ThreadStudio(); - virtual ~ThreadStudio() {}; // Чтобы нельзя было удалить через delete - virtual void proc( RDOMessageInfo& msg ); -}; - -// -------------------------------------------------------------------------------- -// -------------------- ThreadStudioGUI -// -------------------------------------------------------------------------------- -class ThreadStudioGUI: public RDOKernelGUI -{ -friend class Application; -protected: - ThreadStudioGUI(); - virtual ~ThreadStudioGUI() {}; // Чтобы нельзя было удалить через delete -}; -#endif - -#endif // _RDO_STUDIO_THREAD_H_ diff --git a/app/rdo_studio/src/tracer/chart/chart_doc.cpp b/app/rdo_studio/src/tracer/chart/chart_doc.cpp index 3a182c0a6..04dac4a02 100644 --- a/app/rdo_studio/src/tracer/chart/chart_doc.cpp +++ b/app/rdo_studio/src/tracer/chart/chart_doc.cpp @@ -20,341 +20,341 @@ using namespace rdo::gui::tracer; std::size_t ChartDoc::s_titleIndex = 0; ChartDoc::ChartDoc(const bool preview) - : m_minTimeOffset(1.7E+308) - , m_ticksCount(0) - , m_previewMode(preview) + : m_minTimeOffset(1.7E+308) + , m_ticksCount(0) + , m_previewMode(preview) { - if (!m_previewMode) - { - g_pTracer->addChart(this); - } + if (!m_previewMode) + { + g_pTracer->addChart(this); + } } ChartDoc::~ChartDoc() { - for (std::vector::iterator it = m_serieList.begin(); it != m_serieList.end(); it++) - { - (*it)->getSerie()->removeFromDoc(this); - } - if (!m_previewMode) - { - g_pTracer->removeChart(this); - } + for (std::vector::iterator it = m_serieList.begin(); it != m_serieList.end(); it++) + { + (*it)->getSerie()->removeFromDoc(this); + } + if (!m_previewMode) + { + g_pTracer->removeChart(this); + } } const ChartDoc::TimesList& ChartDoc::getTimes() const { - return m_docTimes; + return m_docTimes; } const ChartDoc::SerieList& ChartDoc::getSerieList() const { - return m_serieList; + return m_serieList; } void ChartDoc::attachView(ChartView* pView) { - m_viewList.push_back(pView); + m_viewList.push_back(pView); } ChartView* ChartDoc::getFirstView() { - return m_viewList.empty() ? NULL : m_viewList.front(); + return m_viewList.empty() ? NULL : m_viewList.front(); } void ChartDoc::setStyle(ChartViewStyle* pStyle) { - ASSERT(pStyle); - boost::range::for_each(m_viewList, boost::bind(&ChartView::setStyle, _1, pStyle, true)); + ASSERT(pStyle); + boost::range::for_each(m_viewList, boost::bind(&ChartView::setStyle, _1, pStyle, true)); } void ChartDoc::updateAllViews() { - boost::range::for_each(m_viewList, boost::bind(&ChartView::updateView, _1)); + boost::range::for_each(m_viewList, boost::bind(&ChartView::updateView, _1)); } int ChartDoc::getSerieIndex(ChartSerie* serie) const { - int res = -1; - int index = 0; - for (std::vector::const_iterator it = m_serieList.begin(); it != m_serieList.end(); it++) - { - if (serie == (*it)) - { - res = index; - } - index++; - } - return res; + int res = -1; + int index = 0; + for (std::vector::const_iterator it = m_serieList.begin(); it != m_serieList.end(); it++) + { + if (serie == (*it)) + { + res = index; + } + index++; + } + return res; } void ChartDoc::incTimeEventsCount(Time* time) { - if (!m_docTimes.empty() && m_docTimes.back() == time) - { - m_ticksCount++; - updateChartViews(U_TIME_TICKS); - } + if (!m_docTimes.empty() && m_docTimes.back() == time) + { + m_ticksCount++; + updateChartViews(Update::TIMES); + } } bool ChartDoc::newValueToSerieAdded(Value* val) { - if (m_docTimes.empty()) - { - m_docTimes.push_back(val->getModelTime()); - m_ticksCount += val->getModelTime()->eventCount; - } - else - { - Time* last = m_docTimes.back(); - if (last != val->getModelTime()) - { - m_docTimes.push_back(val->getModelTime()); - m_ticksCount += val->getModelTime()->eventCount; - double off = val->getModelTime()->time - last->time; - if (off < m_minTimeOffset) - { - m_minTimeOffset = off; - } - } - } - updateChartViews(U_NEW_VALUE); - - return true; + if (m_docTimes.empty()) + { + m_docTimes.push_back(val->getModelTime()); + m_ticksCount += val->getModelTime()->eventCount; + } + else + { + Time* last = m_docTimes.back(); + if (last != val->getModelTime()) + { + m_docTimes.push_back(val->getModelTime()); + m_ticksCount += val->getModelTime()->eventCount; + double off = val->getModelTime()->time - last->time; + if (off < m_minTimeOffset) + { + m_minTimeOffset = off; + } + } + } + updateChartViews(Update::NEW_VALUE); + + return true; } int ChartDoc::getMaxMarkerSize() const { - int res = 0; - for (std::vector::const_iterator it = m_serieList.begin(); it != m_serieList.end(); it++) - { - if ((*it)->options().markerNeedDraw && (*it)->options().markerSize > res) - { - res = (*it)->options().markerSize; - } - } - - return res; + int res = 0; + for (std::vector::const_iterator it = m_serieList.begin(); it != m_serieList.end(); it++) + { + if ((*it)->options().markerNeedDraw && (*it)->options().markerSize > res) + { + res = (*it)->options().markerSize; + } + } + + return res; } int ChartDoc::getTicksCount() const { - return m_ticksCount; + return m_ticksCount; } double ChartDoc::getMinTimeOffset() const { - return m_minTimeOffset; + return m_minTimeOffset; } void ChartDoc::addToViews(ChartView* pWidget) { - m_widgetList.push_back(pWidget); + m_widgetList.push_back(pWidget); } void ChartDoc::removeFromViews(ChartView* pWidget) { - std::vector::iterator it = std::find(m_widgetList.begin(), m_widgetList.end(), pWidget); - if (it != m_widgetList.end()) - { - m_widgetList.erase(it); - } + std::vector::iterator it = std::find(m_widgetList.begin(), m_widgetList.end(), pWidget); + if (it != m_widgetList.end()) + { + m_widgetList.erase(it); + } } void ChartDoc::updateChartViews(Update updateType) const { - boost::range::for_each(m_widgetList, boost::bind(&ChartView::onUserUpdateChartView, _1, updateType)); + boost::range::for_each(m_widgetList, boost::bind(&ChartView::onUserUpdateChartView, _1, updateType)); } void ChartDoc::addSerie(const LPSerie& pSerie) { - if (pSerie && !serieExists(pSerie)) - { - ChartSerie* pDocSerie = new ChartSerie(pSerie); - ChartSerie::Options options(pDocSerie->options()); - options.color = selectColor(); - options.markerType = selectMarker(); - pDocSerie->setOptions(options); - m_serieList.push_back(pDocSerie); - m_insertedIt = m_docTimes.begin(); - - if (!m_docTimes.empty() && !pSerie->empty()) - { - TimesList::iterator lastDocIt = m_docTimes.end(); - --lastDocIt; - Serie::ValuesList::const_iterator first_serie = pSerie->begin(); - if ((*first_serie)->getModelTime()->time >= (*lastDocIt)->time) - { - m_insertedIt = m_docTimes.end(); - if ((*first_serie)->getModelTime()->time == (*lastDocIt)->time) - { - m_insertedIt = lastDocIt; - } - } - } - - try - { - //! @todo qt - //g_pApp->BeginWaitCursor(); - - std::for_each(pSerie->begin(), pSerie->end(), boost::bind(&ChartDoc::insertValue, this, _1)); - - //! @todo qt - //g_pApp->EndWaitCursor(); - } - catch (...) - { - //! @todo qt - //g_pApp->EndWaitCursor(); - } - - pSerie->addToDoc(this); - if (m_serieList.size() == 1) - { - ChartView* pView = getFirstView(); - ASSERT(pView); - pView->setYAxis(pDocSerie); - } - updateChartViews(U_NEW_SERIE); - } + if (pSerie && !serieExists(pSerie)) + { + ChartSerie* pDocSerie = new ChartSerie(pSerie); + ChartSerie::Options options(pDocSerie->options()); + options.color = selectColor(); + options.markerType = selectMarker(); + pDocSerie->setOptions(options); + m_serieList.push_back(pDocSerie); + m_insertedIt = m_docTimes.begin(); + + if (!m_docTimes.empty() && !pSerie->empty()) + { + TimesList::iterator lastDocIt = m_docTimes.end(); + --lastDocIt; + Serie::ValuesList::const_iterator first_serie = pSerie->begin(); + if ((*first_serie)->getModelTime()->time >= (*lastDocIt)->time) + { + m_insertedIt = m_docTimes.end(); + if ((*first_serie)->getModelTime()->time == (*lastDocIt)->time) + { + m_insertedIt = lastDocIt; + } + } + } + + try + { + // TODO qt + //g_pApp->BeginWaitCursor(); + + std::for_each(pSerie->begin(), pSerie->end(), boost::bind(&ChartDoc::insertValue, this, _1)); + + // TODO qt + //g_pApp->EndWaitCursor(); + } + catch (...) + { + // TODO qt + //g_pApp->EndWaitCursor(); + } + + pSerie->addToDoc(this); + if (m_serieList.size() == 1) + { + ChartView* pView = getFirstView(); + ASSERT(pView); + pView->setYAxis(pDocSerie); + } + updateChartViews(Update::NEW_SERIE); + } } QColor ChartDoc::selectColor() const { - int count = m_serieList.size(); - int mul = count / 15; - int index = count - mul * 16; - QColor res = QColor(0, 0, 0); - switch (index) - { - case 0: - res = QColor(0x00, 0x80, 0x00); - break; - case 1: - res = QColor(0x00, 0x00, 0x80); - break; - case 2: - res = QColor(0x80, 0x80, 0x80); - break; - case 3: - res = QColor(0x80, 0x00, 0x80); - break; - case 4: - res = QColor(0xFF, 0x00, 0x00); - break; - case 5: - res = QColor(0x00, 0xFF, 0x00); - break; - case 6: - res = QColor(0x00, 0x00, 0x00); - break; - case 7: - res = QColor(0x80, 0x80, 0x00); - break; - case 8: - res = QColor(0xC0, 0xC0, 0xC0); - break; - case 9: - res = QColor(0x80, 0x00, 0x00); - break; - case 10: - res = QColor(0x00, 0x80, 0x80); - break; - case 11: - res = QColor(0xFF, 0xFF, 0x00); - break; - case 12: - res = QColor(0x00, 0x00, 0xFF); - break; - case 13: - res = QColor(0xFF, 0x00, 0xFF); - break; - case 14: - res = QColor(0x00, 0xFF, 0xFF); - break; - }; - return res; + int count = m_serieList.size(); + int mul = count / 15; + int index = count - mul * 16; + QColor res = QColor(0, 0, 0); + switch (index) + { + case 0: + res = QColor(0x00, 0x80, 0x00); + break; + case 1: + res = QColor(0x00, 0x00, 0x80); + break; + case 2: + res = QColor(0x80, 0x80, 0x80); + break; + case 3: + res = QColor(0x80, 0x00, 0x80); + break; + case 4: + res = QColor(0xFF, 0x00, 0x00); + break; + case 5: + res = QColor(0x00, 0xFF, 0x00); + break; + case 6: + res = QColor(0x00, 0x00, 0x00); + break; + case 7: + res = QColor(0x80, 0x80, 0x00); + break; + case 8: + res = QColor(0xC0, 0xC0, 0xC0); + break; + case 9: + res = QColor(0x80, 0x00, 0x00); + break; + case 10: + res = QColor(0x00, 0x80, 0x80); + break; + case 11: + res = QColor(0xFF, 0xFF, 0x00); + break; + case 12: + res = QColor(0x00, 0x00, 0xFF); + break; + case 13: + res = QColor(0xFF, 0x00, 0xFF); + break; + case 14: + res = QColor(0x00, 0xFF, 0xFF); + break; + }; + return res; } Serie::Marker ChartDoc::selectMarker() { - int count = m_serieList.size(); - int mul = count / 4; - int index = count - mul * 4; - Serie::Marker res = Serie::M_CIRCLE; - switch (index) - { - case 0: - res = Serie::M_CIRCLE; - break; - case 1: - res = Serie::M_SQUARE; - break; - case 2: - res = Serie::M_TRIANG; - break; - case 3: - res = Serie::M_CROSS; - break; - }; - return res; + int count = m_serieList.size(); + int mul = count / 4; + int index = count - mul * 4; + Serie::Marker res = Serie::Marker::CIRCLE; + switch (index) + { + case 0: + res = Serie::Marker::CIRCLE; + break; + case 1: + res = Serie::Marker::SQUARE; + break; + case 2: + res = Serie::Marker::TRIANG; + break; + case 3: + res = Serie::Marker::CROSS; + break; + }; + return res; } bool ChartDoc::serieExists(const LPSerie& pSerie) const { - return boost::range::find_if(m_serieList, boost::bind(&ChartSerie::isTracerSerie, _1, pSerie)) != m_serieList.end(); + return boost::range::find_if(m_serieList, boost::bind(&ChartSerie::isTracerSerie, _1, pSerie)) != m_serieList.end(); } const QString& ChartDoc::getTitle() const { - return m_title; + return m_title; } void ChartDoc::setTitle(const QString& title) { - m_title = title; - getFirstView()->parentWidget()->setWindowTitle(QString("график: %1").arg(m_title)); + m_title = title; + getFirstView()->parentWidget()->setWindowTitle(QString("график: %1").arg(m_title)); } void ChartDoc::autoTitle() { - QString title = QString("График%1").arg(++s_titleIndex); - setTitle(title); + QString title = QString("График%1").arg(++s_titleIndex); + setTitle(title); } void ChartDoc::resetTitleIndex() { - s_titleIndex = 0; + s_titleIndex = 0; } void ChartDoc::insertValue(Value* pValue) { - if (pValue) - { - ChartDoc::TimesList::iterator it = std::find_if(m_insertedIt, m_docTimes.end(), boost::bind(&Time::compareTimes, _1, pValue->getModelTime())); - if (it == m_docTimes.end() || (*it) != pValue->getModelTime()) - { - m_insertedIt = m_docTimes.insert(it, pValue->getModelTime()); - m_ticksCount += pValue->getModelTime()->eventCount; - double offl = 1.7E+308; - double offr = 1.7E+308; - if (it != m_docTimes.end()) - { - offr = (*it)->time - (*m_insertedIt)->time; - } - if (m_insertedIt != m_docTimes.begin()) - { - offl = (*m_insertedIt)->time; - TimesList::iterator prev_it = m_insertedIt; - prev_it--; - offl -= (*prev_it)->time; - } - double minoff = std::min(offl, offr); - if (minoff < m_minTimeOffset) - { - m_minTimeOffset = minoff; - } - } - } + if (pValue) + { + ChartDoc::TimesList::iterator it = std::find_if(m_insertedIt, m_docTimes.end(), boost::bind(&Time::compareTimes, _1, pValue->getModelTime())); + if (it == m_docTimes.end() || (*it) != pValue->getModelTime()) + { + m_insertedIt = m_docTimes.insert(it, pValue->getModelTime()); + m_ticksCount += pValue->getModelTime()->eventCount; + double offl = 1.7E+308; + double offr = 1.7E+308; + if (it != m_docTimes.end()) + { + offr = (*it)->time - (*m_insertedIt)->time; + } + if (m_insertedIt != m_docTimes.begin()) + { + offl = (*m_insertedIt)->time; + TimesList::iterator prev_it = m_insertedIt; + prev_it--; + offl -= (*prev_it)->time; + } + double minoff = std::min(offl, offr); + if (minoff < m_minTimeOffset) + { + m_minTimeOffset = minoff; + } + } + } } diff --git a/app/rdo_studio/src/tracer/chart/chart_doc.h b/app/rdo_studio/src/tracer/chart/chart_doc.h index 4d31552e7..559dc2874 100644 --- a/app/rdo_studio/src/tracer/chart/chart_doc.h +++ b/app/rdo_studio/src/tracer/chart/chart_doc.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_CHART_DOC_H_ -#define _RDO_STUDIO_TRACER_CHART_DOC_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -17,69 +16,67 @@ class ChartViewStyle; class ChartDoc { public: - enum Update - { - U_NEW_SERIE, - U_NEW_VALUE, - U_TIME_TICKS, - }; + enum class Update + { + NEW_SERIE, + NEW_VALUE, + TIMES, + }; - typedef std::list TimesList; - typedef std::vector SerieList; + typedef std::list TimesList; + typedef std::vector SerieList; - ChartDoc(const bool preview = false); - virtual ~ChartDoc(); + ChartDoc(const bool preview = false); + virtual ~ChartDoc(); - void attachView(ChartView* pView); - ChartView* getFirstView(); + void attachView(ChartView* pView); + ChartView* getFirstView(); - const QString& getTitle () const; - void setTitle (const QString& title); - void autoTitle(); - static void resetTitleIndex(); + const QString& getTitle () const; + void setTitle (const QString& title); + void autoTitle(); + static void resetTitleIndex(); - void setStyle(ChartViewStyle* pStyle); + void setStyle(ChartViewStyle* pStyle); - void updateAllViews(); + void updateAllViews(); - void addSerie(const LPSerie& pSerie); - bool serieExists(const LPSerie& pSerie) const; + void addSerie(const LPSerie& pSerie); + bool serieExists(const LPSerie& pSerie) const; - void incTimeEventsCount(Time* time); - bool newValueToSerieAdded(Value* val); + void incTimeEventsCount(Time* time); + bool newValueToSerieAdded(Value* val); - void addToViews (ChartView* pWidget); - void removeFromViews(ChartView* pWidget); + void addToViews (ChartView* pWidget); + void removeFromViews(ChartView* pWidget); - const TimesList& getTimes () const; - const SerieList& getSerieList() const; + const TimesList& getTimes () const; + const SerieList& getSerieList() const; - int getMaxMarkerSize() const; - int getTicksCount () const; - double getMinTimeOffset() const; + int getMaxMarkerSize() const; + int getTicksCount () const; + double getMinTimeOffset() const; private: - TimesList m_docTimes; - TimesList::iterator m_insertedIt; - SerieList m_serieList; - double m_minTimeOffset; - int m_ticksCount; - bool m_previewMode; + TimesList m_docTimes; + TimesList::iterator m_insertedIt; + SerieList m_serieList; + double m_minTimeOffset; + int m_ticksCount; + bool m_previewMode; - std::vector m_widgetList; - QString m_title; - std::vector m_viewList; - static std::size_t s_titleIndex; + std::vector m_widgetList; + QString m_title; + std::vector m_viewList; + static std::size_t s_titleIndex; - int getSerieIndex(ChartSerie* serie) const; - QColor selectColor() const; - Serie::Marker selectMarker(); + int getSerieIndex(ChartSerie* serie) const; + QColor selectColor() const; + Serie::Marker selectMarker(); - void updateChartViews(Update updateType) const; + void updateChartViews(Update updateType) const; - void insertValue(Value* pValue); + void insertValue(Value* pValue); }; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_CHART_DOC_H_ diff --git a/app/rdo_studio/src/tracer/chart/chart_preferences.cpp b/app/rdo_studio/src/tracer/chart/chart_preferences.cpp index 85e735f56..00c215810 100644 --- a/app/rdo_studio/src/tracer/chart/chart_preferences.cpp +++ b/app/rdo_studio/src/tracer/chart/chart_preferences.cpp @@ -10,295 +10,302 @@ using namespace rdo::gui::tracer; -ChartPreferences::ChartPreferences(ChartView* pView) - : QDialog(pView, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) - , traceIndex(0) - , m_pView(pView) - , m_pSerie(NULL) +Q_DECLARE_METATYPE(Serie::Marker); +ChartPreferences::ChartPreferences(ChartView* pView) + : QDialog(pView, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) + , traceIndex(0) + , m_pView(pView) + , m_pSerie(NULL) { - setupUi(this); - - m_pSerie = m_pView->getDocument()->getSerieList().at(0); - - m_valueCountX = m_pView->getValueCountX(); - m_valueCountY = m_pView->getValueCountY(); - m_chartTitle = m_pView->getDocument()->getTitle(); - - titleLineEdit->setText(m_chartTitle); - - yValueLineEdit->setValidator(new QIntValidator(2, 100, this)); - yValueLineEdit->setText(QString::number(m_valueCountY)); - xValueLineEdit->setValidator(new QIntValidator(2, 100, this)); - xValueLineEdit->setText(QString::number(m_valueCountX)); - - showLegendCheckBox->setChecked(m_pView->isDrawLegend()); - - ChartDoc* doc = m_pView->getDocument(); - - for (const ChartSerie* const pSerie: doc->getSerieList()) - { - yTraceComboBox->addItem(pSerie->getSerie()->getTitle()); - valueComboBox->addItem(pSerie->getSerie()->getTitle()); - } - - markerSizeLineEdit->setValidator(new QIntValidator(2, 6, markerSizeLineEdit)); - - insertColors(colorComboBox); - - markerComboBox->addItem("Нет", Serie::M_NONE); - markerComboBox->addItem("Круг", Serie::M_CIRCLE); - markerComboBox->addItem("Квадрат", Serie::M_SQUARE); - markerComboBox->addItem("Треугольник", Serie::M_TRIANG); - markerComboBox->addItem("Крестик", Serie::M_CROSS); - - connect(xValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onXValue(const QString&))); - connect(yValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onYValue(const QString&))); - connect(titleLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onTitle (const QString&))); - - connect(markerSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onMarkerSize(const QString&))); - - connect(colorToolButton, SIGNAL(clicked()), this, SLOT(onColorDialog())); - connect(valueComboBox, SIGNAL(activated(int)), this, SLOT(onValueComboBox(int))); - connect(yTraceComboBox, SIGNAL(activated(int)), this, SLOT(onTraceValue(int))); - - connect(okButton, SIGNAL(clicked()), this, SLOT(onOkButton())); - connect(cancelButton, SIGNAL(clicked()), this, SLOT(onCancelButton())); - connect(applyButton, SIGNAL(clicked()), this, SLOT(onApplyButton())); - - onValueComboBox(valueComboBox->currentIndex()); - - connect(xValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckAllData())); - connect(yValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckAllData())); - connect(titleLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckAllData())); - connect(markerSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckAllData())); - connect(showLegendCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onCheckAllData())); - connect(showInLegendCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onCheckAllData())); - connect(showMarkerCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onCheckAllData())); - connect(transparentMarkerCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onCheckAllData())); - connect(markerComboBox, SIGNAL(activated(int)), this, SLOT(onCheckAllData())); - connect(titleValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckAllData())); - connect(colorComboBox, SIGNAL(activated(int)), this, SLOT(onCheckAllData())); - - connect(xValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); - connect(yValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); - connect(markerSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); - - applyButton->setEnabled(false); + setupUi(this); + + m_pSerie = m_pView->getDocument()->getSerieList().at(0); + + m_valueCountX = m_pView->getValueCountX(); + m_valueCountY = m_pView->getValueCountY(); + m_chartTitle = m_pView->getDocument()->getTitle(); + + titleLineEdit->setText(m_chartTitle); + + yValueLineEdit->setValidator(new QIntValidator(2, 100, this)); + yValueLineEdit->setText(QString::number(m_valueCountY)); + xValueLineEdit->setValidator(new QIntValidator(2, 100, this)); + xValueLineEdit->setText(QString::number(m_valueCountX)); + + showLegendCheckBox->setChecked(m_pView->isDrawLegend()); + + ChartDoc* doc = m_pView->getDocument(); + + for (const ChartSerie* const pSerie: doc->getSerieList()) + { + yTraceComboBox->addItem(pSerie->getSerie()->getTitle()); + valueComboBox->addItem(pSerie->getSerie()->getTitle()); + } + + markerSizeLineEdit->setValidator(new QIntValidator(2, 6, markerSizeLineEdit)); + + insertColors(colorComboBox); + + markerComboBox->addItem("Нет", QVariant::fromValue(Serie::Marker::NONE)); + markerComboBox->addItem("Круг", QVariant::fromValue(Serie::Marker::CIRCLE)); + markerComboBox->addItem("Квадрат", QVariant::fromValue(Serie::Marker::SQUARE)); + markerComboBox->addItem("Треугольник", QVariant::fromValue(Serie::Marker::TRIANG)); + markerComboBox->addItem("Крестик", QVariant::fromValue(Serie::Marker::CROSS)); + + connect(xValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onXValue(const QString&))); + connect(yValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onYValue(const QString&))); + connect(titleLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onTitle (const QString&))); + + connect(markerSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onMarkerSize(const QString&))); + + connect(colorToolButton, SIGNAL(clicked()), this, SLOT(onColorDialog())); + connect(valueComboBox, SIGNAL(activated(int)), this, SLOT(onValueComboBox(int))); + connect(yTraceComboBox, SIGNAL(activated(int)), this, SLOT(onTraceValue(int))); + + connect(okButton, SIGNAL(clicked()), this, SLOT(onOkButton())); + connect(cancelButton, SIGNAL(clicked()), this, SLOT(onCancelButton())); + connect(applyButton, SIGNAL(clicked()), this, SLOT(onApplyButton())); + + onValueComboBox(valueComboBox->currentIndex()); + + connect(xValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckAllData())); + connect(yValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckAllData())); + connect(titleLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckAllData())); + connect(markerSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckAllData())); + connect(showLegendCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onCheckAllData())); + connect(showInLegendCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onCheckAllData())); + connect(showMarkerCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onCheckAllData())); + connect(transparentMarkerCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onCheckAllData())); + connect(markerComboBox, SIGNAL(activated(int)), this, SLOT(onCheckAllData())); + connect(titleValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckAllData())); + connect(colorComboBox, SIGNAL(activated(int)), this, SLOT(onCheckAllData())); + + connect(xValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); + connect(yValueLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); + connect(markerSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); + + applyButton->setEnabled(false); } void ChartPreferences::insertColors(QComboBox* colorBox) { - insertColor(QColor(0x00, 0x80, 0x00), "Green", colorBox); - insertColor(QColor(0x00, 0x00, 0x80), "Navy", colorBox); - insertColor(QColor(0x80, 0x80, 0x80), "Grey", colorBox); - insertColor(QColor(0x80, 0x00, 0x80), "Purple", colorBox); - insertColor(QColor(0xFF, 0x00, 0x00), "Red", colorBox); - insertColor(QColor(0x00, 0xFF, 0x00), "Lime", colorBox); - insertColor(QColor(0x00, 0x00, 0x00), "Black", colorBox); - insertColor(QColor(0xFF, 0xFF, 0xFF), "White", colorBox); - insertColor(QColor(0x80, 0x80, 0x00), "Olive", colorBox); - insertColor(QColor(0xC0, 0xC0, 0xC0), "Silver", colorBox); - insertColor(QColor(0x80, 0x00, 0x00), "Maroon", colorBox); - insertColor(QColor(0x00, 0x80, 0x80), "Teal", colorBox); - insertColor(QColor(0xFF, 0xFF, 0x00), "Yellow", colorBox); - insertColor(QColor(0x00, 0x00, 0xFF), "Blue", colorBox); - insertColor(QColor(0xFF, 0x00, 0xFF), "Fushcia", colorBox); - insertColor(QColor(0x00, 0xFF, 0xFF), "Aqua", colorBox); + insertColor(QColor(0x00, 0x80, 0x00), "Green", colorBox); + insertColor(QColor(0x00, 0x00, 0x80), "Navy", colorBox); + insertColor(QColor(0x80, 0x80, 0x80), "Grey", colorBox); + insertColor(QColor(0x80, 0x00, 0x80), "Purple", colorBox); + insertColor(QColor(0xFF, 0x00, 0x00), "Red", colorBox); + insertColor(QColor(0x00, 0xFF, 0x00), "Lime", colorBox); + insertColor(QColor(0x00, 0x00, 0x00), "Black", colorBox); + insertColor(QColor(0xFF, 0xFF, 0xFF), "White", colorBox); + insertColor(QColor(0x80, 0x80, 0x00), "Olive", colorBox); + insertColor(QColor(0xC0, 0xC0, 0xC0), "Silver", colorBox); + insertColor(QColor(0x80, 0x00, 0x00), "Maroon", colorBox); + insertColor(QColor(0x00, 0x80, 0x80), "Teal", colorBox); + insertColor(QColor(0xFF, 0xFF, 0x00), "Yellow", colorBox); + insertColor(QColor(0x00, 0x00, 0xFF), "Blue", colorBox); + insertColor(QColor(0xFF, 0x00, 0xFF), "Fuchsia", colorBox); + insertColor(QColor(0x00, 0xFF, 0xFF), "Aqua", colorBox); } void ChartPreferences::insertColor(const QColor& color, const QString& colorName, QComboBox* colorBox) { - colorBox->addItem(colorName); - int size = colorBox ->style()->pixelMetric(QStyle::PM_SmallIconSize); - QPixmap pixmap(size,size-5); - pixmap.fill(color); - QRect rBorder(0,0,size-1,size-6); - QPainter p(&pixmap); - QPen pen(Qt::black, 1, Qt::SolidLine); - p.setPen(pen); - p.drawRect(rBorder); - colorBox->setItemData(colorBox->findText(colorName), color, Qt::UserRole); - colorBox->setItemIcon(colorBox->findText(colorName), QIcon(pixmap)); + colorBox->addItem(colorName); + int size = colorBox ->style()->pixelMetric(QStyle::PM_SmallIconSize); + QPixmap pixmap(size,size-5); + pixmap.fill(color); + QRect rBorder(0,0,size-1,size-6); + QPainter p(&pixmap); + QPen pen(Qt::black, 1, Qt::SolidLine); + p.setPen(pen); + p.drawRect(rBorder); + colorBox->setItemData(colorBox->findText(colorName), color, Qt::UserRole); + colorBox->setItemIcon(colorBox->findText(colorName), QIcon(pixmap)); } void ChartPreferences::apply() { - traceIndex = yTraceComboBox->currentIndex(); - - m_pView->setYAxis(yTraceComboBox->currentIndex() != -1 - ? m_pView->getDocument()->getSerieList().at(yTraceComboBox->currentIndex()) - : NULL - ); - m_pView->setDrawLegend(showLegendCheckBox->checkState() == Qt::Checked ? true : false); - m_pView->setValueCountX(m_valueCountX); - m_pView->setValueCountY(m_valueCountY); - m_pView->getDocument()->setTitle(m_chartTitle); - - if (m_pSerie) - { - QString title = titleValueLineEdit->text(); - - ChartSerie::Options options; - options.title = title; - options.color = colorComboBox->itemData(colorComboBox->currentIndex(), Qt::UserRole).value(); - options.markerType = static_cast(markerComboBox->itemData(markerComboBox->currentIndex(), Qt::UserRole).toInt()); - options.markerSize = m_sizeMarker; - options.markerNeedDraw = showMarkerCheckBox->checkState() == Qt::Checked ? true : false; - options.markerTransparent = transparentMarkerCheckBox->checkState() == Qt::Checked ? true : false; - options.showInLegend = showInLegendCheckBox->checkState() == Qt::Checked ? true : false; - - m_pSerie->setOptions(options); - } - - m_pView->repaint(); + traceIndex = yTraceComboBox->currentIndex(); + + m_pView->setYAxis(yTraceComboBox->currentIndex() != -1 + ? m_pView->getDocument()->getSerieList().at(yTraceComboBox->currentIndex()) + : NULL + ); + m_pView->setDrawLegend(showLegendCheckBox->checkState() == Qt::Checked ? true : false); + m_pView->setValueCountX(m_valueCountX); + m_pView->setValueCountY(m_valueCountY); + m_pView->getDocument()->setTitle(m_chartTitle); + + if (m_pSerie) + { + QString title = titleValueLineEdit->text(); + + ChartSerie::Options options; + options.title = title; + options.color = colorComboBox->itemData(colorComboBox->currentIndex(), Qt::UserRole).value(); + options.markerType = static_cast(markerComboBox->itemData(markerComboBox->currentIndex(), Qt::UserRole).toInt()); + options.markerSize = m_sizeMarker; + options.markerNeedDraw = showMarkerCheckBox->checkState() == Qt::Checked ? true : false; + options.markerTransparent = transparentMarkerCheckBox->checkState() == Qt::Checked ? true : false; + options.showInLegend = showInLegendCheckBox->checkState() == Qt::Checked ? true : false; + + m_pSerie->setOptions(options); + } + + m_pView->repaint(); } void ChartPreferences::onHelpContext() { - QByteArray ba; - switch(tabWidget->currentIndex()) - { - case 0: - ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_model/work_model_chart.htm#chart\n"); - break; - case 1: - ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_model/work_model_chart.htm#series\n"); - break; - } - g_pApp->callQtAssistant(ba); + QByteArray ba; + switch(tabWidget->currentIndex()) + { + case 0: + ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_model/work_model_chart.htm#chart\n"); + break; + case 1: + ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_model/work_model_chart.htm#series\n"); + break; + } + g_pApp->callQtAssistant(ba); } void ChartPreferences::onCheckAllData() { - bool legend = showLegendCheckBox->checkState() == Qt::Checked ? true : false; - bool showInLegend = showInLegendCheckBox->checkState() == Qt::Checked ? true : false; - bool showMarker = showMarkerCheckBox->checkState() == Qt::Checked ? true : false; - bool transparentMarker = transparentMarkerCheckBox->checkState() == Qt::Checked ? true : false; - - bool titleFlag = titleLineEdit->text() == m_pView->getDocument()->getTitle() ? true : false; - bool yValueFlag = yValueLineEdit->text().toInt() == m_pView->getValueCountX() ? true : false; - bool xValueFlag = xValueLineEdit->text().toInt() == m_pView->getValueCountY() ? true : false; - bool showLegendFlag = legend == m_pView->isDrawLegend(); - bool showInLegendFlag = showInLegend == m_pSerie->options().showInLegend ? true : false; - bool markerSizeFlag = markerSizeLineEdit->text().toInt() == m_pSerie->options().markerSize ? true : false; - bool markerShowFlag = showMarker == m_pSerie->options().markerNeedDraw ? true : false; - bool markerTransparentFlag = transparentMarker == m_pSerie->options().markerTransparent ? true : false; - bool titleValueFlag = titleValueLineEdit->text() == m_pSerie->options().title; - bool colorFlag = colorComboBox->itemData(colorComboBox->currentIndex(), Qt::UserRole).value() == m_pSerie->options().color ? true : false; - bool markerTypeFlag = markerComboBox->itemData(markerComboBox->currentIndex(), Qt::UserRole).toInt() == m_pSerie->options().markerType ? true : false; - - bool valueFlag = traceIndex == yTraceComboBox->currentIndex(); - - if (titleFlag - && yValueFlag - && xValueFlag - && showLegendFlag - && showInLegendFlag - && markerSizeFlag - && markerShowFlag - && markerTransparentFlag - && titleValueFlag - && colorFlag - && markerTypeFlag - && valueFlag) - applyButton->setEnabled(false); - else - applyButton->setEnabled(true); + bool legend = showLegendCheckBox->checkState() == Qt::Checked ? true : false; + bool showInLegend = showInLegendCheckBox->checkState() == Qt::Checked ? true : false; + bool showMarker = showMarkerCheckBox->checkState() == Qt::Checked ? true : false; + bool transparentMarker = transparentMarkerCheckBox->checkState() == Qt::Checked ? true : false; + + bool titleFlag = titleLineEdit->text() == m_pView->getDocument()->getTitle() ? true : false; + bool yValueFlag = yValueLineEdit->text().toInt() == m_pView->getValueCountX() ? true : false; + bool xValueFlag = xValueLineEdit->text().toInt() == m_pView->getValueCountY() ? true : false; + bool showLegendFlag = legend == m_pView->isDrawLegend(); + bool showInLegendFlag = showInLegend == m_pSerie->options().showInLegend ? true : false; + bool markerSizeFlag = markerSizeLineEdit->text().toInt() == m_pSerie->options().markerSize ? true : false; + bool markerShowFlag = showMarker == m_pSerie->options().markerNeedDraw ? true : false; + bool markerTransparentFlag = transparentMarker == m_pSerie->options().markerTransparent ? true : false; + bool titleValueFlag = titleValueLineEdit->text() == m_pSerie->options().title; + bool colorFlag = colorComboBox->itemData(colorComboBox->currentIndex(), Qt::UserRole).value() == m_pSerie->options().color ? true : false; + bool markerTypeFlag = markerComboBox->itemData(markerComboBox->currentIndex(), Qt::UserRole).value() == m_pSerie->options().markerType ? true : false; + + bool valueFlag = traceIndex == yTraceComboBox->currentIndex(); + + if (titleFlag + && yValueFlag + && xValueFlag + && showLegendFlag + && showInLegendFlag + && markerSizeFlag + && markerShowFlag + && markerTransparentFlag + && titleValueFlag + && colorFlag + && markerTypeFlag + && valueFlag) + applyButton->setEnabled(false); + else + applyButton->setEnabled(true); } void ChartPreferences::onOkButton() { - apply(); - done(Accepted); + apply(); + done(Accepted); } void ChartPreferences::onCancelButton() { - done(Rejected); + done(Rejected); } void ChartPreferences::onApplyButton() { - apply(); - applyButton->setEnabled(false); + apply(); + applyButton->setEnabled(false); } void ChartPreferences::onCheckInput(const QString& /*text*/) { - bool check = yValueLineEdit->text().toInt() >= 2 && - xValueLineEdit->text().toInt() >= 2 && - markerSizeLineEdit->text().toInt() >= 2; + bool check = yValueLineEdit->text().toInt() >= 2 && + xValueLineEdit->text().toInt() >= 2 && + markerSizeLineEdit->text().toInt() >= 2; - okButton->setEnabled(check); - applyButton->setEnabled(check); + okButton->setEnabled(check); + applyButton->setEnabled(check); } void ChartPreferences::onXValue(const QString& text) { - m_valueCountX = text.toInt(); + m_valueCountX = text.toInt(); } void ChartPreferences::onYValue(const QString& text) { - m_valueCountY = text.toInt(); + m_valueCountY = text.toInt(); } void ChartPreferences::onTitle(const QString& text) { - m_chartTitle = text; + m_chartTitle = text; } void ChartPreferences::onMarkerSize(const QString& text) { - m_sizeMarker = text.toInt(); + m_sizeMarker = text.toInt(); } void ChartPreferences::onColorDialog() { - QColor color = colorComboBox->itemData(colorComboBox->currentIndex(), Qt::UserRole).value(); - colorDlg = new QColorDialog(color, this); - connect(colorDlg, SIGNAL(colorSelected(const QColor&)), this, SLOT(onColorSelected(const QColor&))); - colorDlg->exec(); + QColor color = colorComboBox->itemData(colorComboBox->currentIndex(), Qt::UserRole).value(); + colorDlg = new QColorDialog(color, this); + connect(colorDlg, SIGNAL(colorSelected(const QColor&)), this, SLOT(onColorSelected(const QColor&))); + colorDlg->exec(); } void ChartPreferences::onColorSelected(const QColor& color) { - if (colorComboBox->findData(color, Qt::UserRole) == -1) - { - insertColor(color, QString("[%1, %2, %3]").arg(color.red()).arg(color.green()).arg(color.blue()), colorComboBox); - } - colorComboBox->setCurrentIndex(colorComboBox->findData(color, Qt::UserRole)); - onCheckAllData(); + if (colorComboBox->findData(color, Qt::UserRole) == -1) + { + insertColor(color, QString("[%1, %2, %3]").arg(color.red()).arg(color.green()).arg(color.blue()), colorComboBox); + } + colorComboBox->setCurrentIndex(colorComboBox->findData(color, Qt::UserRole)); + onCheckAllData(); } void ChartPreferences::onTraceValue(int /*index*/) { - onCheckAllData(); + onCheckAllData(); } void ChartPreferences::onValueComboBox(int index) { - m_pSerie = m_pView->getDocument()->getSerieList().at(index); - - m_sizeMarker = m_pSerie->options().markerSize; - titleValueLineEdit->setText(m_pSerie->options().title); - showMarkerCheckBox->setChecked(m_pSerie->options().markerNeedDraw); - transparentMarkerCheckBox->setChecked(m_pSerie->options().markerTransparent); - showInLegendCheckBox->setChecked(m_pSerie->options().showInLegend); - markerSizeLineEdit->setText(QString::number(m_pSerie->options().markerSize)); - markerComboBox->setCurrentIndex(markerComboBox->findData(m_pSerie->options().markerType)); - if (colorComboBox->findData(m_pSerie->options().color, Qt::UserRole) == -1) - { - insertColor(m_pSerie->options().color, QString("[%1, %2, %3]").arg(m_pSerie->options().color.red()).arg(m_pSerie->options().color.green()).arg(m_pSerie->options().color.blue()), colorComboBox); - } - colorComboBox->setCurrentIndex(colorComboBox->findData(m_pSerie->options().color, Qt::UserRole)); - onCheckAllData(); + m_pSerie = m_pView->getDocument()->getSerieList().at(index); + + m_sizeMarker = m_pSerie->options().markerSize; + titleValueLineEdit->setText(m_pSerie->options().title); + showMarkerCheckBox->setChecked(m_pSerie->options().markerNeedDraw); + transparentMarkerCheckBox->setChecked(m_pSerie->options().markerTransparent); + showInLegendCheckBox->setChecked(m_pSerie->options().showInLegend); + markerSizeLineEdit->setText(QString::number(m_pSerie->options().markerSize)); + markerComboBox->setCurrentIndex(markerComboBox->findData(QVariant::fromValue(m_pSerie->options().markerType))); + if (colorComboBox->findData(m_pSerie->options().color, Qt::UserRole) == -1) + { + insertColor( + m_pSerie->options().color, + QString("[%1, %2, %3]") + .arg(m_pSerie->options().color.red()) + .arg(m_pSerie->options().color.green()) + .arg(m_pSerie->options().color.blue()), + colorComboBox); + } + colorComboBox->setCurrentIndex(colorComboBox->findData(m_pSerie->options().color, Qt::UserRole)); + onCheckAllData(); } void ChartPreferences::keyPressEvent(QKeyEvent* pEvent) { - if(QKeySequence(pEvent->key()) == QKeySequence::HelpContents) - onHelpContext(); + if(QKeySequence(pEvent->key()) == QKeySequence::HelpContents) + onHelpContext(); } \ No newline at end of file diff --git a/app/rdo_studio/src/tracer/chart/chart_preferences.h b/app/rdo_studio/src/tracer/chart/chart_preferences.h index 28239f6d9..6fee25aac 100644 --- a/app/rdo_studio/src/tracer/chart/chart_preferences.h +++ b/app/rdo_studio/src/tracer/chart/chart_preferences.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_CHART_PREFERENCES_H_ -#define _RDO_STUDIO_TRACER_CHART_PREFERENCES_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -14,51 +13,49 @@ namespace rdo { namespace gui { namespace tracer { class ChartPreferences - : public QDialog - , private Ui::ChartPreferencesDialog + : public QDialog + , private Ui::ChartPreferencesDialog { Q_OBJECT public: - explicit ChartPreferences(ChartView* pView = NULL); + explicit ChartPreferences(ChartView* pView = NULL); private: - QColorDialog* colorDlg; + QColorDialog* colorDlg; - int m_valueCountX; - int m_valueCountY; - QString m_chartTitle; + int m_valueCountX; + int m_valueCountY; + QString m_chartTitle; - int m_sizeMarker; + int m_sizeMarker; - int traceIndex; + int traceIndex; - ChartView* m_pView; - ChartSerie* m_pSerie; + ChartView* m_pView; + ChartSerie* m_pSerie; - void insertColors(QComboBox* colorBox); - void insertColor(const QColor& color, const QString& colorName, QComboBox* colorBox); - void apply(); + void insertColors(QComboBox* colorBox); + void insertColor(const QColor& color, const QString& colorName, QComboBox* colorBox); + void apply(); - void onHelpContext(); - void keyPressEvent(QKeyEvent* pEvent); + void onHelpContext(); + void keyPressEvent(QKeyEvent* pEvent); private slots: - void onOkButton(); - void onCancelButton(); - void onApplyButton(); - void onXValue(const QString& text); - void onYValue(const QString& text); - void onTitle(const QString& text); - void onMarkerSize(const QString& text); - void onColorDialog(); - void onColorSelected(const QColor& color); - void onTraceValue(int index); - void onValueComboBox(int index); - void onCheckAllData(); - void onCheckInput(const QString& text); + void onOkButton(); + void onCancelButton(); + void onApplyButton(); + void onXValue(const QString& text); + void onYValue(const QString& text); + void onTitle(const QString& text); + void onMarkerSize(const QString& text); + void onColorDialog(); + void onColorSelected(const QColor& color); + void onTraceValue(int index); + void onValueComboBox(int index); + void onCheckAllData(); + void onCheckInput(const QString& text); }; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_CHART_PREFERENCES_H_ diff --git a/app/rdo_studio/src/tracer/chart/chart_serie.cpp b/app/rdo_studio/src/tracer/chart/chart_serie.cpp index 302ae7223..c3039ce80 100644 --- a/app/rdo_studio/src/tracer/chart/chart_serie.cpp +++ b/app/rdo_studio/src/tracer/chart/chart_serie.cpp @@ -11,35 +11,35 @@ using namespace rdo::gui::tracer; // -------------------- ChartSerie::Options // -------------------------------------------------------------------------------- ChartSerie::Options::Options() - : color (QColor(0x00, 0x00, 0x00)) - , markerType (Serie::M_NONE) - , markerSize (4) - , markerNeedDraw (true) - , markerTransparent(true) - , showInLegend (true) + : color (QColor(0x00, 0x00, 0x00)) + , markerType (Serie::Marker::NONE) + , markerSize (4) + , markerNeedDraw (true) + , markerTransparent(true) + , showInLegend (true) {} bool ChartSerie::Options::operator== (const Options& options) const { - return title == options.title - && color == options.color - && markerType == options.markerType - && markerSize == options.markerSize - && markerNeedDraw == options.markerNeedDraw - && markerTransparent == options.markerTransparent - && showInLegend == options.showInLegend; + return title == options.title + && color == options.color + && markerType == options.markerType + && markerSize == options.markerSize + && markerNeedDraw == options.markerNeedDraw + && markerTransparent == options.markerTransparent + && showInLegend == options.showInLegend; } // -------------------------------------------------------------------------------- // -------------------- ChartSerie // -------------------------------------------------------------------------------- ChartSerie::ChartSerie(const LPSerie& pSerie) - : m_pSerie(pSerie) + : m_pSerie(pSerie) { - if (m_pSerie) - { - m_options.title = m_pSerie->getTitle(); - } + if (m_pSerie) + { + m_options.title = m_pSerie->getTitle(); + } } ChartSerie::~ChartSerie() @@ -47,92 +47,92 @@ ChartSerie::~ChartSerie() const LPSerie& ChartSerie::getSerie() const { - return m_pSerie; + return m_pSerie; } const ChartSerie::Options& ChartSerie::options() const { - return m_options; + return m_options; } void ChartSerie::setOptions(const Options& options) { - m_options = options; + m_options = options; } bool ChartSerie::isTracerSerie(const LPSerie& pSerie) const { - return m_pSerie == pSerie; + return m_pSerie == pSerie; } void ChartSerie::drawSerie(ChartView* const pView, QPainter& painter, const QRect& rect) const { - m_pSerie->drawSerie(pView, painter, rect, m_options.color, m_options.markerType, m_options.markerSize, m_options.markerNeedDraw, m_options.markerTransparent); + m_pSerie->drawSerie(pView, painter, rect, m_options.color, m_options.markerType, m_options.markerSize, m_options.markerNeedDraw, m_options.markerTransparent); } void ChartSerie::getCaptions(std::vector& captions, const int valueCount) const { - m_pSerie->getCaptions(captions, valueCount); + m_pSerie->getCaptions(captions, valueCount); } bool ChartSerie::empty() const { - return m_pSerie->empty(); + return m_pSerie->empty(); } QSize ChartSerie::getLegendSize(const QFontMetrics& fm, const QRect& rect) const { - QSize size(0, 0); - if (!m_options.showInLegend || rect.isEmpty()) - return size; - - QRect tmprect; - int markerAreaWidth = 10 + m_options.markerSize * 2 + 5; - tmprect.setLeft(rect.left() + markerAreaWidth); - tmprect.setRight(rect.right()); - tmprect.setTop(rect.top()); - tmprect.setBottom(rect.bottom()); - tmprect = fm.boundingRect(tmprect, Qt::AlignLeft | Qt::TextSingleLine, m_options.title); - size.setHeight(tmprect.height()); - if (size.height() < m_options.markerSize * 2) - { - size.setHeight(m_options.markerSize * 2); - } - size.setWidth(tmprect.right() - rect.left()); - size.setHeight(size.height() + 2); - if (size.width() > rect.width()) - { - size.setWidth(rect.width()); - } - return size; + QSize size(0, 0); + if (!m_options.showInLegend || rect.isEmpty()) + return size; + + QRect tmprect; + int markerAreaWidth = 10 + m_options.markerSize * 2 + 5; + tmprect.setLeft(rect.left() + markerAreaWidth); + tmprect.setRight(rect.right()); + tmprect.setTop(rect.top()); + tmprect.setBottom(rect.bottom()); + tmprect = fm.boundingRect(tmprect, Qt::AlignLeft | Qt::TextSingleLine, m_options.title); + size.setHeight(tmprect.height()); + if (size.height() < m_options.markerSize * 2) + { + size.setHeight(m_options.markerSize * 2); + } + size.setWidth(tmprect.right() - rect.left()); + size.setHeight(size.height() + 2); + if (size.width() > rect.width()) + { + size.setWidth(rect.width()); + } + return size; } QSize ChartSerie::drawLegend(QPainter& painter, const QRect& rect, const QColor& textColor) const { - QSize size = getLegendSize(painter.fontMetrics(), rect); - if (!m_options.showInLegend || size.isEmpty()) - return size; + QSize size = getLegendSize(painter.fontMetrics(), rect); + if (!m_options.showInLegend || size.isEmpty()) + return size; - QPoint markerCenter(5 + m_options.markerSize, rect.top() + (size.height() - 2) / 2); - if (m_options.markerNeedDraw) - { - QPen pen(m_options.color); - QBrush brush(m_options.color, m_options.markerTransparent ? Qt::NoBrush : Qt::SolidPattern); - painter.setPen(pen); - painter.setBrush(brush); - m_pSerie->drawMarker(painter, rect.left() + markerCenter.x(), markerCenter.y(), m_options.markerType, m_options.markerSize); - } + QPoint markerCenter(5 + m_options.markerSize, rect.top() + (size.height() - 2) / 2); + if (m_options.markerNeedDraw) + { + QPen pen(m_options.color); + QBrush brush(m_options.color, m_options.markerTransparent ? Qt::NoBrush : Qt::SolidPattern); + painter.setPen(pen); + painter.setBrush(brush); + m_pSerie->drawMarker(painter, rect.left() + markerCenter.x(), markerCenter.y(), m_options.markerType, m_options.markerSize); + } - painter.drawLine(rect.left(), markerCenter.y(), rect.left() + markerCenter.x() * 2, markerCenter.y()); + painter.drawLine(rect.left(), markerCenter.y(), rect.left() + markerCenter.x() * 2, markerCenter.y()); - QRect tmprect(rect); - tmprect.setLeft(tmprect.left() + markerCenter.x() * 2 + 5); + QRect tmprect(rect); + tmprect.setLeft(tmprect.left() + markerCenter.x() * 2 + 5); - if (tmprect.isEmpty()) - return size; + if (tmprect.isEmpty()) + return size; - painter.setPen(textColor); - painter.drawText(tmprect, Qt::AlignLeft | Qt::TextSingleLine, painter.fontMetrics().elidedText(m_options.title, Qt::ElideRight, tmprect.width())); + painter.setPen(textColor); + painter.drawText(tmprect, Qt::AlignLeft | Qt::TextSingleLine, painter.fontMetrics().elidedText(m_options.title, Qt::ElideRight, tmprect.width())); - return size; + return size; } diff --git a/app/rdo_studio/src/tracer/chart/chart_serie.h b/app/rdo_studio/src/tracer/chart/chart_serie.h index 927c2a48d..c4a1c09b8 100644 --- a/app/rdo_studio/src/tracer/chart/chart_serie.h +++ b/app/rdo_studio/src/tracer/chart/chart_serie.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_CHART_SERIE_H_ -#define _RDO_STUDIO_TRACER_CHART_SERIE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -16,41 +15,39 @@ class ChartView; class ChartSerie { public: - ChartSerie(const LPSerie& pSerie); - ~ChartSerie(); + ChartSerie(const LPSerie& pSerie); + ~ChartSerie(); - struct Options - { - QString title; - QColor color; - Serie::Marker markerType; - int markerSize; - bool markerNeedDraw; - bool markerTransparent; - bool showInLegend; + struct Options + { + QString title; + QColor color; + Serie::Marker markerType; + int markerSize; + bool markerNeedDraw; + bool markerTransparent; + bool showInLegend; - Options(); - bool operator== (const Options& options) const; - }; + Options(); + bool operator== (const Options& options) const; + }; - const LPSerie& getSerie() const; + const LPSerie& getSerie() const; - const Options& options() const; - void setOptions(const Options& options); + const Options& options() const; + void setOptions(const Options& options); - bool isTracerSerie(const LPSerie& pSerie) const; - void drawSerie (ChartView* const pView, QPainter& painter, const QRect& rect) const; - void getCaptions (std::vector& captions, const int valueCount) const; - QSize getLegendSize(const QFontMetrics& fm, const QRect& rect) const; - QSize drawLegend (QPainter& painter, const QRect& rect, const QColor& textColor) const; + bool isTracerSerie(const LPSerie& pSerie) const; + void drawSerie (ChartView* const pView, QPainter& painter, const QRect& rect) const; + void getCaptions (std::vector& captions, const int valueCount) const; + QSize getLegendSize(const QFontMetrics& fm, const QRect& rect) const; + QSize drawLegend (QPainter& painter, const QRect& rect, const QColor& textColor) const; - bool empty () const; + bool empty () const; protected: - LPSerie m_pSerie; - Options m_options; + LPSerie m_pSerie; + Options m_options; }; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_CHART_SERIE_H_ diff --git a/app/rdo_studio/src/tracer/chart/chart_tree.cpp b/app/rdo_studio/src/tracer/chart/chart_tree.cpp index 637b854f8..f3b38861a 100644 --- a/app/rdo_studio/src/tracer/chart/chart_tree.cpp +++ b/app/rdo_studio/src/tracer/chart/chart_tree.cpp @@ -27,43 +27,43 @@ using namespace rdo::gui::tracer; Q_DECLARE_METATYPE(const ChartTreeItem*); ChartTree::ChartTree(QWidget* pParent) - : parent_type(pParent) + : parent_type(pParent) { - setColumnCount (1); - setHeaderHidden (true); - setRootIsDecorated(false); + setColumnCount (1); + setHeaderHidden (true); + setRootIsDecorated(false); - m_iconList.reserve(IT_COUNT); - m_iconList.push_back(QIcon(QString::fromUtf8(":/images/images/tree_chart_root.png"))); - m_iconList.push_back(QIcon(QString::fromUtf8(":/images/images/tree_chart_sub_root_1.png"))); - m_iconList.push_back(QIcon(QString::fromUtf8(":/images/images/tree_chart_sub_root_2.png"))); - m_iconList.push_back(QIcon(QString::fromUtf8(":/images/images/tree_chart_sub_root_3.png"))); - m_iconList.push_back(QIcon(QString::fromUtf8(":/images/images/tree_chart_value.png"))); - m_iconList.push_back(QIcon(QString::fromUtf8(":/images/images/tree_chart_erased.png"))); + m_iconList.reserve(static_cast(IconType::COUNT)); + m_iconList.push_back(QIcon(QString::fromUtf8(":/images/images/tree_chart_root.png"))); + m_iconList.push_back(QIcon(QString::fromUtf8(":/images/images/tree_chart_sub_root_1.png"))); + m_iconList.push_back(QIcon(QString::fromUtf8(":/images/images/tree_chart_sub_root_2.png"))); + m_iconList.push_back(QIcon(QString::fromUtf8(":/images/images/tree_chart_sub_root_3.png"))); + m_iconList.push_back(QIcon(QString::fromUtf8(":/images/images/tree_chart_value.png"))); + m_iconList.push_back(QIcon(QString::fromUtf8(":/images/images/tree_chart_erased.png"))); - m_root = rdo::Factory::create(); - m_rootRTP = rdo::Factory::create(); - m_rootPAT = rdo::Factory::create(); - m_rootPMV = rdo::Factory::create(); + m_root = rdo::Factory::create(); + m_rootRTP = rdo::Factory::create(); + m_rootPAT = rdo::Factory::create(); + m_rootPMV = rdo::Factory::create(); - m_root->setCtrlItem(new QTreeWidgetItem(this)); - m_root->getCtrlItem().setText(0, "Модель"); - m_root->getCtrlItem().setIcon(0, m_iconList[IT_ROOT]); + m_root->setCtrlItem(new QTreeWidgetItem(this)); + m_root->getCtrlItem().setText(0, "Модель"); + m_root->getCtrlItem().setIcon(0, m_iconList[static_cast(IconType::ROOT)]); - createItem(m_root, m_rootRTP, "Типы ресурсов", IT_SUB_ROOT_1); - createItem(m_root, m_rootPAT, "Образцы", IT_SUB_ROOT_1); - createItem(m_root, m_rootPMV, "Результаты", IT_SUB_ROOT_1); + createItem(m_root, m_rootRTP, "Типы ресурсов", IconType::SUB_ROOT_1); + createItem(m_root, m_rootPAT, "Образцы", IconType::SUB_ROOT_1); + createItem(m_root, m_rootPMV, "Результаты", IconType::SUB_ROOT_1); - m_root->getCtrlItem().setExpanded(true); + m_root->getCtrlItem().setExpanded(true); - connect(this, &ChartTree::itemDoubleClicked, this, &ChartTree::onTreeWidgetItemDoubleClicked); + connect(this, &ChartTree::itemDoubleClicked, this, &ChartTree::onTreeWidgetItemDoubleClicked); - Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); + Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); - m_pPopupMenu = new QMenu(this); - m_pPopupMenu->addAction(pMainWindow->actChartCreate); - m_pPopupMenu->addAction(pMainWindow->actChartExport); + m_pPopupMenu = new QMenu(this); + m_pPopupMenu->addAction(pMainWindow->actChartCreate); + m_pPopupMenu->addAction(pMainWindow->actChartExport); } ChartTree::~ChartTree() @@ -71,257 +71,252 @@ ChartTree::~ChartTree() LPChartTreeItem ChartTree::getIfItemIsDrawable(const QTreeWidgetItem* pCtrlItem) const { - LPChartTreeItem pRes; - if (pCtrlItem) - { - ChartTreeItem* pItem = const_cast(pCtrlItem->data(0, Qt::UserRole).value()); - pRes = pItem && pItem->isDrawable() - ? pItem - : NULL; - } - return pRes; + LPChartTreeItem pRes; + if (pCtrlItem) + { + ChartTreeItem* pItem = const_cast(pCtrlItem->data(0, Qt::UserRole).value()); + pRes = pItem && pItem->isDrawable() + ? pItem + : NULL; + } + return pRes; } void ChartTree::doDragDrop(const LPSerie& pSerie) { - quintptr address=(quintptr)pSerie.get(); - QByteArray serieData(QString::number(address).toLatin1()); + quintptr address=(quintptr)pSerie.get(); + QByteArray serieData(QString::number(address).toLatin1()); - QDrag *drag = new QDrag(this); - QMimeData *mimeData = new QMimeData; + QDrag *drag = new QDrag(this); + QMimeData *mimeData = new QMimeData; - mimeData->setData("ChartSerie", serieData); - drag->setMimeData(mimeData); - drag->exec(); + mimeData->setData("ChartSerie", serieData); + drag->setMimeData(mimeData); + drag->exec(); } void ChartTree::setModelName(const QString& modelName) { - m_root->getCtrlItem().setText(0, QString("Модель : %1").arg(modelName)); + m_root->getCtrlItem().setText(0, QString("Модель : %1").arg(modelName)); } void ChartTree::createItem(const LPChartTreeItem& parent, const LPChartTreeItem& item, const QString& name, IconType iconType) { - QTreeWidgetItem* pCtrlItem = new QTreeWidgetItem(&parent->getCtrlItem()); - pCtrlItem->setText(0, name); - pCtrlItem->setIcon(0, m_iconList[iconType]); - //! @todo smart_ptr - const ChartTreeItem* pRawItem = item.get(); - pCtrlItem->setData(0, Qt::UserRole, QVariant::fromValue(pRawItem)); - item->setCtrlItem(pCtrlItem); + QTreeWidgetItem* pCtrlItem = new QTreeWidgetItem(&parent->getCtrlItem()); + pCtrlItem->setText(0, name); + pCtrlItem->setIcon(0, m_iconList[static_cast(iconType)]); + // TODO smart_ptr + const ChartTreeItem* pRawItem = item.get(); + pCtrlItem->setData(0, Qt::UserRole, QVariant::fromValue(pRawItem)); + item->setCtrlItem(pCtrlItem); } void ChartTree::addResourceType(const LPResourceType& pRTP) { - ASSERT(pRTP); - createItem(m_rootRTP, pRTP, pRTP->getName(), IT_SUB_ROOT_2); + ASSERT(pRTP); + createItem(m_rootRTP, pRTP, pRTP->getName(), IconType::SUB_ROOT_2); } void ChartTree::addResource(const LPResource& pRSS) { - LPResourceType pRTP = pRSS->getType(); - ASSERT(pRTP); - ASSERT(pRSS); - createItem(pRTP, pRSS, pRSS->getName(), IT_SUB_ROOT_3); - - int count = pRTP->getParamsCount(); - for (int i = 0; i < count; i++) - { - LPChartTreeItem pParam = pRSS->getParam(i); - ASSERT(pParam); - createItem(pRSS, pParam, pRTP->getParamInfo(i)->getName(), IT_VALUE); - } - updateResource(pRSS); + LPResourceType pRTP = pRSS->getType(); + ASSERT(pRTP); + ASSERT(pRSS); + createItem(pRTP, pRSS, pRSS->getName(), IconType::SUB_ROOT_3); + + int count = pRTP->getParamsCount(); + for (int i = 0; i < count; i++) + { + LPChartTreeItem pParam = pRSS->getParam(i); + ASSERT(pParam); + createItem(pRSS, pParam, pRTP->getParamInfo(i)->getName(), IconType::VALUE); + } + updateResource(pRSS); } void ChartTree::updateResource(const LPResource& pRSS) { - if (pRSS->isErased()) - { - pRSS->getCtrlItem().setIcon(0, m_iconList[IT_ERASED]); - } - else - { - pRSS->getCtrlItem().setIcon(0, m_iconList[IT_SUB_ROOT_3]); - } + pRSS->getCtrlItem().setIcon(0, m_iconList[static_cast(pRSS->isErased() + ? IconType::ERASED + : IconType::SUB_ROOT_3)]); } void ChartTree::addPattern(const LPPattern& pPAT) { - ASSERT(pPAT); - createItem(m_rootPAT, pPAT, pPAT->getName(), IT_SUB_ROOT_2); + ASSERT(pPAT); + createItem(m_rootPAT, pPAT, pPAT->getName(), IconType::SUB_ROOT_2); } void ChartTree::addOperation(const LPOperationBase& pOPR) { - createItem(pOPR->getPattern(), pOPR, pOPR->getName(), IT_VALUE); + createItem(pOPR->getPattern(), pOPR, pOPR->getName(), IconType::VALUE); } void ChartTree::addResult(const LPResult& pPMV) { - createItem(m_rootPMV, pPMV, pPMV->getName(), IT_VALUE); + createItem(m_rootPMV, pPMV, pPMV->getName(), IconType::VALUE); } void ChartTree::deleteChildren(const LPChartTreeItem& pParent) { - QList children = pParent->getCtrlItem().takeChildren(); - for (QTreeWidgetItem* item: children) - { - pParent->getCtrlItem().removeChild(item); - } + QList children = pParent->getCtrlItem().takeChildren(); + for (QTreeWidgetItem* item: children) + { + pParent->getCtrlItem().removeChild(item); + } } void ChartTree::clear() { - deleteChildren(m_rootRTP); - deleteChildren(m_rootPAT); - deleteChildren(m_rootPMV); - m_root->getCtrlItem().setText(0, "Модель"); + deleteChildren(m_rootRTP); + deleteChildren(m_rootPAT); + deleteChildren(m_rootPMV); + m_root->getCtrlItem().setText(0, "Модель"); } void ChartTree::createChart(QTreeWidgetItem* pCtrlItem) const { - LPSerie pSerie = getIfItemIsDrawable(pCtrlItem).object_dynamic_cast(); - if (pSerie) - { - g_pTracer->addSerieToChart(pSerie); - } + LPSerie pSerie = getIfItemIsDrawable(pCtrlItem).object_dynamic_cast(); + if (pSerie) + { + g_pTracer->addSerieToChart(pSerie); + } } bool ChartTree::activateExistingChart(QTreeWidgetItem* pCtrlItem) const { - LPSerie pSerie = getIfItemIsDrawable(pCtrlItem).object_dynamic_cast(); - if (pSerie) - { - return pSerie->activateFirstDoc(); - } - return false; + LPSerie pSerie = getIfItemIsDrawable(pCtrlItem).object_dynamic_cast(); + if (pSerie) + { + return pSerie->activateFirstDoc(); + } + return false; } QTreeWidgetItem* ChartTree::getSelected() const { - QList selected = selectedItems(); - return selected.size() == 1 - ? selected.front() - : NULL; + QList selected = selectedItems(); + return selected.size() == 1 + ? selected.front() + : NULL; } void ChartTree::onTreeWidgetItemDoubleClicked(QTreeWidgetItem* pCtrlItem, int) { - if (!g_pTracer->getDrawTrace()) - return; + if (!g_pTracer->getDrawTrace()) + return; - if (!activateExistingChart(pCtrlItem)) - { - createChart(pCtrlItem); - } + if (!activateExistingChart(pCtrlItem)) + { + createChart(pCtrlItem); + } } void ChartTree::onChartCreate() { - createChart(getSelected()); + createChart(getSelected()); } void ChartTree::onChartExport() { - if (!g_pTracer->getDrawTrace()) - return; - - LPChartTreeItem pItem = getIfItemIsDrawable(getSelected()); - if (!pItem) - return; - - LPSerie pSerie = pItem.object_dynamic_cast(); - ASSERT(pSerie); - Serie::ExportData exportData = pSerie->exportData(); - if (exportData.empty()) - return; - - boost::filesystem::path path = - boost::filesystem::path(g_pModel->getFullName().toStdString()).parent_path() / - QString("%1.csv").arg(pSerie->getTitle()).toStdString(); - - QString fileName = QFileDialog::getSaveFileName( - this, - "Сохранить", - QString::fromStdString(path.string()), - "csv-файл (*.csv);;Все файлы (*.*)" - ); - if (fileName.isEmpty()) - return; - - QFile data(fileName); - if (data.open(QIODevice::Text | QFile::WriteOnly | QFile::Truncate)) - { - QTextStream stream(&data); - for (const Serie::ExportData::value_type& exportItem: exportData) - { - stream << exportItem << endl; - } - data.close(); - } + if (!g_pTracer->getDrawTrace()) + return; + + LPChartTreeItem pItem = getIfItemIsDrawable(getSelected()); + if (!pItem) + return; + + LPSerie pSerie = pItem.object_dynamic_cast(); + ASSERT(pSerie); + Serie::ExportData exportData = pSerie->exportData(); + if (exportData.empty()) + return; + + boost::filesystem::path path = + boost::filesystem::path(g_pModel->getFullName().toStdString()).parent_path() / + QString("%1.csv").arg(pSerie->getTitle()).toStdString(); + + QString fileName = QFileDialog::getSaveFileName( + this, + "Сохранить", + QString::fromStdString(path.string()), + "csv-файл (*.csv);;Все файлы (*.*)" + ); + if (fileName.isEmpty()) + return; + + QFile data(fileName); + if (data.open(QIODevice::Text | QFile::WriteOnly | QFile::Truncate)) + { + QTextStream stream(&data); + for (const Serie::ExportData::value_type& exportItem: exportData) + { + stream << exportItem << endl; + } + data.close(); + } } void ChartTree::focusInEvent(QFocusEvent* pEvent) { - parent_type::focusInEvent(pEvent); - activate(pEvent); + parent_type::focusInEvent(pEvent); + activate(pEvent); } void ChartTree::focusOutEvent(QFocusEvent* pEvent) { - deactivate(pEvent); - parent_type::focusOutEvent(pEvent); + deactivate(pEvent); + parent_type::focusOutEvent(pEvent); } void ChartTree::onUpdateActions(bool activated) { - MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); - - updateAction( - pMainWindow->actChartCreate, - activated && g_pTracer->getDrawTrace() && getIfItemIsDrawable(getSelected()), - this, &ChartTree::onChartCreate - ); - - updateAction( - pMainWindow->actChartExport, - activated && g_pTracer->getDrawTrace() && getIfItemIsDrawable(getSelected()), - this, &ChartTree::onChartExport - ); - - updateAction( - pMainWindow->actHelpContext, - activated, - this, &ChartTree::onHelpContext - ); + MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); + + updateAction( + pMainWindow->actChartCreate, + activated && g_pTracer->getDrawTrace() && getIfItemIsDrawable(getSelected()), + this, &ChartTree::onChartCreate + ); + + updateAction( + pMainWindow->actChartExport, + activated && g_pTracer->getDrawTrace() && getIfItemIsDrawable(getSelected()), + this, &ChartTree::onChartExport + ); + + updateAction( + pMainWindow->actHelpContext, + activated, + this, &ChartTree::onHelpContext + ); } void ChartTree::onHelpContext() { - QByteArray ba; - ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_model/work_model_chart.htm\n"); - g_pApp->callQtAssistant(ba); + QByteArray ba; + ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_model/work_model_chart.htm\n"); + g_pApp->callQtAssistant(ba); } void ChartTree::mousePressEvent(QMouseEvent* pEvent) { - QTreeWidgetItem* item = itemAt(pEvent->pos()); - this->setCurrentItem(item); - onUpdateActions(isActivated()); - if (pEvent->button() == Qt::LeftButton) - { - LPSerie pSerie = getIfItemIsDrawable(getSelected()).object_dynamic_cast(); - if(pSerie) - { - doDragDrop(pSerie); - } - parent_type::mousePressEvent(pEvent); - } + QTreeWidgetItem* item = itemAt(pEvent->pos()); + this->setCurrentItem(item); + onUpdateActions(isActivated()); + if (pEvent->button() == Qt::LeftButton) + { + LPSerie pSerie = getIfItemIsDrawable(getSelected()).object_dynamic_cast(); + if(pSerie) + { + doDragDrop(pSerie); + } + parent_type::mousePressEvent(pEvent); + } } void ChartTree::contextMenuEvent(QContextMenuEvent* pEvent) { - m_pPopupMenu->exec(pEvent->globalPos()); + m_pPopupMenu->exec(pEvent->globalPos()); } \ No newline at end of file diff --git a/app/rdo_studio/src/tracer/chart/chart_tree.h b/app/rdo_studio/src/tracer/chart/chart_tree.h index 25853b4f7..e4363aa3d 100644 --- a/app/rdo_studio/src/tracer/chart/chart_tree.h +++ b/app/rdo_studio/src/tracer/chart/chart_tree.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_CHART_TREE_H_ -#define _RDO_STUDIO_TRACER_CHART_TREE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -22,70 +21,68 @@ PREDECLARE_POINTER(OperationBase); PREDECLARE_POINTER(Result); class ChartTree - : public QTreeWidget - , public ActionActivator + : public QTreeWidget + , public ActionActivator { Q_OBJECT public: - ChartTree(QWidget* pParent); - virtual ~ChartTree(); - - void setModelName (const QString& modelName); - void addResourceType(const LPResourceType& pRTP); - void addResource (const LPResource& pRSS); - void updateResource (const LPResource& pRSS); - void addPattern (const LPPattern& pPAT); - void addOperation (const LPOperationBase& pOPR); - void addResult (const LPResult& pPMV); - void deleteChildren (const LPChartTreeItem& pParent); - void clear(); + ChartTree(QWidget* pParent); + virtual ~ChartTree(); + + void setModelName (const QString& modelName); + void addResourceType(const LPResourceType& pRTP); + void addResource (const LPResource& pRSS); + void updateResource (const LPResource& pRSS); + void addPattern (const LPPattern& pPAT); + void addOperation (const LPOperationBase& pOPR); + void addResult (const LPResult& pPMV); + void deleteChildren (const LPChartTreeItem& pParent); + void clear(); private: - typedef QTreeWidget parent_type; - - enum IconType - { - IT_ROOT = 0, - IT_SUB_ROOT_1, - IT_SUB_ROOT_2, - IT_SUB_ROOT_3, - IT_VALUE, - IT_ERASED, - IT_COUNT - }; - typedef std::vector IconList; - - LPChartTreeItem m_root; - LPChartTreeItem m_rootRTP; - LPChartTreeItem m_rootPAT; - LPChartTreeItem m_rootPMV; - IconList m_iconList; - QMenu* m_pPopupMenu; - - void createItem(const LPChartTreeItem& parent, const LPChartTreeItem& item, const QString& name, IconType iconType); - - void createChart (QTreeWidgetItem* pCtrlItem) const; - bool activateExistingChart(QTreeWidgetItem* pCtrlItem) const; - - LPChartTreeItem getIfItemIsDrawable(const QTreeWidgetItem* pCtrlItem) const; - QTreeWidgetItem* getSelected() const; - - virtual void focusInEvent (QFocusEvent* pEvent); - virtual void focusOutEvent (QFocusEvent* pEvent); - virtual void mousePressEvent (QMouseEvent* pEvent); - virtual void contextMenuEvent(QContextMenuEvent* pEvent); - virtual void onUpdateActions (bool activated); - - void doDragDrop(const LPSerie& pSerie); + typedef QTreeWidget parent_type; + + enum class IconType + { + ROOT = 0, + SUB_ROOT_1, + SUB_ROOT_2, + SUB_ROOT_3, + VALUE, + ERASED, + COUNT + }; + typedef std::vector IconList; + + LPChartTreeItem m_root; + LPChartTreeItem m_rootRTP; + LPChartTreeItem m_rootPAT; + LPChartTreeItem m_rootPMV; + IconList m_iconList; + QMenu* m_pPopupMenu; + + void createItem(const LPChartTreeItem& parent, const LPChartTreeItem& item, const QString& name, IconType iconType); + + void createChart (QTreeWidgetItem* pCtrlItem) const; + bool activateExistingChart(QTreeWidgetItem* pCtrlItem) const; + + LPChartTreeItem getIfItemIsDrawable(const QTreeWidgetItem* pCtrlItem) const; + QTreeWidgetItem* getSelected() const; + + virtual void focusInEvent (QFocusEvent* pEvent); + virtual void focusOutEvent (QFocusEvent* pEvent); + virtual void mousePressEvent (QMouseEvent* pEvent); + virtual void contextMenuEvent(QContextMenuEvent* pEvent); + virtual void onUpdateActions (bool activated); + + void doDragDrop(const LPSerie& pSerie); private slots: - void onTreeWidgetItemDoubleClicked(QTreeWidgetItem* pCtrlItem, int); - void onChartCreate(); - void onChartExport(); - void onHelpContext(); + void onTreeWidgetItemDoubleClicked(QTreeWidgetItem* pCtrlItem, int); + void onChartCreate(); + void onChartExport(); + void onHelpContext(); }; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_CHART_TREE_H_ diff --git a/app/rdo_studio/src/tracer/chart/chart_tree_item.cpp b/app/rdo_studio/src/tracer/chart/chart_tree_item.cpp index 3a4cc8222..1a400a9d6 100644 --- a/app/rdo_studio/src/tracer/chart/chart_tree_item.cpp +++ b/app/rdo_studio/src/tracer/chart/chart_tree_item.cpp @@ -8,8 +8,8 @@ using namespace rdo::gui::tracer; ChartTreeItem::ChartTreeItem(bool drawable) - : m_pCtrlItem(NULL ) - , m_drawable (drawable) + : m_pCtrlItem(NULL ) + , m_drawable (drawable) {} ChartTreeItem::~ChartTreeItem() @@ -17,16 +17,16 @@ ChartTreeItem::~ChartTreeItem() void ChartTreeItem::setCtrlItem(QTreeWidgetItem* pCtrlItem) { - m_pCtrlItem = pCtrlItem; + m_pCtrlItem = pCtrlItem; } QTreeWidgetItem& ChartTreeItem::getCtrlItem() { - ASSERT(m_pCtrlItem) - return *m_pCtrlItem; + ASSERT(m_pCtrlItem) + return *m_pCtrlItem; } bool ChartTreeItem::isDrawable() const { - return m_drawable; + return m_drawable; } diff --git a/app/rdo_studio/src/tracer/chart/chart_tree_item.h b/app/rdo_studio/src/tracer/chart/chart_tree_item.h index 61345e996..7a2061c82 100644 --- a/app/rdo_studio/src/tracer/chart/chart_tree_item.h +++ b/app/rdo_studio/src/tracer/chart/chart_tree_item.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_CHART_TREE_ITEM_H_ -#define _RDO_STUDIO_TRACER_CHART_TREE_ITEM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -15,22 +14,20 @@ class ChartTreeItem: public rdo::counter_reference { DECLARE_FACTORY(ChartTreeItem) public: - void setCtrlItem(QTreeWidgetItem* pCtrlItem); - QTreeWidgetItem& getCtrlItem(); + void setCtrlItem(QTreeWidgetItem* pCtrlItem); + QTreeWidgetItem& getCtrlItem(); - bool isDrawable() const; + bool isDrawable() const; protected: - ChartTreeItem (bool drawable = false); - ~ChartTreeItem(); + ChartTreeItem (bool drawable = false); + ~ChartTreeItem(); private: - QTreeWidgetItem* m_pCtrlItem; - bool m_drawable; // set to true ONLY for TracerSerie and descendants + QTreeWidgetItem* m_pCtrlItem; + bool m_drawable; // set to true ONLY for TracerSerie and descendants }; typedef rdo::intrusive_ptr LPChartTreeItem; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_CHART_TREE_ITEM_H_ diff --git a/app/rdo_studio/src/tracer/chart/chart_view.cpp b/app/rdo_studio/src/tracer/chart/chart_view.cpp index 32c95d797..c14aac1de 100644 --- a/app/rdo_studio/src/tracer/chart/chart_view.cpp +++ b/app/rdo_studio/src/tracer/chart/chart_view.cpp @@ -24,1060 +24,991 @@ using namespace rdo::gui::style; // -------------------- ChartView // -------------------------------------------------------------------------------- ChartView::ChartView(QAbstractScrollArea* pParent, ChartDoc* pDocument, const bool preview) - : super(pParent) - , m_pddSerie(NULL) - , m_bmpRect(0, 0, 0, 0) - , m_clientRect(0, 0, 0, 0) - , m_valueCountX(5) - , m_valueCountY(5) - , m_timeWrapFlag(true) - , m_chartRect(0, 0, 0, 0) - , m_timeScale(0) - , m_chartShift(0) - , m_drawFromEventID(0) - , m_drawToEventCount(0) - , m_legendRect(0, 0, 0, 0) - , m_pPopupMenu(NULL) - , m_zoom(1) - , m_zoomOld(1) - , m_zoomAuto(1) - , m_zoomAutoFlag(false) - , m_scaleKoeff(1) - , m_previewMode(preview) - , m_pStyle(NULL) - , m_pYAxis(NULL) - , m_needDrawLegend(true) - , m_pDocument(pDocument) -{ - setAcceptDrops(true); - connect(&getHorzScrollBar(), &QScrollBar::valueChanged, this, &ChartView::onHorzScrollBarValueChanged); - - if (m_previewMode) - m_timeWrapFlag = false; - - if (!m_previewMode) - { - setStyle(&g_pApp->getStyle()->style_chart, false); - } - - if (getDocument()) - { - recalcLayout(); - updateScrollBars(); - } - - Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); - - m_pPopupMenu = new QMenu(pParent); - m_pPopupMenu->addAction(pMainWindow->actEditCopy); - m_pPopupMenu->addSeparator(); - m_pPopupMenu->addAction(pMainWindow->actViewZoomInc); - m_pPopupMenu->addAction(pMainWindow->actViewZoomDec); - m_pPopupMenu->addAction(pMainWindow->actViewZoomAuto); - m_pPopupMenu->addAction(pMainWindow->actViewZoomReset); - m_pPopupMenu->addSeparator(); - m_pPopupMenu->addAction(pMainWindow->actChartTimeWrap); - m_pPopupMenu->addSeparator(); - m_pPopupMenu->addAction(pMainWindow->actChartOptions); - - attachToDoc(); + : super(pParent) + , m_pddSerie(NULL) + , m_bmpRect(0, 0, 0, 0) + , m_clientRect(0, 0, 0, 0) + , m_valueCountX(5) + , m_valueCountY(5) + , m_timeWrapFlag(true) + , m_chartRect(0, 0, 0, 0) + , m_timeScale(0) + , m_chartShift(0) + , m_drawFromEventID(0) + , m_drawToEventCount(0) + , m_legendRect(0, 0, 0, 0) + , m_pPopupMenu(NULL) + , m_zoom(1) + , m_zoomOld(1) + , m_zoomAuto(1) + , m_zoomAutoFlag(false) + , m_scaleKoeff(1) + , m_previewMode(preview) + , m_pStyle(NULL) + , m_pYAxis(NULL) + , m_needDrawLegend(true) + , m_pDocument(pDocument) +{ + setAcceptDrops(true); + connect(&getHorzScrollBar(), &QScrollBar::valueChanged, this, &ChartView::onHorzScrollBarValueChanged); + + if (m_previewMode) + m_timeWrapFlag = false; + + if (!m_previewMode) + setStyle(&g_pApp->getStyle()->style_chart, false); + + if (getDocument()) + { + recalcLayout(); + updateScrollBars(); + } + + Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); + + m_pPopupMenu = new QMenu(pParent); + m_pPopupMenu->addAction(pMainWindow->actEditCopy); + m_pPopupMenu->addSeparator(); + m_pPopupMenu->addAction(pMainWindow->actViewZoomInc); + m_pPopupMenu->addAction(pMainWindow->actViewZoomDec); + m_pPopupMenu->addAction(pMainWindow->actViewZoomAuto); + m_pPopupMenu->addAction(pMainWindow->actViewZoomReset); + m_pPopupMenu->addSeparator(); + m_pPopupMenu->addAction(pMainWindow->actChartTimeWrap); + m_pPopupMenu->addSeparator(); + m_pPopupMenu->addAction(pMainWindow->actChartOptions); + + attachToDoc(); } ChartView::~ChartView() { - if (getDocument()) - { - getDocument()->removeFromViews(this); - } - delete m_pDocument; + if (getDocument()) + getDocument()->removeFromViews(this); + + delete m_pDocument; } int ChartView::getValueCountX() const { - return m_valueCountX; + return m_valueCountX; } void ChartView::setValueCountX(int value) { - m_valueCountX = value; - recalcLayout(); + m_valueCountX = value; + recalcLayout(); } int ChartView::getValueCountY() const { - return m_valueCountY; + return m_valueCountY; } void ChartView::setValueCountY(int value) { - m_valueCountY = value; - recalcLayout(); + m_valueCountY = value; + recalcLayout(); } void ChartView::setYAxis(ChartSerie* pSerie) { - ASSERT(pSerie); - m_pYAxis = pSerie; - recalcLayout(); + ASSERT(pSerie); + m_pYAxis = pSerie; + recalcLayout(); } bool ChartView::isDrawLegend() const { - return m_needDrawLegend; + return m_needDrawLegend; } void ChartView::setDrawLegend(bool value) { - m_needDrawLegend = value; + m_needDrawLegend = value; } long double ChartView::timeScale() const { - return m_timeScale; + return m_timeScale; } int ChartView::chartShift() const { - return m_chartShift; + return m_chartShift; } const Time& ChartView::drawFromX() const { - return m_drawFromX; + return m_drawFromX; } const Time& ChartView::drawToX() const { - return m_drawToX; + return m_drawToX; } int ChartView::drawFromEventID() const { - return m_drawFromEventID; + return m_drawFromEventID; } int ChartView::drawToEventCount() const { - return m_drawToEventCount; + return m_drawToEventCount; } const ChartDoc::TimesList& ChartView::unwrapTimesList() const { - return m_unwrapTimesList; + return m_unwrapTimesList; } const ChartViewStyle* const ChartView::style() const { - return m_pStyle; + return m_pStyle; } void ChartView::recalcLayout() { - ChartDoc* pDoc = getDocument(); - - QFontMetrics titleFontMetrics(m_fontTitle); - QString str = pDoc->getTitle(); - QSize titleSize = !str.isEmpty() - ? titleFontMetrics.size(Qt::TextSingleLine, str) - : QSize(0, 0); - m_chartRect.setTop(titleSize.height() + 5); - - QFontMetrics axisFontMetrics(m_fontAxis); - QSize sizeMax(0, 0); - if (m_pYAxis) - { - m_pYAxis->getCaptions(m_captionList, m_valueCountY); - for (std::vector::iterator it = m_captionList.begin(); it != m_captionList.end(); ++it) - { - QRect rect = axisFontMetrics.boundingRect(QString::fromStdString(*it)); - if (rect.width() > sizeMax.width()) - { - sizeMax.setWidth(rect.width()); - } - } - } - m_chartRect.setLeft(sizeMax.width() + 10); - - str = QString("%1").arg( - !pDoc->getTimes().empty() - ? pDoc->getTimes().back()->time - : 0.0, - 0, 'f', 3 - ); - QSize size = axisFontMetrics.boundingRect(str).size(); - m_chartRect.setRight(m_clientRect.right() - size.width() - 5); - m_chartRect.setBottom(m_clientRect.bottom() - size.height() - 7); - - if (m_needDrawLegend) - { - QFontMetrics legendFontMetrics(m_fontLegend); - int count = 0; - for (const ChartSerie* const pSerie: pDoc->getSerieList()) - { - size = pSerie->getLegendSize(legendFontMetrics, m_chartRect); - if (size.width() && size.height()) - { - if (size.width() > sizeMax.width()) - { - sizeMax.setWidth(size.width()); - } - if (size.height() > sizeMax.height()) - { - sizeMax.setHeight(size.height()); - } - count++; - } - } - - m_legendRect.setTop(m_chartRect.top()); - m_legendRect.setBottom(m_legendRect.top() + count * sizeMax.height() + 3 + pDoc->getMaxMarkerSize() / 2); - m_legendRect.setLeft(m_chartRect.left() + (m_chartRect.width() - sizeMax.width()) / 2); - m_legendRect.setRight(m_legendRect.left() + sizeMax.width()); - m_chartRect.setTop(m_chartRect.top() + m_legendRect.height()); - if (m_legendRect.width() > m_chartRect.width()) - { - m_legendRect.setLeft(m_chartRect.left()); - m_legendRect.setRight(m_chartRect.right()); - } - } - - if (!pDoc->getTimes().empty()) - { - double timeRange = pDoc->getTimes().back()->time - pDoc->getTimes().front()->time; - if (timeRange > 0) - { - long double timeScaleAuto = doUnwrapTime() ? (double)(m_chartRect.width() - m_pStyle->pFontsTicks.tickWidth * pDoc->getTicksCount()) / timeRange : (double)m_chartRect.width() / timeRange; - m_timeScale = (double)m_pStyle->pFontsTicks.tickWidth / pDoc->getMinTimeOffset(); - m_zoomAuto = double(timeScaleAuto) / double(m_timeScale); - /*if (doUnwrapTime() && auto_zoom < 0) { - auto_zoom = 1; - }*/ - if (m_zoomAutoFlag || (m_zoomAuto > 1 /*&& scale_koeff < auto_zoom*/)) - { - m_scaleKoeff = m_zoomAuto; - } - if (!m_zoomAutoFlag && m_zoomAuto <= 1) - { - m_scaleKoeff = m_zoom; - } - } - else - { - m_timeScale = 0; - m_scaleKoeff = 1; - } - } - else - { - m_timeScale = 0; - m_scaleKoeff = 1; - } - - m_timeScale *= m_scaleKoeff; + ChartDoc* pDoc = getDocument(); + + QFontMetrics titleFontMetrics(m_fontTitle); + QString str = pDoc->getTitle(); + QSize titleSize = !str.isEmpty() + ? titleFontMetrics.size(Qt::TextSingleLine, str) + : QSize(0, 0); + m_chartRect.setTop(titleSize.height() + 5); + + QFontMetrics axisFontMetrics(m_fontAxis); + QSize sizeMax(0, 0); + if (m_pYAxis) + { + m_pYAxis->getCaptions(m_captionList, m_valueCountY); + for (std::vector::iterator it = m_captionList.begin(); it != m_captionList.end(); ++it) + { + QRect rect = axisFontMetrics.boundingRect(QString::fromStdString(*it)); + if (rect.width() > sizeMax.width()) + sizeMax.setWidth(rect.width()); + } + } + m_chartRect.setLeft(sizeMax.width() + 10); + + str = QString("%1").arg( + !pDoc->getTimes().empty() + ? pDoc->getTimes().back()->time + : 0.0, + 0, 'f', 3 + ); + QSize size = axisFontMetrics.boundingRect(str).size(); + m_chartRect.setRight(m_clientRect.right() - size.width() - 5); + m_chartRect.setBottom(m_clientRect.bottom() - size.height() - 7); + + if (m_needDrawLegend) + { + QFontMetrics legendFontMetrics(m_fontLegend); + int count = 0; + for (const ChartSerie* const pSerie: pDoc->getSerieList()) + { + size = pSerie->getLegendSize(legendFontMetrics, m_chartRect); + if (size.width() && size.height()) + { + if (size.width() > sizeMax.width()) + sizeMax.setWidth(size.width()); + + if (size.height() > sizeMax.height()) + sizeMax.setHeight(size.height()); + + count++; + } + } + + m_legendRect.setTop(m_chartRect.top()); + m_legendRect.setBottom(m_legendRect.top() + count * sizeMax.height() + 3 + pDoc->getMaxMarkerSize() / 2); + m_legendRect.setLeft(m_chartRect.left() + (m_chartRect.width() - sizeMax.width()) / 2); + m_legendRect.setRight(m_legendRect.left() + sizeMax.width()); + m_chartRect.setTop(m_chartRect.top() + m_legendRect.height()); + if (m_legendRect.width() > m_chartRect.width()) + { + m_legendRect.setLeft(m_chartRect.left()); + m_legendRect.setRight(m_chartRect.right()); + } + } + + if (!pDoc->getTimes().empty()) + { + double timeRange = pDoc->getTimes().back()->time - pDoc->getTimes().front()->time; + if (timeRange > 0) + { + long double timeScaleAuto = doUnwrapTime() ? (double)(m_chartRect.width() - m_pStyle->pFontsTicks.tickWidth * pDoc->getTicksCount()) / timeRange : (double)m_chartRect.width() / timeRange; + m_timeScale = (double)m_pStyle->pFontsTicks.tickWidth / pDoc->getMinTimeOffset(); + m_zoomAuto = double(timeScaleAuto) / double(m_timeScale); + + if (m_zoomAutoFlag || (m_zoomAuto > 1 /*&& scale_koeff < auto_zoom*/)) + m_scaleKoeff = m_zoomAuto; + + if (!m_zoomAutoFlag && m_zoomAuto <= 1) + m_scaleKoeff = m_zoom; + } + else + { + m_timeScale = 0; + m_scaleKoeff = 1; + } + } + else + { + m_timeScale = 0; + m_scaleKoeff = 1; + } + + m_timeScale *= m_scaleKoeff; } QScrollBar& ChartView::getHorzScrollBar() { - QScrollBar* pScrollBar = static_cast(parentWidget())->horizontalScrollBar(); - ASSERT(pScrollBar); - return *pScrollBar; + QScrollBar* pScrollBar = static_cast(parentWidget())->horizontalScrollBar(); + ASSERT(pScrollBar); + return *pScrollBar; } void ChartView::updateScrollBars() { - ChartDoc* doc = getDocument(); + ChartDoc* doc = getDocument(); - int size; - if (!doc->getTimes().empty()) - { - size = rdo::roundDouble((doc->getTimes().back()->time - doc->getTimes().front()->time) * double(m_timeScale)); - if (doUnwrapTime()) - { - size += m_pStyle->pFontsTicks.tickWidth * doc->getTicksCount(); - } - } - else - { - size = 0; - } + int size; + if (!doc->getTimes().empty()) + { + size = rdo::roundDouble((doc->getTimes().back()->time - doc->getTimes().front()->time) * double(m_timeScale)); + if (doUnwrapTime()) + { + size += m_pStyle->pFontsTicks.tickWidth * doc->getTicksCount(); + } + } + else + { + size = 0; + } - m_SM_X.pageSize = m_chartRect.width(); - m_SM_X.posMax = std::max(0, size - m_chartRect.width()); - m_SM_X.position = std::min(m_SM_X.position, m_SM_X.posMax); + m_SM_X.pageSize = m_chartRect.width(); + m_SM_X.posMax = std::max(0, size - m_chartRect.width()); + m_SM_X.position = std::min(m_SM_X.position, m_SM_X.posMax); - getHorzScrollBar().setRange (0, m_SM_X.posMax); - getHorzScrollBar().setPageStep(m_SM_X.pageSize); - getHorzScrollBar().setValue (m_SM_X.position); + getHorzScrollBar().setRange (0, m_SM_X.posMax); + getHorzScrollBar().setPageStep(m_SM_X.pageSize); + getHorzScrollBar().setValue (m_SM_X.position); } bool ChartView::scrollHorizontally(int inc) { - if (!m_SM_X.applyInc(inc)) - { - return false; - } + if (!m_SM_X.applyInc(inc)) + return false; - getHorzScrollBar().setValue(m_SM_X.position); - update(); - return true; + getHorzScrollBar().setValue(m_SM_X.position); + update(); + return true; } void ChartView::onHorzScrollBarValueChanged(int value) { - if (value < 0) - { - return; - } + if (value < 0) + return; - scrollHorizontally(value - m_SM_X.position); + scrollHorizontally(value - m_SM_X.position); } void ChartView::keyPressEvent(QKeyEvent* pEvent) { - boost::optional position; + boost::optional position; - switch (pEvent->key()) - { - case Qt::Key_Left : position = std::max(0, m_SM_X.position - (pEvent->modifiers().testFlag(Qt::ControlModifier) ? m_SM_X.pageSize : 1)); break; - case Qt::Key_Right : position = std::min(m_SM_X.posMax, m_SM_X.position + (pEvent->modifiers().testFlag(Qt::ControlModifier) ? m_SM_X.pageSize : 1)); break; - case Qt::Key_PageUp : position = std::max(0, m_SM_X.position - m_SM_X.pageSize); break; - case Qt::Key_PageDown: position = std::min(m_SM_X.posMax, m_SM_X.position + m_SM_X.pageSize); break; - case Qt::Key_Home : position = 0; break; - case Qt::Key_End : position = m_SM_X.posMax; break; - break; - } + switch (pEvent->key()) + { + case Qt::Key_Left : position = std::max(0, m_SM_X.position - (pEvent->modifiers().testFlag(Qt::ControlModifier) ? m_SM_X.pageSize : 1)); break; + case Qt::Key_Right : position = std::min(m_SM_X.posMax, m_SM_X.position + (pEvent->modifiers().testFlag(Qt::ControlModifier) ? m_SM_X.pageSize : 1)); break; + case Qt::Key_PageUp : position = std::max(0, m_SM_X.position - m_SM_X.pageSize); break; + case Qt::Key_PageDown: position = std::min(m_SM_X.posMax, m_SM_X.position + m_SM_X.pageSize); break; + case Qt::Key_Home : position = 0; break; + case Qt::Key_End : position = m_SM_X.posMax; break; + } - if (position.is_initialized()) - { - getHorzScrollBar().setValue(position.get()); - } + if (position.is_initialized()) + getHorzScrollBar().setValue(position.get()); } void ChartView::wheelEvent(QWheelEvent* pEvent) { - getHorzScrollBar().setValue(getHorzScrollBar().value() - m_SM_X.pageSize * (pEvent->delta() > 0 ? 1 : -1)); + getHorzScrollBar().setValue(getHorzScrollBar().value() - m_SM_X.pageSize * (pEvent->delta() > 0 ? 1 : -1)); } void ChartView::contextMenuEvent(QContextMenuEvent* pEvent) { - if (!m_previewMode) - { - m_pPopupMenu->exec(pEvent->globalPos()); - } + if (!m_previewMode) + m_pPopupMenu->exec(pEvent->globalPos()); } void ChartView::dragEnterEvent(QDragEnterEvent* pEvent) { - if (pEvent->mimeData()->hasFormat("ChartSerie")) - { - QByteArray serieData = pEvent->mimeData()->data("ChartSerie"); - m_pddSerie = (Serie*)serieData.toULongLong(); - if(!getDocument()->serieExists(m_pddSerie)) - { - pEvent->acceptProposedAction(); - } - } + if (pEvent->mimeData()->hasFormat("ChartSerie")) + { + QByteArray serieData = pEvent->mimeData()->data("ChartSerie"); + m_pddSerie = (Serie*)serieData.toULongLong(); + if (!getDocument()->serieExists(m_pddSerie)) + pEvent->acceptProposedAction(); + } } void ChartView::dropEvent(QDropEvent* pEvent) { - getDocument()->addSerie(m_pddSerie); - m_pddSerie = NULL; - pEvent->acceptProposedAction(); + getDocument()->addSerie(m_pddSerie); + m_pddSerie = NULL; + pEvent->acceptProposedAction(); } void ChartView::dragLeaveEvent(QDragLeaveEvent*) { - m_pddSerie = NULL; + m_pddSerie = NULL; } bool ChartView::setTo(const int fromMaxPos) { - bool res = true; - int delta = (fromMaxPos - m_SM_X.position - m_chartRect.width()) / m_pStyle->pFontsTicks.tickWidth; - if (delta >= 0) - { - res = false; - m_drawToX = m_drawFromX; - m_drawToEventCount = m_drawToX.eventCount - delta; - } - return res; + bool res = true; + int delta = (fromMaxPos - m_SM_X.position - m_chartRect.width()) / m_pStyle->pFontsTicks.tickWidth; + if (delta >= 0) + { + res = false; + m_drawToX = m_drawFromX; + m_drawToEventCount = m_drawToX.eventCount - delta; + } + return res; } void ChartView::setFromTo() { - ChartDoc* doc = getDocument(); - - m_drawFromX.eventCount = 0; - m_drawFromEventID = 0; - m_drawToX.eventCount = 0; - m_drawToEventCount = 0; - m_chartShift = 0; - m_unwrapTimesList.clear(); - - if (!doUnwrapTime()) - { - if (m_timeScale) - { - m_drawFromX.time = doc->getTimes().front()->time + (double)m_SM_X.position / double(m_timeScale); - if (maxXVisible()) - { - m_drawToX.time = doc->getTimes().back()->time; - } - else - { - m_drawToX.time = doc->getTimes().front()->time + (double)(m_SM_X.position + m_chartRect.width()) / double(m_timeScale); - } - } - else - { - m_drawFromX.time = 0; - m_drawToX.time = 0; - } - } - else - { - int it_pos = 0; - int it_max_pos = 0; - bool need_search_to = true; - int ticks = 0; - ChartDoc::TimesList::const_iterator it; - for (it = doc->getTimes().begin(); it != doc->getTimes().end(); ++it) - { - it_pos = rdo::roundDouble(((*it)->time - doc->getTimes().front()->time) * double(m_timeScale)) + ticks * m_pStyle->pFontsTicks.tickWidth; - it_max_pos = it_pos + m_pStyle->pFontsTicks.tickWidth * (*it)->eventCount; - if (it_pos == m_SM_X.position) - { - m_drawFromX = *(*it); - need_search_to = setTo(it_max_pos); - break; - } - if (it_pos < m_SM_X.position && (it_max_pos >= m_SM_X.position)) - { - m_drawFromX = *(*it); - m_drawFromEventID = (m_SM_X.position - it_pos) / m_pStyle->pFontsTicks.tickWidth; - m_chartShift = m_SM_X.position - (it_pos + m_drawFromEventID * m_pStyle->pFontsTicks.tickWidth); - need_search_to = setTo(it_max_pos); - break; - } - if (it_pos > m_SM_X.position) - { - m_drawFromX.time = (*it)->time - (it_pos - m_SM_X.position) / double(m_timeScale); - need_search_to = setTo(0); - break; - } - ticks += (*it)->eventCount; - } - m_unwrapTimesList.push_back(&m_drawFromX); - if (need_search_to) - { - if (it != doc->getTimes().end() && m_drawFromX == *(*it)) - { - ticks += (*it)->eventCount; - it++; - } - if (it == doc->getTimes().end() && !doc->getTimes().empty()) - { - m_drawToX = m_drawFromX; - int delta = m_drawToX.eventCount * m_pStyle->pFontsTicks.tickWidth - m_chartRect.width(); - m_drawToEventCount = delta >= 0 ? rdo::roundDouble((double)delta / (double)m_pStyle->pFontsTicks.tickWidth) : m_drawToX.eventCount; - it_max_pos = m_drawToX.eventCount * m_pStyle->pFontsTicks.tickWidth; - if (it_max_pos > m_chartRect.width()) - { - m_drawToEventCount = (it_max_pos - m_chartRect.width()) / m_pStyle->pFontsTicks.tickWidth; - if (m_drawToEventCount * m_pStyle->pFontsTicks.tickWidth < m_chartRect.width()) - { - m_drawToEventCount++; - } - } - else - { - m_drawToEventCount = m_drawToX.eventCount; - } - - } - int pos = m_SM_X.position + m_chartRect.width(); - for (; it != doc->getTimes().end(); ++it) - { - it_pos = rdo::roundDouble(((*it)->time - doc->getTimes().front()->time) * double(m_timeScale)) + ticks * m_pStyle->pFontsTicks.tickWidth; - it_max_pos = it_pos + m_pStyle->pFontsTicks.tickWidth * (*it)->eventCount; - if (it_pos == pos) - { - m_drawToX = *(*it); - break; - } - if (it_pos < pos && it_max_pos >= pos) - { - m_drawToX = *(*it); - m_drawToEventCount = (pos - it_pos) / m_pStyle->pFontsTicks.tickWidth; - if (it_pos + m_drawToEventCount * m_pStyle->pFontsTicks.tickWidth < pos) - { - m_drawToEventCount++; - } - break; - } - if (it_pos > pos) - { - m_drawToX.time = (*it)->time - (it_pos - pos) / double(m_timeScale); - break; - } - m_unwrapTimesList.push_back((*it)); - ticks += (*it)->eventCount; - } - } - m_unwrapTimesList.push_back(&m_drawToX); - } + ChartDoc* doc = getDocument(); + + m_drawFromX.eventCount = 0; + m_drawFromEventID = 0; + m_drawToX.eventCount = 0; + m_drawToEventCount = 0; + m_chartShift = 0; + m_unwrapTimesList.clear(); + + if (!doUnwrapTime()) + { + if (m_timeScale) + { + m_drawFromX.time = doc->getTimes().front()->time + (double)m_SM_X.position / double(m_timeScale); + if (maxXVisible()) + { + m_drawToX.time = doc->getTimes().back()->time; + } + else + { + m_drawToX.time = doc->getTimes().front()->time + (double)(m_SM_X.position + m_chartRect.width()) / double(m_timeScale); + } + } + else + { + m_drawFromX.time = 0; + m_drawToX.time = 0; + } + } + else + { + int it_pos = 0; + int it_max_pos = 0; + bool need_search_to = true; + int ticks = 0; + ChartDoc::TimesList::const_iterator it; + for (it = doc->getTimes().begin(); it != doc->getTimes().end(); ++it) + { + it_pos = rdo::roundDouble(((*it)->time - doc->getTimes().front()->time) * double(m_timeScale)) + ticks * m_pStyle->pFontsTicks.tickWidth; + it_max_pos = it_pos + m_pStyle->pFontsTicks.tickWidth * (*it)->eventCount; + if (it_pos == m_SM_X.position) + { + m_drawFromX = *(*it); + need_search_to = setTo(it_max_pos); + break; + } + if (it_pos < m_SM_X.position && (it_max_pos >= m_SM_X.position)) + { + m_drawFromX = *(*it); + m_drawFromEventID = (m_SM_X.position - it_pos) / m_pStyle->pFontsTicks.tickWidth; + m_chartShift = m_SM_X.position - (it_pos + m_drawFromEventID * m_pStyle->pFontsTicks.tickWidth); + need_search_to = setTo(it_max_pos); + break; + } + if (it_pos > m_SM_X.position) + { + m_drawFromX.time = (*it)->time - (it_pos - m_SM_X.position) / double(m_timeScale); + need_search_to = setTo(0); + break; + } + ticks += (*it)->eventCount; + } + m_unwrapTimesList.push_back(&m_drawFromX); + if (need_search_to) + { + if (it != doc->getTimes().end() && m_drawFromX == *(*it)) + { + ticks += (*it)->eventCount; + it++; + } + if (it == doc->getTimes().end() && !doc->getTimes().empty()) + { + m_drawToX = m_drawFromX; + int delta = m_drawToX.eventCount * m_pStyle->pFontsTicks.tickWidth - m_chartRect.width(); + m_drawToEventCount = delta >= 0 ? rdo::roundDouble((double)delta / (double)m_pStyle->pFontsTicks.tickWidth) : m_drawToX.eventCount; + it_max_pos = m_drawToX.eventCount * m_pStyle->pFontsTicks.tickWidth; + if (it_max_pos > m_chartRect.width()) + { + m_drawToEventCount = (it_max_pos - m_chartRect.width()) / m_pStyle->pFontsTicks.tickWidth; + if (m_drawToEventCount * m_pStyle->pFontsTicks.tickWidth < m_chartRect.width()) + m_drawToEventCount++; + } + else + { + m_drawToEventCount = m_drawToX.eventCount; + } + + } + int pos = m_SM_X.position + m_chartRect.width(); + for (; it != doc->getTimes().end(); ++it) + { + it_pos = rdo::roundDouble(((*it)->time - doc->getTimes().front()->time) * double(m_timeScale)) + ticks * m_pStyle->pFontsTicks.tickWidth; + it_max_pos = it_pos + m_pStyle->pFontsTicks.tickWidth * (*it)->eventCount; + if (it_pos == pos) + { + m_drawToX = *(*it); + break; + } + if (it_pos < pos && it_max_pos >= pos) + { + m_drawToX = *(*it); + m_drawToEventCount = (pos - it_pos) / m_pStyle->pFontsTicks.tickWidth; + if (it_pos + m_drawToEventCount * m_pStyle->pFontsTicks.tickWidth < pos) + { + m_drawToEventCount++; + } + break; + } + if (it_pos > pos) + { + m_drawToX.time = (*it)->time - (it_pos - pos) / double(m_timeScale); + break; + } + m_unwrapTimesList.push_back((*it)); + ticks += (*it)->eventCount; + } + } + m_unwrapTimesList.push_back(&m_drawToX); + } } void ChartView::drawTitle(QPainter& painter, const QRect& chartRect) { - QRect rect(m_clientRect); - rect.setTop(0); - rect.setBottom(chartRect.top()); + QRect rect(m_clientRect); + rect.setTop(0); + rect.setBottom(chartRect.top()); - painter.setFont(m_fontTitle); - painter.setPen(m_pStyle->titleFGColor); - painter.drawText(rect, Qt::AlignHCenter | Qt::AlignTop, getDocument()->getTitle()); + painter.setFont(m_fontTitle); + painter.setPen(m_pStyle->titleFGColor); + painter.drawText(rect, Qt::AlignHCenter | Qt::AlignTop, getDocument()->getTitle()); } void ChartView::drawLegend(QPainter& painter, const QRect& legendRect) { - ChartDoc* doc = getDocument(); - QRect rect(legendRect); - painter.setFont(m_fontLegend); - for (const ChartSerie* const pSerie: doc->getSerieList()) - { - QSize size = pSerie->drawLegend(painter, rect, m_pStyle->legendFgColor); - rect.setTop(rect.top() + size.height()); - } + ChartDoc* doc = getDocument(); + QRect rect(legendRect); + painter.setFont(m_fontLegend); + for (const ChartSerie* const pSerie: doc->getSerieList()) + { + QSize size = pSerie->drawLegend(painter, rect, m_pStyle->legendFgColor); + rect.setTop(rect.top() + size.height()); + } } void ChartView::drawYAxis(QPainter& painter, const QRect& chartRect, const ChartSerie* axisValues) { - QRect tmprect(m_clientRect); - tmprect.setRight(chartRect.left() - 5); - tmprect.setLeft(5); - if (axisValues) - { - int count; - axisValues->getSerie()->getValueCount(count); - if (count) - { - painter.setFont(m_fontAxis); - painter.setPen(m_pStyle->axisFgColor); - - int count = m_captionList.size(); - int heightoffset = rdo::roundDouble((double)chartRect.height() / (double)(count - 1)); - tmprect.setTop(chartRect.bottom()); - int index = 0; - for (std::vector::iterator it = m_captionList.begin(); it != m_captionList.end(); ++it) - { - index++; - painter.drawText(tmprect, Qt::AlignRight, QString::fromStdString(*it)); - if (index != 1 && index < count) - { - QPainterPath path; - path.moveTo(tmprect.right() + 2, tmprect.top()); - path.lineTo(chartRect.left(), tmprect.top()); - painter.drawPath(path); - } - if (index == count - 1) - { - tmprect.setTop(chartRect.top()); - } - else - { - tmprect.setTop(tmprect.top() - heightoffset); - } - } - } - } + QRect tmprect(m_clientRect); + tmprect.setRight(chartRect.left() - 5); + tmprect.setLeft(5); + if (axisValues) + { + int count; + axisValues->getSerie()->getValueCount(count); + if (count) + { + painter.setFont(m_fontAxis); + painter.setPen(m_pStyle->axisFgColor); + + int count = m_captionList.size(); + int heightoffset = rdo::roundDouble((double)chartRect.height() / (double)(count - 1)); + tmprect.setTop(chartRect.bottom()); + int index = 0; + for (std::vector::iterator it = m_captionList.begin(); it != m_captionList.end(); ++it) + { + index++; + painter.drawText(tmprect, Qt::AlignRight, QString::fromStdString(*it)); + if (index != 1 && index < count) + { + QPainterPath path; + path.moveTo(tmprect.right() + 2, tmprect.top()); + path.lineTo(chartRect.left(), tmprect.top()); + painter.drawPath(path); + } + + if (index == count - 1) + tmprect.setTop(chartRect.top()); + else + tmprect.setTop(tmprect.top() - heightoffset); + } + } + } } void ChartView::drawXAxis(QPainter& painter, const QRect& chartRect) { - QRect tmprect(chartRect); - tmprect.setTop(chartRect.bottom() + 3); - tmprect.setLeft(chartRect.left()); - tmprect.setBottom(m_clientRect.bottom()); - tmprect.setRight(m_clientRect.right() - 5); - - ChartDoc* pDoc = getDocument(); - if (!pDoc->getTimes().empty()) - { - std::string formatstr = "%.3f"; - - painter.setFont(m_fontAxis); - painter.setPen(m_pStyle->axisFgColor); - - if (!doUnwrapTime()) - { - double valoffset = 0; - int widthoffset = chartRect.width() / (m_valueCountX - 1); - if (m_drawToX != m_drawFromX) - { - valoffset = (m_drawToX.time - m_drawFromX.time) / (m_valueCountX - 1); - } - double valo = m_drawFromX.time; - int x = chartRect.left(); - std::string str = rdo::format(formatstr.c_str(), valo); - tmprect.setLeft(x); - painter.drawText(tmprect, Qt::AlignLeft, QString::fromStdString(str)); - valo += valoffset; - x += widthoffset; - if (valoffset) - { - for (int i = 1; i < m_valueCountX; i++) - { - str = rdo::format(formatstr.c_str(), valo); - tmprect.setLeft(x); - painter.setPen(m_pStyle->axisFgColor); - painter.drawText(tmprect, Qt::AlignLeft, QString::fromStdString(str)); - if (i != m_valueCountX - 1) - { - QPainterPath path; - path.moveTo(x, chartRect.bottom()); - path.lineTo(x, chartRect.bottom() + 3); - painter.setPen(m_pStyle->defaultColor); - painter.drawPath(path); - } - valo += valoffset; - x += widthoffset; - } - } - } - else - { - int ticks = 0; - std::string str; - int lastx = 0; - QSize sz; - for (const Time* const pTime: m_unwrapTimesList) - { - tmprect.setLeft(chartRect.left() + (int)((pTime->time - m_unwrapTimesList.front()->time) * m_timeScale + ticks * m_pStyle->pFontsTicks.tickWidth - m_chartShift)); - tmprect.setLeft(std::min(tmprect.left(), chartRect.right() - 1)); - str = rdo::format(formatstr.c_str(), pTime->time); - if (*pTime == m_drawFromX) - { - tmprect.setLeft(tmprect.left() + m_chartShift); - } - if (tmprect.left() > chartRect.right()) - { - tmprect.setLeft(chartRect.right()); - } - - if (tmprect.left() > lastx) - { - painter.setPen(m_pStyle->axisFgColor); - painter.drawText(tmprect, Qt::AlignLeft, QString::fromStdString(str)); - if (tmprect.left() != chartRect.left() && tmprect.left() != chartRect.right()) - { - QPainterPath path; - path.moveTo(tmprect.left(), chartRect.bottom()); - path.lineTo(tmprect.left(), chartRect.bottom() + 3); - painter.setPen(m_pStyle->defaultColor); - painter.drawPath(path); - } - QSize size = painter.fontMetrics().boundingRect(QString::fromStdString(str)).size(); - lastx = tmprect.left() + size.width(); - } - - ticks += pTime->eventCount; - if (*pTime == m_drawFromX) - { - ticks -= m_drawFromEventID; - } - } - } - } + QRect tmprect(chartRect); + tmprect.setTop(chartRect.bottom() + 3); + tmprect.setLeft(chartRect.left()); + tmprect.setBottom(m_clientRect.bottom()); + tmprect.setRight(m_clientRect.right() - 5); + + ChartDoc* pDoc = getDocument(); + if (!pDoc->getTimes().empty()) + { + std::string formatstr = "%.3f"; + + painter.setFont(m_fontAxis); + painter.setPen(m_pStyle->axisFgColor); + + if (!doUnwrapTime()) + { + double valoffset = 0; + int widthoffset = chartRect.width() / (m_valueCountX - 1); + if (m_drawToX != m_drawFromX) + valoffset = (m_drawToX.time - m_drawFromX.time) / (m_valueCountX - 1); + + double valo = m_drawFromX.time; + int x = chartRect.left(); + std::string str = rdo::format(formatstr.c_str(), valo); + tmprect.setLeft(x); + painter.drawText(tmprect, Qt::AlignLeft, QString::fromStdString(str)); + valo += valoffset; + x += widthoffset; + if (valoffset) + { + for (int i = 1; i < m_valueCountX; i++) + { + str = rdo::format(formatstr.c_str(), valo); + tmprect.setLeft(x); + painter.setPen(m_pStyle->axisFgColor); + painter.drawText(tmprect, Qt::AlignLeft, QString::fromStdString(str)); + if (i != m_valueCountX - 1) + { + QPainterPath path; + path.moveTo(x, chartRect.bottom()); + path.lineTo(x, chartRect.bottom() + 3); + painter.setPen(m_pStyle->defaultColor); + painter.drawPath(path); + } + valo += valoffset; + x += widthoffset; + } + } + } + else + { + int ticks = 0; + std::string str; + int lastx = 0; + QSize sz; + for (const Time* const pTime: m_unwrapTimesList) + { + tmprect.setLeft(chartRect.left() + (int)((pTime->time - m_unwrapTimesList.front()->time) * m_timeScale + ticks * m_pStyle->pFontsTicks.tickWidth - m_chartShift)); + tmprect.setLeft(std::min(tmprect.left(), chartRect.right() - 1)); + str = rdo::format(formatstr.c_str(), pTime->time); + if (*pTime == m_drawFromX) + tmprect.setLeft(tmprect.left() + m_chartShift); + + if (tmprect.left() > chartRect.right()) + tmprect.setLeft(chartRect.right()); + + if (tmprect.left() > lastx) + { + painter.setPen(m_pStyle->axisFgColor); + painter.drawText(tmprect, Qt::AlignLeft, QString::fromStdString(str)); + if (tmprect.left() != chartRect.left() && tmprect.left() != chartRect.right()) + { + QPainterPath path; + path.moveTo(tmprect.left(), chartRect.bottom()); + path.lineTo(tmprect.left(), chartRect.bottom() + 3); + painter.setPen(m_pStyle->defaultColor); + painter.drawPath(path); + } + QSize size = painter.fontMetrics().boundingRect(QString::fromStdString(str)).size(); + lastx = tmprect.left() + size.width(); + } + + ticks += pTime->eventCount; + if (*pTime == m_drawFromX) + ticks -= m_drawFromEventID; + } + } + } } void ChartView::drawGrid(QPainter& painter, const QRect& chartRect) { - QRect rect(chartRect); - rect.adjust(0, 0, -1, -1); - painter.setPen (m_pStyle->defaultColor); - painter.setBrush(m_pStyle->chartBgColor); - painter.drawRect(rect); - - if (doUnwrapTime()) - { - painter.setPen(Qt::NoPen); - painter.setBrush(m_pStyle->timeBgColor); - - rect.adjust(1, 1, 0, 0); - QRect wrapRect(rect); - - int ticks = 0; - ChartDoc::TimesList::const_iterator it = m_unwrapTimesList.begin(); - if (m_drawFromX == m_drawToX) - { - ++it; - } - - for (; it != m_unwrapTimesList.end(); ++it) - { - int width = (*it)->eventCount * m_pStyle->pFontsTicks.tickWidth; - - wrapRect.setLeft(std::max( - rect.left() + (int)(((*it)->time - m_unwrapTimesList.front()->time) * m_timeScale + ticks * m_pStyle->pFontsTicks.tickWidth - m_chartShift), - rect.left() - )); - - if (*(*it) == m_drawFromX) - { - width -= m_drawFromEventID * m_pStyle->pFontsTicks.tickWidth + m_chartShift; - } - if (*(*it) == m_drawToX) - { - width = m_drawToEventCount * m_pStyle->pFontsTicks.tickWidth; - } - - wrapRect.setRight(std::min( - wrapRect.left() + width, - rect.right() - )); - - if (wrapRect.left() < wrapRect.right()) - { - painter.drawRect(wrapRect); - } - - ticks += (*it)->eventCount; - if (*(*it) == m_drawFromX) - { - ticks -= m_drawFromEventID; - } - } - } + QRect rect(chartRect); + rect.adjust(0, 0, -1, -1); + painter.setPen (m_pStyle->defaultColor); + painter.setBrush(m_pStyle->chartBgColor); + painter.drawRect(rect); + + if (doUnwrapTime()) + { + painter.setPen(Qt::NoPen); + painter.setBrush(m_pStyle->timeBgColor); + + rect.adjust(1, 1, 0, 0); + QRect wrapRect(rect); + + int ticks = 0; + ChartDoc::TimesList::const_iterator it = m_unwrapTimesList.begin(); + if (m_drawFromX == m_drawToX) + ++it; + + for (; it != m_unwrapTimesList.end(); ++it) + { + int width = (*it)->eventCount * m_pStyle->pFontsTicks.tickWidth; + + wrapRect.setLeft(std::max( + rect.left() + (int)(((*it)->time - m_unwrapTimesList.front()->time) * m_timeScale + ticks * m_pStyle->pFontsTicks.tickWidth - m_chartShift), + rect.left() + )); + + if (*(*it) == m_drawFromX) + width -= m_drawFromEventID * m_pStyle->pFontsTicks.tickWidth + m_chartShift; + + if (*(*it) == m_drawToX) + width = m_drawToEventCount * m_pStyle->pFontsTicks.tickWidth; + + wrapRect.setRight(std::min( + wrapRect.left() + width, + rect.right() + )); + + if (wrapRect.left() < wrapRect.right()) + painter.drawRect(wrapRect); + + ticks += (*it)->eventCount; + if (*(*it) == m_drawFromX) + ticks -= m_drawFromEventID; + } + } } void ChartView::setZoom(double new_zoom, const bool /*force_update*/) { - /*scale_koeff = new_zoom; - if (scale_koeff < auto_zoom) { - scale_koeff = auto_zoom; - }*/ - if (doUnwrapTime() && new_zoom < 1) - { - new_zoom = 1; - } - else if (!doUnwrapTime() && new_zoom < m_zoomAuto) - { - new_zoom = m_zoomAuto; - } - //if (zoom != new_zoom || scale_koeff != new_zoom || force_update) { - m_zoom = new_zoom; - m_scaleKoeff = m_zoom; - recalcLayout(); - updateScrollBars(); - update(); - //} + if (doUnwrapTime() && new_zoom < 1) + new_zoom = 1; + else if (!doUnwrapTime() && new_zoom < m_zoomAuto) + new_zoom = m_zoomAuto; + + m_zoom = new_zoom; + m_scaleKoeff = m_zoom; + recalcLayout(); + updateScrollBars(); + update(); } ChartDoc* ChartView::getDocument() { - return m_pDocument; + return m_pDocument; } void ChartView::resizeEvent(QResizeEvent* pEvent) { - super::resizeEvent(pEvent); + super::resizeEvent(pEvent); - m_clientRect = QRect(QPoint(0, 0), pEvent->size()); - if (getDocument()) - { - recalcLayout(); - updateScrollBars(); - //setZoom(zoom); - } + m_clientRect = QRect(QPoint(0, 0), pEvent->size()); + if (getDocument()) + { + recalcLayout(); + updateScrollBars(); + //setZoom(zoom); + } } void ChartView::onChartTimeWrap() { - m_timeWrapFlag = !m_timeWrapFlag; - recalcLayout(); - updateScrollBars(); - update(); - onUpdateActions(isActivated()); + m_timeWrapFlag = !m_timeWrapFlag; + recalcLayout(); + updateScrollBars(); + update(); + onUpdateActions(isActivated()); } void ChartView::onUserUpdateChartView(ChartDoc::Update updateType) { - if (doUnwrapTime() || updateType != ChartDoc::U_TIME_TICKS) - { - updateView(); - } + if (doUnwrapTime() || updateType != ChartDoc::Update::TIMES) + updateView(); } void ChartView::onEditCopy() { - QApplication::clipboard()->setPixmap(grab()); + QApplication::clipboard()->setPixmap(grab()); } void ChartView::onViewZoomIn() { - if (m_zoomAutoFlag) - { - m_zoomAutoFlag = !m_zoomAutoFlag; - } - double delta = m_zoom < 1 ? 0.1 : 0.5; - if (m_zoom + delta > 1 && m_zoom + delta - 1 < delta) - { - setZoom(1); - } - else - { - setZoom(m_zoom + delta); - } - onUpdateActions(isActivated()); + if (m_zoomAutoFlag) + m_zoomAutoFlag = !m_zoomAutoFlag; + + const double delta = m_zoom < 1 ? 0.1 : 0.5; + + if (m_zoom + delta > 1 && m_zoom + delta - 1 < delta) + setZoom(1); + else + setZoom(m_zoom + delta); + + onUpdateActions(isActivated()); } void ChartView::onViewZoomOut() { - if (m_zoomAutoFlag) - { - m_zoomAutoFlag = !m_zoomAutoFlag; - } - double delta = m_zoom > 1 ? -0.5 : -0.1; - double zoom_new = m_zoom + delta; - setZoom(zoom_new); - onUpdateActions(isActivated()); + if (m_zoomAutoFlag) + m_zoomAutoFlag = !m_zoomAutoFlag; + + double delta = m_zoom > 1 ? -0.5 : -0.1; + double zoom_new = m_zoom + delta; + setZoom(zoom_new); + onUpdateActions(isActivated()); } void ChartView::onViewZoomReset() { - if (m_zoomAutoFlag) - { - m_zoomAutoFlag = !m_zoomAutoFlag; - } - setZoom(1); - onUpdateActions(isActivated()); + if (m_zoomAutoFlag) + m_zoomAutoFlag = !m_zoomAutoFlag; + + setZoom(1); + onUpdateActions(isActivated()); } const ChartViewStyle& ChartView::getStyle() const { - return (*m_pStyle); + return (*m_pStyle); } void ChartView::setFonts(const bool /*needRedraw*/) { - if (!m_pStyle) - return; + if (!m_pStyle) + return; - m_fontAxis = QFont(m_pStyle->font.name.c_str()); - m_fontAxis.setBold (m_pStyle->defaultStyle & StyleFont::BOLD ? true : false); - m_fontAxis.setItalic (m_pStyle->defaultStyle & StyleFont::ITALIC ? true : false); - m_fontAxis.setUnderline(m_pStyle->defaultStyle & StyleFont::UNDERLINE ? true : false); - m_fontAxis.setPointSize(m_pStyle->font.size); + m_fontAxis = QFont(m_pStyle->font.name.c_str()); + m_fontAxis.setBold (static_cast(m_pStyle->defaultStyle) & static_cast(StyleFont::Style::BOLD) ? true : false); + m_fontAxis.setItalic (static_cast(m_pStyle->defaultStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false); + m_fontAxis.setUnderline(static_cast(m_pStyle->defaultStyle) & static_cast(StyleFont::Style::UNDERLINE) ? true : false); + m_fontAxis.setPointSize(m_pStyle->font.size); - m_fontTitle = QFont(m_pStyle->font.name.c_str()); - m_fontTitle.setBold (m_pStyle->titleStyle & StyleFont::BOLD ? true : false); - m_fontTitle.setItalic (m_pStyle->titleStyle & StyleFont::ITALIC ? true : false); - m_fontTitle.setUnderline(m_pStyle->titleStyle & StyleFont::UNDERLINE ? true : false); - m_fontTitle.setPointSize(m_pStyle->pFontsTicks.titleFontSize); + m_fontTitle = QFont(m_pStyle->font.name.c_str()); + m_fontTitle.setBold (static_cast(m_pStyle->titleStyle) & static_cast(StyleFont::Style::BOLD) ? true : false); + m_fontTitle.setItalic (static_cast(m_pStyle->titleStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false); + m_fontTitle.setUnderline(static_cast(m_pStyle->titleStyle) & static_cast(StyleFont::Style::UNDERLINE) ? true : false); + m_fontTitle.setPointSize(m_pStyle->pFontsTicks.titleFontSize); - m_fontLegend = QFont(m_pStyle->font.name.c_str()); - m_fontLegend.setBold (m_pStyle->legendStyle & StyleFont::BOLD ? true : false); - m_fontLegend.setItalic (m_pStyle->legendStyle & StyleFont::ITALIC ? true : false); - m_fontLegend.setUnderline(m_pStyle->legendStyle & StyleFont::UNDERLINE ? true : false); - m_fontLegend.setPointSize(m_pStyle->pFontsTicks.legendFontSize); + m_fontLegend = QFont(m_pStyle->font.name.c_str()); + m_fontLegend.setBold (static_cast(m_pStyle->legendStyle) & static_cast(StyleFont::Style::BOLD) ? true : false); + m_fontLegend.setItalic (static_cast(m_pStyle->legendStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false); + m_fontLegend.setUnderline(static_cast(m_pStyle->legendStyle) & static_cast(StyleFont::Style::UNDERLINE) ? true : false); + m_fontLegend.setPointSize(m_pStyle->pFontsTicks.legendFontSize); } void ChartView::setStyle(ChartViewStyle* pStyle, const bool needRedraw) { - m_pStyle = pStyle; + m_pStyle = pStyle; - setFonts(false); + setFonts(false); - /*if (previewMode) { - auto_zoom = 1; - setZoom(1); - }*/ - - if (needRedraw) - { - recalcLayout(); - updateScrollBars(); - update(); - } + if (needRedraw) + { + recalcLayout(); + updateScrollBars(); + update(); + } } void ChartView::setPreviwMode(bool value) { - m_previewMode = value; + m_previewMode = value; } void ChartView::onChartOptions() { - ChartPreferences dlg(this); - dlg.exec(); + ChartPreferences dlg(this); + dlg.exec(); } void ChartView::updateView() { - bool lastvisible = maxXVisible(); - recalcLayout(); - updateScrollBars(); - if (lastvisible && !maxXVisible()) - { - getHorzScrollBar().setValue(m_SM_X.posMax); - } - parentWidget()->update(); - updateScrollBars(); - onUpdateActions(isActivated()); + bool lastvisible = maxXVisible(); + recalcLayout(); + updateScrollBars(); + if (lastvisible && !maxXVisible()) + getHorzScrollBar().setValue(m_SM_X.posMax); + + parentWidget()->update(); + updateScrollBars(); + onUpdateActions(isActivated()); } void ChartView::attachToDoc() { - getDocument()->addToViews(this); + getDocument()->addToViews(this); } void ChartView::paintEvent(QPaintEvent*) { - QPainter painter(this); + QPainter painter(this); - ChartDoc* doc = getDocument(); + ChartDoc* doc = getDocument(); - painter.fillRect(m_clientRect, m_pStyle->backgroundColor); + painter.fillRect(m_clientRect, m_pStyle->backgroundColor); - drawTitle(painter, m_chartRect); + drawTitle(painter, m_chartRect); - if (!m_chartRect.isEmpty()) - { - if (m_needDrawLegend) - { - drawLegend(painter, m_legendRect); - } + if (!m_chartRect.isEmpty()) + { + if (m_needDrawLegend) + drawLegend(painter, m_legendRect); - painter.setPen(m_pStyle->defaultColor); + painter.setPen(m_pStyle->defaultColor); - drawYAxis(painter, m_chartRect, m_pYAxis); - setFromTo(); - drawXAxis(painter, m_chartRect); - drawGrid(painter, m_chartRect); + drawYAxis(painter, m_chartRect, m_pYAxis); + setFromTo(); + drawXAxis(painter, m_chartRect); + drawGrid(painter, m_chartRect); - for (const ChartSerie* const pSerie: doc->getSerieList()) - { - pSerie->drawSerie(this, painter, m_chartRect); - } - } + for (const ChartSerie* const pSerie: doc->getSerieList()) + pSerie->drawSerie(this, painter, m_chartRect); + } } void ChartView::onViewZoomAuto() { - m_zoomAutoFlag = !m_zoomAutoFlag; - if (!m_zoomAutoFlag) - { - setZoom(m_zoomOld, true); - } - else - { - m_zoomOld = m_zoom; - setZoom(m_zoomAuto, true); - } - onUpdateActions(isActivated()); + m_zoomAutoFlag = !m_zoomAutoFlag; + if (!m_zoomAutoFlag) + { + setZoom(m_zoomOld, true); + } + else + { + m_zoomOld = m_zoom; + setZoom(m_zoomAuto, true); + } + onUpdateActions(isActivated()); } void ChartView::onHelpKeyword() { - QByteArray ba; - ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_model/work_model_chart.htm\n"); - g_pApp->callQtAssistant(ba); + QByteArray ba; + ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_model/work_model_chart.htm\n"); + g_pApp->callQtAssistant(ba); } bool ChartView::canUnwrapTime() const { - return m_scaleKoeff >= 1 && !m_zoomAutoFlag; + return m_scaleKoeff >= 1 && !m_zoomAutoFlag; } bool ChartView::doUnwrapTime() const { - return canUnwrapTime() && !m_timeWrapFlag; + return canUnwrapTime() && !m_timeWrapFlag; } bool ChartView::minXVisible() const { - return m_SM_X.position == 0; + return m_SM_X.position == 0; } bool ChartView::maxXVisible() const { - return m_SM_X.position == m_SM_X.posMax; + return m_SM_X.position == m_SM_X.posMax; } void ChartView::onUpdateActions(bool activated) { - MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); - - updateAction( - pMainWindow->actViewZoomInc, - activated && !m_zoomAutoFlag && m_zoom < 5, - this, &ChartView::onViewZoomIn - ); - - updateAction( - pMainWindow->actViewZoomDec, - activated && !m_zoomAutoFlag && ((!doUnwrapTime() && m_zoom > m_zoomAuto) || (doUnwrapTime() && m_zoom > 1)), - this, &ChartView::onViewZoomOut - ); - - updateAction( - pMainWindow->actViewZoomReset, - activated && m_zoom != 1, - this, &ChartView::onViewZoomReset - ); - - pMainWindow->actViewZoomAuto->setCheckable(true); - pMainWindow->actViewZoomAuto->setChecked(m_zoomAutoFlag); - - updateAction( - pMainWindow->actViewZoomAuto, - activated, - this, &ChartView::onViewZoomAuto - ); - - pMainWindow->actChartTimeWrap->setCheckable(true); - pMainWindow->actChartTimeWrap->setChecked(!canUnwrapTime() || m_timeWrapFlag); - - updateAction( - pMainWindow->actChartTimeWrap, - activated && canUnwrapTime(), - this, &ChartView::onChartTimeWrap - ); - - updateAction( - pMainWindow->actChartOptions, - activated, - this, &ChartView::onChartOptions - ); - - updateAction( - pMainWindow->actEditCopy, - activated, - this, &ChartView::onEditCopy - ); - - updateAction( - pMainWindow->actHelpContext, - activated, - this, &ChartView::onHelpKeyword - ); + MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); + + updateAction( + pMainWindow->actViewZoomInc, + activated && !m_zoomAutoFlag && m_zoom < 5, + this, &ChartView::onViewZoomIn + ); + + updateAction( + pMainWindow->actViewZoomDec, + activated && !m_zoomAutoFlag && ((!doUnwrapTime() && m_zoom > m_zoomAuto) || (doUnwrapTime() && m_zoom > 1)), + this, &ChartView::onViewZoomOut + ); + + updateAction( + pMainWindow->actViewZoomReset, + activated && m_zoom != 1, + this, &ChartView::onViewZoomReset + ); + + pMainWindow->actViewZoomAuto->setCheckable(true); + pMainWindow->actViewZoomAuto->setChecked(m_zoomAutoFlag); + + updateAction( + pMainWindow->actViewZoomAuto, + activated, + this, &ChartView::onViewZoomAuto + ); + + pMainWindow->actChartTimeWrap->setCheckable(true); + pMainWindow->actChartTimeWrap->setChecked(!canUnwrapTime() || m_timeWrapFlag); + + updateAction( + pMainWindow->actChartTimeWrap, + activated && canUnwrapTime(), + this, &ChartView::onChartTimeWrap + ); + + updateAction( + pMainWindow->actChartOptions, + activated, + this, &ChartView::onChartOptions + ); + + updateAction( + pMainWindow->actEditCopy, + activated, + this, &ChartView::onEditCopy + ); + + updateAction( + pMainWindow->actHelpContext, + activated, + this, &ChartView::onHelpKeyword + ); } // -------------------------------------------------------------------------------- // -------------------- ChartViewMainWnd // -------------------------------------------------------------------------------- ChartViewMainWnd::ChartViewMainWnd(QWidget* pParent, ChartDoc* pDocument, bool preview) - : super(pParent) + : super(pParent) { - setMinimumSize(400, 200); + setMinimumSize(400, 200); - ChartView* pContext = new ChartView(this, pDocument, preview); - pContext->show(); - setViewport(pContext); + ChartView* pContext = new ChartView(this, pDocument, preview); + pContext->show(); + setViewport(pContext); } ChartViewMainWnd::~ChartViewMainWnd() @@ -1085,39 +1016,39 @@ ChartViewMainWnd::~ChartViewMainWnd() ChartView& ChartViewMainWnd::view() { - return *static_cast(viewport()); + return *static_cast(viewport()); } bool ChartViewMainWnd::viewportEvent(QEvent* /*pEvent*/) { - return false; + return false; } void ChartViewMainWnd::focusInEvent(QFocusEvent* pEvent) { - static_cast(viewport())->event(pEvent); + static_cast(viewport())->event(pEvent); } void ChartViewMainWnd::focusOutEvent(QFocusEvent* pEvent) { - static_cast(viewport())->event(pEvent); + static_cast(viewport())->event(pEvent); } void ChartViewMainWnd::keyPressEvent(QKeyEvent* pEvent) { - switch (pEvent->key()) - { - case Qt::Key_Left : - case Qt::Key_Right : - case Qt::Key_PageUp : - case Qt::Key_PageDown: - case Qt::Key_Home : - case Qt::Key_End : - static_cast(viewport())->event(pEvent); - break; - - default: - super::keyPressEvent(pEvent); - break; - } + switch (pEvent->key()) + { + case Qt::Key_Left : + case Qt::Key_Right : + case Qt::Key_PageUp : + case Qt::Key_PageDown: + case Qt::Key_Home : + case Qt::Key_End : + static_cast(viewport())->event(pEvent); + break; + + default: + super::keyPressEvent(pEvent); + break; + } } diff --git a/app/rdo_studio/src/tracer/chart/chart_view.h b/app/rdo_studio/src/tracer/chart/chart_view.h index 7abd390f6..0aa4bed56 100644 --- a/app/rdo_studio/src/tracer/chart/chart_view.h +++ b/app/rdo_studio/src/tracer/chart/chart_view.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_CHART_VIEW_H_ -#define _RDO_STUDIO_TRACER_CHART_VIEW_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -28,135 +27,135 @@ class ChartView: public ActionActivatorWidget Q_OBJECT public: - ChartView(QAbstractScrollArea* pParent, ChartDoc* pDocument, const bool preview); - virtual ~ChartView(); + ChartView(QAbstractScrollArea* pParent, ChartDoc* pDocument, const bool preview); + virtual ~ChartView(); - ChartDoc* getDocument(); - void attachToDoc(); + ChartDoc* getDocument(); + void attachToDoc(); - const ChartViewStyle& getStyle() const; - void setStyle(ChartViewStyle* pStyle, const bool needRedraw = true); + const ChartViewStyle& getStyle() const; + void setStyle(ChartViewStyle* pStyle, const bool needRedraw = true); - void setPreviwMode(bool value); + void setPreviwMode(bool value); - int getValueCountX() const; - void setValueCountX(int value); - int getValueCountY() const; - void setValueCountY(int value); + int getValueCountX() const; + void setValueCountX(int value); + int getValueCountY() const; + void setValueCountY(int value); - void updateView(); - void onUserUpdateChartView(ChartDoc::Update updateType); + void updateView(); + void onUserUpdateChartView(ChartDoc::Update updateType); - void setYAxis(ChartSerie* pSerie); + void setYAxis(ChartSerie* pSerie); - bool isDrawLegend () const; - void setDrawLegend(bool value); + bool isDrawLegend () const; + void setDrawLegend(bool value); - long double timeScale () const; - int chartShift () const; - const Time& drawFromX () const; - const Time& drawToX () const; - int drawFromEventID () const; - int drawToEventCount() const; + long double timeScale () const; + int chartShift () const; + const Time& drawFromX () const; + const Time& drawToX () const; + int drawFromEventID () const; + int drawToEventCount() const; - const ChartDoc::TimesList& unwrapTimesList() const; - const ChartViewStyle* const style() const; + const ChartDoc::TimesList& unwrapTimesList() const; + const ChartViewStyle* const style() const; - bool doUnwrapTime () const; + bool doUnwrapTime () const; private: - Serie* m_pddSerie; + Serie* m_pddSerie; - QRect m_bmpRect; - QRect m_clientRect; + QRect m_bmpRect; + QRect m_clientRect; - int m_valueCountX; - std::vector m_captionList; - int m_valueCountY; + int m_valueCountX; + std::vector m_captionList; + int m_valueCountY; - bool m_timeWrapFlag; - bool canUnwrapTime() const; + bool m_timeWrapFlag; + bool canUnwrapTime() const; - QRect m_chartRect; - void recalcLayout(); + QRect m_chartRect; + void recalcLayout(); - rdo::gui::ScrollMetric m_SM_X; - bool minXVisible () const; - bool maxXVisible () const; - QScrollBar& getHorzScrollBar (); - void updateScrollBars (); - bool scrollHorizontally(int inc); + rdo::gui::ScrollMetric m_SM_X; + bool minXVisible () const; + bool maxXVisible () const; + QScrollBar& getHorzScrollBar (); + void updateScrollBars (); + bool scrollHorizontally(int inc); - long double m_timeScale; - int m_chartShift; - Time m_drawFromX; - Time m_drawToX; - int m_drawFromEventID; - int m_drawToEventCount; - ChartDoc::TimesList m_unwrapTimesList; + long double m_timeScale; + int m_chartShift; + Time m_drawFromX; + Time m_drawToX; + int m_drawFromEventID; + int m_drawToEventCount; + ChartDoc::TimesList m_unwrapTimesList; - bool setTo(const int fromMaxPos); - void setFromTo(); + bool setTo(const int fromMaxPos); + void setFromTo(); - void drawTitle(QPainter& painter, const QRect& chartRect); + void drawTitle(QPainter& painter, const QRect& chartRect); - QRect m_legendRect; - void drawLegend(QPainter& painter, const QRect& chartRect); - void drawYAxis (QPainter& painter, const QRect& chartRect, const ChartSerie* axisValues); - void drawXAxis (QPainter& painter, const QRect& chartRect); - void drawGrid (QPainter& painter, const QRect& chartRect); + QRect m_legendRect; + void drawLegend(QPainter& painter, const QRect& chartRect); + void drawYAxis (QPainter& painter, const QRect& chartRect, const ChartSerie* axisValues); + void drawXAxis (QPainter& painter, const QRect& chartRect); + void drawGrid (QPainter& painter, const QRect& chartRect); - QMenu* m_pPopupMenu; + QMenu* m_pPopupMenu; - double m_zoom; - double m_zoomOld; - double m_zoomAuto; - bool m_zoomAutoFlag; - double m_scaleKoeff; - void setZoom(double new_zoom, const bool force_update = false); + double m_zoom; + double m_zoomOld; + double m_zoomAuto; + bool m_zoomAutoFlag; + double m_scaleKoeff; + void setZoom(double new_zoom, const bool force_update = false); - bool m_previewMode; - ChartViewStyle* m_pStyle; + bool m_previewMode; + ChartViewStyle* m_pStyle; - ChartSerie* m_pYAxis; - bool m_needDrawLegend; + ChartSerie* m_pYAxis; + bool m_needDrawLegend; - QFont m_fontTitle; - QFont m_fontLegend; - QFont m_fontAxis; - void setFonts(const bool needRedraw = true); + QFont m_fontTitle; + QFont m_fontLegend; + QFont m_fontAxis; + void setFonts(const bool needRedraw = true); - void onDraw(); + void onDraw(); - typedef ActionActivatorWidget super; + typedef ActionActivatorWidget super; - ChartDoc* m_pDocument; + ChartDoc* m_pDocument; - virtual void resizeEvent (QResizeEvent* pEvent); - virtual void paintEvent (QPaintEvent* pEvent); - virtual void contextMenuEvent(QContextMenuEvent* pEvent); - virtual void keyPressEvent (QKeyEvent* pEvent); - virtual void wheelEvent (QWheelEvent* pEvent); - virtual void dragEnterEvent (QDragEnterEvent* pEvent); - virtual void dropEvent (QDropEvent* pEvent); - virtual void dragLeaveEvent (QDragLeaveEvent * pEvent); + virtual void resizeEvent (QResizeEvent* pEvent); + virtual void paintEvent (QPaintEvent* pEvent); + virtual void contextMenuEvent(QContextMenuEvent* pEvent); + virtual void keyPressEvent (QKeyEvent* pEvent); + virtual void wheelEvent (QWheelEvent* pEvent); + virtual void dragEnterEvent (QDragEnterEvent* pEvent); + virtual void dropEvent (QDropEvent* pEvent); + virtual void dragLeaveEvent (QDragLeaveEvent * pEvent); - virtual void onUpdateActions(bool activated); + virtual void onUpdateActions(bool activated); private slots: - void onHorzScrollBarValueChanged(int value); + void onHorzScrollBarValueChanged(int value); - void onEditCopy(); + void onEditCopy(); - void onViewZoomIn(); - void onViewZoomOut(); - void onViewZoomReset(); - void onViewZoomAuto(); - - void onChartTimeWrap(); - void onChartOptions(); + void onViewZoomIn(); + void onViewZoomOut(); + void onViewZoomReset(); + void onViewZoomAuto(); + + void onChartTimeWrap(); + void onChartOptions(); - void onHelpKeyword(); + void onHelpKeyword(); }; // -------------------------------------------------------------------------------- @@ -165,20 +164,18 @@ private slots: class ChartViewMainWnd: public QAbstractScrollArea { public: - ChartViewMainWnd(QWidget* pParent, ChartDoc* pDocument, bool preview); - virtual ~ChartViewMainWnd(); + ChartViewMainWnd(QWidget* pParent, ChartDoc* pDocument, bool preview); + virtual ~ChartViewMainWnd(); - ChartView& view(); + ChartView& view(); private: - typedef QAbstractScrollArea super; + typedef QAbstractScrollArea super; - virtual bool viewportEvent(QEvent* pEvent); - virtual void focusInEvent (QFocusEvent* pEvent); - virtual void focusOutEvent(QFocusEvent* pEvent); - virtual void keyPressEvent(QKeyEvent* pEvent); + virtual bool viewportEvent(QEvent* pEvent); + virtual void focusInEvent (QFocusEvent* pEvent); + virtual void focusOutEvent(QFocusEvent* pEvent); + virtual void keyPressEvent(QKeyEvent* pEvent); }; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_CHART_VIEW_H_ diff --git a/app/rdo_studio/src/tracer/chart/chart_view_style.cpp b/app/rdo_studio/src/tracer/chart/chart_view_style.cpp index ce1fb46ef..23291bd3a 100644 --- a/app/rdo_studio/src/tracer/chart/chart_view_style.cpp +++ b/app/rdo_studio/src/tracer/chart/chart_view_style.cpp @@ -15,9 +15,9 @@ namespace rdo { namespace gui { namespace tracer { // -------------------------------------------------------------------------------- ChartViewFontsTicks::ChartViewFontsTicks() { - titleFontSize = 12; - legendFontSize = 8; - tickWidth = 5; + titleFontSize = 12; + legendFontSize = 8; + tickWidth = 5; } ChartViewFontsTicks::~ChartViewFontsTicks() @@ -25,165 +25,163 @@ ChartViewFontsTicks::~ChartViewFontsTicks() ChartViewFontsTicks& ChartViewFontsTicks::operator =(const ChartViewFontsTicks& fonts_ticks) { - titleFontSize = fonts_ticks.titleFontSize; - legendFontSize = fonts_ticks.legendFontSize; - tickWidth = fonts_ticks.tickWidth; + titleFontSize = fonts_ticks.titleFontSize; + legendFontSize = fonts_ticks.legendFontSize; + tickWidth = fonts_ticks.tickWidth; - return *this; + return *this; } bool ChartViewFontsTicks::operator ==(const ChartViewFontsTicks& fonts_ticks) const { - return titleFontSize == fonts_ticks.titleFontSize && - legendFontSize == fonts_ticks.legendFontSize && - tickWidth == fonts_ticks.tickWidth; + return titleFontSize == fonts_ticks.titleFontSize && + legendFontSize == fonts_ticks.legendFontSize && + tickWidth == fonts_ticks.tickWidth; } bool ChartViewFontsTicks::operator !=(const ChartViewFontsTicks& fonts_ticks) const { - return !(*this == fonts_ticks); + return !(*this == fonts_ticks); } void ChartViewFontsTicks::load(QSettings& settings) { - settings >> *this; + settings >> *this; } void ChartViewFontsTicks::save(QSettings& settings) const { - settings << *this; + settings << *this; } QSettings& operator<< (QSettings& settings, const ChartViewFontsTicks& fonts_ticks) { - settings.setValue("title_font_size", fonts_ticks.titleFontSize); - settings.setValue("legend_font_size", fonts_ticks.legendFontSize); - settings.setValue("tick_width", fonts_ticks.tickWidth); + settings.setValue("title_font_size", fonts_ticks.titleFontSize); + settings.setValue("legend_font_size", fonts_ticks.legendFontSize); + settings.setValue("tick_width", fonts_ticks.tickWidth); - return settings; + return settings; } QSettings& operator>> (QSettings& settings, ChartViewFontsTicks& fonts_ticks) { - fonts_ticks.titleFontSize = settings.value("title_font_size", fonts_ticks.titleFontSize).toInt(); - fonts_ticks.legendFontSize = settings.value("legend_font_size", fonts_ticks.legendFontSize).toInt(); - fonts_ticks.tickWidth = settings.value("tick_width", fonts_ticks.tickWidth).toInt(); + fonts_ticks.titleFontSize = settings.value("title_font_size", fonts_ticks.titleFontSize).toInt(); + fonts_ticks.legendFontSize = settings.value("legend_font_size", fonts_ticks.legendFontSize).toInt(); + fonts_ticks.tickWidth = settings.value("tick_width", fonts_ticks.tickWidth).toInt(); - return settings; + return settings; } // -------------------------------------------------------------------------------- // -------------------- ChartViewStyle // -------------------------------------------------------------------------------- ChartViewStyle::ChartViewStyle() - : StyleBase() - , pFontsTicks() + : StyleBase() + , pFontsTicks() { - defaultColor = QColor(0x80, 0x80, 0x80); - backgroundColor = QColor(0xFF, 0xFF, 0xFF); + defaultColor = QColor(0x80, 0x80, 0x80); + backgroundColor = QColor(0xFF, 0xFF, 0xFF); - axisFgColor = QColor(0x00, 0x00, 0x80); - titleFGColor = QColor(0x80, 0x00, 0x00); - legendFgColor = QColor(0x58, 0x46, 0x3A); - chartBgColor = QColor(0xF3, 0xFC, 0xFC); - timeBgColor = QColor(0xBA, 0xEB, 0xEB); + axisFgColor = QColor(0x00, 0x00, 0x80); + titleFGColor = QColor(0x80, 0x00, 0x00); + legendFgColor = QColor(0x58, 0x46, 0x3A); + chartBgColor = QColor(0xF3, 0xFC, 0xFC); + timeBgColor = QColor(0xBA, 0xEB, 0xEB); - titleStyle = StyleFont::BOLD; - legendStyle = StyleFont::NONE; + titleStyle = StyleFont::Style::BOLD; + legendStyle = StyleFont::Style::NONE; - font = StyleFont::getChartViewFont(); + font = StyleFont::getChartViewFont(); } ChartViewStyle::~ChartViewStyle() -{ -} +{} ChartViewStyle& ChartViewStyle::operator =(const ChartViewStyle& style) { - StyleBase::operator=(style); - // defaultColor = style.defaultColor; + StyleBase::operator=(style); - axisFgColor = style.axisFgColor; - titleFGColor = style.titleFGColor; - legendFgColor = style.legendFgColor; - chartBgColor = style.chartBgColor; - timeBgColor = style.timeBgColor; + axisFgColor = style.axisFgColor; + titleFGColor = style.titleFGColor; + legendFgColor = style.legendFgColor; + chartBgColor = style.chartBgColor; + timeBgColor = style.timeBgColor; - titleStyle = style.titleStyle; - legendStyle = style.legendStyle; + titleStyle = style.titleStyle; + legendStyle = style.legendStyle; - pFontsTicks = style.pFontsTicks; + pFontsTicks = style.pFontsTicks; - return *this; + return *this; } bool ChartViewStyle::operator ==(const ChartViewStyle& style) const { - bool flag = StyleBase::operator==(style); + bool flag = StyleBase::operator==(style); - flag &= pFontsTicks == style.pFontsTicks; + flag &= pFontsTicks == style.pFontsTicks; - if (flag) flag &= axisFgColor == style.axisFgColor && - titleFGColor == style.titleFGColor && - legendFgColor == style.legendFgColor && - chartBgColor == style.chartBgColor && - timeBgColor == style.timeBgColor && - titleStyle == style.titleStyle && - legendStyle == style.legendStyle; + if (flag) flag &= axisFgColor == style.axisFgColor && + titleFGColor == style.titleFGColor && + legendFgColor == style.legendFgColor && + chartBgColor == style.chartBgColor && + timeBgColor == style.timeBgColor && + titleStyle == style.titleStyle && + legendStyle == style.legendStyle; - return flag; + return flag; } bool ChartViewStyle::operator !=(const ChartViewStyle& style) const { - return !(*this == style); + return !(*this == style); } ChartViewStyle ChartViewStyle::getDefaultStyle() { - ChartViewStyle style; - return style; + ChartViewStyle style; + return style; } QSettings& operator<< (QSettings& settings, const ChartViewStyle& style) { - settings << static_cast(style); - - settings.beginGroup("theme"); - settings.setValue("axis_fg_color", style.axisFgColor.name()); - settings.setValue("title_fg_color", style.titleFGColor.name()); - settings.setValue("legend_fg_color", style.legendFgColor.name()); - settings.setValue("chart_bg_color", style.chartBgColor.name()); - settings.setValue("time_bg_color", style.timeBgColor.name()); - settings.setValue("title_style", style.titleStyle); - settings.setValue("legend_style", style.legendStyle); - settings.endGroup(); - - settings.beginGroup("fonts_ticks"); - settings << style.pFontsTicks; - settings.endGroup(); - - return settings; + settings << static_cast(style); + + settings.beginGroup("theme"); + settings.setValue("axis_fg_color", style.axisFgColor.name()); + settings.setValue("title_fg_color", style.titleFGColor.name()); + settings.setValue("legend_fg_color", style.legendFgColor.name()); + settings.setValue("chart_bg_color", style.chartBgColor.name()); + settings.setValue("time_bg_color", style.timeBgColor.name()); + settings.setValue("title_style", static_cast(style.titleStyle)); + settings.setValue("legend_style", static_cast(style.legendStyle)); + settings.endGroup(); + + settings.beginGroup("fonts_ticks"); + settings << style.pFontsTicks; + settings.endGroup(); + + return settings; } QSettings& operator>> (QSettings& settings, ChartViewStyle& style) { - settings >> static_cast(style); - - settings.beginGroup("theme"); - style.axisFgColor = QColor(settings.value("axis_fg_color", style.axisFgColor.name()).toString()); - style.titleFGColor = QColor(settings.value("title_fg_color", style.titleFGColor.name()).toString()); - style.legendFgColor = QColor(settings.value("legend_fg_color", style.legendFgColor.name()).toString()); - style.chartBgColor = QColor(settings.value("chart_bg_color", style.chartBgColor.name()).toString()); - style.timeBgColor = QColor(settings.value("time_bg_color", style.timeBgColor.name()).toString()); - style.titleStyle = static_cast(settings.value("title_style", style.titleStyle).toInt()); - style.legendStyle = static_cast(settings.value("legend_style", style.legendStyle).toInt()); - settings.endGroup(); - - settings.beginGroup("fonts_ticks"); - settings >> style.pFontsTicks; - settings.endGroup(); - - return settings; + settings >> static_cast(style); + + settings.beginGroup("theme"); + style.axisFgColor = QColor(settings.value("axis_fg_color", style.axisFgColor.name()).toString()); + style.titleFGColor = QColor(settings.value("title_fg_color", style.titleFGColor.name()).toString()); + style.legendFgColor = QColor(settings.value("legend_fg_color", style.legendFgColor.name()).toString()); + style.chartBgColor = QColor(settings.value("chart_bg_color", style.chartBgColor.name()).toString()); + style.timeBgColor = QColor(settings.value("time_bg_color", style.timeBgColor.name()).toString()); + style.titleStyle = static_cast(settings.value("title_style", static_cast(style.titleStyle)).toInt()); + style.legendStyle = static_cast(settings.value("legend_style", static_cast(style.legendStyle)).toInt()); + settings.endGroup(); + + settings.beginGroup("fonts_ticks"); + settings >> style.pFontsTicks; + settings.endGroup(); + + return settings; } }}} // namespace rdo::gui::tracer diff --git a/app/rdo_studio/src/tracer/chart/chart_view_style.h b/app/rdo_studio/src/tracer/chart/chart_view_style.h index 70756b28b..940bb3271 100644 --- a/app/rdo_studio/src/tracer/chart/chart_view_style.h +++ b/app/rdo_studio/src/tracer/chart/chart_view_style.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_CHART_VIEW_STYLE_H_ -#define _RDO_STUDIO_TRACER_CHART_VIEW_STYLE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -14,19 +13,19 @@ namespace rdo { namespace gui { namespace tracer { class ChartViewFontsTicks { public: - ChartViewFontsTicks(); - virtual ~ChartViewFontsTicks(); + ChartViewFontsTicks(); + virtual ~ChartViewFontsTicks(); - ChartViewFontsTicks& operator =(const ChartViewFontsTicks& fonts_ticks); - bool operator ==(const ChartViewFontsTicks& fonts_ticks) const; - bool operator !=(const ChartViewFontsTicks& fonts_ticks) const; + ChartViewFontsTicks& operator =(const ChartViewFontsTicks& fonts_ticks); + bool operator ==(const ChartViewFontsTicks& fonts_ticks) const; + bool operator !=(const ChartViewFontsTicks& fonts_ticks) const; - void load(QSettings& settings); - void save(QSettings& settings) const; + void load(QSettings& settings); + void save(QSettings& settings) const; - int titleFontSize; - int legendFontSize; - int tickWidth; + int titleFontSize; + int legendFontSize; + int tickWidth; }; QSettings& operator<< (QSettings& settings, const ChartViewFontsTicks& fonts_ticks); @@ -38,30 +37,28 @@ QSettings& operator>> (QSettings& settings, ChartViewFontsTicks& fonts_tic class ChartViewStyle: public style::StyleBase { public: - ChartViewStyle(); - ~ChartViewStyle(); + ChartViewStyle(); + ~ChartViewStyle(); - ChartViewStyle& operator =(const ChartViewStyle& style); - bool operator ==(const ChartViewStyle& style) const; - bool operator !=(const ChartViewStyle& style) const; + ChartViewStyle& operator =(const ChartViewStyle& style); + bool operator ==(const ChartViewStyle& style) const; + bool operator !=(const ChartViewStyle& style) const; - QColor axisFgColor; - QColor titleFGColor; - QColor legendFgColor; - QColor chartBgColor; - QColor timeBgColor; + QColor axisFgColor; + QColor titleFGColor; + QColor legendFgColor; + QColor chartBgColor; + QColor timeBgColor; - style::StyleFont::style titleStyle; - style::StyleFont::style legendStyle; + style::StyleFont::Style titleStyle; + style::StyleFont::Style legendStyle; - static ChartViewStyle getDefaultStyle(); + static ChartViewStyle getDefaultStyle(); - ChartViewFontsTicks pFontsTicks; + ChartViewFontsTicks pFontsTicks; }; QSettings& operator<< (QSettings& settings, const ChartViewStyle& style); QSettings& operator>> (QSettings& settings, ChartViewStyle& style); }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_CHART_VIEW_STYLE_H_ diff --git a/app/rdo_studio/src/tracer/logger/tracer_logger_main_wnd.cpp b/app/rdo_studio/src/tracer/logger/tracer_logger_main_wnd.cpp index 3d7ad9f27..0d85cacb3 100644 --- a/app/rdo_studio/src/tracer/logger/tracer_logger_main_wnd.cpp +++ b/app/rdo_studio/src/tracer/logger/tracer_logger_main_wnd.cpp @@ -13,44 +13,44 @@ using namespace rdo::gui::tracer; // -------------------- LogMainWnd // -------------------------------------------------------------------------------- LogMainWnd::LogMainWnd(QWidget* pParent) - : QAbstractScrollArea(pParent) + : QAbstractScrollArea(pParent) { - LogView* pLog = new LogView(this, &g_pApp->getStyle()->style_trace); - pLog->show(); + LogView* pLog = new LogView(this, &g_pApp->getStyle()->style_trace); + pLog->show(); - setViewport(pLog); + setViewport(pLog); } bool LogMainWnd::viewportEvent(QEvent* /*pEvent*/) { - return false; + return false; } void LogMainWnd::focusInEvent(QFocusEvent* pEvent) { - static_cast(viewport())->event(pEvent); + static_cast(viewport())->event(pEvent); } void LogMainWnd::focusOutEvent(QFocusEvent* pEvent) { - static_cast(viewport())->event(pEvent); + static_cast(viewport())->event(pEvent); } void LogMainWnd::keyPressEvent(QKeyEvent* pEvent) { - switch (pEvent->key()) - { - case Qt::Key_Up : - case Qt::Key_Down : - case Qt::Key_PageUp : - case Qt::Key_PageDown: - case Qt::Key_Home : - case Qt::Key_End : - static_cast(viewport())->event(pEvent); - break; - - default: - QAbstractScrollArea::keyPressEvent(pEvent); - break; - } + switch (pEvent->key()) + { + case Qt::Key_Up : + case Qt::Key_Down : + case Qt::Key_PageUp : + case Qt::Key_PageDown: + case Qt::Key_Home : + case Qt::Key_End : + static_cast(viewport())->event(pEvent); + break; + + default: + QAbstractScrollArea::keyPressEvent(pEvent); + break; + } } diff --git a/app/rdo_studio/src/tracer/logger/tracer_logger_main_wnd.h b/app/rdo_studio/src/tracer/logger/tracer_logger_main_wnd.h index 588f4e317..9d38f0607 100644 --- a/app/rdo_studio/src/tracer/logger/tracer_logger_main_wnd.h +++ b/app/rdo_studio/src/tracer/logger/tracer_logger_main_wnd.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_LOGGER_MAIN_WND_H_ -#define _RDO_STUDIO_TRACER_LOGGER_MAIN_WND_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -17,20 +16,18 @@ namespace rdo { namespace gui { namespace tracer { class LogMainWnd: public QAbstractScrollArea { public: - LogMainWnd(QWidget* pParent); + LogMainWnd(QWidget* pParent); - LogView& view() - { - return *static_cast(viewport()); - } + LogView& view() + { + return *static_cast(viewport()); + } private: - virtual bool viewportEvent(QEvent* pEvent); - virtual void focusInEvent (QFocusEvent* pEvent); - virtual void focusOutEvent(QFocusEvent* pEvent); - virtual void keyPressEvent(QKeyEvent* pEvent); + virtual bool viewportEvent(QEvent* pEvent); + virtual void focusInEvent (QFocusEvent* pEvent); + virtual void focusOutEvent(QFocusEvent* pEvent); + virtual void keyPressEvent(QKeyEvent* pEvent); }; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_LOGGER_MAIN_WND_H_ diff --git a/app/rdo_studio/src/tracer/logger/tracer_logger_view.cpp b/app/rdo_studio/src/tracer/logger/tracer_logger_view.cpp index e315e39d3..9977ce1d6 100644 --- a/app/rdo_studio/src/tracer/logger/tracer_logger_view.cpp +++ b/app/rdo_studio/src/tracer/logger/tracer_logger_view.cpp @@ -26,1010 +26,952 @@ namespace rdo { namespace gui { namespace tracer { class LogCtrlFindInList { public: - LogCtrlFindInList(int& checkCounter, const QString& strToFind, bool matchCase, bool matchWholeWord); - bool operator() (const QString& nextStr); + LogCtrlFindInList(int& checkCounter, const QString& strToFind, bool matchCase, bool matchWholeWord); + bool operator() (const QString& nextStr); - LogCtrlFindInList& operator= (const LogCtrlFindInList&) - { - NEVER_REACH_HERE; - return *this; - } + LogCtrlFindInList& operator= (const LogCtrlFindInList&) + { + NEVER_REACH_HERE; + return *this; + } private: - boost::optional m_expression; - int& m_checkCounter; + boost::optional m_expression; + int& m_checkCounter; }; }}} // namespace rdo::gui::tracer LogCtrlFindInList::LogCtrlFindInList(int& checkCounter, const QString& strToFind, bool matchCase, bool matchWholeWord) - : m_checkCounter(checkCounter) + : m_checkCounter(checkCounter) { - QString what = matchWholeWord - ? QString("^%1$").arg(strToFind) - : QString(".*%1.*").arg(strToFind); + QString what = matchWholeWord + ? QString("^%1$").arg(strToFind) + : QString(".*%1.*").arg(strToFind); - boost::regex_constants::syntax_option_type regex_constants(boost::regex::perl); + boost::regex_constants::syntax_option_type regex_constants(boost::regex::perl); - if (!matchCase) - { - regex_constants |= boost::regex::icase; - } + if (!matchCase) + regex_constants |= boost::regex::icase; - try - { - m_expression = boost::regex(what.toStdString(), regex_constants); - } - catch (const std::exception&) - {} + try + { + m_expression = boost::regex(what.toStdString(), regex_constants); + } + catch (const std::exception&) + {} } bool LogCtrlFindInList::operator()(const QString& nextStr) { - ++m_checkCounter; + ++m_checkCounter; - if (!m_expression.is_initialized()) - return false; + if (!m_expression.is_initialized()) + return false; - try - { - bool result = boost::regex_match(nextStr.toStdString(), m_expression.get()); - if (result) - { - TRACE1("found %s\n", nextStr.toStdString().c_str()); - } - return result; - } - catch (const std::exception&) - {} - return false; + try + { + bool result = boost::regex_match(nextStr.toStdString(), m_expression.get()); + if (result) + TRACE1("found %s\n", nextStr.toStdString().c_str()); + + return result; + } + catch (const std::exception&) + {} + + return false; } // -------------------------------------------------------------------------------- // -------------------- LogView::StringList // -------------------------------------------------------------------------------- LogView::StringList::StringList() - : m_count (0) - , m_cursorIt(m_list.end()) - , m_cursor (0) - , m_maxLegth(0) + : m_count (0) + , m_cursorIt(m_list.end()) + , m_cursor (0) + , m_maxLegth(0) {} void LogView::StringList::push_back(const QString& value) { - m_list.push_back(value); - ++m_count; + m_list.push_back(value); + ++m_count; - if (m_count == 1) - { - m_cursorIt = m_list.begin(); - } + if (m_count == 1) + m_cursorIt = m_list.begin(); - if (value.length() > m_maxLegth) - { - m_maxLegth = value.length(); - } + if (value.length() > m_maxLegth) + m_maxLegth = value.length(); } LogView::StringList::const_iterator LogView::StringList::begin() const { - return m_list.begin(); + return m_list.begin(); } LogView::StringList::const_iterator LogView::StringList::end() const { - return m_list.end(); + return m_list.end(); } LogView::StringList::const_reverse_iterator LogView::StringList::rbegin() const { - return m_list.rbegin(); + return m_list.rbegin(); } LogView::StringList::const_reverse_iterator LogView::StringList::rend() const { - return m_list.rend(); + return m_list.rend(); } void LogView::StringList::clear() { - m_list.clear(); - m_count = 0; - m_maxLegth = 0; + m_list.clear(); + m_count = 0; + m_maxLegth = 0; } int LogView::StringList::count() const { - return m_count; + return m_count; } int LogView::StringList::maxLegth() const { - return m_maxLegth; + return m_maxLegth; } void LogView::StringList::setCursor(int pos, int max) { - if (pos == m_cursor) - return; - - if (pos == 0) - { - m_cursorIt = m_list.begin(); - } - else if (pos == max) - { - m_cursorIt = m_list.end(); - for (int i = m_count; i > max; --i) - { - --m_cursorIt; - } - } - else - { - int delta = pos - m_cursor; - ASSERT(m_cursorIt != m_list.end()); - std::advance(m_cursorIt, delta); - } - m_cursor = pos; + if (pos == m_cursor) + return; + + if (pos == 0) + { + m_cursorIt = m_list.begin(); + } + else if (pos == max) + { + m_cursorIt = m_list.end(); + for (int i = m_count; i > max; --i) + --m_cursorIt; + } + else + { + int delta = pos - m_cursor; + ASSERT(m_cursorIt != m_list.end()); + std::advance(m_cursorIt, delta); + } + m_cursor = pos; } LogView::StringList::const_iterator LogView::StringList::findString(int index) const { - const_iterator res; - - if (index == 0) - { - res = m_list.begin(); - } - else if (index == m_cursor) - { - res = m_cursorIt; - } - else if (index == m_count - 1) - { - res = m_list.end(); - --res; - } - else - { - int deltaPos = index - m_cursor; - int deltaEnd = index - (m_count - 1); - int mod_deltaPos = deltaPos >= 0 ? deltaPos : -1 * deltaPos; - int mod_deltaEnd = deltaEnd >= 0 ? deltaEnd : -1 * deltaEnd; - int delta = (std::min)(index, mod_deltaPos); - delta = (std::min)(delta, mod_deltaEnd); - if (delta == index) - { - res = m_list.begin(); - } - else if (delta == mod_deltaPos) - { - res = m_cursorIt; - delta = deltaPos; - } - else if (delta == mod_deltaEnd) - { - res = m_list.end(); - --res; - delta = deltaEnd; - } - - if (res != m_list.end()) - { - std::advance(res, delta); - } - } - - return res; + const_iterator res; + + if (index == 0) + { + res = m_list.begin(); + } + else if (index == m_cursor) + { + res = m_cursorIt; + } + else if (index == m_count - 1) + { + res = m_list.end(); + --res; + } + else + { + int deltaPos = index - m_cursor; + int deltaEnd = index - (m_count - 1); + int mod_deltaPos = deltaPos >= 0 ? deltaPos : -1 * deltaPos; + int mod_deltaEnd = deltaEnd >= 0 ? deltaEnd : -1 * deltaEnd; + int delta = (std::min)(index, mod_deltaPos); + delta = (std::min)(delta, mod_deltaEnd); + if (delta == index) + { + res = m_list.begin(); + } + else if (delta == mod_deltaPos) + { + res = m_cursorIt; + delta = deltaPos; + } + else if (delta == mod_deltaEnd) + { + res = m_list.end(); + --res; + delta = deltaEnd; + } + + if (res != m_list.end()) + std::advance(res, delta); + } + + return res; } LogView::StringList::const_reverse_iterator LogView::StringList::rFindString(int index) const { - const_reverse_iterator rit(findString(index)); - return rit; + const_reverse_iterator rit(findString(index)); + return rit; } // -------------------------------------------------------------------------------- // -------------------- LogView::SubitemColors // -------------------------------------------------------------------------------- LogView::SubitemColors::SubitemColors() - : m_addingSubitems(false) - , m_parentColor () + : m_addingSubitems(false) + , m_parentColor () {} LogView::SubitemColors::SubitemColors(const SubitemColors& subitemColors) - : m_colorList (subitemColors.m_colorList ) - , m_addingSubitems(subitemColors.m_addingSubitems) - , m_parentColor (subitemColors.m_parentColor ) + : m_colorList (subitemColors.m_colorList ) + , m_addingSubitems(subitemColors.m_addingSubitems) + , m_parentColor (subitemColors.m_parentColor ) {} // -------------------------------------------------------------------------------- // -------------------- LogView::ScrollMetricVert // -------------------------------------------------------------------------------- LogView::ScrollMetricVert::ScrollMetricVert() - : ScrollMetric () - , lastViewableLine(0) + : ScrollMetric () + , lastViewableLine(0) {} bool LogView::ScrollMetricVert::isVisible(int index) const { - return index >= position && - index <= lastViewableLine; + return index >= position && + index <= lastViewableLine; } bool LogView::ScrollMetricVert::applyInc(int delta) { - if (!ScrollMetric::applyInc(delta)) - { - return false; - } + if (!ScrollMetric::applyInc(delta)) + return false; - lastViewableLine += delta; - return true; + lastViewableLine += delta; + return true; } // -------------------------------------------------------------------------------- // -------------------- LogView // -------------------------------------------------------------------------------- LogView::LogView(QAbstractScrollArea* pParent, LogStyle* pStyle) - : parent_type (pParent) - , m_pScrollArea (pParent) - , m_logStyle (pStyle ) - , m_lineHeight (0 ) - , m_charWidth (0 ) - , m_selectedLine (-1) - , m_pPopupMenu (NULL ) - , m_fullRepaintLines(0 ) - , m_focusOnly (false) - , m_pFindDialog (NULL ) - , m_drawLog (true ) -{ - if (!m_logStyle) - { - m_logStyle = &g_pApp->getStyle()->style_trace; - } - - connect(&getVertScrollBar(), &QScrollBar::valueChanged, this, &LogView::onVertScrollBarValueChanged); - connect(&getHorzScrollBar(), &QScrollBar::valueChanged, this, &LogView::onHorzScrollBarValueChanged); - - QPalette p = palette(); - p.setColor(QPalette::Inactive, QPalette::Highlight, p.color(QPalette::Active, QPalette::Highlight)); - p.setColor(QPalette::Inactive, QPalette::HighlightedText, p.color(QPalette::Active, QPalette::HighlightedText)); - setPalette(p); - - setFont(); - updateScrollBars(); - - Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); - m_pPopupMenu = new QMenu(this); - m_pPopupMenu->addAction(pMainWindow->actEditCopy); - m_pPopupMenu->addSeparator(); - m_pPopupMenu->addAction(pMainWindow->actSearchFind); - m_pPopupMenu->addAction(pMainWindow->actSearchFindNext); - m_pPopupMenu->addAction(pMainWindow->actSearchFindPrevious); + : parent_type (pParent) + , m_pScrollArea (pParent) + , m_logStyle (pStyle ) + , m_lineHeight (0 ) + , m_charWidth (0 ) + , m_selectedLine (-1) + , m_pPopupMenu (NULL ) + , m_fullRepaintLines(0 ) + , m_focusOnly (false) + , m_pFindDialog (NULL ) + , m_drawLog (true ) +{ + if (!m_logStyle) + m_logStyle = &g_pApp->getStyle()->style_trace; + + connect(&getVertScrollBar(), &QScrollBar::valueChanged, this, &LogView::onVertScrollBarValueChanged); + connect(&getHorzScrollBar(), &QScrollBar::valueChanged, this, &LogView::onHorzScrollBarValueChanged); + + QPalette p = palette(); + p.setColor(QPalette::Inactive, QPalette::Highlight, p.color(QPalette::Active, QPalette::Highlight)); + p.setColor(QPalette::Inactive, QPalette::HighlightedText, p.color(QPalette::Active, QPalette::HighlightedText)); + setPalette(p); + + setFont(); + updateScrollBars(); + + Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); + m_pPopupMenu = new QMenu(this); + m_pPopupMenu->addAction(pMainWindow->actEditCopy); + m_pPopupMenu->addSeparator(); + m_pPopupMenu->addAction(pMainWindow->actSearchFind); + m_pPopupMenu->addAction(pMainWindow->actSearchFindNext); + m_pPopupMenu->addAction(pMainWindow->actSearchFindPrevious); } LogView::~LogView() { - clear(); + clear(); } void LogView::push_back(const std::string& log) { - if (!log.empty()) - { - int posstart = log.find_first_not_of(' '); - int posend = log.find_first_of(' ', posstart); - std::string key = boost::algorithm::trim_copy(log.substr(posstart, posend - posstart)); - - LogColorPair colors; - - if (m_logStyle->getItemColors(key, colors)) - { - m_subitemColors.m_addingSubitems = false; - } - else if (m_subitemColors.m_addingSubitems) - { - m_subitemColors.m_colorList.insert(SubitemColors::List::value_type(m_strings.count(), m_subitemColors.m_parentColor)); - } - - if (key == "SD") - { - m_subitemColors.m_addingSubitems = true; - m_logStyle->getItemColors(key, m_subitemColors.m_parentColor); - } - } - - bool prevVisible = m_SM_Y.isVisible(m_strings.count() - 1); - - m_strings.push_back(QString::fromStdString(log)); - - int lastString = m_strings.count() - 1; - if (lastString == 1) - { - updateActionFind(isActivated()); - } - - if (m_drawLog) - { - updateScrollBars(); - - m_fullRepaintLines = 1; - - if ( selectedLine() != -1 && selectedLine() == lastString - 1) - { - setSelectedLine(lastString); - m_fullRepaintLines++; - } - - if (!isFullyVisible(lastString) && prevVisible && (!m_SM_Y.isVisible(selectedLine()) || selectedLine() == lastString)) - { - //::SendMessage(m_hWnd, WM_VSCROLL, MAKELONG(SB_BOTTOM, 0), NULL); - scrollVertically(m_SM_Y.posMax - m_SM_Y.position); - } - else if (m_SM_Y.isVisible(lastString)) - { - repaintLine(lastString); - if (m_fullRepaintLines == 2) - { - repaintLine(lastString - 1); - } - } - - m_fullRepaintLines = 0; - } - else - { - if (selectedLine() != -1 && selectedLine() == lastString - 1) - { - setSelectedLine(lastString); - } - } + if (!log.empty()) + { + int posstart = log.find_first_not_of(' '); + int posend = log.find_first_of(' ', posstart); + std::string key = boost::algorithm::trim_copy(log.substr(posstart, posend - posstart)); + + LogColorPair colors; + + if (m_logStyle->getItemColors(key, colors)) + { + m_subitemColors.m_addingSubitems = false; + } + else if (m_subitemColors.m_addingSubitems) + { + m_subitemColors.m_colorList.insert(SubitemColors::List::value_type(m_strings.count(), m_subitemColors.m_parentColor)); + } + + if (key == "SD") + { + m_subitemColors.m_addingSubitems = true; + m_logStyle->getItemColors(key, m_subitemColors.m_parentColor); + } + } + + bool prevVisible = m_SM_Y.isVisible(m_strings.count() - 1); + + m_strings.push_back(QString::fromStdString(log)); + + int lastString = m_strings.count() - 1; + if (lastString == 1) + updateActionFind(isActivated()); + + if (m_drawLog) + { + updateScrollBars(); + + m_fullRepaintLines = 1; + + if ( selectedLine() != -1 && selectedLine() == lastString - 1) + { + setSelectedLine(lastString); + m_fullRepaintLines++; + } + + if (!isFullyVisible(lastString) && prevVisible && (!m_SM_Y.isVisible(selectedLine()) || selectedLine() == lastString)) + { + scrollVertically(m_SM_Y.posMax - m_SM_Y.position); + } + else if (m_SM_Y.isVisible(lastString)) + { + repaintLine(lastString); + if (m_fullRepaintLines == 2) + repaintLine(lastString - 1); + } + + m_fullRepaintLines = 0; + } + else + { + if (selectedLine() != -1 && selectedLine() == lastString - 1) + setSelectedLine(lastString); + } } void LogView::setText(std::string text) { - clear(); - while (!text.empty()) - { - std::size_t pos = text.find_first_of("\r\n"); - if (pos == std::string::npos) - { - pos = text.length(); - } - push_back(pos ? text.substr(0, pos) : ""); - text.erase(0, pos); - text.erase(0, text.find_first_not_of("\r\n")); - } + clear(); + while (!text.empty()) + { + std::size_t pos = text.find_first_of("\r\n"); + if (pos == std::string::npos) + pos = text.length(); + + push_back(pos ? text.substr(0, pos) : ""); + text.erase(0, pos); + text.erase(0, text.find_first_not_of("\r\n")); + } } void LogView::clear() { - m_strings.clear(); - m_subitemColors = SubitemColors(); + m_strings.clear(); + m_subitemColors = SubitemColors(); - m_SM_X = ScrollMetric(); - m_SM_Y = ScrollMetricVert(); - setSelectedLine(-1); + m_SM_X = ScrollMetric(); + m_SM_Y = ScrollMetricVert(); + setSelectedLine(-1); - updateScrollBars(); - update(); + updateScrollBars(); + update(); } void LogView::selectLine(int index) { - if (index < 0 || index > m_strings.count() - 1 || index == selectedLine()) - { - return; - } + if (index < 0 || index > m_strings.count() - 1 || index == selectedLine()) + return; - int prevSel = selectedLine(); - int inc = (std::max)(-prevSel, (std::min)(index - prevSel, m_strings.count() - 1 - prevSel)); + int prevSel = selectedLine(); + int inc = (std::max)(-prevSel, (std::min)(index - prevSel, m_strings.count() - 1 - prevSel)); - if (inc) - { - setSelectedLine(selectedLine() + inc); + if (inc) + { + setSelectedLine(selectedLine() + inc); - bool needrepaint = !makeLineVisible(selectedLine()); - if (needrepaint) - { - repaintLine(selectedLine()); - } + bool needrepaint = !makeLineVisible(selectedLine()); + if (needrepaint) + repaintLine(selectedLine()); - repaintLine(prevSel); - } + repaintLine(prevSel); + } } bool LogView::getFocusOnly() const { - return m_focusOnly; + return m_focusOnly; } void LogView::setFocusOnly(bool value) { - m_focusOnly = value; + m_focusOnly = value; } const LogStyle& LogView::getStyle() const { - return *m_logStyle; + return *m_logStyle; } void LogView::setStyle(LogStyle* style, bool needRedraw) { - m_logStyle = style; - setFont(); + m_logStyle = style; + setFont(); - updateScrollBars(); + updateScrollBars(); - if (needRedraw) - { - update(); - } + if (needRedraw) + update(); } bool LogView::getDrawLog() const { - return m_drawLog; + return m_drawLog; } void LogView::setDrawLog(bool value) { - if (m_drawLog != value) - { - m_drawLog = value; - updateScrollBars(); - update(); - makeLineVisible(selectedLine()); - } + if (m_drawLog != value) + { + m_drawLog = value; + updateScrollBars(); + update(); + makeLineVisible(selectedLine()); + } } bool LogView::getItemColors(int index, LogColorPair &colors) const { - bool res = true; - SubitemColors::List::const_iterator it = m_subitemColors.m_colorList.find(index); - if (it != m_subitemColors.m_colorList.end()) - { - colors = (*it).second; - } - else - { - res = LogView::getItemColors("", colors); - } + bool res = true; + SubitemColors::List::const_iterator it = m_subitemColors.m_colorList.find(index); + if (it != m_subitemColors.m_colorList.end()) + colors = (*it).second; + else + res = LogView::getItemColors("", colors); - return res; + return res; } bool LogView::getItemColors(const QString& item, LogColorPair &colors) const { - return m_logStyle->getItemColors(item.toStdString(), colors); + return m_logStyle->getItemColors(item.toStdString(), colors); } int LogView::selectedLine() const { - return m_selectedLine; + return m_selectedLine; } void LogView::setSelectedLine(int selectedLine) { - m_selectedLine = selectedLine; - updateActionEditCopy(isActivated()); - updateCoordStatusBar(isActivated()); + m_selectedLine = selectedLine; + updateActionEditCopy(isActivated()); + updateCoordStatusBar(isActivated()); } QString LogView::getString(int index) const { - QString result; + QString result; - if (index >= 0 && index < m_strings.count()) - { - result = *m_strings.findString(index); - } + if (index >= 0 && index < m_strings.count()) + result = *m_strings.findString(index); - return result; + return result; } QString LogView::getSelected() const { - return getString(selectedLine()); + return getString(selectedLine()); } QScrollBar& LogView::getVertScrollBar() { - QScrollBar* pScrollBar = m_pScrollArea->verticalScrollBar(); - ASSERT(pScrollBar); - return *pScrollBar; + QScrollBar* pScrollBar = m_pScrollArea->verticalScrollBar(); + ASSERT(pScrollBar); + return *pScrollBar; } QScrollBar& LogView::getHorzScrollBar() { - QScrollBar* pScrollBar = m_pScrollArea->horizontalScrollBar(); - ASSERT(pScrollBar); - return *pScrollBar; + QScrollBar* pScrollBar = m_pScrollArea->horizontalScrollBar(); + ASSERT(pScrollBar); + return *pScrollBar; } void LogView::updateScrollBars() { - m_SM_Y.pageSize = m_clientRect.height() / m_lineHeight; - m_SM_Y.posMax = (std::max)(0, m_strings.count() - m_SM_Y.pageSize); - m_SM_Y.position = (std::min)(m_SM_Y.position, m_SM_Y.posMax); + m_SM_Y.pageSize = m_clientRect.height() / m_lineHeight; + m_SM_Y.posMax = (std::max)(0, m_strings.count() - m_SM_Y.pageSize); + m_SM_Y.position = (std::min)(m_SM_Y.position, m_SM_Y.posMax); + + m_SM_X.pageSize = (m_clientRect.width() - m_logStyle->borders.horzBorder) / m_charWidth; + m_SM_X.posMax = (std::max)(0, int(m_strings.maxLegth()) - m_SM_X.pageSize); + m_SM_X.position = (std::min)(m_SM_X.position, m_SM_X.posMax); - m_SM_X.pageSize = (m_clientRect.width() - m_logStyle->borders.horzBorder) / m_charWidth; - m_SM_X.posMax = (std::max)(0, int(m_strings.maxLegth()) - m_SM_X.pageSize); - m_SM_X.position = (std::min)(m_SM_X.position, m_SM_X.posMax); + int mul = m_SM_Y.pageSize; + if (mul * m_lineHeight < m_clientRect.height()) + mul++; - int mul = m_SM_Y.pageSize; - if (mul * m_lineHeight < m_clientRect.height()) - { - mul++; - } - m_SM_Y.lastViewableLine = m_SM_Y.position + mul - 1; + m_SM_Y.lastViewableLine = m_SM_Y.position + mul - 1; - m_strings.setCursor(m_SM_Y.position, m_SM_Y.posMax); + m_strings.setCursor(m_SM_Y.position, m_SM_Y.posMax); - getVertScrollBar().setRange (0, m_SM_Y.posMax); - getVertScrollBar().setPageStep(m_drawLog && m_SM_Y.posMax > 0 ? m_SM_Y.pageSize : 0); - getVertScrollBar().setValue (m_SM_Y.position); + getVertScrollBar().setRange (0, m_SM_Y.posMax); + getVertScrollBar().setPageStep(m_drawLog && m_SM_Y.posMax > 0 ? m_SM_Y.pageSize : 0); + getVertScrollBar().setValue (m_SM_Y.position); - getHorzScrollBar().setRange (0, m_SM_X.posMax); - getHorzScrollBar().setPageStep(m_drawLog && m_SM_X.posMax > 0 ? m_SM_X.pageSize : 0); - getHorzScrollBar().setValue (m_SM_X.position); + getHorzScrollBar().setRange (0, m_SM_X.posMax); + getHorzScrollBar().setPageStep(m_drawLog && m_SM_X.posMax > 0 ? m_SM_X.pageSize : 0); + getHorzScrollBar().setValue (m_SM_X.position); } bool LogView::scrollVertically(int inc) { - if (!m_SM_Y.applyInc(inc)) - { - return false; - } + if (!m_SM_Y.applyInc(inc)) + return false; - m_strings.setCursor(m_SM_Y.position, m_SM_Y.posMax); - getVertScrollBar().setValue(m_SM_Y.position); - update(); - return true; + m_strings.setCursor(m_SM_Y.position, m_SM_Y.posMax); + getVertScrollBar().setValue(m_SM_Y.position); + update(); + return true; } bool LogView::scrollHorizontally(int inc) { - if (!m_SM_X.applyInc(inc)) - { - return false; - } + if (!m_SM_X.applyInc(inc)) + return false; - getHorzScrollBar().setValue(m_SM_X.position); - update(); - return true; + getHorzScrollBar().setValue(m_SM_X.position); + update(); + return true; } void LogView::onVertScrollBarValueChanged(int value) { - if (value < 0) - { - return; - } + if (value < 0) + return; - scrollVertically(value - m_SM_Y.position); + scrollVertically(value - m_SM_Y.position); } void LogView::onHorzScrollBarValueChanged(int value) { - if (value < 0) - { - return; - } + if (value < 0) + return; - scrollHorizontally(value - m_SM_X.position); + scrollHorizontally(value - m_SM_X.position); } bool LogView::makeLineVisible(int index) { - bool res = false; + bool res = false; - if (isFullyVisible(index)) - { - return res; - } + if (isFullyVisible(index)) + return res; - int inc; - if (m_SM_Y.position < index) - { - int lastVisible = m_SM_Y.position + m_clientRect.height() / m_lineHeight - 1; - inc = index - lastVisible; - } - else - { - inc = index - m_SM_Y.position; - } + int inc; + if (m_SM_Y.position < index) + { + int lastVisible = m_SM_Y.position + m_clientRect.height() / m_lineHeight - 1; + inc = index - lastVisible; + } + else + { + inc = index - m_SM_Y.position; + } - //Repainting nearby lines after scrolling - m_fullRepaintLines = 2; + // Repainting nearby lines after scrolling + m_fullRepaintLines = 2; - res = scrollVertically(inc); + res = scrollVertically(inc); - m_fullRepaintLines = 0; + m_fullRepaintLines = 0; - return res; + return res; } bool LogView::isFullyVisible(int index) const { - int lastVisible = m_SM_Y.position + m_clientRect.height() / m_lineHeight - 1; - return index <= lastVisible && index >= m_SM_Y.position; + int lastVisible = m_SM_Y.position + m_clientRect.height() / m_lineHeight - 1; + return index <= lastVisible && index >= m_SM_Y.position; } QRect LogView::getLineRect(int index) const { - QRect rect(m_clientRect); - rect.setTop((index - m_SM_Y.position) * m_lineHeight); - rect.setBottom((std::min)(rect.top() + m_lineHeight, rect.bottom())); - return rect; + QRect rect(m_clientRect); + rect.setTop((index - m_SM_Y.position) * m_lineHeight); + rect.setBottom((std::min)(rect.top() + m_lineHeight, rect.bottom())); + return rect; } void LogView::repaintLine(int index) { - if (m_SM_Y.isVisible(index)) - { - update(getLineRect(index)); - update(); - } + if (m_SM_Y.isVisible(index)) + { + update(getLineRect(index)); + update(); + } } void LogView::setFont() { - if (!m_logStyle) - { - return; - } + if (!m_logStyle) + return; - m_font = QFont(m_logStyle->font.name.c_str()); - m_font.setBold (m_logStyle->fontStyle & StyleFont::BOLD ? true : false); - m_font.setItalic (m_logStyle->fontStyle & StyleFont::ITALIC ? true : false); - m_font.setUnderline(m_logStyle->fontStyle & StyleFont::UNDERLINE ? true : false); - m_font.setPointSize(m_logStyle->font.size); + m_font = QFont(m_logStyle->font.name.c_str()); + m_font.setBold (static_cast(m_logStyle->fontStyle) & static_cast(StyleFont::Style::BOLD) ? true : false); + m_font.setItalic (static_cast(m_logStyle->fontStyle) & static_cast(StyleFont::Style::ITALIC) ? true : false); + m_font.setUnderline(static_cast(m_logStyle->fontStyle) & static_cast(StyleFont::Style::UNDERLINE) ? true : false); + m_font.setPointSize(m_logStyle->font.size); - QFontMetrics fontMetrics(m_font); - m_lineHeight = fontMetrics.height() + 2 * m_logStyle->borders.vertBorder; - m_charWidth = fontMetrics.averageCharWidth(); // fontMetrics.maxWidth() + QFontMetrics fontMetrics(m_font); + m_lineHeight = fontMetrics.height() + 2 * m_logStyle->borders.vertBorder; + m_charWidth = fontMetrics.averageCharWidth(); } void LogView::updateActionFind(bool activated) { - Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); + Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); - updateAction( - pMainWindow->actSearchFind, - activated && m_strings.count(), - this, &LogView::onSearchFind - ); + updateAction( + pMainWindow->actSearchFind, + activated && m_strings.count(), + this, &LogView::onSearchFind + ); - bool findNextPrev = activated && !m_findSettings.what.isEmpty(); - updateAction( - pMainWindow->actSearchFindNext, - findNextPrev, - this, &LogView::onSearchFindNext - ); + bool findNextPrev = activated && !m_findSettings.what.isEmpty(); + updateAction( + pMainWindow->actSearchFindNext, + findNextPrev, + this, &LogView::onSearchFindNext + ); - updateAction( - pMainWindow->actSearchFindPrevious, - findNextPrev, - this, &LogView::onSearchFindPrevious - ); + updateAction( + pMainWindow->actSearchFindPrevious, + findNextPrev, + this, &LogView::onSearchFindPrevious + ); } void LogView::updateActionEditCopy(bool activated) { - Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); + Ui::MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); - updateAction( - pMainWindow->actEditCopy, - activated && canCopy(), - this, &LogView::onEditCopy - ); + updateAction( + pMainWindow->actEditCopy, + activated && canCopy(), + this, &LogView::onEditCopy + ); } void LogView::updateCoordStatusBar(bool activated) { - QString coord = activated && selectedLine() != -1 - ? QString("1 : %1").arg(selectedLine()) - : QString(); + QString coord = activated && selectedLine() != -1 + ? QString("1 : %1").arg(selectedLine()) + : QString(); - MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); - pMainWindow->statusBar()->update(coord); + MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); + pMainWindow->statusBar()->update(coord); } bool LogView::canCopy() const { - return selectedLine() != -1; + return selectedLine() != -1; } int LogView::find(bool searchDown) { - int result = -1; + int result = -1; - int startPos = selectedLine() == -1 - ? searchDown - ? 0 - : m_strings.count() - : searchDown - ? selectedLine() + 1 - : selectedLine() - 1; + int startPos = selectedLine() == -1 + ? searchDown + ? 0 + : m_strings.count() + : searchDown + ? selectedLine() + 1 + : selectedLine() - 1; - int checkCounter = 0; - LogCtrlFindInList findInList(checkCounter, m_findSettings.what, m_findSettings.matchCase, m_findSettings.matchWholeWord); + int checkCounter = 0; + LogCtrlFindInList findInList(checkCounter, m_findSettings.what, m_findSettings.matchCase, m_findSettings.matchWholeWord); - bool found = searchDown - ? std::find_if(m_strings.findString(startPos), m_strings.end(), findInList) != m_strings.end() - : std::find_if(m_strings.rFindString(startPos + 1), m_strings.rend(), findInList) != m_strings.rend(); + bool found = searchDown + ? std::find_if(m_strings.findString(startPos), m_strings.end(), findInList) != m_strings.end() + : std::find_if(m_strings.rFindString(startPos + 1), m_strings.rend(), findInList) != m_strings.rend(); - if (found) - { - result = startPos + (checkCounter - 1) * (searchDown ? 1 : -1); - } + if (found) + result = startPos + (checkCounter - 1) * (searchDown ? 1 : -1); - return result; + return result; } void LogView::onFindDlgFind(const FindDialog::Settings& settings) { - m_findSettings = settings; - updateActionFind(isActivated()); - onSearchFindNext(); + m_findSettings = settings; + updateActionFind(isActivated()); + onSearchFindNext(); } void LogView::onFindDlgClose() { - m_pFindDialog = NULL; + m_pFindDialog = NULL; } void LogView::onSearchFind() { - m_findSettings.what = getSelected(); + m_findSettings.what = getSelected(); - if (!m_pFindDialog) - { - m_pFindDialog = new FindDialog( - this, - boost::bind(&LogView::onFindDlgFind, this, _1), - boost::bind(&LogView::onFindDlgClose, this) - ); - } + if (!m_pFindDialog) + { + m_pFindDialog = new FindDialog( + this, + boost::bind(&LogView::onFindDlgFind, this, _1), + boost::bind(&LogView::onFindDlgClose, this) + ); + } - m_pFindDialog->setSettings(m_findSettings); - m_pFindDialog->show(); - m_pFindDialog->raise(); - m_pFindDialog->activateWindow(); + m_pFindDialog->setSettings(m_findSettings); + m_pFindDialog->show(); + m_pFindDialog->raise(); + m_pFindDialog->activateWindow(); } void LogView::onSearchFindNext() { - selectLine(find(m_findSettings.searchDown)); + selectLine(find(m_findSettings.searchDown)); } void LogView::onSearchFindPrevious() { - selectLine(find(!m_findSettings.searchDown)); + selectLine(find(!m_findSettings.searchDown)); } void LogView::resizeEvent(QResizeEvent* pEvent) { - parent_type::resizeEvent(pEvent); + parent_type::resizeEvent(pEvent); - m_clientRect = QRect(QPoint(0, 0), pEvent->size()); - updateScrollBars(); + m_clientRect = QRect(QPoint(0, 0), pEvent->size()); + updateScrollBars(); } void LogView::paintEvent(QPaintEvent* pEvent) { - QPainter painter(this); - - if (m_drawLog) - { - if (!pEvent->rect().isEmpty() && !pEvent->rect().isNull()) - { - painter.setFont(m_font); - - int firstLine = (std::max)(0, m_SM_Y.position + pEvent->rect().top() / m_lineHeight); - int mul = pEvent->rect().bottom() / m_lineHeight; - if (pEvent->rect().bottom() > mul * m_lineHeight) - { - mul++; - } - int lastLine = (std::min)(m_strings.count() - 1, m_SM_Y.position + mul - 1); - - LogColorPair colors; - - int y = m_lineHeight * (-m_SM_Y.position + firstLine - 1); - QRect rect(m_charWidth * (-m_SM_X.position), y, pEvent->rect().width() + m_charWidth * m_SM_X.position, m_lineHeight); - QRect textRect( - rect.left () + m_logStyle->borders.horzBorder, - rect.top () + m_logStyle->borders.vertBorder, - rect.width () - m_logStyle->borders.horzBorder * 2, - rect.height() - m_logStyle->borders.vertBorder * 2 - ); - - StringList::const_iterator it = m_strings.findString(firstLine); - for (int i = firstLine; i < lastLine + 1; i++) - { - if (i != selectedLine() || m_focusOnly) - { - if (!getItemColors((*it), colors)) - { - getItemColors(i, colors); - } - } - else - { - colors.foregroundColor = palette().color(QPalette::HighlightedText); - colors.backgroundColor = palette().color(QPalette::Highlight); - } - - rect .translate(0, m_lineHeight); - textRect.translate(0, m_lineHeight); - - //Main drawing cycle - painter.setBackgroundMode(Qt::TransparentMode); - painter.fillRect(rect, colors.backgroundColor); - painter.setPen (colors.foregroundColor); - painter.drawText(textRect, *it); - //End of main drawing cycle :) - - if (i == selectedLine() && hasFocus()) - { - QRect focusRect(m_clientRect); - focusRect.setTop (rect.top ()); - focusRect.setBottom(rect.bottom()); - QStyleOptionFocusRect option; - option.initFrom(this); - option.state |= QStyle::State_KeyboardFocusChange; - option.backgroundColor = palette().color(QPalette::Background); - option.rect = focusRect; - style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this); - } - - ++it; - - //! @todo необходимо ли, когда colors не указатель? - //if (i == selectedLine() && !m_focusOnly) - //{ - // colors = NULL; - //} - } - - getItemColors("", colors); - - painter.fillRect( - pEvent->rect().left(), - rect.bottom(), - pEvent->rect().width(), - pEvent->rect().height() - rect.bottom(), - colors.backgroundColor - ); - } - } - else - { - LogColorPair colors; - getItemColors("", colors); - - painter.fillRect( - m_clientRect, - colors.backgroundColor - ); - } - - parent_type::paintEvent(pEvent); + QPainter painter(this); + + if (m_drawLog) + { + if (!pEvent->rect().isEmpty() && !pEvent->rect().isNull()) + { + painter.setFont(m_font); + + int firstLine = (std::max)(0, m_SM_Y.position + pEvent->rect().top() / m_lineHeight); + int mul = pEvent->rect().bottom() / m_lineHeight; + if (pEvent->rect().bottom() > mul * m_lineHeight) + mul++; + + const int lastLine = (std::min)(m_strings.count() - 1, m_SM_Y.position + mul - 1); + + LogColorPair colors; + + int y = m_lineHeight * (-m_SM_Y.position + firstLine - 1); + QRect rect(m_charWidth * (-m_SM_X.position), y, pEvent->rect().width() + m_charWidth * m_SM_X.position, m_lineHeight); + QRect textRect( + rect.left () + m_logStyle->borders.horzBorder, + rect.top () + m_logStyle->borders.vertBorder, + rect.width () - m_logStyle->borders.horzBorder * 2, + rect.height() - m_logStyle->borders.vertBorder * 2 + ); + + StringList::const_iterator it = m_strings.findString(firstLine); + for (int i = firstLine; i < lastLine + 1; i++) + { + if (i != selectedLine() || m_focusOnly) + { + if (!getItemColors((*it), colors)) + { + getItemColors(i, colors); + } + } + else + { + colors.foregroundColor = palette().color(QPalette::HighlightedText); + colors.backgroundColor = palette().color(QPalette::Highlight); + } + + rect .translate(0, m_lineHeight); + textRect.translate(0, m_lineHeight); + + //Main drawing cycle + painter.setBackgroundMode(Qt::TransparentMode); + painter.fillRect(rect, colors.backgroundColor); + painter.setPen (colors.foregroundColor); + painter.drawText(textRect, *it); + //End of main drawing cycle :) + + if (i == selectedLine() && hasFocus()) + { + QRect focusRect(m_clientRect); + focusRect.setTop (rect.top ()); + focusRect.setBottom(rect.bottom()); + QStyleOptionFocusRect option; + option.initFrom(this); + option.state |= QStyle::State_KeyboardFocusChange; + option.backgroundColor = palette().color(QPalette::Background); + option.rect = focusRect; + style()->drawPrimitive(QStyle::PE_FrameFocusRect, &option, &painter, this); + } + + ++it; + } + + getItemColors("", colors); + + painter.fillRect( + pEvent->rect().left(), + rect.bottom(), + pEvent->rect().width(), + pEvent->rect().height() - rect.bottom(), + colors.backgroundColor + ); + } + } + else + { + LogColorPair colors; + getItemColors("", colors); + + painter.fillRect( + m_clientRect, + colors.backgroundColor + ); + } + + parent_type::paintEvent(pEvent); } void LogView::keyPressEvent(QKeyEvent* pEvent) { - switch (pEvent->key()) - { - case Qt::Key_Up: - selectLine(selectedLine() - 1); - break; + switch (pEvent->key()) + { + case Qt::Key_Up: + selectLine(selectedLine() - 1); + break; - case Qt::Key_Down: - selectLine(selectedLine() + 1); - break; + case Qt::Key_Down: + selectLine(selectedLine() + 1); + break; - case Qt::Key_PageUp: - selectLine((std::max)(selectedLine() - m_SM_Y.pageSize, 0)); - break; + case Qt::Key_PageUp: + selectLine((std::max)(selectedLine() - m_SM_Y.pageSize, 0)); + break; - case Qt::Key_PageDown: - selectLine((std::min)(selectedLine() + m_SM_Y.pageSize, m_strings.count() - 1)); - break; + case Qt::Key_PageDown: + selectLine((std::min)(selectedLine() + m_SM_Y.pageSize, m_strings.count() - 1)); + break; - case Qt::Key_Home: - selectLine(0); - break; + case Qt::Key_Home: + selectLine(0); + break; - case Qt::Key_End: - selectLine(m_strings.count() - 1); - break; + case Qt::Key_End: + selectLine(m_strings.count() - 1); + break; - default: - break; - } + default: + break; + } } void LogView::wheelEvent(QWheelEvent* pEvent) { - getVertScrollBar().setValue(getVertScrollBar().value() + (pEvent->delta() < 0 ? 1 : -1)); + getVertScrollBar().setValue(getVertScrollBar().value() + (pEvent->delta() < 0 ? 1 : -1)); } void LogView::mousePressEvent(QMouseEvent* pEvent) { - if (pEvent->button() == Qt::LeftButton) - { - selectLine((std::min)(m_SM_Y.position + pEvent->pos().y() / m_lineHeight, m_strings.count() - 1)); - } + if (pEvent->button() == Qt::LeftButton) + { + selectLine((std::min)(m_SM_Y.position + pEvent->pos().y() / m_lineHeight, m_strings.count() - 1)); + } } void LogView::contextMenuEvent(QContextMenuEvent* pEvent) { - m_pPopupMenu->exec(pEvent->globalPos()); + m_pPopupMenu->exec(pEvent->globalPos()); } void LogView::onUpdateActions(bool activated) { - repaintLine(selectedLine()); + repaintLine(selectedLine()); - MainWindow* pMainWindow = g_pApp->getMainWndUI(); - ASSERT(pMainWindow); + MainWindow* pMainWindow = g_pApp->getMainWndUI(); + ASSERT(pMainWindow); - updateAction( - pMainWindow->actHelpContext, - activated, - this, &LogView::onHelpContext - ); + updateAction( + pMainWindow->actHelpContext, + activated, + this, &LogView::onHelpContext + ); - updateActionFind (activated); - updateActionEditCopy(activated); - updateCoordStatusBar(activated); + updateActionFind (activated); + updateActionEditCopy(activated); + updateCoordStatusBar(activated); - pMainWindow->statusBar()->update(activated - ? "Только чтение" - : QString() - ); + pMainWindow->statusBar()->update(activated + ? "Только чтение" + : QString() + ); } void LogView::onEditCopy() { - QApplication::clipboard()->setText(getSelected()); + QApplication::clipboard()->setText(getSelected()); } void LogView::onHelpContext() { - QString line = getSelected().simplified(); - - QString keyword("trc"); - if (!line.isEmpty()) - { - keyword = line.left(line.indexOf(' ')); - - if (!keyword.isEmpty()) - { - LogColorPair colors; - if (!m_logStyle->getItemColors(keyword.toStdString(), colors)) - { - getItemColors(selectedLine(), colors); - if (colors == m_logStyle->sd) - { - keyword = "SD"; - } - } - } - } - - QByteArray ba; - ba.append("activateKeyword "); - ba.append(keyword); - ba.append("\n"); - g_pApp->callQtAssistant(ba); + QString line = getSelected().simplified(); + + QString keyword("trc"); + if (!line.isEmpty()) + { + keyword = line.left(line.indexOf(' ')); + + if (!keyword.isEmpty()) + { + LogColorPair colors; + if (!m_logStyle->getItemColors(keyword.toStdString(), colors)) + { + getItemColors(selectedLine(), colors); + if (colors == m_logStyle->sd) + keyword = "SD"; + } + } + } + + QByteArray ba; + ba.append("activateKeyword "); + ba.append(keyword); + ba.append("\n"); + g_pApp->callQtAssistant(ba); } diff --git a/app/rdo_studio/src/tracer/logger/tracer_logger_view.h b/app/rdo_studio/src/tracer/logger/tracer_logger_view.h index 2729da9b8..58e7a91bd 100644 --- a/app/rdo_studio/src/tracer/logger/tracer_logger_view.h +++ b/app/rdo_studio/src/tracer/logger/tracer_logger_view.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_LOGGER_VIEW_H_ -#define _RDO_STUDIO_TRACER_LOGGER_VIEW_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -24,148 +23,146 @@ class LogView: public ActionActivatorWidget Q_OBJECT public: - LogView(QAbstractScrollArea* pParent, LogStyle* pStyle); - virtual ~LogView(); + LogView(QAbstractScrollArea* pParent, LogStyle* pStyle); + virtual ~LogView(); - void push_back(const std::string& log); - void setText(std::string text); - void clear(); - void selectLine(int index); + void push_back(const std::string& log); + void setText(std::string text); + void clear(); + void selectLine(int index); - bool getFocusOnly() const; - void setFocusOnly(bool value); + bool getFocusOnly() const; + void setFocusOnly(bool value); - const LogStyle& getStyle() const; - void setStyle(LogStyle* style, bool needRedraw = true); + const LogStyle& getStyle() const; + void setStyle(LogStyle* style, bool needRedraw = true); - bool getDrawLog() const; - void setDrawLog(bool value); + bool getDrawLog() const; + void setDrawLog(bool value); private: - typedef ActionActivatorWidget parent_type; - - class StringList - { - public: - typedef std::list List; - typedef List::const_iterator const_iterator; - typedef List::const_reverse_iterator const_reverse_iterator; - - StringList(); - - void push_back(const QString& value); - - const_iterator begin() const; - const_iterator end () const; - - const_reverse_iterator rbegin() const; - const_reverse_iterator rend () const; - - void clear(); - int count() const; - int maxLegth() const; - void setCursor(int pos, int max); - - const_iterator findString(int index) const; - const_reverse_iterator rFindString(int index) const; - - private: - List m_list; - int m_count; - List::iterator m_cursorIt; - int m_cursor; - int m_maxLegth; - }; - - struct SubitemColors - { - typedef std::map List; - - List m_colorList; - bool m_addingSubitems; - LogColorPair m_parentColor; - - SubitemColors(); - SubitemColors(const SubitemColors& subitemColors); - }; - - struct ScrollMetricVert: public ScrollMetric - { - int lastViewableLine; - - ScrollMetricVert(); - bool isVisible(int index) const; - bool applyInc(int delta); - }; - - QAbstractScrollArea* m_pScrollArea; - StringList m_strings; - LogStyle* m_logStyle; - int m_lineHeight; - int m_charWidth; - int m_selectedLine; - QMenu* m_pPopupMenu; - ScrollMetric m_SM_X; - ScrollMetricVert m_SM_Y; - SubitemColors m_subitemColors; - QRect m_clientRect; - QRect m_prevWindowRect; - int m_fullRepaintLines; - bool m_focusOnly; - FindDialog* m_pFindDialog; - FindDialog::Settings m_findSettings; - bool m_drawLog; - QFont m_font; - - bool getItemColors(const QString& item, LogColorPair &colors) const; - bool getItemColors(int index, LogColorPair &colors) const; - - int selectedLine() const; - void setSelectedLine(int selectedLine); - - QString getString (int index) const; - QString getSelected () const; - - QScrollBar& getVertScrollBar (); - QScrollBar& getHorzScrollBar (); - void updateScrollBars (); - bool scrollVertically (int inc); - bool scrollHorizontally (int inc); - - bool makeLineVisible (int index); - bool isFullyVisible (int index) const; - QRect getLineRect (int index) const; - void repaintLine (int index); - - void setFont (); - void updateActionFind (bool activated); - void updateActionEditCopy(bool activated); - void updateCoordStatusBar(bool activated); - bool canCopy () const; - - int find(bool searchDown); - void onFindDlgFind(const FindDialog::Settings& settings); - void onFindDlgClose(); - - virtual void resizeEvent (QResizeEvent* pEvent); - virtual void paintEvent (QPaintEvent* pEvent); - virtual void keyPressEvent (QKeyEvent* pEvent); - virtual void wheelEvent (QWheelEvent* pEvent); - virtual void mousePressEvent (QMouseEvent* pEvent); - virtual void contextMenuEvent(QContextMenuEvent* pEvent); - - virtual void onUpdateActions(bool activated); + typedef ActionActivatorWidget parent_type; + + class StringList + { + public: + typedef std::list List; + typedef List::const_iterator const_iterator; + typedef List::const_reverse_iterator const_reverse_iterator; + + StringList(); + + void push_back(const QString& value); + + const_iterator begin() const; + const_iterator end () const; + + const_reverse_iterator rbegin() const; + const_reverse_iterator rend () const; + + void clear(); + int count() const; + int maxLegth() const; + void setCursor(int pos, int max); + + const_iterator findString(int index) const; + const_reverse_iterator rFindString(int index) const; + + private: + List m_list; + int m_count; + List::iterator m_cursorIt; + int m_cursor; + int m_maxLegth; + }; + + struct SubitemColors + { + typedef std::map List; + + List m_colorList; + bool m_addingSubitems; + LogColorPair m_parentColor; + + SubitemColors(); + SubitemColors(const SubitemColors& subitemColors); + }; + + struct ScrollMetricVert: public ScrollMetric + { + int lastViewableLine; + + ScrollMetricVert(); + bool isVisible(int index) const; + bool applyInc(int delta); + }; + + QAbstractScrollArea* m_pScrollArea; + StringList m_strings; + LogStyle* m_logStyle; + int m_lineHeight; + int m_charWidth; + int m_selectedLine; + QMenu* m_pPopupMenu; + ScrollMetric m_SM_X; + ScrollMetricVert m_SM_Y; + SubitemColors m_subitemColors; + QRect m_clientRect; + QRect m_prevWindowRect; + int m_fullRepaintLines; + bool m_focusOnly; + FindDialog* m_pFindDialog; + FindDialog::Settings m_findSettings; + bool m_drawLog; + QFont m_font; + + bool getItemColors(const QString& item, LogColorPair &colors) const; + bool getItemColors(int index, LogColorPair &colors) const; + + int selectedLine() const; + void setSelectedLine(int selectedLine); + + QString getString (int index) const; + QString getSelected () const; + + QScrollBar& getVertScrollBar (); + QScrollBar& getHorzScrollBar (); + void updateScrollBars (); + bool scrollVertically (int inc); + bool scrollHorizontally (int inc); + + bool makeLineVisible (int index); + bool isFullyVisible (int index) const; + QRect getLineRect (int index) const; + void repaintLine (int index); + + void setFont (); + void updateActionFind (bool activated); + void updateActionEditCopy(bool activated); + void updateCoordStatusBar(bool activated); + bool canCopy () const; + + int find(bool searchDown); + void onFindDlgFind(const FindDialog::Settings& settings); + void onFindDlgClose(); + + virtual void resizeEvent (QResizeEvent* pEvent); + virtual void paintEvent (QPaintEvent* pEvent); + virtual void keyPressEvent (QKeyEvent* pEvent); + virtual void wheelEvent (QWheelEvent* pEvent); + virtual void mousePressEvent (QMouseEvent* pEvent); + virtual void contextMenuEvent(QContextMenuEvent* pEvent); + + virtual void onUpdateActions(bool activated); private slots: - void onVertScrollBarValueChanged(int value); - void onHorzScrollBarValueChanged(int value); - void onEditCopy (); - void onSearchFind (); - void onSearchFindNext (); - void onSearchFindPrevious (); - void onHelpContext (); + void onVertScrollBarValueChanged(int value); + void onHorzScrollBarValueChanged(int value); + void onEditCopy (); + void onSearchFind (); + void onSearchFindNext (); + void onSearchFindPrevious (); + void onHelpContext (); }; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_LOGGER_VIEW_H_ diff --git a/app/rdo_studio/src/tracer/logger/tracer_logger_view_style.cpp b/app/rdo_studio/src/tracer/logger/tracer_logger_view_style.cpp index eb1c8102b..ffa031c3a 100644 --- a/app/rdo_studio/src/tracer/logger/tracer_logger_view_style.cpp +++ b/app/rdo_studio/src/tracer/logger/tracer_logger_view_style.cpp @@ -14,45 +14,44 @@ using namespace rdo::gui::style; // -------------------------------------------------------------------------------- LogColorPair::LogColorPair() { - foregroundColor = QColor( 0x00, 0x00, 0x00 ); - backgroundColor = QColor( 0xFF, 0xFF, 0xFF ); + foregroundColor = QColor(0x00, 0x00, 0x00); + backgroundColor = QColor(0xFF, 0xFF, 0xFF); } LogColorPair::~LogColorPair() -{ -} +{} -LogColorPair& LogColorPair::operator =( const LogColorPair& colors ) +LogColorPair& LogColorPair::operator =(const LogColorPair& colors) { - foregroundColor = colors.foregroundColor; - backgroundColor = colors.backgroundColor; + foregroundColor = colors.foregroundColor; + backgroundColor = colors.backgroundColor; - return *this; + return *this; } -bool LogColorPair::operator ==( const LogColorPair& colors ) const +bool LogColorPair::operator ==(const LogColorPair& colors) const { - return foregroundColor == colors.foregroundColor && - backgroundColor == colors.backgroundColor; + return foregroundColor == colors.foregroundColor && + backgroundColor == colors.backgroundColor; } -bool LogColorPair::operator !=( const LogColorPair& colors ) const +bool LogColorPair::operator !=(const LogColorPair& colors) const { - return !(*this == colors); + return !(*this == colors); } void LogColorPair::load(QSettings& settings, QString regParam) { - regParam.append("_"); - foregroundColor = QColor(settings.value(QString(regParam + "foreground_color"), foregroundColor.name()).toString()); - backgroundColor = QColor(settings.value(QString(regParam + "background_color"), backgroundColor.name()).toString()); + regParam.append("_"); + foregroundColor = QColor(settings.value(QString(regParam + "foreground_color"), foregroundColor.name()).toString()); + backgroundColor = QColor(settings.value(QString(regParam + "background_color"), backgroundColor.name()).toString()); } void LogColorPair::save(QSettings& settings, QString regParam) const { - regParam.append("_"); - settings.setValue(QString(regParam + "foreground_color"), foregroundColor.name()); - settings.setValue(QString(regParam + "background_color"), backgroundColor.name()); + regParam.append("_"); + settings.setValue(QString(regParam + "foreground_color"), foregroundColor.name()); + settings.setValue(QString(regParam + "background_color"), backgroundColor.name()); } // -------------------------------------------------------------------------------- @@ -60,59 +59,58 @@ void LogColorPair::save(QSettings& settings, QString regParam) const // -------------------------------------------------------------------------------- LogBorders::LogBorders() { - vertBorder = 0; - horzBorder = 0; + vertBorder = 0; + horzBorder = 0; } LogBorders::~LogBorders() -{ -} +{} -LogBorders& LogBorders::operator =( const LogBorders& borders ) +LogBorders& LogBorders::operator =(const LogBorders& borders) { - vertBorder = borders.vertBorder; - horzBorder = borders.horzBorder; + vertBorder = borders.vertBorder; + horzBorder = borders.horzBorder; - return *this; + return *this; } -bool LogBorders::operator ==( const LogBorders& borders ) const +bool LogBorders::operator ==(const LogBorders& borders) const { - return vertBorder == borders.vertBorder && - horzBorder == borders.horzBorder; + return vertBorder == borders.vertBorder && + horzBorder == borders.horzBorder; } -bool LogBorders::operator !=( const LogBorders& borders ) const +bool LogBorders::operator !=(const LogBorders& borders) const { - return !(*this == borders); + return !(*this == borders); } void LogBorders::load(QSettings& settings) { - settings >> *this; + settings >> *this; } void LogBorders::save(QSettings& settings) const { - settings << *this; + settings << *this; } namespace rdo { namespace gui { namespace tracer { QSettings& operator<< (QSettings& settings, const LogBorders& border) { - settings.setValue("vert_border", border.vertBorder); - settings.setValue("horz_border", border.horzBorder); + settings.setValue("vert_border", border.vertBorder); + settings.setValue("horz_border", border.horzBorder); - return settings; + return settings; } QSettings& operator>> (QSettings& settings, LogBorders& border) { - border.vertBorder = settings.value("vert_border", border.vertBorder).toInt(); - border.horzBorder = settings.value("horz_border", border.horzBorder).toInt(); + border.vertBorder = settings.value("vert_border", border.vertBorder).toInt(); + border.horzBorder = settings.value("horz_border", border.horzBorder).toInt(); - return settings; + return settings; } }}} // namespace rdo::gui::tracer @@ -121,91 +119,91 @@ QSettings& operator>> (QSettings& settings, LogBorders& border) // -------------------- LogStyle // -------------------------------------------------------------------------------- LogStyle::LogStyle() - : StyleBase() - , fontStyle() - , borders() + : StyleBase() + , fontStyle() + , borders() { - fontStyle = StyleFont::NONE; + fontStyle = StyleFont::Style::NONE; - es.foregroundColor = QColor( 0x8B, 0x00, 0x00 ); - es.backgroundColor = QColor( 0xFF, 0xC0, 0xCB ); + es.foregroundColor = QColor(0x8B, 0x00, 0x00); + es.backgroundColor = QColor(0xFF, 0xC0, 0xCB); - eb.foregroundColor = QColor( 0x34, 0x4B, 0xA2 ); - eb.backgroundColor = QColor( 0xAA, 0xE3, 0xFB ); + eb.foregroundColor = QColor(0x34, 0x4B, 0xA2); + eb.backgroundColor = QColor(0xAA, 0xE3, 0xFB); - ef.foregroundColor = QColor( 0x16, 0x02, 0x50 ); - ef.backgroundColor = QColor( 0x81, 0xB0, 0xD5 ); + ef.foregroundColor = QColor(0x16, 0x02, 0x50); + ef.backgroundColor = QColor(0x81, 0xB0, 0xD5); - ei.foregroundColor = QColor( 0x4F, 0x29, 0x62 ); - ei.backgroundColor = QColor( 0xD0, 0xD0, 0xFF ); + ei.foregroundColor = QColor(0x4F, 0x29, 0x62); + ei.backgroundColor = QColor(0xD0, 0xD0, 0xFF); - er.foregroundColor = QColor( 0x17, 0x32, 0x47 ); - er.backgroundColor = QColor( 0xB6, 0xCB, 0xDB ); + er.foregroundColor = QColor(0x17, 0x32, 0x47); + er.backgroundColor = QColor(0xB6, 0xCB, 0xDB); - rc.foregroundColor = QColor( 0x23, 0x74, 0x42 ); - rc.backgroundColor = QColor( 0x96, 0xFF, 0x96 ); + rc.foregroundColor = QColor(0x23, 0x74, 0x42); + rc.backgroundColor = QColor(0x96, 0xFF, 0x96); - re.foregroundColor = QColor( 0x43, 0x5A, 0x43 ); - re.backgroundColor = QColor( 0xB4, 0xE0, 0xB4 ); + re.foregroundColor = QColor(0x43, 0x5A, 0x43); + re.backgroundColor = QColor(0xB4, 0xE0, 0xB4); - rk.foregroundColor = QColor( 0x00, 0x86, 0x00 ); - rk.backgroundColor = QColor( 0xD0, 0xFF, 0xD0 ); + rk.foregroundColor = QColor(0x00, 0x86, 0x00); + rk.backgroundColor = QColor(0xD0, 0xFF, 0xD0); - v.foregroundColor = QColor( 0x00, 0x00, 0x00 ); - v.backgroundColor = QColor( 0xF1, 0xFB, 0xE2 ); + v.foregroundColor = QColor(0x00, 0x00, 0x00); + v.backgroundColor = QColor(0xF1, 0xFB, 0xE2); - s.foregroundColor = QColor( 0x00, 0x00, 0xFF ); - s.backgroundColor = QColor( 0xE7, 0xF8, 0xF8 ); + s.foregroundColor = QColor(0x00, 0x00, 0xFF); + s.backgroundColor = QColor(0xE7, 0xF8, 0xF8); - dps.foregroundColor = QColor( 0x03, 0x23, 0x8B ); - dps.backgroundColor = QColor( 0xC9, 0xCD, 0xDB ); + dps.foregroundColor = QColor(0x03, 0x23, 0x8B); + dps.backgroundColor = QColor(0xC9, 0xCD, 0xDB); - sb.foregroundColor = QColor( 0x5A, 0x4F, 0x37 ); - sb.backgroundColor = QColor( 0xF8, 0xD6, 0x8D ); + sb.foregroundColor = QColor(0x5A, 0x4F, 0x37); + sb.backgroundColor = QColor(0xF8, 0xD6, 0x8D); - so.foregroundColor = QColor( 0x4B, 0x54, 0x0E ); - so.backgroundColor = QColor( 0xE6, 0xF1, 0x98 ); + so.foregroundColor = QColor(0x4B, 0x54, 0x0E); + so.backgroundColor = QColor(0xE6, 0xF1, 0x98); - stn.foregroundColor = QColor( 0x00, 0x54, 0x72 ); - stn.backgroundColor = QColor( 0xE8, 0xE8, 0xD7 ); + stn.foregroundColor = QColor(0x00, 0x54, 0x72); + stn.backgroundColor = QColor(0xE8, 0xE8, 0xD7); - std.foregroundColor = QColor( 0x69, 0x55, 0x49 ); - std.backgroundColor = stn.backgroundColor; + std.foregroundColor = QColor(0x69, 0x55, 0x49); + std.backgroundColor = stn.backgroundColor; - str.foregroundColor = QColor( 0x8B, 0x00, 0x00 ); - str.backgroundColor = stn.backgroundColor; + str.foregroundColor = QColor(0x8B, 0x00, 0x00); + str.backgroundColor = stn.backgroundColor; - src.foregroundColor = rc.foregroundColor; - src.backgroundColor = rc.backgroundColor; + src.foregroundColor = rc.foregroundColor; + src.backgroundColor = rc.backgroundColor; - sre.foregroundColor = re.foregroundColor; - sre.backgroundColor = re.backgroundColor; + sre.foregroundColor = re.foregroundColor; + sre.backgroundColor = re.backgroundColor; - srk.foregroundColor = rk.foregroundColor; - srk.backgroundColor = rk.backgroundColor; + srk.foregroundColor = rk.foregroundColor; + srk.backgroundColor = rk.backgroundColor; - sd.foregroundColor = QColor( 0x54, 0x1E, 0x09 ); - sd.backgroundColor = QColor( 0xF7, 0xCF, 0xB5 ); + sd.foregroundColor = QColor(0x54, 0x1E, 0x09); + sd.backgroundColor = QColor(0xF7, 0xCF, 0xB5); - ses.foregroundColor = QColor( 0x54, 0x1E, 0x09 ); - ses.backgroundColor = QColor( 0xF0, 0xDE, 0xDB ); + ses.foregroundColor = QColor(0x54, 0x1E, 0x09); + ses.backgroundColor = QColor(0xF0, 0xDE, 0xDB); - sen.foregroundColor = QColor( 0xF0, 0x4B, 0x30 ); - sen.backgroundColor = ses.backgroundColor; + sen.foregroundColor = QColor(0xF0, 0x4B, 0x30); + sen.backgroundColor = ses.backgroundColor; - sem.foregroundColor = QColor( 0xF0, 0x4B, 0x30 ); - sem.backgroundColor = QColor( 0xE3, 0xF0, 0xF6 ); + sem.foregroundColor = QColor(0xF0, 0x4B, 0x30); + sem.backgroundColor = QColor(0xE3, 0xF0, 0xF6); - sef.foregroundColor = sem.foregroundColor; - sef.backgroundColor = sem.backgroundColor; + sef.foregroundColor = sem.foregroundColor; + sef.backgroundColor = sem.backgroundColor; - seu.foregroundColor = sem.foregroundColor; - seu.backgroundColor = sem.backgroundColor; + seu.foregroundColor = sem.foregroundColor; + seu.backgroundColor = sem.backgroundColor; - borders.vertBorder = 1; - borders.horzBorder = 2; + borders.vertBorder = 1; + borders.horzBorder = 2; - font = StyleFont::getTracerLogFont(); + font = StyleFont::getTracerLogFont(); } LogStyle::~LogStyle() @@ -214,244 +212,296 @@ LogStyle::~LogStyle() bool LogStyle::getItemColors(int /*index*/, LogColorPair &colors) const { - return getDefaultColor(colors); + return getDefaultColor(colors); } bool LogStyle::getItemColors(const std::string& item, LogColorPair &colors) const { - if ( item.empty() ) - return LogStyle::getDefaultColor(colors); - int posstart = item.find_first_not_of( ' ' ); - int posend = item.find_first_of( ' ', posstart ); - std::string key = boost::algorithm::trim_copy(item.substr(posstart, posend - posstart)); - bool res = true; - if ( key == "ES" ) { - colors = es; - } else if ( key == "EB" ) { - colors = eb; - } else if ( key == "EF" ) { - colors = ef; - } else if ( key == "EI" ) { - colors = ei; - } else if ( key == "ER" ) { - colors = er; - } else if ( key == "RC" ) { - colors = rc; - } else if ( key == "RE" ) { - colors = re; - } else if ( key == "RK" ) { - colors = rk; - } else if ( key == "V" ) { - colors = v; - } else if ( key == "$Status" ) { - colors = s; - } else if ( key.find( "DPS" ) != std::string::npos ) { - colors = dps; - } else if ( key == "SB" ) { - colors = sb; - } else if ( key == "SO" ) { - colors = so; - } else if ( key == "STN" ) { - colors = stn; - } else if ( key == "STD" ) { - colors = std; - } else if ( key == "STR" ) { - colors = str; - } else if ( key == "SRC" ) { - colors = src; - } else if ( key == "SRE" ) { - colors = sre; - } else if ( key == "SRK" ) { - colors = srk; - } else if ( key == "SD" ) { - colors = sd; - } else if ( key == "SES" ) { - colors = ses; - } else if ( key == "SEN" ) { - colors = sen; - } else if ( key == "SEM" ) { - colors = sem; - } else if ( key == "SEF" ) { - colors = sef; - } else if ( key == "SEU" ) { - colors = seu; - } else { - res = LogStyle::getDefaultColor(colors); - } - return res; + if (item.empty()) + return LogStyle::getDefaultColor(colors); + + const auto posstart = item.find_first_not_of(' '); + const auto posend = item.find_first_of(' ', posstart); + const auto key = boost::algorithm::trim_copy(item.substr(posstart, posend - posstart)); + bool res = true; + if (key == "ES") + { + colors = es; + } + else if (key == "EB") + { + colors = eb; + } + else if (key == "EF") + { + colors = ef; + } + else if (key == "EI") + { + colors = ei; + } + else if (key == "ER") + { + colors = er; + } + else if (key == "RC") + { + colors = rc; + } + else if (key == "RE") + { + colors = re; + } + else if (key == "RK") + { + colors = rk; + } + else if (key == "V") + { + colors = v; + } + else if (key == "$Status") + { + colors = s; + } + else if (key.find("DPS") != std::string::npos) + { + colors = dps; + } + else if (key == "SB") + { + colors = sb; + } + else if (key == "SO") + { + colors = so; + } + else if (key == "STN") + { + colors = stn; + } + else if (key == "STD") + { + colors = std; + } + else if (key == "STR") + { + colors = str; + } + else if (key == "SRC") + { + colors = src; + } + else if (key == "SRE") + { + colors = sre; + } + else if (key == "SRK") + { + colors = srk; + } + else if (key == "SD") + { + colors = sd; + } + else if (key == "SES") + { + colors = ses; + } + else if (key == "SEN") + { + colors = sen; + } + else if (key == "SEM") + { + colors = sem; + } + else if (key == "SEF") + { + colors = sef; + } + else if (key == "SEU") + { + colors = seu; + } + else + { + res = LogStyle::getDefaultColor(colors); + } + return res; } bool LogStyle::getDefaultColor(LogColorPair &colors) const { - colors = defaultColor; + colors = defaultColor; - return false; + return false; } -LogStyle& LogStyle::operator =( const LogStyle& style ) +LogStyle& LogStyle::operator =(const LogStyle& style) { - StyleBase::operator=( style ); - fontStyle = style.fontStyle; - defaultColor = style.defaultColor; - es = style.es; - eb = style.eb; - ef = style.ef; - ei = style.ei; - er = style.er; - rc = style.rc; - re = style.re; - rk = style.rk; - v = style.v; - s = style.s; - dps = style.dps; - sb = style.sb; - so = style.so; - stn = style.stn; - std = style.std; - str = style.str; - src = style.src; - sre = style.sre; - srk = style.srk; - sd = style.sd; - ses = style.ses; - sen = style.sen; - sem = style.sem; - sef = style.sef; - seu = style.seu; - - borders = style.borders; - - return *this; + StyleBase::operator=(style); + fontStyle = style.fontStyle; + defaultColor = style.defaultColor; + es = style.es; + eb = style.eb; + ef = style.ef; + ei = style.ei; + er = style.er; + rc = style.rc; + re = style.re; + rk = style.rk; + v = style.v; + s = style.s; + dps = style.dps; + sb = style.sb; + so = style.so; + stn = style.stn; + std = style.std; + str = style.str; + src = style.src; + sre = style.sre; + srk = style.srk; + sd = style.sd; + ses = style.ses; + sen = style.sen; + sem = style.sem; + sef = style.sef; + seu = style.seu; + + borders = style.borders; + + return *this; } -bool LogStyle::operator ==( const LogStyle& style ) const +bool LogStyle::operator ==(const LogStyle& style) const { - bool flag = StyleBase::operator==( style ); - flag &= borders == style.borders; - - return flag && fontStyle == style.fontStyle - && defaultColor == style.defaultColor - && es == style.es - && eb == style.eb - && ef == style.ef - && ei == style.ei - && er == style.er - && rc == style.rc - && re == style.re - && rk == style.rk - && v == style.v - && s == style.s - && dps == style.dps - && sb == style.sb - && so == style.so - && stn == style.stn - && std == style.std - && str == style.str - && src == style.src - && sre == style.sre - && srk == style.srk - && sd == style.sd - && ses == style.ses - && sen == style.sen - && sem == style.sem - && sef == style.sef - && seu == style.seu; + bool flag = StyleBase::operator==(style); + flag &= borders == style.borders; + + return flag && fontStyle == style.fontStyle + && defaultColor == style.defaultColor + && es == style.es + && eb == style.eb + && ef == style.ef + && ei == style.ei + && er == style.er + && rc == style.rc + && re == style.re + && rk == style.rk + && v == style.v + && s == style.s + && dps == style.dps + && sb == style.sb + && so == style.so + && stn == style.stn + && std == style.std + && str == style.str + && src == style.src + && sre == style.sre + && srk == style.srk + && sd == style.sd + && ses == style.ses + && sen == style.sen + && sem == style.sem + && sef == style.sef + && seu == style.seu; } -bool LogStyle::operator !=( const LogStyle& style ) const +bool LogStyle::operator !=(const LogStyle& style) const { - return !(*this == style); + return !(*this == style); } LogStyle LogStyle::getDefaultStyle() { - LogStyle style; - return style; + LogStyle style; + return style; } namespace rdo { namespace gui { namespace tracer { QSettings& operator<< (QSettings& settings, const LogStyle& style) { - settings << static_cast(style); - - settings.beginGroup("theme"); - settings.setValue("style", style.fontStyle); - style.defaultColor.save( settings, "defaultColor" ); - style.es.save ( settings, "es" ); - style.eb.save ( settings, "eb" ); - style.ef.save ( settings, "ef" ); - style.ei.save ( settings, "ei" ); - style.er.save ( settings, "er" ); - style.rc.save ( settings, "rc" ); - style.re.save ( settings, "re" ); - style.rk.save ( settings, "rk" ); - style.v.save ( settings, "v" ); - style.s.save ( settings, "s" ); - style.dps.save( settings, "dps" ); - style.sb.save ( settings, "sb" ); - style.so.save ( settings, "so" ); - style.stn.save( settings, "stn" ); - style.std.save( settings, "std" ); - style.str.save( settings, "str" ); - style.src.save( settings, "src" ); - style.sre.save( settings, "sre" ); - style.srk.save( settings, "srk" ); - style.sd.save ( settings, "sd" ); - style.ses.save( settings, "ses" ); - style.sen.save( settings, "sen" ); - style.sem.save( settings, "sem" ); - style.sef.save( settings, "sef" ); - style.seu.save( settings, "seu" ); - settings.endGroup(); - - settings.beginGroup("borders"); - settings << style.borders; - settings.endGroup(); - - - return settings; + settings << static_cast(style); + + settings.beginGroup("theme"); + settings.setValue("style", static_cast(style.fontStyle)); + style.defaultColor.save(settings, "defaultColor"); + style.es.save (settings, "es"); + style.eb.save (settings, "eb"); + style.ef.save (settings, "ef"); + style.ei.save (settings, "ei"); + style.er.save (settings, "er"); + style.rc.save (settings, "rc"); + style.re.save (settings, "re"); + style.rk.save (settings, "rk"); + style.v.save (settings, "v"); + style.s.save (settings, "s"); + style.dps.save(settings, "dps"); + style.sb.save (settings, "sb"); + style.so.save (settings, "so"); + style.stn.save(settings, "stn"); + style.std.save(settings, "std"); + style.str.save(settings, "str"); + style.src.save(settings, "src"); + style.sre.save(settings, "sre"); + style.srk.save(settings, "srk"); + style.sd.save (settings, "sd"); + style.ses.save(settings, "ses"); + style.sen.save(settings, "sen"); + style.sem.save(settings, "sem"); + style.sef.save(settings, "sef"); + style.seu.save(settings, "seu"); + settings.endGroup(); + + settings.beginGroup("borders"); + settings << style.borders; + settings.endGroup(); + + + return settings; } QSettings& operator>> (QSettings& settings, LogStyle& style) { - settings >> static_cast(style); - - settings.beginGroup("theme"); - style.fontStyle = static_cast(settings.value("style", style.fontStyle).toInt()); - style.defaultColor.load( settings, "defaultColor" ); - style.es.load ( settings, "es" ); - style.eb.load ( settings, "eb" ); - style.ef.load ( settings, "ef" ); - style.ei.load ( settings, "ei" ); - style.er.load ( settings, "er" ); - style.rc.load ( settings, "rc" ); - style.re.load ( settings, "re" ); - style.rk.load ( settings, "rk" ); - style.v.load ( settings, "v" ); - style.s.load ( settings, "s" ); - style.dps.load( settings, "dps" ); - style.sb.load ( settings, "sb" ); - style.so.load ( settings, "so" ); - style.stn.load( settings, "stn" ); - style.std.load( settings, "std" ); - style.str.load( settings, "str" ); - style.src.load( settings, "src" ); - style.sre.load( settings, "sre" ); - style.srk.load( settings, "srk" ); - style.sd.load ( settings, "sd" ); - style.ses.load( settings, "ses" ); - style.sen.load( settings, "sen" ); - style.sem.load( settings, "sem" ); - style.sef.load( settings, "sef" ); - style.seu.load( settings, "seu" ); - settings.endGroup(); - - settings.beginGroup("borders"); - settings >> style.borders; - settings.endGroup(); - - return settings; + settings >> static_cast(style); + + settings.beginGroup("theme"); + style.fontStyle = static_cast(settings.value("style", static_cast(style.fontStyle)).toInt()); + style.defaultColor.load(settings, "defaultColor"); + style.es.load (settings, "es"); + style.eb.load (settings, "eb"); + style.ef.load (settings, "ef"); + style.ei.load (settings, "ei"); + style.er.load (settings, "er"); + style.rc.load (settings, "rc"); + style.re.load (settings, "re"); + style.rk.load (settings, "rk"); + style.v.load (settings, "v"); + style.s.load (settings, "s"); + style.dps.load(settings, "dps"); + style.sb.load (settings, "sb"); + style.so.load (settings, "so"); + style.stn.load(settings, "stn"); + style.std.load(settings, "std"); + style.str.load(settings, "str"); + style.src.load(settings, "src"); + style.sre.load(settings, "sre"); + style.srk.load(settings, "srk"); + style.sd.load (settings, "sd"); + style.ses.load(settings, "ses"); + style.sen.load(settings, "sen"); + style.sem.load(settings, "sem"); + style.sef.load(settings, "sef"); + style.seu.load(settings, "seu"); + settings.endGroup(); + + settings.beginGroup("borders"); + settings >> style.borders; + settings.endGroup(); + + return settings; } }}} // namespace rdo::gui::tracer \ No newline at end of file diff --git a/app/rdo_studio/src/tracer/logger/tracer_logger_view_style.h b/app/rdo_studio/src/tracer/logger/tracer_logger_view_style.h index dd19cfb25..bd6c891d2 100644 --- a/app/rdo_studio/src/tracer/logger/tracer_logger_view_style.h +++ b/app/rdo_studio/src/tracer/logger/tracer_logger_view_style.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_LOGGER_VIEW_STYLE_H_ -#define _RDO_STUDIO_TRACER_LOGGER_VIEW_STYLE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -17,18 +16,18 @@ namespace rdo { namespace gui { namespace tracer { class LogColorPair { public: - LogColorPair(); - virtual ~LogColorPair(); + LogColorPair(); + virtual ~LogColorPair(); - LogColorPair& operator =( const LogColorPair& colors ); - bool operator ==( const LogColorPair& colors ) const; - bool operator !=( const LogColorPair& colors ) const; + LogColorPair& operator =(const LogColorPair& colors); + bool operator ==(const LogColorPair& colors) const; + bool operator !=(const LogColorPair& colors) const; - void load(QSettings& settings, QString regParam); - void save(QSettings& settings, QString regParam) const; + void load(QSettings& settings, QString regParam); + void save(QSettings& settings, QString regParam) const; - QColor foregroundColor; - QColor backgroundColor; + QColor foregroundColor; + QColor backgroundColor; }; // -------------------------------------------------------------------------------- @@ -37,18 +36,18 @@ class LogColorPair class LogBorders { public: - LogBorders(); - virtual ~LogBorders(); + LogBorders(); + virtual ~LogBorders(); - LogBorders& operator =( const LogBorders& borders ); - bool operator ==( const LogBorders& borders ) const; - bool operator !=( const LogBorders& borders ) const; + LogBorders& operator =(const LogBorders& borders); + bool operator ==(const LogBorders& borders) const; + bool operator !=(const LogBorders& borders) const; - void load(QSettings& settings); - void save(QSettings& settings) const; + void load(QSettings& settings); + void save(QSettings& settings) const; - int vertBorder; - int horzBorder; + int vertBorder; + int horzBorder; }; QSettings& operator<< (QSettings& settings, const LogBorders& border); @@ -60,56 +59,54 @@ QSettings& operator>> (QSettings& settings, LogBorders& border); class LogStyle: public style::StyleBase { public: - LogStyle(); - ~LogStyle(); - - virtual bool getItemColors(int index, LogColorPair &colors) const; - virtual bool getItemColors(const std::string& item, LogColorPair &colors) const; - - LogStyle& operator =( const LogStyle& style ); - bool operator ==( const LogStyle& style ) const; - bool operator !=( const LogStyle& style ) const; - - static LogStyle getDefaultStyle(); - - style::StyleFont::style fontStyle; - - LogColorPair defaultColor; - LogColorPair es; - LogColorPair eb; - LogColorPair ef; - LogColorPair ei; - LogColorPair er; - LogColorPair rc; - LogColorPair re; - LogColorPair rk; - LogColorPair v; - LogColorPair s; - LogColorPair dps; - LogColorPair sb; - LogColorPair so; - LogColorPair stn; - LogColorPair std; - LogColorPair str; - LogColorPair src; - LogColorPair sre; - LogColorPair srk; - LogColorPair sd; - LogColorPair ses; - LogColorPair sen; - LogColorPair sem; - LogColorPair sef; - LogColorPair seu; - - LogBorders borders; + LogStyle(); + ~LogStyle(); + + virtual bool getItemColors(int index, LogColorPair &colors) const; + virtual bool getItemColors(const std::string& item, LogColorPair &colors) const; + + LogStyle& operator =(const LogStyle& style); + bool operator ==(const LogStyle& style) const; + bool operator !=(const LogStyle& style) const; + + static LogStyle getDefaultStyle(); + + style::StyleFont::Style fontStyle; + + LogColorPair defaultColor; + LogColorPair es; + LogColorPair eb; + LogColorPair ef; + LogColorPair ei; + LogColorPair er; + LogColorPair rc; + LogColorPair re; + LogColorPair rk; + LogColorPair v; + LogColorPair s; + LogColorPair dps; + LogColorPair sb; + LogColorPair so; + LogColorPair stn; + LogColorPair std; + LogColorPair str; + LogColorPair src; + LogColorPair sre; + LogColorPair srk; + LogColorPair sd; + LogColorPair ses; + LogColorPair sen; + LogColorPair sem; + LogColorPair sef; + LogColorPair seu; + + LogBorders borders; private: - bool getDefaultColor(LogColorPair &colors) const; + bool getDefaultColor(LogColorPair &colors) const; }; QSettings& operator<< (QSettings& settings, const LogStyle& style); QSettings& operator>> (QSettings& settings, LogStyle& style); }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_LOGGER_VIEW_STYLE_H_ diff --git a/app/rdo_studio/src/tracer/tracer.cpp b/app/rdo_studio/src/tracer/tracer.cpp index 919cf0787..80284f237 100644 --- a/app/rdo_studio/src/tracer/tracer.cpp +++ b/app/rdo_studio/src/tracer/tracer.cpp @@ -8,7 +8,6 @@ #include "app/rdo_studio/src/model/model.h" #include "app/rdo_studio/src/main_window_base.h" #include "app/rdo_studio/src/application.h" -#include "app/rdo_studio/src/thread.h" #include "app/rdo_studio/src/tracer/tracer.h" #include "app/rdo_studio/src/tracer/chart/chart_doc.h" // -------------------------------------------------------------------------------- @@ -25,96 +24,96 @@ static bool s_clearAfterStop = false; // -------------------- Tracer // -------------------------------------------------------------------------------- Tracer::Tracer() - : TracerBase("RDOStudioTracerGUI", static_cast(g_pApp->m_pStudioGUI)) + : TracerBase("RDOStudioTracerGUI", static_cast(g_pApp->m_pStudioGUI)) { - s_clearAfterStop = false; + s_clearAfterStop = false; - g_pTracer = this; + g_pTracer = this; - notifies.push_back(RT_REPOSITORY_MODEL_CLOSE); - notifies.push_back(RT_SIMULATOR_MODEL_STOP_OK); - notifies.push_back(RT_SIMULATOR_MODEL_STOP_BY_USER); - notifies.push_back(RT_SIMULATOR_MODEL_STOP_RUNTIME_ERROR); - notifies.push_back(RT_RUNTIME_MODEL_START_BEFORE); - notifies.push_back(RT_RUNTIME_MODEL_START_AFTER); - notifies.push_back(RT_RUNTIME_TRACE_STRING); + notifies.push_back(Message::REPOSITORY_MODEL_CLOSE); + notifies.push_back(Message::SIMULATOR_MODEL_STOP_OK); + notifies.push_back(Message::SIMULATOR_MODEL_STOP_BY_USER); + notifies.push_back(Message::SIMULATOR_MODEL_STOP_RUNTIME_ERROR); + notifies.push_back(Message::RUNTIME_MODEL_START_BEFORE); + notifies.push_back(Message::RUNTIME_MODEL_START_AFTER); + notifies.push_back(Message::RUNTIME_TRACE_STRING); - after_constructor(); + after_constructor(); } Tracer::~Tracer() { - g_pTracer = NULL; + g_pTracer = NULL; } void Tracer::proc(RDOThread::RDOMessageInfo& msg) { - switch (msg.message) - { - case RDOThread::RT_REPOSITORY_MODEL_CLOSE: - s_clearAfterStop = g_pModel->isRunning(); - if (!s_clearAfterStop) - { - clear(); - } - break; + switch (msg.message) + { + case RDOThread::Message::REPOSITORY_MODEL_CLOSE: + s_clearAfterStop = g_pModel->isRunning(); + if (!s_clearAfterStop) + { + clear(); + } + break; - case RDOThread::RT_RUNTIME_MODEL_START_BEFORE: - clear(); - ChartDoc::resetTitleIndex(); - try - { - setModelName(g_pModel->getName()); - g_pApp->getIMainWnd()->getDockDebug().appendString("Получение структуры модели... "); - std::stringstream model_structure; - sendMessage(kernel->simulator(), RT_SIMULATOR_GET_MODEL_STRUCTURE, &model_structure); - getModelStructure(model_structure); - g_pApp->getIMainWnd()->getDockDebug().appendString("ok\n"); - } - catch (...) - { - g_pApp->getIMainWnd()->getDockDebug().appendString("failed\n"); - } - break; + case RDOThread::Message::RUNTIME_MODEL_START_BEFORE: + clear(); + ChartDoc::resetTitleIndex(); + try + { + setModelName(g_pModel->getName()); + g_pApp->getIMainWnd()->getDockDebug().appendString("Получение структуры модели... "); + std::stringstream model_structure; + sendMessage(kernel->simulator(), Message::SIMULATOR_GET_MODEL_STRUCTURE, &model_structure); + getModelStructure(model_structure); + g_pApp->getIMainWnd()->getDockDebug().appendString("ok\n"); + } + catch (...) + { + g_pApp->getIMainWnd()->getDockDebug().appendString("failed\n"); + } + break; - case RDOThread::RT_RUNTIME_MODEL_START_AFTER: - { - rdo::runtime::RunTimeMode runtimeMode; - sendMessage(kernel->runtime(), RT_RUNTIME_GET_MODE, &runtimeMode); - setRuntimeMode(runtimeMode); - break; - } + case RDOThread::Message::RUNTIME_MODEL_START_AFTER: + { + rdo::runtime::RunTimeMode runtimeMode; + sendMessage(kernel->runtime(), Message::RUNTIME_GET_MODE, &runtimeMode); + setRuntimeMode(runtimeMode); + break; + } - case RDOThread::RT_SIMULATOR_MODEL_STOP_OK: - case RDOThread::RT_SIMULATOR_MODEL_STOP_BY_USER: - case RDOThread::RT_SIMULATOR_MODEL_STOP_RUNTIME_ERROR: - if (s_clearAfterStop) - { - clear(); - s_clearAfterStop = false; - } - setDrawTrace(true); - break; + case RDOThread::Message::SIMULATOR_MODEL_STOP_OK: + case RDOThread::Message::SIMULATOR_MODEL_STOP_BY_USER: + case RDOThread::Message::SIMULATOR_MODEL_STOP_RUNTIME_ERROR: + if (s_clearAfterStop) + { + clear(); + s_clearAfterStop = false; + } + setDrawTrace(true); + break; - case RDOThread::RT_RUNTIME_TRACE_STRING: - msg.lock(); - getTraceString(*static_cast(msg.param)); - msg.unlock(); - break; + case RDOThread::Message::RUNTIME_TRACE_STRING: + msg.lock(); + getTraceString(*static_cast(msg.param)); + msg.unlock(); + break; - default: - break; - } + default: + break; + } } void Tracer::setRuntimeMode(const rdo::runtime::RunTimeMode value) { - if (value == rdo::runtime::RTM_MaxSpeed) - { - setDrawTrace(false); - } - else - { - setDrawTrace(true); - } + if (value == rdo::runtime::RunTimeMode::MAX_SPEED) + { + setDrawTrace(false); + } + else + { + setDrawTrace(true); + } } diff --git a/app/rdo_studio/src/tracer/tracer.h b/app/rdo_studio/src/tracer/tracer.h index 51bacf192..eda5a896f 100644 --- a/app/rdo_studio/src/tracer/tracer.h +++ b/app/rdo_studio/src/tracer/tracer.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_H_ -#define _RDO_STUDIO_TRACER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,28 +12,26 @@ // -------------------------------------------------------------------------------- namespace rdo { - namespace gui - { - namespace tracer - { + namespace gui + { + namespace tracer + { - class Tracer: public TracerBase - { - protected: - void proc(RDOThread::RDOMessageInfo& msg); + class Tracer: public TracerBase + { + protected: + void proc(RDOThread::RDOMessageInfo& msg); - public: - Tracer(); - virtual ~Tracer(); + public: + Tracer(); + virtual ~Tracer(); - void setRuntimeMode(const rdo::runtime::RunTimeMode value); - }; + void setRuntimeMode(const rdo::runtime::RunTimeMode value); + }; - } - } + } + } } // namespace rdo::gui::tracer // -------------------------------------------------------------------------------- extern rdo::gui::tracer::Tracer* g_pTracer; - -#endif // _RDO_STUDIO_TRACER_H_ diff --git a/app/rdo_studio/src/tracer/tracer_base.cpp b/app/rdo_studio/src/tracer/tracer_base.cpp index 951e87208..a1f6ad9d0 100644 --- a/app/rdo_studio/src/tracer/tracer_base.cpp +++ b/app/rdo_studio/src/tracer/tracer_base.cpp @@ -26,742 +26,740 @@ using namespace rdo::gui::tracer; // -------------------- TracerBase // -------------------------------------------------------------------------------- TracerBase::TracerBase(const std::string& _thread_name, RDOKernelGUI* _kernel_gui) - : RDOThreadGUI(_thread_name, _kernel_gui) - , m_pLog(NULL) - , m_pChartTree(NULL) - , m_eventIndex(0) - , m_updateAction(RUA_NONE) - , m_drawTrace(true) + : RDOThreadGUI(_thread_name, _kernel_gui) + , m_pLog(NULL) + , m_pChartTree(NULL) + , m_eventIndex(0) + , m_updateAction(UpdateAction::NONE) + , m_drawTrace(true) {} TracerBase::~TracerBase() { - deleteTrace(); + deleteTrace(); } ParamInfo* TracerBase::getParamType(std::istream& stream) { - boost::optional parType; - - std::string parTypeName; - stream >> parTypeName; - if (parTypeName == "E") - { - parType = ParamInfo::PT_ENUMERATIVE; - } - else if (parTypeName == "I") - { - parType = ParamInfo::PT_INTEGER; - } - else if (parTypeName == "R") - { - parType = ParamInfo::PT_REAL; - } - else if (parTypeName == "B") - { - parType = ParamInfo::PT_BOOL; - } - else if (parTypeName == "A") - { - parType = ParamInfo::PT_ARRAY; - } - else if (parTypeName == "S") - { - parType = ParamInfo::PT_STRING; - } - else - { - int i; - try - { - //тип ресурса сначала пишет в поток его ID - i = boost::lexical_cast(parTypeName); - } - catch (const boost::bad_lexical_cast &) - { - //do nothing? - } - if (i) - { - parType = ParamInfo::PT_RESOURCE; - //потом его имя - stream >> parTypeName; - //потом число его параметров - stream >> parTypeName; - int n = boost::lexical_cast(parTypeName); - for (i = 0; i < n; ++i) - getParam(stream); - } - } - - ASSERT(parType.is_initialized()); - - ParamInfo* pParam = new ParamInfo(parType.get()); - if (parType == ParamInfo::PT_ENUMERATIVE) - { - std::size_t enumCount; - stream >> enumCount; - for (std::size_t j = 0; j < enumCount; j++) - { - std::string enumID; - stream >> enumID; - - std::string enumName; - stream >> enumName; - pParam->addEnumValue(enumName); - } - } - else if (parType == ParamInfo::PT_BOOL) - { - pParam->addEnumValue("false"); - pParam->addEnumValue("true"); - } - else if (parType == ParamInfo::PT_ARRAY) - { - ParamInfo* pArrayItem = getParamType(stream); - (void)pArrayItem; - } - return pParam; + boost::optional parType; + + std::string parTypeName; + stream >> parTypeName; + if (parTypeName == "E") + { + parType = ParamInfo::Type::ENUMERATIVE; + } + else if (parTypeName == "I") + { + parType = ParamInfo::Type::INTEGER; + } + else if (parTypeName == "R") + { + parType = ParamInfo::Type::REAL; + } + else if (parTypeName == "B") + { + parType = ParamInfo::Type::BOOL; + } + else if (parTypeName == "A") + { + parType = ParamInfo::Type::ARRAY; + } + else if (parTypeName == "S") + { + parType = ParamInfo::Type::STRING; + } + else + { + int i = 0; + try + { + // тип ресурса сначала пишет в поток его ID + i = boost::lexical_cast(parTypeName); + } + catch (const boost::bad_lexical_cast &) + {} + if (i) + { + parType = ParamInfo::Type::RESOURCE; + //потом его имя + stream >> parTypeName; + //потом число его параметров + stream >> parTypeName; + int n = boost::lexical_cast(parTypeName); + for (i = 0; i < n; ++i) + getParam(stream); + } + } + + ASSERT(parType.is_initialized()); + + ParamInfo* pParam = new ParamInfo(parType.get()); + if (parType == ParamInfo::Type::ENUMERATIVE) + { + std::size_t enumCount; + stream >> enumCount; + for (std::size_t j = 0; j < enumCount; j++) + { + std::string enumID; + stream >> enumID; + + std::string enumName; + stream >> enumName; + pParam->addEnumValue(enumName); + } + } + else if (parType == ParamInfo::Type::BOOL) + { + pParam->addEnumValue("false"); + pParam->addEnumValue("true"); + } + else if (parType == ParamInfo::Type::ARRAY) + { + ParamInfo* pArrayItem = getParamType(stream); + (void)pArrayItem; + } + return pParam; } ParamInfo* TracerBase::getParam(std::istream& stream) { - std::string paramType; - std::string paramName; - stream >> paramType; - stream >> paramName; - ParamInfo* pParam = getParamType(stream); - pParam->setName(QString::fromStdString(paramName)); - return pParam; + std::string paramType; + std::string paramName; + stream >> paramType; + stream >> paramName; + ParamInfo* pParam = getParamType(stream); + pParam->setName(QString::fromStdString(paramName)); + return pParam; } void TracerBase::addResourceType(std::string&, std::istream& stream) { - LPResourceType pResourceType = rdo::Factory::create(ResourceType::RDOTK_PERMANENT); - std::string resourceTypeName; - stream >> resourceTypeName; - pResourceType->setName(QString::fromStdString(resourceTypeName)); - int paramCount; - stream >> paramCount; - for (int i = 0; i < paramCount; i++) - { - pResourceType->addParamInfo(getParam(stream)); - } - m_resourceTypeList.push_back(pResourceType); - m_pChartTree->addResourceType(pResourceType); + LPResourceType pResourceType = rdo::Factory::create(ResourceType::Kind::PERMANENT); + std::string resourceTypeName; + stream >> resourceTypeName; + pResourceType->setName(QString::fromStdString(resourceTypeName)); + int paramCount; + stream >> paramCount; + for (int i = 0; i < paramCount; i++) + { + pResourceType->addParamInfo(getParam(stream)); + } + m_resourceTypeList.push_back(pResourceType); + m_pChartTree->addResourceType(pResourceType); } void TracerBase::addResource(std::string& s, std::istream& stream) { - int resourceTypeID; - std::string resourceName; - stream >> resourceName; - stream >> resourceTypeID; - LPResource pResource = rdo::Factory::create( - m_resourceTypeList.at(resourceTypeID - 1), - QString::fromStdString(resourceName), - boost::lexical_cast(s) - ); + int resourceTypeID; + std::string resourceName; + stream >> resourceName; + stream >> resourceTypeID; + LPResource pResource = rdo::Factory::create( + m_resourceTypeList.at(resourceTypeID - 1), + QString::fromStdString(resourceName), + boost::lexical_cast(s) + ); - m_resourceList.push_back(pResource); - m_pChartTree->addResource(pResource); + m_resourceList.push_back(pResource); + m_pChartTree->addResource(pResource); } void TracerBase::addPattern(std::string&, std::istream& stream) { - std::string patternName; - stream >> patternName; - std::string patternType; - stream >> patternType; - Pattern::Kind kind; - if (patternType == "A") - { - kind = Pattern::PK_OPERATION; - } - else if (patternType == "I") - { - kind = Pattern::PK_EVENT; - } - else if (patternType == "R") - { - kind = Pattern::PK_RULE; - } - else if (patternType == "K") - { - kind = Pattern::PK_KEYBOARD; - } - else - { - kind = Pattern::PK_UNDEFINED; - } - - LPPattern pPattern = rdo::Factory::create(kind); - pPattern->setName(QString::fromStdString(patternName)); - - m_patternList.push_back(pPattern); - m_pChartTree->addPattern(pPattern); - int relResCount; - stream >> relResCount; - std::string dummy; - for (int i = 0; i < relResCount; i++) - { - stream >> dummy; - } + std::string patternName; + stream >> patternName; + std::string patternType; + stream >> patternType; + Pattern::Kind kind; + if (patternType == "A") + { + kind = Pattern::Kind::OPERATION; + } + else if (patternType == "I") + { + kind = Pattern::Kind::EVENT; + } + else if (patternType == "R") + { + kind = Pattern::Kind::RULE; + } + else if (patternType == "K") + { + kind = Pattern::Kind::KEYBOARD; + } + else + { + kind = Pattern::Kind::UNDEFINED; + } + + LPPattern pPattern = rdo::Factory::create(kind); + pPattern->setName(QString::fromStdString(patternName)); + + m_patternList.push_back(pPattern); + m_pChartTree->addPattern(pPattern); + int relResCount; + stream >> relResCount; + std::string dummy; + for (int i = 0; i < relResCount; i++) + { + stream >> dummy; + } } void TracerBase::addOperation(std::string&, std::istream& stream) { - std::string operationName; - stream >> operationName; - int patternID; - stream >> patternID; - LPPattern pPattern = m_patternList.at(patternID - 1); - - LPOperationBase pOperationBase; - QString name = QString::fromStdString(operationName); - - if (pPattern->getKind() != Pattern::PK_RULE && pPattern->getKind() != Pattern::PK_EVENT) - { - pOperationBase = rdo::Factory::create(pPattern, name); - } - else - { - pOperationBase = rdo::Factory::create(pPattern, name); - } - - if (pPattern->getKind() != Pattern::PK_EVENT) - { - m_operationList.push_back(pOperationBase); - } - else - { - LPEvent pEvent = pOperationBase.object_dynamic_cast(); - ASSERT(pEvent); - m_eventList.push_back(pEvent); - } - - m_pChartTree->addOperation(pOperationBase); + std::string operationName; + stream >> operationName; + int patternID; + stream >> patternID; + LPPattern pPattern = m_patternList.at(patternID - 1); + + LPOperationBase pOperationBase; + QString name = QString::fromStdString(operationName); + + if (pPattern->getKind() != Pattern::Kind::RULE && pPattern->getKind() != Pattern::Kind::EVENT) + { + pOperationBase = rdo::Factory::create(pPattern, name); + } + else + { + pOperationBase = rdo::Factory::create(pPattern, name); + } + + if (pPattern->getKind() != Pattern::Kind::EVENT) + { + m_operationList.push_back(pOperationBase); + } + else + { + LPEvent pEvent = pOperationBase.object_dynamic_cast(); + ASSERT(pEvent); + m_eventList.push_back(pEvent); + } + + m_pChartTree->addOperation(pOperationBase); } void TracerBase::addResult(std::string& s, std::istream& stream) { - int resultID; - stream >> resultID; - std::string resultKind; - stream >> resultKind; - Result::Kind kind; - if (resultKind == "watch_par") - { - kind = Result::RK_WATCHPAR; - } - else if (resultKind == "watch_state") - { - kind = Result::RK_WATCHSTATE; - } - else if (resultKind == "watch_quant") - { - kind = Result::RK_WATCHQUANT; - } - else if (resultKind == "watch_value") - { - kind = Result::RK_WATCHVALUE; - } - else - { - kind = Result::RK_UNDEFINED; - } - ASSERT(kind != Result::RK_UNDEFINED); - - LPResult pResult = rdo::Factory::create(QString::fromStdString(s), kind, resultID); - m_resultList.push_back(pResult); - m_pChartTree->addResult(pResult); + int resultID; + stream >> resultID; + std::string resultKind; + stream >> resultKind; + Result::Kind kind; + if (resultKind == "watch_par") + { + kind = Result::Kind::WATCHPAR; + } + else if (resultKind == "watch_state") + { + kind = Result::Kind::WATCHSTATE; + } + else if (resultKind == "watch_quant") + { + kind = Result::Kind::WATCHQUANT; + } + else if (resultKind == "watch_value") + { + kind = Result::Kind::WATCHVALUE; + } + else + { + kind = Result::Kind::UNDEFINED; + } + ASSERT(kind != Result::Kind::UNDEFINED); + + LPResult pResult = rdo::Factory::create(QString::fromStdString(s), kind, resultID); + m_resultList.push_back(pResult); + m_pChartTree->addResult(pResult); } void TracerBase::dispatchNextString(std::string& line) { - if (line.empty()) - return; - - std::string key = getNextValue(line); - Time* pTimeNow; - if (key != "SO" && key.find("ST") == std::string::npos && key != "SD" && key.find("SE") == std::string::npos && key != "$Status") - { - pTimeNow = addTime(getNextValue(line)); - } - else - { - pTimeNow = m_timeList.back(); - } - - if (key == "ES") - { - } - else if (key == "EB") - { - startAction(line, pTimeNow); - } - else if (key == "EF") - { - accomplishAction(line, pTimeNow); - } - else if (key == "EI") - { - irregularEvent(line, pTimeNow); - } - else if (key == "ER") - { - productionRule(line, pTimeNow); - } - else if (key == "RC" || key == "SRC") - { - m_pResource = resourceCreation(line, pTimeNow); - m_updateAction = RUA_ADD; + if (line.empty()) + return; + + std::string key = getNextValue(line); + Time* pTimeNow; + if (key != "SO" && key.find("ST") == std::string::npos && key != "SD" && key.find("SE") == std::string::npos && key != "$Status") + { + pTimeNow = addTime(getNextValue(line)); + } + else + { + pTimeNow = m_timeList.back(); + } + + if (key == "ES") + { + } + else if (key == "EB") + { + startAction(line, pTimeNow); + } + else if (key == "EF") + { + accomplishAction(line, pTimeNow); + } + else if (key == "EI") + { + irregularEvent(line, pTimeNow); + } + else if (key == "ER") + { + productionRule(line, pTimeNow); + } + else if (key == "RC" || key == "SRC") + { + m_pResource = resourceCreation(line, pTimeNow); + m_updateAction = UpdateAction::ADD; #ifdef RDOSIM_COMPATIBLE - } - else if (key == "RE" || key == "SRE") - { - std::string copy1 = line; - m_pResource = resourceElimination(line, pTimeNow); - if (!m_pResource) - { - std::string copy2 = copy1; - m_pResource = resourceCreation(copy1, pTimeNow); - m_pChartTree->addResource(m_pResource); - m_pResource = resourceElimination(copy2, pTimeNow); - } - m_updateAction = RUA_UPDATE; - } - else if (key == "RK" || key == "SRK") - { - std::string copy = line; - LPResource res = resourceChanging(line, pTimeNow); - if (!res) - { - m_pResource = resourceCreation(copy, pTimeNow); - m_updateAction = RUA_ADD; - } + } + else if (key == "RE" || key == "SRE") + { + std::string copy1 = line; + m_pResource = resourceElimination(line, pTimeNow); + if (!m_pResource) + { + std::string copy2 = copy1; + m_pResource = resourceCreation(copy1, pTimeNow); + m_pChartTree->addResource(m_pResource); + m_pResource = resourceElimination(copy2, pTimeNow); + } + m_updateAction = UpdateAction::UPDATE; + } + else if (key == "RK" || key == "SRK") + { + std::string copy = line; + LPResource res = resourceChanging(line, pTimeNow); + if (!res) + { + m_pResource = resourceCreation(copy, pTimeNow); + m_updateAction = UpdateAction::ADD; + } #else - } - else if (key == "RK" || key == "SRK" || key == "RE" || key == "SRE") - { - bool re = key == "RE" || key == "SRE"; - std::string copy1 = line; - LPResource pResource = resourceChanging(line, pTimeNow); - if (!pResource) - { - std::string copy2 = copy1; - m_pResource = resourceCreation(copy2, pTimeNow); - m_pChartTree->addResource(m_pResource); - } - if (re) - { - m_pResource = resourceElimination(copy1, pTimeNow); - m_updateAction = RUA_UPDATE; - } + } + else if (key == "RK" || key == "SRK" || key == "RE" || key == "SRE") + { + bool re = key == "RE" || key == "SRE"; + std::string copy1 = line; + LPResource pResource = resourceChanging(line, pTimeNow); + if (!pResource) + { + std::string copy2 = copy1; + m_pResource = resourceCreation(copy2, pTimeNow); + m_pChartTree->addResource(m_pResource); + } + if (re) + { + m_pResource = resourceElimination(copy1, pTimeNow); + m_updateAction = UpdateAction::UPDATE; + } #endif - } - else if (key == "V") - { - resultChanging(line, pTimeNow); - } + } + else if (key == "V") + { + resultChanging(line, pTimeNow); + } } std::string TracerBase::getNextValue(std::string& line) { - int posStart = line.find_first_not_of(' '); - int posEnd; - std::string result; - if (line[posStart] == '[') - { - //! @todo Массив просто игнорируется, график по нему не строится. Заплатка. - posEnd = line.find_first_of(']', posStart); - result = "0"; - } - else - { - posEnd = line.find_first_of(' ', posStart); - result = line.substr(posStart, posEnd - posStart); - } - line.erase(0, posEnd + 1); - boost::algorithm::trim(result); - return result; + int posStart = line.find_first_not_of(' '); + int posEnd; + std::string result; + if (line[posStart] == '[') + { + // TODO Массив просто игнорируется, график по нему не строится. Заплатка. + posEnd = line.find_first_of(']', posStart); + result = "0"; + } + else + { + posEnd = line.find_first_of(' ', posStart); + result = line.substr(posStart, posEnd - posStart); + } + line.erase(0, posEnd + 1); + boost::algorithm::trim(result); + return result; } Time* TracerBase::addTime(const std::string& time) { - double val = boost::lexical_cast(time); - bool empty = m_timeList.empty(); - Time* pLastTime = NULL; - if (!empty) - { - pLastTime = m_timeList.back(); - } - if (empty || pLastTime->time != val) - { - Time* pTimeNow = new Time(val); - m_timeList.push_back(pTimeNow); - m_eventIndex = 0; - for (const LPOperationBase& pOperationBase: m_operationList) - { - pOperationBase->monitorTime(pTimeNow, m_eventIndex); - } - for (const LPEvent& pEvent: m_eventList) - { - pEvent->monitorTime(pTimeNow, m_eventIndex); - } - } - else - { - pLastTime->eventCount++; - m_eventIndex++; - for (ChartDoc* pDocument: m_documentList) - { - pDocument->incTimeEventsCount(pLastTime); - } - } - return m_timeList.back(); + double val = boost::lexical_cast(time); + bool empty = m_timeList.empty(); + Time* pLastTime = NULL; + if (!empty) + { + pLastTime = m_timeList.back(); + } + if (empty || pLastTime->time != val) + { + Time* pTimeNow = new Time(val); + m_timeList.push_back(pTimeNow); + m_eventIndex = 0; + for (const LPOperationBase& pOperationBase: m_operationList) + { + pOperationBase->monitorTime(pTimeNow, m_eventIndex); + } + for (const LPEvent& pEvent: m_eventList) + { + pEvent->monitorTime(pTimeNow, m_eventIndex); + } + } + else + { + pLastTime->eventCount++; + m_eventIndex++; + for (ChartDoc* pDocument: m_documentList) + { + pDocument->incTimeEventsCount(pLastTime); + } + } + return m_timeList.back(); } LPOperationBase TracerBase::getOperation(std::string& line) { - getNextValue(line); - return m_operationList.at(boost::lexical_cast(getNextValue(line)) - 1); + getNextValue(line); + return m_operationList.at(boost::lexical_cast(getNextValue(line)) - 1); } void TracerBase::startAction(std::string& line, Time* const pTime) { - LPOperation pOperation = getOperation(line).object_dynamic_cast(); - ASSERT(pOperation); - pOperation->start(pTime, m_eventIndex); + LPOperation pOperation = getOperation(line).object_dynamic_cast(); + ASSERT(pOperation); + pOperation->start(pTime, m_eventIndex); } void TracerBase::accomplishAction(std::string& line, Time* const pTime) { - LPOperation pOperation = getOperation(line).object_dynamic_cast(); - ASSERT(pOperation); - pOperation->accomplish(pTime, m_eventIndex); + LPOperation pOperation = getOperation(line).object_dynamic_cast(); + ASSERT(pOperation); + pOperation->accomplish(pTime, m_eventIndex); } void TracerBase::irregularEvent(std::string& line, Time* const pTime) { #ifdef RDOSIM_COMPATIBLE - m_eventList.at(boost::lexical_cast(getNextValue(line)) - 1)->occurs(pTime, m_eventIndex); + m_eventList.at(boost::lexical_cast(getNextValue(line)) - 1)->occurs(pTime, m_eventIndex); #else - m_eventList.at(boost::lexical_cast(getNextValue(line)) - 1)->occurs(pTime, m_eventIndex); + m_eventList.at(boost::lexical_cast(getNextValue(line)) - 1)->occurs(pTime, m_eventIndex); #endif } void TracerBase::productionRule(std::string& line, Time* const pTime) { - LPEvent pEvent = getOperation(line).object_dynamic_cast(); - ASSERT(pEvent); - pEvent->occurs(pTime, m_eventIndex); + LPEvent pEvent = getOperation(line).object_dynamic_cast(); + ASSERT(pEvent); + pEvent->occurs(pTime, m_eventIndex); } LPResource TracerBase::getResource(std::string& line) { - getNextValue(line); - LPResource pResult; - int findID = boost::lexical_cast(getNextValue(line)); - int i = 0; - for (const LPResource& pResource: m_resourceList) - { - if (pResource->getID() == findID && !pResource->isErased()) - { - pResult = pResource; - break; - } - i++; - } - return pResult; + getNextValue(line); + LPResource pResult; + int findID = boost::lexical_cast(getNextValue(line)); + int i = 0; + for (const LPResource& pResource: m_resourceList) + { + if (pResource->getID() == findID && !pResource->isErased()) + { + pResult = pResource; + break; + } + i++; + } + return pResult; } LPResource TracerBase::resourceCreation(std::string& line, Time* const pTime) { - std::size_t typeID = boost::lexical_cast(getNextValue(line)) - 1; - ASSERT(typeID < m_resourceTypeList.size()); - LPResourceType pResourceType = m_resourceTypeList.at(typeID); - int id = boost::lexical_cast(getNextValue(line)); - LPResource pResource = rdo::Factory::create(pResourceType, QString("%1 #%2").arg(pResourceType->getName()).arg(id), id); - pResource->setParams(line, pTime, m_eventIndex); + std::size_t typeID = boost::lexical_cast(getNextValue(line)) - 1; + ASSERT(typeID < m_resourceTypeList.size()); + LPResourceType pResourceType = m_resourceTypeList.at(typeID); + int id = boost::lexical_cast(getNextValue(line)); + LPResource pResource = rdo::Factory::create(pResourceType, QString("%1 #%2").arg(pResourceType->getName()).arg(id), id); + pResource->setParams(line, pTime, m_eventIndex); - m_resourceList.push_back(pResource); - return pResource; + m_resourceList.push_back(pResource); + return pResource; } LPResource TracerBase::resourceElimination(std::string& line, Time* const pTime) { - LPResource pResource = getResource(line); - if (!pResource) - return pResource; + LPResource pResource = getResource(line); + if (!pResource) + return pResource; #ifdef RDOSIM_COMPATIBLE - pResource->setParams(line, pTime, m_eventIndex, true); + pResource->setParams(line, pTime, m_eventIndex, true); #else - pResource->setParams(line, pTime, m_eventIndex, false); + pResource->setParams(line, pTime, m_eventIndex, false); #endif - pResource->setErased(true); - return pResource; + pResource->setErased(true); + return pResource; } LPResource TracerBase::resourceChanging(std::string& line, Time* const pTime) { - LPResource pResource = getResource(line); - if (pResource) - { - pResource->setParams(line, pTime, m_eventIndex); - } - return pResource; + LPResource pResource = getResource(line); + if (pResource) + { + pResource->setParams(line, pTime, m_eventIndex); + } + return pResource; } LPResult TracerBase::getResult(std::string& line) { - LPResult pResult; - int findid = boost::lexical_cast(getNextValue(line)); - for (const LPResult& pResultItem: m_resultList) - { - if (pResultItem->getID() == findid) - { - pResult = pResultItem; - break; - } - } - return pResult; + LPResult pResult; + int findid = boost::lexical_cast(getNextValue(line)); + for (const LPResult& pResultItem: m_resultList) + { + if (pResultItem->getID() == findid) + { + pResult = pResultItem; + break; + } + } + return pResult; } void TracerBase::resultChanging(std::string& line, Time* const pTime) { - getResult(line)->setValue(line, pTime, m_eventIndex); + getResult(line)->setValue(line, pTime, m_eventIndex); } void TracerBase::deleteTrace() { - m_resourceList.clear(); - m_resourceTypeList.clear(); - m_operationList.clear(); - m_eventList.clear(); - m_patternList.clear(); - m_resultList.clear(); - TimeList::iterator it = m_timeList.begin(); - while (it != m_timeList.end()) - { - delete *it; - ++it; - } - m_timeList.clear(); + m_resourceList.clear(); + m_resourceTypeList.clear(); + m_operationList.clear(); + m_eventList.clear(); + m_patternList.clear(); + m_resultList.clear(); + TimeList::iterator it = m_timeList.begin(); + while (it != m_timeList.end()) + { + delete *it; + ++it; + } + m_timeList.clear(); } void TracerBase::clear() { - clearCharts(); - deleteTrace(); - if (m_pChartTree) - { - m_pChartTree->clear(); - } - if (m_pLog) - { - m_pLog->view().clear(); - } + clearCharts(); + deleteTrace(); + if (m_pChartTree) + { + m_pChartTree->clear(); + } + if (m_pLog) + { + m_pLog->view().clear(); + } } void TracerBase::clearCharts() { - for (ChartDoc* pDocument: m_documentList) - { - pDocument->getFirstView()->parentWidget()->parentWidget()->close(); - } + for (ChartDoc* pDocument: m_documentList) + { + pDocument->getFirstView()->parentWidget()->parentWidget()->close(); + } } void TracerBase::setLog(LogMainWnd* pTracerLog) { - m_pLog = pTracerLog; + m_pLog = pTracerLog; } void TracerBase::setTree(ChartTree* pTreeCtrl) { - m_pChartTree = pTreeCtrl; + m_pChartTree = pTreeCtrl; } void TracerBase::getModelStructure(std::istream& stream) { - std::string s; - - while (!stream.eof()) - { - stream >> s; - if (!s.empty()) - { - std::string::size_type pos = std::string::npos; - if (s.find("$Resource_type") != std::string::npos) - { - do - { - stream >> s; - pos = s.find("$Resources"); - - // AB if model has no $Resources at all, - // we get endless cycle here - if (pos == std::string::npos) - { - pos = s.find("$Pattern"); - } - - if (!s.empty() && pos == std::string::npos) - { - addResourceType(s, stream); - } - } while (pos == std::string::npos && !stream.eof()); - } - if (s.find("$Resources") != std::string::npos) - { - do - { - stream >> s; - pos = s.find("$Pattern"); - if (!s.empty() && pos == std::string::npos) - { - addResource(s, stream); - } - } while (pos == std::string::npos && !stream.eof()); - } - if (s.find("$Pattern") != std::string::npos) - { - do - { - stream >> s; - pos = s.find("$Activities"); - if (!s.empty() && pos == std::string::npos) - { - addPattern(s, stream); - } - } while (pos == std::string::npos && !stream.eof()); - } - if (s.find("$Activities") != std::string::npos) - { - do - { - stream >> s; - pos = s.find("$Watching"); - if (!s.empty() && pos == std::string::npos) - { - addOperation(s, stream); - } - } while (pos == std::string::npos && !stream.eof()); - } - if (s.find("$Watching") != std::string::npos && !stream.eof()) - { - do - { - s = ""; - stream >> s; - if (!s.empty()) - { - addResult(s, stream); - } - } while (!stream.eof()); - } - } - } + std::string s; + + while (!stream.eof()) + { + stream >> s; + if (!s.empty()) + { + std::string::size_type pos = std::string::npos; + if (s.find("$Resource_type") != std::string::npos) + { + do + { + stream >> s; + pos = s.find("$Resources"); + + // AB if model has no $Resources at all, + // we get endless cycle here + if (pos == std::string::npos) + { + pos = s.find("$Pattern"); + } + + if (!s.empty() && pos == std::string::npos) + { + addResourceType(s, stream); + } + } while (pos == std::string::npos && !stream.eof()); + } + if (s.find("$Resources") != std::string::npos) + { + do + { + stream >> s; + pos = s.find("$Pattern"); + if (!s.empty() && pos == std::string::npos) + { + addResource(s, stream); + } + } while (pos == std::string::npos && !stream.eof()); + } + if (s.find("$Pattern") != std::string::npos) + { + do + { + stream >> s; + pos = s.find("$Activities"); + if (!s.empty() && pos == std::string::npos) + { + addPattern(s, stream); + } + } while (pos == std::string::npos && !stream.eof()); + } + if (s.find("$Activities") != std::string::npos) + { + do + { + stream >> s; + pos = s.find("$Watching"); + if (!s.empty() && pos == std::string::npos) + { + addOperation(s, stream); + } + } while (pos == std::string::npos && !stream.eof()); + } + if (s.find("$Watching") != std::string::npos && !stream.eof()) + { + do + { + s = ""; + stream >> s; + if (!s.empty()) + { + addResult(s, stream); + } + } while (!stream.eof()); + } + } + } } void TracerBase::getTraceString(std::string trace_string) { - if (m_pLog) - { - m_pLog->view().push_back(trace_string); - } + if (m_pLog) + { + m_pLog->view().push_back(trace_string); + } - m_updateAction = RUA_NONE; - m_pResource = NULL; + m_updateAction = UpdateAction::NONE; + m_pResource = NULL; - dispatchNextString(trace_string); + dispatchNextString(trace_string); - switch (m_updateAction) - { - case RUA_ADD: - m_pChartTree->addResource(m_pResource); - break; + switch (m_updateAction) + { + case UpdateAction::ADD: + m_pChartTree->addResource(m_pResource); + break; - case RUA_UPDATE: - m_pChartTree->updateResource(m_pResource); - break; + case UpdateAction::UPDATE: + m_pChartTree->updateResource(m_pResource); + break; - default: - break; - } + default: + break; + } } ChartDoc* TracerBase::createNewChart() { - ChartDoc* pDoc = new ChartDoc(); - ChartViewMainWnd* pView = new ChartViewMainWnd(NULL, pDoc, false); - g_pApp->getIMainWnd()->addSubWindow(pView); - pDoc->attachView(&pView->view()); - pDoc->autoTitle(); + ChartDoc* pDoc = new ChartDoc(); + ChartViewMainWnd* pView = new ChartViewMainWnd(NULL, pDoc, false); + g_pApp->getIMainWnd()->addSubWindow(pView); + pDoc->attachView(&pView->view()); + pDoc->autoTitle(); - pView->parentWidget()->setWindowIcon(QIcon(QString::fromUtf8(":/images/images/mdi_chart.png"))); + pView->parentWidget()->setWindowIcon(QIcon(QString::fromUtf8(":/images/images/mdi_chart.png"))); - return pDoc; + return pDoc; } ChartDoc* TracerBase::addSerieToChart(const LPSerie& pSerie, ChartDoc* pDocument) { - if (!pDocument) - { - pDocument = createNewChart(); - } - if (pDocument) - { - pDocument->addSerie(pSerie); - } + if (!pDocument) + { + pDocument = createNewChart(); + } + if (pDocument) + { + pDocument->addSerie(pSerie); + } - return pDocument; + return pDocument; } void TracerBase::addChart(ChartDoc* const pDocument) { - m_documentList.push_back(pDocument); + m_documentList.push_back(pDocument); } void TracerBase::removeChart(ChartDoc* pDocument) { - DocumentList::iterator it = boost::range::find(m_documentList, pDocument); - if (it != m_documentList.end()) - { - m_documentList.erase(it); - } + DocumentList::iterator it = boost::range::find(m_documentList, pDocument); + if (it != m_documentList.end()) + { + m_documentList.erase(it); + } } void TracerBase::updateChartsStyles() const { - for (ChartDoc* pDocument: m_documentList) - { - pDocument->setStyle(&g_pApp->getStyle()->style_chart); - } + for (ChartDoc* pDocument: m_documentList) + { + pDocument->setStyle(&g_pApp->getStyle()->style_chart); + } } void TracerBase::setModelName(const QString& name) const { - if (m_pChartTree) - { - m_pChartTree->setModelName(name); - } + if (m_pChartTree) + { + m_pChartTree->setModelName(name); + } } void TracerBase::setDrawTrace(const bool value) { - if (m_drawTrace != value) - { - m_drawTrace = value; - if (!m_drawTrace) - { - clearCharts(); - } - m_pLog->view().setDrawLog(value); - } + if (m_drawTrace != value) + { + m_drawTrace = value; + if (!m_drawTrace) + { + clearCharts(); + } + m_pLog->view().setDrawLog(value); + } } bool TracerBase::getDrawTrace() const { - return m_drawTrace; + return m_drawTrace; } diff --git a/app/rdo_studio/src/tracer/tracer_base.h b/app/rdo_studio/src/tracer/tracer_base.h index 34a6ea22d..44bd9d51e 100644 --- a/app/rdo_studio/src/tracer/tracer_base.h +++ b/app/rdo_studio/src/tracer/tracer_base.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_BASE_H_ -#define _RDO_STUDIO_TRACER_BASE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -29,88 +28,90 @@ class LogMainWnd; class TracerBase: public RDOThreadGUI { public: - void setLog(LogMainWnd* pTracerLog); - void setTree(ChartTree* pTreeCtrl); - - void startTrace(); - void getModelStructure(std::istream& stream); - void getTraceString(std::string trace_string); - std::string getNextValue(std::string& line); - ChartDoc* createNewChart(); - void addChart(ChartDoc* const pDocument); - void removeChart(ChartDoc* pDocument); - ChartDoc* addSerieToChart(const LPSerie& pSerie, ChartDoc* pDocument = NULL); - void updateChartsStyles() const; - void clear(); - void setModelName(const QString& name) const; - void setDrawTrace(const bool value); - bool getDrawTrace() const; + void setLog(LogMainWnd* pTracerLog); + void setTree(ChartTree* pTreeCtrl); + + void startTrace(); + void getModelStructure(std::istream& stream); + void getTraceString(std::string trace_string); + std::string getNextValue(std::string& line); + ChartDoc* createNewChart(); + void addChart(ChartDoc* const pDocument); + void removeChart(ChartDoc* pDocument); + ChartDoc* addSerieToChart(const LPSerie& pSerie, ChartDoc* pDocument = NULL); + void updateChartsStyles() const; + void clear(); + void setModelName(const QString& name) const; + void setDrawTrace(const bool value); + bool getDrawTrace() const; protected: - TracerBase(const std::string& _thread_name, RDOKernelGUI* _kernel_gui); - virtual ~TracerBase(); + TracerBase(const std::string& _thread_name, RDOKernelGUI* _kernel_gui); + virtual ~TracerBase(); private: - LogMainWnd* m_pLog; - ChartTree* m_pChartTree; - - ParamInfo* getParam(std::istream& stream); - ParamInfo* getParamType(std::istream& stream); - - typedef std::vector ResourceTypeList; - typedef std::vector ResourceList; - typedef std::vector PatternList; - typedef std::vector OperationBaseList; - typedef std::vector EventList; - typedef std::vector ResultList; - typedef std::list TimeList; - typedef std::vector DocumentList; - - ResourceTypeList m_resourceTypeList; - ResourceList m_resourceList; - PatternList m_patternList; - OperationBaseList m_operationList; - EventList m_eventList; - ResultList m_resultList; - - void addResourceType(std::string& s, std::istream& stream); - void addResource(std::string& s, std::istream& stream); - void addPattern(std::string& s, std::istream& stream); - void addOperation(std::string& s, std::istream& stream); - void addResult(std::string& s, std::istream& stream); - - void dispatchNextString(std::string& line); - - Time* addTime(const std::string& time); - int m_eventIndex; - - LPOperationBase getOperation(std::string& line);void startAction(std::string& line, Time* const pTime); - void accomplishAction(std::string& line, Time* const pTime); - void irregularEvent(std::string& line, Time* const pTime); - void productionRule(std::string& line, Time* const pTime); - - LPResource getResource(std::string& line); - LPResource resourceCreation(std::string& line, Time* const pTime); - LPResource resourceElimination(std::string& line, Time* const pTime); - enum TracerResUpdateAction - { - RUA_NONE, RUA_ADD, RUA_UPDATE - }; - TracerResUpdateAction m_updateAction; - LPResource m_pResource; - LPResource resourceChanging(std::string& line, Time* const pTime); - - LPResult getResult(std::string& line);void resultChanging(std::string& line, Time* const pTime); - - TimeList m_timeList; - - void clearCharts(); - void deleteTrace(); - - DocumentList m_documentList; - bool m_drawTrace; + LogMainWnd* m_pLog; + ChartTree* m_pChartTree; + + ParamInfo* getParam(std::istream& stream); + ParamInfo* getParamType(std::istream& stream); + + typedef std::vector ResourceTypeList; + typedef std::vector ResourceList; + typedef std::vector PatternList; + typedef std::vector OperationBaseList; + typedef std::vector EventList; + typedef std::vector ResultList; + typedef std::list TimeList; + typedef std::vector DocumentList; + + ResourceTypeList m_resourceTypeList; + ResourceList m_resourceList; + PatternList m_patternList; + OperationBaseList m_operationList; + EventList m_eventList; + ResultList m_resultList; + + void addResourceType(std::string& s, std::istream& stream); + void addResource(std::string& s, std::istream& stream); + void addPattern(std::string& s, std::istream& stream); + void addOperation(std::string& s, std::istream& stream); + void addResult(std::string& s, std::istream& stream); + + void dispatchNextString(std::string& line); + + Time* addTime(const std::string& time); + int m_eventIndex; + + LPOperationBase getOperation(std::string& line);void startAction(std::string& line, Time* const pTime); + void accomplishAction(std::string& line, Time* const pTime); + void irregularEvent(std::string& line, Time* const pTime); + void productionRule(std::string& line, Time* const pTime); + + LPResource getResource(std::string& line); + LPResource resourceCreation(std::string& line, Time* const pTime); + LPResource resourceElimination(std::string& line, Time* const pTime); + + enum class UpdateAction + { + NONE, + ADD, + UPDATE + }; + UpdateAction m_updateAction; + + LPResource m_pResource; + LPResource resourceChanging(std::string& line, Time* const pTime); + + LPResult getResult(std::string& line);void resultChanging(std::string& line, Time* const pTime); + + TimeList m_timeList; + + void clearCharts(); + void deleteTrace(); + + DocumentList m_documentList; + bool m_drawTrace; }; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_BASE_H_ diff --git a/app/rdo_studio/src/tracer/tracer_operation.cpp b/app/rdo_studio/src/tracer/tracer_operation.cpp index 1e27d30f5..1f417ea76 100644 --- a/app/rdo_studio/src/tracer/tracer_operation.cpp +++ b/app/rdo_studio/src/tracer/tracer_operation.cpp @@ -12,11 +12,11 @@ using namespace rdo::gui::tracer; // -------------------- OperationBase // -------------------------------------------------------------------------------- OperationBase::OperationBase(const LPPattern& pPattern, const QString& name) - : Serie(SK_OPERATION) - , m_pPattern(pPattern) - , m_name(name) + : Serie(Kind::OPERATION) + , m_pPattern(pPattern) + , m_name(name) { - setTitle(m_name); + setTitle(m_name); } OperationBase::~OperationBase() @@ -24,26 +24,26 @@ OperationBase::~OperationBase() const QString& OperationBase::getName() const { - return m_name; + return m_name; } LPPattern OperationBase::getPattern() const { - return m_pPattern; + return m_pPattern; } void OperationBase::incOperationsCount(Time* const pTime, const int eventIndex) { - Value* pPrevValue; - getLastValue(pPrevValue); + Value* pPrevValue; + getLastValue(pPrevValue); - Value* pNewValue = new Value(pTime, eventIndex, pPrevValue ? pPrevValue->getValue() + 1 : 1); - addValue(pNewValue); + Value* pNewValue = new Value(pTime, eventIndex, pPrevValue ? pPrevValue->getValue() + 1 : 1); + addValue(pNewValue); } void OperationBase::getCaptions(std::vector &captions, const int valueCount) const { - Serie::getCaptionsInt(captions, valueCount); + Serie::getCaptionsInt(captions, valueCount); } void OperationBase::monitorTime(Time* const, const int) @@ -53,7 +53,7 @@ void OperationBase::monitorTime(Time* const, const int) // -------------------- Operation // -------------------------------------------------------------------------------- Operation::Operation(const LPPattern& pPattern, const QString& name) - : OperationBase(pPattern, name) + : OperationBase(pPattern, name) {} Operation::~Operation() @@ -61,25 +61,25 @@ Operation::~Operation() void Operation::start(Time* const pTime, const int eventIndex) { - OperationBase::incOperationsCount(pTime, eventIndex); + OperationBase::incOperationsCount(pTime, eventIndex); } void Operation::accomplish(Time* const pTime, const int eventIndex) { - Value* pLastValue; - getLastValue(pLastValue); - if (pLastValue) - { - Value* pNewValue = new Value(pTime, eventIndex, pLastValue->getValue() - 1); - addValue(pNewValue); - } + Value* pLastValue; + getLastValue(pLastValue); + if (pLastValue) + { + Value* pNewValue = new Value(pTime, eventIndex, pLastValue->getValue() - 1); + addValue(pNewValue); + } } // -------------------------------------------------------------------------------- // -------------------- Event // -------------------------------------------------------------------------------- Event::Event(const LPPattern& pPattern, const QString& name) - : OperationBase(pPattern, name) + : OperationBase(pPattern, name) {} Event::~Event() @@ -87,27 +87,27 @@ Event::~Event() void Event::occurs(Time* const pTime, const int eventIndex) { - OperationBase::incOperationsCount(pTime, eventIndex); + OperationBase::incOperationsCount(pTime, eventIndex); } void Event::monitorTime(Time* const pTime, const int eventIndex) { - Value* pPrevValue; - getLastValue(pPrevValue); - Value* pNewValue = NULL; - if (pPrevValue && pPrevValue->getValue() != 0) - { - if (*pPrevValue->getModelTime() != *pTime) - { - pNewValue = new Value(pPrevValue->getModelTime(), pPrevValue->getModelTime()->eventCount, 0); - } - } - if (!pPrevValue) - { - pNewValue = new Value(pTime, eventIndex, 0); - } - if (pNewValue) - { - addValue(pNewValue); - } + Value* pPrevValue; + getLastValue(pPrevValue); + Value* pNewValue = NULL; + if (pPrevValue && pPrevValue->getValue() != 0) + { + if (*pPrevValue->getModelTime() != *pTime) + { + pNewValue = new Value(pPrevValue->getModelTime(), pPrevValue->getModelTime()->eventCount, 0); + } + } + if (!pPrevValue) + { + pNewValue = new Value(pTime, eventIndex, 0); + } + if (pNewValue) + { + addValue(pNewValue); + } } diff --git a/app/rdo_studio/src/tracer/tracer_operation.h b/app/rdo_studio/src/tracer/tracer_operation.h index 211cc7cc2..c7bb73aed 100644 --- a/app/rdo_studio/src/tracer/tracer_operation.h +++ b/app/rdo_studio/src/tracer/tracer_operation.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_OPERATION_H_ -#define _RDO_STUDIO_TRACER_OPERATION_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,22 +15,22 @@ class OperationBase: public Serie { DECLARE_FACTORY(OperationBase) public: - const QString& getName() const; + const QString& getName() const; - LPPattern getPattern() const; + LPPattern getPattern() const; - virtual void getCaptions(std::vector& captions, const int valueCount) const; - virtual void monitorTime(Time* const pTime, const int eventIndex); + virtual void getCaptions(std::vector& captions, const int valueCount) const; + virtual void monitorTime(Time* const pTime, const int eventIndex); protected: - OperationBase(const LPPattern& pPattern, const QString& name); - virtual ~OperationBase(); + OperationBase(const LPPattern& pPattern, const QString& name); + virtual ~OperationBase(); - void incOperationsCount(Time* const pTime, const int eventIndex); + void incOperationsCount(Time* const pTime, const int eventIndex); private: - LPPattern m_pPattern; - QString m_name; + LPPattern m_pPattern; + QString m_name; }; typedef rdo::intrusive_ptr LPOperationBase; @@ -43,12 +42,12 @@ class Operation: public OperationBase { DECLARE_FACTORY(Operation) public: - void start(Time* const pTime, const int eventIndex); - void accomplish(Time* const pTime, const int eventIndex); + void start(Time* const pTime, const int eventIndex); + void accomplish(Time* const pTime, const int eventIndex); private: - Operation(const LPPattern& pPattern, const QString& name); - virtual ~Operation(); + Operation(const LPPattern& pPattern, const QString& name); + virtual ~Operation(); }; typedef rdo::intrusive_ptr LPOperation; @@ -60,16 +59,14 @@ class Event: public OperationBase { DECLARE_FACTORY(Event) public: - void occurs(Time* const pTime, const int eventIndex); - virtual void monitorTime(Time* const pTime, const int eventIndex); + void occurs(Time* const pTime, const int eventIndex); + virtual void monitorTime(Time* const pTime, const int eventIndex); private: - Event(const LPPattern& pPattern, const QString& name); - virtual ~Event(); + Event(const LPPattern& pPattern, const QString& name); + virtual ~Event(); }; typedef rdo::intrusive_ptr LPEvent; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_OPERATION_H_ diff --git a/app/rdo_studio/src/tracer/tracer_pattern.cpp b/app/rdo_studio/src/tracer/tracer_pattern.cpp index d43646fa1..eb23e44e9 100644 --- a/app/rdo_studio/src/tracer/tracer_pattern.cpp +++ b/app/rdo_studio/src/tracer/tracer_pattern.cpp @@ -8,8 +8,8 @@ using namespace rdo::gui::tracer; Pattern::Pattern(Kind kind) - : ChartTreeItem() - , m_kind(kind) + : ChartTreeItem() + , m_kind(kind) {} Pattern::~Pattern() @@ -17,15 +17,15 @@ Pattern::~Pattern() const QString& Pattern::getName() const { - return m_name; + return m_name; } void Pattern::setName(const QString& name) { - m_name = name; + m_name = name; } Pattern::Kind Pattern::getKind() const { - return m_kind; + return m_kind; } diff --git a/app/rdo_studio/src/tracer/tracer_pattern.h b/app/rdo_studio/src/tracer/tracer_pattern.h index bd44d23df..671d79764 100644 --- a/app/rdo_studio/src/tracer/tracer_pattern.h +++ b/app/rdo_studio/src/tracer/tracer_pattern.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_PATTERN_H_ -#define _RDO_STUDIO_TRACER_PATTERN_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -12,30 +11,28 @@ class Pattern: public ChartTreeItem { DECLARE_FACTORY(Pattern) public: - enum Kind - { - PK_UNDEFINED = ~0, - PK_OPERATION = 0, - PK_EVENT, - PK_RULE, - PK_KEYBOARD - }; + enum class Kind + { + UNDEFINED = ~0, + OPERATION = 0, + EVENT, + RULE, + KEYBOARD + }; - const QString& getName() const; - void setName(const QString& name); + const QString& getName() const; + void setName(const QString& name); - Kind getKind() const; + Kind getKind() const; private: - Pattern(Kind kind); - virtual ~Pattern(); + Pattern(Kind kind); + virtual ~Pattern(); - QString m_name; - Kind m_kind; + QString m_name; + Kind m_kind; }; typedef rdo::intrusive_ptr LPPattern; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_PATTERN_H_ diff --git a/app/rdo_studio/src/tracer/tracer_resource.cpp b/app/rdo_studio/src/tracer/tracer_resource.cpp index 2ebd10d47..e0b0cd5d6 100644 --- a/app/rdo_studio/src/tracer/tracer_resource.cpp +++ b/app/rdo_studio/src/tracer/tracer_resource.cpp @@ -14,8 +14,8 @@ using namespace rdo::gui::tracer; // -------------------- Param // -------------------------------------------------------------------------------- Param::Param(const LPResource& pResource) - : Serie(SK_PARAM) - , m_pResource(pResource) + : Serie(Kind::PARAM) + , m_pResource(pResource) {} Param::~Param() @@ -23,77 +23,78 @@ Param::~Param() const LPResource& Param::getResource() const { - return m_pResource; + return m_pResource; } ParamInfo* Param::getParamInfo() const { - LPParam pThis(const_cast(this)); - int index = m_pResource->getParamIndex(pThis); - return index != -1 - ? m_pResource->getType()->getParamInfo(index) - : NULL; + LPParam pThis(const_cast(this)); + int index = m_pResource->getParamIndex(pThis); + return index != -1 + ? m_pResource->getType()->getParamInfo(index) + : NULL; } void Param::getCaptions(std::vector& captions, const int valueCount) const { - switch (getParamInfo()->getParamType()) - { - case ParamInfo::PT_INTEGER: - Serie::getCaptionsInt(captions, valueCount); - break; - - case ParamInfo::PT_REAL: - Serie::getCaptionsDouble(captions, valueCount); - break; - - case ParamInfo::PT_ENUMERATIVE: - case ParamInfo::PT_BOOL: - case ParamInfo::PT_STRING: - { - Serie::getCaptions(captions, valueCount); - int delta = getParamInfo()->getEnumCount(); - m_minValue = 0; - m_maxValue = delta - 1; - int real_val_count = valueCount; - if (delta > real_val_count) - { - while ((int)((delta - 1) / (real_val_count - 1)) != ((double)(delta - 1) / (real_val_count - 1))) - real_val_count--; - } - else - { - real_val_count = delta; - } - int valo = (int)m_minValue; - int valoffset = real_val_count != 1 ? (delta - 1) / (real_val_count - 1) : 0; - for (int i = 0; i < real_val_count; i++) - { - captions.push_back(getParamInfo()->getEnumValue(valo)); - valo += valoffset; - } - break; - } - case ParamInfo::PT_ARRAY: - NEVER_REACH_HERE; - } + switch (getParamInfo()->getParamType()) + { + case ParamInfo::Type::INTEGER: + Serie::getCaptionsInt(captions, valueCount); + break; + + case ParamInfo::Type::REAL: + Serie::getCaptionsDouble(captions, valueCount); + break; + + case ParamInfo::Type::ENUMERATIVE: + case ParamInfo::Type::BOOL: + case ParamInfo::Type::STRING: + { + Serie::getCaptions(captions, valueCount); + int delta = getParamInfo()->getEnumCount(); + m_minValue = 0; + m_maxValue = delta - 1; + int real_val_count = valueCount; + if (delta > real_val_count) + { + while ((int)((delta - 1) / (real_val_count - 1)) != ((double)(delta - 1) / (real_val_count - 1))) + real_val_count--; + } + else + { + real_val_count = delta; + } + int valo = (int)m_minValue; + int valoffset = real_val_count != 1 ? (delta - 1) / (real_val_count - 1) : 0; + for (int i = 0; i < real_val_count; i++) + { + captions.push_back(getParamInfo()->getEnumValue(valo)); + valo += valoffset; + } + break; + } + case ParamInfo::Type::ARRAY: + case ParamInfo::Type::RESOURCE: + break; + } } // -------------------------------------------------------------------------------- // -------------------- Resource // -------------------------------------------------------------------------------- Resource::Resource(const LPResourceType& pResType, const QString& name, int id) - : ChartTreeItem() - , m_name(name) - , m_id(id) - , m_pResourceType(pResType) - , m_erased(false) + : ChartTreeItem() + , m_name(name) + , m_id(id) + , m_pResourceType(pResType) + , m_erased(false) { - int count = m_pResourceType->getParamsCount(); - for (int i = 0; i < count; i++) - { - addParam(rdo::Factory::create(this)); - } + int count = m_pResourceType->getParamsCount(); + for (int i = 0; i < count; i++) + { + addParam(rdo::Factory::create(this)); + } } Resource::~Resource() @@ -101,100 +102,100 @@ Resource::~Resource() const QString& Resource::getName() const { - return m_name; + return m_name; } void Resource::setName(const QString& name) { - m_name = name; + m_name = name; } int Resource::getID() const { - return m_id; + return m_id; } const LPResourceType& Resource::getType() const { - return m_pResourceType; + return m_pResourceType; } void Resource::addParam(const LPParam& pParam) { - ASSERT(pParam); - pParam->setTitle(m_name + "." + m_pResourceType->getParamInfo(m_paramList.size())->getName()); - m_paramList.push_back(pParam); + ASSERT(pParam); + pParam->setTitle(m_name + "." + m_pResourceType->getParamInfo(m_paramList.size())->getName()); + m_paramList.push_back(pParam); } LPParam Resource::getParam(unsigned int index) const { - if (index >= m_paramList.size() || index < 0) - return LPParam(); - return m_paramList.at(index); + if (index >= m_paramList.size() || index < 0) + return LPParam(); + return m_paramList.at(index); } int Resource::getParamIndex(const LPParam& pParam) const { - int count = m_paramList.size(); - for (int i = 0; i < count; i++) - { - if (m_paramList.at(i) == pParam) - { - return i; - } - } - return -1; + int count = m_paramList.size(); + for (int i = 0; i < count; i++) + { + if (m_paramList.at(i) == pParam) + { + return i; + } + } + return -1; } void Resource::setParams(std::string& line, Time* const pTime, const int eventIndex, const bool erasing) { - int count = m_paramList.size(); - for (int i = 0; i < count; i++) - { - Value* pPrevValue; - m_paramList.at(i)->getLastValue(pPrevValue); - std::string nextValue = g_pTracer->getNextValue(line); - double newValue; - if (erasing) - { - newValue = pPrevValue->getValue(); - } - else - { - switch (m_pResourceType->getParamInfo(i)->getParamType()) - { - case ParamInfo::PT_BOOL: - newValue = nextValue == "true" ? 1.0 : 0.0; - break; - - case ParamInfo::PT_STRING: - newValue = m_pResourceType->getParamInfo(i)->addStringValue(nextValue); - break; - - case ParamInfo::PT_RESOURCE: - newValue = 0; - break; - - default: - newValue = boost::lexical_cast(nextValue); - break; - } - } - - Value* pNewValue = new Value(pTime, eventIndex, newValue); - m_paramList.at(i)->addValue(pNewValue); - } + int count = m_paramList.size(); + for (int i = 0; i < count; i++) + { + Value* pPrevValue; + m_paramList.at(i)->getLastValue(pPrevValue); + std::string nextValue = g_pTracer->getNextValue(line); + double newValue; + if (erasing) + { + newValue = pPrevValue->getValue(); + } + else + { + switch (m_pResourceType->getParamInfo(i)->getParamType()) + { + case ParamInfo::Type::BOOL: + newValue = nextValue == "true" ? 1.0 : 0.0; + break; + + case ParamInfo::Type::STRING: + newValue = m_pResourceType->getParamInfo(i)->addStringValue(nextValue); + break; + + case ParamInfo::Type::RESOURCE: + newValue = 0; + break; + + default: + newValue = boost::lexical_cast(nextValue); + break; + } + } + + Value* pNewValue = new Value(pTime, eventIndex, newValue); + m_paramList.at(i)->addValue(pNewValue); + } } void Resource::setErased(const bool value) { - if (m_erased != value) - { - m_erased = value; - } + if (m_erased != value) + { + m_erased = value; + } } bool Resource::isErased() const { - return m_erased; + return m_erased; } diff --git a/app/rdo_studio/src/tracer/tracer_resource.h b/app/rdo_studio/src/tracer/tracer_resource.h index 84f75bfaf..58261c6dd 100644 --- a/app/rdo_studio/src/tracer/tracer_resource.h +++ b/app/rdo_studio/src/tracer/tracer_resource.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_RESOURCE_H_ -#define _RDO_STUDIO_TRACER_RESOURCE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -18,18 +17,18 @@ class Param: public Serie { DECLARE_FACTORY(Param) public: - const LPResource& getResource () const; - ParamInfo* getParamInfo() const; + const LPResource& getResource () const; + ParamInfo* getParamInfo() const; - virtual void getCaptions(std::vector& captions, const int valueCount) const; + virtual void getCaptions(std::vector& captions, const int valueCount) const; protected: - ParamInfo* paramInfo; - LPResource m_pResource; + ParamInfo* paramInfo; + LPResource m_pResource; private: - Param(const LPResource& pResource); - virtual ~Param(); + Param(const LPResource& pResource); + virtual ~Param(); }; typedef rdo::intrusive_ptr LPParam; @@ -43,35 +42,33 @@ class Resource: public ChartTreeItem { DECLARE_FACTORY(Resource) public: - const QString& getName() const; - void setName(const QString& name); + const QString& getName() const; + void setName(const QString& name); - int getID() const; + int getID() const; - const LPResourceType& getType() const; + const LPResourceType& getType() const; - void addParam(const LPParam& pParam); - LPParam getParam(unsigned int index) const; - int getParamIndex(const LPParam& pParam) const; - void setParams(std::string& line, Time* const time, const int eventIndex, const bool erasing = false); - void setErased(const bool value); - bool isErased() const; + void addParam(const LPParam& pParam); + LPParam getParam(unsigned int index) const; + int getParamIndex(const LPParam& pParam) const; + void setParams(std::string& line, Time* const time, const int eventIndex, const bool erasing = false); + void setErased(const bool value); + bool isErased() const; private: - Resource(const LPResourceType& pResType, const QString& name, int id); - virtual ~Resource(); + Resource(const LPResourceType& pResType, const QString& name, int id); + virtual ~Resource(); - typedef std::vector ResourceParamList; + typedef std::vector ResourceParamList; - QString m_name; - int m_id; - ResourceParamList m_paramList; - LPResourceType m_pResourceType; - bool m_erased; + QString m_name; + int m_id; + ResourceParamList m_paramList; + LPResourceType m_pResourceType; + bool m_erased; }; typedef rdo::intrusive_ptr LPResource; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_RESOURCE_H_ diff --git a/app/rdo_studio/src/tracer/tracer_resource_type.cpp b/app/rdo_studio/src/tracer/tracer_resource_type.cpp index c84198b01..0f3772ea8 100644 --- a/app/rdo_studio/src/tracer/tracer_resource_type.cpp +++ b/app/rdo_studio/src/tracer/tracer_resource_type.cpp @@ -10,124 +10,124 @@ using namespace rdo::gui::tracer; // -------------------------------------------------------------------------------- // -------------------- ParamInfo // -------------------------------------------------------------------------------- -ParamInfo::ParamInfo(const ParamType type) - : m_enumValueList(NULL) - , m_paramType(type) +ParamInfo::ParamInfo(const Type type) + : m_enumValueList(NULL) + , m_paramType(type) { - if (m_paramType == PT_ENUMERATIVE || m_paramType == PT_BOOL || m_paramType == PT_STRING) - { - m_enumValueList = new EnumValueList(); - } + if (m_paramType == Type::ENUMERATIVE || m_paramType == Type::BOOL || m_paramType == Type::STRING) + { + m_enumValueList = new EnumValueList(); + } } ParamInfo::~ParamInfo() { - if (m_enumValueList) - { - delete m_enumValueList; - } + if (m_enumValueList) + { + delete m_enumValueList; + } } const QString& ParamInfo::getName() const { - return m_name; + return m_name; } void ParamInfo::setName(const QString& name) { - m_name = name; + m_name = name; } -ParamInfo::ParamType ParamInfo::getParamType() const +ParamInfo::Type ParamInfo::getParamType() const { - return m_paramType; + return m_paramType; } int ParamInfo::addEnumValue(const std::string& value) { - if (!m_enumValueList) - return -1; - m_enumValueList->push_back(value); - return m_enumValueList->size() - 1; + if (!m_enumValueList) + return -1; + m_enumValueList->push_back(value); + return m_enumValueList->size() - 1; } int ParamInfo::addStringValue(const std::string& value) { - if (!m_enumValueList) - return -1; + if (!m_enumValueList) + return -1; - EnumValueList::const_iterator it = std::find(m_enumValueList->begin(), m_enumValueList->end(), value); - if (it != m_enumValueList->end()) - { - return it - m_enumValueList->begin(); - } + EnumValueList::const_iterator it = std::find(m_enumValueList->begin(), m_enumValueList->end(), value); + if (it != m_enumValueList->end()) + { + return it - m_enumValueList->begin(); + } - m_enumValueList->push_back(value); - return m_enumValueList->size() - 1; + m_enumValueList->push_back(value); + return m_enumValueList->size() - 1; } static std::string nullStr = ""; std::string ParamInfo::getEnumValue(unsigned int index) const { - if (!m_enumValueList) - return nullStr; - if (index >= m_enumValueList->size() || index < 0) - return nullStr; - return m_enumValueList->at(index); + if (!m_enumValueList) + return nullStr; + if (index >= m_enumValueList->size() || index < 0) + return nullStr; + return m_enumValueList->at(index); } int ParamInfo::getEnumCount() const { - return m_enumValueList ? m_enumValueList->size() : 0; + return m_enumValueList ? m_enumValueList->size() : 0; } // -------------------------------------------------------------------------------- // -------------------- ResourceType // -------------------------------------------------------------------------------- ResourceType::ResourceType(Kind kind) - : ChartTreeItem() - , m_kind(kind) + : ChartTreeItem() + , m_kind(kind) {} ResourceType::~ResourceType() { - int count = m_paramInfoList.size(); - for (int i = 0; i < count; i++) - { - delete m_paramInfoList.at(i); - } + int count = m_paramInfoList.size(); + for (int i = 0; i < count; i++) + { + delete m_paramInfoList.at(i); + } } const QString& ResourceType::getName() const { - return m_name; + return m_name; } void ResourceType::setName(const QString& name) { - m_name = name; + m_name = name; } ResourceType::Kind ResourceType::getKind() const { - return m_kind; + return m_kind; } int ResourceType::addParamInfo(ParamInfo* const value) { - m_paramInfoList.push_back(value); - return m_paramInfoList.size() - 1; + m_paramInfoList.push_back(value); + return m_paramInfoList.size() - 1; } ParamInfo* ResourceType::getParamInfo(unsigned int index) const { - if (index >= m_paramInfoList.size() || index < 0) - return NULL; - return m_paramInfoList.at(index); + if (index >= m_paramInfoList.size() || index < 0) + return NULL; + return m_paramInfoList.at(index); } int ResourceType::getParamsCount() const { - return m_paramInfoList.size(); + return m_paramInfoList.size(); } diff --git a/app/rdo_studio/src/tracer/tracer_resource_type.h b/app/rdo_studio/src/tracer/tracer_resource_type.h index 5280010c3..2dd363e52 100644 --- a/app/rdo_studio/src/tracer/tracer_resource_type.h +++ b/app/rdo_studio/src/tracer/tracer_resource_type.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_RESOURCE_TYPE_H_ -#define _RDO_STUDIO_TRACER_RESOURCE_TYPE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -14,36 +13,36 @@ namespace rdo { namespace gui { namespace tracer { class ParamInfo { public: - enum ParamType - { - PT_INTEGER = 0, - PT_REAL, - PT_ENUMERATIVE, - PT_BOOL, - PT_ARRAY, - PT_STRING, - PT_RESOURCE - }; - - ParamInfo(const ParamType type); - virtual ~ParamInfo(); - - const QString& getName() const; - void setName(const QString& name); - - ParamType getParamType() const; - - int addEnumValue(const std::string& value); - int addStringValue(const std::string& value); - std::string getEnumValue (unsigned int index) const; - int getEnumCount() const; + enum class Type + { + INTEGER = 0, + REAL, + ENUMERATIVE, + BOOL, + ARRAY, + STRING, + RESOURCE + }; + + ParamInfo(const Type type); + virtual ~ParamInfo(); + + const QString& getName() const; + void setName(const QString& name); + + Type getParamType() const; + + int addEnumValue(const std::string& value); + int addStringValue(const std::string& value); + std::string getEnumValue (unsigned int index) const; + int getEnumCount() const; private: - typedef std::vector EnumValueList; + typedef std::vector EnumValueList; - QString m_name; - EnumValueList* m_enumValueList; - ParamType m_paramType; + QString m_name; + EnumValueList* m_enumValueList; + Type m_paramType; }; // -------------------------------------------------------------------------------- @@ -53,33 +52,32 @@ class ResourceType: public ChartTreeItem { DECLARE_FACTORY(ResourceType) public: - enum Kind - { - RDOTK_PERMANENT = 0, RDOTK_TEMPORARY - }; + enum class Kind + { + PERMANENT = 0, + TEMPORARY + }; - const QString& getName() const; - void setName(const QString& name); + const QString& getName() const; + void setName(const QString& name); - Kind getKind() const; + Kind getKind() const; - int addParamInfo(ParamInfo* const value); - ParamInfo* getParamInfo(unsigned int index) const; - int getParamsCount() const; + int addParamInfo(ParamInfo* const value); + ParamInfo* getParamInfo(unsigned int index) const; + int getParamsCount() const; private: - ResourceType(Kind kind); - virtual ~ResourceType(); + ResourceType(Kind kind); + virtual ~ResourceType(); - typedef std::vector ParamInfoList; + typedef std::vector ParamInfoList; - QString m_name; - Kind m_kind; - ParamInfoList m_paramInfoList; + QString m_name; + Kind m_kind; + ParamInfoList m_paramInfoList; }; typedef rdo::intrusive_ptr LPResourceType; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_RESOURCE_TYPE_H_ diff --git a/app/rdo_studio/src/tracer/tracer_result.cpp b/app/rdo_studio/src/tracer/tracer_result.cpp index 391795939..7d1593f61 100644 --- a/app/rdo_studio/src/tracer/tracer_result.cpp +++ b/app/rdo_studio/src/tracer/tracer_result.cpp @@ -11,12 +11,12 @@ using namespace rdo::gui::tracer; Result::Result(const QString& name, Kind kind, int id) - : Serie(SK_RESULT) - , m_name(name) - , m_kind(kind) - , m_id(id) + : Serie(Serie::Kind::RESULT) + , m_name(name) + , m_kind(kind) + , m_id(id) { - setTitle(m_name); + setTitle(m_name); } Result::~Result() @@ -24,54 +24,54 @@ Result::~Result() const QString& Result::getName() const { - return m_name; + return m_name; } Result::Kind Result::getKind() const { - return m_kind; + return m_kind; } int Result::getID() const { - return m_id; + return m_id; } void Result::getCaptions(std::vector& captions, const int valueCount) const { - switch (m_kind) - { - case RK_WATCHQUANT: - Serie::getCaptionsInt(captions, valueCount); - break; + switch (m_kind) + { + case Kind::WATCHQUANT: + Serie::getCaptionsInt(captions, valueCount); + break; - case RK_WATCHSTATE: - Serie::getCaptionsBool(captions, valueCount); - break; + case Kind::WATCHSTATE: + Serie::getCaptionsBool(captions, valueCount); + break; - case RK_WATCHPAR: - case RK_WATCHVALUE: - Serie::getCaptionsDouble(captions, valueCount); - break; + case Kind::WATCHPAR: + case Kind::WATCHVALUE: + Serie::getCaptionsDouble(captions, valueCount); + break; - default: - NEVER_REACH_HERE; - break; - } + default: + NEVER_REACH_HERE; + break; + } } void Result::setValue(std::string& line, Time* const pTime, const int eventIndex) { - double newValue; - boost::algorithm::trim(line); - if (m_kind != RK_WATCHSTATE) - { - newValue = boost::lexical_cast(line); - } - else - { - newValue = (line == "TRUE") ? 1 : 0; - } - Value* pNewValue = new Value(pTime, eventIndex, newValue); - addValue(pNewValue); + double newValue; + boost::algorithm::trim(line); + if (m_kind != Kind::WATCHSTATE) + { + newValue = boost::lexical_cast(line); + } + else + { + newValue = (line == "TRUE") ? 1 : 0; + } + Value* pNewValue = new Value(pTime, eventIndex, newValue); + addValue(pNewValue); } diff --git a/app/rdo_studio/src/tracer/tracer_result.h b/app/rdo_studio/src/tracer/tracer_result.h index caeb6a3ab..3b3ea4e0d 100644 --- a/app/rdo_studio/src/tracer/tracer_result.h +++ b/app/rdo_studio/src/tracer/tracer_result.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_RESULT_H_ -#define _RDO_STUDIO_TRACER_RESULT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -14,33 +13,31 @@ class Result: public Serie { DECLARE_FACTORY(Result) public: - enum Kind - { - RK_UNDEFINED = ~0, - RK_WATCHPAR = 0, - RK_WATCHSTATE, - RK_WATCHQUANT, - RK_WATCHVALUE - }; - - const QString& getName() const; - Kind getKind() const; - int getID () const; - - virtual void getCaptions(std::vector& captions, const int valueCount) const; - void setValue(std::string& line, Time* const time, const int eventIndex); + enum class Kind + { + UNDEFINED = ~0, + WATCHPAR = 0, + WATCHSTATE, + WATCHQUANT, + WATCHVALUE + }; + + const QString& getName() const; + Kind getKind() const; + int getID () const; + + virtual void getCaptions(std::vector& captions, const int valueCount) const; + void setValue(std::string& line, Time* const time, const int eventIndex); private: - Result(const QString& name, Kind kind, int id); - virtual ~Result(); + Result(const QString& name, Kind kind, int id); + virtual ~Result(); - QString m_name; - Kind m_kind; - int m_id; + QString m_name; + Kind m_kind; + int m_id; }; typedef rdo::intrusive_ptr LPResult; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_RESULT_H_ diff --git a/app/rdo_studio/src/tracer/tracer_serie.cpp b/app/rdo_studio/src/tracer/tracer_serie.cpp index dc90af495..5a18b9046 100644 --- a/app/rdo_studio/src/tracer/tracer_serie.cpp +++ b/app/rdo_studio/src/tracer/tracer_serie.cpp @@ -22,192 +22,192 @@ using namespace rdo::gui::tracer; class TracerSerieFindValue { public: - TracerSerieFindValue(ChartView* pView) - : m_pView(pView) - {} + TracerSerieFindValue(ChartView* pView) + : m_pView(pView) + {} - bool operator() (Value* pValue); + bool operator() (Value* pValue); private: - ChartView* m_pView; + ChartView* m_pView; }; bool TracerSerieFindValue::operator() (Value* pValue) { - bool res = pValue && pValue->getModelTime()->time >= m_pView->drawFromX().time; - if (m_pView->doUnwrapTime() && res && (pValue->getModelTime()->time == m_pView->drawFromX().time)) - { - res = pValue->getEventID() >= m_pView->drawFromEventID(); - } - return res; + bool res = pValue && pValue->getModelTime()->time >= m_pView->drawFromX().time; + if (m_pView->doUnwrapTime() && res && (pValue->getModelTime()->time == m_pView->drawFromX().time)) + { + res = pValue->getEventID() >= m_pView->drawFromEventID(); + } + return res; } // -------------------------------------------------------------------------------- // -------------------- TracerSerie // -------------------------------------------------------------------------------- -Serie::Serie(Kind _serieKind) - : ChartTreeItem(true) - , m_minValue(0) - , m_maxValue(0) - , m_kind(_serieKind) - , m_valueCount(0) +Serie::Serie(Kind kind) + : ChartTreeItem(true) + , m_minValue(0) + , m_maxValue(0) + , m_kind(kind) + , m_valueCount(0) {} Serie::~Serie() { - ValuesList::iterator it = m_valueList.begin(); - while (it != m_valueList.end()) - { - delete *it; - it++; - } - m_valueList.clear(); - m_documentList.clear(); + ValuesList::iterator it = m_valueList.begin(); + while (it != m_valueList.end()) + { + delete *it; + it++; + } + m_valueList.clear(); + m_documentList.clear(); } const QString& Serie::getTitle() const { - return m_title; + return m_title; } void Serie::setTitle(const QString& value) { - m_title = value; + m_title = value; } Serie::Kind Serie::getKind() const { - return m_kind; + return m_kind; } bool Serie::isTemporaryResourceParam() const { - return m_kind == SK_PARAM && ((Param*)this)->getResource()->getType()->getKind() == ResourceType::RDOTK_TEMPORARY; + return m_kind == Kind::PARAM && ((Param*)this)->getResource()->getType()->getKind() == ResourceType::Kind::TEMPORARY; } void Serie::addValue(Value* const pValue) { - DocumentList::iterator it; + DocumentList::iterator it; - if (pValue->getValue() < m_minValue || m_valueList.empty()) - { - m_minValue = pValue->getValue(); - } - if (pValue->getValue() > m_maxValue || m_valueList.empty()) - { - m_maxValue = pValue->getValue(); - } + if (pValue->getValue() < m_minValue || m_valueList.empty()) + { + m_minValue = pValue->getValue(); + } + if (pValue->getValue() > m_maxValue || m_valueList.empty()) + { + m_maxValue = pValue->getValue(); + } - m_valueList.push_back(pValue); + m_valueList.push_back(pValue); - m_valueCount++; + m_valueCount++; - std::for_each(m_documentList.begin(), m_documentList.end(), boost::bind(&ChartDoc::newValueToSerieAdded, _1, pValue)); + std::for_each(m_documentList.begin(), m_documentList.end(), boost::bind(&ChartDoc::newValueToSerieAdded, _1, pValue)); } void Serie::getValueCount(int& count) const { - count = m_valueCount; + count = m_valueCount; } bool Serie::empty() const { - return m_valueList.empty(); + return m_valueList.empty(); } Serie::ValuesList::const_iterator Serie::begin() const { - return m_valueList.begin(); + return m_valueList.begin(); } Serie::ValuesList::const_iterator Serie::end() const { - return m_valueList.end(); + return m_valueList.end(); } void Serie::getCaptions(std::vector& captions, const int valueCount) const { - if (!captions.empty()) - captions.clear(); - - if (m_kind == Serie::SK_PREVIEW) - { - double valoffset = (m_maxValue - m_minValue) / (double)(valueCount - 1); - double valo = m_minValue; - std::string formatstr = "%.3f"; - if (m_valueCount > 1) - { - for (int i = 0; i < valueCount; i++) - { - captions.push_back(rdo::format(formatstr.c_str(), valo)); - valo += valoffset; - } - } - else - { - captions.push_back(rdo::format(formatstr.c_str(), valo)); - } - } + if (!captions.empty()) + captions.clear(); + + if (m_kind == Serie::Kind::PREVIEW) + { + double valoffset = (m_maxValue - m_minValue) / (double)(valueCount - 1); + double valo = m_minValue; + std::string formatstr = "%.3f"; + if (m_valueCount > 1) + { + for (int i = 0; i < valueCount; i++) + { + captions.push_back(rdo::format(formatstr.c_str(), valo)); + valo += valoffset; + } + } + else + { + captions.push_back(rdo::format(formatstr.c_str(), valo)); + } + } } void Serie::getCaptionsInt(std::vector& captions, const int valueCount) const { - Serie::getCaptions(captions, valueCount); - - int real_val_count = valueCount; - if ((m_maxValue - m_minValue + 1) > real_val_count) - { - while ((int)((m_maxValue - m_minValue) / (real_val_count - 1)) != (double)((m_maxValue - m_minValue) / (real_val_count - 1))) - real_val_count--; - } - else - { - real_val_count = (int)(m_maxValue - m_minValue + 1); - } - int valo = (int)m_minValue; - int valoffset = (int)((m_maxValue - m_minValue) / (real_val_count - 1)); - std::string formatstr = "%d"; - for (int i = 0; i < real_val_count; i++) - { - captions.push_back(rdo::format(formatstr.c_str(), valo)); - valo += valoffset; - } + Serie::getCaptions(captions, valueCount); + + int real_val_count = valueCount; + if ((m_maxValue - m_minValue + 1) > real_val_count) + { + while ((int)((m_maxValue - m_minValue) / (real_val_count - 1)) != (double)((m_maxValue - m_minValue) / (real_val_count - 1))) + real_val_count--; + } + else + { + real_val_count = (int)(m_maxValue - m_minValue + 1); + } + int valo = (int)m_minValue; + int valoffset = (int)((m_maxValue - m_minValue) / (real_val_count - 1)); + std::string formatstr = "%d"; + for (int i = 0; i < real_val_count; i++) + { + captions.push_back(rdo::format(formatstr.c_str(), valo)); + valo += valoffset; + } } void Serie::getCaptionsDouble(std::vector& captions, const int valueCount) const { - Serie::getCaptions(captions, valueCount); - - double valoffset = (m_maxValue - m_minValue) / (double)(valueCount - 1); - double valo = m_minValue; - std::string formatstr = "%.3f"; - if (m_valueCount > 1) - { - for (int i = 0; i < valueCount; i++) - { - captions.push_back(rdo::format(formatstr.c_str(), valo)); - valo += valoffset; - } - } - else - { - captions.push_back(rdo::format(formatstr.c_str(), valo)); - } + Serie::getCaptions(captions, valueCount); + + double valoffset = (m_maxValue - m_minValue) / (double)(valueCount - 1); + double valo = m_minValue; + std::string formatstr = "%.3f"; + if (m_valueCount > 1) + { + for (int i = 0; i < valueCount; i++) + { + captions.push_back(rdo::format(formatstr.c_str(), valo)); + valo += valoffset; + } + } + else + { + captions.push_back(rdo::format(formatstr.c_str(), valo)); + } } void Serie::getCaptionsBool(std::vector& captions, const int valueCount) const { - Serie::getCaptions(captions, valueCount); - captions.push_back("FALSE"); - captions.push_back("TRUE"); + Serie::getCaptions(captions, valueCount); + captions.push_back("FALSE"); + captions.push_back("TRUE"); } void Serie::getLastValue(Value*& pValue) const { - if (!m_valueList.size()) - pValue = NULL; - else - pValue = m_valueList.back(); + if (!m_valueList.size()) + pValue = NULL; + else + pValue = m_valueList.back(); } void Serie::drawSerie(ChartView* const pView, @@ -219,266 +219,266 @@ void Serie::drawSerie(ChartView* const pView, const bool draw_marker, const bool transparent_marker) const { - if (!m_valueList.empty()) - { - painter.setPen(color); - painter.setBrush(QBrush(color, transparent_marker ? Qt::NoBrush : Qt::SolidPattern)); - - ValuesList::const_iterator it = std::find_if(m_valueList.begin(), m_valueList.end(), TracerSerieFindValue(pView)); - - if (it == m_valueList.end() && !m_valueList.empty() && !isTemporaryResourceParam()) - { - --it; - } - - bool flag = it != m_valueList.end(); - if (flag && !pView->doUnwrapTime()) - { - flag = !(it == m_valueList.begin() && (*it)->getModelTime()->time > pView->drawToX().time); - } - else if (flag) - { - flag = !(it == m_valueList.begin() && ((*it)->getModelTime()->time > pView->drawToX().time || ((*it)->getModelTime()->time == pView->drawToX().time && (*it)->getEventID() > pView->drawToEventCount()))); - } - - if (flag) - { - - long double ky; - if (m_maxValue != m_minValue) - ky = rect.height() / (m_maxValue - m_minValue); - else - ky = 0; - - flag = it != m_valueList.begin(); - if (flag && !pView->doUnwrapTime()) - { - flag = (*it)->getModelTime()->time > pView->drawFromX().time; - } - else if (flag) - { - flag = (*it)->getModelTime()->time > pView->drawFromX().time || ((*it)->getModelTime()->time == pView->drawFromX().time && (*it)->getEventID() > pView->drawFromEventID()); - } - if (flag) - --it; - - int lastY = rdo::roundDouble((double)rect.bottom() - double(ky) * ((*it)->getValue() - m_minValue)); - lastY = std::max(lastY, rect.top()); - lastY = std::min(lastY, rect.bottom()); - int lastX = rect.left() + rdo::roundDouble(((*it)->getModelTime()->time - pView->drawFromX().time) * double(pView->timeScale())) - pView->chartShift(); - lastX = std::min(lastX, rect.right()); - - int ticks = 0; - ChartDoc::TimesList::const_iterator timeIt = pView->unwrapTimesList().begin(); - if (pView->doUnwrapTime() && (*it)->getModelTime()->time >= pView->drawFromX().time) - { - if (*(*it)->getModelTime() == *(*timeIt)) - { - lastX += ((*it)->getEventID() - pView->drawFromEventID()) * pView->style()->pFontsTicks.tickWidth; - } - else - { - while (timeIt != pView->unwrapTimesList().end() && *(*it)->getModelTime() != *(*timeIt)) - { - ticks += (*timeIt)->eventCount; - ++timeIt; - } - lastX += (ticks + (*it)->getEventID() - pView->drawFromEventID()) * pView->style()->pFontsTicks.tickWidth; - } - } - lastX = std::min(lastX, rect.right()); - - QPainterPath path; - if (lastX >= rect.left() && draw_marker) - { - drawMarker(painter, lastX, lastY, marker, markerSize); - path.moveTo(lastX, lastY); - } - else - path.moveTo(rect.left(), lastY); - - int x = lastX, y = lastY; - if (pView->doUnwrapTime()) - { - ticks -= pView->drawFromEventID(); - } - ++it; - if (pView->doUnwrapTime() && it != m_valueList.end()) - { - while (timeIt != pView->unwrapTimesList().end() && *(*it)->getModelTime() != *(*timeIt)) - { - ticks += (*timeIt)->eventCount; - ++timeIt; - } - } - - while (it != m_valueList.end() - && ((!pView->doUnwrapTime() && (*it)->getModelTime()->time <= pView->drawToX().time) - || (pView->doUnwrapTime() - && ((*it)->getModelTime()->time < pView->drawToX().time || ((*it)->getModelTime()->time == pView->drawToX().time && (*it)->getEventID() <= pView->drawToEventCount()))))) - { - y = rdo::roundDouble((double)rect.bottom() - double(ky) * ((*it)->getValue() - m_minValue)); - y = std::max(y, rect.top()); - y = std::min(y, rect.bottom()); - x = rect.left() + rdo::roundDouble(((*it)->getModelTime()->time - pView->drawFromX().time) * double(pView->timeScale())) - pView->chartShift(); - if (pView->doUnwrapTime()) - { - x += (ticks + (*it)->getEventID()) * pView->style()->pFontsTicks.tickWidth; - } - x = std::min(x, rect.right()); - if (draw_marker) - drawMarker(painter, x, y, marker, markerSize); - path.lineTo(x, lastY); - path.lineTo(x, y); - lastX = x; - lastY = y; - ++it; - if (pView->doUnwrapTime() && it != m_valueList.end()) - { - while (timeIt != pView->unwrapTimesList().end() && *(*it)->getModelTime() != *(*timeIt)) - { - ticks += (*timeIt)->eventCount; - ++timeIt; - } - } - } - - bool tempResourceErased = (m_kind == SK_PARAM && ((Param*)this)->getResource()->isErased()); - bool needContinue = !pView->doUnwrapTime() ? (m_valueList.size() > 1) : true; - if (tempResourceErased) - { - if (!pView->doUnwrapTime()) - { - needContinue = (it != m_valueList.end() && (*it)->getModelTime()->time > pView->drawToX().time); - } - else - { - needContinue = (it != m_valueList.end() - && ((*it)->getModelTime()->time > pView->drawToX().time || ((*it)->getModelTime()->time == pView->drawToX().time && (*it)->getEventID() > pView->drawToEventCount()))); - } - } - - if (needContinue) - { - if (pView->drawFromX() == pView->drawToX()) - { - x = rect.left() + (pView->drawToEventCount() - pView->drawFromEventID()) * pView->style()->pFontsTicks.tickWidth; - x = std::min(x, rect.right()); - } - else - { - x = rect.right(); - } - path.lineTo(x, lastY); - } - - painter.setBrush(Qt::NoBrush); - painter.drawPath(path); - } - } + if (!m_valueList.empty()) + { + painter.setPen(color); + painter.setBrush(QBrush(color, transparent_marker ? Qt::NoBrush : Qt::SolidPattern)); + + ValuesList::const_iterator it = std::find_if(m_valueList.begin(), m_valueList.end(), TracerSerieFindValue(pView)); + + if (it == m_valueList.end() && !m_valueList.empty() && !isTemporaryResourceParam()) + { + --it; + } + + bool flag = it != m_valueList.end(); + if (flag && !pView->doUnwrapTime()) + { + flag = !(it == m_valueList.begin() && (*it)->getModelTime()->time > pView->drawToX().time); + } + else if (flag) + { + flag = !(it == m_valueList.begin() && ((*it)->getModelTime()->time > pView->drawToX().time || ((*it)->getModelTime()->time == pView->drawToX().time && (*it)->getEventID() > pView->drawToEventCount()))); + } + + if (flag) + { + + long double ky; + if (m_maxValue != m_minValue) + ky = rect.height() / (m_maxValue - m_minValue); + else + ky = 0; + + flag = it != m_valueList.begin(); + if (flag && !pView->doUnwrapTime()) + { + flag = (*it)->getModelTime()->time > pView->drawFromX().time; + } + else if (flag) + { + flag = (*it)->getModelTime()->time > pView->drawFromX().time || ((*it)->getModelTime()->time == pView->drawFromX().time && (*it)->getEventID() > pView->drawFromEventID()); + } + if (flag) + --it; + + int lastY = rdo::roundDouble((double)rect.bottom() - double(ky) * ((*it)->getValue() - m_minValue)); + lastY = std::max(lastY, rect.top()); + lastY = std::min(lastY, rect.bottom()); + int lastX = rect.left() + rdo::roundDouble(((*it)->getModelTime()->time - pView->drawFromX().time) * double(pView->timeScale())) - pView->chartShift(); + lastX = std::min(lastX, rect.right()); + + int ticks = 0; + ChartDoc::TimesList::const_iterator timeIt = pView->unwrapTimesList().begin(); + if (pView->doUnwrapTime() && (*it)->getModelTime()->time >= pView->drawFromX().time) + { + if (*(*it)->getModelTime() == *(*timeIt)) + { + lastX += ((*it)->getEventID() - pView->drawFromEventID()) * pView->style()->pFontsTicks.tickWidth; + } + else + { + while (timeIt != pView->unwrapTimesList().end() && *(*it)->getModelTime() != *(*timeIt)) + { + ticks += (*timeIt)->eventCount; + ++timeIt; + } + lastX += (ticks + (*it)->getEventID() - pView->drawFromEventID()) * pView->style()->pFontsTicks.tickWidth; + } + } + lastX = std::min(lastX, rect.right()); + + QPainterPath path; + if (lastX >= rect.left() && draw_marker) + { + drawMarker(painter, lastX, lastY, marker, markerSize); + path.moveTo(lastX, lastY); + } + else + path.moveTo(rect.left(), lastY); + + int x = lastX, y = lastY; + if (pView->doUnwrapTime()) + { + ticks -= pView->drawFromEventID(); + } + ++it; + if (pView->doUnwrapTime() && it != m_valueList.end()) + { + while (timeIt != pView->unwrapTimesList().end() && *(*it)->getModelTime() != *(*timeIt)) + { + ticks += (*timeIt)->eventCount; + ++timeIt; + } + } + + while (it != m_valueList.end() + && ((!pView->doUnwrapTime() && (*it)->getModelTime()->time <= pView->drawToX().time) + || (pView->doUnwrapTime() + && ((*it)->getModelTime()->time < pView->drawToX().time || ((*it)->getModelTime()->time == pView->drawToX().time && (*it)->getEventID() <= pView->drawToEventCount()))))) + { + y = rdo::roundDouble((double)rect.bottom() - double(ky) * ((*it)->getValue() - m_minValue)); + y = std::max(y, rect.top()); + y = std::min(y, rect.bottom()); + x = rect.left() + rdo::roundDouble(((*it)->getModelTime()->time - pView->drawFromX().time) * double(pView->timeScale())) - pView->chartShift(); + if (pView->doUnwrapTime()) + { + x += (ticks + (*it)->getEventID()) * pView->style()->pFontsTicks.tickWidth; + } + x = std::min(x, rect.right()); + if (draw_marker) + drawMarker(painter, x, y, marker, markerSize); + path.lineTo(x, lastY); + path.lineTo(x, y); + lastX = x; + lastY = y; + ++it; + if (pView->doUnwrapTime() && it != m_valueList.end()) + { + while (timeIt != pView->unwrapTimesList().end() && *(*it)->getModelTime() != *(*timeIt)) + { + ticks += (*timeIt)->eventCount; + ++timeIt; + } + } + } + + bool tempResourceErased = (m_kind == Kind::PARAM && ((Param*)this)->getResource()->isErased()); + bool needContinue = !pView->doUnwrapTime() ? (m_valueList.size() > 1) : true; + if (tempResourceErased) + { + if (!pView->doUnwrapTime()) + { + needContinue = (it != m_valueList.end() && (*it)->getModelTime()->time > pView->drawToX().time); + } + else + { + needContinue = (it != m_valueList.end() + && ((*it)->getModelTime()->time > pView->drawToX().time || ((*it)->getModelTime()->time == pView->drawToX().time && (*it)->getEventID() > pView->drawToEventCount()))); + } + } + + if (needContinue) + { + if (pView->drawFromX() == pView->drawToX()) + { + x = rect.left() + (pView->drawToEventCount() - pView->drawFromEventID()) * pView->style()->pFontsTicks.tickWidth; + x = std::min(x, rect.right()); + } + else + { + x = rect.right(); + } + path.lineTo(x, lastY); + } + + painter.setBrush(Qt::NoBrush); + painter.drawPath(path); + } + } } void Serie::drawMarker(QPainter& painter, const int x, const int y, Marker marker, const int markerSize) const { - float halfMarkerSize = float(markerSize) / 2.0f; - QRectF rect(x - halfMarkerSize, y - halfMarkerSize, markerSize, markerSize); - - switch (marker) - { - case M_CIRCLE: - painter.drawEllipse(rect); - break; - - case M_SQUARE: - painter.drawRect(rect); - break; - - case M_TRIANG: - { - QPolygonF polygon; - polygon << QPointF(rect.left () + halfMarkerSize, rect.top()); - polygon << QPointF(rect.right(), rect.bottom()); - polygon << QPointF(rect.left (), rect.bottom()); - polygon << QPointF(rect.left () + halfMarkerSize, rect.top()); - - QPainterPath path; - path.addPolygon(polygon); - painter.drawPath(path); - break; - } - case M_CROSS: - { - int delta = halfMarkerSize == int(halfMarkerSize) - ? 1 - : 0; - - QPainterPath path; - path.moveTo(QPointF(x - halfMarkerSize - delta, y - halfMarkerSize - delta)); - path.lineTo(QPointF(x + halfMarkerSize, y + halfMarkerSize)); - path.moveTo(QPointF(x - halfMarkerSize - delta, y + halfMarkerSize + delta)); - path.lineTo(QPointF(x + halfMarkerSize, y - halfMarkerSize)); - painter.drawPath(path); - break; - } - default: - break; - } + float halfMarkerSize = float(markerSize) / 2.0f; + QRectF rect(x - halfMarkerSize, y - halfMarkerSize, markerSize, markerSize); + + switch (marker) + { + case Marker::CIRCLE: + painter.drawEllipse(rect); + break; + + case Marker::SQUARE: + painter.drawRect(rect); + break; + + case Marker::TRIANG: + { + QPolygonF polygon; + polygon << QPointF(rect.left () + halfMarkerSize, rect.top()); + polygon << QPointF(rect.right(), rect.bottom()); + polygon << QPointF(rect.left (), rect.bottom()); + polygon << QPointF(rect.left () + halfMarkerSize, rect.top()); + + QPainterPath path; + path.addPolygon(polygon); + painter.drawPath(path); + break; + } + case Marker::CROSS: + { + int delta = halfMarkerSize == int(halfMarkerSize) + ? 1 + : 0; + + QPainterPath path; + path.moveTo(QPointF(x - halfMarkerSize - delta, y - halfMarkerSize - delta)); + path.lineTo(QPointF(x + halfMarkerSize, y + halfMarkerSize)); + path.moveTo(QPointF(x - halfMarkerSize - delta, y + halfMarkerSize + delta)); + path.lineTo(QPointF(x + halfMarkerSize, y - halfMarkerSize)); + painter.drawPath(path); + break; + } + default: + break; + } } void Serie::addToDoc(ChartDoc* const pDocument) { - if (pDocument && std::find(m_documentList.begin(), m_documentList.end(), pDocument) == m_documentList.end()) - { - m_documentList.push_back(pDocument); - } + if (pDocument && std::find(m_documentList.begin(), m_documentList.end(), pDocument) == m_documentList.end()) + { + m_documentList.push_back(pDocument); + } } void Serie::removeFromDoc(ChartDoc* const pDocument) { - DocumentList::iterator it = std::find(m_documentList.begin(), m_documentList.end(), pDocument); - if (it != m_documentList.end()) - { - m_documentList.erase(it); - } + DocumentList::iterator it = std::find(m_documentList.begin(), m_documentList.end(), pDocument); + if (it != m_documentList.end()) + { + m_documentList.erase(it); + } } bool Serie::isInOneOrMoreDocs() const { - return !m_documentList.empty(); + return !m_documentList.empty(); } bool Serie::activateFirstDoc() const { - bool result = false; - if (!m_documentList.empty()) - { - ChartDoc* pDoc = m_documentList.front(); - if (pDoc) - { - ChartView* pView = pDoc->getFirstView(); - ASSERT (pView) - g_pApp->getIMainWnd()->activateSubWindow(pView->parentWidget()->parentWidget()); - result = true; - } - } - - return result; + bool result = false; + if (!m_documentList.empty()) + { + ChartDoc* pDoc = m_documentList.front(); + if (pDoc) + { + ChartView* pView = pDoc->getFirstView(); + ASSERT (pView) + g_pApp->getIMainWnd()->activateSubWindow(pView->parentWidget()->parentWidget()); + result = true; + } + } + + return result; } Serie::ExportData Serie::exportData() { -// setlocale(LC_ALL, "rus"); +// setlocale(LC_ALL, "rus"); - ExportData exportData; - exportData.reserve(m_valueList.size() + 1); - exportData.push_back(QString("%1;%2").arg("время").arg(m_title)); + ExportData exportData; + exportData.reserve(m_valueList.size() + 1); + exportData.push_back(QString("%1;%2").arg("время").arg(m_title)); - for (Value* pValue: m_valueList) - { - exportData.push_back(QString("%1;%2").arg(pValue->getModelTime()->time).arg(pValue->getValue())); - } + for (Value* pValue: m_valueList) + { + exportData.push_back(QString("%1;%2").arg(pValue->getModelTime()->time).arg(pValue->getValue())); + } -// setlocale(LC_NUMERIC, "eng"); +// setlocale(LC_NUMERIC, "eng"); - return exportData; + return exportData; } diff --git a/app/rdo_studio/src/tracer/tracer_serie.h b/app/rdo_studio/src/tracer/tracer_serie.h index 89292eeb8..3f6816fc3 100644 --- a/app/rdo_studio/src/tracer/tracer_serie.h +++ b/app/rdo_studio/src/tracer/tracer_serie.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_SERIE_H_ -#define _RDO_STUDIO_TRACER_SERIE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -19,85 +18,83 @@ class Serie: public ChartTreeItem { DECLARE_FACTORY(Serie) public: - enum Kind - { - SK_PARAM = 0, - SK_OPERATION, - SK_RESULT, - SK_PREVIEW - }; + enum class Kind + { + PARAM = 0, + OPERATION, + RESULT, + PREVIEW + }; - enum Marker - { - M_NONE = 0, - M_CIRCLE, - M_SQUARE, - M_TRIANG, - M_CROSS - }; + enum class Marker + { + NONE = 0, + CIRCLE, + SQUARE, + TRIANG, + CROSS + }; - typedef std::list ValuesList; + typedef std::list ValuesList; - const QString& getTitle() const; - void setTitle(const QString& value); + const QString& getTitle() const; + void setTitle(const QString& value); - Kind getKind() const; + Kind getKind() const; - void addValue(Value* const value); - void getValueCount(int& count) const; + void addValue(Value* const value); + void getValueCount(int& count) const; - bool empty() const; + bool empty() const; - ValuesList::const_iterator begin() const; - ValuesList::const_iterator end () const; + ValuesList::const_iterator begin() const; + ValuesList::const_iterator end () const; - void getLastValue(Value*& val) const; - virtual void getCaptions(std::vector& captions, const int valueCount) const; + void getLastValue(Value*& val) const; + virtual void getCaptions(std::vector& captions, const int valueCount) const; - void drawSerie(ChartView* const pView, - QPainter& painter, - const QRect& rect, - const QColor& color, - Marker marker, - const int markerSize, - const bool draw_marker, - const bool transparent_marker) const; - void drawMarker(QPainter& painter, const int x, const int y, Marker marker, const int markerSize) const; + void drawSerie(ChartView* const pView, + QPainter& painter, + const QRect& rect, + const QColor& color, + Marker marker, + const int markerSize, + const bool draw_marker, + const bool transparent_marker) const; + void drawMarker(QPainter& painter, const int x, const int y, Marker marker, const int markerSize) const; - void addToDoc(ChartDoc* const pDocument); - void removeFromDoc(ChartDoc* const pDocument); - bool isInOneOrMoreDocs() const; + void addToDoc(ChartDoc* const pDocument); + void removeFromDoc(ChartDoc* const pDocument); + bool isInOneOrMoreDocs() const; - bool activateFirstDoc() const; + bool activateFirstDoc() const; - typedef std::vector ExportData; - ExportData exportData(); + typedef std::vector ExportData; + ExportData exportData(); protected: - Serie(Kind _serieKind = SK_PREVIEW); - virtual ~Serie(); + Serie(Kind kind = Kind::PREVIEW); + virtual ~Serie(); - mutable double m_minValue; - mutable double m_maxValue; + mutable double m_minValue; + mutable double m_maxValue; - void getCaptionsInt(std::vector& captions, const int valueCount) const; - void getCaptionsDouble(std::vector& captions, const int valueCount) const; - void getCaptionsBool(std::vector& captions, const int valueCount) const; + void getCaptionsInt(std::vector& captions, const int valueCount) const; + void getCaptionsDouble(std::vector& captions, const int valueCount) const; + void getCaptionsBool(std::vector& captions, const int valueCount) const; private: - typedef std::vector DocumentList; + typedef std::vector DocumentList; - Kind m_kind; - QString m_title; - ValuesList m_valueList; - int m_valueCount; - DocumentList m_documentList; + Kind m_kind; + QString m_title; + ValuesList m_valueList; + int m_valueCount; + DocumentList m_documentList; - bool isTemporaryResourceParam() const; + bool isTemporaryResourceParam() const; }; typedef rdo::intrusive_ptr LPSerie; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_SERIE_H_ diff --git a/app/rdo_studio/src/tracer/tracer_values.cpp b/app/rdo_studio/src/tracer/tracer_values.cpp index 17a3362eb..6cda09d28 100644 --- a/app/rdo_studio/src/tracer/tracer_values.cpp +++ b/app/rdo_studio/src/tracer/tracer_values.cpp @@ -11,48 +11,48 @@ using namespace rdo::gui::tracer; // -------------------- Time // -------------------------------------------------------------------------------- Time::Time(const double time) - : time(time) + : time(time) { - eventCount = 0; + eventCount = 0; } Time::Time(const double time, const int eventCount) - : time(time) - , eventCount(eventCount) + : time(time) + , eventCount(eventCount) {} Time& Time::operator= (const Time& timeNow) { - time = timeNow.time; - eventCount = timeNow.eventCount; + time = timeNow.time; + eventCount = timeNow.eventCount; - return *this; + return *this; } bool Time::operator== (const Time& timeNow) const { - return time == timeNow.time && eventCount == timeNow.eventCount; + return time == timeNow.time && eventCount == timeNow.eventCount; } bool Time::operator!= (const Time& timeNow) const { - return !(*this == timeNow); + return !(*this == timeNow); } bool Time::compareTimes(const Time* pTimeNow) { - return pTimeNow - ? time >= pTimeNow->time - : false; + return pTimeNow + ? time >= pTimeNow->time + : false; } // -------------------------------------------------------------------------------- // -------------------- Value // -------------------------------------------------------------------------------- Value::Value(Time* const pTimeNow, const int eventID, const double value) - : m_value (value ) - , m_pModelTime(pTimeNow) - , m_eventID (eventID ) + : m_value (value ) + , m_pModelTime(pTimeNow) + , m_eventID (eventID ) {} Value::~Value() @@ -60,15 +60,15 @@ Value::~Value() double Value::getValue() const { - return m_value; + return m_value; } Time* const Value::getModelTime() const { - return m_pModelTime; + return m_pModelTime; } int Value::getEventID() const { - return m_eventID; + return m_eventID; } diff --git a/app/rdo_studio/src/tracer/tracer_values.h b/app/rdo_studio/src/tracer/tracer_values.h index e9ef45a38..9db3e178b 100644 --- a/app/rdo_studio/src/tracer/tracer_values.h +++ b/app/rdo_studio/src/tracer/tracer_values.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_TRACER_VALUES_H_ -#define _RDO_STUDIO_TRACER_VALUES_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,17 +12,17 @@ namespace rdo { namespace gui { namespace tracer { class Time { public: - Time(const double time = 0); - Time(const double time, const int eventCount); + Time(const double time = 0); + Time(const double time, const int eventCount); - double time; - int eventCount; + double time; + int eventCount; - Time& operator =(const Time& timeNow); - bool operator ==(const Time& timeNow) const; - bool operator !=(const Time& timeNow) const; + Time& operator =(const Time& timeNow); + bool operator ==(const Time& timeNow) const; + bool operator !=(const Time& timeNow) const; - bool compareTimes(const Time* pTimeNow); + bool compareTimes(const Time* pTimeNow); }; // -------------------------------------------------------------------------------- @@ -32,19 +31,17 @@ class Time class Value { public: - Value(Time* const pTimeNow, const int eventID, const double value); - ~Value(); + Value(Time* const pTimeNow, const int eventID, const double value); + ~Value(); - double getValue () const; - Time* const getModelTime() const; - int getEventID () const; + double getValue () const; + Time* const getModelTime() const; + int getEventID () const; private: - double m_value; - Time* m_pModelTime; - int m_eventID; + double m_value; + Time* m_pModelTime; + int m_eventID; }; }}} // namespace rdo::gui::tracer - -#endif // _RDO_STUDIO_TRACER_VALUES_H_ diff --git a/app/rdo_studio/src/view_preferences.cpp b/app/rdo_studio/src/view_preferences.cpp index ab1f54591..1f4f008fa 100644 --- a/app/rdo_studio/src/view_preferences.cpp +++ b/app/rdo_studio/src/view_preferences.cpp @@ -17,1804 +17,1916 @@ bool ViewPreferences::null_wordwrap = false; bool ViewPreferences::null_horzscrollbar = true; bool ViewPreferences::null_warning = true; bool ViewPreferences::null_commentfold = false; -EditStyle::Bookmark ViewPreferences::null_bookmarkstyle = EditStyle::B_NONE; -ModelStyle::Fold ViewPreferences::null_foldstyle = ModelStyle::F_NONE; +EditStyle::Bookmark ViewPreferences::null_bookmarkstyle = EditStyle::Bookmark::NONE; +ModelStyle::Fold ViewPreferences::null_foldstyle = ModelStyle::Fold::NONE; QColor ViewPreferences::null_fg_color = QColor(0x00, 0x00, 0x00); QColor ViewPreferences::null_bg_color = QColor(0xFF, 0xFF, 0xFF); +namespace +{ + +enum class StyleType +{ + CURRENT, + DEFAULT, + CPP, + PASCAL_STYLE, + HTML, + CLASSIC, + TWILIGHT, + OCEAN +}; + +} // anonymous namespace + +Q_DECLARE_METATYPE(EditStyle::Bookmark); +Q_DECLARE_METATYPE(ModelStyle::Fold); +Q_DECLARE_METATYPE(StyleType); + ViewPreferences::ViewPreferences(QWidget* pParent) - : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) - , all_font_size(-1) - , all_font_name("") - , all_fg_color(0x00, 0x00, 0x00) - , all_bg_color(0xFF, 0xFF, 0xFF) - , null_font_style(StyleFont::NONE) - , m_pPluginInfoList(g_pApp->getPluginLoader().getPluginInfoList()) -{ - setupUi(this); - - connect(buttonOk, SIGNAL(clicked()), this, SLOT(onOkButton())); - connect(buttonCancel, SIGNAL(clicked()), this, SLOT(onCancelButton())); - connect(buttonApply, SIGNAL(clicked()), this, SLOT(onApplyButton())); - - m_setup = g_pApp->getFileAssociationSetup(); - m_checkInFuture = g_pApp->getFileAssociationCheckInFuture(); - m_openLastProject = g_pApp->getOpenLastProject(); - m_showFullName = g_pApp->getShowCaptionFullName(); - - style_editor = g_pApp->getStyle()->style_editor; - style_build = g_pApp->getStyle()->style_build; - style_debug = g_pApp->getStyle()->style_debug; - style_trace = g_pApp->getStyle()->style_trace; - style_results = g_pApp->getStyle()->style_results; - style_find = g_pApp->getStyle()->style_find; - style_chart = g_pApp->getStyle()->style_chart; - style_frame = g_pApp->getStyle()->style_frame; - - fontComboBox->setEditable(false); - //Вкладка "Основные" - connect(setupCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onSetup(int))); - connect(checkInFutureCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onCheckInFuture(int))); - connect(openLastProjectCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onOpenLastProject(int))); - connect(showFullNameCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onShowFullName(int))); - //Вкладка "Редактор" - connect(checkBoxCodeCompUse, SIGNAL(stateChanged(int)), this, SLOT(onCodeCompUse(int))); - connect(radioButtonFullList, SIGNAL(toggled(bool)), this, SLOT(onCodeCompShowFullList(bool))); - connect(radioButtonNearestWords, SIGNAL(toggled(bool)), this, SLOT(onCodeCompShowFullList(bool))); - connect(checkBoxMarginFold, SIGNAL(stateChanged(int)), this, SLOT(onMarginFold(int))); - connect(checkBoxMarginBookmark, SIGNAL(stateChanged(int)), this, SLOT(onMarginBookmark(int))); - connect(checkBoxMarginLineNum, SIGNAL(stateChanged(int)), this, SLOT(onMarginLineNumber(int))); - //Вкладка "Табуляция" - tabSizeLineEdit->setValidator(new QIntValidator(1, 100, this)); - tabSizeLineEdit->setText(QString::number(style_editor.tab.tabSize)); - indentSizeLineEdit->setValidator(new QIntValidator(1, 100, this)); - indentSizeLineEdit->setText(QString::number(style_editor.tab.indentSize)); - connect(useTabSymbolCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onUseTabSymbol(int))); - connect(indentAsTabcheckBox, SIGNAL(stateChanged(int)), this, SLOT(onIndentAsTab(int))); - connect(autoIndentCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onAutoIndent(int))); - connect(eraseWithTabRadioButton, SIGNAL(toggled(bool)), this, SLOT(onEraseWithTab(bool))); - connect(tabSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onTabSize(const QString&))); - connect(indentSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onIndentSize(const QString&))); - //Вкладка "Стиль и цвет" - stackedWidget->setCurrentWidget(pageRoot); - - QPalette* palette = new QPalette(); - palette->setColor(QPalette::Foreground, Qt::gray); - previewStackedWidget->setPalette(*palette); - - createTree(); - createPreview(); - createStyles(); - - insertColors(fgColorComboBox); - insertColors(bgColorComboBox); - - switchPreviewComboBox->addItem("Editor", IT_EDITOR); - switchPreviewComboBox->addItem("Build", IT_BUILD); - switchPreviewComboBox->addItem("Debug", IT_DEBUG); - switchPreviewComboBox->addItem("Tracer", IT_LOG); - switchPreviewComboBox->addItem("Results", IT_RESULT); - switchPreviewComboBox->addItem("Find", IT_FIND); - switchPreviewComboBox->addItem("Chart", IT_CHART); - switchPreviewComboBox->addItem("Frame", IT_FRAME); - - bookmarkComboBox->addItem("Нет", EditStyle::B_NONE); - bookmarkComboBox->addItem("Круг", EditStyle::B_CIRCLE); - bookmarkComboBox->addItem("Прямоугольник", EditStyle::B_RECT); - bookmarkComboBox->addItem("Овал", EditStyle::B_ROUNDRECT); - bookmarkComboBox->addItem("Стрелка", EditStyle::B_ARROW); - - foldComboBox->addItem("Нет", ModelStyle::F_NONE); - foldComboBox->addItem("Плюс", ModelStyle::F_PLUS); - foldComboBox->addItem("Плюс + линия", ModelStyle::F_PLUSCONNECTED); - foldComboBox->addItem("Стрелка", ModelStyle::F_ARROW); - foldComboBox->addItem("Стрелка + линия", ModelStyle::F_ARROWCONNECTED); - foldComboBox->addItem("Квадрат + линия", ModelStyle::F_BOXCONNECTED); - foldComboBox->addItem("Круг + линия", ModelStyle::F_CIRCLECONNECTED); - - boldCheckBox->setEnabled(false); - italicCheckBox->setEnabled(false); - underlineCheckBox->setEnabled(false); - - horzIndentLineEdit->setValidator(new QIntValidator(1, 100, this)); - horzIndentLineEdit->setText(QString::number(style_trace.borders.horzBorder)); - vertIndentLineEdit->setValidator(new QIntValidator(1, 100, this)); - vertIndentLineEdit->setText(QString::number(style_trace.borders.vertBorder)); - - tickWidthLineEdit->setValidator(new QIntValidator(1, 100, this)); - tickWidthLineEdit->setText(QString::number(style_chart.pFontsTicks.tickWidth)); - - connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(onTreeWidgetItemActivated(QTreeWidgetItem*, int))); - connect(switchPreviewComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onSwitchPreviewComboBox(int))); - connect(fontSizeComboBox, SIGNAL(activated(int)), this, SLOT(onFontSize(int))); - connect(fontComboBox, SIGNAL(activated(int)), this, SLOT(onFontType(int))); - connect(boldCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onFontBold(int))); - connect(italicCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onFontItalic(int))); - connect(underlineCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onFontUnderline(int))); - connect(horzScrollEditorCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onHorzScroll(int))); - connect(horzScrollBuildCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onHorzScroll(int))); - connect(horzScrollDebugCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onHorzScroll(int))); - connect(horzScrollResultsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onHorzScroll(int))); - connect(horzScrollFindCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onHorzScroll(int))); - connect(wordWrapEditorCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onWordWrap(int))); - connect(wordWrapBuildCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onWordWrap(int))); - connect(wordWrapDebugCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onWordWrap(int))); - connect(wordWrapResultsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onWordWrap(int))); - connect(wordWrapFindCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onWordWrap(int))); - connect(bookmarkComboBox, SIGNAL(activated(int)), this, SLOT(onBookmark(int))); - connect(foldComboBox, SIGNAL(activated(int)), this, SLOT(onFold(int))); - connect(commentCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onComment(int))); - connect(warningCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onWarning(int))); - connect(horzIndentLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onHorzIndent(const QString&))); - connect(vertIndentLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onVertIndent(const QString&))); - connect(fgColorComboBox, SIGNAL(activated(int)), this, SLOT(onFgColor(int))); - connect(bgColorComboBox, SIGNAL(activated(int)), this, SLOT(onBgColor(int))); - connect(fgColorToolButton, SIGNAL(clicked()), this, SLOT(onFgColorDialog())); - connect(bgColorToolButton, SIGNAL(clicked()), this, SLOT(onBgColorDialog())); - connect(titleComboBox, SIGNAL(activated(int)), this, SLOT(onTitleSize(int))); - connect(legendComboBox, SIGNAL(activated(int)), this, SLOT(onLegendSize(int))); - connect(tickWidthLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onTickWidth(const QString&))); - connect(themeComboBox, SIGNAL(activated(int)), this, SLOT(onThemeComboBox(int))); - - connect(tabSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); - connect(indentSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); - connect(horzIndentLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); - connect(vertIndentLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); - connect(tickWidthLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); - - // Вкладка "Пплагины" - QStringList tableColumnHeaders; - tableColumnHeaders << "Name" << "Version" << "Author" << "Autoload"; - pluginInfoTable->setColumnCount(4); - pluginInfoTable->setHorizontalHeaderLabels(tableColumnHeaders); - pluginInfoTable->verticalHeader()->hide(); - pluginInfoTable->setSelectionBehavior(QAbstractItemView::SelectRows); - pluginInfoTable->setEditTriggers (QAbstractItemView::NoEditTriggers); - pluginInfoTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); - pluginInfoTable->horizontalHeader()->setSectionResizeMode(0,QHeaderView::Stretch); - QObject::connect(buttonDeletePlugin, &QAbstractButton::clicked, this, &ViewPreferences::deletePlugin); - QObject::connect(buttonStartPlugin , &QAbstractButton::clicked, this, &ViewPreferences::onStartPlugin); - QObject::connect(buttonStopPlugin , &QAbstractButton::clicked, this, &ViewPreferences::onStopPlugin); - QObject::connect(pluginInfoTable->selectionModel(), - &QItemSelectionModel::selectionChanged, - this, - &ViewPreferences::updateButtonsState); - fillPluginInfoTable(); - updateButtonsState(); - - updateDialog(); - checkAllData(); + : QDialog(pParent, Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint) + , all_font_size(-1) + , all_font_name("") + , all_fg_color(0x00, 0x00, 0x00) + , all_bg_color(0xFF, 0xFF, 0xFF) + , null_font_style(StyleFont::Style::NONE) + , m_pPluginInfoList(g_pApp->getPluginLoader().getPluginInfoList()) +{ + setupUi(this); + + connect(buttonOk, SIGNAL(clicked()), this, SLOT(onOkButton())); + connect(buttonCancel, SIGNAL(clicked()), this, SLOT(onCancelButton())); + connect(buttonApply, SIGNAL(clicked()), this, SLOT(onApplyButton())); + + m_setup = g_pApp->getFileAssociationSetup(); + m_checkInFuture = g_pApp->getFileAssociationCheckInFuture(); + m_openLastProject = g_pApp->getOpenLastProject(); + m_showFullName = g_pApp->getShowCaptionFullName(); + + style_editor = g_pApp->getStyle()->style_editor; + style_build = g_pApp->getStyle()->style_build; + style_debug = g_pApp->getStyle()->style_debug; + style_trace = g_pApp->getStyle()->style_trace; + style_results = g_pApp->getStyle()->style_results; + style_find = g_pApp->getStyle()->style_find; + style_chart = g_pApp->getStyle()->style_chart; + style_frame = g_pApp->getStyle()->style_frame; + + fontComboBox->setEditable(false); + //Вкладка "Основные" + connect(setupCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onSetup(int))); + connect(checkInFutureCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onCheckInFuture(int))); + connect(openLastProjectCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onOpenLastProject(int))); + connect(showFullNameCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onShowFullName(int))); + //Вкладка "Редактор" + connect(checkBoxCodeCompUse, SIGNAL(stateChanged(int)), this, SLOT(onCodeCompUse(int))); + connect(radioButtonFullList, SIGNAL(toggled(bool)), this, SLOT(onCodeCompShowFullList(bool))); + connect(radioButtonNearestWords, SIGNAL(toggled(bool)), this, SLOT(onCodeCompShowFullList(bool))); + connect(checkBoxMarginFold, SIGNAL(stateChanged(int)), this, SLOT(onMarginFold(int))); + connect(checkBoxMarginBookmark, SIGNAL(stateChanged(int)), this, SLOT(onMarginBookmark(int))); + connect(checkBoxMarginLineNum, SIGNAL(stateChanged(int)), this, SLOT(onMarginLineNumber(int))); + //Вкладка "Табуляция" + tabSizeLineEdit->setValidator(new QIntValidator(1, 100, this)); + tabSizeLineEdit->setText(QString::number(style_editor.tab.tabSize)); + indentSizeLineEdit->setValidator(new QIntValidator(1, 100, this)); + indentSizeLineEdit->setText(QString::number(style_editor.tab.indentSize)); + connect(useTabSymbolCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onUseTabSymbol(int))); + connect(indentAsTabcheckBox, SIGNAL(stateChanged(int)), this, SLOT(onIndentAsTab(int))); + connect(autoIndentCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onAutoIndent(int))); + connect(eraseWithTabRadioButton, SIGNAL(toggled(bool)), this, SLOT(onEraseWithTab(bool))); + connect(tabSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onTabSize(const QString&))); + connect(indentSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onIndentSize(const QString&))); + //Вкладка "Стиль и цвет" + stackedWidget->setCurrentWidget(pageRoot); + + QPalette* palette = new QPalette(); + palette->setColor(QPalette::Foreground, Qt::gray); + previewStackedWidget->setPalette(*palette); + + createTree(); + createPreview(); + createStyles(); + + insertColors(fgColorComboBox); + insertColors(bgColorComboBox); + + switchPreviewComboBox->addItem("Editor", static_cast(ItemType::EDITOR)); + switchPreviewComboBox->addItem("Build", static_cast(ItemType::BUILD)); + switchPreviewComboBox->addItem("Debug", static_cast(ItemType::DEBUG)); + switchPreviewComboBox->addItem("Tracer", static_cast(ItemType::LOG)); + switchPreviewComboBox->addItem("Results", static_cast(ItemType::RESULT)); + switchPreviewComboBox->addItem("Find", static_cast(ItemType::FIND)); + switchPreviewComboBox->addItem("Chart", static_cast(ItemType::CHART)); + switchPreviewComboBox->addItem("Frame", static_cast(ItemType::FRAME)); + + bookmarkComboBox->addItem("Нет", QVariant::fromValue(EditStyle::Bookmark::NONE)); + bookmarkComboBox->addItem("Круг", QVariant::fromValue(EditStyle::Bookmark::CIRCLE)); + bookmarkComboBox->addItem("Прямоугольник", QVariant::fromValue(EditStyle::Bookmark::RECT)); + bookmarkComboBox->addItem("Овал", QVariant::fromValue(EditStyle::Bookmark::ROUNDRECT)); + bookmarkComboBox->addItem("Стрелка", QVariant::fromValue(EditStyle::Bookmark::ARROW)); + + foldComboBox->addItem("Нет", QVariant::fromValue(ModelStyle::Fold::NONE)); + foldComboBox->addItem("Плюс", QVariant::fromValue(ModelStyle::Fold::PLUS)); + foldComboBox->addItem("Плюс + линия", QVariant::fromValue(ModelStyle::Fold::PLUS_CONNECTED)); + foldComboBox->addItem("Стрелка", QVariant::fromValue(ModelStyle::Fold::ARROW)); + foldComboBox->addItem("Стрелка + линия", QVariant::fromValue(ModelStyle::Fold::ARROW_CONNECTED)); + foldComboBox->addItem("Квадрат + линия", QVariant::fromValue(ModelStyle::Fold::BOX_CONNECTED)); + foldComboBox->addItem("Круг + линия", QVariant::fromValue(ModelStyle::Fold::CIRCLE_CONNECTED)); + + boldCheckBox->setEnabled(false); + italicCheckBox->setEnabled(false); + underlineCheckBox->setEnabled(false); + + horzIndentLineEdit->setValidator(new QIntValidator(1, 100, this)); + horzIndentLineEdit->setText(QString::number(style_trace.borders.horzBorder)); + vertIndentLineEdit->setValidator(new QIntValidator(1, 100, this)); + vertIndentLineEdit->setText(QString::number(style_trace.borders.vertBorder)); + + tickWidthLineEdit->setValidator(new QIntValidator(1, 100, this)); + tickWidthLineEdit->setText(QString::number(style_chart.pFontsTicks.tickWidth)); + + connect(treeWidget, SIGNAL(itemClicked(QTreeWidgetItem*, int)), this, SLOT(onTreeWidgetItemActivated(QTreeWidgetItem*, int))); + connect(switchPreviewComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onSwitchPreviewComboBox(int))); + connect(fontSizeComboBox, SIGNAL(activated(int)), this, SLOT(onFontSize(int))); + connect(fontComboBox, SIGNAL(activated(int)), this, SLOT(onFontType(int))); + connect(boldCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onFontBold(int))); + connect(italicCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onFontItalic(int))); + connect(underlineCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onFontUnderline(int))); + connect(horzScrollEditorCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onHorzScroll(int))); + connect(horzScrollBuildCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onHorzScroll(int))); + connect(horzScrollDebugCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onHorzScroll(int))); + connect(horzScrollResultsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onHorzScroll(int))); + connect(horzScrollFindCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onHorzScroll(int))); + connect(wordWrapEditorCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onWordWrap(int))); + connect(wordWrapBuildCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onWordWrap(int))); + connect(wordWrapDebugCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onWordWrap(int))); + connect(wordWrapResultsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onWordWrap(int))); + connect(wordWrapFindCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onWordWrap(int))); + connect(bookmarkComboBox, SIGNAL(activated(int)), this, SLOT(onBookmark(int))); + connect(foldComboBox, SIGNAL(activated(int)), this, SLOT(onFold(int))); + connect(commentCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onComment(int))); + connect(warningCheckBox, SIGNAL(stateChanged(int)), this, SLOT(onWarning(int))); + connect(horzIndentLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onHorzIndent(const QString&))); + connect(vertIndentLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onVertIndent(const QString&))); + connect(fgColorComboBox, SIGNAL(activated(int)), this, SLOT(onFgColor(int))); + connect(bgColorComboBox, SIGNAL(activated(int)), this, SLOT(onBgColor(int))); + connect(fgColorToolButton, SIGNAL(clicked()), this, SLOT(onFgColorDialog())); + connect(bgColorToolButton, SIGNAL(clicked()), this, SLOT(onBgColorDialog())); + connect(titleComboBox, SIGNAL(activated(int)), this, SLOT(onTitleSize(int))); + connect(legendComboBox, SIGNAL(activated(int)), this, SLOT(onLegendSize(int))); + connect(tickWidthLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onTickWidth(const QString&))); + connect(themeComboBox, SIGNAL(activated(int)), this, SLOT(onThemeComboBox(int))); + + connect(tabSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); + connect(indentSizeLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); + connect(horzIndentLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); + connect(vertIndentLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); + connect(tickWidthLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(onCheckInput(const QString&))); + + // Вкладка "Пплагины" + QStringList tableColumnHeaders; + tableColumnHeaders << "Name" << "Version" << "Author" << "Autoload"; + pluginInfoTable->setColumnCount(4); + pluginInfoTable->setHorizontalHeaderLabels(tableColumnHeaders); + pluginInfoTable->verticalHeader()->hide(); + pluginInfoTable->setSelectionBehavior(QAbstractItemView::SelectRows); + pluginInfoTable->setEditTriggers (QAbstractItemView::NoEditTriggers); + pluginInfoTable->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); + pluginInfoTable->horizontalHeader()->setSectionResizeMode(0,QHeaderView::Stretch); + QObject::connect(buttonDeletePlugin, &QAbstractButton::clicked, this, &ViewPreferences::deletePlugin); + QObject::connect(buttonStartPlugin , &QAbstractButton::clicked, this, &ViewPreferences::onStartPlugin); + QObject::connect(buttonStopPlugin , &QAbstractButton::clicked, this, &ViewPreferences::onStopPlugin); + QObject::connect(pluginInfoTable->selectionModel(), + &QItemSelectionModel::selectionChanged, + this, + &ViewPreferences::updateButtonsState); + fillPluginInfoTable(); + updateButtonsState(); + + updateDialog(); + checkAllData(); } void ViewPreferences::onOkButton() { - apply(); - done(Accepted); + apply(); + done(Accepted); } void ViewPreferences::onCancelButton() { - done(Rejected); + done(Rejected); } void ViewPreferences::onApplyButton() { - apply(); - buttonApply->setEnabled(false); + apply(); + buttonApply->setEnabled(false); } void ViewPreferences::onCheckInput(const QString& /*text*/) { - bool check = tabSizeLineEdit->text().toInt() >= 1 && - indentSizeLineEdit->text().toInt() >= 1 && - horzIndentLineEdit->text().toInt() >= 1 && - vertIndentLineEdit->text().toInt() >= 1 && - tickWidthLineEdit->text().toInt() >= 1; - - buttonOk->setEnabled(check); - buttonApply->setEnabled(check); + bool check = tabSizeLineEdit->text().toInt() >= 1 && + indentSizeLineEdit->text().toInt() >= 1 && + horzIndentLineEdit->text().toInt() >= 1 && + vertIndentLineEdit->text().toInt() >= 1 && + tickWidthLineEdit->text().toInt() >= 1; + + buttonOk->setEnabled(check); + buttonApply->setEnabled(check); } void ViewPreferences::onCodeCompUse(int state) { - style_editor.autoComplete.useAutoComplete = state == Qt::Checked ? true : false; - - switch(state) - { - case 0: - radioButtonFullList->setEnabled(false); - radioButtonNearestWords->setEnabled(false); - break; - case 2: - radioButtonFullList->setEnabled(true); - radioButtonNearestWords->setEnabled(true); - break; - } - checkAllData(); + style_editor.autoComplete.useAutoComplete = state == Qt::Checked ? true : false; + + switch (state) + { + case 0: + radioButtonFullList->setEnabled(false); + radioButtonNearestWords->setEnabled(false); + break; + case 2: + radioButtonFullList->setEnabled(true); + radioButtonNearestWords->setEnabled(true); + break; + } + checkAllData(); } void ViewPreferences::onCodeCompShowFullList(bool /*state*/) { - if(radioButtonFullList->isChecked()) - style_editor.autoComplete.showFullList = true; - if(radioButtonNearestWords->isChecked()) - style_editor.autoComplete.showFullList = false; - checkAllData(); + if (radioButtonFullList->isChecked()) + style_editor.autoComplete.showFullList = true; + if (radioButtonNearestWords->isChecked()) + style_editor.autoComplete.showFullList = false; + checkAllData(); } void ViewPreferences::onMarginFold(int state) { - style_editor.margin.fold = state == Qt::Checked ? true : false; - checkAllData(); + style_editor.margin.fold = state == Qt::Checked ? true : false; + checkAllData(); } void ViewPreferences::onMarginBookmark(int state) { - style_editor.margin.bookmark = state == Qt::Checked ? true : false; - checkAllData(); + style_editor.margin.bookmark = state == Qt::Checked ? true : false; + checkAllData(); } void ViewPreferences::onMarginLineNumber(int state) { - style_editor.margin.lineNumber = state == Qt::Checked ? true : false; - checkAllData(); + style_editor.margin.lineNumber = state == Qt::Checked ? true : false; + checkAllData(); } void ViewPreferences::onUseTabSymbol(int state) { - style_editor.tab.useTabs = state == Qt::Checked ? true : false; - checkAllData(); + style_editor.tab.useTabs = state == Qt::Checked ? true : false; + checkAllData(); } void ViewPreferences::onIndentAsTab(int state) { - style_editor.tab.tabIndents = state == Qt::Checked ? true : false; - checkAllData(); + style_editor.tab.tabIndents = state == Qt::Checked ? true : false; + checkAllData(); } void ViewPreferences::onAutoIndent(int state) { - style_editor.tab.autoIndent = state == Qt::Checked ? true : false; - checkAllData(); + style_editor.tab.autoIndent = state == Qt::Checked ? true : false; + checkAllData(); } void ViewPreferences::onEraseWithTab(bool /*state*/) { - if(eraseWithTabRadioButton->isChecked()) - style_editor.tab.backspaceUntabs = true; - if(eraseWithIndentRadioButton->isChecked()) - style_editor.tab.backspaceUntabs = false; - checkAllData(); + if (eraseWithTabRadioButton->isChecked()) + style_editor.tab.backspaceUntabs = true; + if (eraseWithIndentRadioButton->isChecked()) + style_editor.tab.backspaceUntabs = false; + checkAllData(); } void ViewPreferences::onTabSize(const QString& text) { - style_editor.tab.tabSize = text.toInt(); - checkAllData(); + style_editor.tab.tabSize = text.toInt(); + checkAllData(); } void ViewPreferences::onIndentSize(const QString& text) { - style_editor.tab.indentSize = text.toInt(); - checkAllData(); + style_editor.tab.indentSize = text.toInt(); + checkAllData(); } void ViewPreferences::onSetup(int state) { - m_setup = state == Qt::Checked ? true : false; - checkAllData(); + m_setup = state == Qt::Checked ? true : false; + checkAllData(); } void ViewPreferences::onCheckInFuture(int state) { - m_checkInFuture = state == Qt::Checked ? true : false; - checkAllData(); + m_checkInFuture = state == Qt::Checked ? true : false; + checkAllData(); } void ViewPreferences::onOpenLastProject(int state) { - m_openLastProject = state == Qt::Checked ? true : false; - checkAllData(); + m_openLastProject = state == Qt::Checked ? true : false; + checkAllData(); } void ViewPreferences::onShowFullName(int state) { - m_showFullName = state == Qt::Checked ? true : false; - checkAllData(); + m_showFullName = state == Qt::Checked ? true : false; + checkAllData(); } void ViewPreferences::onTreeWidgetItemActivated(QTreeWidgetItem* item, int column) { - stackedWidget->setCurrentIndex(item->data(column, Qt::UserRole).toInt()); - if(item->data(column, Qt::UserRole).toInt() != 0) - { - switchPreviewComboBox->setCurrentIndex(item->data(column, Qt::UserRole).toInt() - 1); - } - previewStackedWidget->setCurrentIndex(getStyleItem()->type - 1); - - switch(item->data(column, Qt::UserRole).toInt()) - { - case IT_ROOT: - case IT_EDITOR_CARET: - case IT_EDITOR_TEXTSELECTION: - case IT_EDITOR_BOOKMARK: - case IT_EDITOR_FOLD: - case IT_EDITOR_ERROR: - case IT_BUILD_SELECTEDLINE: - case IT_CHART_CHART: - case IT_CHART_TIME: - boldCheckBox->setEnabled(false); - italicCheckBox->setEnabled(false); - underlineCheckBox->setEnabled(false); - break; - default: - boldCheckBox->setEnabled(true); - italicCheckBox->setEnabled(true); - underlineCheckBox->setEnabled(true); - } - - updateStyleTab(); + stackedWidget->setCurrentIndex(item->data(column, Qt::UserRole).toInt()); + if (item->data(column, Qt::UserRole).toInt() != 0) + switchPreviewComboBox->setCurrentIndex(item->data(column, Qt::UserRole).toInt() - 1); + + previewStackedWidget->setCurrentIndex(static_cast(getStyleItem()->type) - 1); + + switch (static_cast(item->data(column, Qt::UserRole).toInt())) + { + case ItemType::ROOT: + case ItemType::EDITOR_CARET: + case ItemType::EDITOR_TEXTSELECTION: + case ItemType::EDITOR_BOOKMARK: + case ItemType::EDITOR_FOLD: + case ItemType::EDITOR_ERROR: + case ItemType::BUILD_SELECTEDLINE: + case ItemType::CHART_CHART: + case ItemType::CHART_TIME: + boldCheckBox->setEnabled(false); + italicCheckBox->setEnabled(false); + underlineCheckBox->setEnabled(false); + break; + default: + boldCheckBox->setEnabled(true); + italicCheckBox->setEnabled(true); + underlineCheckBox->setEnabled(true); + } + + updateStyleTab(); } void ViewPreferences::onSwitchPreviewComboBox(int index) { - previewStackedWidget->setCurrentIndex(switchPreviewComboBox->itemData(index, Qt::UserRole).toInt() - 1); + previewStackedWidget->setCurrentIndex(switchPreviewComboBox->itemData(index, Qt::UserRole).toInt() - 1); } void ViewPreferences::onFontSize(int /*index*/) { - int size = fontSizeComboBox->currentText().toInt(); - switch(getStyleItem()->type) - { - case IT_ROOT: - all_font_size = size; - style_editor.font.size = size; - style_build.font.size = size; - style_debug.font.size = size; - style_trace.font.size = size; - style_results.font.size = size; - style_find.font.size = size; - style_chart.font.size = size; - style_frame.font.size = size; - break; - case IT_EDITOR: - style_editor.font.size = size; - break; - case IT_BUILD: - style_build.font.size = size; - break; - case IT_DEBUG: - style_debug.font.size = size; - break; - case IT_LOG: - style_trace.font.size = size; - break; - case IT_RESULT: - style_results.font.size = size; - break; - case IT_FIND: - style_find.font.size = size; - break; - case IT_CHART: - style_chart.font.size = size; - break; - case IT_FRAME: - style_frame.font.size = size; - break; - default: - break; - } - - updatePreview(); + int size = fontSizeComboBox->currentText().toInt(); + switch (getStyleItem()->type) + { + case ItemType::ROOT: + all_font_size = size; + style_editor.font.size = size; + style_build.font.size = size; + style_debug.font.size = size; + style_trace.font.size = size; + style_results.font.size = size; + style_find.font.size = size; + style_chart.font.size = size; + style_frame.font.size = size; + break; + case ItemType::EDITOR: + style_editor.font.size = size; + break; + case ItemType::BUILD: + style_build.font.size = size; + break; + case ItemType::DEBUG: + style_debug.font.size = size; + break; + case ItemType::LOG: + style_trace.font.size = size; + break; + case ItemType::RESULT: + style_results.font.size = size; + break; + case ItemType::FIND: + style_find.font.size = size; + break; + case ItemType::CHART: + style_chart.font.size = size; + break; + case ItemType::FRAME: + style_frame.font.size = size; + break; + default: + break; + } + + updatePreview(); } void ViewPreferences::onFontType(int /*index*/) { - std::string name = fontComboBox->currentFont().family().toStdString(); - - switch(getStyleItem()->type) - { - case IT_ROOT: - all_font_name = name; - style_editor.font.name = name; - style_build.font.name = name; - style_debug.font.name = name; - style_trace.font.name = name; - style_results.font.name = name; - style_find.font.name = name; - style_chart.font.name = name; - style_frame.font.name = name; - break; - case IT_EDITOR: - style_editor.font.name = name; - break; - case IT_BUILD: - style_build.font.name = name; - break; - case IT_DEBUG: - style_debug.font.name = name; - break; - case IT_LOG: - style_trace.font.name = name; - break; - case IT_RESULT: - style_results.font.name = name; - break; - case IT_FIND: - style_find.font.name = name; - break; - case IT_CHART: - style_chart.font.name = name; - break; - case IT_FRAME: - style_frame.font.name = name; - break; - default: - break; - } - - updatePreview(); + std::string name = fontComboBox->currentFont().family().toStdString(); + + switch (getStyleItem()->type) + { + case ItemType::ROOT: + all_font_name = name; + style_editor.font.name = name; + style_build.font.name = name; + style_debug.font.name = name; + style_trace.font.name = name; + style_results.font.name = name; + style_find.font.name = name; + style_chart.font.name = name; + style_frame.font.name = name; + break; + case ItemType::EDITOR: + style_editor.font.name = name; + break; + case ItemType::BUILD: + style_build.font.name = name; + break; + case ItemType::DEBUG: + style_debug.font.name = name; + break; + case ItemType::LOG: + style_trace.font.name = name; + break; + case ItemType::RESULT: + style_results.font.name = name; + break; + case ItemType::FIND: + style_find.font.name = name; + break; + case ItemType::CHART: + style_chart.font.name = name; + break; + case ItemType::FRAME: + style_frame.font.name = name; + break; + default: + break; + } + + updatePreview(); } void ViewPreferences::onFontBold(int state) { - StyleProperty* prop = getStyleProperty(); - if (prop && &prop->font_style != &null_font_style) - { - prop->font_style = static_cast(prop->font_style & ~StyleFont::BOLD); - if (state) - { - prop->font_style = static_cast(prop->font_style | StyleFont::BOLD); - } - updatePreview(); - } + StyleProperty* prop = getStyleProperty(); + if (prop && &prop->font_style != &null_font_style) + { + prop->font_style = static_cast(static_cast(prop->font_style) & ~static_cast(StyleFont::Style::BOLD)); + if (state) + { + prop->font_style = static_cast(static_cast(prop->font_style) | static_cast(StyleFont::Style::BOLD)); + } + updatePreview(); + } } void ViewPreferences::onFontItalic(int state) { - StyleProperty* prop = getStyleProperty(); - if (prop && &prop->font_style != &null_font_style) - { - prop->font_style = static_cast(prop->font_style & ~StyleFont::ITALIC); - if (state) - { - prop->font_style = static_cast(prop->font_style | StyleFont::ITALIC); - } - updatePreview(); - } + StyleProperty* prop = getStyleProperty(); + if (prop && &prop->font_style != &null_font_style) + { + prop->font_style = static_cast(static_cast(prop->font_style) & ~static_cast(StyleFont::Style::ITALIC)); + if (state) + { + prop->font_style = static_cast(static_cast(prop->font_style) | static_cast(StyleFont::Style::ITALIC)); + } + updatePreview(); + } } void ViewPreferences::onFontUnderline(int state) { - StyleProperty* prop = getStyleProperty(); - if (prop && &prop->font_style != &null_font_style) - { - prop->font_style = static_cast(prop->font_style & ~StyleFont::UNDERLINE); - if (state) - { - prop->font_style = static_cast(prop->font_style | StyleFont::UNDERLINE); - } - updatePreview(); - } + StyleProperty* prop = getStyleProperty(); + if (prop && &prop->font_style != &null_font_style) + { + prop->font_style = static_cast(static_cast(prop->font_style) & ~static_cast(StyleFont::Style::UNDERLINE)); + if (state) + { + prop->font_style = static_cast(static_cast(prop->font_style) | static_cast(StyleFont::Style::UNDERLINE)); + } + updatePreview(); + } } void ViewPreferences::onHorzScroll(int state) { - StyleItem* item = getStyleItem(); - item->horzscrollbar = state == Qt::Checked ? true : false; - updatePreview(); + StyleItem* item = getStyleItem(); + item->horzscrollbar = state == Qt::Checked ? true : false; + updatePreview(); } void ViewPreferences::onWordWrap(int state) { - StyleItem* item = getStyleItem(); - item->wordwrap = state == Qt::Checked ? true : false; - - switch(item->type) - { - case IT_EDITOR: - horzScrollEditorCheckBox->setEnabled(state ? false : true); - break; - case IT_BUILD: - horzScrollBuildCheckBox->setEnabled(state ? false : true); - break; - case IT_DEBUG: - horzScrollDebugCheckBox->setEnabled(state ? false : true); - break; - case IT_RESULT: - horzScrollResultsCheckBox->setEnabled(state ? false : true); - break; - case IT_FIND: - horzScrollFindCheckBox->setEnabled(state ? false : true); - break; - default: - break; - } - if(state) - { - item->horzscrollbar = false; - } - else - { - switch(item->type) - { - case IT_EDITOR: - item->horzscrollbar = horzScrollEditorCheckBox->checkState() == Qt::Checked ? true : false; - break; - case IT_BUILD: - item->horzscrollbar = horzScrollBuildCheckBox->checkState() == Qt::Checked ? true : false; - break; - case IT_DEBUG: - item->horzscrollbar = horzScrollDebugCheckBox->checkState() == Qt::Checked ? true : false; - break; - case IT_RESULT: - item->horzscrollbar = horzScrollResultsCheckBox->checkState() == Qt::Checked ? true : false; - break; - case IT_FIND: - item->horzscrollbar = horzScrollFindCheckBox->checkState() == Qt::Checked ? true : false; - break; - default: - break; - } - } - updatePreview(); -} - -void ViewPreferences::onBookmark(int index) -{ - StyleItem* item = getStyleItem(); - item->bookmarkstyle = static_cast(index); - updatePreview(); -} - -void ViewPreferences::onFold(int index) -{ - StyleItem* item = getStyleItem(); - item->foldstyle = static_cast(index); - updatePreview(); + StyleItem* item = getStyleItem(); + item->wordwrap = state == Qt::Checked ? true : false; + + switch (item->type) + { + case ItemType::EDITOR: + horzScrollEditorCheckBox->setEnabled(state ? false : true); + break; + case ItemType::BUILD: + horzScrollBuildCheckBox->setEnabled(state ? false : true); + break; + case ItemType::DEBUG: + horzScrollDebugCheckBox->setEnabled(state ? false : true); + break; + case ItemType::RESULT: + horzScrollResultsCheckBox->setEnabled(state ? false : true); + break; + case ItemType::FIND: + horzScrollFindCheckBox->setEnabled(state ? false : true); + break; + default: + break; + } + if (state) + { + item->horzscrollbar = false; + } + else + { + switch (item->type) + { + case ItemType::EDITOR: + item->horzscrollbar = horzScrollEditorCheckBox->checkState() == Qt::Checked ? true : false; + break; + case ItemType::BUILD: + item->horzscrollbar = horzScrollBuildCheckBox->checkState() == Qt::Checked ? true : false; + break; + case ItemType::DEBUG: + item->horzscrollbar = horzScrollDebugCheckBox->checkState() == Qt::Checked ? true : false; + break; + case ItemType::RESULT: + item->horzscrollbar = horzScrollResultsCheckBox->checkState() == Qt::Checked ? true : false; + break; + case ItemType::FIND: + item->horzscrollbar = horzScrollFindCheckBox->checkState() == Qt::Checked ? true : false; + break; + default: + break; + } + } + updatePreview(); +} + +void ViewPreferences::onBookmark(int /*index*/) +{ + StyleItem* item = getStyleItem(); + item->bookmarkstyle = bookmarkComboBox->currentData().value(); + updatePreview(); +} + +void ViewPreferences::onFold(int /*index*/) +{ + StyleItem* item = getStyleItem(); + item->foldstyle = foldComboBox->currentData().value(); + updatePreview(); } void ViewPreferences::onComment(int state) { - StyleItem* item = getStyleItem(); - item->commentfold = state ? true : false; - updatePreview(); + StyleItem* item = getStyleItem(); + item->commentfold = state ? true : false; + updatePreview(); } void ViewPreferences::onWarning(int state) { - StyleItem* item = getStyleItem(); - item->warning = state ? true : false; - updatePreview(); + StyleItem* item = getStyleItem(); + item->warning = state ? true : false; + updatePreview(); } void ViewPreferences::onHorzIndent(const QString& text) { - style_trace.borders.horzBorder = text.toInt(); - updatePreview(); + style_trace.borders.horzBorder = text.toInt(); + updatePreview(); } void ViewPreferences::onVertIndent(const QString& text) { - style_trace.borders.vertBorder = text.toInt(); - updatePreview(); + style_trace.borders.vertBorder = text.toInt(); + updatePreview(); } void ViewPreferences::onFgColor(int index) { - QColor color = qvariant_cast(fgColorComboBox->itemData(index, Qt::UserRole)); - StyleProperty* prop = getStyleProperty(); - if (&prop->fg_color != &null_fg_color) - { - prop->fg_color = color; - if (&prop->fg_color == &all_fg_color) - { - StyleItemList::const_iterator it = style_list.begin(); - if (it != style_list.end()) - { - ++it; - while (it != style_list.end()) - { - PropertyList::const_iterator it_prop = (*it)->properties.begin(); - if (it_prop != (*it)->properties.end()) - { - (*it_prop)->fg_color = all_fg_color; - } - ++it; - } - } - } - updatePreview(); - } + QColor color = qvariant_cast(fgColorComboBox->itemData(index, Qt::UserRole)); + StyleProperty* prop = getStyleProperty(); + if (&prop->fg_color != &null_fg_color) + { + prop->fg_color = color; + if (&prop->fg_color == &all_fg_color) + { + StyleItemList::const_iterator it = style_list.begin(); + if (it != style_list.end()) + { + ++it; + while (it != style_list.end()) + { + PropertyList::const_iterator it_prop = (*it)->properties.begin(); + if (it_prop != (*it)->properties.end()) + { + (*it_prop)->fg_color = all_fg_color; + } + ++it; + } + } + } + updatePreview(); + } } void ViewPreferences::onBgColor(int index) { - QColor color = qvariant_cast(bgColorComboBox->itemData(index, Qt::UserRole)); - StyleProperty* prop = getStyleProperty(); - if (&prop->bg_color != &null_bg_color) - { - prop->bg_color = color; - if (&prop->bg_color == &all_bg_color) - { - StyleItemList::const_iterator it = style_list.begin(); - if (it != style_list.end()) - { - ++it; - while (it != style_list.end()) - { - PropertyList::const_iterator it_prop = (*it)->properties.begin(); - if (it_prop != (*it)->properties.end()) - { - (*it_prop)->bg_color = all_bg_color; - } - ++it; - } - } - } - updatePreview(); - } + QColor color = qvariant_cast(bgColorComboBox->itemData(index, Qt::UserRole)); + StyleProperty* prop = getStyleProperty(); + if (&prop->bg_color != &null_bg_color) + { + prop->bg_color = color; + if (&prop->bg_color == &all_bg_color) + { + StyleItemList::const_iterator it = style_list.begin(); + if (it != style_list.end()) + { + ++it; + while (it != style_list.end()) + { + PropertyList::const_iterator it_prop = (*it)->properties.begin(); + if (it_prop != (*it)->properties.end()) + { + (*it_prop)->bg_color = all_bg_color; + } + ++it; + } + } + } + updatePreview(); + } } void ViewPreferences::onFgColorDialog() { - QColor color = fgColorComboBox->itemData(fgColorComboBox->currentIndex(), Qt::UserRole).value(); - fgColorDlg = new QColorDialog(color, this); - connect(fgColorDlg, SIGNAL(colorSelected(const QColor&)), this, SLOT(onFgColorSelected(const QColor&))); - fgColorDlg->exec(); + QColor color = fgColorComboBox->itemData(fgColorComboBox->currentIndex(), Qt::UserRole).value(); + fgColorDlg = new QColorDialog(color, this); + connect(fgColorDlg, SIGNAL(colorSelected(const QColor&)), this, SLOT(onFgColorSelected(const QColor&))); + fgColorDlg->exec(); } void ViewPreferences::onBgColorDialog() { - QColor color = bgColorComboBox->itemData(bgColorComboBox->currentIndex(), Qt::UserRole).value(); - bgColorDlg = new QColorDialog(color, this); - connect(bgColorDlg, SIGNAL(colorSelected(const QColor&)), this, SLOT(onBgColorSelected(const QColor&))); - bgColorDlg->exec(); + QColor color = bgColorComboBox->itemData(bgColorComboBox->currentIndex(), Qt::UserRole).value(); + bgColorDlg = new QColorDialog(color, this); + connect(bgColorDlg, SIGNAL(colorSelected(const QColor&)), this, SLOT(onBgColorSelected(const QColor&))); + bgColorDlg->exec(); } void ViewPreferences::onFgColorSelected(const QColor& color) { - if(fgColorComboBox->findData(color, Qt::UserRole) == -1) - { - insertColor(color, QString("[%1, %2, %3]").arg(color.red()).arg(color.green()).arg(color.blue()), fgColorComboBox); - } - fgColorComboBox->setCurrentIndex(fgColorComboBox->findData(color, Qt::UserRole)); - onFgColor(fgColorComboBox->findData(color, Qt::UserRole)); + if (fgColorComboBox->findData(color, Qt::UserRole) == -1) + { + insertColor(color, QString("[%1, %2, %3]").arg(color.red()).arg(color.green()).arg(color.blue()), fgColorComboBox); + } + fgColorComboBox->setCurrentIndex(fgColorComboBox->findData(color, Qt::UserRole)); + onFgColor(fgColorComboBox->findData(color, Qt::UserRole)); } void ViewPreferences::onBgColorSelected(const QColor& color) { - if(bgColorComboBox->findData(color, Qt::UserRole) == -1) - { - insertColor(color, QString("[%1, %2, %3]").arg(color.red()).arg(color.green()).arg(color.blue()), bgColorComboBox); - } - bgColorComboBox->setCurrentIndex(bgColorComboBox->findData(color, Qt::UserRole)); - onBgColor(bgColorComboBox->findData(color, Qt::UserRole)); + if (bgColorComboBox->findData(color, Qt::UserRole) == -1) + { + insertColor(color, QString("[%1, %2, %3]").arg(color.red()).arg(color.green()).arg(color.blue()), bgColorComboBox); + } + bgColorComboBox->setCurrentIndex(bgColorComboBox->findData(color, Qt::UserRole)); + onBgColor(bgColorComboBox->findData(color, Qt::UserRole)); } void ViewPreferences::onTitleSize(int /*index*/) { - style_chart.pFontsTicks.titleFontSize = titleComboBox->currentText().toInt(); - updatePreview(); + style_chart.pFontsTicks.titleFontSize = titleComboBox->currentText().toInt(); + updatePreview(); } void ViewPreferences::onLegendSize(int /*index*/) { - style_chart.pFontsTicks.legendFontSize = legendComboBox->currentText().toInt(); - updatePreview(); + style_chart.pFontsTicks.legendFontSize = legendComboBox->currentText().toInt(); + updatePreview(); } void ViewPreferences::onTickWidth(const QString& text) { - style_chart.pFontsTicks.tickWidth = text.toInt(); - updatePreview(); -} - -void ViewPreferences::onThemeComboBox(int index) -{ - switch (getStyleProperty()->item->type) - { - case IT_ROOT: - if (index == 1) { - style_editor = ModelStyle::getDefaultStyle(); - style_build = BuildStyle::getDefaultStyle(); - style_debug = EditStyle::getDefaultStyle(); - style_trace = rdo::gui::tracer::LogStyle::getDefaultStyle(); - style_results = ResultsStyle::getDefaultStyle(); - style_find = FindStyle::getDefaultStyle(); - style_chart = ChartViewStyle::getDefaultStyle(); - style_frame = FrameStyle::getDefaultStyle(); - style_editor.font = StyleFont::getDefaultFont(); - style_build.font = StyleFont::getDefaultFont(); - style_debug.font = StyleFont::getDefaultFont(); - style_trace.font = StyleFont::getTracerLogFont(); - style_results.font = StyleFont::getDefaultFont(); - style_find.font = StyleFont::getDefaultFont(); - style_chart.font = StyleFont::getChartViewFont(); - style_frame.font = StyleFont::getFrameFont(); - } - break; - case IT_EDITOR: - switch (index) - { - case 1: style_editor = ModelStyle::getDefaultStyle(); style_editor.font = StyleFont::getDefaultFont(); break; - case 2: style_editor = ModelStyle::getCppStyle(); style_editor.font = StyleFont::getDefaultFont(); break; - case 3: style_editor = ModelStyle::getPascalStyle(); style_editor.font = StyleFont::getDefaultFont(); break; - case 4: style_editor = ModelStyle::getHtmlStyle(); style_editor.font = StyleFont::getDefaultFont(); break; - case 5: style_editor = ModelStyle::getClassicStyle(); style_editor.font = StyleFont::getClassicFont(); break; - case 6: style_editor = ModelStyle::getTwilightStyle(); style_editor.font = StyleFont::getDefaultFont(); break; - case 7: style_editor = ModelStyle::getOceanStyle(); style_editor.font = StyleFont::getDefaultFont(); break; - } - break; - case IT_BUILD: - switch (index) - { - case 1: style_build = BuildStyle::getDefaultStyle(); style_build.font = StyleFont::getDefaultFont(); break; - case 2: style_build = BuildStyle::getClassicStyle(); style_build.font = StyleFont::getClassicFont(); break; - case 3: style_build = BuildStyle::getTwilightStyle(); style_build.font = StyleFont::getDefaultFont(); break; - case 4: style_build = BuildStyle::getOceanStyle(); style_build.font = StyleFont::getDefaultFont(); break; - } - break; - case IT_DEBUG: - switch (index) - { - case 1: style_debug = EditStyle::getDefaultStyle(); style_debug.font = StyleFont::getDefaultFont(); break; - case 2: style_debug = EditStyle::getClassicStyle(); style_debug.font = StyleFont::getClassicFont(); break; - case 3: style_debug = EditStyle::getTwilightStyle(); style_debug.font = StyleFont::getDefaultFont(); break; - case 4: style_debug = EditStyle::getOceanStyle(); style_debug.font = StyleFont::getDefaultFont(); break; - } - break; - case IT_LOG: - switch (index) - { - case 1: style_trace = rdo::gui::tracer::LogStyle::getDefaultStyle(); style_trace.font = StyleFont::getTracerLogFont(); break; - } - break; - case IT_RESULT: - switch (index) - { - case 1: style_results = ResultsStyle::getDefaultStyle(); style_results.font = StyleFont::getDefaultFont(); break; - case 2: style_results = ResultsStyle::getCppStyle(); style_results.font = StyleFont::getDefaultFont(); break; - case 3: style_results = ResultsStyle::getPascalStyle(); style_results.font = StyleFont::getDefaultFont(); break; - case 4: style_results = ResultsStyle::getHtmlStyle(); style_results.font = StyleFont::getDefaultFont(); break; - case 5: style_results = ResultsStyle::getClassicStyle(); style_results.font = StyleFont::getClassicFont(); break; - case 6: style_results = ResultsStyle::getTwilightStyle(); style_results.font = StyleFont::getDefaultFont(); break; - case 7: style_results = ResultsStyle::getOceanStyle(); style_results.font = StyleFont::getDefaultFont(); break; - } - break; - case IT_FIND: - switch (index) - { - case 1: style_find = FindStyle::getDefaultStyle(); style_find.font = StyleFont::getDefaultFont(); break; - case 2: style_find = FindStyle::getClassicStyle(); style_find.font = StyleFont::getClassicFont(); break; - case 3: style_find = FindStyle::getTwilightStyle(); style_find.font = StyleFont::getDefaultFont(); break; - case 4: style_find = FindStyle::getOceanStyle(); style_find.font = StyleFont::getDefaultFont(); break; - } - break; - case IT_CHART: - switch (index) - { - case 1: style_chart = ChartViewStyle::getDefaultStyle(); style_chart.font = StyleFont::getChartViewFont(); break; - } - break; - case IT_FRAME: - switch (index) - { - case 1: style_frame = FrameStyle::getDefaultStyle(); style_frame.font = StyleFont::getFrameFont(); break; - } - break; - default: - break; - } - updatePreview(); + style_chart.pFontsTicks.tickWidth = text.toInt(); + updatePreview(); +} + +void ViewPreferences::onThemeComboBox(int /*index*/) +{ + const auto currentStyleType = themeComboBox->currentData().value(); + if (currentStyleType == StyleType::CURRENT) + return; + + switch (getStyleProperty()->item->type) + { + case ItemType::ROOT: + switch (currentStyleType) + { + case StyleType::DEFAULT: + style_editor = ModelStyle::getDefaultStyle(); + style_build = BuildStyle::getDefaultStyle(); + style_debug = EditStyle::getDefaultStyle(); + style_trace = rdo::gui::tracer::LogStyle::getDefaultStyle(); + style_results = ResultsStyle::getDefaultStyle(); + style_find = FindStyle::getDefaultStyle(); + style_chart = ChartViewStyle::getDefaultStyle(); + style_frame = FrameStyle::getDefaultStyle(); + style_editor.font = StyleFont::getDefaultFont(); + style_build.font = StyleFont::getDefaultFont(); + style_debug.font = StyleFont::getDefaultFont(); + style_trace.font = StyleFont::getTracerLogFont(); + style_results.font = StyleFont::getDefaultFont(); + style_find.font = StyleFont::getDefaultFont(); + style_chart.font = StyleFont::getChartViewFont(); + style_frame.font = StyleFont::getFrameFont(); + break; + default: + throw std::runtime_error("Unexpected style type"); + } + break; + + case ItemType::EDITOR: + switch (currentStyleType) + { + case StyleType::DEFAULT: + style_editor = ModelStyle::getDefaultStyle(); + style_editor.font = StyleFont::getDefaultFont(); + break; + case StyleType::CPP: + style_editor = ModelStyle::getCppStyle(); + style_editor.font = StyleFont::getDefaultFont(); + break; + case StyleType::PASCAL_STYLE: + style_editor = ModelStyle::getPascalStyle(); + style_editor.font = StyleFont::getDefaultFont(); + break; + case StyleType::HTML: + style_editor = ModelStyle::getHtmlStyle(); + style_editor.font = StyleFont::getDefaultFont(); + break; + case StyleType::CLASSIC: + style_editor = ModelStyle::getClassicStyle(); + style_editor.font = StyleFont::getClassicFont(); + break; + case StyleType::TWILIGHT: + style_editor = ModelStyle::getTwilightStyle(); + style_editor.font = StyleFont::getDefaultFont(); + break; + case StyleType::OCEAN: + style_editor = ModelStyle::getOceanStyle(); + style_editor.font = StyleFont::getDefaultFont(); + break; + default: + throw std::runtime_error("Unexpected style type"); + } + break; + + case ItemType::BUILD: + switch (currentStyleType) + { + case StyleType::DEFAULT: + style_build = BuildStyle::getDefaultStyle(); + style_build.font = StyleFont::getDefaultFont(); + break; + case StyleType::CLASSIC: + style_build = BuildStyle::getClassicStyle(); + style_build.font = StyleFont::getClassicFont(); + break; + case StyleType::TWILIGHT: + style_build = BuildStyle::getTwilightStyle(); + style_build.font = StyleFont::getDefaultFont(); + break; + case StyleType::OCEAN: + style_build = BuildStyle::getOceanStyle(); + style_build.font = StyleFont::getDefaultFont(); + break; + default: + throw std::runtime_error("Unexpected style type"); + } + break; + + case ItemType::DEBUG: + switch (currentStyleType) + { + case StyleType::DEFAULT: + style_debug = EditStyle::getDefaultStyle(); + style_debug.font = StyleFont::getDefaultFont(); + break; + case StyleType::CLASSIC: + style_debug = EditStyle::getClassicStyle(); + style_debug.font = StyleFont::getClassicFont(); + break; + case StyleType::TWILIGHT: + style_debug = EditStyle::getTwilightStyle(); + style_debug.font = StyleFont::getDefaultFont(); + break; + case StyleType::OCEAN: + style_debug = EditStyle::getOceanStyle(); + style_debug.font = StyleFont::getDefaultFont(); + break; + default: + throw std::runtime_error("Unexpected style type"); + } + break; + + case ItemType::LOG: + switch (currentStyleType) + { + case StyleType::DEFAULT: + style_trace = rdo::gui::tracer::LogStyle::getDefaultStyle(); + style_trace.font = StyleFont::getTracerLogFont(); + break; + default: + throw std::runtime_error("Unexpected style type"); + } + break; + + case ItemType::RESULT: + switch (currentStyleType) + { + case StyleType::DEFAULT: + style_results = ResultsStyle::getDefaultStyle(); + style_results.font = StyleFont::getDefaultFont(); + break; + case StyleType::CPP: + style_results = ResultsStyle::getCppStyle(); + style_results.font = StyleFont::getDefaultFont(); + break; + case StyleType::PASCAL_STYLE: + style_results = ResultsStyle::getPascalStyle(); + style_results.font = StyleFont::getDefaultFont(); + break; + case StyleType::HTML: + style_results = ResultsStyle::getHtmlStyle(); + style_results.font = StyleFont::getDefaultFont(); + break; + case StyleType::CLASSIC: + style_results = ResultsStyle::getClassicStyle(); + style_results.font = StyleFont::getClassicFont(); + break; + case StyleType::TWILIGHT: + style_results = ResultsStyle::getTwilightStyle(); + style_results.font = StyleFont::getDefaultFont(); + break; + case StyleType::OCEAN: + style_results = ResultsStyle::getOceanStyle(); + style_results.font = StyleFont::getDefaultFont(); + break; + default: + throw std::runtime_error("Unexpected style type"); + } + break; + + case ItemType::FIND: + switch (currentStyleType) + { + case StyleType::DEFAULT: + style_find = FindStyle::getDefaultStyle(); + style_find.font = StyleFont::getDefaultFont(); + break; + case StyleType::CLASSIC: + style_find = FindStyle::getClassicStyle(); + style_find.font = StyleFont::getClassicFont(); + break; + case StyleType::TWILIGHT: + style_find = FindStyle::getTwilightStyle(); + style_find.font = StyleFont::getDefaultFont(); + break; + case StyleType::OCEAN: + style_find = FindStyle::getOceanStyle(); + style_find.font = StyleFont::getDefaultFont(); + break; + default: + throw std::runtime_error("Unexpected style type"); + } + break; + + case ItemType::CHART: + switch (currentStyleType) + { + case StyleType::DEFAULT: + style_chart = ChartViewStyle::getDefaultStyle(); + style_chart.font = StyleFont::getChartViewFont(); + break; + default: + throw std::runtime_error("Unexpected style type"); + } + break; + + case ItemType::FRAME: + switch (currentStyleType) + { + case StyleType::DEFAULT: + style_frame = FrameStyle::getDefaultStyle(); + style_frame.font = StyleFont::getFrameFont(); + break; + default: + throw std::runtime_error("Unexpected style type"); + } + break; + + default: + break; + } + updatePreview(); } void ViewPreferences::updateTheme() { - switch (getStyleProperty()->item->type) - { - case IT_ROOT: - if ( style_editor == ModelStyle::getDefaultStyle() && - style_build == BuildStyle::getDefaultStyle() && - style_debug == EditStyle::getDefaultStyle() && - style_trace == rdo::gui::tracer::LogStyle::getDefaultStyle() && - style_results == ResultsStyle::getDefaultStyle() && - style_find == FindStyle::getDefaultStyle() && - style_chart == ChartViewStyle::getDefaultStyle() && - style_frame == FrameStyle::getDefaultStyle() && - style_editor.font == StyleFont::getDefaultFont() && - style_build.font == StyleFont::getDefaultFont() && - style_debug.font == StyleFont::getDefaultFont() && - style_trace.font == StyleFont::getTracerLogFont() && - style_results.font == StyleFont::getDefaultFont() && - style_find.font == StyleFont::getDefaultFont() && - style_chart.font == StyleFont::getChartViewFont() && - style_frame.font == StyleFont::getFrameFont()) { - themeComboBox->setCurrentIndex(1); - } else { - themeComboBox->setCurrentIndex(0); - } - break; - case IT_EDITOR: - if ( style_editor == ModelStyle::getDefaultStyle() && style_editor.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(1); - } else if ( style_editor == ModelStyle::getCppStyle() && style_editor.font == StyleFont::getDefaultFont() ) { - themeComboBox->setCurrentIndex(2); - } else if ( style_editor == ModelStyle::getPascalStyle() && style_editor.font == StyleFont::getDefaultFont() ) { - themeComboBox->setCurrentIndex(3); - } else if ( style_editor == ModelStyle::getHtmlStyle() && style_editor.font == StyleFont::getDefaultFont() ) { - themeComboBox->setCurrentIndex(4); - } else if ( style_editor == ModelStyle::getClassicStyle() && style_editor.font == StyleFont::getClassicFont() ) { - themeComboBox->setCurrentIndex(5); - } else if ( style_editor == ModelStyle::getTwilightStyle() && style_editor.font == StyleFont::getDefaultFont() ) { - themeComboBox->setCurrentIndex(6); - } else if ( style_editor == ModelStyle::getOceanStyle() && style_editor.font == StyleFont::getDefaultFont() ) { - themeComboBox->setCurrentIndex(7); - } else { - themeComboBox->setCurrentIndex(0); - } - break; - case IT_BUILD: - if ( style_build == BuildStyle::getDefaultStyle() && style_build.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(1); - } else if ( style_build == BuildStyle::getClassicStyle() && style_build.font == StyleFont::getClassicFont()) { - themeComboBox->setCurrentIndex(2); - } else if ( style_build == BuildStyle::getTwilightStyle() && style_build.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(3); - } else if ( style_build == BuildStyle::getOceanStyle() && style_build.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(4); - } else { - themeComboBox->setCurrentIndex(0); - } - break; - case IT_DEBUG: - if ( style_debug == EditStyle::getDefaultStyle() && style_debug.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(1); - } else if ( style_debug == EditStyle::getClassicStyle() && style_debug.font == StyleFont::getClassicFont()) { - themeComboBox->setCurrentIndex(2); - } else if ( style_debug == EditStyle::getTwilightStyle() && style_debug.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(3); - } else if ( style_debug == EditStyle::getOceanStyle() && style_debug.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(4); - } else { - themeComboBox->setCurrentIndex(0); - } - break; - case IT_LOG: - if ( style_trace == rdo::gui::tracer::LogStyle::getDefaultStyle() && style_trace.font == StyleFont::getTracerLogFont()) { - themeComboBox->setCurrentIndex(1); - } else { - themeComboBox->setCurrentIndex(0); - } - break; - case IT_RESULT: - if ( style_results == ResultsStyle::getDefaultStyle() && style_results.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(1); - } else if ( style_results == ResultsStyle::getCppStyle() && style_results.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(2); - } else if ( style_results == ResultsStyle::getPascalStyle() && style_results.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(3); - } else if ( style_results == ResultsStyle::getHtmlStyle() && style_results.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(4); - } else if ( style_results == ResultsStyle::getClassicStyle() && style_results.font == StyleFont::getClassicFont()) { - themeComboBox->setCurrentIndex(5); - } else if ( style_results == ResultsStyle::getTwilightStyle() && style_results.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(6); - } else if ( style_results == ResultsStyle::getOceanStyle() && style_results.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(7); - } else { - themeComboBox->setCurrentIndex(0); - } - break; - case IT_FIND: - if ( style_find == FindStyle::getDefaultStyle() && style_find.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(1); - } else if ( style_find == FindStyle::getClassicStyle() && style_find.font == StyleFont::getClassicFont()) { - themeComboBox->setCurrentIndex(2); - } else if ( style_find == FindStyle::getTwilightStyle() && style_find.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(3); - } else if ( style_find == FindStyle::getOceanStyle() && style_find.font == StyleFont::getDefaultFont()) { - themeComboBox->setCurrentIndex(4); - } else { - themeComboBox->setCurrentIndex(0); - } - break; - case IT_CHART: - if ( style_chart == ChartViewStyle::getDefaultStyle() && style_chart.font == StyleFont::getChartViewFont()) { - themeComboBox->setCurrentIndex(1); - } else { - themeComboBox->setCurrentIndex(0); - } - break; - case IT_FRAME: - if ( style_frame == FrameStyle::getDefaultStyle() && style_frame.font == StyleFont::getFrameFont()) { - themeComboBox->setCurrentIndex(1); - } else { - themeComboBox->setCurrentIndex(0); - } - break; - default: - break; - } + switch (getStyleProperty()->item->type) + { + case ItemType::ROOT: + if ( style_editor == ModelStyle::getDefaultStyle() && + style_build == BuildStyle::getDefaultStyle() && + style_debug == EditStyle::getDefaultStyle() && + style_trace == rdo::gui::tracer::LogStyle::getDefaultStyle() && + style_results == ResultsStyle::getDefaultStyle() && + style_find == FindStyle::getDefaultStyle() && + style_chart == ChartViewStyle::getDefaultStyle() && + style_frame == FrameStyle::getDefaultStyle() && + style_editor.font == StyleFont::getDefaultFont() && + style_build.font == StyleFont::getDefaultFont() && + style_debug.font == StyleFont::getDefaultFont() && + style_trace.font == StyleFont::getTracerLogFont() && + style_results.font == StyleFont::getDefaultFont() && + style_find.font == StyleFont::getDefaultFont() && + style_chart.font == StyleFont::getChartViewFont() && + style_frame.font == StyleFont::getFrameFont()) { + themeComboBox->setCurrentIndex(1); + } else { + themeComboBox->setCurrentIndex(0); + } + break; + case ItemType::EDITOR: + if ( style_editor == ModelStyle::getDefaultStyle() && style_editor.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(1); + } else if ( style_editor == ModelStyle::getCppStyle() && style_editor.font == StyleFont::getDefaultFont() ) { + themeComboBox->setCurrentIndex(2); + } else if ( style_editor == ModelStyle::getPascalStyle() && style_editor.font == StyleFont::getDefaultFont() ) { + themeComboBox->setCurrentIndex(3); + } else if ( style_editor == ModelStyle::getHtmlStyle() && style_editor.font == StyleFont::getDefaultFont() ) { + themeComboBox->setCurrentIndex(4); + } else if ( style_editor == ModelStyle::getClassicStyle() && style_editor.font == StyleFont::getClassicFont() ) { + themeComboBox->setCurrentIndex(5); + } else if ( style_editor == ModelStyle::getTwilightStyle() && style_editor.font == StyleFont::getDefaultFont() ) { + themeComboBox->setCurrentIndex(6); + } else if ( style_editor == ModelStyle::getOceanStyle() && style_editor.font == StyleFont::getDefaultFont() ) { + themeComboBox->setCurrentIndex(7); + } else { + themeComboBox->setCurrentIndex(0); + } + break; + case ItemType::BUILD: + if ( style_build == BuildStyle::getDefaultStyle() && style_build.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(1); + } else if ( style_build == BuildStyle::getClassicStyle() && style_build.font == StyleFont::getClassicFont()) { + themeComboBox->setCurrentIndex(2); + } else if ( style_build == BuildStyle::getTwilightStyle() && style_build.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(3); + } else if ( style_build == BuildStyle::getOceanStyle() && style_build.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(4); + } else { + themeComboBox->setCurrentIndex(0); + } + break; + case ItemType::DEBUG: + if ( style_debug == EditStyle::getDefaultStyle() && style_debug.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(1); + } else if ( style_debug == EditStyle::getClassicStyle() && style_debug.font == StyleFont::getClassicFont()) { + themeComboBox->setCurrentIndex(2); + } else if ( style_debug == EditStyle::getTwilightStyle() && style_debug.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(3); + } else if ( style_debug == EditStyle::getOceanStyle() && style_debug.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(4); + } else { + themeComboBox->setCurrentIndex(0); + } + break; + case ItemType::LOG: + if ( style_trace == rdo::gui::tracer::LogStyle::getDefaultStyle() && style_trace.font == StyleFont::getTracerLogFont()) { + themeComboBox->setCurrentIndex(1); + } else { + themeComboBox->setCurrentIndex(0); + } + break; + case ItemType::RESULT: + if ( style_results == ResultsStyle::getDefaultStyle() && style_results.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(1); + } else if ( style_results == ResultsStyle::getCppStyle() && style_results.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(2); + } else if ( style_results == ResultsStyle::getPascalStyle() && style_results.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(3); + } else if ( style_results == ResultsStyle::getHtmlStyle() && style_results.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(4); + } else if ( style_results == ResultsStyle::getClassicStyle() && style_results.font == StyleFont::getClassicFont()) { + themeComboBox->setCurrentIndex(5); + } else if ( style_results == ResultsStyle::getTwilightStyle() && style_results.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(6); + } else if ( style_results == ResultsStyle::getOceanStyle() && style_results.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(7); + } else { + themeComboBox->setCurrentIndex(0); + } + break; + case ItemType::FIND: + if ( style_find == FindStyle::getDefaultStyle() && style_find.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(1); + } else if ( style_find == FindStyle::getClassicStyle() && style_find.font == StyleFont::getClassicFont()) { + themeComboBox->setCurrentIndex(2); + } else if ( style_find == FindStyle::getTwilightStyle() && style_find.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(3); + } else if ( style_find == FindStyle::getOceanStyle() && style_find.font == StyleFont::getDefaultFont()) { + themeComboBox->setCurrentIndex(4); + } else { + themeComboBox->setCurrentIndex(0); + } + break; + case ItemType::CHART: + if ( style_chart == ChartViewStyle::getDefaultStyle() && style_chart.font == StyleFont::getChartViewFont()) { + themeComboBox->setCurrentIndex(1); + } else { + themeComboBox->setCurrentIndex(0); + } + break; + case ItemType::FRAME: + if ( style_frame == FrameStyle::getDefaultStyle() && style_frame.font == StyleFont::getFrameFont()) { + themeComboBox->setCurrentIndex(1); + } else { + themeComboBox->setCurrentIndex(0); + } + break; + default: + break; + } } void ViewPreferences::onHelpContext() { - QByteArray ba; - switch (tabWidget->currentIndex()) - { - case 0: - ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_options/work_options_general.htm\n"); - break; - case 1: - ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_options/work_options_editor.htm\n"); - break; - case 2: - ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_options/work_options_tabs.htm\n"); - break; - case 3: - ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_options/work_options_styles_and_color.htm\n"); - break; - } - g_pApp->callQtAssistant(ba); + QByteArray ba; + switch (tabWidget->currentIndex()) + { + case 0: + ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_options/work_options_general.htm\n"); + break; + case 1: + ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_options/work_options_editor.htm\n"); + break; + case 2: + ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_options/work_options_tabs.htm\n"); + break; + case 3: + ba.append("setSource qthelp://studio/doc/rdo_studio_rus/html/work_options/work_options_styles_and_color.htm\n"); + break; + } + g_pApp->callQtAssistant(ba); } void ViewPreferences::updateDialog() { - setupCheckBox->setCheckState(m_setup - ? Qt::Checked - : Qt::Unchecked - ); - checkInFutureCheckBox->setCheckState(m_checkInFuture - ? Qt::Checked - : Qt::Unchecked - ); - openLastProjectCheckBox->setCheckState(m_openLastProject - ? Qt::Checked - : Qt::Unchecked - ); - showFullNameCheckBox->setCheckState(m_showFullName - ? Qt::Checked - : Qt::Unchecked - ); - checkBoxCodeCompUse->setCheckState(style_editor.autoComplete.useAutoComplete - ? Qt::Checked - : Qt::Unchecked - ); - checkBoxMarginFold->setCheckState(style_editor.margin.fold - ? Qt::Checked - : Qt::Unchecked - ); - checkBoxMarginBookmark->setCheckState(style_editor.margin.bookmark - ? Qt::Checked - : Qt::Unchecked - ); - checkBoxMarginLineNum->setCheckState(style_editor.margin.lineNumber - ? Qt::Checked - : Qt::Unchecked - ); - style_editor.autoComplete.showFullList - ? radioButtonFullList->toggle() - : radioButtonNearestWords->toggle(); - useTabSymbolCheckBox->setCheckState(style_editor.tab.useTabs - ? Qt::Checked - : Qt::Unchecked - ); - indentAsTabcheckBox->setCheckState(style_editor.tab.tabIndents - ? Qt::Checked - : Qt::Unchecked - ); - autoIndentCheckBox->setCheckState(style_editor.tab.autoIndent - ? Qt::Checked - : Qt::Unchecked - ); - style_editor.tab.backspaceUntabs - ? eraseWithTabRadioButton->toggle() - : eraseWithIndentRadioButton->toggle(); - - updateStyleTab(); + setupCheckBox->setCheckState(m_setup ? Qt::Checked : Qt::Unchecked); + checkInFutureCheckBox->setCheckState(m_checkInFuture ? Qt::Checked : Qt::Unchecked); + openLastProjectCheckBox->setCheckState(m_openLastProject ? Qt::Checked : Qt::Unchecked); + showFullNameCheckBox->setCheckState(m_showFullName ? Qt::Checked : Qt::Unchecked ); + checkBoxCodeCompUse->setCheckState(style_editor.autoComplete.useAutoComplete ? Qt::Checked : Qt::Unchecked); + checkBoxMarginFold->setCheckState(style_editor.margin.fold ? Qt::Checked : Qt::Unchecked); + checkBoxMarginBookmark->setCheckState(style_editor.margin.bookmark ? Qt::Checked : Qt::Unchecked); + checkBoxMarginLineNum->setCheckState(style_editor.margin.lineNumber ? Qt::Checked : Qt::Unchecked); + if (style_editor.autoComplete.showFullList) + radioButtonFullList->toggle(); + else + radioButtonNearestWords->toggle(); + + useTabSymbolCheckBox->setCheckState(style_editor.tab.useTabs ? Qt::Checked : Qt::Unchecked); + indentAsTabcheckBox->setCheckState(style_editor.tab.tabIndents ? Qt::Checked : Qt::Unchecked); + autoIndentCheckBox->setCheckState(style_editor.tab.autoIndent ? Qt::Checked : Qt::Unchecked); + if (style_editor.tab.backspaceUntabs) + eraseWithTabRadioButton->toggle(); + else + eraseWithIndentRadioButton->toggle(); + + updateStyleTab(); } void ViewPreferences::updateStyleTab() { - StyleProperty* prop = getStyleProperty(); - QString fontName = QString::fromStdString(prop->item->font_name); - if (!fontName.isEmpty()) - { - fontComboBox->setCurrentFont(QFont(fontName)); - } - else - { - fontComboBox->setCurrentIndex(-1); - } - fontSizeComboBox->setCurrentIndex(fontSizeComboBox->findText(QString::number(prop->item->font_size))); - - if(fgColorComboBox->findData(prop->fg_color) == -1) - { - insertColor(prop->fg_color, QString::fromStdString(rdo::format("[%d, %d, %d]", prop->fg_color.red(), prop->fg_color.green(), prop->fg_color.blue())), fgColorComboBox); - } - fgColorComboBox->setCurrentIndex(fgColorComboBox->findData(prop->fg_color)); - - QColor bgColor(prop->bg_color.blue(), prop->bg_color.green(), prop->bg_color.red()); - if(bgColorComboBox->findData(prop->bg_color) == -1) - { - insertColor(prop->bg_color, QString::fromStdString(rdo::format("[%d, %d, %d]", prop->bg_color.red(), prop->bg_color.green(), prop->bg_color.blue())), bgColorComboBox); - } - bgColorComboBox->setCurrentIndex(bgColorComboBox->findData(prop->bg_color)); - - if(boldCheckBox->isEnabled()) - { - boldCheckBox->setCheckState((prop->font_style & StyleFont::BOLD) != 0 ? Qt::Checked : Qt::Unchecked); - } - if(italicCheckBox->isEnabled()) - { - italicCheckBox->setCheckState((prop->font_style & StyleFont::ITALIC) != 0 ? Qt::Checked : Qt::Unchecked); - } - if(underlineCheckBox->isEnabled()) - { - underlineCheckBox->setCheckState((prop->font_style & StyleFont::UNDERLINE) != 0 ? Qt::Checked : Qt::Unchecked); - } - switch(prop->item->type) - { - case IT_ROOT: - if((all_font_size == style_editor.font.size) && - (all_font_size == style_debug.font.size) && - (all_font_size == style_build.font.size) && - (all_font_size == style_find.font.size) && - (all_font_size == style_frame.font.size) && - (all_font_size == style_results.font.size) && - (all_font_size == style_trace.font.size) && - (all_font_size == style_chart.font.size) - ) - { - fontSizeComboBox->setCurrentIndex(fontSizeComboBox->findText(QString::number(prop->item->font_size))); - } - else - fontSizeComboBox->setCurrentIndex(-1); - - if((all_font_name == style_editor.font.name) && - (all_font_name == style_debug.font.name) && - (all_font_name == style_build.font.name) && - (all_font_name == style_find.font.name) && - (all_font_name == style_frame.font.name) && - (all_font_name == style_results.font.name) && - (all_font_name == style_trace.font.name) && - (all_font_name == style_chart.font.name) - ) - { - fontComboBox->setCurrentFont(QFont(QString::fromStdString(all_font_name))); - } - else - fontComboBox->setCurrentIndex(-1); - case IT_EDITOR: - wordWrapEditorCheckBox->setCheckState(prop->item->wordwrap ? Qt::Checked : Qt::Unchecked); - horzScrollEditorCheckBox->setCheckState(prop->item->horzscrollbar ? Qt::Checked : Qt::Unchecked); - commentCheckBox->setCheckState(prop->item->commentfold ? Qt::Checked : Qt::Unchecked); - foldComboBox->setCurrentIndex(static_cast(prop->item->foldstyle)); - bookmarkComboBox->setCurrentIndex(static_cast(prop->item->bookmarkstyle)); - break; - case IT_BUILD: - wordWrapBuildCheckBox->setCheckState(prop->item->wordwrap ? Qt::Checked : Qt::Unchecked); - horzScrollBuildCheckBox->setCheckState(prop->item->horzscrollbar ? Qt::Checked : Qt::Unchecked); - warningCheckBox->setCheckState(prop->item->warning ? Qt::Checked : Qt::Unchecked); - break; - case IT_DEBUG: - wordWrapDebugCheckBox->setCheckState(prop->item->wordwrap ? Qt::Checked : Qt::Unchecked); - horzScrollDebugCheckBox->setCheckState(prop->item->horzscrollbar ? Qt::Checked : Qt::Unchecked); - break; - case IT_LOG: - vertIndentLineEdit->setText(QString::number(style_trace.borders.vertBorder)); - horzIndentLineEdit->setText(QString::number(style_trace.borders.horzBorder)); - break; - case IT_RESULT: - wordWrapResultsCheckBox->setCheckState(prop->item->wordwrap ? Qt::Checked : Qt::Unchecked); - horzScrollResultsCheckBox->setCheckState(prop->item->horzscrollbar ? Qt::Checked : Qt::Unchecked); - break; - case IT_FIND: - wordWrapFindCheckBox->setCheckState(prop->item->wordwrap ? Qt::Checked : Qt::Unchecked); - horzScrollFindCheckBox->setCheckState(prop->item->horzscrollbar ? Qt::Checked : Qt::Unchecked); - break; - case IT_CHART: - titleComboBox->setCurrentIndex(titleComboBox->findText(QString::number(style_chart.pFontsTicks.titleFontSize))); - legendComboBox->setCurrentIndex(legendComboBox->findText(QString::number(style_chart.pFontsTicks.legendFontSize))); - tickWidthLineEdit->setText(QString::number(style_chart.pFontsTicks.tickWidth)); - switch(prop->identificator) - { - case IT_CHART: - fgColorComboBox->setEnabled(true); - bgColorComboBox->setEnabled(true); - fgColorToolButton->setEnabled(true); - bgColorToolButton->setEnabled(true); - break; - case IT_CHART_AXIS: - fgColorComboBox->setEnabled(true); - bgColorComboBox->setEnabled(false); - fgColorToolButton->setEnabled(true); - bgColorToolButton->setEnabled(false); - break; - case IT_CHART_TITLE: - fgColorComboBox->setEnabled(true); - bgColorComboBox->setEnabled(false); - fgColorToolButton->setEnabled(true); - bgColorToolButton->setEnabled(false); - break; - case IT_CHART_CHART: - fgColorComboBox->setEnabled(false); - bgColorComboBox->setEnabled(true); - fgColorToolButton->setEnabled(false); - bgColorToolButton->setEnabled(true); - break; - case IT_CHART_LEGEND: - fgColorComboBox->setEnabled(true); - bgColorComboBox->setEnabled(false); - fgColorToolButton->setEnabled(true); - bgColorToolButton->setEnabled(false); - break; - case IT_CHART_TIME: - fgColorComboBox->setEnabled(false); - bgColorComboBox->setEnabled(true); - fgColorToolButton->setEnabled(false); - bgColorToolButton->setEnabled(true); - break; - default: - break; - } - break; - case IT_FRAME: - switch(prop->identificator) - { - case IT_FRAME: - fgColorComboBox->setEnabled(true); - bgColorComboBox->setEnabled(true); - fgColorToolButton->setEnabled(true); - bgColorToolButton->setEnabled(true); - break; - case IT_FRAME_BORDER: - fgColorComboBox->setEnabled(true); - bgColorComboBox->setEnabled(false); - fgColorToolButton->setEnabled(true); - bgColorToolButton->setEnabled(false); - break; - case IT_FRAME_BACKGROUND: - fgColorComboBox->setEnabled(false); - bgColorComboBox->setEnabled(true); - fgColorToolButton->setEnabled(false); - bgColorToolButton->setEnabled(true); - break; - } - break; - default: - break; - } - updateThemeComboBox(prop); - updateTheme(); + StyleProperty* prop = getStyleProperty(); + const QString fontName = QString::fromStdString(prop->item->font_name); + if (!fontName.isEmpty()) + fontComboBox->setCurrentFont(QFont(fontName)); + else + fontComboBox->setCurrentIndex(-1); + + fontSizeComboBox->setCurrentIndex(fontSizeComboBox->findText(QString::number(prop->item->font_size))); + + if (fgColorComboBox->findData(prop->fg_color) == -1) + insertColor(prop->fg_color, QString::fromStdString(rdo::format("[%d, %d, %d]", prop->fg_color.red(), prop->fg_color.green(), prop->fg_color.blue())), fgColorComboBox); + + fgColorComboBox->setCurrentIndex(fgColorComboBox->findData(prop->fg_color)); + + QColor bgColor(prop->bg_color.blue(), prop->bg_color.green(), prop->bg_color.red()); + if (bgColorComboBox->findData(prop->bg_color) == -1) + insertColor(prop->bg_color, QString::fromStdString(rdo::format("[%d, %d, %d]", prop->bg_color.red(), prop->bg_color.green(), prop->bg_color.blue())), bgColorComboBox); + + bgColorComboBox->setCurrentIndex(bgColorComboBox->findData(prop->bg_color)); + + if (boldCheckBox->isEnabled()) + boldCheckBox->setCheckState((static_cast(prop->font_style) & static_cast(StyleFont::Style::BOLD)) != 0 ? Qt::Checked : Qt::Unchecked); + + if (italicCheckBox->isEnabled()) + italicCheckBox->setCheckState((static_cast(prop->font_style) & static_cast(StyleFont::Style::ITALIC)) != 0 ? Qt::Checked : Qt::Unchecked); + + if (underlineCheckBox->isEnabled()) + underlineCheckBox->setCheckState((static_cast(prop->font_style) & static_cast(StyleFont::Style::UNDERLINE)) != 0 ? Qt::Checked : Qt::Unchecked); + + switch (prop->item->type) + { + case ItemType::ROOT: + if ((all_font_size == style_editor.font.size) && + (all_font_size == style_debug.font.size) && + (all_font_size == style_build.font.size) && + (all_font_size == style_find.font.size) && + (all_font_size == style_frame.font.size) && + (all_font_size == style_results.font.size) && + (all_font_size == style_trace.font.size) && + (all_font_size == style_chart.font.size)) + { + fontSizeComboBox->setCurrentIndex(fontSizeComboBox->findText(QString::number(prop->item->font_size))); + } + else + { + fontSizeComboBox->setCurrentIndex(-1); + } + + if ((all_font_name == style_editor.font.name) && + (all_font_name == style_debug.font.name) && + (all_font_name == style_build.font.name) && + (all_font_name == style_find.font.name) && + (all_font_name == style_frame.font.name) && + (all_font_name == style_results.font.name) && + (all_font_name == style_trace.font.name) && + (all_font_name == style_chart.font.name)) + { + fontComboBox->setCurrentFont(QFont(QString::fromStdString(all_font_name))); + } + else + { + fontComboBox->setCurrentIndex(-1); + } + // TODO break ? + + case ItemType::EDITOR: + wordWrapEditorCheckBox->setCheckState(prop->item->wordwrap ? Qt::Checked : Qt::Unchecked); + horzScrollEditorCheckBox->setCheckState(prop->item->horzscrollbar ? Qt::Checked : Qt::Unchecked); + commentCheckBox->setCheckState(prop->item->commentfold ? Qt::Checked : Qt::Unchecked); + foldComboBox->setCurrentIndex(static_cast(prop->item->foldstyle)); + bookmarkComboBox->setCurrentIndex(static_cast(prop->item->bookmarkstyle)); + break; + case ItemType::BUILD: + wordWrapBuildCheckBox->setCheckState(prop->item->wordwrap ? Qt::Checked : Qt::Unchecked); + horzScrollBuildCheckBox->setCheckState(prop->item->horzscrollbar ? Qt::Checked : Qt::Unchecked); + warningCheckBox->setCheckState(prop->item->warning ? Qt::Checked : Qt::Unchecked); + break; + case ItemType::DEBUG: + wordWrapDebugCheckBox->setCheckState(prop->item->wordwrap ? Qt::Checked : Qt::Unchecked); + horzScrollDebugCheckBox->setCheckState(prop->item->horzscrollbar ? Qt::Checked : Qt::Unchecked); + break; + case ItemType::LOG: + vertIndentLineEdit->setText(QString::number(style_trace.borders.vertBorder)); + horzIndentLineEdit->setText(QString::number(style_trace.borders.horzBorder)); + break; + case ItemType::RESULT: + wordWrapResultsCheckBox->setCheckState(prop->item->wordwrap ? Qt::Checked : Qt::Unchecked); + horzScrollResultsCheckBox->setCheckState(prop->item->horzscrollbar ? Qt::Checked : Qt::Unchecked); + break; + case ItemType::FIND: + wordWrapFindCheckBox->setCheckState(prop->item->wordwrap ? Qt::Checked : Qt::Unchecked); + horzScrollFindCheckBox->setCheckState(prop->item->horzscrollbar ? Qt::Checked : Qt::Unchecked); + break; + case ItemType::CHART: + titleComboBox->setCurrentIndex(titleComboBox->findText(QString::number(style_chart.pFontsTicks.titleFontSize))); + legendComboBox->setCurrentIndex(legendComboBox->findText(QString::number(style_chart.pFontsTicks.legendFontSize))); + tickWidthLineEdit->setText(QString::number(style_chart.pFontsTicks.tickWidth)); + switch (prop->identificator) + { + case ItemType::CHART: + fgColorComboBox->setEnabled(true); + bgColorComboBox->setEnabled(true); + fgColorToolButton->setEnabled(true); + bgColorToolButton->setEnabled(true); + break; + case ItemType::CHART_AXIS: + fgColorComboBox->setEnabled(true); + bgColorComboBox->setEnabled(false); + fgColorToolButton->setEnabled(true); + bgColorToolButton->setEnabled(false); + break; + case ItemType::CHART_TITLE: + fgColorComboBox->setEnabled(true); + bgColorComboBox->setEnabled(false); + fgColorToolButton->setEnabled(true); + bgColorToolButton->setEnabled(false); + break; + case ItemType::CHART_CHART: + fgColorComboBox->setEnabled(false); + bgColorComboBox->setEnabled(true); + fgColorToolButton->setEnabled(false); + bgColorToolButton->setEnabled(true); + break; + case ItemType::CHART_LEGEND: + fgColorComboBox->setEnabled(true); + bgColorComboBox->setEnabled(false); + fgColorToolButton->setEnabled(true); + bgColorToolButton->setEnabled(false); + break; + case ItemType::CHART_TIME: + fgColorComboBox->setEnabled(false); + bgColorComboBox->setEnabled(true); + fgColorToolButton->setEnabled(false); + bgColorToolButton->setEnabled(true); + break; + default: + break; + } + break; + case ItemType::FRAME: + switch (prop->identificator) + { + case ItemType::FRAME: + fgColorComboBox->setEnabled(true); + bgColorComboBox->setEnabled(true); + fgColorToolButton->setEnabled(true); + bgColorToolButton->setEnabled(true); + break; + case ItemType::FRAME_BORDER: + fgColorComboBox->setEnabled(true); + bgColorComboBox->setEnabled(false); + fgColorToolButton->setEnabled(true); + bgColorToolButton->setEnabled(false); + break; + case ItemType::FRAME_BACKGROUND: + fgColorComboBox->setEnabled(false); + bgColorComboBox->setEnabled(true); + fgColorToolButton->setEnabled(false); + bgColorToolButton->setEnabled(true); + break; + default: + break; + } + break; + default: + break; + } + updateThemeComboBox(prop); + updateTheme(); } void ViewPreferences::updateThemeComboBox(StyleProperty* prop) { - themeComboBox->clear(); - switch(prop->item->type) - { - case IT_ROOT: - case IT_LOG: - case IT_CHART: - case IT_FRAME: - themeComboBox->addItem("Текущий", ST_CURRENT); - themeComboBox->addItem("По умолчанию", ST_DEFAULT); - break; - case IT_EDITOR: - case IT_RESULT: - themeComboBox->addItem("Текущий", ST_CURRENT); - themeComboBox->addItem("По умолчанию", ST_DEFAULT); - themeComboBox->addItem("C++", ST_CPP); - themeComboBox->addItem("Pascal", ST_PASCAL); - themeComboBox->addItem("HTML", ST_HTML); - themeComboBox->addItem("Классический", ST_CLASSIC); - themeComboBox->addItem("Яркий", ST_TWILIGHT); - themeComboBox->addItem("Океан", ST_OCEAN); - break; - case IT_BUILD: - case IT_DEBUG: - case IT_FIND: - themeComboBox->addItem("Текущий", ST_CURRENT); - themeComboBox->addItem("По умолчанию", ST_DEFAULT); - themeComboBox->addItem("Классический", ST_CLASSIC); - themeComboBox->addItem("Яркий", ST_TWILIGHT); - themeComboBox->addItem("Океан", ST_OCEAN); - break; - default: - break; - } + themeComboBox->clear(); + switch (prop->item->type) + { + case ItemType::ROOT: + case ItemType::LOG: + case ItemType::CHART: + case ItemType::FRAME: + themeComboBox->addItem("Текущий", QVariant::fromValue(StyleType::CURRENT)); + themeComboBox->addItem("По умолчанию", QVariant::fromValue(StyleType::DEFAULT)); + break; + case ItemType::EDITOR: + case ItemType::RESULT: + themeComboBox->addItem("Текущий", QVariant::fromValue(StyleType::CURRENT)); + themeComboBox->addItem("По умолчанию", QVariant::fromValue(StyleType::DEFAULT)); + themeComboBox->addItem("C++", QVariant::fromValue(StyleType::CPP)); + themeComboBox->addItem("Pascal", QVariant::fromValue(StyleType::PASCAL_STYLE)); + themeComboBox->addItem("HTML", QVariant::fromValue(StyleType::HTML)); + themeComboBox->addItem("Классический", QVariant::fromValue(StyleType::CLASSIC)); + themeComboBox->addItem("Яркий", QVariant::fromValue(StyleType::TWILIGHT)); + themeComboBox->addItem("Океан", QVariant::fromValue(StyleType::OCEAN)); + break; + case ItemType::BUILD: + case ItemType::DEBUG: + case ItemType::FIND: + themeComboBox->addItem("Текущий", QVariant::fromValue(StyleType::CURRENT)); + themeComboBox->addItem("По умолчанию", QVariant::fromValue(StyleType::DEFAULT)); + themeComboBox->addItem("Классический", QVariant::fromValue(StyleType::CLASSIC)); + themeComboBox->addItem("Яркий", QVariant::fromValue(StyleType::TWILIGHT)); + themeComboBox->addItem("Океан", QVariant::fromValue(StyleType::OCEAN)); + break; + default: + break; + } } void ViewPreferences::updatePreview() { - preview_editor->setEditorStyle(&style_editor); - preview_editor->repaint(); + preview_editor->setEditorStyle(&style_editor); + preview_editor->repaint(); + + preview_build->setEditorStyle(&style_build); + preview_build->repaint(); - preview_build->setEditorStyle(&style_build); - preview_build->repaint(); + preview_debug->setEditorStyle(&style_debug); + preview_debug->repaint(); - preview_debug->setEditorStyle(&style_debug); - preview_debug->repaint(); - - preview_trace->view().setStyle(&style_trace); - preview_trace->repaint(); + preview_trace->view().setStyle(&style_trace); + preview_trace->repaint(); - preview_results->setEditorStyle(&style_results); - preview_results->repaint(); + preview_results->setEditorStyle(&style_results); + preview_results->repaint(); - preview_find->setEditorStyle(&style_find); - preview_find->repaint(); + preview_find->setEditorStyle(&style_find); + preview_find->repaint(); - preview_chart->setStyle(&style_chart, true); + preview_chart->setStyle(&style_chart, true); - preview_frame->setStyle(&style_frame); - preview_frame->repaint(); + preview_frame->setStyle(&style_frame); + preview_frame->repaint(); - checkAllData(); + checkAllData(); } void ViewPreferences::createPreview() { - preview_editor = new Model(previewStackedWidget->currentWidget(), previewStackedWidget->currentWidget()); - ASSERT(preview_editor); - preview_editor->setEditorStyle(&style_editor); - preview_editor->setCanClearErrorLine(false); - preview_editor->appendText("{ comments }\n$Pattern pattern_name : operation trace\n$Relevant_resources\n rel_res2 : res_type2 Keep Keep\n rel_res1 : res_type1 Create NoChange\n$Time = Abs(rel_res2.par1 - rel_res2.par3)\n{...}\n$End\n\ntext [ 10, 20, ... = 'text' ]\n\n$Re levant_resources"); - preview_editor->scrollToLine(0); - preview_editor->setReadOnly(true); - preview_editor->bookmarkToggle(); - preview_editor->setErrorLine(preview_editor->getLineCount() - 1); - previewStackedWidget->addWidget(preview_editor); - - preview_build = new Build(previewStackedWidget->currentWidget()); - preview_build->setEditorStyle(&style_build); - preview_build->appendLine(new BuildEditLineInfo("Компиляция...")); - preview_build->appendLine(new BuildEditLineInfo(rdo::simulation::report::FileMessage("Неправильное значение параметра: 4", rdo::model::PAT, 40, 0))); - preview_build->appendLine(new BuildEditLineInfo("найдено ошибок: 1, предупреждений: 0")); - preview_build->gotoNext(); - previewStackedWidget->addWidget(preview_build); - - preview_debug = new Debug(previewStackedWidget->currentWidget()); - preview_debug->setEditorStyle(&style_debug); - preview_debug->appendLine("Получение структуры модели...ok\nМодель запущена"); - previewStackedWidget->addWidget(preview_debug); - - preview_trace = new rdo::gui::tracer::LogMainWnd(previewStackedWidget->currentWidget()); - preview_trace->view().setStyle(&g_pApp->getStyle()->style_trace); - preview_trace->view().setFocusOnly(true); - preview_trace->view().setText("Простая строка\nES 0 3\nEB 0 1 1 2 2 1 2\nEF 0.335153 1 1 2 2 1 2\nEI 0.427752 1 1 2 1 2\nER 1.07933 2 2 3 1 3\nRC 0.427752 2 2 0 0.427752 0\nRE 0.335153 2 2\nRK 0.427752 1 1 1 1 1\nV 0.427752 1 1\n$Status = USER_BREAK 607.228\nDPS_C 1 1 1\nSB 0 1\nSO 1 0 0 0\nSTN 3 1 3 6 2 1 3 2 5 6\nSTD 4 3 7 11 1 1 4 2 5 6\nSTR 5 2 8 12 2 1 4 2 1 6\nSRC 0 1 1 1 4\nSRE 0 1 2 2 4\nSRK 0 1 2 2 2\nSD\nSES 0 0.065 397312 10 8 13 13 19\nSEN 0 0.065 397312 10 8 13 13 19\nSEM 0 0.065 397312 10 8 13 13 19\nSEF 0 0.065 397312 10 8 13 13 19\nSEU 0 0.065 397312 10 8 13 13 19"); - preview_trace->view().selectLine(0); - previewStackedWidget->addWidget(preview_trace); - - preview_results = new Results(previewStackedWidget->currentWidget()); - preview_results->setEditorStyle(&style_results); - preview_results->setReadOnly(false); - preview_results->replaceCurrent("Длина_очереди 2 194 0.675957 21.6506 0 4\r\nЗанятость_парикмахера TRUE 96 0.877351 21.7041 0.0397544 0.918872\r\nВсего_обслужено 96\r\nПропускная_способность 1.99198\r\n", 0); - preview_results->setReadOnly(true); - previewStackedWidget->addWidget(preview_results); - - preview_find = new Find(previewStackedWidget->currentWidget()); - preview_find->setEditorStyle(&style_find); - preview_find->setKeyword("$Time"); - preview_find->appendLine(new LogEditLineInfo("Поиск '$Time'...")); - preview_find->appendLine(new LogEditLineInfo(rdo::simulation::report::FileMessage("$Time = Равномерный(0.25, 0.75)", rdo::model::PAT, 3, 0))); - preview_find->appendLine(new LogEditLineInfo(rdo::simulation::report::FileMessage("$Time = Нормальный(0.45, 0.2)", rdo::model::PAT, 13, 0))); - preview_find->appendLine(new LogEditLineInfo("'2' раз было найдено.")); - preview_find->gotoNext(); - previewStackedWidget->addWidget(preview_find); - - preview_chart_doc = new ChartDoc(true); - ChartViewMainWnd* pViewQt = new ChartViewMainWnd(NULL, preview_chart_doc, true); - preview_chart = &pViewQt->view(); - preview_chart_doc->attachView(preview_chart); - preview_chart_doc->setTitle(QString("график 1")); - preview_chart->setPreviwMode(true); - preview_chart->setStyle(&style_chart, false); - ////initializing times vector - preview_times.push_back(Time(0, 3)); - preview_times.push_back(Time(2, 3)); - preview_times.push_back(Time(4, 3)); - preview_times.push_back(Time(6, 3)); - preview_times.push_back(Time(8, 3)); - preview_times.push_back(Time(10, 3)); - preview_serie = rdo::Factory::create(); - preview_serie->setTitle(QString("значение 1")); - preview_serie->addValue(new Value(&preview_times.at(0), 2, 0)); - preview_serie->addValue(new Value(&preview_times.at(1), 1, 1)); - preview_serie->addValue(new Value(&preview_times.at(2), 0, 4)); - preview_serie->addValue(new Value(&preview_times.at(3), 3, 3)); - preview_serie->addValue(new Value(&preview_times.at(4), 1, 2)); - preview_serie->addValue(new Value(&preview_times.at(5), 0, 3)); - preview_chart_doc->addSerie(preview_serie); - - previewStackedWidget->addWidget(pViewQt); - - preview_frame = new rdo::gui::frame::OptionsView(previewStackedWidget->currentWidget()); - preview_frame->setStyle(&style_frame); - previewStackedWidget->addWidget(preview_frame); + preview_editor = new Model(previewStackedWidget->currentWidget(), previewStackedWidget->currentWidget()); + ASSERT(preview_editor); + preview_editor->setEditorStyle(&style_editor); + preview_editor->setCanClearErrorLine(false); + preview_editor->appendText("{ comments }\n$Pattern pattern_name : operation trace\n$Relevant_resources\n rel_res2 : res_type2 Keep Keep\n rel_res1 : res_type1 Create NoChange\n$Time = Abs(rel_res2.par1 - rel_res2.par3)\n{...}\n$End\n\ntext [ 10, 20, ... = 'text' ]\n\n$Re levant_resources"); + preview_editor->scrollToLine(0); + preview_editor->setReadOnly(true); + preview_editor->bookmarkToggle(); + preview_editor->setErrorLine(preview_editor->getLineCount() - 1); + previewStackedWidget->addWidget(preview_editor); + + preview_build = new Build(previewStackedWidget->currentWidget()); + preview_build->setEditorStyle(&style_build); + preview_build->appendLine(new BuildEditLineInfo("Компиляция...")); + preview_build->appendLine(new BuildEditLineInfo(rdo::simulation::report::FileMessage("Неправильное значение параметра: 4", rdo::FileType::PAT, 40, 0))); + preview_build->appendLine(new BuildEditLineInfo("найдено ошибок: 1, предупреждений: 0")); + preview_build->gotoNext(); + previewStackedWidget->addWidget(preview_build); + + preview_debug = new Debug(previewStackedWidget->currentWidget()); + preview_debug->setEditorStyle(&style_debug); + preview_debug->appendLine("Получение структуры модели...ok\nМодель запущена"); + previewStackedWidget->addWidget(preview_debug); + + preview_trace = new rdo::gui::tracer::LogMainWnd(previewStackedWidget->currentWidget()); + preview_trace->view().setStyle(&g_pApp->getStyle()->style_trace); + preview_trace->view().setFocusOnly(true); + preview_trace->view().setText("Простая строка\nES 0 3\nEB 0 1 1 2 2 1 2\nEF 0.335153 1 1 2 2 1 2\nEI 0.427752 1 1 2 1 2\nER 1.07933 2 2 3 1 3\nRC 0.427752 2 2 0 0.427752 0\nRE 0.335153 2 2\nRK 0.427752 1 1 1 1 1\nV 0.427752 1 1\n$Status = USER_BREAK 607.228\nDPS_C 1 1 1\nSB 0 1\nSO 1 0 0 0\nSTN 3 1 3 6 2 1 3 2 5 6\nSTD 4 3 7 11 1 1 4 2 5 6\nSTR 5 2 8 12 2 1 4 2 1 6\nSRC 0 1 1 1 4\nSRE 0 1 2 2 4\nSRK 0 1 2 2 2\nSD\nSES 0 0.065 397312 10 8 13 13 19\nSEN 0 0.065 397312 10 8 13 13 19\nSEM 0 0.065 397312 10 8 13 13 19\nSEF 0 0.065 397312 10 8 13 13 19\nSEU 0 0.065 397312 10 8 13 13 19"); + preview_trace->view().selectLine(0); + previewStackedWidget->addWidget(preview_trace); + + preview_results = new Results(previewStackedWidget->currentWidget()); + preview_results->setEditorStyle(&style_results); + preview_results->setReadOnly(false); + preview_results->replaceCurrent("Длина_очереди 2 194 0.675957 21.6506 0 4\r\nЗанятость_парикмахера TRUE 96 0.877351 21.7041 0.0397544 0.918872\r\nВсего_обслужено 96\r\nПропускная_способность 1.99198\r\n", 0); + preview_results->setReadOnly(true); + previewStackedWidget->addWidget(preview_results); + + preview_find = new Find(previewStackedWidget->currentWidget()); + preview_find->setEditorStyle(&style_find); + preview_find->setKeyword("$Time"); + preview_find->appendLine(new LogEditLineInfo("Поиск '$Time'...")); + preview_find->appendLine(new LogEditLineInfo(rdo::simulation::report::FileMessage("$Time = Равномерный(0.25, 0.75)", rdo::FileType::PAT, 3, 0))); + preview_find->appendLine(new LogEditLineInfo(rdo::simulation::report::FileMessage("$Time = Нормальный(0.45, 0.2)", rdo::FileType::PAT, 13, 0))); + preview_find->appendLine(new LogEditLineInfo("'2' раз было найдено.")); + preview_find->gotoNext(); + previewStackedWidget->addWidget(preview_find); + + preview_chart_doc = new ChartDoc(true); + ChartViewMainWnd* pViewQt = new ChartViewMainWnd(NULL, preview_chart_doc, true); + preview_chart = &pViewQt->view(); + preview_chart_doc->attachView(preview_chart); + preview_chart_doc->setTitle(QString("график 1")); + preview_chart->setPreviwMode(true); + preview_chart->setStyle(&style_chart, false); + + preview_times.push_back(Time(0, 3)); + preview_times.push_back(Time(2, 3)); + preview_times.push_back(Time(4, 3)); + preview_times.push_back(Time(6, 3)); + preview_times.push_back(Time(8, 3)); + preview_times.push_back(Time(10, 3)); + preview_serie = rdo::Factory::create(); + preview_serie->setTitle(QString("значение 1")); + preview_serie->addValue(new Value(&preview_times.at(0), 2, 0)); + preview_serie->addValue(new Value(&preview_times.at(1), 1, 1)); + preview_serie->addValue(new Value(&preview_times.at(2), 0, 4)); + preview_serie->addValue(new Value(&preview_times.at(3), 3, 3)); + preview_serie->addValue(new Value(&preview_times.at(4), 1, 2)); + preview_serie->addValue(new Value(&preview_times.at(5), 0, 3)); + preview_chart_doc->addSerie(preview_serie); + + previewStackedWidget->addWidget(pViewQt); + + preview_frame = new rdo::gui::frame::OptionsView(previewStackedWidget->currentWidget()); + preview_frame->setStyle(&style_frame); + previewStackedWidget->addWidget(preview_frame); } void ViewPreferences::createStyles() { - StyleItem* item; - item = new StyleItem(IT_ROOT, all_font_size, all_font_name); - item->properties.push_back(new StyleProperty(item, IT_ROOT, null_font_style, all_fg_color, all_bg_color)); - style_list.push_back(item); - - item = new StyleItem(IT_EDITOR, style_editor.font.size, style_editor.font.name, style_editor.window.wordWrap, style_editor.window.showHorzScrollBar, style_editor.bookmarkStyle, style_editor.foldStyle, style_editor.commentFold); - item->properties.push_back(new StyleProperty(item, IT_EDITOR, style_editor.identifierStyle, style_editor.identifierColor, style_editor.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_PLAINTEXT, style_editor.defaultStyle, style_editor.defaultColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_IDENTIFICATOR, style_editor.identifierStyle, style_editor.identifierColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_KEYWORD, style_editor.keywordStyle, style_editor.keywordColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_FUNCTION, style_editor.functionsStyle, style_editor.functionsColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_TRACE, style_editor.traceStyle, style_editor.traceColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_COLOR, style_editor.colorStyle, style_editor.colorColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_COMMENT, style_editor.commentStyle, style_editor.commentColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_NUMBER, style_editor.numberStyle, style_editor.numberColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_STRING, style_editor.stringStyle, style_editor.stringColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_OPERATOR, style_editor.operatorStyle, style_editor.operatorColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_CARET, null_font_style, style_editor.caretColor, null_bg_color)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_TEXTSELECTION, null_font_style, null_fg_color, style_editor.selectionBgColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_BOOKMARK, null_font_style, style_editor.bookmarkFgColor, style_editor.bookmarkBgColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_FOLD, null_font_style, style_editor.foldFgColor, style_editor.foldBgColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_ERROR, null_font_style, null_fg_color, style_editor.errorBgColor)); - style_list.push_back(item); - - item = new StyleItem(IT_BUILD, style_build.font.size, style_build.font.name, style_build.window.wordWrap, style_build.window.showHorzScrollBar, null_bookmarkstyle, null_foldstyle, null_commentfold, style_build.warning); - item->properties.push_back(new StyleProperty(item, IT_BUILD, style_build.defaultStyle, style_build.defaultColor, style_build.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_BUILD_TEXT, style_build.defaultStyle, style_build.defaultColor, style_build.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_BUILD_SELECTEDLINE, null_font_style, null_fg_color, style_build.selectLineBgColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_CARET, null_font_style, style_build.caretColor, null_bg_color)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_TEXTSELECTION, null_font_style, null_fg_color, style_build.selectionBgColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_BOOKMARK, null_font_style, null_fg_color, style_build.bookmarkBgColor)); - style_list.push_back(item); - - item = new StyleItem(IT_DEBUG, style_debug.font.size, style_debug.font.name, style_debug.window.wordWrap, style_debug.window.showHorzScrollBar); - item->properties.push_back(new StyleProperty(item, IT_DEBUG, style_debug.defaultStyle, style_debug.defaultColor, style_debug.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_BUILD_TEXT, style_debug.defaultStyle, style_debug.defaultColor, style_debug.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_CARET, null_font_style, style_debug.caretColor, null_bg_color)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_TEXTSELECTION, null_font_style, null_fg_color, style_debug.selectionBgColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_BOOKMARK, null_font_style, null_fg_color, style_debug.bookmarkBgColor)); - style_list.push_back(item); - - item = new StyleItem(IT_LOG, style_trace.font.size, style_trace.font.name); - item->properties.push_back(new StyleProperty(item, IT_LOG, style_trace.fontStyle, style_trace.defaultColor.foregroundColor, style_trace.defaultColor.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_ES, style_trace.fontStyle, style_trace.es.foregroundColor, style_trace.es.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_EB, style_trace.fontStyle, style_trace.eb.foregroundColor, style_trace.eb.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_EF, style_trace.fontStyle, style_trace.ef.foregroundColor, style_trace.ef.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_EI, style_trace.fontStyle, style_trace.ei.foregroundColor, style_trace.ei.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_ER, style_trace.fontStyle, style_trace.er.foregroundColor, style_trace.er.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_RC, style_trace.fontStyle, style_trace.rc.foregroundColor, style_trace.rc.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_RE, style_trace.fontStyle, style_trace.re.foregroundColor, style_trace.re.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_RK, style_trace.fontStyle, style_trace.rk.foregroundColor, style_trace.rk.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_V, style_trace.fontStyle, style_trace.v.foregroundColor, style_trace.v.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_STATUS, style_trace.fontStyle, style_trace.s.foregroundColor, style_trace.s.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_DPS, style_trace.fontStyle, style_trace.dps.foregroundColor, style_trace.dps.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_SB, style_trace.fontStyle, style_trace.sb.foregroundColor, style_trace.sb.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_SO, style_trace.fontStyle, style_trace.so.foregroundColor, style_trace.so.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_STN, style_trace.fontStyle, style_trace.stn.foregroundColor, style_trace.stn.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_STD, style_trace.fontStyle, style_trace.std.foregroundColor, style_trace.std.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_STR, style_trace.fontStyle, style_trace.str.foregroundColor, style_trace.str.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_SRC, style_trace.fontStyle, style_trace.src.foregroundColor, style_trace.src.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_SRE, style_trace.fontStyle, style_trace.sre.foregroundColor, style_trace.sre.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_SRK, style_trace.fontStyle, style_trace.srk.foregroundColor, style_trace.srk.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_SD, style_trace.fontStyle, style_trace.sd.foregroundColor, style_trace.sd.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_SES, style_trace.fontStyle, style_trace.ses.foregroundColor, style_trace.ses.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_SEN, style_trace.fontStyle, style_trace.sen.foregroundColor, style_trace.sen.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_SEM, style_trace.fontStyle, style_trace.sem.foregroundColor, style_trace.sem.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_SEF, style_trace.fontStyle, style_trace.sef.foregroundColor, style_trace.sef.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_LOG_SEU, style_trace.fontStyle, style_trace.seu.foregroundColor, style_trace.seu.backgroundColor)); - style_list.push_back(item); - - item = new StyleItem(IT_RESULT, style_results.font.size, style_results.font.name, style_results.window.wordWrap, style_results.window.showHorzScrollBar); - item->properties.push_back(new StyleProperty(item, IT_RESULT, style_results.identifierStyle, style_results.identifierColor, style_results.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_PLAINTEXT, style_results.defaultStyle, style_results.defaultColor, null_bg_color, null_fg_color, style_results.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_IDENTIFICATOR, style_results.identifierStyle, style_results.identifierColor, null_bg_color, null_fg_color, style_results.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_KEYWORD, style_results.keywordStyle, style_results.keywordColor, null_bg_color, null_fg_color, style_results.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_NUMBER, style_results.numberStyle, style_results.numberColor, null_bg_color, null_fg_color, style_results.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_STRING, style_results.stringStyle, style_results.stringColor, null_bg_color, null_fg_color, style_results.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_OPERATOR, style_results.operatorStyle, style_results.operatorColor, null_bg_color, null_fg_color, style_results.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_CARET, null_font_style, style_results.caretColor, null_bg_color)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_TEXTSELECTION, null_font_style, null_fg_color, style_results.selectionBgColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_BOOKMARK, null_font_style, style_results.bookmarkFgColor, style_results.bookmarkBgColor)); - style_list.push_back(item); - - item = new StyleItem(IT_FIND, style_find.font.size, style_find.font.name, style_find.window.wordWrap, style_find.window.showHorzScrollBar); - item->properties.push_back(new StyleProperty(item, IT_FIND, style_find.defaultStyle, style_find.defaultColor, style_find.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_BUILD_TEXT, style_find.defaultStyle, style_find.defaultColor, style_find.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_FIND_SEARCHTEXT, style_find.keywordStyle, style_find.keywordColor, null_bg_color, null_fg_color, style_find.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_BUILD_SELECTEDLINE, null_font_style, null_fg_color, style_find.selectLineBgColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_CARET, null_font_style, style_find.caretColor, null_bg_color)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_TEXTSELECTION, null_font_style, null_fg_color, style_find.selectionBgColor)); - item->properties.push_back(new StyleProperty(item, IT_EDITOR_BOOKMARK, null_font_style, null_fg_color, style_find.bookmarkBgColor)); - style_list.push_back(item); - - item = new StyleItem(IT_CHART, style_chart.font.size, style_chart.font.name); - item->properties.push_back(new StyleProperty(item, IT_CHART, style_chart.defaultStyle, style_chart.defaultColor, style_chart.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_CHART_AXIS, style_chart.defaultStyle, style_chart.axisFgColor, null_bg_color, null_fg_color, style_chart.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_CHART_TITLE, style_chart.titleStyle, style_chart.titleFGColor, null_bg_color, null_fg_color, style_chart.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_CHART_LEGEND, style_chart.legendStyle, style_chart.legendFgColor, null_bg_color, null_fg_color, style_chart.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_CHART_CHART, null_font_style, null_fg_color, style_chart.chartBgColor)); - item->properties.push_back(new StyleProperty(item, IT_CHART_TIME, null_font_style, null_fg_color, style_chart.timeBgColor)); - style_list.push_back(item); - - item = new StyleItem(IT_FRAME, style_frame.font.size, style_frame.font.name); - item->properties.push_back(new StyleProperty(item, IT_FRAME, style_frame.defaultStyle, style_frame.defaultColor, style_frame.backgroundColor)); - item->properties.push_back(new StyleProperty(item, IT_FRAME_BORDER, style_frame.defaultStyle, style_frame.defaultColor, null_bg_color)); - item->properties.push_back(new StyleProperty(item, IT_FRAME_BACKGROUND, style_frame.defaultStyle, null_fg_color, style_frame.backgroundColor)); - style_list.push_back(item); + StyleItem* item; + item = new StyleItem(ItemType::ROOT, all_font_size, all_font_name); + item->properties.push_back(new StyleProperty(item, ItemType::ROOT, null_font_style, all_fg_color, all_bg_color)); + style_list.push_back(item); + + item = new StyleItem(ItemType::EDITOR, style_editor.font.size, style_editor.font.name, style_editor.window.wordWrap, style_editor.window.showHorzScrollBar, style_editor.bookmarkStyle, style_editor.foldStyle, style_editor.commentFold); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR, style_editor.identifierStyle, style_editor.identifierColor, style_editor.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_PLAINTEXT, style_editor.defaultStyle, style_editor.defaultColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_IDENTIFICATOR, style_editor.identifierStyle, style_editor.identifierColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_KEYWORD, style_editor.keywordStyle, style_editor.keywordColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_FUNCTION, style_editor.functionsStyle, style_editor.functionsColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_TRACE, style_editor.traceStyle, style_editor.traceColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_COLOR, style_editor.colorStyle, style_editor.colorColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_COMMENT, style_editor.commentStyle, style_editor.commentColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_NUMBER, style_editor.numberStyle, style_editor.numberColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_STRING, style_editor.stringStyle, style_editor.stringColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_OPERATOR, style_editor.operatorStyle, style_editor.operatorColor, null_bg_color, null_fg_color, style_editor.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_CARET, null_font_style, style_editor.caretColor, null_bg_color)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_TEXTSELECTION, null_font_style, null_fg_color, style_editor.selectionBgColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_BOOKMARK, null_font_style, style_editor.bookmarkFgColor, style_editor.bookmarkBgColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_FOLD, null_font_style, style_editor.foldFgColor, style_editor.foldBgColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_ERROR, null_font_style, null_fg_color, style_editor.errorBgColor)); + style_list.push_back(item); + + item = new StyleItem(ItemType::BUILD, style_build.font.size, style_build.font.name, style_build.window.wordWrap, style_build.window.showHorzScrollBar, null_bookmarkstyle, null_foldstyle, null_commentfold, style_build.warning); + item->properties.push_back(new StyleProperty(item, ItemType::BUILD, style_build.defaultStyle, style_build.defaultColor, style_build.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::BUILD_TEXT, style_build.defaultStyle, style_build.defaultColor, style_build.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::BUILD_SELECTEDLINE, null_font_style, null_fg_color, style_build.selectLineBgColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_CARET, null_font_style, style_build.caretColor, null_bg_color)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_TEXTSELECTION, null_font_style, null_fg_color, style_build.selectionBgColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_BOOKMARK, null_font_style, null_fg_color, style_build.bookmarkBgColor)); + style_list.push_back(item); + + item = new StyleItem(ItemType::DEBUG, style_debug.font.size, style_debug.font.name, style_debug.window.wordWrap, style_debug.window.showHorzScrollBar); + item->properties.push_back(new StyleProperty(item, ItemType::DEBUG, style_debug.defaultStyle, style_debug.defaultColor, style_debug.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::BUILD_TEXT, style_debug.defaultStyle, style_debug.defaultColor, style_debug.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_CARET, null_font_style, style_debug.caretColor, null_bg_color)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_TEXTSELECTION, null_font_style, null_fg_color, style_debug.selectionBgColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_BOOKMARK, null_font_style, null_fg_color, style_debug.bookmarkBgColor)); + style_list.push_back(item); + + item = new StyleItem(ItemType::LOG, style_trace.font.size, style_trace.font.name); + item->properties.push_back(new StyleProperty(item, ItemType::LOG, style_trace.fontStyle, style_trace.defaultColor.foregroundColor, style_trace.defaultColor.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_ES, style_trace.fontStyle, style_trace.es.foregroundColor, style_trace.es.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_EB, style_trace.fontStyle, style_trace.eb.foregroundColor, style_trace.eb.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_EF, style_trace.fontStyle, style_trace.ef.foregroundColor, style_trace.ef.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_EI, style_trace.fontStyle, style_trace.ei.foregroundColor, style_trace.ei.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_ER, style_trace.fontStyle, style_trace.er.foregroundColor, style_trace.er.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_RC, style_trace.fontStyle, style_trace.rc.foregroundColor, style_trace.rc.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_RE, style_trace.fontStyle, style_trace.re.foregroundColor, style_trace.re.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_RK, style_trace.fontStyle, style_trace.rk.foregroundColor, style_trace.rk.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_V, style_trace.fontStyle, style_trace.v.foregroundColor, style_trace.v.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_STATUS, style_trace.fontStyle, style_trace.s.foregroundColor, style_trace.s.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_DPS, style_trace.fontStyle, style_trace.dps.foregroundColor, style_trace.dps.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_SB, style_trace.fontStyle, style_trace.sb.foregroundColor, style_trace.sb.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_SO, style_trace.fontStyle, style_trace.so.foregroundColor, style_trace.so.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_STN, style_trace.fontStyle, style_trace.stn.foregroundColor, style_trace.stn.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_STD, style_trace.fontStyle, style_trace.std.foregroundColor, style_trace.std.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_STR, style_trace.fontStyle, style_trace.str.foregroundColor, style_trace.str.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_SRC, style_trace.fontStyle, style_trace.src.foregroundColor, style_trace.src.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_SRE, style_trace.fontStyle, style_trace.sre.foregroundColor, style_trace.sre.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_SRK, style_trace.fontStyle, style_trace.srk.foregroundColor, style_trace.srk.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_SD, style_trace.fontStyle, style_trace.sd.foregroundColor, style_trace.sd.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_SES, style_trace.fontStyle, style_trace.ses.foregroundColor, style_trace.ses.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_SEN, style_trace.fontStyle, style_trace.sen.foregroundColor, style_trace.sen.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_SEM, style_trace.fontStyle, style_trace.sem.foregroundColor, style_trace.sem.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_SEF, style_trace.fontStyle, style_trace.sef.foregroundColor, style_trace.sef.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::LOG_SEU, style_trace.fontStyle, style_trace.seu.foregroundColor, style_trace.seu.backgroundColor)); + style_list.push_back(item); + + item = new StyleItem(ItemType::RESULT, style_results.font.size, style_results.font.name, style_results.window.wordWrap, style_results.window.showHorzScrollBar); + item->properties.push_back(new StyleProperty(item, ItemType::RESULT, style_results.identifierStyle, style_results.identifierColor, style_results.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_PLAINTEXT, style_results.defaultStyle, style_results.defaultColor, null_bg_color, null_fg_color, style_results.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_IDENTIFICATOR, style_results.identifierStyle, style_results.identifierColor, null_bg_color, null_fg_color, style_results.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_KEYWORD, style_results.keywordStyle, style_results.keywordColor, null_bg_color, null_fg_color, style_results.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_NUMBER, style_results.numberStyle, style_results.numberColor, null_bg_color, null_fg_color, style_results.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_STRING, style_results.stringStyle, style_results.stringColor, null_bg_color, null_fg_color, style_results.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_OPERATOR, style_results.operatorStyle, style_results.operatorColor, null_bg_color, null_fg_color, style_results.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_CARET, null_font_style, style_results.caretColor, null_bg_color)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_TEXTSELECTION, null_font_style, null_fg_color, style_results.selectionBgColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_BOOKMARK, null_font_style, style_results.bookmarkFgColor, style_results.bookmarkBgColor)); + style_list.push_back(item); + + item = new StyleItem(ItemType::FIND, style_find.font.size, style_find.font.name, style_find.window.wordWrap, style_find.window.showHorzScrollBar); + item->properties.push_back(new StyleProperty(item, ItemType::FIND, style_find.defaultStyle, style_find.defaultColor, style_find.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::BUILD_TEXT, style_find.defaultStyle, style_find.defaultColor, style_find.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::FIND_SEARCHTEXT, style_find.keywordStyle, style_find.keywordColor, null_bg_color, null_fg_color, style_find.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::BUILD_SELECTEDLINE, null_font_style, null_fg_color, style_find.selectLineBgColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_CARET, null_font_style, style_find.caretColor, null_bg_color)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_TEXTSELECTION, null_font_style, null_fg_color, style_find.selectionBgColor)); + item->properties.push_back(new StyleProperty(item, ItemType::EDITOR_BOOKMARK, null_font_style, null_fg_color, style_find.bookmarkBgColor)); + style_list.push_back(item); + + item = new StyleItem(ItemType::CHART, style_chart.font.size, style_chart.font.name); + item->properties.push_back(new StyleProperty(item, ItemType::CHART, style_chart.defaultStyle, style_chart.defaultColor, style_chart.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::CHART_AXIS, style_chart.defaultStyle, style_chart.axisFgColor, null_bg_color, null_fg_color, style_chart.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::CHART_TITLE, style_chart.titleStyle, style_chart.titleFGColor, null_bg_color, null_fg_color, style_chart.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::CHART_LEGEND, style_chart.legendStyle, style_chart.legendFgColor, null_bg_color, null_fg_color, style_chart.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::CHART_CHART, null_font_style, null_fg_color, style_chart.chartBgColor)); + item->properties.push_back(new StyleProperty(item, ItemType::CHART_TIME, null_font_style, null_fg_color, style_chart.timeBgColor)); + style_list.push_back(item); + + item = new StyleItem(ItemType::FRAME, style_frame.font.size, style_frame.font.name); + item->properties.push_back(new StyleProperty(item, ItemType::FRAME, style_frame.defaultStyle, style_frame.defaultColor, style_frame.backgroundColor)); + item->properties.push_back(new StyleProperty(item, ItemType::FRAME_BORDER, style_frame.defaultStyle, style_frame.defaultColor, null_bg_color)); + item->properties.push_back(new StyleProperty(item, ItemType::FRAME_BACKGROUND, style_frame.defaultStyle, null_fg_color, style_frame.backgroundColor)); + style_list.push_back(item); } void ViewPreferences::createTree() { - treeWidget->setColumnCount(1); - treeWidget->setHeaderHidden(true); - treeWidget->setRootIsDecorated(false); - - m_pRoot = new QTreeWidgetItem(treeWidget); - m_pRoot->setText(0, "Все окна"); - m_pRoot->setData(0, Qt::UserRole, IT_ROOT); - - m_pText = createTreeItem(m_pRoot, "Исходный текст", IT_EDITOR); - m_pCompile = createTreeItem(m_pRoot, "Окно компиляции", IT_BUILD); - m_pDebug = createTreeItem(m_pRoot, "Окно отладки", IT_DEBUG); - m_pTrace = createTreeItem(m_pRoot, "Окно трассировки", IT_LOG); - m_pResult = createTreeItem(m_pRoot, "Окно результатов", IT_RESULT); - m_pSearch = createTreeItem(m_pRoot, "Окно поиска", IT_FIND); - m_pChart = createTreeItem(m_pRoot, "Окно графиков", IT_CHART); - m_pAnimation = createTreeItem(m_pRoot, "Окно анимации", IT_FRAME); - - m_pRoot->setExpanded(true); - - m_pPlainText = createTreeItem(m_pText, "Обыкновенный текст", IT_EDITOR_PLAINTEXT); - m_pVariable = createTreeItem(m_pText, "Переменная", IT_EDITOR_IDENTIFICATOR); - m_pKeyword = createTreeItem(m_pText, "Ключевое слово", IT_EDITOR_KEYWORD); - m_pFunction = createTreeItem(m_pText, "Функция", IT_EDITOR_FUNCTION); - m_pTraceText = createTreeItem(m_pText, "Трассировка", IT_EDITOR_TRACE); - m_pColor = createTreeItem(m_pText, "Цвет", IT_EDITOR_COLOR); - m_pComment = createTreeItem(m_pText, "Комментарии", IT_EDITOR_COMMENT); - m_pNumber = createTreeItem(m_pText, "Число", IT_EDITOR_NUMBER); - m_pString = createTreeItem(m_pText, "Строка", IT_EDITOR_STRING); - m_pOperator = createTreeItem(m_pText, "Оператор", IT_EDITOR_OPERATOR); - m_pCaret = createTreeItem(m_pText, "Каретка", IT_EDITOR_CARET); - m_pSelection = createTreeItem(m_pText, "Выделение", IT_EDITOR_TEXTSELECTION); - m_pBookmark = createTreeItem(m_pText, "Закладка", IT_EDITOR_BOOKMARK); - m_pGroup = createTreeItem(m_pText, "Группа", IT_EDITOR_FOLD); - m_pError = createTreeItem(m_pText, "Ошибка", IT_EDITOR_ERROR); - - m_pTextCompile = createTreeItem(m_pCompile, "Текст", IT_BUILD_TEXT); - m_pSelectedString = createTreeItem(m_pCompile, "Выделенная строка", IT_BUILD_SELECTEDLINE); - m_pCaretCompile = createTreeItem(m_pCompile, "Каретка", IT_EDITOR_CARET); - m_pSelectionCompile = createTreeItem(m_pCompile, "Выделение", IT_EDITOR_TEXTSELECTION); - m_pBookmarkCompile = createTreeItem(m_pCompile, "Закладка", IT_EDITOR_BOOKMARK); - - m_pTextDebug = createTreeItem(m_pDebug, "Текст", IT_BUILD_TEXT); - m_pCaretDebug = createTreeItem(m_pDebug, "Каретка", IT_EDITOR_CARET); - m_pSelectionDebug = createTreeItem(m_pDebug, "Выделение", IT_EDITOR_TEXTSELECTION); - m_pBookmarkDebug = createTreeItem(m_pDebug, "Закладка", IT_EDITOR_BOOKMARK); - - m_pES = createTreeItem(m_pTrace, "Служебное событие (ES)", IT_LOG_ES); - m_pEB = createTreeItem(m_pTrace, "Начало действия (EB)", IT_LOG_EB); - m_pEF = createTreeItem(m_pTrace, "Окончание действия (EF)", IT_LOG_EF); - m_pEI = createTreeItem(m_pTrace, "Нерегулярное событие (EI)", IT_LOG_EI); - m_pER = createTreeItem(m_pTrace, "Продукционное правило (ER)", IT_LOG_ER); - m_pRC = createTreeItem(m_pTrace, "Создание ресурса (RC)", IT_LOG_RC); - m_pRE = createTreeItem(m_pTrace, "Удаление ресурса (RE)", IT_LOG_RE); - m_pRK = createTreeItem(m_pTrace, "Изменение состояния ресурса (RK)", IT_LOG_RK); - m_pV = createTreeItem(m_pTrace, "Трассировка индекса (V)", IT_LOG_V); - m_pStatus = createTreeItem(m_pTrace, "Статус окончания моделирования ($Status)", IT_LOG_STATUS); - m_pDPS = createTreeItem(m_pTrace, "Статистика по поиску на графе (DPS)", IT_LOG_DPS); - m_pSB = createTreeItem(m_pTrace, "Начало поиска (SB)", IT_LOG_SB); - m_pSO = createTreeItem(m_pTrace, "Трассировка раскрываемой вершины (SO)", IT_LOG_SO); - m_pSTN = createTreeItem(m_pTrace, "Признак вершины (STN)", IT_LOG_STN); - m_pSTD = createTreeItem(m_pTrace, "Признак вершины (STD)", IT_LOG_STD); - m_pSTR = createTreeItem(m_pTrace, "Признак вершины (STR)", IT_LOG_STR); - m_pSRC = createTreeItem(m_pTrace, "Создание ресурса (при поиске) (SRC)", IT_LOG_SRC); - m_pSRE = createTreeItem(m_pTrace, "Удаление ресурса (при поиске) (SRE)", IT_LOG_SRE); - m_pSRK = createTreeItem(m_pTrace, "Изменение состояния ресурса (при поиске) (SRK)", IT_LOG_SRK); - m_pSD = createTreeItem(m_pTrace, "Трассировка решения (SD)", IT_LOG_SD); - m_pSES = createTreeItem(m_pTrace, "Завершение поиска (SES)", IT_LOG_SES); - m_pSEN = createTreeItem(m_pTrace, "Завершение поиска (SEN)", IT_LOG_SEN); - m_pSEM = createTreeItem(m_pTrace, "Завершение поиска (SEM)", IT_LOG_SEM); - m_pSEF = createTreeItem(m_pTrace, "Завершение поиска (SEF)", IT_LOG_SEF); - m_pSEU = createTreeItem(m_pTrace, "Завершение поиска (SEU)", IT_LOG_SEU); - - m_pPlainTextResult = createTreeItem(m_pResult, "Исходный текст", IT_EDITOR_PLAINTEXT); - m_pVariableResult = createTreeItem(m_pResult, "Переменная", IT_EDITOR_IDENTIFICATOR); - m_pKeywordResult = createTreeItem(m_pResult, "Ключевое слово", IT_EDITOR_KEYWORD); - m_pNumberResult = createTreeItem(m_pResult, "Число", IT_EDITOR_NUMBER); - m_pStringResult = createTreeItem(m_pResult, "Строка", IT_EDITOR_STRING); - m_pOperatorResult = createTreeItem(m_pResult, "Оператор", IT_EDITOR_OPERATOR); - m_pCaretResult = createTreeItem(m_pResult, "Каретка", IT_EDITOR_CARET); - m_pSelectionResult = createTreeItem(m_pResult, "Выделение", IT_EDITOR_TEXTSELECTION); - m_pBookmarkResult = createTreeItem(m_pResult, "Закладка", IT_EDITOR_BOOKMARK); - - m_pTextSearch = createTreeItem(m_pSearch, "Текст", IT_BUILD_TEXT); - m_pStringSearch = createTreeItem(m_pSearch, "Строка для поиска", IT_FIND_SEARCHTEXT); - m_pSelectedStringSearch = createTreeItem(m_pSearch, "Выделенная строка", IT_BUILD_SELECTEDLINE); - m_pCaretSearch = createTreeItem(m_pSearch, "Каретка", IT_EDITOR_CARET); - m_pSelectionSearch = createTreeItem(m_pSearch, "Выделение", IT_EDITOR_TEXTSELECTION); - m_pBookmarkSearch = createTreeItem(m_pSearch, "Закладка", IT_EDITOR_BOOKMARK); - - m_pAxis = createTreeItem(m_pChart, "Ось", IT_CHART_AXIS); - m_pTitle = createTreeItem(m_pChart, "Заголовок", IT_CHART_TITLE); - m_pLegend = createTreeItem(m_pChart, "Легенда", IT_CHART_LEGEND); - m_pGraph = createTreeItem(m_pChart, "График", IT_CHART_CHART); - m_pTime = createTreeItem(m_pChart, "Время", IT_CHART_TIME); - - m_pEdgingColor = createTreeItem(m_pAnimation, "Цвет окантовки", IT_FRAME_BORDER); - m_pBackgroundColor = createTreeItem(m_pAnimation, "Цвет фона за пределами кадра", IT_FRAME_BACKGROUND); - - treeWidget->setCurrentItem(m_pRoot); + treeWidget->setColumnCount(1); + treeWidget->setHeaderHidden(true); + treeWidget->setRootIsDecorated(false); + + m_pRoot = new QTreeWidgetItem(treeWidget); + m_pRoot->setText(0, "Все окна"); + m_pRoot->setData(0, Qt::UserRole, static_cast(ItemType::ROOT)); + + m_pText = createTreeItem(m_pRoot, "Исходный текст", ItemType::EDITOR); + m_pCompile = createTreeItem(m_pRoot, "Окно компиляции", ItemType::BUILD); + m_pDebug = createTreeItem(m_pRoot, "Окно отладки", ItemType::DEBUG); + m_pTrace = createTreeItem(m_pRoot, "Окно трассировки", ItemType::LOG); + m_pResult = createTreeItem(m_pRoot, "Окно результатов", ItemType::RESULT); + m_pSearch = createTreeItem(m_pRoot, "Окно поиска", ItemType::FIND); + m_pChart = createTreeItem(m_pRoot, "Окно графиков", ItemType::CHART); + m_pAnimation = createTreeItem(m_pRoot, "Окно анимации", ItemType::FRAME); + + m_pRoot->setExpanded(true); + + m_pPlainText = createTreeItem(m_pText, "Обыкновенный текст", ItemType::EDITOR_PLAINTEXT); + m_pVariable = createTreeItem(m_pText, "Переменная", ItemType::EDITOR_IDENTIFICATOR); + m_pKeyword = createTreeItem(m_pText, "Ключевое слово", ItemType::EDITOR_KEYWORD); + m_pFunction = createTreeItem(m_pText, "Функция", ItemType::EDITOR_FUNCTION); + m_pTraceText = createTreeItem(m_pText, "Трассировка", ItemType::EDITOR_TRACE); + m_pColor = createTreeItem(m_pText, "Цвет", ItemType::EDITOR_COLOR); + m_pComment = createTreeItem(m_pText, "Комментарии", ItemType::EDITOR_COMMENT); + m_pNumber = createTreeItem(m_pText, "Число", ItemType::EDITOR_NUMBER); + m_pString = createTreeItem(m_pText, "Строка", ItemType::EDITOR_STRING); + m_pOperator = createTreeItem(m_pText, "Оператор", ItemType::EDITOR_OPERATOR); + m_pCaret = createTreeItem(m_pText, "Каретка", ItemType::EDITOR_CARET); + m_pSelection = createTreeItem(m_pText, "Выделение", ItemType::EDITOR_TEXTSELECTION); + m_pBookmark = createTreeItem(m_pText, "Закладка", ItemType::EDITOR_BOOKMARK); + m_pGroup = createTreeItem(m_pText, "Группа", ItemType::EDITOR_FOLD); + m_pError = createTreeItem(m_pText, "Ошибка", ItemType::EDITOR_ERROR); + + m_pTextCompile = createTreeItem(m_pCompile, "Текст", ItemType::BUILD_TEXT); + m_pSelectedString = createTreeItem(m_pCompile, "Выделенная строка", ItemType::BUILD_SELECTEDLINE); + m_pCaretCompile = createTreeItem(m_pCompile, "Каретка", ItemType::EDITOR_CARET); + m_pSelectionCompile = createTreeItem(m_pCompile, "Выделение", ItemType::EDITOR_TEXTSELECTION); + m_pBookmarkCompile = createTreeItem(m_pCompile, "Закладка", ItemType::EDITOR_BOOKMARK); + + m_pTextDebug = createTreeItem(m_pDebug, "Текст", ItemType::BUILD_TEXT); + m_pCaretDebug = createTreeItem(m_pDebug, "Каретка", ItemType::EDITOR_CARET); + m_pSelectionDebug = createTreeItem(m_pDebug, "Выделение", ItemType::EDITOR_TEXTSELECTION); + m_pBookmarkDebug = createTreeItem(m_pDebug, "Закладка", ItemType::EDITOR_BOOKMARK); + + m_pES = createTreeItem(m_pTrace, "Служебное событие (ES)", ItemType::LOG_ES); + m_pEB = createTreeItem(m_pTrace, "Начало действия (EB)", ItemType::LOG_EB); + m_pEF = createTreeItem(m_pTrace, "Окончание действия (EF)", ItemType::LOG_EF); + m_pEI = createTreeItem(m_pTrace, "Нерегулярное событие (EI)", ItemType::LOG_EI); + m_pER = createTreeItem(m_pTrace, "Продукционное правило (ER)", ItemType::LOG_ER); + m_pRC = createTreeItem(m_pTrace, "Создание ресурса (RC)", ItemType::LOG_RC); + m_pRE = createTreeItem(m_pTrace, "Удаление ресурса (RE)", ItemType::LOG_RE); + m_pRK = createTreeItem(m_pTrace, "Изменение состояния ресурса (RK)", ItemType::LOG_RK); + m_pV = createTreeItem(m_pTrace, "Трассировка индекса (V)", ItemType::LOG_V); + m_pStatus = createTreeItem(m_pTrace, "Статус окончания моделирования ($Status)", ItemType::LOG_STATUS); + m_pDPS = createTreeItem(m_pTrace, "Статистика по поиску на графе (DPS)", ItemType::LOG_DPS); + m_pSB = createTreeItem(m_pTrace, "Начало поиска (SB)", ItemType::LOG_SB); + m_pSO = createTreeItem(m_pTrace, "Трассировка раскрываемой вершины (SO)", ItemType::LOG_SO); + m_pSTN = createTreeItem(m_pTrace, "Признак вершины (STN)", ItemType::LOG_STN); + m_pSTD = createTreeItem(m_pTrace, "Признак вершины (STD)", ItemType::LOG_STD); + m_pSTR = createTreeItem(m_pTrace, "Признак вершины (STR)", ItemType::LOG_STR); + m_pSRC = createTreeItem(m_pTrace, "Создание ресурса (при поиске) (SRC)", ItemType::LOG_SRC); + m_pSRE = createTreeItem(m_pTrace, "Удаление ресурса (при поиске) (SRE)", ItemType::LOG_SRE); + m_pSRK = createTreeItem(m_pTrace, "Изменение состояния ресурса (при поиске) (SRK)", ItemType::LOG_SRK); + m_pSD = createTreeItem(m_pTrace, "Трассировка решения (SD)", ItemType::LOG_SD); + m_pSES = createTreeItem(m_pTrace, "Завершение поиска (SES)", ItemType::LOG_SES); + m_pSEN = createTreeItem(m_pTrace, "Завершение поиска (SEN)", ItemType::LOG_SEN); + m_pSEM = createTreeItem(m_pTrace, "Завершение поиска (SEM)", ItemType::LOG_SEM); + m_pSEF = createTreeItem(m_pTrace, "Завершение поиска (SEF)", ItemType::LOG_SEF); + m_pSEU = createTreeItem(m_pTrace, "Завершение поиска (SEU)", ItemType::LOG_SEU); + + m_pPlainTextResult = createTreeItem(m_pResult, "Исходный текст", ItemType::EDITOR_PLAINTEXT); + m_pVariableResult = createTreeItem(m_pResult, "Переменная", ItemType::EDITOR_IDENTIFICATOR); + m_pKeywordResult = createTreeItem(m_pResult, "Ключевое слово", ItemType::EDITOR_KEYWORD); + m_pNumberResult = createTreeItem(m_pResult, "Число", ItemType::EDITOR_NUMBER); + m_pStringResult = createTreeItem(m_pResult, "Строка", ItemType::EDITOR_STRING); + m_pOperatorResult = createTreeItem(m_pResult, "Оператор", ItemType::EDITOR_OPERATOR); + m_pCaretResult = createTreeItem(m_pResult, "Каретка", ItemType::EDITOR_CARET); + m_pSelectionResult = createTreeItem(m_pResult, "Выделение", ItemType::EDITOR_TEXTSELECTION); + m_pBookmarkResult = createTreeItem(m_pResult, "Закладка", ItemType::EDITOR_BOOKMARK); + + m_pTextSearch = createTreeItem(m_pSearch, "Текст", ItemType::BUILD_TEXT); + m_pStringSearch = createTreeItem(m_pSearch, "Строка для поиска", ItemType::FIND_SEARCHTEXT); + m_pSelectedStringSearch = createTreeItem(m_pSearch, "Выделенная строка", ItemType::BUILD_SELECTEDLINE); + m_pCaretSearch = createTreeItem(m_pSearch, "Каретка", ItemType::EDITOR_CARET); + m_pSelectionSearch = createTreeItem(m_pSearch, "Выделение", ItemType::EDITOR_TEXTSELECTION); + m_pBookmarkSearch = createTreeItem(m_pSearch, "Закладка", ItemType::EDITOR_BOOKMARK); + + m_pAxis = createTreeItem(m_pChart, "Ось", ItemType::CHART_AXIS); + m_pTitle = createTreeItem(m_pChart, "Заголовок", ItemType::CHART_TITLE); + m_pLegend = createTreeItem(m_pChart, "Легенда", ItemType::CHART_LEGEND); + m_pGraph = createTreeItem(m_pChart, "График", ItemType::CHART_CHART); + m_pTime = createTreeItem(m_pChart, "Время", ItemType::CHART_TIME); + + m_pEdgingColor = createTreeItem(m_pAnimation, "Цвет окантовки", ItemType::FRAME_BORDER); + m_pBackgroundColor = createTreeItem(m_pAnimation, "Цвет фона за пределами кадра", ItemType::FRAME_BACKGROUND); + + treeWidget->setCurrentItem(m_pRoot); } QTreeWidgetItem* ViewPreferences::createTreeItem(QTreeWidgetItem* parent, const QString& name, ItemType itemType) { - QTreeWidgetItem* item = new QTreeWidgetItem(parent); - item->setText(0, name); - item->setData(0, Qt::UserRole, QVariant(itemType)); - return item; + QTreeWidgetItem* item = new QTreeWidgetItem(parent); + item->setText(0, name); + item->setData(0, Qt::UserRole, QVariant(static_cast(itemType))); + return item; } void ViewPreferences::insertColors(QComboBox* colorBox) { - insertColor(QColor(0x00, 0x80, 0x00), "Green", colorBox); - insertColor(QColor(0x00, 0x00, 0x80), "Navy", colorBox); - insertColor(QColor(0x80, 0x80, 0x80), "Grey", colorBox); - insertColor(QColor(0x80, 0x00, 0x80), "Purple", colorBox); - insertColor(QColor(0xFF, 0x00, 0x00), "Red", colorBox); - insertColor(QColor(0x00, 0xFF, 0x00), "Lime", colorBox); - insertColor(QColor(0x00, 0x00, 0x00), "Black", colorBox); - insertColor(QColor(0xFF, 0xFF, 0xFF), "White", colorBox); - insertColor(QColor(0x80, 0x80, 0x00), "Olive", colorBox); - insertColor(QColor(0xC0, 0xC0, 0xC0), "Silver", colorBox); - insertColor(QColor(0x80, 0x00, 0x00), "Maroon", colorBox); - insertColor(QColor(0x00, 0x80, 0x80), "Teal", colorBox); - insertColor(QColor(0xFF, 0xFF, 0x00), "Yellow", colorBox); - insertColor(QColor(0x00, 0x00, 0xFF), "Blue", colorBox); - insertColor(QColor(0xFF, 0x00, 0xFF), "Fushcia", colorBox); - insertColor(QColor(0x00, 0xFF, 0xFF), "Aqua", colorBox); + insertColor(QColor(0x00, 0x80, 0x00), "Green", colorBox); + insertColor(QColor(0x00, 0x00, 0x80), "Navy", colorBox); + insertColor(QColor(0x80, 0x80, 0x80), "Grey", colorBox); + insertColor(QColor(0x80, 0x00, 0x80), "Purple", colorBox); + insertColor(QColor(0xFF, 0x00, 0x00), "Red", colorBox); + insertColor(QColor(0x00, 0xFF, 0x00), "Lime", colorBox); + insertColor(QColor(0x00, 0x00, 0x00), "Black", colorBox); + insertColor(QColor(0xFF, 0xFF, 0xFF), "White", colorBox); + insertColor(QColor(0x80, 0x80, 0x00), "Olive", colorBox); + insertColor(QColor(0xC0, 0xC0, 0xC0), "Silver", colorBox); + insertColor(QColor(0x80, 0x00, 0x00), "Maroon", colorBox); + insertColor(QColor(0x00, 0x80, 0x80), "Teal", colorBox); + insertColor(QColor(0xFF, 0xFF, 0x00), "Yellow", colorBox); + insertColor(QColor(0x00, 0x00, 0xFF), "Blue", colorBox); + insertColor(QColor(0xFF, 0x00, 0xFF), "Fuchsia", colorBox); + insertColor(QColor(0x00, 0xFF, 0xFF), "Aqua", colorBox); } void ViewPreferences::insertColor(const QColor& color, const QString& colorName, QComboBox* colorBox) { - colorBox->addItem(colorName); - int size = colorBox ->style()->pixelMetric(QStyle::PM_SmallIconSize); - QPixmap pixmap(size,size-5); - pixmap.fill(color); - QRect rBorder(0,0,size-1,size-6); - QPainter p(&pixmap); - QPen pen(Qt::black, 1, Qt::SolidLine); - p.setPen(pen); - p.drawRect(rBorder); - colorBox->setItemData(colorBox->findText(colorName), color, Qt::UserRole); - colorBox->setItemIcon(colorBox->findText(colorName), QIcon(pixmap)); + colorBox->addItem(colorName); + int size = colorBox ->style()->pixelMetric(QStyle::PM_SmallIconSize); + QPixmap pixmap(size,size-5); + pixmap.fill(color); + QRect rBorder(0,0,size-1,size-6); + QPainter p(&pixmap); + QPen pen(Qt::black, 1, Qt::SolidLine); + p.setPen(pen); + p.drawRect(rBorder); + colorBox->setItemData(colorBox->findText(colorName), color, Qt::UserRole); + colorBox->setItemIcon(colorBox->findText(colorName), QIcon(pixmap)); } ViewPreferences::StyleProperty* ViewPreferences::getStyleProperty() { - StyleItem* item = getStyleItem(); - for (StyleProperty* prop: item->properties) - { - if(prop->identificator == treeWidget->currentItem()->data(0, Qt::UserRole).toInt()) - return prop; - } - return NULL; + StyleItem* item = getStyleItem(); + for (StyleProperty* prop: item->properties) + { + if (prop->identificator == static_cast(treeWidget->currentItem()->data(0, Qt::UserRole).toInt())) + return prop; + } + return NULL; } ViewPreferences::StyleItem* ViewPreferences::getStyleItem() { - if(treeWidget->currentItem()->data(0, Qt::UserRole).toInt() == IT_ROOT) - { - for (StyleItem* item: style_list) - { - if(item->type == treeWidget->currentItem()->data(0, Qt::UserRole).toInt()) - return item; - } - } - - if(treeWidget->currentItem()->parent()->data(0, Qt::UserRole).toInt() == IT_ROOT) - { - for (StyleItem* item: style_list) - { - if(item->type == treeWidget->currentItem()->data(0, Qt::UserRole).toInt()) - return item; - } - } - - for (StyleItem* item: style_list) - { - if(item->type == treeWidget->currentItem()->parent()->data(0, Qt::UserRole).toInt()) - return item; - } - return NULL; + const auto currentItemType = static_cast(treeWidget->currentItem()->data(0, Qt::UserRole).toInt()); + if (currentItemType == ItemType::ROOT) + { + for (StyleItem* item: style_list) + { + if (item->type == currentItemType) + return item; + } + } + + const auto parentItemType = static_cast(treeWidget->currentItem()->parent()->data(0, Qt::UserRole).toInt()); + if (parentItemType == ItemType::ROOT) + { + for (StyleItem* item: style_list) + { + if (item->type == currentItemType) + return item; + } + } + + for (StyleItem* item: style_list) + { + if (item->type == parentItemType) + return item; + } + + return NULL; } void ViewPreferences::apply() { - g_pApp->getStyle()->style_editor = style_editor; - g_pApp->getStyle()->style_build = style_build; - g_pApp->getStyle()->style_debug = style_debug; - g_pApp->getStyle()->style_trace = style_trace; - g_pApp->getStyle()->style_results = style_results; - g_pApp->getStyle()->style_find = style_find; - g_pApp->getStyle()->style_frame = style_frame; - g_pApp->getStyle()->style_chart = style_chart; - g_pApp->setFileAssociationSetup(m_setup); - g_pApp->setFileAssociationCheckInFuture(m_checkInFuture); - g_pApp->setOpenLastProject(m_openLastProject); - g_pApp->setShowCaptionFullName(m_showFullName); - g_pApp->getStyle()->updateAllStyles(); - updatePluginList(); - g_pApp->getPluginLoader().setPluginInfoList(*m_pPluginInfoList); + g_pApp->getStyle()->style_editor = style_editor; + g_pApp->getStyle()->style_build = style_build; + g_pApp->getStyle()->style_debug = style_debug; + g_pApp->getStyle()->style_trace = style_trace; + g_pApp->getStyle()->style_results = style_results; + g_pApp->getStyle()->style_find = style_find; + g_pApp->getStyle()->style_frame = style_frame; + g_pApp->getStyle()->style_chart = style_chart; + g_pApp->setFileAssociationSetup(m_setup); + g_pApp->setFileAssociationCheckInFuture(m_checkInFuture); + g_pApp->setOpenLastProject(m_openLastProject); + g_pApp->setShowCaptionFullName(m_showFullName); + g_pApp->getStyle()->updateAllStyles(); + updatePluginList(); + g_pApp->getPluginLoader().setPluginInfoList(*m_pPluginInfoList); } void ViewPreferences::checkAllData() { - bool setupFlag = m_setup == g_pApp->getFileAssociationSetup() ? true : false; - bool checkInFutureFlag = m_checkInFuture == g_pApp->getFileAssociationCheckInFuture() ? true : false; - bool openLastProjectFlag = m_openLastProject == g_pApp->getOpenLastProject() ? true : false; - bool showFullNameFlag = m_showFullName == g_pApp->getShowCaptionFullName() ? true : false; - - bool style_editor_flag = style_editor == g_pApp->getStyle()->style_editor ? true : false; - bool style_build_flag = style_build == g_pApp->getStyle()->style_build ? true : false; - bool style_debug_flag = style_debug == g_pApp->getStyle()->style_debug ? true : false; - bool style_trace_flag = style_trace == g_pApp->getStyle()->style_trace ? true : false; - bool style_results_flag = style_results == g_pApp->getStyle()->style_results ? true : false; - bool style_find_flag = style_find == g_pApp->getStyle()->style_find ? true : false; - bool style_chart_flag = style_chart == g_pApp->getStyle()->style_chart ? true : false; - bool style_frame_flag = style_frame == g_pApp->getStyle()->style_frame ? true : false; - - if(setupFlag - && checkInFutureFlag - && openLastProjectFlag - && showFullNameFlag - && style_editor_flag - && style_build_flag - && style_debug_flag - && style_trace_flag - && style_results_flag - && style_find_flag - && style_chart_flag - && style_frame_flag) - buttonApply->setEnabled(false); - else - buttonApply->setEnabled(true); + bool setupFlag = m_setup == g_pApp->getFileAssociationSetup() ? true : false; + bool checkInFutureFlag = m_checkInFuture == g_pApp->getFileAssociationCheckInFuture() ? true : false; + bool openLastProjectFlag = m_openLastProject == g_pApp->getOpenLastProject() ? true : false; + bool showFullNameFlag = m_showFullName == g_pApp->getShowCaptionFullName() ? true : false; + + bool style_editor_flag = style_editor == g_pApp->getStyle()->style_editor ? true : false; + bool style_build_flag = style_build == g_pApp->getStyle()->style_build ? true : false; + bool style_debug_flag = style_debug == g_pApp->getStyle()->style_debug ? true : false; + bool style_trace_flag = style_trace == g_pApp->getStyle()->style_trace ? true : false; + bool style_results_flag = style_results == g_pApp->getStyle()->style_results ? true : false; + bool style_find_flag = style_find == g_pApp->getStyle()->style_find ? true : false; + bool style_chart_flag = style_chart == g_pApp->getStyle()->style_chart ? true : false; + bool style_frame_flag = style_frame == g_pApp->getStyle()->style_frame ? true : false; + + if (setupFlag + && checkInFutureFlag + && openLastProjectFlag + && showFullNameFlag + && style_editor_flag + && style_build_flag + && style_debug_flag + && style_trace_flag + && style_results_flag + && style_find_flag + && style_chart_flag + && style_frame_flag) + buttonApply->setEnabled(false); + else + buttonApply->setEnabled(true); } void ViewPreferences::keyPressEvent(QKeyEvent* pEvent) { - if (QKeySequence(pEvent->key()) == QKeySequence::HelpContents) - { - onHelpContext(); - } + if (QKeySequence(pEvent->key()) == QKeySequence::HelpContents) + { + onHelpContext(); + } } void ViewPreferences::deletePlugin() { - onStopPlugin(); - const std::vector rows = selectedRows(); - for (int i = rows.size()-1; i >= 0; i--) - { - const int current = rows[i]; - { - const LPPluginInfo pluginInfo = getPluginInfoFromTable(current); - QPluginLoader* pluginLoader = pluginInfo->getLoader(); - if (pluginLoader) - { - pluginLoader->unload(); - QFile::remove(pluginLoader->fileName()); - } - m_pPluginInfoList->remove(pluginInfo); - pluginInfoTable->removeRow(current); - } - } - updateButtonsState(); + onStopPlugin(); + const std::vector rows = selectedRows(); + for (int i = rows.size()-1; i >= 0; i--) + { + const int current = rows[i]; + { + const LPPluginInfo pluginInfo = getPluginInfoFromTable(current); + QPluginLoader* pluginLoader = pluginInfo->getLoader(); + if (pluginLoader) + { + pluginLoader->unload(); + QFile::remove(pluginLoader->fileName()); + } + m_pPluginInfoList->remove(pluginInfo); + pluginInfoTable->removeRow(current); + } + } + updateButtonsState(); } void ViewPreferences::onStartPlugin() { - const std::vector rows = selectedRows(); - for (int i = rows.size()-1; i >= 0; i--) - { - const int current = rows[i]; - const LPPluginInfo pluginInfo = getPluginInfoFromTable(current); - if (!pluginInfo->isActive() && pluginInfo->isAvailable()) - { - g_pApp->getPluginLoader().startPlugin(pluginInfo); - } - } - pluginInfoTable->setFocus(); - updateButtonsState(); + const std::vector rows = selectedRows(); + for (int i = rows.size()-1; i >= 0; i--) + { + const int current = rows[i]; + const LPPluginInfo pluginInfo = getPluginInfoFromTable(current); + if (!pluginInfo->isActive() && pluginInfo->isAvailable()) + { + g_pApp->getPluginLoader().startPlugin(pluginInfo); + } + } + pluginInfoTable->setFocus(); + updateButtonsState(); } void ViewPreferences::onStopPlugin() { - const std::vector rows = selectedRows(); - for (int i = rows.size()-1; i >= 0; i--) - { - const int current = rows[i]; - const LPPluginInfo pluginInfo = getPluginInfoFromTable(current); - if (pluginInfo->isActive() && pluginInfo->isAvailable()) - { - g_pApp->getPluginLoader().stopPlugin(pluginInfo); - } - } - updateButtonsState(); + const std::vector rows = selectedRows(); + for (int i = rows.size()-1; i >= 0; i--) + { + const int current = rows[i]; + const LPPluginInfo pluginInfo = getPluginInfoFromTable(current); + if (pluginInfo->isActive() && pluginInfo->isAvailable()) + { + g_pApp->getPluginLoader().stopPlugin(pluginInfo); + } + } + updateButtonsState(); } void ViewPreferences::populateRow(const LPPluginInfo& plgInfo) { - int currentRow = pluginInfoTable->rowCount(); - pluginInfoTable->setRowCount(currentRow + 1); - QTableWidgetItem* pNameItem (new QTableWidgetItem); - QTableWidgetItem* pCheckItem(new QTableWidgetItem); - pNameItem ->setText(plgInfo->getName()); - pNameItem ->setData(Qt::UserRole,QVariant::fromValue(plgInfo)); - pCheckItem->setFlags (pCheckItem->flags() | Qt::ItemIsUserCheckable); - pCheckItem->setCheckState(plgInfo->getAutoload() ? Qt::Checked : Qt::Unchecked); - pluginInfoTable->setItem(currentRow, 0, pNameItem); - pluginInfoTable->setItem(currentRow, 1, new QTableWidgetItem(plgInfo->getVersion())); - pluginInfoTable->setItem(currentRow, 2, new QTableWidgetItem(plgInfo->getAuthor ())); - pluginInfoTable->setItem(currentRow, 3, pCheckItem); + int currentRow = pluginInfoTable->rowCount(); + pluginInfoTable->setRowCount(currentRow + 1); + QTableWidgetItem* pNameItem (new QTableWidgetItem); + QTableWidgetItem* pCheckItem(new QTableWidgetItem); + pNameItem ->setText(plgInfo->getName()); + pNameItem ->setData(Qt::UserRole,QVariant::fromValue(plgInfo)); + pCheckItem->setFlags (pCheckItem->flags() | Qt::ItemIsUserCheckable); + pCheckItem->setCheckState(plgInfo->getAutoload() ? Qt::Checked : Qt::Unchecked); + pluginInfoTable->setItem(currentRow, 0, pNameItem); + pluginInfoTable->setItem(currentRow, 1, new QTableWidgetItem(plgInfo->getVersion())); + pluginInfoTable->setItem(currentRow, 2, new QTableWidgetItem(plgInfo->getAuthor ())); + pluginInfoTable->setItem(currentRow, 3, pCheckItem); } void ViewPreferences::fillPluginInfoTable() { - for (const LPPluginInfo& pluginInfo: *m_pPluginInfoList) - { - populateRow(pluginInfo); - } + for (const LPPluginInfo& pluginInfo: *m_pPluginInfoList) + { + populateRow(pluginInfo); + } } void ViewPreferences::updateButtonsState() { - const std::vector rows = selectedRows(); - bool allActive = true; - bool allInactive = true; - bool allUnavailable = true; - for (int i = rows.size()-1; i >= 0; i--) - { - const int current = rows[i]; - const LPPluginInfo pluginInfo = getPluginInfoFromTable(current); - if (pluginInfo->isAvailable()) - { - allActive = allActive && pluginInfo->isActive() ; - allInactive = allInactive && !(pluginInfo->isActive()); - allUnavailable = false; - } - } - buttonStartPlugin ->setEnabled(!allActive && !allUnavailable); - buttonStopPlugin ->setEnabled(!allInactive && !allUnavailable); - buttonDeletePlugin->setEnabled(!m_pPluginInfoList->empty()); + const std::vector rows = selectedRows(); + bool allActive = true; + bool allInactive = true; + bool allUnavailable = true; + for (int i = rows.size()-1; i >= 0; i--) + { + const int current = rows[i]; + const LPPluginInfo pluginInfo = getPluginInfoFromTable(current); + if (pluginInfo->isAvailable()) + { + allActive = allActive && pluginInfo->isActive() ; + allInactive = allInactive && !(pluginInfo->isActive()); + allUnavailable = false; + } + } + buttonStartPlugin ->setEnabled(!allActive && !allUnavailable); + buttonStopPlugin ->setEnabled(!allInactive && !allUnavailable); + buttonDeletePlugin->setEnabled(!m_pPluginInfoList->empty()); } ViewPreferences::IntVector ViewPreferences::selectedRows() const { - std::vector sortedRows; - for (const QModelIndex& index: pluginInfoTable->selectionModel()->selectedRows()) - { - sortedRows.push_back(index.row()); - } + std::vector sortedRows; + for (const QModelIndex& index: pluginInfoTable->selectionModel()->selectedRows()) + { + sortedRows.push_back(index.row()); + } - std::sort(sortedRows.begin(), sortedRows.end()); - return sortedRows; + std::sort(sortedRows.begin(), sortedRows.end()); + return sortedRows; } LPPluginInfo ViewPreferences::getPluginInfoFromTable(int pluginRow) const { - const QTableWidgetItem* itm = pluginInfoTable->item(pluginRow,0); - LPPluginInfo pluginInfo = itm->data(Qt::UserRole).value(); - return pluginInfo; + const QTableWidgetItem* itm = pluginInfoTable->item(pluginRow,0); + LPPluginInfo pluginInfo = itm->data(Qt::UserRole).value(); + return pluginInfo; } void ViewPreferences::updatePluginList() { - for (int currentRow = 0; currentRow < pluginInfoTable->rowCount(); currentRow++) - { - LPPluginInfo pluginInfo = getPluginInfoFromTable(currentRow); - bool autoLoadValue = pluginInfoTable->item(currentRow, 3)->checkState() == Qt::Checked; - pluginInfo->setAutoload(autoLoadValue); - } + for (int currentRow = 0; currentRow < pluginInfoTable->rowCount(); currentRow++) + { + LPPluginInfo pluginInfo = getPluginInfoFromTable(currentRow); + bool autoLoadValue = pluginInfoTable->item(currentRow, 3)->checkState() == Qt::Checked; + pluginInfo->setAutoload(autoLoadValue); + } } diff --git a/app/rdo_studio/src/view_preferences.h b/app/rdo_studio/src/view_preferences.h index 7c64582ce..b7041c5a3 100644 --- a/app/rdo_studio/src/view_preferences.h +++ b/app/rdo_studio/src/view_preferences.h @@ -1,5 +1,4 @@ -#ifndef _RDO_STUDIO_VIEW_PREFERENCES_H_ -#define _RDO_STUDIO_VIEW_PREFERENCES_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -28,379 +27,365 @@ // -------------------------------------------------------------------------------- class ViewPreferences - : public QDialog - , private Ui::ViewPreferencesDialog + : public QDialog + , private Ui::ViewPreferencesDialog { Q_OBJECT public: - explicit ViewPreferences(QWidget* pParent = NULL); + explicit ViewPreferences(QWidget* pParent = NULL); private slots: - void onOkButton(); - void onCancelButton(); - void onApplyButton(); - - void onCheckInput(const QString& text); - - void onSetup(int state); - void onCheckInFuture(int state); - void onOpenLastProject(int state); - void onShowFullName(int state); - - void onCodeCompUse(int state); - void onCodeCompShowFullList(bool state); - void onMarginFold(int state); - void onMarginBookmark(int state); - void onMarginLineNumber(int state); - - void onUseTabSymbol(int state); - void onIndentAsTab(int state); - void onAutoIndent(int state); - void onEraseWithTab(bool state); - void onTabSize(const QString& text); - void onIndentSize(const QString& text); - - void onTreeWidgetItemActivated(QTreeWidgetItem* item, int column); - void onSwitchPreviewComboBox(int index); - void onFontSize(int index); - void onFontType(int index); - void onFontBold(int state); - void onFontItalic(int state); - void onFontUnderline(int state); - void onHorzScroll(int state); - void onWordWrap(int state); - void onBookmark(int index); - void onFold(int index); - void onComment(int state); - void onWarning(int state); - void onHorzIndent(const QString& text); - void onVertIndent(const QString& text); - void onFgColor(int index); - void onBgColor(int index); - void onFgColorDialog(); - void onBgColorDialog(); - void onFgColorSelected(const QColor& color); - void onBgColorSelected(const QColor& color); - void onTitleSize(int index); - void onLegendSize(int index); - void onTickWidth(const QString& text); - void onThemeComboBox(int index); - - void onHelpContext(); - - void deletePlugin (); - void onStartPlugin (); - void onStopPlugin (); - void updateButtonsState (); + void onOkButton(); + void onCancelButton(); + void onApplyButton(); + + void onCheckInput(const QString& text); + + void onSetup(int state); + void onCheckInFuture(int state); + void onOpenLastProject(int state); + void onShowFullName(int state); + + void onCodeCompUse(int state); + void onCodeCompShowFullList(bool state); + void onMarginFold(int state); + void onMarginBookmark(int state); + void onMarginLineNumber(int state); + + void onUseTabSymbol(int state); + void onIndentAsTab(int state); + void onAutoIndent(int state); + void onEraseWithTab(bool state); + void onTabSize(const QString& text); + void onIndentSize(const QString& text); + + void onTreeWidgetItemActivated(QTreeWidgetItem* item, int column); + void onSwitchPreviewComboBox(int index); + void onFontSize(int index); + void onFontType(int index); + void onFontBold(int state); + void onFontItalic(int state); + void onFontUnderline(int state); + void onHorzScroll(int state); + void onWordWrap(int state); + void onBookmark(int index); + void onFold(int index); + void onComment(int state); + void onWarning(int state); + void onHorzIndent(const QString& text); + void onVertIndent(const QString& text); + void onFgColor(int index); + void onBgColor(int index); + void onFgColorDialog(); + void onBgColorDialog(); + void onFgColorSelected(const QColor& color); + void onBgColorSelected(const QColor& color); + void onTitleSize(int index); + void onLegendSize(int index); + void onTickWidth(const QString& text); + void onThemeComboBox(int index); + + void onHelpContext(); + + void deletePlugin (); + void onStartPlugin (); + void onStopPlugin (); + void updateButtonsState (); private: - enum StyleType - { - ST_CURRENT = 0, - ST_DEFAULT, - ST_CPP, - ST_PASCAL, - ST_HTML, - ST_CLASSIC, - ST_TWILIGHT, - ST_OCEAN - }; - - enum ItemType - { - IT_ROOT = 0, - IT_EDITOR, - IT_BUILD, - IT_DEBUG, - IT_LOG, - IT_RESULT, - IT_FIND, - IT_CHART, - IT_FRAME, - IT_EDITOR_PLAINTEXT, - IT_EDITOR_IDENTIFICATOR, - IT_EDITOR_KEYWORD, - IT_EDITOR_FUNCTION, - IT_EDITOR_TRACE, - IT_EDITOR_COLOR, - IT_EDITOR_COMMENT, - IT_EDITOR_NUMBER, - IT_EDITOR_STRING, - IT_EDITOR_OPERATOR, - IT_EDITOR_CARET, - IT_EDITOR_TEXTSELECTION, - IT_EDITOR_BOOKMARK, - IT_EDITOR_FOLD, - IT_EDITOR_ERROR, - IT_BUILD_TEXT, - IT_BUILD_SELECTEDLINE, - IT_LOG_ES, - IT_LOG_EB, - IT_LOG_EF, - IT_LOG_EI, - IT_LOG_ER, - IT_LOG_RC, - IT_LOG_RE, - IT_LOG_RK, - IT_LOG_V, - IT_LOG_STATUS, - IT_LOG_DPS, - IT_LOG_SB, - IT_LOG_SO, - IT_LOG_STN, - IT_LOG_STD, - IT_LOG_STR, - IT_LOG_SRC, - IT_LOG_SRE, - IT_LOG_SRK, - IT_LOG_SD, - IT_LOG_SES, - IT_LOG_SEN, - IT_LOG_SEM, - IT_LOG_SEF, - IT_LOG_SEU, - IT_FIND_SEARCHTEXT, - IT_CHART_AXIS, - IT_CHART_TITLE, - IT_CHART_LEGEND, - IT_CHART_CHART, - IT_CHART_TIME, - IT_FRAME_BORDER, - IT_FRAME_BACKGROUND - }; - - class StyleItem; - - class StyleProperty: boost::noncopyable - { - public: - StyleItem* item; - int identificator; - - rdo::gui::style::StyleFont::style& font_style; - - QColor& fg_color; - QColor& bg_color; - QColor& fg_disable_color; - QColor& bg_disable_color; - - StyleProperty(StyleItem* item, int identificator, rdo::gui::style::StyleFont::style& font_style, QColor& fg_color, QColor& bg_color, QColor& fg_disable_color = null_fg_color, QColor& bg_disable_color = null_bg_color) - : item(item) - , identificator(identificator) - , font_style(font_style) - , fg_color(fg_color) - , bg_color(bg_color) - , fg_disable_color(fg_disable_color) - , bg_disable_color(bg_disable_color) - {} - }; - - typedef std::list PropertyList; - - class StyleItem: boost::noncopyable - { - public: - ItemType type; - int& font_size; - std::string& font_name; - bool& wordwrap; - bool& horzscrollbar; - bool& warning; - rdo::gui::editor::EditStyle::Bookmark& bookmarkstyle; - rdo::gui::editor::ModelStyle::Fold& foldstyle; - bool& commentfold; - - PropertyList properties; - - StyleItem(ItemType type, int& font_size, std::string& font_name, bool& wordwrap = null_wordwrap, bool& horzscrollbar = null_horzscrollbar, rdo::gui::editor::EditStyle::Bookmark& bookmarkstyle = null_bookmarkstyle, rdo::gui::editor::ModelStyle::Fold& foldstyle = null_foldstyle, bool& commentfold = null_commentfold, bool& warning = null_warning) - : type(type) - , font_size(font_size) - , font_name(font_name) - , wordwrap(wordwrap) - , horzscrollbar(horzscrollbar) - , warning(warning) - , bookmarkstyle(bookmarkstyle) - , foldstyle(foldstyle) - , commentfold(commentfold) - {} - }; - - typedef std::list StyleItemList; - - StyleItemList style_list; - - int all_font_size; - std::string all_font_name; - QColor all_fg_color; - QColor all_bg_color; - - rdo::gui::style::StyleFont::style null_font_style; - static bool null_wordwrap; - static bool null_horzscrollbar; - static bool null_warning; - static bool null_commentfold; - static rdo::gui::editor::EditStyle::Bookmark null_bookmarkstyle; - static rdo::gui::editor::ModelStyle::Fold null_foldstyle; - static QColor null_fg_color; - static QColor null_bg_color; - - bool m_setup; - bool m_checkInFuture; - bool m_openLastProject; - bool m_showFullName; - - rdo::gui::editor::ModelStyle style_editor; - rdo::gui::editor::BuildStyle style_build; - rdo::gui::editor::EditStyle style_debug; - rdo::gui::editor::ResultsStyle style_results; - rdo::gui::editor::FindStyle style_find; - rdo::gui::tracer::LogStyle style_trace; - rdo::gui::tracer::ChartViewStyle style_chart; - rdo::gui::frame::FrameStyle style_frame; - - rdo::gui::editor::Model* preview_editor; - rdo::gui::editor::Build* preview_build; - rdo::gui::editor::Debug* preview_debug; - rdo::gui::editor::Results* preview_results; - rdo::gui::editor::Find* preview_find; - rdo::gui::tracer::LogMainWnd* preview_trace; - rdo::gui::tracer::ChartDoc* preview_chart_doc; - rdo::gui::tracer::ChartView* preview_chart; - std::vector preview_times; - rdo::gui::tracer::LPSerie preview_serie; - rdo::gui::frame::OptionsView* preview_frame; - - typedef QTreeWidgetItem* treeItem; - - //Все окна - treeItem m_pRoot; - treeItem m_pText; - treeItem m_pCompile; - treeItem m_pDebug; - treeItem m_pTrace; - treeItem m_pResult; - treeItem m_pSearch; - treeItem m_pChart; - treeItem m_pAnimation; - - //Исходный текст - treeItem m_pPlainText; - treeItem m_pVariable; - treeItem m_pKeyword; - treeItem m_pFunction; - treeItem m_pTraceText; - treeItem m_pColor; - treeItem m_pComment; - treeItem m_pNumber; - treeItem m_pString; - treeItem m_pOperator; - treeItem m_pCaret; - treeItem m_pSelection; - treeItem m_pBookmark; - treeItem m_pGroup; - treeItem m_pError; - - //Окно компиляции - treeItem m_pTextCompile; - treeItem m_pSelectedString; - treeItem m_pCaretCompile; - treeItem m_pSelectionCompile; - treeItem m_pBookmarkCompile; - - //Окно отладки - treeItem m_pTextDebug; - treeItem m_pCaretDebug; - treeItem m_pSelectionDebug; - treeItem m_pBookmarkDebug; - - //Окно трассировки - treeItem m_pES; - treeItem m_pEB; - treeItem m_pEF; - treeItem m_pEI; - treeItem m_pER; - treeItem m_pRC; - treeItem m_pRE; - treeItem m_pRK; - treeItem m_pV; - treeItem m_pStatus; - treeItem m_pDPS; - treeItem m_pSB; - treeItem m_pSO; - treeItem m_pSTN; - treeItem m_pSTD; - treeItem m_pSTR; - treeItem m_pSRC; - treeItem m_pSRE; - treeItem m_pSRK; - treeItem m_pSD; - treeItem m_pSES; - treeItem m_pSEN; - treeItem m_pSEM; - treeItem m_pSEF; - treeItem m_pSEU; - - //Окно результатов - treeItem m_pPlainTextResult; - treeItem m_pVariableResult; - treeItem m_pKeywordResult; - treeItem m_pNumberResult; - treeItem m_pStringResult; - treeItem m_pOperatorResult; - treeItem m_pCaretResult; - treeItem m_pSelectionResult; - treeItem m_pBookmarkResult; - - //Окно поиска - treeItem m_pTextSearch; - treeItem m_pStringSearch; - treeItem m_pSelectedStringSearch; - treeItem m_pCaretSearch; - treeItem m_pSelectionSearch; - treeItem m_pBookmarkSearch; - - //Окно графиков - treeItem m_pAxis; - treeItem m_pTitle; - treeItem m_pLegend; - treeItem m_pGraph; - treeItem m_pTime; - - //Окно анимации - treeItem m_pEdgingColor; - treeItem m_pBackgroundColor; - - QColorDialog* fgColorDlg; - QColorDialog* bgColorDlg; - - void createStyles(); - void createPreview(); - void createTree(); - void insertColors(QComboBox* colorBox); - void insertColor (const QColor& color, const QString& colorName, QComboBox* colorBox); - StyleProperty* getStyleProperty(); - StyleItem* getStyleItem(); - QTreeWidgetItem* createTreeItem (QTreeWidgetItem* parent, const QString& name, ItemType itemType); - - void apply(); - void checkAllData(); - - void keyPressEvent(QKeyEvent* pEvent); - - void updateDialog(); - void updatePreview(); - void updateStyleTab(); - void updateThemeComboBox(StyleProperty* prop); - void updateTheme(); - - typedef std::vector IntVector; - LPPluginInfoList m_pPluginInfoList; - - void fillPluginInfoTable (); - void populateRow (const LPPluginInfo& plgInfo); - LPPluginInfo getPluginInfoFromTable (int pluginRow) const; - IntVector selectedRows () const; - void updatePluginList (); + enum class ItemType + { + ROOT = 0, + EDITOR, + BUILD, + DEBUG, + LOG, + RESULT, + FIND, + CHART, + FRAME, + EDITOR_PLAINTEXT, + EDITOR_IDENTIFICATOR, + EDITOR_KEYWORD, + EDITOR_FUNCTION, + EDITOR_TRACE, + EDITOR_COLOR, + EDITOR_COMMENT, + EDITOR_NUMBER, + EDITOR_STRING, + EDITOR_OPERATOR, + EDITOR_CARET, + EDITOR_TEXTSELECTION, + EDITOR_BOOKMARK, + EDITOR_FOLD, + EDITOR_ERROR, + BUILD_TEXT, + BUILD_SELECTEDLINE, + LOG_ES, + LOG_EB, + LOG_EF, + LOG_EI, + LOG_ER, + LOG_RC, + LOG_RE, + LOG_RK, + LOG_V, + LOG_STATUS, + LOG_DPS, + LOG_SB, + LOG_SO, + LOG_STN, + LOG_STD, + LOG_STR, + LOG_SRC, + LOG_SRE, + LOG_SRK, + LOG_SD, + LOG_SES, + LOG_SEN, + LOG_SEM, + LOG_SEF, + LOG_SEU, + FIND_SEARCHTEXT, + CHART_AXIS, + CHART_TITLE, + CHART_LEGEND, + CHART_CHART, + CHART_TIME, + FRAME_BORDER, + FRAME_BACKGROUND + }; + + class StyleItem; + + class StyleProperty: private boost::noncopyable + { + public: + StyleItem* item; + ItemType identificator; + + rdo::gui::style::StyleFont::Style& font_style; + + QColor& fg_color; + QColor& bg_color; + QColor& fg_disable_color; + QColor& bg_disable_color; + + StyleProperty(StyleItem* item, ItemType identificator, rdo::gui::style::StyleFont::Style& font_style, QColor& fg_color, QColor& bg_color, QColor& fg_disable_color = null_fg_color, QColor& bg_disable_color = null_bg_color) + : item(item) + , identificator(identificator) + , font_style(font_style) + , fg_color(fg_color) + , bg_color(bg_color) + , fg_disable_color(fg_disable_color) + , bg_disable_color(bg_disable_color) + {} + }; + + typedef std::list PropertyList; + + class StyleItem: private boost::noncopyable + { + public: + ItemType type; + int& font_size; + std::string& font_name; + bool& wordwrap; + bool& horzscrollbar; + bool& warning; + rdo::gui::editor::EditStyle::Bookmark& bookmarkstyle; + rdo::gui::editor::ModelStyle::Fold& foldstyle; + bool& commentfold; + + PropertyList properties; + + StyleItem(ItemType type, int& font_size, std::string& font_name, bool& wordwrap = null_wordwrap, bool& horzscrollbar = null_horzscrollbar, rdo::gui::editor::EditStyle::Bookmark& bookmarkstyle = null_bookmarkstyle, rdo::gui::editor::ModelStyle::Fold& foldstyle = null_foldstyle, bool& commentfold = null_commentfold, bool& warning = null_warning) + : type(type) + , font_size(font_size) + , font_name(font_name) + , wordwrap(wordwrap) + , horzscrollbar(horzscrollbar) + , warning(warning) + , bookmarkstyle(bookmarkstyle) + , foldstyle(foldstyle) + , commentfold(commentfold) + {} + }; + + typedef std::list StyleItemList; + + StyleItemList style_list; + + int all_font_size; + std::string all_font_name; + QColor all_fg_color; + QColor all_bg_color; + + rdo::gui::style::StyleFont::Style null_font_style; + static bool null_wordwrap; + static bool null_horzscrollbar; + static bool null_warning; + static bool null_commentfold; + static rdo::gui::editor::EditStyle::Bookmark null_bookmarkstyle; + static rdo::gui::editor::ModelStyle::Fold null_foldstyle; + static QColor null_fg_color; + static QColor null_bg_color; + + bool m_setup; + bool m_checkInFuture; + bool m_openLastProject; + bool m_showFullName; + + rdo::gui::editor::ModelStyle style_editor; + rdo::gui::editor::BuildStyle style_build; + rdo::gui::editor::EditStyle style_debug; + rdo::gui::editor::ResultsStyle style_results; + rdo::gui::editor::FindStyle style_find; + rdo::gui::tracer::LogStyle style_trace; + rdo::gui::tracer::ChartViewStyle style_chart; + rdo::gui::frame::FrameStyle style_frame; + + rdo::gui::editor::Model* preview_editor; + rdo::gui::editor::Build* preview_build; + rdo::gui::editor::Debug* preview_debug; + rdo::gui::editor::Results* preview_results; + rdo::gui::editor::Find* preview_find; + rdo::gui::tracer::LogMainWnd* preview_trace; + rdo::gui::tracer::ChartDoc* preview_chart_doc; + rdo::gui::tracer::ChartView* preview_chart; + std::vector preview_times; + rdo::gui::tracer::LPSerie preview_serie; + rdo::gui::frame::OptionsView* preview_frame; + + typedef QTreeWidgetItem* treeItem; + + //Все окна + treeItem m_pRoot; + treeItem m_pText; + treeItem m_pCompile; + treeItem m_pDebug; + treeItem m_pTrace; + treeItem m_pResult; + treeItem m_pSearch; + treeItem m_pChart; + treeItem m_pAnimation; + + //Исходный текст + treeItem m_pPlainText; + treeItem m_pVariable; + treeItem m_pKeyword; + treeItem m_pFunction; + treeItem m_pTraceText; + treeItem m_pColor; + treeItem m_pComment; + treeItem m_pNumber; + treeItem m_pString; + treeItem m_pOperator; + treeItem m_pCaret; + treeItem m_pSelection; + treeItem m_pBookmark; + treeItem m_pGroup; + treeItem m_pError; + + //Окно компиляции + treeItem m_pTextCompile; + treeItem m_pSelectedString; + treeItem m_pCaretCompile; + treeItem m_pSelectionCompile; + treeItem m_pBookmarkCompile; + + //Окно отладки + treeItem m_pTextDebug; + treeItem m_pCaretDebug; + treeItem m_pSelectionDebug; + treeItem m_pBookmarkDebug; + + //Окно трассировки + treeItem m_pES; + treeItem m_pEB; + treeItem m_pEF; + treeItem m_pEI; + treeItem m_pER; + treeItem m_pRC; + treeItem m_pRE; + treeItem m_pRK; + treeItem m_pV; + treeItem m_pStatus; + treeItem m_pDPS; + treeItem m_pSB; + treeItem m_pSO; + treeItem m_pSTN; + treeItem m_pSTD; + treeItem m_pSTR; + treeItem m_pSRC; + treeItem m_pSRE; + treeItem m_pSRK; + treeItem m_pSD; + treeItem m_pSES; + treeItem m_pSEN; + treeItem m_pSEM; + treeItem m_pSEF; + treeItem m_pSEU; + + //Окно результатов + treeItem m_pPlainTextResult; + treeItem m_pVariableResult; + treeItem m_pKeywordResult; + treeItem m_pNumberResult; + treeItem m_pStringResult; + treeItem m_pOperatorResult; + treeItem m_pCaretResult; + treeItem m_pSelectionResult; + treeItem m_pBookmarkResult; + + //Окно поиска + treeItem m_pTextSearch; + treeItem m_pStringSearch; + treeItem m_pSelectedStringSearch; + treeItem m_pCaretSearch; + treeItem m_pSelectionSearch; + treeItem m_pBookmarkSearch; + + //Окно графиков + treeItem m_pAxis; + treeItem m_pTitle; + treeItem m_pLegend; + treeItem m_pGraph; + treeItem m_pTime; + + //Окно анимации + treeItem m_pEdgingColor; + treeItem m_pBackgroundColor; + + QColorDialog* fgColorDlg; + QColorDialog* bgColorDlg; + + void createStyles(); + void createPreview(); + void createTree(); + void insertColors(QComboBox* colorBox); + void insertColor (const QColor& color, const QString& colorName, QComboBox* colorBox); + StyleProperty* getStyleProperty(); + StyleItem* getStyleItem(); + QTreeWidgetItem* createTreeItem (QTreeWidgetItem* parent, const QString& name, ItemType itemType); + + void apply(); + void checkAllData(); + + void keyPressEvent(QKeyEvent* pEvent); + + void updateDialog(); + void updatePreview(); + void updateStyleTab(); + void updateThemeComboBox(StyleProperty* prop); + void updateTheme(); + + typedef std::vector IntVector; + LPPluginInfoList m_pPluginInfoList; + + void fillPluginInfoTable (); + void populateRow (const LPPluginInfo& plgInfo); + LPPluginInfo getPluginInfoFromTable (int pluginRow) const; + IntVector selectedRows () const; + void updatePluginList (); }; - -#endif // _RDO_STUDIO_VIEW_PREFERENCES_H_ \ No newline at end of file diff --git a/cmake/bison.cmake b/cmake/bison.cmake index ccfa75aea..cd972138d 100644 --- a/cmake/bison.cmake +++ b/cmake/bison.cmake @@ -4,54 +4,54 @@ MACRO(RDO_BISON_TARGET FILE_TYPE) - SET(BISON_${FILE_TYPE}_INPUT ${GRAMMA_INPUT_PATH}/rdo${FILE_TYPE}.y) - - SET(CPP_OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${FILE_TYPE}.cpp) - SET(BISON_${FILE_TYPE}_OUTPUTS ${CPP_OUTPUT_FILE}) - SET(OUTPUT_FILE ${CPP_OUTPUT_FILE}) - - LIST(APPEND OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${FILE_TYPE}.dot) - LIST(APPEND OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${FILE_TYPE}.output) - - SET(BISON_NAME ${FILE_TYPE}) - SET(BISON_DEFINE) - SET(BISON_${FILE_TYPE}_OUTPUT_HEADER) - IF(${ARGC} GREATER 2 OR ${ARGC} EQUAL 2) - SET(BISON_NAME ${ARGV1}) - IF(${ARGC} GREATER 3 OR ${ARGC} EQUAL 3) - SET(BISON_${FILE_TYPE}_OUTPUT_HEADER ${GRAMMA_H}) - SET(BISON_DEFINE --defines=${BISON_${FILE_TYPE}_OUTPUT_HEADER}) - LIST(APPEND OUTPUT_FILE ${BISON_${FILE_TYPE}_OUTPUT_HEADER}) - ENDIF() - ENDIF() - - ADD_CUSTOM_COMMAND( - OUTPUT ${OUTPUT_FILE} - COMMAND ${BISON_EXECUTABLE} ARGS -g -v ${BISON_DEFINE} -p${BISON_NAME} -o ${CPP_OUTPUT_FILE} ${BISON_${FILE_TYPE}_INPUT} - DEPENDS ${BISON_${FILE_TYPE}_INPUT} - COMMENT "[BISON][rdo${FILE_TYPE}] Building parser with bison ${BISON_VERSION}" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - - IF(MSVC) - SET_SOURCE_FILES_PROPERTIES(${CPP_OUTPUT_FILE} PROPERTIES COMPILE_FLAGS "/Od") - ENDIF() + SET(BISON_${FILE_TYPE}_INPUT ${GRAMMA_INPUT_PATH}/rdo${FILE_TYPE}.y) + + SET(CPP_OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${FILE_TYPE}.cpp) + SET(BISON_${FILE_TYPE}_OUTPUTS ${CPP_OUTPUT_FILE}) + SET(OUTPUT_FILE ${CPP_OUTPUT_FILE}) + + LIST(APPEND OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${FILE_TYPE}.dot) + LIST(APPEND OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${FILE_TYPE}.output) + + SET(BISON_NAME ${FILE_TYPE}) + SET(BISON_DEFINE) + SET(BISON_${FILE_TYPE}_OUTPUT_HEADER) + IF(${ARGC} GREATER 2 OR ${ARGC} EQUAL 2) + SET(BISON_NAME ${ARGV1}) + IF(${ARGC} GREATER 3 OR ${ARGC} EQUAL 3) + SET(BISON_${FILE_TYPE}_OUTPUT_HEADER ${GRAMMA_H}) + SET(BISON_DEFINE --defines=${BISON_${FILE_TYPE}_OUTPUT_HEADER}) + LIST(APPEND OUTPUT_FILE ${BISON_${FILE_TYPE}_OUTPUT_HEADER}) + ENDIF() + ENDIF() + + ADD_CUSTOM_COMMAND( + OUTPUT ${OUTPUT_FILE} + COMMAND ${BISON_EXECUTABLE} ARGS -g -v ${BISON_DEFINE} -p${BISON_NAME} -o ${CPP_OUTPUT_FILE} ${BISON_${FILE_TYPE}_INPUT} + DEPENDS ${BISON_${FILE_TYPE}_INPUT} + COMMENT "[BISON][rdo${FILE_TYPE}] Building parser with bison ${BISON_VERSION}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + + IF(MSVC) + SET_SOURCE_FILES_PROPERTIES(${CPP_OUTPUT_FILE} PROPERTIES COMPILE_FLAGS "/Od") + ENDIF() ENDMACRO() MACRO(RDO_FLEX_TARGET Name Input Output) - SET(FLEX_EXECUTABLE_opts "${ARGV4}") - SEPARATE_ARGUMENTS(FLEX_EXECUTABLE_opts) - - ADD_CUSTOM_COMMAND( - OUTPUT ${Output} - COMMAND ${FLEX_EXECUTABLE} - ARGS ${FLEX_EXECUTABLE_opts} -o${Output} ${Input} - DEPENDS ${Input} - COMMENT "[FLEX][${Name}] Building scanner with flex ${FLEX_VERSION}" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - - IF(MSVC) - SET_SOURCE_FILES_PROPERTIES(${Output} PROPERTIES COMPILE_FLAGS "/Od") - ENDIF() - - SET(FLEX_${Name}_OUTPUTS ${Output}) + SET(FLEX_EXECUTABLE_opts "${ARGV4}") + SEPARATE_ARGUMENTS(FLEX_EXECUTABLE_opts) + + ADD_CUSTOM_COMMAND( + OUTPUT ${Output} + COMMAND ${FLEX_EXECUTABLE} + ARGS ${FLEX_EXECUTABLE_opts} -o${Output} ${Input} + DEPENDS ${Input} + COMMENT "[FLEX][${Name}] Building scanner with flex ${FLEX_VERSION}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + + IF(MSVC) + SET_SOURCE_FILES_PROPERTIES(${Output} PROPERTIES COMPILE_FLAGS "/Od") + ENDIF() + + SET(FLEX_${Name}_OUTPUTS ${Output}) ENDMACRO() diff --git a/cmake/build.version.cmake b/cmake/build.version.cmake index c14172ec1..6761d8116 100644 --- a/cmake/build.version.cmake +++ b/cmake/build.version.cmake @@ -6,70 +6,60 @@ // ----------------------------------------------------------------------- SYNOPSIS // -------------------------------------------------------------------------------- -#ifndef _RDO_BUILD_VERSION_H_ -#define _RDO_BUILD_VERSION_H_ +#pragma once namespace rdo { - namespace version - { - static const std::string g_appName("${APP_NAME}"); - static const std::string g_version("${PROJECT_VERSION_LONG}"); - static const std::string g_site ("${ORG_WEBSITE}"); - -#ifdef RDO_MT - static const std::string g_mt("mt"); -#else - static const std::string g_mt("st"); -#endif + namespace version + { + static const std::string g_appName("${APP_NAME}"); + static const std::string g_version("${PROJECT_VERSION_LONG}"); + static const std::string g_site ("${ORG_WEBSITE}"); #ifdef RDOSIM_COMPATIBLE - static const std::string g_comp("-comp"); + static const std::string g_comp("-comp"); #else - static const std::string g_comp(""); + static const std::string g_comp(""); #endif #ifdef OST_WINDOWS - static const std::string g_systemOS("win"); + static const std::string g_systemOS("win"); #elif defined(OST_MACOSX) static const std::string g_systemOS("mac"); #elif defined(OST_LINUX) - static const std::string g_systemOS("linux"); + static const std::string g_systemOS("linux"); #endif #ifdef ARCHITECTURE_AMD64 - static const std::string g_systemArchitectures("AMD64"); + static const std::string g_systemArchitectures("AMD64"); #elif defined(ARCHITECTURE_X86) - static const std::string g_systemArchitectures("x86"); + static const std::string g_systemArchitectures("x86"); #elif defined(ARCHITECTURE_ARM) - static const std::string g_systemArchitectures("arm"); + static const std::string g_systemArchitectures("arm"); #endif #ifdef RDO_LICENSE_ACADEMIC - static const std::string g_academic("не для коммерческого использования"); + static const std::string g_academic("не для коммерческого использования"); #else - static const std::string g_academic(""); + static const std::string g_academic(""); #endif #ifdef RDO_LIMIT_RES - static const std::string g_limitRes("ограниченная версия"); + static const std::string g_limitRes("ограниченная версия"); #else - static const std::string g_limitRes(""); + static const std::string g_limitRes(""); #endif - static const std::string g_versionName = boost::str(boost::format("%1% %2%%3%-version %4% %5%-%6%%7%") - % g_appName - % g_mt - % g_comp - % g_version - % g_systemOS - % g_systemArchitectures - % (!g_academic.empty() || !g_limitRes.empty() - ? "\n(" + g_academic + (!g_academic.empty() && !g_limitRes.empty() ? ", " : "") + g_limitRes + ")" - : "" - ) - ); - } + static const std::string g_versionName = boost::str(boost::format("%1% %2%-version %3% %4%-%5%%6%") + % g_appName + % g_comp + % g_version + % g_systemOS + % g_systemArchitectures + % (!g_academic.empty() || !g_limitRes.empty() + ? "\n(" + g_academic + (!g_academic.empty() && !g_limitRes.empty() ? ", " : "") + g_limitRes + ")" + : "" + ) + ); + } } - -#endif // _RDO_BUILD_VERSION_H_ diff --git a/cmake/pch.cmake b/cmake/pch.cmake index 32feb711c..5da62ddd3 100644 --- a/cmake/pch.cmake +++ b/cmake/pch.cmake @@ -4,39 +4,39 @@ MACRO(ADD_PCH SOURCE_FILES NO_PCH_FILES PROJECT_PATH PCH_PATH_LOCAL PCH_FILE_NAME) - SET(PCH_PATH_LOCAL_INTERNAL ${PCH_PATH_LOCAL}) - IF (${PCH_PATH_LOCAL_INTERNAL} STREQUAL "./" OR ${PCH_PATH_LOCAL_INTERNAL} STREQUAL ".") - SET(PCH_PATH_LOCAL_INTERNAL) - ELSE() - SET(PCH_PATH_LOCAL_INTERNAL ${PCH_PATH_LOCAL_INTERNAL}/) - ENDIF() + SET(PCH_PATH_LOCAL_INTERNAL ${PCH_PATH_LOCAL}) + IF (${PCH_PATH_LOCAL_INTERNAL} STREQUAL "./" OR ${PCH_PATH_LOCAL_INTERNAL} STREQUAL ".") + SET(PCH_PATH_LOCAL_INTERNAL) + ELSE() + SET(PCH_PATH_LOCAL_INTERNAL ${PCH_PATH_LOCAL_INTERNAL}/) + ENDIF() - SET(PCH_FILE_HEADER_IN_SOURCE ${PROJECT_PATH}/${PCH_PATH_LOCAL_INTERNAL}${PCH_FILE_NAME}.h) - SET(PCH_BINARY_OUT ${CMAKE_CURRENT_BINARY_DIR}/${PCH_FILE_NAME}.pch) - SET(PHP_FILE_CPP ${PCH_PATH_LOCAL_INTERNAL}${PCH_FILE_NAME}.cpp) + SET(PCH_FILE_HEADER_IN_SOURCE ${PROJECT_PATH}/${PCH_PATH_LOCAL_INTERNAL}${PCH_FILE_NAME}.h) + SET(PCH_BINARY_OUT ${CMAKE_CURRENT_BINARY_DIR}/${PCH_FILE_NAME}.pch) + SET(PHP_FILE_CPP ${PCH_PATH_LOCAL_INTERNAL}${PCH_FILE_NAME}.cpp) - FOREACH(source_file ${SOURCE_FILES}) - GET_FILENAME_COMPONENT(CPP ${source_file} EXT) - IF(${CPP} STREQUAL ".cpp") - IF(${source_file} STREQUAL ${PHP_FILE_CPP}) - SET_SOURCE_FILES_PROPERTIES(${PHP_FILE_CPP} - PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} /Yc${PCH_FILE_HEADER_IN_SOURCE} /Fp${PCH_BINARY_OUT}" - ) - SET_SOURCE_FILES_PROPERTIES(${PHP_FILE_CPP} - PROPERTIES OBJECT_OUTPUTS ${PCH_BINARY_OUT} - ) - ELSE() - LIST(FIND NO_PCH_FILES ${source_file} no_pch_index) - IF(${no_pch_index} EQUAL -1) - SET_SOURCE_FILES_PROPERTIES(${source_file} - PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} /Yu${PCH_FILE_HEADER_IN_SOURCE} /Fp${PCH_BINARY_OUT}" - ) - SET_SOURCE_FILES_PROPERTIES(${source_file} - PROPERTIES OBJECT_DEPENDS ${PCH_BINARY_OUT} - ) - ENDIF(${no_pch_index} EQUAL -1) - ENDIF() - ENDIF() - ENDFOREACH(source_file) + FOREACH(source_file ${SOURCE_FILES}) + GET_FILENAME_COMPONENT(CPP ${source_file} EXT) + IF(${CPP} STREQUAL ".cpp") + IF(${source_file} STREQUAL ${PHP_FILE_CPP}) + SET_SOURCE_FILES_PROPERTIES(${PHP_FILE_CPP} + PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} /Yc${PCH_FILE_HEADER_IN_SOURCE} /Fp${PCH_BINARY_OUT}" + ) + SET_SOURCE_FILES_PROPERTIES(${PHP_FILE_CPP} + PROPERTIES OBJECT_OUTPUTS ${PCH_BINARY_OUT} + ) + ELSE() + LIST(FIND NO_PCH_FILES ${source_file} no_pch_index) + IF(${no_pch_index} EQUAL -1) + SET_SOURCE_FILES_PROPERTIES(${source_file} + PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} /Yu${PCH_FILE_HEADER_IN_SOURCE} /Fp${PCH_BINARY_OUT}" + ) + SET_SOURCE_FILES_PROPERTIES(${source_file} + PROPERTIES OBJECT_DEPENDS ${PCH_BINARY_OUT} + ) + ENDIF(${no_pch_index} EQUAL -1) + ENDIF() + ENDIF() + ENDFOREACH(source_file) ENDMACRO(ADD_PCH) diff --git a/cmake/split-bison.cmake b/cmake/split-bison.cmake index 035fd178e..58cfea095 100644 --- a/cmake/split-bison.cmake +++ b/cmake/split-bison.cmake @@ -4,49 +4,49 @@ MACRO(RDO_SPLIT_BISON_TARGET INPUT_FILE Y_1 Y_2) - SET(${INPUT_FILE}_INPUT ${GRAMMA_INPUT_PATH}/rdo${INPUT_FILE}.yx) - - SET(BISON_${FILE_TYPE}_INPUT_1 ${CMAKE_CURRENT_BINARY_DIR}/rdo${Y_1}.y) - SET(BISON_${FILE_TYPE}_INPUT_2 ${CMAKE_CURRENT_BINARY_DIR}/rdo${Y_2}.y) - - SET(${INPUT_FILE}_PASS1 ${CMAKE_CURRENT_BINARY_DIR}/rdo${Y_1}.y) - SET(${INPUT_FILE}_PASS2 ${CMAKE_CURRENT_BINARY_DIR}/rdo${Y_2}.y) - - SET(CPP_OUTPUT_FILE_1 ${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_1}.cpp) - SET(CPP_OUTPUT_FILE_2 ${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_2}.cpp) - - IF(MSVC) - SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_1}.cpp PROPERTIES COMPILE_FLAGS "/Od") - SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_2}.cpp PROPERTIES COMPILE_FLAGS "/Od") - ENDIF() - - SET(BISON_${INPUT_FILE}_OUTPUTS_1 ${CPP_OUTPUT_FILE_1}) - SET(BISON_${INPUT_FILE}_OUTPUTS_2 ${CPP_OUTPUT_FILE_2}) - - SET(OUTPUT_FILE ${CPP_OUTPUT_FILE_1}) - LIST(APPEND OUTPUT_FILE ${CPP_OUTPUT_FILE_2}) - - LIST(APPEND OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_1}.dot) - LIST(APPEND OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_1}.output) - - LIST(APPEND OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_2}.dot) - LIST(APPEND OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_2}.output) - - SET(BISON_DEFINE) - SET(BISON_${INPUT_FILE}_OUTPUT_HEADER) - IF(${ARGC} GREATER 4 OR ${ARGC} EQUAL 4) - SET(BISON_${INPUT_FILE}_OUTPUT_HEADER ${GRAMMA_H}) - SET(BISON_DEFINES -defines) - SET(BISON_DEFINE ${BISON_${INPUT_FILE}_OUTPUT_HEADER}) - LIST(APPEND OUTPUT_FILE ${BISON_${INPUT_FILE}_OUTPUT_HEADER}) - ENDIF() - - ADD_CUSTOM_COMMAND( - OUTPUT ${OUTPUT_FILE} - COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/python/split-bison.py ARGS ${${INPUT_FILE}_INPUT} -y1 ${BISON_${FILE_TYPE}_INPUT_1} -y2 ${BISON_${FILE_TYPE}_INPUT_2} - COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/python/run-bison.py ARGS ${${INPUT_FILE}_INPUT} -y1 ${BISON_${FILE_TYPE}_INPUT_1} -y2 ${BISON_${FILE_TYPE}_INPUT_2} -o1 ${CPP_OUTPUT_FILE_1} -o2 ${CPP_OUTPUT_FILE_2} -n1 ${Y_1} -n2 ${Y_2} -bison ${BISON_EXECUTABLE}\ -g\ -v ${BISON_DEFINES} ${BISON_DEFINE} - DEPENDS ${${INPUT_FILE}_INPUT} - COMMENT "[BISON][rdo${INPUT_FILE}] Building parser with bison ${BISON_VERSION}" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) + SET(${INPUT_FILE}_INPUT ${GRAMMA_INPUT_PATH}/rdo${INPUT_FILE}.yx) + + SET(BISON_${FILE_TYPE}_INPUT_1 ${CMAKE_CURRENT_BINARY_DIR}/rdo${Y_1}.y) + SET(BISON_${FILE_TYPE}_INPUT_2 ${CMAKE_CURRENT_BINARY_DIR}/rdo${Y_2}.y) + + SET(${INPUT_FILE}_PASS1 ${CMAKE_CURRENT_BINARY_DIR}/rdo${Y_1}.y) + SET(${INPUT_FILE}_PASS2 ${CMAKE_CURRENT_BINARY_DIR}/rdo${Y_2}.y) + + SET(CPP_OUTPUT_FILE_1 ${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_1}.cpp) + SET(CPP_OUTPUT_FILE_2 ${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_2}.cpp) + + IF(MSVC) + SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_1}.cpp PROPERTIES COMPILE_FLAGS "/Od") + SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_2}.cpp PROPERTIES COMPILE_FLAGS "/Od") + ENDIF() + + SET(BISON_${INPUT_FILE}_OUTPUTS_1 ${CPP_OUTPUT_FILE_1}) + SET(BISON_${INPUT_FILE}_OUTPUTS_2 ${CPP_OUTPUT_FILE_2}) + + SET(OUTPUT_FILE ${CPP_OUTPUT_FILE_1}) + LIST(APPEND OUTPUT_FILE ${CPP_OUTPUT_FILE_2}) + + LIST(APPEND OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_1}.dot) + LIST(APPEND OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_1}.output) + + LIST(APPEND OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_2}.dot) + LIST(APPEND OUTPUT_FILE ${CMAKE_CURRENT_BINARY_DIR}/rdogram${Y_2}.output) + + SET(BISON_DEFINE) + SET(BISON_${INPUT_FILE}_OUTPUT_HEADER) + IF(${ARGC} GREATER 4 OR ${ARGC} EQUAL 4) + SET(BISON_${INPUT_FILE}_OUTPUT_HEADER ${GRAMMA_H}) + SET(BISON_DEFINES -defines) + SET(BISON_DEFINE ${BISON_${INPUT_FILE}_OUTPUT_HEADER}) + LIST(APPEND OUTPUT_FILE ${BISON_${INPUT_FILE}_OUTPUT_HEADER}) + ENDIF() + + ADD_CUSTOM_COMMAND( + OUTPUT ${OUTPUT_FILE} + COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/python/split-bison.py ARGS ${${INPUT_FILE}_INPUT} -y1 ${BISON_${FILE_TYPE}_INPUT_1} -y2 ${BISON_${FILE_TYPE}_INPUT_2} + COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/python/run-bison.py ARGS ${${INPUT_FILE}_INPUT} -y1 ${BISON_${FILE_TYPE}_INPUT_1} -y2 ${BISON_${FILE_TYPE}_INPUT_2} -o1 ${CPP_OUTPUT_FILE_1} -o2 ${CPP_OUTPUT_FILE_2} -n1 ${Y_1} -n2 ${Y_2} -bison ${BISON_EXECUTABLE}\ -g\ -v ${BISON_DEFINES} ${BISON_DEFINE} + DEPENDS ${${INPUT_FILE}_INPUT} + COMMENT "[BISON][rdo${INPUT_FILE}] Building parser with bison ${BISON_VERSION}" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) ENDMACRO(RDO_SPLIT_BISON_TARGET) diff --git a/cmake/win32.install.cmake b/cmake/win32.install.cmake index 7abd112d9..0be1116f8 100644 --- a/cmake/win32.install.cmake +++ b/cmake/win32.install.cmake @@ -1,9 +1,9 @@ IF(MSVC_IDE) - SET(CONFIG_DIRECTORY_DEBUG ${EXECUTABLE_OUTPUT_PATH}/Debug ) - SET(CONFIG_DIRECTORY_RELEASE ${EXECUTABLE_OUTPUT_PATH}/Release) + SET(CONFIG_DIRECTORY_DEBUG ${EXECUTABLE_OUTPUT_PATH}/Debug ) + SET(CONFIG_DIRECTORY_RELEASE ${EXECUTABLE_OUTPUT_PATH}/Release) ELSE() - SET(CONFIG_DIRECTORY_DEBUG ${EXECUTABLE_OUTPUT_PATH}) - SET(CONFIG_DIRECTORY_RELEASE ${EXECUTABLE_OUTPUT_PATH}) + SET(CONFIG_DIRECTORY_DEBUG ${EXECUTABLE_OUTPUT_PATH}) + SET(CONFIG_DIRECTORY_RELEASE ${EXECUTABLE_OUTPUT_PATH}) ENDIF() SET(QT_PLUGINS plugins) @@ -16,7 +16,7 @@ SET(QT_PLUGINS_SQLDRIVERS_DIR $ENV{QTDIR}/${QT_PLUGINS_SQLDRIVERS}) #FIND_FILE(DLL_D3DCOMPILER D3DCompiler_43.dll PATHS ${QT_LIBRARY_DIR}) SET(DLL_D_AND_R -# ${DLL_D3DCOMPILER} +# ${DLL_D3DCOMPILER} ) FIND_FILE(DLL_R_PLUGINS_QWINDOWS qwindows.dll PATHS ${QT_PLUGINS_PLATFORMS_DIR}) @@ -25,13 +25,13 @@ FIND_FILE(DLL_R_PLUGINS_QMINIMAL qminimal.dll PATHS ${QT_PLUGINS_PLATFORMS_DIR} FIND_FILE(DLL_D_PLUGINS_QMINIMAL qminimald.dll PATHS ${QT_PLUGINS_PLATFORMS_DIR}) SET(CONFIG_PLUGINS_PLATFORM_R - ${DLL_R_PLUGINS_QWINDOWS} - ${DLL_R_PLUGINS_QMINIMAL} + ${DLL_R_PLUGINS_QWINDOWS} + ${DLL_R_PLUGINS_QMINIMAL} ) SET(CONFIG_PLUGINS_PLATFORM_D - ${DLL_D_PLUGINS_QWINDOWS} - ${DLL_D_PLUGINS_QMINIMAL} + ${DLL_D_PLUGINS_QWINDOWS} + ${DLL_D_PLUGINS_QMINIMAL} ) FIND_FILE(DLL_ICUUC icuuc52.dll PATHS ${QT_LIBRARY_DIR}) @@ -62,56 +62,56 @@ FIND_FILE(DLL_R_QT_WEBKIT Qt5WebKit.dll PATHS ${QT_LIBRAR FIND_FILE(DLL_R_QT_WEBKITWIDGETS Qt5WebKitWidgets.dll PATHS ${QT_LIBRARY_DIR}) FIND_FILE(DLL_R_PLUGINS_QSQLITE qsqlite.dll PATHS ${QT_PLUGINS_SQLDRIVERS_DIR}) SET(CONFIG_ASSISTANT - ${DLL_ICUUC} - ${DLL_ICUIN} - ${DLL_ICUDT} - ${DLL_R_QT_CORE} - ${DLL_R_QT_CUI} - ${DLL_R_QT_WIDGETS} - ${EXE_R_ASSISTANT} - ${DLL_R_QT_CLUCENE} - ${DLL_R_QT_HELP} - ${DLL_R_QT_MULTIMEDIA} - ${DLL_R_QT_MULTIMEDIAWIDGETS} - ${DLL_R_QT_NETWORK} - ${DLL_R_QT_OPENGL} - ${DLL_R_QT_POSITIONING} - ${DLL_R_QT_PRINTSUPPORT} - ${DLL_R_QT_QML} - ${DLL_R_QT_QUICK} - ${DLL_R_QT_SENSORS} - ${DLL_R_QT_SQL} - ${DLL_R_QT_WEBKIT} - ${DLL_R_QT_WEBKITWIDGETS} + ${DLL_ICUUC} + ${DLL_ICUIN} + ${DLL_ICUDT} + ${DLL_R_QT_CORE} + ${DLL_R_QT_CUI} + ${DLL_R_QT_WIDGETS} + ${EXE_R_ASSISTANT} + ${DLL_R_QT_CLUCENE} + ${DLL_R_QT_HELP} + ${DLL_R_QT_MULTIMEDIA} + ${DLL_R_QT_MULTIMEDIAWIDGETS} + ${DLL_R_QT_NETWORK} + ${DLL_R_QT_OPENGL} + ${DLL_R_QT_POSITIONING} + ${DLL_R_QT_PRINTSUPPORT} + ${DLL_R_QT_QML} + ${DLL_R_QT_QUICK} + ${DLL_R_QT_SENSORS} + ${DLL_R_QT_SQL} + ${DLL_R_QT_WEBKIT} + ${DLL_R_QT_WEBKITWIDGETS} ) SET(CONFIG_ASSISTANT_PLUGINS_PLATFORM - ${CONFIG_PLUGINS_PLATFORM_R} + ${CONFIG_PLUGINS_PLATFORM_R} ) SET(CONFIG_ASSISTANT_PLUGINS_QSQLITE - ${DLL_R_PLUGINS_QSQLITE} + ${DLL_R_PLUGINS_QSQLITE} ) IF(${MSVC_VERSION} MATCHES "1600") - FIND_FILE(DLL_R_MSVCP msvcp90.dll) - FIND_FILE(DLL_D_MSVCP msvcp90d.dll) - FIND_FILE(DLL_R_MSVCR msvcr90.dll) - FIND_FILE(DLL_D_MSVCR msvcr90d.dll) + FIND_FILE(DLL_R_MSVCP msvcp90.dll) + FIND_FILE(DLL_D_MSVCP msvcp90d.dll) + FIND_FILE(DLL_R_MSVCR msvcr90.dll) + FIND_FILE(DLL_D_MSVCR msvcr90d.dll) ENDIF() IF(${MSVC_VERSION} MATCHES "1700") - FIND_FILE(DLL_R_MSVCP msvcp110.dll) - FIND_FILE(DLL_D_MSVCP msvcp110d.dll) - FIND_FILE(DLL_R_MSVCR msvcr110.dll) - FIND_FILE(DLL_D_MSVCR msvcr110d.dll) + FIND_FILE(DLL_R_MSVCP msvcp110.dll) + FIND_FILE(DLL_D_MSVCP msvcp110d.dll) + FIND_FILE(DLL_R_MSVCR msvcr110.dll) + FIND_FILE(DLL_D_MSVCR msvcr110d.dll) ENDIF() SET(CONFIG_DLL_R - ${DLL_D_AND_R} - ${DLL_R_QT_CORE} - ${DLL_R_QT_CUI} - ${DLL_R_QT_WIDGETS} - ${DLL_R_MSVCR} - ${DLL_R_MSVCP} + ${DLL_D_AND_R} + ${DLL_R_QT_CORE} + ${DLL_R_QT_CUI} + ${DLL_R_QT_WIDGETS} + ${DLL_R_MSVCR} + ${DLL_R_MSVCP} ) FILE(COPY ${CONFIG_DLL_R} DESTINATION ${CONFIG_DIRECTORY_RELEASE}) FILE(COPY ${CONFIG_PLUGINS_PLATFORM_R} DESTINATION ${CONFIG_DIRECTORY_RELEASE}/${QT_PLUGINS_PLATFORMS}) @@ -120,14 +120,14 @@ FILE(COPY ${CONFIG_ASSISTANT_PLUGINS_PLATFORM} DESTINATION ${CONFIG_DIRECTORY_RE FILE(COPY ${CONFIG_ASSISTANT_PLUGINS_QSQLITE} DESTINATION ${CONFIG_DIRECTORY_RELEASE}/${QT_PLUGINS_SQLDRIVERS}) SET(CONFIG_DLL_D - ${DLL_D_AND_R} - ${DLL_D_QT_CORE} - ${DLL_D_QT_CUI} - ${DLL_D_QT_WIDGETS} - ${DLL_D_MSVCR} - ${DLL_D_MSVCP} - ${DLL_R_MSVCR} - ${DLL_R_MSVCP} + ${DLL_D_AND_R} + ${DLL_D_QT_CORE} + ${DLL_D_QT_CUI} + ${DLL_D_QT_WIDGETS} + ${DLL_D_MSVCR} + ${DLL_D_MSVCP} + ${DLL_R_MSVCR} + ${DLL_R_MSVCP} ) FILE(COPY ${CONFIG_DLL_D} DESTINATION ${CONFIG_DIRECTORY_DEBUG}) FILE(COPY ${CONFIG_PLUGINS_PLATFORM_D} DESTINATION ${CONFIG_DIRECTORY_DEBUG}/${QT_PLUGINS_PLATFORMS}) @@ -141,26 +141,26 @@ FIND_FILE(DLL_R_EGL libGLESv2.dll PATHS ${QT_LIBRARY_DIR}) FIND_FILE(DLL_D_EGL libGLESv2d.dll PATHS ${QT_LIBRARY_DIR}) SET(CONFIG_DLL_R_OPTIONAL - ${DLL_R_GLES} - ${DLL_R_EGL} + ${DLL_R_GLES} + ${DLL_R_EGL} ) SET(CONFIG_DLL_D_OPTIONAL - ${CONFIG_DLL_R_OPTIONAL} - ${DLL_D_GLES} - ${DLL_D_EGL} + ${CONFIG_DLL_R_OPTIONAL} + ${DLL_D_GLES} + ${DLL_D_EGL} ) FOREACH(DLL_FILE_NAME ${CONFIG_DLL_R_OPTIONAL}) - IF(DLL_FILE_NAME) - FILE(COPY ${DLL_FILE_NAME} DESTINATION ${CONFIG_DIRECTORY_RELEASE}) - ENDIF() + IF(DLL_FILE_NAME) + FILE(COPY ${DLL_FILE_NAME} DESTINATION ${CONFIG_DIRECTORY_RELEASE}) + ENDIF() ENDFOREACH() FOREACH(DLL_FILE_NAME ${CONFIG_DLL_D_OPTIONAL}) - IF(DLL_FILE_NAME) - FILE(COPY ${DLL_FILE_NAME} DESTINATION ${CONFIG_DIRECTORY_DEBUG}) - ENDIF() + IF(DLL_FILE_NAME) + FILE(COPY ${DLL_FILE_NAME} DESTINATION ${CONFIG_DIRECTORY_DEBUG}) + ENDIF() ENDFOREACH() FILE(COPY ${CMAKE_MODULE_PATH}/qt.conf DESTINATION ${CONFIG_DIRECTORY_DEBUG}) diff --git a/converter/smr2rdox/CMakeLists.txt b/converter/smr2rdox/CMakeLists.txt index 1bcbc46b8..1d993da97 100644 --- a/converter/smr2rdox/CMakeLists.txt +++ b/converter/smr2rdox/CMakeLists.txt @@ -13,16 +13,16 @@ FIND_PACKAGE(BISON 3.0) FIND_PACKAGE(FLEX) IF(NOT BISON_FOUND) - MESSAGE(FATAL_ERROR "Bison can not be found") + MESSAGE(FATAL_ERROR "Bison can not be found") ENDIF() IF(NOT FLEX_FOUND) - MESSAGE(FATAL_ERROR "Flex can not be found") + MESSAGE(FATAL_ERROR "Flex can not be found") ENDIF() IF(WIN32) - GET_FILENAME_COMPONENT(BISON_INCLUDE ${BISON_EXECUTABLE} PATH) - INCLUDE_DIRECTORIES(${BISON_INCLUDE}) + GET_FILENAME_COMPONENT(BISON_INCLUDE ${BISON_EXECUTABLE} PATH) + INCLUDE_DIRECTORIES(${BISON_INCLUDE}) ENDIF() SET(GRAMMA_INPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/grammar) @@ -48,206 +48,206 @@ RDO_FLEX_TARGET(lexer_scaner ${GRAMMA_INPUT_PATH}/rdo_lexer.l ${CMAKE_CURRENT_BI ADD_FLEX_BISON_DEPENDENCY(lexer_scaner rtp) SET(ANIMATION_FILES - rdofrm.cpp - rdofrm.h + rdofrm.cpp + rdofrm.h ) SET(COMMON_FILES - namespace.h - rdo_object.cpp - rdo_object.h + namespace.h + rdo_object.cpp + rdo_object.h ) SET(CONVERTER_FILES - rdoparser.cpp - rdoparser.h - rdoparser_base.cpp - rdoparser_base.h - rdoparser_rdo.cpp - rdoparser_rdo.h + rdoparser.cpp + rdoparser.h + rdoparser_base.cpp + rdoparser_base.h + rdoparser_rdo.cpp + rdoparser_rdo.h ) SET(CONVERTER_ERROR_FILES - rdoparser_error.cpp - rdoparser_error.h + rdoparser_error.cpp + rdoparser_error.h ) SET(CONVERTER_LEXER_FILES - rdoparser_lexer.cpp - rdoparser_lexer.h + rdoparser_lexer.cpp + rdoparser_lexer.h ) SET(DPT_FILES - rdo_logic.cpp - rdo_logic.h - rdodpt.cpp - rdodpt.h + rdo_logic.cpp + rdo_logic.h + rdodpt.cpp + rdodpt.h ) SET(FUNCTION_FILES - rdofun.cpp - rdofun.h + rdofun.cpp + rdofun.h ) SET(GRAMMAR_FILES - ${GRAMMA_INPUT_PATH}/rdobison.h - ${GRAMMA_INPUT_PATH}/rdo_lexer.l - ${GRAMMA_INPUT_PATH}/rdortp.y - ${GRAMMA_INPUT_PATH}/rdorss.y - ${GRAMMA_INPUT_PATH}/rdoopr.y - ${GRAMMA_INPUT_PATH}/rdopat.y - ${GRAMMA_INPUT_PATH}/rdodpt.y - ${GRAMMA_INPUT_PATH}/rdofrm.y - ${GRAMMA_INPUT_PATH}/rdofun.y - ${GRAMMA_INPUT_PATH}/rdopmd.y - ${GRAMMA_INPUT_PATH}/rdoproc_rtp.y - ${GRAMMA_INPUT_PATH}/rdoproc_rss.y - ${GRAMMA_INPUT_PATH}/rdoproc_opr.y - ${GRAMMA_INPUT_PATH}/rdosmr_file.y - ${GRAMMA_INPUT_PATH}/rdosmr_sim.y + ${GRAMMA_INPUT_PATH}/rdobison.h + ${GRAMMA_INPUT_PATH}/rdo_lexer.l + ${GRAMMA_INPUT_PATH}/rdortp.y + ${GRAMMA_INPUT_PATH}/rdorss.y + ${GRAMMA_INPUT_PATH}/rdoopr.y + ${GRAMMA_INPUT_PATH}/rdopat.y + ${GRAMMA_INPUT_PATH}/rdodpt.y + ${GRAMMA_INPUT_PATH}/rdofrm.y + ${GRAMMA_INPUT_PATH}/rdofun.y + ${GRAMMA_INPUT_PATH}/rdopmd.y + ${GRAMMA_INPUT_PATH}/rdoproc_rtp.y + ${GRAMMA_INPUT_PATH}/rdoproc_rss.y + ${GRAMMA_INPUT_PATH}/rdoproc_opr.y + ${GRAMMA_INPUT_PATH}/rdosmr_file.y + ${GRAMMA_INPUT_PATH}/rdosmr_sim.y ) SET(GRAMMAR_GENERATED_NO_PCH - ${FLEX_lexer_scaner_OUTPUTS} - ${BISON_rtp_OUTPUTS} - ${BISON_rss_OUTPUTS} - ${BISON_opr_OUTPUTS} - ${BISON_pat_OUTPUTS} - ${BISON_dpt_OUTPUTS} - ${BISON_frm_OUTPUTS} - ${BISON_fun_OUTPUTS} - ${BISON_pmd_OUTPUTS} - ${BISON_proc_rtp_OUTPUTS} - ${BISON_proc_rss_OUTPUTS} - ${BISON_proc_opr_OUTPUTS} - ${BISON_smr_file_OUTPUTS} - ${BISON_smr_sim_OUTPUTS} + ${FLEX_lexer_scaner_OUTPUTS} + ${BISON_rtp_OUTPUTS} + ${BISON_rss_OUTPUTS} + ${BISON_opr_OUTPUTS} + ${BISON_pat_OUTPUTS} + ${BISON_dpt_OUTPUTS} + ${BISON_frm_OUTPUTS} + ${BISON_fun_OUTPUTS} + ${BISON_pmd_OUTPUTS} + ${BISON_proc_rtp_OUTPUTS} + ${BISON_proc_rss_OUTPUTS} + ${BISON_proc_opr_OUTPUTS} + ${BISON_smr_file_OUTPUTS} + ${BISON_smr_sim_OUTPUTS} ) SET(GRAMMAR_GENERATED_FILES - ${GRAMMA_H} - ${GRAMMAR_GENERATED_NO_PCH} + ${GRAMMA_H} + ${GRAMMAR_GENERATED_NO_PCH} ) SET(OPR_FILES - rdoopr.cpp - rdoopr.h + rdoopr.cpp + rdoopr.h ) SET(PATTERN_FILES - rdopat.cpp - rdopat.h + rdopat.cpp + rdopat.h ) SET(PCH_FILES - pch.cpp - pch.h + pch.cpp + pch.h ) SET(PROJECT_FILES - rdosmr.cpp - rdosmr.h + rdosmr.cpp + rdosmr.h ) SET(RDO_COMMON_FILES - rdo_common/model_objects_convertor.h + rdo_common/model_objects_convertor.h ) SET(RESORCES_FILES - rdorss.cpp - rdorss.h - rdortp.cpp - rdortp.h - rdortp_param.cpp - rdortp_param.h + rdorss.cpp + rdorss.h + rdortp.cpp + rdortp.h + rdortp_param.cpp + rdortp_param.h ) SET(RESORCES_PARAM_FILES - param.h - param.cpp - rdo_type_param.cpp - rdo_type_param.h - rdo_type_param_suchas.h - rdo_type_param_suchas.cpp + param.h + param.cpp + rdo_type_param.cpp + rdo_type_param.h + rdo_type_param_suchas.h + rdo_type_param_suchas.cpp ) SET(RUNTIME_FILES - runtime/rdo_ie.cpp - runtime/rdo_ie.h - runtime/rdo_logic_dptfree.cpp - runtime/rdo_logic_dptfree.h + runtime/rdo_ie.cpp + runtime/rdo_ie.h + runtime/rdo_logic_dptfree.cpp + runtime/rdo_logic_dptfree.h ) SET(TYPE_FILES - rdo_type.cpp - rdo_type.h + rdo_type.cpp + rdo_type.h ) SET(TYPE_ENUM_FILES - rdo_enum.cpp - rdo_enum.h + rdo_enum.cpp + rdo_enum.h ) SET(TYPE_RANGE_FILES - rdo_type_range.cpp - rdo_type_range.h - rdo_type_range-inl.h + rdo_type_range.cpp + rdo_type_range.h + rdo_type_range-inl.h ) SET(UPDATE_FILES - update/document.cpp - update/document.h - update/document_i.h - update/update.cpp - update/update.h - update/update_i.cpp - update/update_i.h + update/document.cpp + update/document.h + update/document_i.h + update/update.cpp + update/update.h + update/update_i.cpp + update/update_i.h ) SET(VALUE_FILES - rdo_value.cpp - rdo_value.h + rdo_value.cpp + rdo_value.h ) SET(VALUE_ARRAY_FILES - rdo_array.cpp - rdo_array.h + rdo_array.cpp + rdo_array.h ) SET(WATCH_FILES - rdopmd.cpp - rdopmd.h + rdopmd.cpp + rdopmd.h ) SET(SOURCE_FILES - ${PCH_FILES} - ${ANIMATION_FILES} - ${COMMON_FILES} - ${CONVERTER_FILES} - ${CONVERTER_ERROR_FILES} - ${CONVERTER_LEXER_FILES} - ${DPT_FILES} - ${FUNCTION_FILES} - ${GRAMMAR_FILES} - ${GRAMMAR_GENERATED_FILES} - ${OPR_FILES} - ${PATTERN_FILES} - ${PROJECT_FILES} - ${RDO_COMMON_FILES} - ${RESORCES_FILES} - ${RESORCES_PARAM_FILES} - ${RUNTIME_FILES} - ${TYPE_FILES} - ${TYPE_ENUM_FILES} - ${TYPE_RANGE_FILES} - ${UPDATE_FILES} - ${VALUE_FILES} - ${WATCH_FILES} + ${PCH_FILES} + ${ANIMATION_FILES} + ${COMMON_FILES} + ${CONVERTER_FILES} + ${CONVERTER_ERROR_FILES} + ${CONVERTER_LEXER_FILES} + ${DPT_FILES} + ${FUNCTION_FILES} + ${GRAMMAR_FILES} + ${GRAMMAR_GENERATED_FILES} + ${OPR_FILES} + ${PATTERN_FILES} + ${PROJECT_FILES} + ${RDO_COMMON_FILES} + ${RESORCES_FILES} + ${RESORCES_PARAM_FILES} + ${RUNTIME_FILES} + ${TYPE_FILES} + ${TYPE_ENUM_FILES} + ${TYPE_RANGE_FILES} + ${UPDATE_FILES} + ${VALUE_FILES} + ${WATCH_FILES} ) SET(NO_PCH_FILES - ${GRAMMAR_GENERATED_NO_PCH} - ${PCH_FILES} + ${GRAMMAR_GENERATED_NO_PCH} + ${PCH_FILES} ) ADD_LIBRARY(rdo_converter_smr2rdox STATIC ${HEADER_FILES} ${INLINE_FILES} ${SOURCE_FILES} ${GENERATED_FILES} ${GRAMMA_FILES}) @@ -265,101 +265,101 @@ INSTALL(TARGETS rdo_converter_smr2rdox DESTINATION lib) IF(MSVC_IDE) # options for windows # - SET_TARGET_PROPERTIES(rdo_converter_smr2rdox PROPERTIES COMPILE_FLAGS "-D_UNISTD_H_") + SET_TARGET_PROPERTIES(rdo_converter_smr2rdox PROPERTIES COMPILE_FLAGS "-D_UNISTD_H_") - INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) - ADD_PCH("${SOURCE_FILES}" "${NO_PCH_FILES}" converter/smr2rdox ./ pch) + INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) + ADD_PCH("${SOURCE_FILES}" "${NO_PCH_FILES}" converter/smr2rdox ./ pch) - SOURCE_GROUP(".animation" FILES - ${ANIMATION_FILES} - ) + SOURCE_GROUP(".animation" FILES + ${ANIMATION_FILES} + ) - SOURCE_GROUP(".common" FILES - ${COMMON_FILES} - ) + SOURCE_GROUP(".common" FILES + ${COMMON_FILES} + ) - SOURCE_GROUP(".converter" FILES - ${CONVERTER_FILES} - ) + SOURCE_GROUP(".converter" FILES + ${CONVERTER_FILES} + ) - SOURCE_GROUP(".converter\\.error" FILES - ${CONVERTER_ERROR_FILES} - ) + SOURCE_GROUP(".converter\\.error" FILES + ${CONVERTER_ERROR_FILES} + ) - SOURCE_GROUP(".converter\\.lexer" FILES - ${CONVERTER_LEXER_FILES} - ) + SOURCE_GROUP(".converter\\.lexer" FILES + ${CONVERTER_LEXER_FILES} + ) - SOURCE_GROUP(".dpt" FILES - ${DPT_FILES} - ) + SOURCE_GROUP(".dpt" FILES + ${DPT_FILES} + ) - SOURCE_GROUP(".function" FILES - ${FUNCTION_FILES} - ) + SOURCE_GROUP(".function" FILES + ${FUNCTION_FILES} + ) - SOURCE_GROUP(".grammar" FILES - ${GRAMMAR_FILES} - ) + SOURCE_GROUP(".grammar" FILES + ${GRAMMAR_FILES} + ) - SOURCE_GROUP(".grammar\\generated" FILES - ${GRAMMAR_GENERATED_FILES} - ) + SOURCE_GROUP(".grammar\\generated" FILES + ${GRAMMAR_GENERATED_FILES} + ) - SOURCE_GROUP(".opr" FILES - ${OPR_FILES} - ) + SOURCE_GROUP(".opr" FILES + ${OPR_FILES} + ) - SOURCE_GROUP(".pattern" FILES - ${PATTERN_FILES} - ) + SOURCE_GROUP(".pattern" FILES + ${PATTERN_FILES} + ) - SOURCE_GROUP(".pch" FILES - ${PCH_FILES} - ) + SOURCE_GROUP(".pch" FILES + ${PCH_FILES} + ) - SOURCE_GROUP(".project" FILES - ${PROJECT_FILES} - ) + SOURCE_GROUP(".project" FILES + ${PROJECT_FILES} + ) - SOURCE_GROUP(".rdo_common" FILES - ${RDO_COMMON_FILES} - ) + SOURCE_GROUP(".rdo_common" FILES + ${RDO_COMMON_FILES} + ) - SOURCE_GROUP(".resorces" FILES - ${RESORCES_FILES} - ) + SOURCE_GROUP(".resorces" FILES + ${RESORCES_FILES} + ) - SOURCE_GROUP(".resorces\\.param" FILES - ${RESORCES_PARAM_FILES} - ) + SOURCE_GROUP(".resorces\\.param" FILES + ${RESORCES_PARAM_FILES} + ) - SOURCE_GROUP(".runtime" FILES - ${RUNTIME_FILES} - ) + SOURCE_GROUP(".runtime" FILES + ${RUNTIME_FILES} + ) - SOURCE_GROUP(".type" FILES - ${TYPE_FILES} - ) + SOURCE_GROUP(".type" FILES + ${TYPE_FILES} + ) - SOURCE_GROUP(".type\\.enum" FILES - ${TYPE_ENUM_FILES} - ) + SOURCE_GROUP(".type\\.enum" FILES + ${TYPE_ENUM_FILES} + ) - SOURCE_GROUP(".type\\.range" FILES - ${TYPE_RANGE_FILES} - ) + SOURCE_GROUP(".type\\.range" FILES + ${TYPE_RANGE_FILES} + ) - SOURCE_GROUP(".update" FILES - ${UPDATE_FILES} - ) + SOURCE_GROUP(".update" FILES + ${UPDATE_FILES} + ) - SOURCE_GROUP(".value" FILES - ${VALUE_FILES} - ) + SOURCE_GROUP(".value" FILES + ${VALUE_FILES} + ) - SOURCE_GROUP(".watch" FILES - ${WATCH_FILES} - ) + SOURCE_GROUP(".watch" FILES + ${WATCH_FILES} + ) ENDIF() diff --git a/converter/smr2rdox/grammar/rdo_lexer.l b/converter/smr2rdox/grammar/rdo_lexer.l index 4cc12a53a..6226e6209 100644 --- a/converter/smr2rdox/grammar/rdo_lexer.l +++ b/converter/smr2rdox/grammar/rdo_lexer.l @@ -1,13 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdo_lexer.h - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \date - \brief - \indent 4T -*/ - %{ // ---------------------------------------------------------------------------- PCH #include "converter/smr2rdox/pch.h" @@ -41,11 +31,11 @@ #define YY_INTERACTIVE #define YY_USER_INIT { \ - LEXER->loc_init(); \ + LEXER->loc_init(); \ } #define YY_USER_ACTION { \ - LEXER->loc_action(); \ + LEXER->loc_action(); \ } %} @@ -58,549 +48,549 @@ %x comment_line %% -$Resource_type return(RDO_Resource_type); -$resource_type return(RDO_Resource_type); -permanent return(RDO_permanent); -$Parameters return(RDO_Parameters); -$parameters return(RDO_Parameters); -integer return(RDO_integer); -longint return(RDO_integer); -real return(RDO_real); -string return(RDO_string); -bool return(RDO_bool); -$End return(RDO_End); -$end return(RDO_End); -temporary return(RDO_temporary); -such_as return(RDO_such_as); -".." return(RDO_dblpoint); - -$Resources return(RDO_Resources); -$resources return(RDO_Resources); -trace return(RDO_trace); -no_trace return(RDO_no_trace); - -$Constant return(RDO_Constant); -$constant return(RDO_Constant); -$Body return(RDO_Body); -$body return(RDO_Body); -$Function return(RDO_Function); -$function return(RDO_Function); -$Type return(RDO_Type); -$type return(RDO_Type); -algorithmic return(RDO_algorithmic); -table return(RDO_table); -list return(RDO_list); -Calculate_if return(RDO_Calculate_if); -calculate_if return(RDO_Calculate_if); -if return(RDO_if); -$Sequence return(RDO_Sequence); -$sequence return(RDO_Sequence); -uniform return(RDO_uniform); -exponential return(RDO_exponential); -normal return(RDO_normal); -by_hist return(RDO_by_hist); -enumerative return(RDO_enumerative); - -Exist return(RDO_Exist); -exist return(RDO_Exist); -Not_Exist return(RDO_Not_Exist); -not_exist return(RDO_Not_Exist); -For_All return(RDO_For_All); -for_all return(RDO_For_All); -Not_For_All return(RDO_Not_For_All); -not_for_all return(RDO_Not_For_All); -\=\= return(RDO_eq); -\<\> return(RDO_neq); -\!\= return(RDO_neq); -\<\= return(RDO_leq); -\>\= return(RDO_geq); -NoCheck return(RDO_NoCheck); -nocheck return(RDO_NoCheck); -or return(RDO_or); -and return(RDO_and); -! return(RDO_not); -not return(RDO_not); - -$Pattern return(RDO_Pattern); -$pattern return(RDO_Pattern); -operation return(RDO_operation); -irregular_event return(RDO_irregular_event); -rule return(RDO_rule); -keyboard return(RDO_keyboard); -$Relevant_resources return(RDO_Relevant_resources); -$relevant_resources return(RDO_Relevant_resources); -Keep return(RDO_Keep); -keep return(RDO_Keep); -Create return(RDO_Create); -create return(RDO_Create); -Erase return(RDO_Erase); -erase return(RDO_Erase); -NonExist return(RDO_NonExist); -nonexist return(RDO_NonExist); -NoChange return(RDO_NoChange); -nochange return(RDO_NoChange); -$Time return(RDO_Time); -$time return(RDO_Time); -Choice return(RDO_Choice); -choice return(RDO_Choice); -from return(RDO_from); -first return(RDO_first); -Convert_begin return(RDO_Convert_begin); -convert_begin return(RDO_Convert_begin); -Convert_end return(RDO_Convert_end); -convert_end return(RDO_Convert_end); -Convert_rule return(RDO_Convert_rule); -convert_rule return(RDO_Convert_rule); -Convert_event return(RDO_Convert_event); -convert_event return(RDO_Convert_event); -with_max return(RDO_with_max); -with_min return(RDO_with_min); -$Operations return(RDO_Operations); -$operations return(RDO_Operations); -$Results return(RDO_Results); -$results return(RDO_Results); -watch_par return(RDO_watch_par); -watch_state return(RDO_watch_state); -watch_quant return(RDO_watch_quant); -watch_value return(RDO_watch_value); -get_value return(RDO_get_value); - -Model_name return(RDO_Model_name); -model_name return(RDO_Model_name); -Resource_file return(RDO_Resource_file); -resource_file return(RDO_Resource_file); -OprIev_file return(RDO_OprIev_file); -opriev_file return(RDO_OprIev_file); -Frame_file return(RDO_Frame_file); -frame_file return(RDO_Frame_file); -Statistic_file return(RDO_Statistic_file); -statistic_file return(RDO_Statistic_file); -Results_file return(RDO_Results_file); -results_file return(RDO_Results_file); -Trace_file return(RDO_Trace_file); -trace_file return(RDO_Trace_file); +$Resource_type return(RDO_Resource_type); +$resource_type return(RDO_Resource_type); +permanent return(RDO_permanent); +$Parameters return(RDO_Parameters); +$parameters return(RDO_Parameters); +integer return(RDO_integer); +longint return(RDO_integer); +real return(RDO_real); +string return(RDO_string); +bool return(RDO_bool); +$End return(RDO_End); +$end return(RDO_End); +temporary return(RDO_temporary); +such_as return(RDO_such_as); +".." return(RDO_dblpoint); + +$Resources return(RDO_Resources); +$resources return(RDO_Resources); +trace return(RDO_trace); +no_trace return(RDO_no_trace); + +$Constant return(RDO_Constant); +$constant return(RDO_Constant); +$Body return(RDO_Body); +$body return(RDO_Body); +$Function return(RDO_Function); +$function return(RDO_Function); +$Type return(RDO_Type); +$type return(RDO_Type); +algorithmic return(RDO_algorithmic); +table return(RDO_table); +list return(RDO_list); +Calculate_if return(RDO_Calculate_if); +calculate_if return(RDO_Calculate_if); +if return(RDO_if); +$Sequence return(RDO_Sequence); +$sequence return(RDO_Sequence); +uniform return(RDO_uniform); +exponential return(RDO_exponential); +normal return(RDO_normal); +by_hist return(RDO_by_hist); +enumerative return(RDO_enumerative); + +Exist return(RDO_Exist); +exist return(RDO_Exist); +Not_Exist return(RDO_Not_Exist); +not_exist return(RDO_Not_Exist); +For_All return(RDO_For_All); +for_all return(RDO_For_All); +Not_For_All return(RDO_Not_For_All); +not_for_all return(RDO_Not_For_All); +\=\= return(RDO_eq); +\<\> return(RDO_neq); +\!\= return(RDO_neq); +\<\= return(RDO_leq); +\>\= return(RDO_geq); +NoCheck return(RDO_NoCheck); +nocheck return(RDO_NoCheck); +or return(RDO_or); +and return(RDO_and); +! return(RDO_not); +not return(RDO_not); + +$Pattern return(RDO_Pattern); +$pattern return(RDO_Pattern); +operation return(RDO_operation); +irregular_event return(RDO_irregular_event); +rule return(RDO_rule); +keyboard return(RDO_keyboard); +$Relevant_resources return(RDO_Relevant_resources); +$relevant_resources return(RDO_Relevant_resources); +Keep return(RDO_Keep); +keep return(RDO_Keep); +Create return(RDO_Create); +create return(RDO_Create); +Erase return(RDO_Erase); +erase return(RDO_Erase); +NonExist return(RDO_NonExist); +nonexist return(RDO_NonExist); +NoChange return(RDO_NoChange); +nochange return(RDO_NoChange); +$Time return(RDO_Time); +$time return(RDO_Time); +Choice return(RDO_Choice); +choice return(RDO_Choice); +from return(RDO_from); +first return(RDO_first); +Convert_begin return(RDO_Convert_begin); +convert_begin return(RDO_Convert_begin); +Convert_end return(RDO_Convert_end); +convert_end return(RDO_Convert_end); +Convert_rule return(RDO_Convert_rule); +convert_rule return(RDO_Convert_rule); +Convert_event return(RDO_Convert_event); +convert_event return(RDO_Convert_event); +with_max return(RDO_with_max); +with_min return(RDO_with_min); +$Operations return(RDO_Operations); +$operations return(RDO_Operations); +$Results return(RDO_Results); +$results return(RDO_Results); +watch_par return(RDO_watch_par); +watch_state return(RDO_watch_state); +watch_quant return(RDO_watch_quant); +watch_value return(RDO_watch_value); +get_value return(RDO_get_value); + +Model_name return(RDO_Model_name); +model_name return(RDO_Model_name); +Resource_file return(RDO_Resource_file); +resource_file return(RDO_Resource_file); +OprIev_file return(RDO_OprIev_file); +opriev_file return(RDO_OprIev_file); +Frame_file return(RDO_Frame_file); +frame_file return(RDO_Frame_file); +Statistic_file return(RDO_Statistic_file); +statistic_file return(RDO_Statistic_file); +Results_file return(RDO_Results_file); +results_file return(RDO_Results_file); +Trace_file return(RDO_Trace_file); +trace_file return(RDO_Trace_file); External_Model return(RDO_External_Model); external_model return(RDO_External_Model); -Show_mode return(RDO_Show_mode); -show_mode return(RDO_Show_mode); -Frame_number return(RDO_Frame_number); -frame_number return(RDO_Frame_number); -Show_rate return(RDO_Show_rate); -show_rate return(RDO_Show_rate); -Run_StartTime return(RDO_Run_StartTime); -run_starttime return(RDO_Run_StartTime); -Trace_StartTime return(RDO_Trace_StartTime); -trace_starttime return(RDO_Trace_StartTime); -Trace_EndTime return(RDO_Trace_EndTime); -trace_endtime return(RDO_Trace_EndTime); -Terminate_if return(RDO_Terminate_if); -terminate_if return(RDO_Terminate_if); -Break_point return(RDO_Break_point); -break_point return(RDO_Break_point); -Seed return(RDO_Seed); -seed return(RDO_Seed); -NoShow return(RDO_NoShow); -noshow return(RDO_NoShow); -Monitor return(RDO_Monitor); -monitor return(RDO_Monitor); -Animation return(RDO_Animation); -animation return(RDO_Animation); - -$Decision_point return(RDO_Decision_point); -$decision_point return(RDO_Decision_point); -search return(RDO_search); -trace_stat return(RDO_trace_stat); -trace_tops return(RDO_trace_tops); -trace_all return(RDO_trace_all); -$Condition return(RDO_Condition); -$condition return(RDO_Condition); -$Term_condition return(RDO_Term_condition); -$term_condition return(RDO_Term_condition); -$Evaluate_by return(RDO_Evaluate_by); -$evaluate_by return(RDO_Evaluate_by); -$Compare_tops return(RDO_Compare_tops); -$compare_tops return(RDO_Compare_tops); -NO return(RDO_NO); -no return(RDO_NO); -YES return(RDO_YES); -yes return(RDO_YES); -$Activities return(RDO_Activities); -$activities return(RDO_Activities); -$Process return(RDO_Process); -$process return(RDO_Process); -QUEUE return(RDO_QUEUE); -queue return(RDO_QUEUE); -DEPART return(RDO_DEPART); -depart return(RDO_DEPART); -SEIZE return(RDO_SEIZE); -seize return(RDO_SEIZE); -GENERATE return(RDO_GENERATE); -generate return(RDO_GENERATE); -ADVANCE return(RDO_ADVANCE); -advance return(RDO_ADVANCE); -RELEASE return(RDO_RELEASE); -release return(RDO_RELEASE); -TERMINATE return(RDO_TERMINATE); -terminate return(RDO_TERMINATE); -ASSIGN return(RDO_ASSIGN); -assign return(RDO_ASSIGN); -value[\r\n\t ]+before return(RDO_value_before); -value[\r\n\t ]+after return(RDO_value_after); -value_before return(RDO_value_before); -value_after return(RDO_value_after); -some return(RDO_some); -prior return(RDO_prior); -cf return(RDO_CF); -CF return(RDO_CF); -$Priority return(RDO_Priority); -$priority return(RDO_Priority); -$Parent return(RDO_Parent); -$parent return(RDO_Parent); - -$Frame return(RDO_Frame); -$frame return(RDO_Frame); -Show_if return(RDO_Show_if); -show_if return(RDO_Show_if); -$Back_picture return(RDO_Back_picture); -$back_picture return(RDO_Back_picture); -Show return(RDO_Show); -show return(RDO_Show); -frm_cell return(RDO_frm_cell); -text return(RDO_text); -bitmap return(RDO_bitmap); -s_bmp return(RDO_s_bmp); -rect return(RDO_rect); -r_rect return(RDO_r_rect); -line return(RDO_line); -ellipse return(RDO_ellipse); -triang return(RDO_triang); -active return(RDO_active); -ruler return(RDO_ruler); -space return(RDO_space); -transparent return(RDO_color_transparent); -white return(RDO_color_white); -black return(RDO_color_black); -red return(RDO_color_red); -green return(RDO_color_green); -blue return(RDO_color_blue); -cyan return(RDO_color_cyan); -magenta return(RDO_color_magenta); -yellow return(RDO_color_yellow); -gray return(RDO_color_gray); -last return(RDO_color_last); - -typedef return(RDO_typedef); -$Typedef return(RDO_typedef); -$typedef return(RDO_typedef); -enum return(RDO_enum); -$Enum return(RDO_enum); -$enum return(RDO_enum); - -Select return(RDO_Select); -select return(RDO_Select); -Size return(RDO_Size); -size return(RDO_Size); -empty return(RDO_Empty); -Empty return(RDO_Empty); - -$Fuzzy return(RDO_Fuzzy); -$fuzzy return(RDO_Fuzzy); -$Term return(RDO_Fuzzy_Term); -$term return(RDO_Fuzzy_Term); - -set return(RDO_set); +Show_mode return(RDO_Show_mode); +show_mode return(RDO_Show_mode); +Frame_number return(RDO_Frame_number); +frame_number return(RDO_Frame_number); +Show_rate return(RDO_Show_rate); +show_rate return(RDO_Show_rate); +Run_StartTime return(RDO_Run_StartTime); +run_starttime return(RDO_Run_StartTime); +Trace_StartTime return(RDO_Trace_StartTime); +trace_starttime return(RDO_Trace_StartTime); +Trace_EndTime return(RDO_Trace_EndTime); +trace_endtime return(RDO_Trace_EndTime); +Terminate_if return(RDO_Terminate_if); +terminate_if return(RDO_Terminate_if); +Break_point return(RDO_Break_point); +break_point return(RDO_Break_point); +Seed return(RDO_Seed); +seed return(RDO_Seed); +NoShow return(RDO_NoShow); +noshow return(RDO_NoShow); +Monitor return(RDO_Monitor); +monitor return(RDO_Monitor); +Animation return(RDO_Animation); +animation return(RDO_Animation); + +$Decision_point return(RDO_Decision_point); +$decision_point return(RDO_Decision_point); +search return(RDO_search); +trace_stat return(RDO_trace_stat); +trace_tops return(RDO_trace_tops); +trace_all return(RDO_trace_all); +$Condition return(RDO_Condition); +$condition return(RDO_Condition); +$Term_condition return(RDO_Term_condition); +$term_condition return(RDO_Term_condition); +$Evaluate_by return(RDO_Evaluate_by); +$evaluate_by return(RDO_Evaluate_by); +$Compare_tops return(RDO_Compare_tops); +$compare_tops return(RDO_Compare_tops); +NO return(RDO_NO); +no return(RDO_NO); +YES return(RDO_YES); +yes return(RDO_YES); +$Activities return(RDO_Activities); +$activities return(RDO_Activities); +$Process return(RDO_Process); +$process return(RDO_Process); +QUEUE return(RDO_QUEUE); +queue return(RDO_QUEUE); +DEPART return(RDO_DEPART); +depart return(RDO_DEPART); +SEIZE return(RDO_SEIZE); +seize return(RDO_SEIZE); +GENERATE return(RDO_GENERATE); +generate return(RDO_GENERATE); +ADVANCE return(RDO_ADVANCE); +advance return(RDO_ADVANCE); +RELEASE return(RDO_RELEASE); +release return(RDO_RELEASE); +TERMINATE return(RDO_TERMINATE); +terminate return(RDO_TERMINATE); +ASSIGN return(RDO_ASSIGN); +assign return(RDO_ASSIGN); +value[\r\n\t ]+before return(RDO_value_before); +value[\r\n\t ]+after return(RDO_value_after); +value_before return(RDO_value_before); +value_after return(RDO_value_after); +some return(RDO_some); +prior return(RDO_prior); +cf return(RDO_CF); +CF return(RDO_CF); +$Priority return(RDO_Priority); +$priority return(RDO_Priority); +$Parent return(RDO_Parent); +$parent return(RDO_Parent); + +$Frame return(RDO_Frame); +$frame return(RDO_Frame); +Show_if return(RDO_Show_if); +show_if return(RDO_Show_if); +$Back_picture return(RDO_Back_picture); +$back_picture return(RDO_Back_picture); +Show return(RDO_Show); +show return(RDO_Show); +frm_cell return(RDO_frm_cell); +text return(RDO_text); +bitmap return(RDO_bitmap); +s_bmp return(RDO_s_bmp); +rect return(RDO_rect); +r_rect return(RDO_r_rect); +line return(RDO_line); +ellipse return(RDO_ellipse); +triang return(RDO_triang); +active return(RDO_active); +ruler return(RDO_ruler); +space return(RDO_space); +transparent return(RDO_color_transparent); +white return(RDO_color_white); +black return(RDO_color_black); +red return(RDO_color_red); +green return(RDO_color_green); +blue return(RDO_color_blue); +cyan return(RDO_color_cyan); +magenta return(RDO_color_magenta); +yellow return(RDO_color_yellow); +gray return(RDO_color_gray); +last return(RDO_color_last); + +typedef return(RDO_typedef); +$Typedef return(RDO_typedef); +$typedef return(RDO_typedef); +enum return(RDO_enum); +$Enum return(RDO_enum); +$enum return(RDO_enum); + +Select return(RDO_Select); +select return(RDO_Select); +Size return(RDO_Size); +size return(RDO_Size); +empty return(RDO_Empty); +Empty return(RDO_Empty); + +$Fuzzy return(RDO_Fuzzy); +$fuzzy return(RDO_Fuzzy); +$Term return(RDO_Fuzzy_Term); +$term return(RDO_Fuzzy_Term); + +set return(RDO_set); (\'[^\']*\') { - const std::string n1(YYText()); - const int len = n1.length(); - const std::string name(n1, 1, len-2); - LEXER->setvalue(CONVERTER->stack().push( - rdo::Factory::create( - name, - rdo::Factory::create(), - LEXER->m_lploc - ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, n1) - : rdo::converter::smr2rdox::RDOParserSrcInfo(n1) - ) - )); - return RDO_STRING_CONST; + const std::string n1(YYText()); + const int len = n1.length(); + const std::string name(n1, 1, len-2); + LEXER->setvalue(CONVERTER->stack().push( + rdo::Factory::create( + name, + rdo::Factory::create(), + LEXER->m_lploc + ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, n1) + : rdo::converter::smr2rdox::RDOParserSrcInfo(n1) + ) + )); + return RDO_STRING_CONST; } -"{" { - BEGIN(comment_rdo); +"{" { + BEGIN(comment_rdo); - rdo::converter::smr2rdox::LPDocUpdate pReplace = rdo::Factory::create(LEXER_POS.m_first_seek, LEXER_POS.m_first_seek + 1, "/*"); - ASSERT(pReplace); - CONVERTER->insertDocUpdate(pReplace); + rdo::converter::smr2rdox::LPDocUpdate pReplace = rdo::Factory::create(LEXER_POS.m_first_seek, LEXER_POS.m_first_seek + 1, "/*"); + ASSERT(pReplace); + CONVERTER->insertDocUpdate(pReplace); }; -[^}.]* ; -[^}\n\r]* ; -"}" { - BEGIN(INITIAL); +[^}.]* ; +[^}\n\r]* ; +"}" { + BEGIN(INITIAL); - rdo::converter::smr2rdox::LPDocUpdate pReplace = rdo::Factory::create(LEXER_POS.m_first_seek, LEXER_POS.m_first_seek + 1, "*/"); - ASSERT(pReplace); - CONVERTER->insertDocUpdate(pReplace); + rdo::converter::smr2rdox::LPDocUpdate pReplace = rdo::Factory::create(LEXER_POS.m_first_seek, LEXER_POS.m_first_seek + 1, "*/"); + ASSERT(pReplace); + CONVERTER->insertDocUpdate(pReplace); }; -"/*" BEGIN(comment_cpp); -[^*.]* ; -[^*\n\r]* ; -"*"+"/" BEGIN(INITIAL); +"/*" BEGIN(comment_cpp); +[^*.]* ; +[^*\n\r]* ; +"*"+"/" BEGIN(INITIAL); -"//" BEGIN(comment_line); -[\n\r]+ BEGIN(INITIAL); +"//" BEGIN(comment_line); +[\n\r]+ BEGIN(INITIAL); -"}"|"*/" { - LEXER->loc_delta_pos(YYLeng()); - CONVERTER->error().error(rdo::converter::smr2rdox::RDOParserSrcInfo(), "Не найдено начало комментария"); +"}"|"*/" { + LEXER->loc_delta_pos(YYLeng()); + CONVERTER->error().error(rdo::converter::smr2rdox::RDOParserSrcInfo(), "Не найдено начало комментария"); } [\r\n\t ]+ {} -[#`~@$%^&|:;(),=\[\]\.\*\>\<\+\-\/\\] return(YYText()[YYLeng()-1]); +[#`~@$%^&|:;(),=\[\]\.\*\>\<\+\-\/\\] return(YYText()[YYLeng()-1]); ([+-]?[0-9]+"..") { - const std::string n1(YYText()); - const std::string::size_type pos = n1.find_first_of(".."); - const std::string yText(n1, 0, pos); - unput('.'); - unput('.'); - LEXER->loc_delta_pos(-2); - - rdo::converter::smr2rdox::RDOParserSrcInfo srcInfo( - LEXER->m_lploc - ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, yText) - : rdo::converter::smr2rdox::RDOParserSrcInfo(yText) - ); - - int value = 0; - try - { - value = boost::lexical_cast(yText); - } - catch (const boost::bad_lexical_cast&) - { - CONVERTER->error().error(srcInfo, boost::str(boost::format("Ошибка преобразования числа '%1%'. Возможно, число слишком большое.") % yText) ); - } - - LEXER->setvalue(CONVERTER->stack().push( - rdo::Factory::create( - value, - rdo::Factory::create(), - srcInfo - ) - )); - - return RDO_INT_CONST; + const std::string n1(YYText()); + const std::string::size_type pos = n1.find_first_of(".."); + const std::string yText(n1, 0, pos); + unput('.'); + unput('.'); + LEXER->loc_delta_pos(-2); + + rdo::converter::smr2rdox::RDOParserSrcInfo srcInfo( + LEXER->m_lploc + ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, yText) + : rdo::converter::smr2rdox::RDOParserSrcInfo(yText) + ); + + int value = 0; + try + { + value = boost::lexical_cast(yText); + } + catch (const boost::bad_lexical_cast&) + { + CONVERTER->error().error(srcInfo, boost::str(boost::format("Ошибка преобразования числа '%1%'. Возможно, число слишком большое.") % yText) ); + } + + LEXER->setvalue(CONVERTER->stack().push( + rdo::Factory::create( + value, + rdo::Factory::create(), + srcInfo + ) + )); + + return RDO_INT_CONST; } ([+-]?[0-9]+"."[0-9]*([Ee][+-]?[0-9]+)?) { - const std::string yText = YYText(); - - rdo::converter::smr2rdox::RDOParserSrcInfo srcInfo( - LEXER->m_lploc - ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, yText) - : rdo::converter::smr2rdox::RDOParserSrcInfo(yText) - ); - - double value = 0; - try - { - value = boost::lexical_cast(yText); - } - catch (const boost::bad_lexical_cast&) - { - CONVERTER->error().error(srcInfo, boost::str(boost::format("Ошибка преобразования числа '%1%'. Возможно, число слишком большое.") % yText) ); - } - - LEXER->setvalue(CONVERTER->stack().push( - rdo::Factory::create( - value, - rdo::Factory::create(), - srcInfo - ) - )); - - return RDO_REAL_CONST; + const std::string yText = YYText(); + + rdo::converter::smr2rdox::RDOParserSrcInfo srcInfo( + LEXER->m_lploc + ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, yText) + : rdo::converter::smr2rdox::RDOParserSrcInfo(yText) + ); + + double value = 0; + try + { + value = boost::lexical_cast(yText); + } + catch (const boost::bad_lexical_cast&) + { + CONVERTER->error().error(srcInfo, boost::str(boost::format("Ошибка преобразования числа '%1%'. Возможно, число слишком большое.") % yText) ); + } + + LEXER->setvalue(CONVERTER->stack().push( + rdo::Factory::create( + value, + rdo::Factory::create(), + srcInfo + ) + )); + + return RDO_REAL_CONST; } [+-]?[0-9]+ { - const std::string yText = YYText(); - - rdo::converter::smr2rdox::RDOParserSrcInfo srcInfo( - LEXER->m_lploc - ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, yText) - : rdo::converter::smr2rdox::RDOParserSrcInfo(yText) - ); - - int value = 0; - try - { - value = boost::lexical_cast(yText); - } - catch (const boost::bad_lexical_cast&) - { - CONVERTER->error().error(srcInfo, boost::str(boost::format("Ошибка преобразования числа '%1%'. Возможно, число слишком большое.") % yText) ); - } - - LEXER->setvalue(CONVERTER->stack().push( - rdo::Factory::create( - value, - rdo::Factory::create(), - srcInfo - ) - )); - - return RDO_INT_CONST; + const std::string yText = YYText(); + + rdo::converter::smr2rdox::RDOParserSrcInfo srcInfo( + LEXER->m_lploc + ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, yText) + : rdo::converter::smr2rdox::RDOParserSrcInfo(yText) + ); + + int value = 0; + try + { + value = boost::lexical_cast(yText); + } + catch (const boost::bad_lexical_cast&) + { + CONVERTER->error().error(srcInfo, boost::str(boost::format("Ошибка преобразования числа '%1%'. Возможно, число слишком большое.") % yText) ); + } + + LEXER->setvalue(CONVERTER->stack().push( + rdo::Factory::create( + value, + rdo::Factory::create(), + srcInfo + ) + )); + + return RDO_INT_CONST; } true { - LEXER->setvalue(CONVERTER->stack().push( - rdo::Factory::create( - rdo::runtime::RDOValue(true), - rdo::Factory::create(), - LEXER->m_lploc - ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, YYText()) - : rdo::converter::smr2rdox::RDOParserSrcInfo(YYText()) - ) - )); - - return RDO_BOOL_CONST; + LEXER->setvalue(CONVERTER->stack().push( + rdo::Factory::create( + rdo::runtime::RDOValue(true), + rdo::Factory::create(), + LEXER->m_lploc + ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, YYText()) + : rdo::converter::smr2rdox::RDOParserSrcInfo(YYText()) + ) + )); + + return RDO_BOOL_CONST; } false { - LEXER->setvalue(CONVERTER->stack().push( - rdo::Factory::create( - rdo::runtime::RDOValue(false), - rdo::Factory::create(), - LEXER->m_lploc - ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, YYText()) - : rdo::converter::smr2rdox::RDOParserSrcInfo(YYText()) - ) - )); - - return RDO_BOOL_CONST; + LEXER->setvalue(CONVERTER->stack().push( + rdo::Factory::create( + rdo::runtime::RDOValue(false), + rdo::Factory::create(), + LEXER->m_lploc + ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, YYText()) + : rdo::converter::smr2rdox::RDOParserSrcInfo(YYText()) + ) + )); + + return RDO_BOOL_CONST; } [A-Za-z\xA8\xB8\xC0-\xFF_$][A-Za-z\xA8\xB8\xC0-\xFF0-9_$]*[\r\n\t ]+NoChange[\r\n\t ]+NoChange { - const std::string n1(YYText()); - const std::string::size_type pos = n1.find_first_of("\r\n\t :"); - const std::string name(n1, 0, pos); - RUNTIME->memory_insert(name.length() + sizeof(std::string)); - rdo::converter::smr2rdox::LPRDOValue pValue; - if (LEXER->m_lploc) - { - YYLTYPE pos = LEXER_POS; - pos.m_last_line = pos.m_first_line; - pos.m_last_pos = pos.m_first_pos + name.length(); - pos.m_last_seek = pos.m_first_seek + name.length(); - pValue = rdo::Factory::create(rdo::converter::smr2rdox::RDOParserSrcInfo(pos, name)); - } - else - { - pValue = rdo::Factory::create(rdo::converter::smr2rdox::RDOParserSrcInfo(name)); - } - - LEXER->setvalue(CONVERTER->stack().push(pValue)); - - return RDO_IDENTIF_NoChange_NoChange; + const std::string n1(YYText()); + const std::string::size_type pos = n1.find_first_of("\r\n\t :"); + const std::string name(n1, 0, pos); + RUNTIME->memory_insert(name.length() + sizeof(std::string)); + rdo::converter::smr2rdox::LPRDOValue pValue; + if (LEXER->m_lploc) + { + YYLTYPE pos = LEXER_POS; + pos.m_last_line = pos.m_first_line; + pos.m_last_pos = pos.m_first_pos + name.length(); + pos.m_last_seek = pos.m_first_seek + name.length(); + pValue = rdo::Factory::create(rdo::converter::smr2rdox::RDOParserSrcInfo(pos, name)); + } + else + { + pValue = rdo::Factory::create(rdo::converter::smr2rdox::RDOParserSrcInfo(name)); + } + + LEXER->setvalue(CONVERTER->stack().push(pValue)); + + return RDO_IDENTIF_NoChange_NoChange; } [A-Za-z\xA8\xB8\xC0-\xFF_$][A-Za-z\xA8\xB8\xC0-\xFF0-9_$]*[\r\n\t ]+NoChange { - const std::string n1(YYText()); - const std::string::size_type pos = n1.find_first_of("\r\n\t :"); - const std::string name(n1, 0, pos); - RUNTIME->memory_insert(name.length() + sizeof(std::string)); - rdo::converter::smr2rdox::LPRDOValue pValue; - if (LEXER->m_lploc) - { - YYLTYPE pos = LEXER_POS; - pos.m_last_line = pos.m_first_line; - pos.m_last_pos = pos.m_first_pos + name.length(); - pos.m_last_seek = pos.m_first_seek + name.length(); - pValue = rdo::Factory::create(rdo::converter::smr2rdox::RDOParserSrcInfo(pos, name)); - } - else - { - pValue = rdo::Factory::create(rdo::converter::smr2rdox::RDOParserSrcInfo(name)); - } - - LEXER->setvalue(CONVERTER->stack().push(pValue)); - - return RDO_IDENTIF_NoChange; + const std::string n1(YYText()); + const std::string::size_type pos = n1.find_first_of("\r\n\t :"); + const std::string name(n1, 0, pos); + RUNTIME->memory_insert(name.length() + sizeof(std::string)); + rdo::converter::smr2rdox::LPRDOValue pValue; + if (LEXER->m_lploc) + { + YYLTYPE pos = LEXER_POS; + pos.m_last_line = pos.m_first_line; + pos.m_last_pos = pos.m_first_pos + name.length(); + pos.m_last_seek = pos.m_first_seek + name.length(); + pValue = rdo::Factory::create(rdo::converter::smr2rdox::RDOParserSrcInfo(pos, name)); + } + else + { + pValue = rdo::Factory::create(rdo::converter::smr2rdox::RDOParserSrcInfo(name)); + } + + LEXER->setvalue(CONVERTER->stack().push(pValue)); + + return RDO_IDENTIF_NoChange; } [A-Za-z\xA8\xB8\xC0-\xFF_$][A-Za-z\xA8\xB8\xC0-\xFF0-9_$]*[\r\n\t ]*\: { - const std::string n1(YYText()); - const std::string::size_type pos = n1.find_first_of("\r\n\t :"); - const std::string name(n1, 0, pos); - RUNTIME->memory_insert(name.length() + sizeof(std::string)); - rdo::converter::smr2rdox::LPRDOValue pValue; - if (LEXER->m_lploc) - { - YYLTYPE pos = LEXER_POS; - pos.m_last_line = pos.m_first_line; - pos.m_last_pos = pos.m_first_pos + name.length(); - pos.m_last_seek = pos.m_first_seek + name.length(); - pValue = rdo::Factory::create(rdo::converter::smr2rdox::RDOParserSrcInfo(pos, name)); - } - else - { - pValue = rdo::Factory::create(rdo::converter::smr2rdox::RDOParserSrcInfo(name)); - } - - LEXER->setvalue(CONVERTER->stack().push(pValue)); - - return RDO_IDENTIF_COLON; + const std::string n1(YYText()); + const std::string::size_type pos = n1.find_first_of("\r\n\t :"); + const std::string name(n1, 0, pos); + RUNTIME->memory_insert(name.length() + sizeof(std::string)); + rdo::converter::smr2rdox::LPRDOValue pValue; + if (LEXER->m_lploc) + { + YYLTYPE pos = LEXER_POS; + pos.m_last_line = pos.m_first_line; + pos.m_last_pos = pos.m_first_pos + name.length(); + pos.m_last_seek = pos.m_first_seek + name.length(); + pValue = rdo::Factory::create(rdo::converter::smr2rdox::RDOParserSrcInfo(pos, name)); + } + else + { + pValue = rdo::Factory::create(rdo::converter::smr2rdox::RDOParserSrcInfo(name)); + } + + LEXER->setvalue(CONVERTER->stack().push(pValue)); + + return RDO_IDENTIF_COLON; } [A-Za-z\xA8\xB8\xC0-\xFF_$][A-Za-z\xA8\xB8\xC0-\xFF0-9_$]* { - const std::string name(YYText()); - RUNTIME->memory_insert(name.length() + sizeof(std::string)); - - LEXER->setvalue(CONVERTER->stack().push( - rdo::Factory::create( - LEXER->m_lploc - ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, name) - : rdo::converter::smr2rdox::RDOParserSrcInfo(name) - ) - )); - - switch (CONVERTER->getFileToParse()) - { - case rdo::converter::smr2rdox::PAT_IN: - if (CONVERTER->isPattern()) - { - rdo::converter::smr2rdox::LPRDOPATPattern pPattern = CONVERTER->getLastPATPattern(); - ASSERT(pPattern); - rdo::converter::smr2rdox::LPRDORelevantResource pCurrRelRes = pPattern->m_pCurrRelRes; - if (pCurrRelRes) - { - rdo::converter::smr2rdox::LPRDORTPResType pResType = pCurrRelRes->getType(); - ASSERT(pResType); - if (pResType->findRTPParam(name)) - { - return RDO_IDENTIF; - } - } - if (pPattern->findRelevantResource(name)) - { - return RDO_IDENTIF_RELRES; - } - } - break; - - default: - break; - } - return RDO_IDENTIF; + const std::string name(YYText()); + RUNTIME->memory_insert(name.length() + sizeof(std::string)); + + LEXER->setvalue(CONVERTER->stack().push( + rdo::Factory::create( + LEXER->m_lploc + ? rdo::converter::smr2rdox::RDOParserSrcInfo(LEXER_POS, name) + : rdo::converter::smr2rdox::RDOParserSrcInfo(name) + ) + )); + + switch (CONVERTER->getFileToParse()) + { + case rdo::converter::smr2rdox::FileTypeIn::PAT: + if (CONVERTER->isPattern()) + { + rdo::converter::smr2rdox::LPRDOPATPattern pPattern = CONVERTER->getLastPATPattern(); + ASSERT(pPattern); + rdo::converter::smr2rdox::LPRDORelevantResource pCurrRelRes = pPattern->m_pCurrRelRes; + if (pCurrRelRes) + { + rdo::converter::smr2rdox::LPRDORTPResType pResType = pCurrRelRes->getType(); + ASSERT(pResType); + if (pResType->findRTPParam(name)) + { + return RDO_IDENTIF; + } + } + if (pPattern->findRelevantResource(name)) + { + return RDO_IDENTIF_RELRES; + } + } + break; + + default: + break; + } + return RDO_IDENTIF; } %% diff --git a/converter/smr2rdox/grammar/rdobison.h b/converter/smr2rdox/grammar/rdobison.h index 22a7d9ac1..5029666ab 100644 --- a/converter/smr2rdox/grammar/rdobison.h +++ b/converter/smr2rdox/grammar/rdobison.h @@ -1,9 +1,6 @@ -#ifndef _CONVERTOR_RDOBISON_H_ -#define _CONVERTOR_RDOBISON_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS #include "simulator/compiler/parser/grammar/rdobison.h" // -------------------------------------------------------------------------------- - -#endif // _CONVERTOR_RDOBISON_H_ diff --git a/converter/smr2rdox/grammar/rdodpt.y b/converter/smr2rdox/grammar/rdodpt.y index 3a9e8209b..e65b0fd8c 100644 --- a/converter/smr2rdox/grammar/rdodpt.y +++ b/converter/smr2rdox/grammar/rdodpt.y @@ -1,13 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdodpt.y - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \date - \brief - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -16,175 +6,175 @@ %pure-parser %param {void* lexer} -%token RDO_Resource_type 257 -%token RDO_permanent 258 -%token RDO_Parameters 259 -%token RDO_integer 260 -%token RDO_real 261 -%token RDO_End 262 -%token RDO_temporary 263 -%token RDO_IDENTIF 264 -%token RDO_INT_CONST 265 -%token RDO_REAL_CONST 266 -%token RDO_such_as 267 -%token RDO_dblpoint 268 -%token RDO_Resources 269 -%token RDO_trace 270 -%token RDO_no_trace 271 -%token RDO_IDENTIF_COLON 272 -%token RDO_Constant 273 -%token RDO_Body 274 -%token RDO_Function 275 -%token RDO_Type 276 -%token RDO_algorithmic 277 -%token RDO_table 278 -%token RDO_list 279 -%token RDO_Exist 281 -%token RDO_Not_Exist 282 -%token RDO_For_All 283 -%token RDO_Not_For_All 284 -%token RDO_neq 285 -%token RDO_leq 286 -%token RDO_geq 287 -%token RDO_NoCheck 288 -%token RDO_Calculate_if 289 -%token RDO_or 290 -%token RDO_and 291 -%token RDO_Sequence 292 -%token RDO_uniform 293 -%token RDO_exponential 294 -%token RDO_normal 295 -%token RDO_by_hist 296 -%token RDO_enumerative 297 - -%token RDO_Pattern 298 -%token RDO_operation 299 -%token RDO_irregular_event 300 -%token RDO_rule 301 -%token RDO_keyboard 302 -%token RDO_Relevant_resources 303 -%token RDO_Keep 304 -%token RDO_Create 305 -%token RDO_Erase 306 -%token RDO_NonExist 307 -%token RDO_IDENTIF_NoChange 308 -%token RDO_Time 309 -%token RDO_Choice 310 -%token RDO_from 311 -%token RDO_first 312 -%token RDO_Convert_begin 313 -%token RDO_Convert_end 314 -%token RDO_Convert_rule 315 -%token RDO_Convert_event 316 -%token RDO_with_max 317 -%token RDO_with_min 318 -%token RDO_set 319 -%token RDO_IDENTIF_NoChange_NoChange 320 -%token RDO_Operations 321 - -%token RDO_Results 322 -%token RDO_watch_par 323 -%token RDO_watch_state 324 -%token RDO_watch_quant 325 -%token RDO_watch_value 326 -%token RDO_get_value 327 - -%token RDO_Model_name 328 -%token RDO_Resource_file 329 -%token RDO_OprIev_file 330 -%token RDO_Frame_file 331 -%token RDO_Statistic_file 332 -%token RDO_Results_file 333 -%token RDO_Trace_file 334 -%token RDO_Show_mode 335 -%token RDO_Frame_number 336 -%token RDO_Show_rate 337 -%token RDO_Run_StartTime 338 -%token RDO_Trace_StartTime 339 -%token RDO_Trace_EndTime 340 -%token RDO_Terminate_if 341 -%token RDO_Break_point 342 -%token RDO_Seed 343 -%token RDO_NoShow 344 -%token RDO_Monitor 345 -%token RDO_Animation 346 -%token RDO_NoChange 347 - -%token RDO_Decision_point 348 -%token RDO_search 349 -%token RDO_trace_stat 350 -%token RDO_trace_tops 351 -%token RDO_trace_all 352 -%token RDO_Condition 353 -%token RDO_Term_condition 354 -%token RDO_Evaluate_by 355 -%token RDO_Compare_tops 356 -%token RDO_NO 357 -%token RDO_YES 358 -%token RDO_Activities 359 -%token RDO_value_before 360 -%token RDO_value_after 361 -%token RDO_some 362 -%token RDO_Process 363 -%token RDO_SEIZE 364 -%token RDO_GENERATE 365 -%token RDO_TERMINATE 366 -%token RDO_ADVANCE 367 -%token RDO_RELEASE 368 -%token RDO_if 369 -%token RDO_CF 370 -%token RDO_Priority 371 -%token RDO_prior 372 -%token RDO_Parent 373 - -%token RDO_Frame 400 -%token RDO_Show_if 401 -%token RDO_Back_picture 402 -%token RDO_Show 403 -%token RDO_frm_cell 404 -%token RDO_text 405 -%token RDO_bitmap 406 -%token RDO_s_bmp 407 -%token RDO_rect 408 -%token RDO_r_rect 409 -%token RDO_line 410 -%token RDO_ellipse 411 -%token RDO_triang 412 -%token RDO_active 413 -%token RDO_ruler 414 -%token RDO_space 415 -%token RDO_color_transparent 416 -%token RDO_color_last 417 -%token RDO_color_white 418 -%token RDO_color_black 419 -%token RDO_color_red 420 -%token RDO_color_green 421 -%token RDO_color_blue 422 -%token RDO_color_cyan 423 -%token RDO_color_magenta 424 -%token RDO_color_yellow 425 -%token RDO_color_gray 426 - -%token RDO_IDENTIF_RELRES 427 -%token RDO_typedef 428 -%token RDO_enum 429 - -%token RDO_STRING_CONST 430 -%token RDO_Select 431 -%token RDO_Size 432 -%token RDO_Empty 433 -%token RDO_not 434 -%token RDO_UMINUS 435 -%token RDO_string 436 -%token RDO_bool 437 -%token RDO_BOOL_CONST 438 -%token RDO_Fuzzy 439 -%token RDO_Fuzzy_Term 440 -%token RDO_eq 441 -%token RDO_External_Model 442 -%token RDO_QUEUE 443 -%token RDO_DEPART 444 -%token RDO_ASSIGN 445 +%token RDO_Resource_type 257 +%token RDO_permanent 258 +%token RDO_Parameters 259 +%token RDO_integer 260 +%token RDO_real 261 +%token RDO_End 262 +%token RDO_temporary 263 +%token RDO_IDENTIF 264 +%token RDO_INT_CONST 265 +%token RDO_REAL_CONST 266 +%token RDO_such_as 267 +%token RDO_dblpoint 268 +%token RDO_Resources 269 +%token RDO_trace 270 +%token RDO_no_trace 271 +%token RDO_IDENTIF_COLON 272 +%token RDO_Constant 273 +%token RDO_Body 274 +%token RDO_Function 275 +%token RDO_Type 276 +%token RDO_algorithmic 277 +%token RDO_table 278 +%token RDO_list 279 +%token RDO_Exist 281 +%token RDO_Not_Exist 282 +%token RDO_For_All 283 +%token RDO_Not_For_All 284 +%token RDO_neq 285 +%token RDO_leq 286 +%token RDO_geq 287 +%token RDO_NoCheck 288 +%token RDO_Calculate_if 289 +%token RDO_or 290 +%token RDO_and 291 +%token RDO_Sequence 292 +%token RDO_uniform 293 +%token RDO_exponential 294 +%token RDO_normal 295 +%token RDO_by_hist 296 +%token RDO_enumerative 297 + +%token RDO_Pattern 298 +%token RDO_operation 299 +%token RDO_irregular_event 300 +%token RDO_rule 301 +%token RDO_keyboard 302 +%token RDO_Relevant_resources 303 +%token RDO_Keep 304 +%token RDO_Create 305 +%token RDO_Erase 306 +%token RDO_NonExist 307 +%token RDO_IDENTIF_NoChange 308 +%token RDO_Time 309 +%token RDO_Choice 310 +%token RDO_from 311 +%token RDO_first 312 +%token RDO_Convert_begin 313 +%token RDO_Convert_end 314 +%token RDO_Convert_rule 315 +%token RDO_Convert_event 316 +%token RDO_with_max 317 +%token RDO_with_min 318 +%token RDO_set 319 +%token RDO_IDENTIF_NoChange_NoChange 320 +%token RDO_Operations 321 + +%token RDO_Results 322 +%token RDO_watch_par 323 +%token RDO_watch_state 324 +%token RDO_watch_quant 325 +%token RDO_watch_value 326 +%token RDO_get_value 327 + +%token RDO_Model_name 328 +%token RDO_Resource_file 329 +%token RDO_OprIev_file 330 +%token RDO_Frame_file 331 +%token RDO_Statistic_file 332 +%token RDO_Results_file 333 +%token RDO_Trace_file 334 +%token RDO_Show_mode 335 +%token RDO_Frame_number 336 +%token RDO_Show_rate 337 +%token RDO_Run_StartTime 338 +%token RDO_Trace_StartTime 339 +%token RDO_Trace_EndTime 340 +%token RDO_Terminate_if 341 +%token RDO_Break_point 342 +%token RDO_Seed 343 +%token RDO_NoShow 344 +%token RDO_Monitor 345 +%token RDO_Animation 346 +%token RDO_NoChange 347 + +%token RDO_Decision_point 348 +%token RDO_search 349 +%token RDO_trace_stat 350 +%token RDO_trace_tops 351 +%token RDO_trace_all 352 +%token RDO_Condition 353 +%token RDO_Term_condition 354 +%token RDO_Evaluate_by 355 +%token RDO_Compare_tops 356 +%token RDO_NO 357 +%token RDO_YES 358 +%token RDO_Activities 359 +%token RDO_value_before 360 +%token RDO_value_after 361 +%token RDO_some 362 +%token RDO_Process 363 +%token RDO_SEIZE 364 +%token RDO_GENERATE 365 +%token RDO_TERMINATE 366 +%token RDO_ADVANCE 367 +%token RDO_RELEASE 368 +%token RDO_if 369 +%token RDO_CF 370 +%token RDO_Priority 371 +%token RDO_prior 372 +%token RDO_Parent 373 + +%token RDO_Frame 400 +%token RDO_Show_if 401 +%token RDO_Back_picture 402 +%token RDO_Show 403 +%token RDO_frm_cell 404 +%token RDO_text 405 +%token RDO_bitmap 406 +%token RDO_s_bmp 407 +%token RDO_rect 408 +%token RDO_r_rect 409 +%token RDO_line 410 +%token RDO_ellipse 411 +%token RDO_triang 412 +%token RDO_active 413 +%token RDO_ruler 414 +%token RDO_space 415 +%token RDO_color_transparent 416 +%token RDO_color_last 417 +%token RDO_color_white 418 +%token RDO_color_black 419 +%token RDO_color_red 420 +%token RDO_color_green 421 +%token RDO_color_blue 422 +%token RDO_color_cyan 423 +%token RDO_color_magenta 424 +%token RDO_color_yellow 425 +%token RDO_color_gray 426 + +%token RDO_IDENTIF_RELRES 427 +%token RDO_typedef 428 +%token RDO_enum 429 + +%token RDO_STRING_CONST 430 +%token RDO_Select 431 +%token RDO_Size 432 +%token RDO_Empty 433 +%token RDO_not 434 +%token RDO_UMINUS 435 +%token RDO_string 436 +%token RDO_bool 437 +%token RDO_BOOL_CONST 438 +%token RDO_Fuzzy 439 +%token RDO_Fuzzy_Term 440 +%token RDO_eq 441 +%token RDO_External_Model 442 +%token RDO_QUEUE 443 +%token RDO_DEPART 444 +%token RDO_ASSIGN 445 %{ @@ -222,955 +212,1231 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- DPT // -------------------------------------------------------------------------------- dpt_main - : /* empty */ - | dpt_main dpt_search_end - | dpt_main dpt_some_end - | dpt_main dpt_prior_end - | dpt_main dpt_free_end - | dpt_main dpt_process_end - { - LPDocUpdate pProcessMove = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - 0, - IDocument::PRC - ); - ASSERT(pProcessMove); - CONVERTER->insertDocUpdate(pProcessMove); - } - | error - { - CONVERTER->error().error(@1, "Ожидается описание точки или свободного блока активностей"); - } - ; + : /* empty */ + | dpt_main dpt_search_end + | dpt_main dpt_some_end + | dpt_main dpt_prior_end + | dpt_main dpt_free_end + | dpt_main dpt_process_end + { + LPDocUpdate pProcessMove = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + 0, + IDocument::Type::PRC + ); + ASSERT(pProcessMove); + CONVERTER->insertDocUpdate(pProcessMove); + } + | error + { + CONVERTER->error().error(@1, "Ожидается описание точки или свободного блока активностей"); + } + ; // -------------------------------------------------------------------------------- // -------------------- DPTSearch // -------------------------------------------------------------------------------- dpt_search_trace - : /* empty */ - { - $$ = rdo::runtime::RDODPTSearchTrace::DPT_no_trace; - } - | RDO_no_trace - { - $$ = rdo::runtime::RDODPTSearchTrace::DPT_no_trace; - } - | RDO_trace - { - CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа search"); - } - | RDO_trace_stat - { - $$ = rdo::runtime::RDODPTSearchTrace::DPT_trace_stat; - } - | RDO_trace_tops - { - $$ = rdo::runtime::RDODPTSearchTrace::DPT_trace_tops; - } - | RDO_trace_all - { - $$ = rdo::runtime::RDODPTSearchTrace::DPT_trace_all; - } - ; + : /* empty */ + { + $$ = static_cast(rdo::runtime::RDODPTSearchTrace::TraceFlag::NO_TRACE); + } + | RDO_no_trace + { + $$ = static_cast(rdo::runtime::RDODPTSearchTrace::TraceFlag::NO_TRACE); + } + | RDO_trace + { + CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа search"); + } + | RDO_trace_stat + { + $$ = static_cast(rdo::runtime::RDODPTSearchTrace::TraceFlag::TRACE_STAT); + } + | RDO_trace_tops + { + $$ = static_cast(rdo::runtime::RDODPTSearchTrace::TraceFlag::TRACE_TOPS); + } + | RDO_trace_all + { + $$ = static_cast(rdo::runtime::RDODPTSearchTrace::TraceFlag::TRACE_ALL); + } + ; dpt_search_parent - : /* empty */ - { - $$ = CONVERTER->stack().push(rdo::Factory::create()); - } - | RDO_Parent RDO_IDENTIF - { - $$ = $2; - } - | RDO_Parent error - { - CONVERTER->error().error(@1, "Ошибка в имени родительской точки"); - } - ; + : /* empty */ + { + $$ = CONVERTER->stack().push(rdo::Factory::create()); + } + | RDO_Parent RDO_IDENTIF + { + $$ = $2; + } + | RDO_Parent error + { + CONVERTER->error().error(@1, "Ошибка в имени родительской точки"); + } + ; dpt_search_begin - : RDO_Decision_point RDO_IDENTIF_COLON RDO_search dpt_search_parent dpt_search_trace - { - LPRDOValue pName = CONVERTER->stack().pop($2); - LPRDOValue pParentName = CONVERTER->stack().pop($4); - ASSERT(pName); - - LPRDODPTSearch pDPTSearch; - if (pParentName->defined()) - { - LPRDODPTPrior pParentDPTPrior = CONVERTER->findDPTPrior (pParentName->value().getIdentificator()); - LPRDODPTSearch pParentDPTSearch = CONVERTER->findDPTSearch(pParentName->value().getIdentificator()); - LPRDODPTSome pParentDPTSome = CONVERTER->findDPTSome (pParentName->value().getIdentificator()); - if (!pParentDPTPrior && !pParentDPTSearch && !pParentDPTSome) - { - CONVERTER->error().error(@1, rdo::format("Не найдена родитеская точка %s", pParentName->value().getIdentificator().c_str())); - } - if (pParentDPTSearch) - { - CONVERTER->error().error(@1, "Точка принятия решений типа search может содержать лишь активности типа rule и не может быть указана в качестве родительской точки"); - } - else if (pParentDPTPrior) - { - LPILogic pParent = pParentDPTPrior->getLogic(); - ASSERT(pParent); - pDPTSearch = rdo::Factory::create(pName->src_info(), *reinterpret_cast(&$5), pParent); - } - else if (pParentDPTSome) - { - LPILogic pParent = pParentDPTSome->getLogic(); - ASSERT(pParent); - pDPTSearch = rdo::Factory::create(pName->src_info(), *reinterpret_cast(&$5), pParent); - } - } - else - { - pDPTSearch = rdo::Factory::create(pName->src_info(), *reinterpret_cast(&$5)); - } - ASSERT(pDPTSearch); - $$ = CONVERTER->stack().push(pDPTSearch); - } - | RDO_Decision_point RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@2, @3, "Ожидается тип точки"); - } - | RDO_Decision_point RDO_IDENTIF error - { - CONVERTER->error().error(@2, "Ожидается двоеточие"); - } - | RDO_Decision_point error - { - CONVERTER->error().error(@1, @2, "После ключевого слова $Decision_point ожидается имя точки"); - } - ; + : RDO_Decision_point RDO_IDENTIF_COLON RDO_search dpt_search_parent dpt_search_trace + { + LPRDOValue pName = CONVERTER->stack().pop($2); + LPRDOValue pParentName = CONVERTER->stack().pop($4); + ASSERT(pName); + + LPRDODPTSearch pDPTSearch; + if (pParentName->defined()) + { + LPRDODPTPrior pParentDPTPrior = CONVERTER->findDPTPrior (pParentName->value().getIdentificator()); + LPRDODPTSearch pParentDPTSearch = CONVERTER->findDPTSearch(pParentName->value().getIdentificator()); + LPRDODPTSome pParentDPTSome = CONVERTER->findDPTSome (pParentName->value().getIdentificator()); + if (!pParentDPTPrior && !pParentDPTSearch && !pParentDPTSome) + { + CONVERTER->error().error(@1, rdo::format("Не найдена родитеская точка %s", pParentName->value().getIdentificator().c_str())); + } + if (pParentDPTSearch) + { + CONVERTER->error().error(@1, "Точка принятия решений типа search может содержать лишь активности типа rule и не может быть указана в качестве родительской точки"); + } + else if (pParentDPTPrior) + { + LPILogic pParent = pParentDPTPrior->getLogic(); + ASSERT(pParent); + pDPTSearch = rdo::Factory::create(pName->src_info(), *reinterpret_cast(&$5), pParent); + } + else if (pParentDPTSome) + { + LPILogic pParent = pParentDPTSome->getLogic(); + ASSERT(pParent); + pDPTSearch = rdo::Factory::create(pName->src_info(), *reinterpret_cast(&$5), pParent); + } + } + else + { + pDPTSearch = rdo::Factory::create(pName->src_info(), *reinterpret_cast(&$5)); + } + ASSERT(pDPTSearch); + $$ = CONVERTER->stack().push(pDPTSearch); + } + | RDO_Decision_point RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@2, @3, "Ожидается тип точки"); + } + | RDO_Decision_point RDO_IDENTIF error + { + CONVERTER->error().error(@2, "Ожидается двоеточие"); + } + | RDO_Decision_point error + { + CONVERTER->error().error(@1, @2, "После ключевого слова $Decision_point ожидается имя точки"); + } + ; dpt_search_condition - : dpt_search_begin RDO_Condition fun_logic - { - LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setCondition(CONVERTER->stack().pop($3)); - $$ = CONVERTER->stack().push(pDPTSearch); - } - | dpt_search_begin RDO_Condition RDO_NoCheck - { - LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setCondition(); - $$ = CONVERTER->stack().push(pDPTSearch); - } - | dpt_search_begin RDO_Condition error - { - CONVERTER->error().error(@2, @3, "После ключевого слова $Condition ожидается условие начала поиска (начальная вершина)"); - } - | dpt_search_begin error - { - CONVERTER->error().error(@2, "Ожидается ключевое слово $Condition"); - } - ; + : dpt_search_begin RDO_Condition fun_logic + { + LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setCondition(CONVERTER->stack().pop($3)); + $$ = CONVERTER->stack().push(pDPTSearch); + } + | dpt_search_begin RDO_Condition RDO_NoCheck + { + LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setCondition(); + $$ = CONVERTER->stack().push(pDPTSearch); + } + | dpt_search_begin RDO_Condition error + { + CONVERTER->error().error(@2, @3, "После ключевого слова $Condition ожидается условие начала поиска (начальная вершина)"); + } + | dpt_search_begin error + { + CONVERTER->error().error(@2, "Ожидается ключевое слово $Condition"); + } + ; dpt_search_prior - : dpt_search_condition - | dpt_search_condition RDO_Priority fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pArithm); - if (!CONVERTER->getLastDPTSearch()->setPrior(pArithm)) - { - CONVERTER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); - } - } - | dpt_search_condition RDO_Priority error - { - CONVERTER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); - } - | dpt_search_condition error - { - CONVERTER->error().error(@1, @2, "Ожидается ключевое слово $Priority"); - } - ; + : dpt_search_condition + | dpt_search_condition RDO_Priority fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pArithm); + if (!CONVERTER->getLastDPTSearch()->setPrior(pArithm)) + { + CONVERTER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); + } + } + | dpt_search_condition RDO_Priority error + { + CONVERTER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); + } + | dpt_search_condition error + { + CONVERTER->error().error(@1, @2, "Ожидается ключевое слово $Priority"); + } + ; dpt_search_term - : dpt_search_prior RDO_Term_condition fun_logic - { - LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setTermCondition(CONVERTER->stack().pop($3)); - $$ = CONVERTER->stack().push(pDPTSearch); - } - | dpt_search_prior RDO_Term_condition RDO_NoCheck - { - LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setTermCondition(); - $$ = CONVERTER->stack().push(pDPTSearch); - } - | dpt_search_prior RDO_Term_condition error - { - CONVERTER->error().error(@2, @3, "После ключевого слова $Term_condition ожидается условие остановки поиска (конечная вершина)"); - } - | dpt_search_prior error - { - CONVERTER->error().error(@2, "Ожидается ключевое слово $Term_condition"); - } - ; + : dpt_search_prior RDO_Term_condition fun_logic + { + LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setTermCondition(CONVERTER->stack().pop($3)); + $$ = CONVERTER->stack().push(pDPTSearch); + } + | dpt_search_prior RDO_Term_condition RDO_NoCheck + { + LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setTermCondition(); + $$ = CONVERTER->stack().push(pDPTSearch); + } + | dpt_search_prior RDO_Term_condition error + { + CONVERTER->error().error(@2, @3, "После ключевого слова $Term_condition ожидается условие остановки поиска (конечная вершина)"); + } + | dpt_search_prior error + { + CONVERTER->error().error(@2, "Ожидается ключевое слово $Term_condition"); + } + ; dpt_search_evaluate - : dpt_search_term RDO_Evaluate_by fun_arithm - { - LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setEvaluateBy(CONVERTER->stack().pop($3)); - $$ = CONVERTER->stack().push(pDPTSearch); - } - | dpt_search_term RDO_Evaluate_by error - { - CONVERTER->error().error(@2, @3, "После ключевого слова $Evaluate_by ожидается оценочная функция, например, 0 для поиска в ширину"); - } - | dpt_search_term error - { - CONVERTER->error().error(@2, "Ожидается ключевое слово $Evaluate_by"); - } - ; + : dpt_search_term RDO_Evaluate_by fun_arithm + { + LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setEvaluateBy(CONVERTER->stack().pop($3)); + $$ = CONVERTER->stack().push(pDPTSearch); + } + | dpt_search_term RDO_Evaluate_by error + { + CONVERTER->error().error(@2, @3, "После ключевого слова $Evaluate_by ожидается оценочная функция, например, 0 для поиска в ширину"); + } + | dpt_search_term error + { + CONVERTER->error().error(@2, "Ожидается ключевое слово $Evaluate_by"); + } + ; dp_searcht_compare - : dpt_search_evaluate RDO_Compare_tops '=' RDO_NO - { - LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setCompareTops(false); - $$ = CONVERTER->stack().push(pDPTSearch); - } - | dpt_search_evaluate RDO_Compare_tops '=' RDO_YES - { - LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setCompareTops(true); - $$ = CONVERTER->stack().push(pDPTSearch); - } - | dpt_search_evaluate RDO_Compare_tops '=' error - { - CONVERTER->error().error(@3, @4, "Ожидается режим запоминания пройденных вершин (YES или NO)"); - } - | dpt_search_evaluate RDO_Compare_tops error - { - CONVERTER->error().error(@2, @3, "Ожидается знак равенства"); - } - | dpt_search_evaluate error - { - CONVERTER->error().error(@2, "Ожидается ключевое слово $Compare_tops"); - } - ; + : dpt_search_evaluate RDO_Compare_tops '=' RDO_NO + { + LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setCompareTops(false); + $$ = CONVERTER->stack().push(pDPTSearch); + } + | dpt_search_evaluate RDO_Compare_tops '=' RDO_YES + { + LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setCompareTops(true); + $$ = CONVERTER->stack().push(pDPTSearch); + } + | dpt_search_evaluate RDO_Compare_tops '=' error + { + CONVERTER->error().error(@3, @4, "Ожидается режим запоминания пройденных вершин (YES или NO)"); + } + | dpt_search_evaluate RDO_Compare_tops error + { + CONVERTER->error().error(@2, @3, "Ожидается знак равенства"); + } + | dpt_search_evaluate error + { + CONVERTER->error().error(@2, "Ожидается ключевое слово $Compare_tops"); + } + ; dpt_search_descr_param - : /* empty */ - | dpt_search_descr_param '*' - { - CONVERTER->getLastDPTSearch()->getLastActivity()->addParam( - rdo::Factory::create(RDOParserSrcInfo(@2, "*")) - ); - } - | dpt_search_descr_param fun_arithm - { - CONVERTER->getLastDPTSearch()->getLastActivity()->addParam(CONVERTER->stack().pop($2)->value()); - } - | dpt_search_descr_param error - { - CONVERTER->error().error(@1, @2, "Ошибка описания параметра образца"); - } - ; + : '*' + { + CONVERTER->getLastDPTSearch()->getLastActivity()->addParam( + rdo::Factory::create(RDOParserSrcInfo(@1, "*")) + ); + } + | fun_arithm + { + CONVERTER->getLastDPTSearch()->getLastActivity()->addParam(CONVERTER->stack().pop($1)->value()); + } + | dpt_search_descr_param '*' + { + CONVERTER->getLastDPTSearch()->getLastActivity()->addParam( + rdo::Factory::create(RDOParserSrcInfo(@2, "*")) + ); + + LPDocUpdate pCommaInsert = rdo::Factory::create( + @1.m_last_seek, + "," + ); + ASSERT(pCommaInsert); + CONVERTER->insertDocUpdate(pCommaInsert); + } + | dpt_search_descr_param fun_arithm + { + CONVERTER->getLastDPTSearch()->getLastActivity()->addParam(CONVERTER->stack().pop($2)->value()); + + LPDocUpdate pCommaInsert = rdo::Factory::create( + @1.m_last_seek, + "," + ); + ASSERT(pCommaInsert); + CONVERTER->insertDocUpdate(pCommaInsert); + } + | dpt_search_descr_param error + { + CONVERTER->error().error(@1, @2, "Ошибка описания параметра образца"); + } + ; dpt_search_descr_value - : RDO_value_before fun_arithm - { - LPRDODPTSearch pDPTSearch = CONVERTER->getLastDPTSearch(); - ASSERT(pDPTSearch); - pDPTSearch->getLastActivity()->setValue(IDPTSearchActivity::vt_before, CONVERTER->stack().pop($2), @1); - } - | RDO_value_after fun_arithm - { - LPRDODPTSearch pDPTSearch = CONVERTER->getLastDPTSearch(); - ASSERT(pDPTSearch); - pDPTSearch->getLastActivity()->setValue(IDPTSearchActivity::vt_after, CONVERTER->stack().pop($2), @1); - } - | RDO_value_before error - { - CONVERTER->error().error(@1, @2, "Ошибка в арифметическом выражении"); - } - | RDO_value_after error - { - CONVERTER->error().error(@1, @2, "Ошибка в арифметическом выражении"); - } - ; + : RDO_value_before fun_arithm + { + LPRDODPTSearch pDPTSearch = CONVERTER->getLastDPTSearch(); + ASSERT(pDPTSearch); + pDPTSearch->getLastActivity()->setValue(IDPTSearchActivity::CostTime::BEFORE, CONVERTER->stack().pop($2), @1); + } + | RDO_value_after fun_arithm + { + LPRDODPTSearch pDPTSearch = CONVERTER->getLastDPTSearch(); + ASSERT(pDPTSearch); + pDPTSearch->getLastActivity()->setValue(IDPTSearchActivity::CostTime::AFTER, CONVERTER->stack().pop($2), @1); + } + | RDO_value_before error + { + CONVERTER->error().error(@1, @2, "Ошибка в арифметическом выражении"); + } + | RDO_value_after error + { + CONVERTER->error().error(@1, @2, "Ошибка в арифметическом выражении"); + } + ; dpt_search_name - : RDO_IDENTIF_COLON RDO_IDENTIF - { - LPRDODPTSearch pDPTSearch = CONVERTER->getLastDPTSearch(); - ASSERT(pDPTSearch); - LPRDOValue pName = CONVERTER->stack().pop($1); - LPRDOValue pPattern = CONVERTER->stack().pop($2); - LPRDODPTActivity pActivity = pDPTSearch->addNewActivity(pName->src_info(), pPattern->src_info()); - ASSERT(pActivity); - $$ = CONVERTER->stack().push(pActivity); - } - | RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@1, @2, "Ожидается имя образца"); - } - | RDO_IDENTIF - { - CONVERTER->error().error(@1, "Ожидается ':'"); - } - | error - { - CONVERTER->error().error(@1, "Ожидается имя активности"); - } - ; + : RDO_IDENTIF_COLON RDO_IDENTIF + { + LPRDODPTSearch pDPTSearch = CONVERTER->getLastDPTSearch(); + ASSERT(pDPTSearch); + LPRDOValue pName = CONVERTER->stack().pop($1); + LPRDOValue pPattern = CONVERTER->stack().pop($2); + LPRDODPTActivity pActivity = pDPTSearch->addNewActivity(pName->src_info(), pPattern->src_info()); + ASSERT(pActivity); + $$ = CONVERTER->stack().push(pActivity); + } + | RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@1, @2, "Ожидается имя образца"); + } + | RDO_IDENTIF + { + CONVERTER->error().error(@1, "Ожидается ':'"); + } + | error + { + CONVERTER->error().error(@1, "Ожидается имя активности"); + } + ; dpt_searcht_activity - : /* empty */ - { - $$ = CONVERTER->stack().push(LPRDODPTActivity()); - } - | dpt_searcht_activity dpt_search_name dpt_search_descr_param dpt_search_descr_value - { - LPRDODPTActivity pActivity = CONVERTER->stack().pop($2); - ASSERT(pActivity) - pActivity->endParam(@3); - } - | dpt_searcht_activity dpt_search_name dpt_search_descr_param error - { - CONVERTER->error().error(@3, @4, "Ожидаются ключевые слова value before или value after и стоимость применения правила"); - } - ; + : /* empty */ + { + $$ = CONVERTER->stack().push(LPRDODPTActivity()); + } + | dpt_searcht_activity dpt_search_name dpt_search_descr_value + { + LPRDODPTActivity pActivity = CONVERTER->stack().pop($2); + ASSERT(pActivity) + pActivity->endParam(@2); + + LPDocUpdate pSemicolonInsert = rdo::Factory::create( + @3.m_last_seek, + ";" + ); + ASSERT(pSemicolonInsert); + CONVERTER->insertDocUpdate(pSemicolonInsert); + } + | dpt_searcht_activity dpt_search_name dpt_search_descr_param dpt_search_descr_value + { + LPRDODPTActivity pActivity = CONVERTER->stack().pop($2); + ASSERT(pActivity) + pActivity->endParam(@3); + + LPDocUpdate pLeftBracketInsert = rdo::Factory::create( + @3.m_first_seek, + "(" + ); + ASSERT(pLeftBracketInsert); + CONVERTER->insertDocUpdate(pLeftBracketInsert); + + LPDocUpdate pRightBracketInsert = rdo::Factory::create( + @3.m_last_seek, + ")" + ); + ASSERT(pRightBracketInsert); + CONVERTER->insertDocUpdate(pRightBracketInsert); + + LPDocUpdate pSemicolonInsert = rdo::Factory::create( + @4.m_last_seek, + ";" + ); + ASSERT(pSemicolonInsert); + CONVERTER->insertDocUpdate(pSemicolonInsert); + } + | dpt_searcht_activity dpt_search_name dpt_search_descr_param error + { + CONVERTER->error().error(@3, @4, "Ожидаются ключевые слова value before или value after и стоимость применения правила"); + } + ; dpt_search_header - : dp_searcht_compare RDO_Activities dpt_searcht_activity - | dp_searcht_compare error - { - CONVERTER->error().error(@1, @2, "После режима запоминания пройденных вершин ожидается ключевое слово $Activities"); - } - ; + : dp_searcht_compare RDO_Activities dpt_searcht_activity + | dp_searcht_compare error + { + CONVERTER->error().error(@1, @2, "После режима запоминания пройденных вершин ожидается ключевое слово $Activities"); + } + ; dpt_search_end - : dpt_search_header RDO_End - { - LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->end(); - $$ = CONVERTER->stack().push(pDPTSearch); - } - | dpt_search_header - { - CONVERTER->error().error(@1, "Ожидается ключевое слово $End"); - } - ; + : dpt_search_header RDO_End + { + LPRDODPTSearch pDPTSearch = CONVERTER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->end(); + $$ = CONVERTER->stack().push(pDPTSearch); + } + | dpt_search_header + { + CONVERTER->error().error(@1, "Ожидается ключевое слово $End"); + } + ; // -------------------------------------------------------------------------------- // -------------------- DPTSome // -------------------------------------------------------------------------------- dpt_some_trace - : /* empty */ - { - $$ = 1; - } - | RDO_no_trace - { - $$ = 1; - } - | RDO_trace - { - $$ = 2; - } - | RDO_trace_stat - { - CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа some"); - } - | RDO_trace_tops - { - CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа some"); - } - | RDO_trace_all - { - CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа some"); - } - ; + : /* empty */ + { + $$ = 1; + } + | RDO_no_trace + { + $$ = 1; + } + | RDO_trace + { + $$ = 2; + } + | RDO_trace_stat + { + CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа some"); + } + | RDO_trace_tops + { + CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа some"); + } + | RDO_trace_all + { + CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа some"); + } + ; dpt_some_parent - : /* empty */ - { - $$ = CONVERTER->stack().push(rdo::Factory::create()); - } - | RDO_Parent RDO_IDENTIF - { - $$ = $2; - } - | RDO_Parent error - { - CONVERTER->error().error(@1, "Ошибка в имени родительской точки"); - } - ; + : /* empty */ + { + $$ = CONVERTER->stack().push(rdo::Factory::create()); + } + | RDO_Parent RDO_IDENTIF + { + $$ = $2; + } + | RDO_Parent error + { + CONVERTER->error().error(@1, "Ошибка в имени родительской точки"); + } + ; dpt_some_begin - : RDO_Decision_point RDO_IDENTIF_COLON RDO_some dpt_some_parent dpt_some_trace - { - /// @todo а где признак трассировки для some ? - LPRDOValue pName = CONVERTER->stack().pop($2); - LPRDOValue pParentName = CONVERTER->stack().pop($4); - ASSERT(pName) - - LPRDODPTSome pDPTSome; - if (pParentName->defined()) - { - LPRDODPTPrior pParentDPTPrior = CONVERTER->findDPTPrior (pParentName->value().getIdentificator()); - LPRDODPTSearch pParentDPTSearch = CONVERTER->findDPTSearch(pParentName->value().getIdentificator()); - LPRDODPTSome pParentDPTSome = CONVERTER->findDPTSome (pParentName->value().getIdentificator()); - if (!pParentDPTPrior && !pParentDPTSearch && !pParentDPTSome) - { - CONVERTER->error().error(@1, rdo::format("Не найдена родитеская точка %s", pParentName->value().getIdentificator().c_str())); - } - if (pParentDPTSearch) - { - CONVERTER->error().error(@5, @1, "Точка принятия решений типа search может содержать лишь активности типа rule и не может быть указана в качестве родительской точки"); - } - else if (pParentDPTPrior) - { - LPILogic pParentLogic = pParentDPTPrior->getLogic(); - ASSERT(pParentLogic); - pDPTSome = rdo::Factory::create(pName->src_info(), pParentLogic); - } - else if (pParentDPTSome) - { - LPILogic pParentLogic = pParentDPTSome->getLogic(); - ASSERT(pParentLogic); - pDPTSome = rdo::Factory::create(pName->src_info(), pParentLogic); - } - } - else - { - pDPTSome = rdo::Factory::create(pName->src_info()); - } - ASSERT(pDPTSome); - $$ = CONVERTER->stack().push(pDPTSome); - } - ; + : RDO_Decision_point RDO_IDENTIF_COLON RDO_some dpt_some_parent dpt_some_trace + { + // TODO а где признак трассировки для some ? + LPRDOValue pName = CONVERTER->stack().pop($2); + LPRDOValue pParentName = CONVERTER->stack().pop($4); + ASSERT(pName) + + LPRDODPTSome pDPTSome; + if (pParentName->defined()) + { + LPRDODPTPrior pParentDPTPrior = CONVERTER->findDPTPrior (pParentName->value().getIdentificator()); + LPRDODPTSearch pParentDPTSearch = CONVERTER->findDPTSearch(pParentName->value().getIdentificator()); + LPRDODPTSome pParentDPTSome = CONVERTER->findDPTSome (pParentName->value().getIdentificator()); + if (!pParentDPTPrior && !pParentDPTSearch && !pParentDPTSome) + { + CONVERTER->error().error(@1, rdo::format("Не найдена родитеская точка %s", pParentName->value().getIdentificator().c_str())); + } + if (pParentDPTSearch) + { + CONVERTER->error().error(@5, @1, "Точка принятия решений типа search может содержать лишь активности типа rule и не может быть указана в качестве родительской точки"); + } + else if (pParentDPTPrior) + { + LPILogic pParentLogic = pParentDPTPrior->getLogic(); + ASSERT(pParentLogic); + pDPTSome = rdo::Factory::create(pName->src_info(), pParentLogic); + } + else if (pParentDPTSome) + { + LPILogic pParentLogic = pParentDPTSome->getLogic(); + ASSERT(pParentLogic); + pDPTSome = rdo::Factory::create(pName->src_info(), pParentLogic); + } + } + else + { + pDPTSome = rdo::Factory::create(pName->src_info()); + } + ASSERT(pDPTSome); + $$ = CONVERTER->stack().push(pDPTSome); + } + ; dpt_some_condition - : dpt_some_begin RDO_Condition fun_logic - { - LPRDODPTSome pDPTSome = CONVERTER->stack().pop($1); - ASSERT(pDPTSome); - pDPTSome->setCondition(CONVERTER->stack().pop($3)); - $$ = CONVERTER->stack().push(pDPTSome); - } - | dpt_some_begin RDO_Condition RDO_NoCheck - { - LPRDODPTSome pDPTSome = CONVERTER->stack().pop($1); - ASSERT(pDPTSome); - pDPTSome->setCondition(); - $$ = CONVERTER->stack().push(pDPTSome); - } - | dpt_some_begin RDO_Condition error - { - CONVERTER->error().error(@2, @3, "После ключевого слова $Condition ожидается условие запуска точки"); - } - | dpt_some_begin - { - LPRDODPTSome pDPTSome = CONVERTER->stack().pop($1); - ASSERT(pDPTSome); - pDPTSome->setCondition(); - $$ = CONVERTER->stack().push(pDPTSome); - } - ; + : dpt_some_begin RDO_Condition fun_logic + { + LPRDODPTSome pDPTSome = CONVERTER->stack().pop($1); + ASSERT(pDPTSome); + pDPTSome->setCondition(CONVERTER->stack().pop($3)); + $$ = CONVERTER->stack().push(pDPTSome); + } + | dpt_some_begin RDO_Condition RDO_NoCheck + { + LPRDODPTSome pDPTSome = CONVERTER->stack().pop($1); + ASSERT(pDPTSome); + pDPTSome->setCondition(); + $$ = CONVERTER->stack().push(pDPTSome); + } + | dpt_some_begin RDO_Condition error + { + CONVERTER->error().error(@2, @3, "После ключевого слова $Condition ожидается условие запуска точки"); + } + | dpt_some_begin + { + LPRDODPTSome pDPTSome = CONVERTER->stack().pop($1); + ASSERT(pDPTSome); + pDPTSome->setCondition(); + $$ = CONVERTER->stack().push(pDPTSome); + } + ; dpt_some_prior - : dpt_some_condition - | dpt_some_condition RDO_Priority fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pArithm); - if (!CONVERTER->getLastDPTSome()->setPrior(pArithm)) - { - CONVERTER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); - } - } - | dpt_some_condition RDO_Priority error - { - CONVERTER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); - } - | dpt_some_condition error - { - CONVERTER->error().error(@1, @2, "Ожидается ключевое слово $Priority"); - } - ; + : dpt_some_condition + | dpt_some_condition RDO_Priority fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pArithm); + if (!CONVERTER->getLastDPTSome()->setPrior(pArithm)) + { + CONVERTER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); + } + } + | dpt_some_condition RDO_Priority error + { + CONVERTER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); + } + | dpt_some_condition error + { + CONVERTER->error().error(@1, @2, "Ожидается ключевое слово $Priority"); + } + ; dpt_some_name - : RDO_IDENTIF_COLON RDO_IDENTIF - { - LPRDODPTSome pDPTSome = CONVERTER->getLastDPTSome(); - ASSERT(pDPTSome); - LPRDOValue pName = CONVERTER->stack().pop($1); - LPRDOValue pPattern = CONVERTER->stack().pop($2); - LPRDODPTActivity pActivity = pDPTSome->addNewActivity(pName->src_info(), pPattern->src_info()); - ASSERT(pActivity); - $$ = CONVERTER->stack().push(pActivity); - } - | RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@1, @2, "Ожидается имя образца"); - } - | RDO_IDENTIF - { - CONVERTER->error().error(@1, "Ожидается ':'"); - } - | error - { - CONVERTER->error().error(@1, "Ожидается имя активности"); - } - ; + : RDO_IDENTIF_COLON RDO_IDENTIF + { + LPRDODPTSome pDPTSome = CONVERTER->getLastDPTSome(); + ASSERT(pDPTSome); + LPRDOValue pName = CONVERTER->stack().pop($1); + LPRDOValue pPattern = CONVERTER->stack().pop($2); + LPRDODPTActivity pActivity = pDPTSome->addNewActivity(pName->src_info(), pPattern->src_info()); + ASSERT(pActivity); + $$ = CONVERTER->stack().push(pActivity); + } + | RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@1, @2, "Ожидается имя образца"); + } + | RDO_IDENTIF + { + CONVERTER->error().error(@1, "Ожидается ':'"); + } + | error + { + CONVERTER->error().error(@1, "Ожидается имя активности"); + } + ; dpt_some_descr_keyb - : /* empty */ - | dpt_some_descr_keyb '+' RDO_STRING_CONST - { - LPRDODPTActivityHotKey pActivityHotKey = CONVERTER->getLastDPTSome()->getLastActivity(); - ASSERT(pActivityHotKey); - const std::string key = CONVERTER->stack().pop($3)->value().getString(); - pActivityHotKey->addHotKey(key, @3); - } - | RDO_STRING_CONST - { - LPRDODPTActivityHotKey pActivityHotKey = CONVERTER->getLastDPTSome()->getLastActivity(); - ASSERT(pActivityHotKey); - const std::string key = CONVERTER->stack().pop($1)->value().getString(); - pActivityHotKey->addHotKey(key, @1); - } - ; + : dpt_some_descr_keyb '+' RDO_STRING_CONST + { + LPRDODPTActivityHotKey pActivityHotKey = CONVERTER->getLastDPTSome()->getLastActivity(); + ASSERT(pActivityHotKey); + const std::string key = CONVERTER->stack().pop($3)->value().getString(); + pActivityHotKey->addHotKey(key, @3); + } + | RDO_STRING_CONST + { + LPRDODPTActivityHotKey pActivityHotKey = CONVERTER->getLastDPTSome()->getLastActivity(); + ASSERT(pActivityHotKey); + const std::string key = CONVERTER->stack().pop($1)->value().getString(); + pActivityHotKey->addHotKey(key, @1); + } + ; dpt_some_descr_param - : /* empty */ - | dpt_some_descr_param '*' - { - CONVERTER->getLastDPTSome()->getLastActivity()->addParam( - rdo::Factory::create(RDOParserSrcInfo(@2, "*")) - ); - } - | dpt_some_descr_param fun_arithm - { - CONVERTER->getLastDPTSome()->getLastActivity()->addParam(CONVERTER->stack().pop($2)->value()); - } - | dpt_some_descr_param error - { - CONVERTER->error().error(@1, @2, "Ошибка описания параметра образца"); - } - ; + : '*' + { + CONVERTER->getLastDPTSome()->getLastActivity()->addParam( + rdo::Factory::create(RDOParserSrcInfo(@1, "*")) + ); + } + | fun_arithm + { + CONVERTER->getLastDPTSome()->getLastActivity()->addParam(CONVERTER->stack().pop($1)->value()); + } + | dpt_some_descr_param '*' + { + CONVERTER->getLastDPTSome()->getLastActivity()->addParam( + rdo::Factory::create(RDOParserSrcInfo(@2, "*")) + ); + + LPDocUpdate pCommaInsert = rdo::Factory::create( + @1.m_last_seek, + "," + ); + ASSERT(pCommaInsert); + CONVERTER->insertDocUpdate(pCommaInsert); + } + | dpt_some_descr_param fun_arithm + { + CONVERTER->getLastDPTSome()->getLastActivity()->addParam(CONVERTER->stack().pop($2)->value()); + + LPDocUpdate pCommaInsert = rdo::Factory::create( + @1.m_last_seek, + "," + ); + ASSERT(pCommaInsert); + CONVERTER->insertDocUpdate(pCommaInsert); + } + | dpt_some_descr_param error + { + CONVERTER->error().error(@1, @2, "Ошибка описания параметра образца"); + } + ; dpt_some_activity - : /* empty */ - { - $$ = CONVERTER->stack().push(LPRDODPTActivity()); - } - | dpt_some_activity dpt_some_name dpt_some_descr_keyb dpt_some_descr_param - { - LPRDODPTActivity pActivity = CONVERTER->stack().pop($2); - ASSERT(pActivity); - pActivity->endParam(@3); - $$ = CONVERTER->stack().push(pActivity); - } - ; + : /* empty */ + { + $$ = CONVERTER->stack().push(LPRDODPTActivity()); + } + | dpt_some_activity dpt_some_name + { + LPRDODPTActivity pActivity = CONVERTER->stack().pop($2); + ASSERT(pActivity); + pActivity->endParam(@2); + $$ = CONVERTER->stack().push(pActivity); + + LPDocUpdate pSemicolonInsert = rdo::Factory::create( + @2.m_last_seek, + ";" + ); + ASSERT(pSemicolonInsert); + CONVERTER->insertDocUpdate(pSemicolonInsert); + } + | dpt_some_activity dpt_some_name dpt_some_descr_keyb + { + LPRDODPTActivity pActivity = CONVERTER->stack().pop($2); + ASSERT(pActivity); + pActivity->endParam(@3); + $$ = CONVERTER->stack().push(pActivity); + + LPDocUpdate pLeftBracketInsert = rdo::Factory::create( + @3.m_first_seek, + "(" + ); + ASSERT(pLeftBracketInsert); + CONVERTER->insertDocUpdate(pLeftBracketInsert); + + LPDocUpdate pRightBracketAndSemicolonInsert = rdo::Factory::create( + @3.m_last_seek, + ");" + ); + ASSERT(pRightBracketAndSemicolonInsert); + CONVERTER->insertDocUpdate(pRightBracketAndSemicolonInsert); + } + | dpt_some_activity dpt_some_name dpt_some_descr_param + { + LPRDODPTActivity pActivity = CONVERTER->stack().pop($2); + ASSERT(pActivity); + pActivity->endParam(@3); + $$ = CONVERTER->stack().push(pActivity); + + LPDocUpdate pLeftBracketInsert = rdo::Factory::create( + @3.m_first_seek, + "(" + ); + ASSERT(pLeftBracketInsert); + CONVERTER->insertDocUpdate(pLeftBracketInsert); + + LPDocUpdate pRightBracketAndSemicolonInsert = rdo::Factory::create( + @3.m_last_seek, + ");" + ); + ASSERT(pRightBracketAndSemicolonInsert); + CONVERTER->insertDocUpdate(pRightBracketAndSemicolonInsert); + } + | dpt_some_activity dpt_some_name dpt_some_descr_keyb dpt_some_descr_param + { + LPRDODPTActivity pActivity = CONVERTER->stack().pop($2); + ASSERT(pActivity); + pActivity->endParam(@3); + $$ = CONVERTER->stack().push(pActivity); + + LPDocUpdate pLeftBracketInsert = rdo::Factory::create( + @3.m_first_seek, + "(" + ); + ASSERT(pLeftBracketInsert); + CONVERTER->insertDocUpdate(pLeftBracketInsert); + + LPDocUpdate pCommaInsert = rdo::Factory::create( + @3.m_last_seek, + "," + ); + ASSERT(pCommaInsert); + CONVERTER->insertDocUpdate(pCommaInsert); + + LPDocUpdate pRightBracketAndSemicolonInsert = rdo::Factory::create( + @4.m_last_seek, + ");" + ); + ASSERT(pRightBracketAndSemicolonInsert); + CONVERTER->insertDocUpdate(pRightBracketAndSemicolonInsert); + } + ; dpt_some_header - : dpt_some_prior RDO_Activities dpt_some_activity - | dpt_some_prior error - { - CONVERTER->error().error(@1, @2, "Ожидается ключевое слово $Activities"); - } - ; + : dpt_some_prior RDO_Activities dpt_some_activity + | dpt_some_prior error + { + CONVERTER->error().error(@1, @2, "Ожидается ключевое слово $Activities"); + } + ; dpt_some_end - : dpt_some_header RDO_End - { - LPRDODPTSome pDPTSome = CONVERTER->stack().pop($1); - ASSERT(pDPTSome); - pDPTSome->end(); - $$ = CONVERTER->stack().push(pDPTSome); - } - | dpt_some_header - { - CONVERTER->error().error(@1, "Ожидается ключевое слово $End"); - } - ; + : dpt_some_header RDO_End + { + LPRDODPTSome pDPTSome = CONVERTER->stack().pop($1); + ASSERT(pDPTSome); + pDPTSome->end(); + $$ = CONVERTER->stack().push(pDPTSome); + } + | dpt_some_header + { + CONVERTER->error().error(@1, "Ожидается ключевое слово $End"); + } + ; // -------------------------------------------------------------------------------- // -------------------- DPT Prior // -------------------------------------------------------------------------------- dpt_prior_trace - : /* empty */ - { - $$ = 1; - } - | RDO_no_trace - { - $$ = 1; - } - | RDO_trace - { - $$ = 2; - } - | RDO_trace_stat - { - CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа prior"); - } - | RDO_trace_tops - { - CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа prior"); - } - | RDO_trace_all - { - CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа prior"); - } - ; + : /* empty */ + { + $$ = 1; + } + | RDO_no_trace + { + $$ = 1; + } + | RDO_trace + { + $$ = 2; + } + | RDO_trace_stat + { + CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа prior"); + } + | RDO_trace_tops + { + CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа prior"); + } + | RDO_trace_all + { + CONVERTER->error().error(@1, "Данный признак трассировки не используется в точке типа prior"); + } + ; dpt_prior_parent - : /* empty */ - { - $$ = CONVERTER->stack().push(rdo::Factory::create()); - } - | RDO_Parent RDO_IDENTIF - { - $$ = $2; - } - | RDO_Parent error - { - CONVERTER->error().error(@1, "Ошибка в имени родительской точки"); - } - ; + : /* empty */ + { + $$ = CONVERTER->stack().push(rdo::Factory::create()); + } + | RDO_Parent RDO_IDENTIF + { + $$ = $2; + } + | RDO_Parent error + { + CONVERTER->error().error(@1, "Ошибка в имени родительской точки"); + } + ; dpt_prior_begin - : RDO_Decision_point RDO_IDENTIF_COLON RDO_prior dpt_prior_parent dpt_prior_trace - { - /// @todo а где признак трассировки для prior ? - LPRDOValue pName = CONVERTER->stack().pop($2); - LPRDOValue pParentName = CONVERTER->stack().pop($4); - ASSERT(pName); - - LPRDODPTPrior pDPTPrior; - if (pParentName->defined()) - { - LPRDODPTPrior pParentDPTPrior = CONVERTER->findDPTPrior (pParentName->value().getIdentificator()); - LPRDODPTSearch pParentDPTSearch = CONVERTER->findDPTSearch(pParentName->value().getIdentificator()); - LPRDODPTSome pParentDPTSome = CONVERTER->findDPTSome (pParentName->value().getIdentificator()); - if (!pParentDPTPrior && !pParentDPTSome && !pParentDPTSearch) - { - CONVERTER->error().error(@1, rdo::format("Не найдена родитеская точка %s", pParentName->value().getIdentificator().c_str())); - } - if (pParentDPTSearch) - { - CONVERTER->error().error(@5, @1, "Точка принятия решений типа search может содержать лишь активности типа rule и не может быть указана в качестве родительской точки"); - } - else if (pParentDPTPrior) - { - LPILogic pParentLogic = pParentDPTPrior->getLogic(); - ASSERT(pParentLogic); - pDPTPrior = rdo::Factory::create(pName->src_info(), pParentLogic); - } - else if (pParentDPTSome) - { - LPILogic pParentLogic = pParentDPTSome->getLogic(); - ASSERT(pParentLogic); - pDPTPrior = rdo::Factory::create(pName->src_info(), pParentLogic); - } - } - else - { - pDPTPrior = rdo::Factory::create(pName->src_info()); - } - ASSERT(pDPTPrior); - $$ = CONVERTER->stack().push(pDPTPrior); - } - ; + : RDO_Decision_point RDO_IDENTIF_COLON RDO_prior dpt_prior_parent dpt_prior_trace + { + // TODO а где признак трассировки для prior ? + LPRDOValue pName = CONVERTER->stack().pop($2); + LPRDOValue pParentName = CONVERTER->stack().pop($4); + ASSERT(pName); + + LPRDODPTPrior pDPTPrior; + if (pParentName->defined()) + { + LPRDODPTPrior pParentDPTPrior = CONVERTER->findDPTPrior (pParentName->value().getIdentificator()); + LPRDODPTSearch pParentDPTSearch = CONVERTER->findDPTSearch(pParentName->value().getIdentificator()); + LPRDODPTSome pParentDPTSome = CONVERTER->findDPTSome (pParentName->value().getIdentificator()); + if (!pParentDPTPrior && !pParentDPTSome && !pParentDPTSearch) + { + CONVERTER->error().error(@1, rdo::format("Не найдена родитеская точка %s", pParentName->value().getIdentificator().c_str())); + } + if (pParentDPTSearch) + { + CONVERTER->error().error(@5, @1, "Точка принятия решений типа search может содержать лишь активности типа rule и не может быть указана в качестве родительской точки"); + } + else if (pParentDPTPrior) + { + LPILogic pParentLogic = pParentDPTPrior->getLogic(); + ASSERT(pParentLogic); + pDPTPrior = rdo::Factory::create(pName->src_info(), pParentLogic); + } + else if (pParentDPTSome) + { + LPILogic pParentLogic = pParentDPTSome->getLogic(); + ASSERT(pParentLogic); + pDPTPrior = rdo::Factory::create(pName->src_info(), pParentLogic); + } + } + else + { + pDPTPrior = rdo::Factory::create(pName->src_info()); + } + ASSERT(pDPTPrior); + $$ = CONVERTER->stack().push(pDPTPrior); + } + ; dpt_prior_condition - : dpt_prior_begin RDO_Condition fun_logic - { - LPRDODPTPrior pDPTPrior = CONVERTER->stack().pop($1); - ASSERT(pDPTPrior); - pDPTPrior->setCondition(CONVERTER->stack().pop($3)); - $$ = CONVERTER->stack().push(pDPTPrior); - } - | dpt_prior_begin RDO_Condition RDO_NoCheck - { - LPRDODPTPrior pDPTPrior = CONVERTER->stack().pop($1); - ASSERT(pDPTPrior); - pDPTPrior->setCondition(); - $$ = CONVERTER->stack().push(pDPTPrior); - } - | dpt_prior_begin RDO_Condition error - { - CONVERTER->error().error(@2, @3, "После ключевого слова $Condition ожидается условие запуска точки"); - } - | dpt_prior_begin - { - LPRDODPTPrior pDPTPrior = CONVERTER->stack().pop($1); - ASSERT(pDPTPrior); - pDPTPrior->setCondition(); - $$ = CONVERTER->stack().push(pDPTPrior); - } - ; + : dpt_prior_begin RDO_Condition fun_logic + { + LPRDODPTPrior pDPTPrior = CONVERTER->stack().pop($1); + ASSERT(pDPTPrior); + pDPTPrior->setCondition(CONVERTER->stack().pop($3)); + $$ = CONVERTER->stack().push(pDPTPrior); + } + | dpt_prior_begin RDO_Condition RDO_NoCheck + { + LPRDODPTPrior pDPTPrior = CONVERTER->stack().pop($1); + ASSERT(pDPTPrior); + pDPTPrior->setCondition(); + $$ = CONVERTER->stack().push(pDPTPrior); + } + | dpt_prior_begin RDO_Condition error + { + CONVERTER->error().error(@2, @3, "После ключевого слова $Condition ожидается условие запуска точки"); + } + | dpt_prior_begin + { + LPRDODPTPrior pDPTPrior = CONVERTER->stack().pop($1); + ASSERT(pDPTPrior); + pDPTPrior->setCondition(); + $$ = CONVERTER->stack().push(pDPTPrior); + } + ; dpt_prior_prior - : dpt_prior_condition - | dpt_prior_condition RDO_Priority fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pArithm); - if (!CONVERTER->getLastDPTPrior()->setPrior(pArithm)) - { - CONVERTER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); - } - } - | dpt_prior_condition RDO_Priority error - { - CONVERTER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); - } - | dpt_some_condition error - { - CONVERTER->error().error(@1, @2, "Ожидается ключевое слово $Priority"); - } - ; + : dpt_prior_condition + | dpt_prior_condition RDO_Priority fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pArithm); + if (!CONVERTER->getLastDPTPrior()->setPrior(pArithm)) + { + CONVERTER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); + } + } + | dpt_prior_condition RDO_Priority error + { + CONVERTER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); + } + | dpt_some_condition error + { + CONVERTER->error().error(@1, @2, "Ожидается ключевое слово $Priority"); + } + ; dpt_prior_name - : RDO_IDENTIF_COLON RDO_IDENTIF - { - LPRDODPTPrior pDPTPrior = CONVERTER->getLastDPTPrior(); - ASSERT(pDPTPrior); - LPRDOValue pName = CONVERTER->stack().pop($1); - LPRDOValue pPattern = CONVERTER->stack().pop($2); - LPRDODPTActivity pActivity = pDPTPrior->addNewActivity(pName->src_info(), pPattern->src_info()); - ASSERT(pActivity); - $$ = CONVERTER->stack().push(pActivity); - } - | RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@1, @2, "Ожидается имя образца"); - } - | RDO_IDENTIF - { - CONVERTER->error().error(@1, "Ожидается ':'"); - } - | error - { - CONVERTER->error().error(@1, "Ожидается имя активности"); - } - ; + : RDO_IDENTIF_COLON RDO_IDENTIF + { + LPRDODPTPrior pDPTPrior = CONVERTER->getLastDPTPrior(); + ASSERT(pDPTPrior); + LPRDOValue pName = CONVERTER->stack().pop($1); + LPRDOValue pPattern = CONVERTER->stack().pop($2); + LPRDODPTActivity pActivity = pDPTPrior->addNewActivity(pName->src_info(), pPattern->src_info()); + ASSERT(pActivity); + $$ = CONVERTER->stack().push(pActivity); + } + | RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@1, @2, "Ожидается имя образца"); + } + | RDO_IDENTIF + { + CONVERTER->error().error(@1, "Ожидается ':'"); + } + | error + { + CONVERTER->error().error(@1, "Ожидается имя активности"); + } + ; dpt_prior_descr_keyb - : /* empty */ - | dpt_prior_descr_keyb '+' RDO_STRING_CONST - { - LPRDODPTActivityHotKey pActivityHotKey = CONVERTER->getLastDPTPrior()->getLastActivity(); - ASSERT(pActivityHotKey); - const std::string key = CONVERTER->stack().pop($3)->value().getString(); - pActivityHotKey->addHotKey(key, @3); - } - | RDO_STRING_CONST - { - LPRDODPTActivityHotKey pActivityHotKey = CONVERTER->getLastDPTPrior()->getLastActivity(); - ASSERT(pActivityHotKey); - const std::string key = CONVERTER->stack().pop($1)->value().getString(); - pActivityHotKey->addHotKey(key, @1); - } - ; + : dpt_prior_descr_keyb '+' RDO_STRING_CONST + { + LPRDODPTActivityHotKey pActivityHotKey = CONVERTER->getLastDPTPrior()->getLastActivity(); + ASSERT(pActivityHotKey); + const std::string key = CONVERTER->stack().pop($3)->value().getString(); + pActivityHotKey->addHotKey(key, @3); + } + | RDO_STRING_CONST + { + LPRDODPTActivityHotKey pActivityHotKey = CONVERTER->getLastDPTPrior()->getLastActivity(); + ASSERT(pActivityHotKey); + const std::string key = CONVERTER->stack().pop($1)->value().getString(); + pActivityHotKey->addHotKey(key, @1); + } + ; dpt_prior_descr_param - : /* empty */ - | dpt_prior_descr_param '*' - { - CONVERTER->getLastDPTPrior()->getLastActivity()->addParam( - rdo::Factory::create(RDOParserSrcInfo(@2, "*")) - ); - } - | dpt_prior_descr_param fun_arithm - { - CONVERTER->getLastDPTPrior()->getLastActivity()->addParam(CONVERTER->stack().pop($2)->value()); - } - | dpt_prior_descr_param error - { - CONVERTER->error().error(@1, @2, "Ошибка описания параметра образца"); - } - ; + : '*' + { + CONVERTER->getLastDPTPrior()->getLastActivity()->addParam( + rdo::Factory::create(RDOParserSrcInfo(@1, "*")) + ); + } + | fun_arithm + { + CONVERTER->getLastDPTPrior()->getLastActivity()->addParam(CONVERTER->stack().pop($1)->value()); + } + | dpt_prior_descr_param '*' + { + CONVERTER->getLastDPTPrior()->getLastActivity()->addParam( + rdo::Factory::create(RDOParserSrcInfo(@2, "*")) + ); + + LPDocUpdate pCommaInsert = rdo::Factory::create( + @1.m_last_seek, + "," + ); + ASSERT(pCommaInsert); + CONVERTER->insertDocUpdate(pCommaInsert); + } + | dpt_prior_descr_param fun_arithm + { + CONVERTER->getLastDPTPrior()->getLastActivity()->addParam(CONVERTER->stack().pop($2)->value()); + + LPDocUpdate pCommaInsert = rdo::Factory::create( + @1.m_last_seek, + "," + ); + ASSERT(pCommaInsert); + CONVERTER->insertDocUpdate(pCommaInsert); + } + | dpt_prior_descr_param error + { + CONVERTER->error().error(@1, @2, "Ошибка описания параметра образца"); + } + ; dpt_prior_activ_prior - : /* empty */ - | RDO_CF '=' fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pArithm); - if (!CONVERTER->getLastDPTPrior()->getLastActivity()->setPrior(pArithm)) - { - CONVERTER->error().error(@3, "Активность не может иметь приоритет"); - } - } - | RDO_CF '=' error - { - CONVERTER->error().error(@1, @2, "Ошибка описания приоритета активности"); - } - | RDO_CF error - { - CONVERTER->error().error(@1, @2, "Ошибка: ожидается знак равенства"); - } - ; + : /* empty */ + | RDO_CF '=' fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pArithm); + if (!CONVERTER->getLastDPTPrior()->getLastActivity()->setPrior(pArithm)) + { + CONVERTER->error().error(@3, "Активность не может иметь приоритет"); + } + } + | RDO_CF '=' error + { + CONVERTER->error().error(@1, @2, "Ошибка описания приоритета активности"); + } + | RDO_CF error + { + CONVERTER->error().error(@1, @2, "Ошибка: ожидается знак равенства"); + } + ; dpt_prior_activity - : /* empty */ - { - $$ = CONVERTER->stack().push(LPRDODPTActivity()); - } - | dpt_prior_activity dpt_prior_name dpt_prior_descr_keyb dpt_prior_descr_param dpt_prior_activ_prior - { - LPRDODPTActivity pActivity = CONVERTER->stack().pop($2); - ASSERT(pActivity); - pActivity->endParam(@3); - $$ = CONVERTER->stack().push(pActivity); - } - ; + : /* empty */ + { + $$ = CONVERTER->stack().push(LPRDODPTActivity()); + } + | dpt_prior_activity dpt_prior_name dpt_prior_activ_prior + { + LPRDODPTActivity pActivity = CONVERTER->stack().pop($2); + ASSERT(pActivity); + pActivity->endParam(@2); + $$ = CONVERTER->stack().push(pActivity); + + LPDocUpdate pSemicolonInsert = rdo::Factory::create( + @3.m_last_seek, + ";" + ); + ASSERT(pSemicolonInsert); + CONVERTER->insertDocUpdate(pSemicolonInsert); + } + | dpt_prior_activity dpt_prior_name dpt_prior_descr_keyb dpt_prior_activ_prior + { + LPRDODPTActivity pActivity = CONVERTER->stack().pop($2); + ASSERT(pActivity); + pActivity->endParam(@3); + $$ = CONVERTER->stack().push(pActivity); + + LPDocUpdate pLeftBracketInsert = rdo::Factory::create( + @3.m_first_seek, + "(" + ); + ASSERT(pLeftBracketInsert); + CONVERTER->insertDocUpdate(pLeftBracketInsert); + + LPDocUpdate pRightBracketInsert = rdo::Factory::create( + @3.m_last_seek, + ")" + ); + ASSERT(pRightBracketInsert); + CONVERTER->insertDocUpdate(pRightBracketInsert); + + LPDocUpdate pSemicolonInsert = rdo::Factory::create( + @4.m_last_seek, + ";" + ); + ASSERT(pSemicolonInsert); + CONVERTER->insertDocUpdate(pSemicolonInsert); + } + | dpt_prior_activity dpt_prior_name dpt_prior_descr_param dpt_prior_activ_prior + { + LPRDODPTActivity pActivity = CONVERTER->stack().pop($2); + ASSERT(pActivity); + pActivity->endParam(@3); + $$ = CONVERTER->stack().push(pActivity); + + LPDocUpdate pLeftBracketInsert = rdo::Factory::create( + @3.m_first_seek, + "(" + ); + ASSERT(pLeftBracketInsert); + CONVERTER->insertDocUpdate(pLeftBracketInsert); + + LPDocUpdate pRightBracketInsert = rdo::Factory::create( + @3.m_last_seek, + ")" + ); + ASSERT(pRightBracketInsert); + CONVERTER->insertDocUpdate(pRightBracketInsert); + + LPDocUpdate pSemicolonInsert = rdo::Factory::create( + @4.m_last_seek, + ";" + ); + ASSERT(pSemicolonInsert); + CONVERTER->insertDocUpdate(pSemicolonInsert); + } + | dpt_prior_activity dpt_prior_name dpt_prior_descr_keyb dpt_prior_descr_param dpt_prior_activ_prior + { + LPRDODPTActivity pActivity = CONVERTER->stack().pop($2); + ASSERT(pActivity); + pActivity->endParam(@3); + $$ = CONVERTER->stack().push(pActivity); + + LPDocUpdate pLeftBracketInsert = rdo::Factory::create( + @3.m_first_seek, + "(" + ); + ASSERT(pLeftBracketInsert); + CONVERTER->insertDocUpdate(pLeftBracketInsert); + + LPDocUpdate pCommaInsert = rdo::Factory::create( + @3.m_last_seek, + "," + ); + ASSERT(pCommaInsert); + CONVERTER->insertDocUpdate(pCommaInsert); + + LPDocUpdate pRightBracketInsert = rdo::Factory::create( + @4.m_last_seek, + ")" + ); + ASSERT(pRightBracketInsert); + CONVERTER->insertDocUpdate(pRightBracketInsert); + + LPDocUpdate pSemicolonInsert = rdo::Factory::create( + @5.m_last_seek, + ";" + ); + ASSERT(pSemicolonInsert); + CONVERTER->insertDocUpdate(pSemicolonInsert); + } + ; dpt_prior_header - : dpt_prior_prior RDO_Activities dpt_prior_activity - | dpt_prior_prior error - { - CONVERTER->error().error(@1, @2, "Ожидается ключевое слово $Activities"); - } - ; + : dpt_prior_prior RDO_Activities dpt_prior_activity + | dpt_prior_prior error + { + CONVERTER->error().error(@1, @2, "Ожидается ключевое слово $Activities"); + } + ; dpt_prior_end - : dpt_prior_header RDO_End - { - LPRDODPTPrior pDPTPrior = CONVERTER->stack().pop($1); - ASSERT(pDPTPrior); - pDPTPrior->end(); - $$ = CONVERTER->stack().push(pDPTPrior); - } - | dpt_prior_header - { - CONVERTER->error().error(@1, "Ожидается ключевое слово $End"); - } - ; + : dpt_prior_header RDO_End + { + LPRDODPTPrior pDPTPrior = CONVERTER->stack().pop($1); + ASSERT(pDPTPrior); + pDPTPrior->end(); + $$ = CONVERTER->stack().push(pDPTPrior); + } + | dpt_prior_header + { + CONVERTER->error().error(@1, "Ожидается ключевое слово $End"); + } + ; // -------------------------------------------------------------------------------- // -------------------- DPT Free // -------------------------------------------------------------------------------- dpt_free_prior - : dpt_free_header - | RDO_Priority fun_arithm dpt_free_header - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - if (!CONVERTER->getLastDPTFree()->setPrior(pArithm)) - { - CONVERTER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); - } - } - | RDO_Priority error dpt_free_header - { - CONVERTER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); - } - | error dpt_free_header - { - CONVERTER->error().error(@1, @2, "Ожидается ключевое слово $Priority"); - } - ; + : dpt_free_header + | RDO_Priority fun_arithm dpt_free_header + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + if (!CONVERTER->getLastDPTFree()->setPrior(pArithm)) + { + CONVERTER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); + } + } + | RDO_Priority error dpt_free_header + { + CONVERTER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); + } + | error dpt_free_header + { + CONVERTER->error().error(@1, @2, "Ожидается ключевое слово $Priority"); + } + ; dpt_free_header - : RDO_Activities - { - LPRDODPTFree pDPTFree = rdo::Factory::create(@1); - ASSERT(pDPTFree); - $$ = CONVERTER->stack().push(pDPTFree); - } - ; + : RDO_Activities + { + LPRDODPTFree pDPTFree = rdo::Factory::create(@1); + ASSERT(pDPTFree); + $$ = CONVERTER->stack().push(pDPTFree); + } + ; dpt_free_activity - : /* empty */ - | dpt_free_activity dpt_free_activity_name dpt_free_activity_param dpt_free_activity_keys - ; + : /* empty */ + | dpt_free_activity dpt_free_activity_name dpt_free_activity_param dpt_free_activity_keys + ; dpt_free_activity_name - : RDO_IDENTIF_COLON RDO_IDENTIF - { - LPRDODPTFree pDPTFree = CONVERTER->getLastDPTFree(); - ASSERT(pDPTFree); - LPRDOValue pName = CONVERTER->stack().pop($1); - LPRDOValue pPattern = CONVERTER->stack().pop($2); - LPRDODPTActivity pActivity = pDPTFree->addNewActivity(pName->src_info(), pPattern->src_info()); - ASSERT(pActivity); - $$ = CONVERTER->stack().push(pActivity); - } - | RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@1, @2, "Ожидается имя образца"); - } - | RDO_IDENTIF - { - CONVERTER->error().error(@1, "Ожидается ':'"); - } - | error - { - CONVERTER->error().error(@1, "Ожидается имя активности"); - } - ; + : RDO_IDENTIF_COLON RDO_IDENTIF + { + LPRDODPTFree pDPTFree = CONVERTER->getLastDPTFree(); + ASSERT(pDPTFree); + LPRDOValue pName = CONVERTER->stack().pop($1); + LPRDOValue pPattern = CONVERTER->stack().pop($2); + LPRDODPTActivity pActivity = pDPTFree->addNewActivity(pName->src_info(), pPattern->src_info()); + ASSERT(pActivity); + $$ = CONVERTER->stack().push(pActivity); + } + | RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@1, @2, "Ожидается имя образца"); + } + | RDO_IDENTIF + { + CONVERTER->error().error(@1, "Ожидается ':'"); + } + | error + { + CONVERTER->error().error(@1, "Ожидается имя активности"); + } + ; dpt_free_activity_param - : /* empty */ - | dpt_free_activity_param '*' - { - CONVERTER->getLastDPTFree()->getLastActivity()->addParam( - rdo::Factory::create(RDOParserSrcInfo(@2, "*")) - ); - } - | dpt_free_activity_param fun_arithm - { - CONVERTER->getLastDPTFree()->getLastActivity()->addParam(CONVERTER->stack().pop($2)->value()); - } - | dpt_free_activity_param error - { - CONVERTER->error().error(@1, @2, "Ошибка описания параметра образца"); - } - ; + : /* empty */ + | dpt_free_activity_param '*' + { + CONVERTER->getLastDPTFree()->getLastActivity()->addParam( + rdo::Factory::create(RDOParserSrcInfo(@2, "*")) + ); + } + | dpt_free_activity_param fun_arithm + { + CONVERTER->getLastDPTFree()->getLastActivity()->addParam(CONVERTER->stack().pop($2)->value()); + } + | dpt_free_activity_param error + { + CONVERTER->error().error(@1, @2, "Ошибка описания параметра образца"); + } + ; dpt_free_activity_keys - : /* empty */ - | dpt_free_activity_keys RDO_STRING_CONST - { - LPRDODPTActivityHotKey pActivityHotKey = CONVERTER->getLastDPTFree()->getLastActivity(); - ASSERT(pActivityHotKey); - const std::string key = CONVERTER->stack().pop($2)->value().getString(); - pActivityHotKey->addHotKey(key, @2); - } - | dpt_free_activity_keys '+' RDO_STRING_CONST - { - LPRDODPTActivityHotKey pActivityHotKey = CONVERTER->getLastDPTFree()->getLastActivity(); - ASSERT(pActivityHotKey); - const std::string key = CONVERTER->stack().pop($3)->value().getString(); - pActivityHotKey->addHotKey(key, @3); - } - ; + : /* empty */ + | dpt_free_activity_keys RDO_STRING_CONST + { + LPRDODPTActivityHotKey pActivityHotKey = CONVERTER->getLastDPTFree()->getLastActivity(); + ASSERT(pActivityHotKey); + const std::string key = CONVERTER->stack().pop($2)->value().getString(); + pActivityHotKey->addHotKey(key, @2); + } + | dpt_free_activity_keys '+' RDO_STRING_CONST + { + LPRDODPTActivityHotKey pActivityHotKey = CONVERTER->getLastDPTFree()->getLastActivity(); + ASSERT(pActivityHotKey); + const std::string key = CONVERTER->stack().pop($3)->value().getString(); + pActivityHotKey->addHotKey(key, @3); + } + ; dpt_free_end - : dpt_free_prior dpt_free_activity RDO_End - | dpt_free_header error - { - CONVERTER->error().error(@1, "Ожидается ключевое слово $End"); - } - ; + : dpt_free_prior dpt_free_activity RDO_End + | dpt_free_header error + { + CONVERTER->error().error(@1, "Ожидается ключевое слово $End"); + } + ; // -------------------------------------------------------------------------------- // -------------------- заглушка для $Process // -------------------------------------------------------------------------------- dpt_process_end - : RDO_Process error RDO_End - ; + : RDO_Process error RDO_End + ; // -------------------------------------------------------------------------------- // -------------------- Общие составные токены для всех объектов РДО @@ -1178,488 +1444,488 @@ dpt_process_end // -------------------- Логические выражения // -------------------------------------------------------------------------------- fun_logic_eq - : '=' - { - LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); - ASSERT(pInsert); - CONVERTER->insertDocUpdate(pInsert); - - $$ = RDO_eq; - } - | RDO_eq - { - $$ = RDO_eq; - } - ; + : '=' + { + LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); + ASSERT(pInsert); + CONVERTER->insertDocUpdate(pInsert); + + $$ = RDO_eq; + } + | RDO_eq + { + $$ = RDO_eq; + } + ; fun_logic - : fun_arithm fun_logic_eq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_neq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '<' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '>' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_leq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_geq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_and fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_or fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pArithm); - LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_group - | fun_select_logic - | '[' fun_logic ']' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("[" + pLogic->src_text() + "]"); - $$ = CONVERTER->stack().push(pLogic); - } - | '(' fun_logic ')' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("(" + pLogic->src_text() + ")"); - $$ = CONVERTER->stack().push(pLogic); - } - | RDO_not fun_logic - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - LPRDOFUNLogic pLogicNot = pLogic->operator_not(); - ASSERT(pLogicNot); - pLogicNot->setSrcPos (@1, @2); - pLogicNot->setSrcText("not " + pLogic->src_text()); - $$ = CONVERTER->stack().push(pLogicNot); - } - | '[' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | '(' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - ; + : fun_arithm fun_logic_eq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_neq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '<' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '>' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_leq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_geq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_and fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_or fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pArithm); + LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_group + | fun_select_logic + | '[' fun_logic ']' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("[" + pLogic->src_text() + "]"); + $$ = CONVERTER->stack().push(pLogic); + } + | '(' fun_logic ')' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("(" + pLogic->src_text() + ")"); + $$ = CONVERTER->stack().push(pLogic); + } + | RDO_not fun_logic + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + LPRDOFUNLogic pLogicNot = pLogic->operator_not(); + ASSERT(pLogicNot); + pLogicNot->setSrcPos (@1, @2); + pLogicNot->setSrcText("not " + pLogic->src_text()); + $$ = CONVERTER->stack().push(pLogicNot); + } + | '[' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | '(' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Арифметические выражения // -------------------------------------------------------------------------------- fun_arithm - : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | fun_arithm '+' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '-' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '*' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '/' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm_func_call - | fun_select_arithm - | '(' fun_arithm ')' - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - pArithm->setSrcPos (@1, @3); - pArithm->setSrcText("(" + pArithm->src_text() + ")"); - $$ = CONVERTER->stack().push(pArithm); - } - | '-' fun_arithm %prec RDO_UMINUS - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - RDOParserSrcInfo info; - info.setSrcPos (@1, @2); - info.setSrcText("-" + pArithm->src_text()); - $$ = CONVERTER->stack().push( - rdo::Factory::create( - rdo::Factory::create(pArithm->type(), info), - rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() - ) - ); - } - ; + : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | fun_arithm '+' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '-' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '*' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '/' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm_func_call + | fun_select_arithm + | '(' fun_arithm ')' + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + pArithm->setSrcPos (@1, @3); + pArithm->setSrcText("(" + pArithm->src_text() + ")"); + $$ = CONVERTER->stack().push(pArithm); + } + | '-' fun_arithm %prec RDO_UMINUS + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + RDOParserSrcInfo info; + info.setSrcPos (@1, @2); + info.setSrcText("-" + pArithm->src_text()); + $$ = CONVERTER->stack().push( + rdo::Factory::create( + rdo::Factory::create(pArithm->type(), info), + rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() + ) + ); + } + ; // -------------------------------------------------------------------------------- // -------------------- Функции и последовательности // -------------------------------------------------------------------------------- fun_arithm_func_call - : RDO_IDENTIF '(' ')' - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @3); - pFunParams->setSrcText(funName + "()"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @4); - pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' error - { - CONVERTER->error().error(@3, "Ошибка в параметрах функции"); - } - ; + : RDO_IDENTIF '(' ')' + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @3); + pFunParams->setSrcText(funName + "()"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @4); + pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' error + { + CONVERTER->error().error(@3, "Ошибка в параметрах функции"); + } + ; fun_arithm_func_call_pars - : fun_arithm - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars ',' fun_arithm - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars error - { - CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); - } - | fun_arithm_func_call_pars ',' error - { - CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); - } - ; + : fun_arithm + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars ',' fun_arithm + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars error + { + CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); + } + | fun_arithm_func_call_pars ',' error + { + CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Групповые выражения // -------------------------------------------------------------------------------- fun_group_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_group_header - : fun_group_keyword '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - $$ = CONVERTER->stack().push(rdo::Factory::create((RDOFUNGroupLogic::FunGroupType)$1, pValue->src_info())); - } - | fun_group_keyword '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | fun_group_keyword error - { - CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); - } - ; + : fun_group_keyword '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + $$ = CONVERTER->stack().push(rdo::Factory::create(static_cast($1), pValue->src_info())); + } + | fun_group_keyword '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | fun_group_keyword error + { + CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); + } + ; fun_group - : fun_group_header fun_logic ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pGroupFun); - ASSERT(pLogic ); - pGroupFun->setSrcPos(@1, @3); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); - } - | fun_group_header RDO_NoCheck ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - ASSERT(pGroupFun); - pGroupFun->setSrcPos(@1, @3); - LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); - ASSERT(pTrueLogic); - pTrueLogic->setSrcPos (@2); - pTrueLogic->setSrcText("NoCheck"); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); - } - | fun_group_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_group_header fun_logic ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pGroupFun); + ASSERT(pLogic ); + pGroupFun->setSrcPos(@1, @3); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); + } + | fun_group_header RDO_NoCheck ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + ASSERT(pGroupFun); + pGroupFun->setSrcPos(@1, @3); + LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); + ASSERT(pTrueLogic); + pTrueLogic->setSrcPos (@2); + pTrueLogic->setSrcText("NoCheck"); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); + } + | fun_group_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Select // -------------------------------------------------------------------------------- fun_select_header - : RDO_Select '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); - ASSERT(pSelect); - pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); - $$ = CONVERTER->stack().push(pSelect); - } - | RDO_Select '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | RDO_Select error - { - CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); - } - ; + : RDO_Select '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); + ASSERT(pSelect); + pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); + $$ = CONVERTER->stack().push(pSelect); + } + | RDO_Select '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | RDO_Select error + { + CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); + } + ; fun_select_body - : fun_select_header fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header RDO_NoCheck ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - RDOParserSrcInfo logicInfo(@2, "NoCheck"); - pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); - rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); - ASSERT(pCalc); - LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); - ASSERT(pLogic); - pLogic->setSrcInfo(logicInfo); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_select_header fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header RDO_NoCheck ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + RDOParserSrcInfo logicInfo(@2, "NoCheck"); + pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); + rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); + ASSERT(pCalc); + LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); + ASSERT(pLogic); + pLogic->setSrcInfo(logicInfo); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; fun_select_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_select_logic - : fun_select_body '.' fun_select_keyword '(' fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcPos(@1, @6); - LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup((RDOFUNGroupLogic::FunGroupType)$3, pLogic); - ASSERT(pLogicSelect); - $$ = CONVERTER->stack().push(pLogicSelect); - } - | fun_select_body '.' fun_select_keyword '(' error - { - CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); - } - | fun_select_body '.' fun_select_keyword error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); - LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); - ASSERT(pLogic); - $$ = CONVERTER->stack().push(pLogic); - } - | fun_select_body '.' RDO_Empty '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' error - { - CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); - } - | fun_select_body error - { - CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); - } - ; + : fun_select_body '.' fun_select_keyword '(' fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcPos(@1, @6); + LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup(static_cast($3), pLogic); + ASSERT(pLogicSelect); + $$ = CONVERTER->stack().push(pLogicSelect); + } + | fun_select_body '.' fun_select_keyword '(' error + { + CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); + } + | fun_select_body '.' fun_select_keyword error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); + LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); + ASSERT(pLogic); + $$ = CONVERTER->stack().push(pLogic); + } + | fun_select_body '.' RDO_Empty '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' error + { + CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); + } + | fun_select_body error + { + CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); + } + ; fun_select_arithm - : fun_select_body '.' RDO_Size '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); - LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | fun_select_body '.' RDO_Size error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Size '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - ; + : fun_select_body '.' RDO_Size '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); + LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | fun_select_body '.' RDO_Size error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Size '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + ; %% diff --git a/converter/smr2rdox/grammar/rdofrm.y b/converter/smr2rdox/grammar/rdofrm.y index 5e14e6508..16e647d57 100644 --- a/converter/smr2rdox/grammar/rdofrm.y +++ b/converter/smr2rdox/grammar/rdofrm.y @@ -1,13 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdofrm.y - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \date - \brief - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -16,175 +6,175 @@ %pure-parser %param {void* lexer} -%token RDO_Resource_type 257 -%token RDO_permanent 258 -%token RDO_Parameters 259 -%token RDO_integer 260 -%token RDO_real 261 -%token RDO_End 262 -%token RDO_temporary 263 -%token RDO_IDENTIF 264 -%token RDO_INT_CONST 265 -%token RDO_REAL_CONST 266 -%token RDO_such_as 267 -%token RDO_dblpoint 268 -%token RDO_Resources 269 -%token RDO_trace 270 -%token RDO_no_trace 271 -%token RDO_IDENTIF_COLON 272 -%token RDO_Constant 273 -%token RDO_Body 274 -%token RDO_Function 275 -%token RDO_Type 276 -%token RDO_algorithmic 277 -%token RDO_table 278 -%token RDO_list 279 -%token RDO_Exist 281 -%token RDO_Not_Exist 282 -%token RDO_For_All 283 -%token RDO_Not_For_All 284 -%token RDO_neq 285 -%token RDO_leq 286 -%token RDO_geq 287 -%token RDO_NoCheck 288 -%token RDO_Calculate_if 289 -%token RDO_or 290 -%token RDO_and 291 -%token RDO_Sequence 292 -%token RDO_uniform 293 -%token RDO_exponential 294 -%token RDO_normal 295 -%token RDO_by_hist 296 -%token RDO_enumerative 297 - -%token RDO_Pattern 298 -%token RDO_operation 299 -%token RDO_irregular_event 300 -%token RDO_rule 301 -%token RDO_keyboard 302 -%token RDO_Relevant_resources 303 -%token RDO_Keep 304 -%token RDO_Create 305 -%token RDO_Erase 306 -%token RDO_NonExist 307 -%token RDO_IDENTIF_NoChange 308 -%token RDO_Time 309 -%token RDO_Choice 310 -%token RDO_from 311 -%token RDO_first 312 -%token RDO_Convert_begin 313 -%token RDO_Convert_end 314 -%token RDO_Convert_rule 315 -%token RDO_Convert_event 316 -%token RDO_with_max 317 -%token RDO_with_min 318 -%token RDO_set 319 -%token RDO_IDENTIF_NoChange_NoChange 320 -%token RDO_Operations 321 - -%token RDO_Results 322 -%token RDO_watch_par 323 -%token RDO_watch_state 324 -%token RDO_watch_quant 325 -%token RDO_watch_value 326 -%token RDO_get_value 327 - -%token RDO_Model_name 328 -%token RDO_Resource_file 329 -%token RDO_OprIev_file 330 -%token RDO_Frame_file 331 -%token RDO_Statistic_file 332 -%token RDO_Results_file 333 -%token RDO_Trace_file 334 -%token RDO_Show_mode 335 -%token RDO_Frame_number 336 -%token RDO_Show_rate 337 -%token RDO_Run_StartTime 338 -%token RDO_Trace_StartTime 339 -%token RDO_Trace_EndTime 340 -%token RDO_Terminate_if 341 -%token RDO_Break_point 342 -%token RDO_Seed 343 -%token RDO_NoShow 344 -%token RDO_Monitor 345 -%token RDO_Animation 346 -%token RDO_NoChange 347 - -%token RDO_Decision_point 348 -%token RDO_search 349 -%token RDO_trace_stat 350 -%token RDO_trace_tops 351 -%token RDO_trace_all 352 -%token RDO_Condition 353 -%token RDO_Term_condition 354 -%token RDO_Evaluate_by 355 -%token RDO_Compare_tops 356 -%token RDO_NO 357 -%token RDO_YES 358 -%token RDO_Activities 359 -%token RDO_value_before 360 -%token RDO_value_after 361 -%token RDO_some 362 -%token RDO_Process 363 -%token RDO_SEIZE 364 -%token RDO_GENERATE 365 -%token RDO_TERMINATE 366 -%token RDO_ADVANCE 367 -%token RDO_RELEASE 368 -%token RDO_if 369 -%token RDO_CF 370 -%token RDO_Priority 371 -%token RDO_prior 372 -%token RDO_Parent 373 - -%token RDO_Frame 400 -%token RDO_Show_if 401 -%token RDO_Back_picture 402 -%token RDO_Show 403 -%token RDO_frm_cell 404 -%token RDO_text 405 -%token RDO_bitmap 406 -%token RDO_s_bmp 407 -%token RDO_rect 408 -%token RDO_r_rect 409 -%token RDO_line 410 -%token RDO_ellipse 411 -%token RDO_triang 412 -%token RDO_active 413 -%token RDO_ruler 414 -%token RDO_space 415 -%token RDO_color_transparent 416 -%token RDO_color_last 417 -%token RDO_color_white 418 -%token RDO_color_black 419 -%token RDO_color_red 420 -%token RDO_color_green 421 -%token RDO_color_blue 422 -%token RDO_color_cyan 423 -%token RDO_color_magenta 424 -%token RDO_color_yellow 425 -%token RDO_color_gray 426 - -%token RDO_IDENTIF_RELRES 427 -%token RDO_typedef 428 -%token RDO_enum 429 - -%token RDO_STRING_CONST 430 -%token RDO_Select 431 -%token RDO_Size 432 -%token RDO_Empty 433 -%token RDO_not 434 -%token RDO_UMINUS 435 -%token RDO_string 436 -%token RDO_bool 437 -%token RDO_BOOL_CONST 438 -%token RDO_Fuzzy 439 -%token RDO_Fuzzy_Term 440 -%token RDO_eq 441 -%token RDO_External_Model 442 -%token RDO_QUEUE 443 -%token RDO_DEPART 444 -%token RDO_ASSIGN 445 +%token RDO_Resource_type 257 +%token RDO_permanent 258 +%token RDO_Parameters 259 +%token RDO_integer 260 +%token RDO_real 261 +%token RDO_End 262 +%token RDO_temporary 263 +%token RDO_IDENTIF 264 +%token RDO_INT_CONST 265 +%token RDO_REAL_CONST 266 +%token RDO_such_as 267 +%token RDO_dblpoint 268 +%token RDO_Resources 269 +%token RDO_trace 270 +%token RDO_no_trace 271 +%token RDO_IDENTIF_COLON 272 +%token RDO_Constant 273 +%token RDO_Body 274 +%token RDO_Function 275 +%token RDO_Type 276 +%token RDO_algorithmic 277 +%token RDO_table 278 +%token RDO_list 279 +%token RDO_Exist 281 +%token RDO_Not_Exist 282 +%token RDO_For_All 283 +%token RDO_Not_For_All 284 +%token RDO_neq 285 +%token RDO_leq 286 +%token RDO_geq 287 +%token RDO_NoCheck 288 +%token RDO_Calculate_if 289 +%token RDO_or 290 +%token RDO_and 291 +%token RDO_Sequence 292 +%token RDO_uniform 293 +%token RDO_exponential 294 +%token RDO_normal 295 +%token RDO_by_hist 296 +%token RDO_enumerative 297 + +%token RDO_Pattern 298 +%token RDO_operation 299 +%token RDO_irregular_event 300 +%token RDO_rule 301 +%token RDO_keyboard 302 +%token RDO_Relevant_resources 303 +%token RDO_Keep 304 +%token RDO_Create 305 +%token RDO_Erase 306 +%token RDO_NonExist 307 +%token RDO_IDENTIF_NoChange 308 +%token RDO_Time 309 +%token RDO_Choice 310 +%token RDO_from 311 +%token RDO_first 312 +%token RDO_Convert_begin 313 +%token RDO_Convert_end 314 +%token RDO_Convert_rule 315 +%token RDO_Convert_event 316 +%token RDO_with_max 317 +%token RDO_with_min 318 +%token RDO_set 319 +%token RDO_IDENTIF_NoChange_NoChange 320 +%token RDO_Operations 321 + +%token RDO_Results 322 +%token RDO_watch_par 323 +%token RDO_watch_state 324 +%token RDO_watch_quant 325 +%token RDO_watch_value 326 +%token RDO_get_value 327 + +%token RDO_Model_name 328 +%token RDO_Resource_file 329 +%token RDO_OprIev_file 330 +%token RDO_Frame_file 331 +%token RDO_Statistic_file 332 +%token RDO_Results_file 333 +%token RDO_Trace_file 334 +%token RDO_Show_mode 335 +%token RDO_Frame_number 336 +%token RDO_Show_rate 337 +%token RDO_Run_StartTime 338 +%token RDO_Trace_StartTime 339 +%token RDO_Trace_EndTime 340 +%token RDO_Terminate_if 341 +%token RDO_Break_point 342 +%token RDO_Seed 343 +%token RDO_NoShow 344 +%token RDO_Monitor 345 +%token RDO_Animation 346 +%token RDO_NoChange 347 + +%token RDO_Decision_point 348 +%token RDO_search 349 +%token RDO_trace_stat 350 +%token RDO_trace_tops 351 +%token RDO_trace_all 352 +%token RDO_Condition 353 +%token RDO_Term_condition 354 +%token RDO_Evaluate_by 355 +%token RDO_Compare_tops 356 +%token RDO_NO 357 +%token RDO_YES 358 +%token RDO_Activities 359 +%token RDO_value_before 360 +%token RDO_value_after 361 +%token RDO_some 362 +%token RDO_Process 363 +%token RDO_SEIZE 364 +%token RDO_GENERATE 365 +%token RDO_TERMINATE 366 +%token RDO_ADVANCE 367 +%token RDO_RELEASE 368 +%token RDO_if 369 +%token RDO_CF 370 +%token RDO_Priority 371 +%token RDO_prior 372 +%token RDO_Parent 373 + +%token RDO_Frame 400 +%token RDO_Show_if 401 +%token RDO_Back_picture 402 +%token RDO_Show 403 +%token RDO_frm_cell 404 +%token RDO_text 405 +%token RDO_bitmap 406 +%token RDO_s_bmp 407 +%token RDO_rect 408 +%token RDO_r_rect 409 +%token RDO_line 410 +%token RDO_ellipse 411 +%token RDO_triang 412 +%token RDO_active 413 +%token RDO_ruler 414 +%token RDO_space 415 +%token RDO_color_transparent 416 +%token RDO_color_last 417 +%token RDO_color_white 418 +%token RDO_color_black 419 +%token RDO_color_red 420 +%token RDO_color_green 421 +%token RDO_color_blue 422 +%token RDO_color_cyan 423 +%token RDO_color_magenta 424 +%token RDO_color_yellow 425 +%token RDO_color_gray 426 + +%token RDO_IDENTIF_RELRES 427 +%token RDO_typedef 428 +%token RDO_enum 429 + +%token RDO_STRING_CONST 430 +%token RDO_Select 431 +%token RDO_Size 432 +%token RDO_Empty 433 +%token RDO_not 434 +%token RDO_UMINUS 435 +%token RDO_string 436 +%token RDO_bool 437 +%token RDO_BOOL_CONST 438 +%token RDO_Fuzzy 439 +%token RDO_Fuzzy_Term 440 +%token RDO_eq 441 +%token RDO_External_Model 442 +%token RDO_QUEUE 443 +%token RDO_DEPART 444 +%token RDO_ASSIGN 445 %{ @@ -255,1619 +245,1619 @@ typedef rdo::runtime::LPRDOFRMSpace LPRDOFRMSpace; // -------------------- Основной цикл // -------------------------------------------------------------------------------- frm_main - : /* empty */ - | frm_main frm_end - | error - { - CONVERTER->error().error(@1, "Неизвестная ошибка"); - } - ; + : /* empty */ + | frm_main frm_end + | error + { + CONVERTER->error().error(@1, "Неизвестная ошибка"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Фрейм // -------------------------------------------------------------------------------- frm_begin - : RDO_Frame RDO_IDENTIF - { - LPRDOFRMFrame pFrame = rdo::Factory::create(CONVERTER->stack().pop($2)->src_info()); - ASSERT(pFrame); - $$ = CONVERTER->stack().push(pFrame); - } - | RDO_Frame RDO_IDENTIF RDO_Show_if fun_logic - { - LPDocUpdate pShowIfDelete = rdo::Factory::create( - @3.m_first_seek, - @3.m_last_seek - ); - ASSERT(pShowIfDelete); - CONVERTER->insertDocUpdate(pShowIfDelete); - - LPRDOFRMFrame pFrame = rdo::Factory::create(CONVERTER->stack().pop($2)->src_info()); - ASSERT(pFrame); - - pFrame->setFrameConditionPos(@4.m_first_seek, @4.m_last_seek); - - $$ = CONVERTER->stack().push(pFrame); - } - | RDO_Frame RDO_IDENTIF RDO_Show_if error - { - CONVERTER->error().error(@4, "Ошибка в логическом выражении"); - } - ; + : RDO_Frame RDO_IDENTIF + { + LPRDOFRMFrame pFrame = rdo::Factory::create(CONVERTER->stack().pop($2)->src_info()); + ASSERT(pFrame); + $$ = CONVERTER->stack().push(pFrame); + } + | RDO_Frame RDO_IDENTIF RDO_Show_if fun_logic + { + LPDocUpdate pShowIfDelete = rdo::Factory::create( + @3.m_first_seek, + @3.m_last_seek + ); + ASSERT(pShowIfDelete); + CONVERTER->insertDocUpdate(pShowIfDelete); + + LPRDOFRMFrame pFrame = rdo::Factory::create(CONVERTER->stack().pop($2)->src_info()); + ASSERT(pFrame); + + pFrame->setFrameConditionPos(@4.m_first_seek, @4.m_last_seek); + + $$ = CONVERTER->stack().push(pFrame); + } + | RDO_Frame RDO_IDENTIF RDO_Show_if error + { + CONVERTER->error().error(@4, "Ошибка в логическом выражении"); + } + ; frm_background - : frm_begin RDO_Back_picture '=' frm_color - { - LPRDOFRMFrame pFrame = CONVERTER->stack().pop($1); - ASSERT(pFrame); - LPRDOFRMColor pBgColor = CONVERTER->stack().pop($4); - ASSERT(pBgColor); - if (pBgColor->getType() != RDOFRMColor::CT_TRANSPARENT && pBgColor->getType() != RDOFRMColor::CT_RGB) - { - CONVERTER->error().error(@4, "Цвет фона не может быть указан ссылкой на последнее значение"); - } - pFrame->frame()->setBackgroundColor(pBgColor); - $$ = CONVERTER->stack().push(pFrame); - } - | frm_begin RDO_Back_picture '=' - { - LPRDOFRMFrame pFrame = CONVERTER->stack().pop($1); - ASSERT(pFrame); - $$ = CONVERTER->stack().push(pFrame); - } - | frm_begin RDO_Back_picture error - { - CONVERTER->error().error(@3, "После ключевого слова $Back_picture ожидается знак равенства"); - } - | frm_begin error - { - CONVERTER->error().error(@2, "После имени кадра ожидается ключевое слово $Back_picture"); - } - ; + : frm_begin RDO_Back_picture '=' frm_color + { + LPRDOFRMFrame pFrame = CONVERTER->stack().pop($1); + ASSERT(pFrame); + LPRDOFRMColor pBgColor = CONVERTER->stack().pop($4); + ASSERT(pBgColor); + if (pBgColor->getType() != RDOFRMColor::Type::TRANSPARENT_COLOR && pBgColor->getType() != RDOFRMColor::Type::RGB) + { + CONVERTER->error().error(@4, "Цвет фона не может быть указан ссылкой на последнее значение"); + } + pFrame->frame()->setBackgroundColor(pBgColor); + $$ = CONVERTER->stack().push(pFrame); + } + | frm_begin RDO_Back_picture '=' + { + LPRDOFRMFrame pFrame = CONVERTER->stack().pop($1); + ASSERT(pFrame); + $$ = CONVERTER->stack().push(pFrame); + } + | frm_begin RDO_Back_picture error + { + CONVERTER->error().error(@3, "После ключевого слова $Back_picture ожидается знак равенства"); + } + | frm_begin error + { + CONVERTER->error().error(@2, "После имени кадра ожидается ключевое слово $Back_picture"); + } + ; frm_backpicture - : frm_background RDO_IDENTIF - { - LPRDOFRMFrame pFrame = CONVERTER->stack().pop($1); - ASSERT(pFrame); - pFrame->frame()->setBackPicture(CONVERTER->stack().pop($2)->value().getIdentificator()); - pFrame->onAfterBackPicture(@2.m_last_seek); - - $$ = CONVERTER->stack().push(pFrame); - } - | frm_background RDO_INT_CONST RDO_INT_CONST - { - LPRDOFRMFrame pFrame = CONVERTER->stack().pop($1); - ASSERT(pFrame); - pFrame->frame()->setBackPicture(CONVERTER->stack().pop($2)->value().getInt(), CONVERTER->stack().pop($3)->value().getInt()); - pFrame->onAfterBackPicture(@3.m_last_seek); - - $$ = CONVERTER->stack().push(pFrame); - } - | frm_background RDO_INT_CONST RDO_INT_CONST error - { - CONVERTER->error().error(@4, "Описание заголовка кадра окончено, ожидается ключевое слово $Show"); - } - | frm_background RDO_IDENTIF error - { - CONVERTER->error().error(@3, "Описание заголовка кадра окончено, ожидается ключевое слово $Show"); - } - | frm_background RDO_INT_CONST error - { - CONVERTER->error().error(@2, "После ширины кадра необходимо указать его высоту"); - } - | frm_background - { - CONVERTER->error().error(@1, "Необходимо указать имя фоновой картинки или размер кадра"); - } - ; + : frm_background RDO_IDENTIF + { + LPRDOFRMFrame pFrame = CONVERTER->stack().pop($1); + ASSERT(pFrame); + pFrame->frame()->setBackPicture(CONVERTER->stack().pop($2)->value().getIdentificator()); + pFrame->onAfterBackPicture(@2.m_last_seek); + + $$ = CONVERTER->stack().push(pFrame); + } + | frm_background RDO_INT_CONST RDO_INT_CONST + { + LPRDOFRMFrame pFrame = CONVERTER->stack().pop($1); + ASSERT(pFrame); + pFrame->frame()->setBackPicture(CONVERTER->stack().pop($2)->value().getInt(), CONVERTER->stack().pop($3)->value().getInt()); + pFrame->onAfterBackPicture(@3.m_last_seek); + + $$ = CONVERTER->stack().push(pFrame); + } + | frm_background RDO_INT_CONST RDO_INT_CONST error + { + CONVERTER->error().error(@4, "Описание заголовка кадра окончено, ожидается ключевое слово $Show"); + } + | frm_background RDO_IDENTIF error + { + CONVERTER->error().error(@3, "Описание заголовка кадра окончено, ожидается ключевое слово $Show"); + } + | frm_background RDO_INT_CONST error + { + CONVERTER->error().error(@2, "После ширины кадра необходимо указать его высоту"); + } + | frm_background + { + CONVERTER->error().error(@1, "Необходимо указать имя фоновой картинки или размер кадра"); + } + ; frm_show - : RDO_Show - { - LPRDOFRMFrame pFrame = CONVERTER->getLastFRMFrame(); - ASSERT(pFrame); - pFrame->setShowIfBlock(RDOFRMFrame::Seek()); - - LPDocUpdate pShowDelete = rdo::Factory::create( - @1.m_first_seek, - @1.m_last_seek - ); - ASSERT(pShowDelete); - CONVERTER->insertDocUpdate(pShowDelete); - } - | RDO_Show_if fun_logic - { - LPRDOFRMFrame pFrame = CONVERTER->getLastFRMFrame(); - ASSERT(pFrame); - pFrame->setShowIfBlock(RDOFRMFrame::Seek(@2.m_last_seek)); - - LPDocUpdate pShowIfReplace = rdo::Factory::create( - @1.m_first_seek, - @1.m_last_seek, - "if" - ); - ASSERT(pShowIfReplace); - CONVERTER->insertDocUpdate(pShowIfReplace); - - LPDocUpdate pOpenBraceInsert = rdo::Factory::create( - @2.m_first_seek, - "(" - ); - ASSERT(pOpenBraceInsert); - CONVERTER->insertDocUpdate(pOpenBraceInsert); - - const std::string closeBrace(")"); - LPDocUpdate pCloseBraceInsert = rdo::Factory::create( - @2.m_last_seek, - closeBrace - ); - ASSERT(pCloseBraceInsert); - CONVERTER->insertDocUpdate(pCloseBraceInsert); - } - | RDO_Show_if error - { - CONVERTER->error().error(@2, "Ошибка в логическом выражении"); - } - ; + : RDO_Show + { + LPRDOFRMFrame pFrame = CONVERTER->getLastFRMFrame(); + ASSERT(pFrame); + pFrame->setShowIfBlock(RDOFRMFrame::Seek()); + + LPDocUpdate pShowDelete = rdo::Factory::create( + @1.m_first_seek, + @1.m_last_seek + ); + ASSERT(pShowDelete); + CONVERTER->insertDocUpdate(pShowDelete); + } + | RDO_Show_if fun_logic + { + LPRDOFRMFrame pFrame = CONVERTER->getLastFRMFrame(); + ASSERT(pFrame); + pFrame->setShowIfBlock(RDOFRMFrame::Seek(@2.m_last_seek)); + + LPDocUpdate pShowIfReplace = rdo::Factory::create( + @1.m_first_seek, + @1.m_last_seek, + "if" + ); + ASSERT(pShowIfReplace); + CONVERTER->insertDocUpdate(pShowIfReplace); + + LPDocUpdate pOpenBraceInsert = rdo::Factory::create( + @2.m_first_seek, + "(" + ); + ASSERT(pOpenBraceInsert); + CONVERTER->insertDocUpdate(pOpenBraceInsert); + + const std::string closeBrace(")"); + LPDocUpdate pCloseBraceInsert = rdo::Factory::create( + @2.m_last_seek, + closeBrace + ); + ASSERT(pCloseBraceInsert); + CONVERTER->insertDocUpdate(pCloseBraceInsert); + } + | RDO_Show_if error + { + CONVERTER->error().error(@2, "Ошибка в логическом выражении"); + } + ; frm_item - : /* empty */ - | frm_item frm_show - | frm_item frm_text {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} - | frm_item frm_bitmap {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} - | frm_item frm_rect {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} - | frm_item frm_line {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} - | frm_item frm_ellipse {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} - | frm_item frm_r_rect {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} - | frm_item frm_triang {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} - | frm_item frm_s_bmp {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} - | frm_item frm_active {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} - | frm_item frm_ruler {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} - | frm_item frm_space {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} - ; + : /* empty */ + | frm_item frm_show + | frm_item frm_text {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} + | frm_item frm_bitmap {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} + | frm_item frm_rect {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} + | frm_item frm_line {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} + | frm_item frm_ellipse {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} + | frm_item frm_r_rect {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} + | frm_item frm_triang {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} + | frm_item frm_s_bmp {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} + | frm_item frm_active {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} + | frm_item frm_ruler {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} + | frm_item frm_space {CONVERTER->getLastFRMFrame()->addItem(CONVERTER->stack().pop($2), @2.m_last_seek);} + ; frm_header - : frm_backpicture frm_item - ; + : frm_backpicture frm_item + ; frm_end - : frm_header RDO_End - { - LPRDOFRMFrame pFrame = CONVERTER->getLastFRMFrame(); - ASSERT(pFrame); - pFrame->setShowIfBlock(RDOFRMFrame::Seek()); - } - ; + : frm_header RDO_End + { + LPRDOFRMFrame pFrame = CONVERTER->getLastFRMFrame(); + ASSERT(pFrame); + pFrame->setShowIfBlock(RDOFRMFrame::Seek()); + } + ; // -------------------------------------------------------------------------------- // -------------------- Элементы // -------------------------------------------------------------------------------- frm_color - : RDO_color_transparent - { - LPRDOFRMColor pColor = rdo::Factory::create(RDOFRMColor::CT_TRANSPARENT); - ASSERT(pColor); - $$ = CONVERTER->stack().push(pColor); - } - | RDO_color_last - { - LPRDOFRMColor pColor = rdo::Factory::create(); - ASSERT(pColor); - $$ = CONVERTER->stack().push(pColor); - } - | RDO_color_white - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(255), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = CONVERTER->stack().push(pColor); - } - | RDO_color_black - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(0), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = CONVERTER->stack().push(pColor); - } - | RDO_color_red - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(0), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = CONVERTER->stack().push(pColor); - } - | RDO_color_green - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(255), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = CONVERTER->stack().push(pColor); - } - | RDO_color_blue - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(0), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = CONVERTER->stack().push(pColor); - } - | RDO_color_cyan - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(255), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = CONVERTER->stack().push(pColor); - } - | RDO_color_magenta - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(0), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = CONVERTER->stack().push(pColor); - } - | RDO_color_yellow - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(255), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = CONVERTER->stack().push(pColor); - } - | RDO_color_gray - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(127), (unsigned char)(127), (unsigned char)(127), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = CONVERTER->stack().push(pColor); - } - | '<' RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST '>' - { - LPRDOFUNArithm pRed = rdo::Factory::create(CONVERTER->stack().pop($2)); - LPRDOFUNArithm pGreen = rdo::Factory::create(CONVERTER->stack().pop($3)); - LPRDOFUNArithm pBlue = rdo::Factory::create(CONVERTER->stack().pop($4)); - LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(std::size_t(0), RDOParserSrcInfo()), rdo::Factory::create(std::size_t(255), RDOParserSrcInfo()), RDOParserSrcInfo()); - LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); - LPRDOTypeParam pType = rdo::Factory::create(pIntRange, RDOParserSrcInfo()); - pRed->checkParamType (pType); - pGreen->checkParamType(pType); - pBlue->checkParamType (pType); - - LPRDOFRMColor pColor = rdo::Factory::create(pRed->createCalc(), pGreen->createCalc(), pBlue->createCalc()); - ASSERT(pColor); - $$ = CONVERTER->stack().push(pColor); - } - | '<' RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST error - { - CONVERTER->error().error(@4, "Найдены все составляющие цвета, ожидается '>'"); - } - | '<' RDO_INT_CONST RDO_INT_CONST error - { - CONVERTER->error().error(@3, @4, "Ожидается синяя составляющая цвета"); - } - | '<' RDO_INT_CONST error - { - CONVERTER->error().error(@2, @3, "Ожидается зеленая составляющая цвета"); - } - | '<' fun_arithm ',' fun_arithm ',' fun_arithm '>' - { - LPRDOFUNArithm pRed = CONVERTER->stack().pop($2); - LPRDOFUNArithm pGreen = CONVERTER->stack().pop($4); - LPRDOFUNArithm pBlue = CONVERTER->stack().pop($6); - LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(std::size_t(0), RDOParserSrcInfo()), rdo::Factory::create(std::size_t(255), RDOParserSrcInfo()), RDOParserSrcInfo()); - LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); - LPRDOTypeParam pType = rdo::Factory::create(pIntRange, RDOParserSrcInfo()); - pRed->checkParamType (pType); - pGreen->checkParamType(pType); - pBlue->checkParamType (pType); - - LPRDOFRMColor pColor = rdo::Factory::create(pRed->createCalc(), pGreen->createCalc(), pBlue->createCalc()); - ASSERT(pColor); - $$ = CONVERTER->stack().push(pColor); - } - | '<' fun_arithm ',' fun_arithm ',' fun_arithm error - { - CONVERTER->error().error(@6, "Найдены все составляющие цвета, ожидается '>'"); - } - | '<' fun_arithm ',' fun_arithm ',' error - { - CONVERTER->error().error(@5, @6, "Ожидается синяя составляющая цвета"); - } - | '<' fun_arithm ',' fun_arithm error - { - CONVERTER->error().error(@4, "После зеленой составляющей цвета ожидается запятая"); - } - | '<' fun_arithm ',' error - { - CONVERTER->error().error(@3, @4, "Ожидается зеленая составляющая цвета"); - } - | '<' fun_arithm error - { - CONVERTER->error().error(@2, "После красной составляющей цвета ожидается запятая"); - } - | '<' error - { - CONVERTER->error().error(@1, "После '<' ожидается красная составляющая цвета"); - } - ; + : RDO_color_transparent + { + LPRDOFRMColor pColor = rdo::Factory::create(RDOFRMColor::Type::TRANSPARENT_COLOR); + ASSERT(pColor); + $$ = CONVERTER->stack().push(pColor); + } + | RDO_color_last + { + LPRDOFRMColor pColor = rdo::Factory::create(); + ASSERT(pColor); + $$ = CONVERTER->stack().push(pColor); + } + | RDO_color_white + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(255), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = CONVERTER->stack().push(pColor); + } + | RDO_color_black + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(0), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = CONVERTER->stack().push(pColor); + } + | RDO_color_red + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(0), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = CONVERTER->stack().push(pColor); + } + | RDO_color_green + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(255), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = CONVERTER->stack().push(pColor); + } + | RDO_color_blue + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(0), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = CONVERTER->stack().push(pColor); + } + | RDO_color_cyan + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(255), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = CONVERTER->stack().push(pColor); + } + | RDO_color_magenta + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(0), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = CONVERTER->stack().push(pColor); + } + | RDO_color_yellow + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(255), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = CONVERTER->stack().push(pColor); + } + | RDO_color_gray + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(127), (unsigned char)(127), (unsigned char)(127), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = CONVERTER->stack().push(pColor); + } + | '<' RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST '>' + { + LPRDOFUNArithm pRed = rdo::Factory::create(CONVERTER->stack().pop($2)); + LPRDOFUNArithm pGreen = rdo::Factory::create(CONVERTER->stack().pop($3)); + LPRDOFUNArithm pBlue = rdo::Factory::create(CONVERTER->stack().pop($4)); + LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(std::size_t(0), RDOParserSrcInfo()), rdo::Factory::create(std::size_t(255), RDOParserSrcInfo()), RDOParserSrcInfo()); + LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); + LPRDOTypeParam pType = rdo::Factory::create(pIntRange, RDOParserSrcInfo()); + pRed->checkParamType (pType); + pGreen->checkParamType(pType); + pBlue->checkParamType (pType); + + LPRDOFRMColor pColor = rdo::Factory::create(pRed->createCalc(), pGreen->createCalc(), pBlue->createCalc()); + ASSERT(pColor); + $$ = CONVERTER->stack().push(pColor); + } + | '<' RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST error + { + CONVERTER->error().error(@4, "Найдены все составляющие цвета, ожидается '>'"); + } + | '<' RDO_INT_CONST RDO_INT_CONST error + { + CONVERTER->error().error(@3, @4, "Ожидается синяя составляющая цвета"); + } + | '<' RDO_INT_CONST error + { + CONVERTER->error().error(@2, @3, "Ожидается зеленая составляющая цвета"); + } + | '<' fun_arithm ',' fun_arithm ',' fun_arithm '>' + { + LPRDOFUNArithm pRed = CONVERTER->stack().pop($2); + LPRDOFUNArithm pGreen = CONVERTER->stack().pop($4); + LPRDOFUNArithm pBlue = CONVERTER->stack().pop($6); + LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(std::size_t(0), RDOParserSrcInfo()), rdo::Factory::create(std::size_t(255), RDOParserSrcInfo()), RDOParserSrcInfo()); + LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); + LPRDOTypeParam pType = rdo::Factory::create(pIntRange, RDOParserSrcInfo()); + pRed->checkParamType (pType); + pGreen->checkParamType(pType); + pBlue->checkParamType (pType); + + LPRDOFRMColor pColor = rdo::Factory::create(pRed->createCalc(), pGreen->createCalc(), pBlue->createCalc()); + ASSERT(pColor); + $$ = CONVERTER->stack().push(pColor); + } + | '<' fun_arithm ',' fun_arithm ',' fun_arithm error + { + CONVERTER->error().error(@6, "Найдены все составляющие цвета, ожидается '>'"); + } + | '<' fun_arithm ',' fun_arithm ',' error + { + CONVERTER->error().error(@5, @6, "Ожидается синяя составляющая цвета"); + } + | '<' fun_arithm ',' fun_arithm error + { + CONVERTER->error().error(@4, "После зеленой составляющей цвета ожидается запятая"); + } + | '<' fun_arithm ',' error + { + CONVERTER->error().error(@3, @4, "Ожидается зеленая составляющая цвета"); + } + | '<' fun_arithm error + { + CONVERTER->error().error(@2, "После красной составляющей цвета ожидается запятая"); + } + | '<' error + { + CONVERTER->error().error(@1, "После '<' ожидается красная составляющая цвета"); + } + ; frm_postype - : /* empty */ - { - $$ = RDOFRMPosition::PT_ABSOLUTE; - } - | '+' - { - $$ = RDOFRMPosition::PT_DELTA; - } - | '*' - { - $$ = RDOFRMPosition::PT_MULT; - } - | '#' RDO_INT_CONST - { - int rilet_id = CONVERTER->stack().pop($2)->value().getInt(); - if (rilet_id <= 0) - { - CONVERTER->error().error(@2, "Номер рулетки должен быть больше нуля"); - } - if (!RUNTIME->lastFrame()->findRulet(rilet_id)) - { - CONVERTER->error().error(@2, rdo::format("Рулетки с номером '%d' не существует", rilet_id)); - } - $$ = RDOFRMPosition::PT_RULET + rilet_id; - } - | '#' error - { - CONVERTER->error().error(@1, "После '#' ожидается целочисленный номер рулетки"); - } - ; + : /* empty */ + { + $$ = static_cast(RDOFRMPosition::Type::ABSOLUTE_POSITION); + } + | '+' + { + $$ = static_cast(RDOFRMPosition::Type::DELTA); + } + | '*' + { + $$ = static_cast(RDOFRMPosition::Type::MULT); + } + | '#' RDO_INT_CONST + { + int rulet_id = CONVERTER->stack().pop($2)->value().getInt(); + if (rulet_id <= 0) + { + CONVERTER->error().error(@2, "Номер рулетки должен быть больше нуля"); + } + if (!RUNTIME->lastFrame()->findRulet(rulet_id)) + { + CONVERTER->error().error(@2, rdo::format("Рулетки с номером '%d' не существует", rulet_id)); + } + $$ = static_cast(RDOFRMPosition::Type::RULET) + rulet_id; + } + | '#' error + { + CONVERTER->error().error(@1, "После '#' ожидается целочисленный номер рулетки"); + } + ; frm_postype_xy - : frm_postype - | '=' - { - $$ = RDOFRMPosition::PT_GABARIT; - } - ; + : frm_postype + | '=' + { + $$ = static_cast(RDOFRMPosition::Type::GABARIT); + } + ; frm_postype_wh - : frm_postype; - | '=' - { - CONVERTER->error().error(@1, "Нельзя использовать данное выравнивание для ширины или высоты"); - } - ; + : frm_postype; + | '=' + { + CONVERTER->error().error(@1, "Нельзя использовать данное выравнивание для ширины или высоты"); + } + ; frm_position_xy - : fun_arithm frm_postype_xy - { - rdo::runtime::LPRDOCalc pCalc = CONVERTER->stack().pop($1)->createCalc(); - if ($2 >= RDOFRMPosition::PT_RULET) - { - LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, RDOFRMPosition::PT_RULET, $2 - RDOFRMPosition::PT_RULET); - ASSERT(pPosition); - $$ = CONVERTER->stack().push(pPosition); - } - else - { - LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, (RDOFRMPosition::PositionType)$2); - ASSERT(pPosition); - $$ = CONVERTER->stack().push(pPosition); - } - } - ; + : fun_arithm frm_postype_xy + { + rdo::runtime::LPRDOCalc pCalc = CONVERTER->stack().pop($1)->createCalc(); + if ($2 >= static_cast(RDOFRMPosition::Type::RULET)) + { + LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, RDOFRMPosition::Type::RULET, $2 - static_cast(RDOFRMPosition::Type::RULET)); + ASSERT(pPosition); + $$ = CONVERTER->stack().push(pPosition); + } + else + { + LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, static_cast($2)); + ASSERT(pPosition); + $$ = CONVERTER->stack().push(pPosition); + } + } + ; frm_position_wh - : fun_arithm frm_postype_wh - { - rdo::runtime::LPRDOCalc pCalc = CONVERTER->stack().pop($1)->createCalc(); - if ($2 >= RDOFRMPosition::PT_RULET) - { - LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, RDOFRMPosition::PT_RULET, $2 - RDOFRMPosition::PT_RULET); - ASSERT(pPosition); - $$ = CONVERTER->stack().push(pPosition); - } - else - { - LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, (RDOFRMPosition::PositionType)$2); - ASSERT(pPosition); - $$ = CONVERTER->stack().push(pPosition); - } - } - ; + : fun_arithm frm_postype_wh + { + rdo::runtime::LPRDOCalc pCalc = CONVERTER->stack().pop($1)->createCalc(); + if ($2 >= static_cast(RDOFRMPosition::Type::RULET)) + { + LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, RDOFRMPosition::Type::RULET, $2 - static_cast(RDOFRMPosition::Type::RULET)); + ASSERT(pPosition); + $$ = CONVERTER->stack().push(pPosition); + } + else + { + LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, static_cast($2)); + ASSERT(pPosition); + $$ = CONVERTER->stack().push(pPosition); + } + } + ; frm_ruler - : RDO_ruler '[' RDO_INT_CONST ',' frm_position_xy ',' frm_position_xy ']' - { - LPRDOFRMRulet pRulet = RUNTIME->lastFrame()->findRulet(CONVERTER->stack().pop($3)->value().getInt()); - if (pRulet) - { - CONVERTER->error().push_only(@3, rdo::format("Рулетка с номером '%d' уже существует", CONVERTER->stack().pop($3)->value().getInt())); - CONVERTER->error().push_only(pRulet->src_info(), "См. первое определение"); - CONVERTER->error().push_done(); - } - LPRDOFRMPosition pX = CONVERTER->stack().pop($5); - LPRDOFRMPosition pY = CONVERTER->stack().pop($7); - ASSERT(pX); - ASSERT(pY); - if (pX->getType() != RDOFRMPosition::PT_ABSOLUTE) - { - CONVERTER->error().error(@5, "Координаты рулетки должны быть абсолютными"); - } - if (pY->getType() != RDOFRMPosition::PT_ABSOLUTE) - { - CONVERTER->error().error(@7, "Координаты рулетки должны быть абсолютными"); - } - pRulet = rdo::Factory::create(RDOParserSrcInfo(@1), CONVERTER->stack().pop($3)->value().getInt(), pX, pY); - ASSERT(pRulet); - $$ = CONVERTER->stack().push(pRulet); - } - | RDO_ruler '[' RDO_INT_CONST ',' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@7, "Ожидается ']'"); - } - | RDO_ruler '[' RDO_INT_CONST ',' frm_position_xy ',' error - { - CONVERTER->error().error(@6, @7, "Ожидается координата по оси Y"); - } - | RDO_ruler '[' RDO_INT_CONST ',' frm_position_xy error - { - CONVERTER->error().error(@5, "Ожидается запятая"); - } - | RDO_ruler '[' RDO_INT_CONST ',' error - { - CONVERTER->error().error(@4, @5, "Ожидается координата по оси X"); - } - | RDO_ruler '[' RDO_INT_CONST error - { - CONVERTER->error().error(@3, "Ожидается запятая"); - } - | RDO_ruler '[' error - { - CONVERTER->error().error(@2, @3, "Ожидается номер рулетки"); - } - | RDO_ruler error - { - CONVERTER->error().error(@1, "Ожидается '['"); - } - ; + : RDO_ruler '[' RDO_INT_CONST ',' frm_position_xy ',' frm_position_xy ']' + { + LPRDOFRMRulet pRulet = RUNTIME->lastFrame()->findRulet(CONVERTER->stack().pop($3)->value().getInt()); + if (pRulet) + { + CONVERTER->error().push_only(@3, rdo::format("Рулетка с номером '%d' уже существует", CONVERTER->stack().pop($3)->value().getInt())); + CONVERTER->error().push_only(pRulet->src_info(), "См. первое определение"); + CONVERTER->error().push_done(); + } + LPRDOFRMPosition pX = CONVERTER->stack().pop($5); + LPRDOFRMPosition pY = CONVERTER->stack().pop($7); + ASSERT(pX); + ASSERT(pY); + if (pX->getType() != RDOFRMPosition::Type::ABSOLUTE_POSITION) + { + CONVERTER->error().error(@5, "Координаты рулетки должны быть абсолютными"); + } + if (pY->getType() != RDOFRMPosition::Type::ABSOLUTE_POSITION) + { + CONVERTER->error().error(@7, "Координаты рулетки должны быть абсолютными"); + } + pRulet = rdo::Factory::create(RDOParserSrcInfo(@1), CONVERTER->stack().pop($3)->value().getInt(), pX, pY); + ASSERT(pRulet); + $$ = CONVERTER->stack().push(pRulet); + } + | RDO_ruler '[' RDO_INT_CONST ',' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@7, "Ожидается ']'"); + } + | RDO_ruler '[' RDO_INT_CONST ',' frm_position_xy ',' error + { + CONVERTER->error().error(@6, @7, "Ожидается координата по оси Y"); + } + | RDO_ruler '[' RDO_INT_CONST ',' frm_position_xy error + { + CONVERTER->error().error(@5, "Ожидается запятая"); + } + | RDO_ruler '[' RDO_INT_CONST ',' error + { + CONVERTER->error().error(@4, @5, "Ожидается координата по оси X"); + } + | RDO_ruler '[' RDO_INT_CONST error + { + CONVERTER->error().error(@3, "Ожидается запятая"); + } + | RDO_ruler '[' error + { + CONVERTER->error().error(@2, @3, "Ожидается номер рулетки"); + } + | RDO_ruler error + { + CONVERTER->error().error(@1, "Ожидается '['"); + } + ; frm_space - : RDO_space '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ']' - { - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); - LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMSpace pSpace = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight); - ASSERT(pSpace); - $$ = CONVERTER->stack().push(pSpace); - } - | RDO_space '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - CONVERTER->error().error(@9, "Ожидается ']'"); - } - | RDO_space '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - CONVERTER->error().error(@8, @9, "Ожидается высота"); - } - | RDO_space '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - CONVERTER->error().error(@7, "Ожидается запятая"); - } - | RDO_space '[' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@6, @7, "Ожидается ширина"); - } - | RDO_space '[' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@5, "Ожидается запятая"); - } - | RDO_space '[' frm_position_xy ',' error - { - CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - | RDO_space '[' frm_position_xy error - { - CONVERTER->error().error(@3, "Ожидается запятая"); - } - | RDO_space '[' error - { - CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); - } - | RDO_space error - { - CONVERTER->error().error(@1, "Ожидается '['"); - } - ; + : RDO_space '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ']' + { + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); + LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMSpace pSpace = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight); + ASSERT(pSpace); + $$ = CONVERTER->stack().push(pSpace); + } + | RDO_space '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + CONVERTER->error().error(@9, "Ожидается ']'"); + } + | RDO_space '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + CONVERTER->error().error(@8, @9, "Ожидается высота"); + } + | RDO_space '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + CONVERTER->error().error(@7, "Ожидается запятая"); + } + | RDO_space '[' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@6, @7, "Ожидается ширина"); + } + | RDO_space '[' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@5, "Ожидается запятая"); + } + | RDO_space '[' frm_position_xy ',' error + { + CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + | RDO_space '[' frm_position_xy error + { + CONVERTER->error().error(@3, "Ожидается запятая"); + } + | RDO_space '[' error + { + CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); + } + | RDO_space error + { + CONVERTER->error().error(@1, "Ожидается '['"); + } + ; frm_text_align - : /* empty */ {$$ = rdo::animation::TextElement::TETA_LEFT; } - | '<' {$$ = rdo::animation::TextElement::TETA_LEFT; } - | '=' {$$ = rdo::animation::TextElement::TETA_CENTER;} - | '>' {$$ = rdo::animation::TextElement::TETA_RIGHT; } - ; + : /* empty */ {$$ = (int)rdo::animation::TextElement::Align::LEFT; } + | '<' {$$ = (int)rdo::animation::TextElement::Align::LEFT; } + | '=' {$$ = (int)rdo::animation::TextElement::Align::CENTER;} + | '>' {$$ = (int)rdo::animation::TextElement::Align::RIGHT; } + ; frm_text_common - : RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ',' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); - LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = CONVERTER->stack().pop($11); - LPRDOFRMColor pFgColor = CONVERTER->stack().pop($13); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG_TEXT); - pFgColor->setType(RDOFRMColor::CT_LAST_FG_TEXT); - LPRDOFRMText pText = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pText); - $$ = CONVERTER->stack().push(pText); - } + : RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ',' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); + LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = CONVERTER->stack().pop($11); + LPRDOFRMColor pFgColor = CONVERTER->stack().pop($13); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG_TEXT); + pFgColor->setType(RDOFRMColor::Type::LAST_FG_TEXT); + LPRDOFRMText pText = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pText); + $$ = CONVERTER->stack().push(pText); + } /* - | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' - { - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); - LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = rdp::Factory::create(); - LPRDOFRMColor pFgColor = CONVERTER->stack().pop($11); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG_TEXT); - pFgColor->setType(RDOFRMColor::CT_LAST_FG_TEXT); - LPRDOFRMText pText = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pText); - $$ = CONVERTER->stack().push(pText); - } - | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' - { - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); - LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = rdp::Factory::create(); - LPRDOFRMColor pFgColor = rdp::Factory::create(); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG_TEXT); - pFgColor->setType(RDOFRMColor::CT_LAST_FG_TEXT); - LPRDOFRMText pText = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pText); - $$ = CONVERTER->stack().push(pText); - } + | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' + { + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); + LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = rdp::Factory::create(); + LPRDOFRMColor pFgColor = CONVERTER->stack().pop($11); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG_TEXT); + pFgColor->setType(RDOFRMColor::Type::LAST_FG_TEXT); + LPRDOFRMText pText = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pText); + $$ = CONVERTER->stack().push(pText); + } + | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' + { + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); + LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = rdp::Factory::create(); + LPRDOFRMColor pFgColor = rdp::Factory::create(); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG_TEXT); + pFgColor->setType(RDOFRMColor::Type::LAST_FG_TEXT); + LPRDOFRMText pText = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pText); + $$ = CONVERTER->stack().push(pText); + } */ - | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error - { - CONVERTER->error().error(@13, "Ожидается запятая"); - } - | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error - { - CONVERTER->error().error(@12, @13, "Ожидается цвет текста"); - } - | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error - { - CONVERTER->error().error(@11, "Ожидается запятая"); - } - | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error - { - CONVERTER->error().error(@10, @11, "Ожидается цвет фона"); - } - | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - CONVERTER->error().error(@9, "Ожидается запятая"); - } - | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - CONVERTER->error().error(@8, @9, "Ожидается высота"); - } - | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - CONVERTER->error().error(@7, "Ожидается запятая"); - } - | RDO_text '[' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@6, @7, "Ожидается ширина"); - } - | RDO_text '[' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@5, "Ожидается запятая"); - } - | RDO_text '[' frm_position_xy ',' error - { - CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - | RDO_text '[' frm_position_xy error - { - CONVERTER->error().error(@3, "Ожидается запятая"); - } - | RDO_text '[' error - { - CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); - } - | RDO_text error - { - CONVERTER->error().error(@1, "Ожидается '['"); - } - ; + | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error + { + CONVERTER->error().error(@13, "Ожидается запятая"); + } + | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error + { + CONVERTER->error().error(@12, @13, "Ожидается цвет текста"); + } + | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error + { + CONVERTER->error().error(@11, "Ожидается запятая"); + } + | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error + { + CONVERTER->error().error(@10, @11, "Ожидается цвет фона"); + } + | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + CONVERTER->error().error(@9, "Ожидается запятая"); + } + | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + CONVERTER->error().error(@8, @9, "Ожидается высота"); + } + | RDO_text '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + CONVERTER->error().error(@7, "Ожидается запятая"); + } + | RDO_text '[' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@6, @7, "Ожидается ширина"); + } + | RDO_text '[' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@5, "Ожидается запятая"); + } + | RDO_text '[' frm_position_xy ',' error + { + CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + | RDO_text '[' frm_position_xy error + { + CONVERTER->error().error(@3, "Ожидается запятая"); + } + | RDO_text '[' error + { + CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); + } + | RDO_text error + { + CONVERTER->error().error(@1, "Ожидается '['"); + } + ; frm_text - : frm_text_common frm_text_align fun_arithm ']' - { - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @4.m_first_seek, - @4.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMText pText = CONVERTER->stack().pop($1); - ASSERT(pText); - pText->setText((rdo::animation::TextElement::TextAlign)$2, CONVERTER->stack().pop($3)->createCalc()); - $$ = CONVERTER->stack().push(pText); - } - | frm_text_common frm_text_align RDO_STRING_CONST ']' - { - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @4.m_first_seek, - @4.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMText pText = CONVERTER->stack().pop($1); - ASSERT(pText); - pText->setText((rdo::animation::TextElement::TextAlign)$2, CONVERTER->stack().pop($3)->value().getString()); - $$ = CONVERTER->stack().push(pText); - } - | frm_text_common frm_text_align fun_arithm error - { - CONVERTER->error().error(@3, "Ожидается ']'"); - } - | frm_text_common frm_text_align RDO_STRING_CONST error - { - CONVERTER->error().error(@3, "Ожидается ']'"); - } - | frm_text_common frm_text_align error - { - CONVERTER->error().error(@2, "Ожидается параметр ресурса или строка"); - } - ; + : frm_text_common frm_text_align fun_arithm ']' + { + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @4.m_first_seek, + @4.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMText pText = CONVERTER->stack().pop($1); + ASSERT(pText); + pText->setText((rdo::animation::TextElement::Align)$2, CONVERTER->stack().pop($3)->createCalc()); + $$ = CONVERTER->stack().push(pText); + } + | frm_text_common frm_text_align RDO_STRING_CONST ']' + { + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @4.m_first_seek, + @4.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMText pText = CONVERTER->stack().pop($1); + ASSERT(pText); + pText->setText((rdo::animation::TextElement::Align)$2, CONVERTER->stack().pop($3)->value().getString()); + $$ = CONVERTER->stack().push(pText); + } + | frm_text_common frm_text_align fun_arithm error + { + CONVERTER->error().error(@3, "Ожидается ']'"); + } + | frm_text_common frm_text_align RDO_STRING_CONST error + { + CONVERTER->error().error(@3, "Ожидается ']'"); + } + | frm_text_common frm_text_align error + { + CONVERTER->error().error(@2, "Ожидается параметр ресурса или строка"); + } + ; frm_bitmap - : RDO_bitmap '[' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @8.m_first_seek, - @8.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - ASSERT(pX); - ASSERT(pY); - LPRDOFRMBitmap pBitmap = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, CONVERTER->stack().pop($7)->value().getIdentificator()); - ASSERT(pBitmap); - $$ = CONVERTER->stack().push(pBitmap); - } - | RDO_bitmap '[' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ',' RDO_IDENTIF ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @10.m_first_seek, - @10.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - ASSERT(pX); - ASSERT(pY); - LPRDOFRMBitmap pBitmap = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, CONVERTER->stack().pop($7)->value().getIdentificator(), CONVERTER->stack().pop($9)->value().getIdentificator()); - ASSERT(pBitmap); - $$ = CONVERTER->stack().push(pBitmap); - } - | RDO_bitmap '[' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ',' RDO_IDENTIF error - { - CONVERTER->error().error(@9, "Ожидается ']'"); - } - | RDO_bitmap '[' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ',' error - { - CONVERTER->error().error(@8, @9, "Ожидается имя маски для картинки"); - } - | RDO_bitmap '[' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF error - { - CONVERTER->error().error(@7, "Ожидается ']'"); - } - | RDO_bitmap '[' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@6, @7, "Ожидается имя картинки"); - } - | RDO_bitmap '[' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@5, "Ожидается запятая"); - } - | RDO_bitmap '[' frm_position_xy ',' error - { - CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - | RDO_bitmap '[' frm_position_xy error - { - CONVERTER->error().error(@3, "Ожидается запятая"); - } - | RDO_bitmap '[' error - { - CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); - } - | RDO_bitmap error - { - CONVERTER->error().error(@1, "Ожидается '['"); - } - ; + : RDO_bitmap '[' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @8.m_first_seek, + @8.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + ASSERT(pX); + ASSERT(pY); + LPRDOFRMBitmap pBitmap = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, CONVERTER->stack().pop($7)->value().getIdentificator()); + ASSERT(pBitmap); + $$ = CONVERTER->stack().push(pBitmap); + } + | RDO_bitmap '[' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ',' RDO_IDENTIF ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @10.m_first_seek, + @10.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + ASSERT(pX); + ASSERT(pY); + LPRDOFRMBitmap pBitmap = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, CONVERTER->stack().pop($7)->value().getIdentificator(), CONVERTER->stack().pop($9)->value().getIdentificator()); + ASSERT(pBitmap); + $$ = CONVERTER->stack().push(pBitmap); + } + | RDO_bitmap '[' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ',' RDO_IDENTIF error + { + CONVERTER->error().error(@9, "Ожидается ']'"); + } + | RDO_bitmap '[' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ',' error + { + CONVERTER->error().error(@8, @9, "Ожидается имя маски для картинки"); + } + | RDO_bitmap '[' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF error + { + CONVERTER->error().error(@7, "Ожидается ']'"); + } + | RDO_bitmap '[' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@6, @7, "Ожидается имя картинки"); + } + | RDO_bitmap '[' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@5, "Ожидается запятая"); + } + | RDO_bitmap '[' frm_position_xy ',' error + { + CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + | RDO_bitmap '[' frm_position_xy error + { + CONVERTER->error().error(@3, "Ожидается запятая"); + } + | RDO_bitmap '[' error + { + CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); + } + | RDO_bitmap error + { + CONVERTER->error().error(@1, "Ожидается '['"); + } + ; frm_s_bmp - : RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @12.m_first_seek, - @12.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); - LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMBitmapStretch pBitmap = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, CONVERTER->stack().pop($11)->value().getIdentificator()); - ASSERT(pBitmap); - $$ = CONVERTER->stack().push(pBitmap); - } - | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ',' RDO_IDENTIF ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @14.m_first_seek, - @14.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); - LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMBitmapStretch pBitmap = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, CONVERTER->stack().pop($11)->value().getIdentificator(), CONVERTER->stack().pop($13)->value().getIdentificator()); - ASSERT(pBitmap); - $$ = CONVERTER->stack().push(pBitmap); - } - | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ',' RDO_IDENTIF error - { - CONVERTER->error().error(@13, "Ожидается ']'"); - } - | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ',' error - { - CONVERTER->error().error(@12, @13, "Ожидается имя маски для картинки"); - } - | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF error - { - CONVERTER->error().error(@11, "Ожидается ']'"); - } - | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error - { - CONVERTER->error().error(@10, @11, "Ожидается имя картинки"); - } - | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - CONVERTER->error().error(@9, "Ожидается запятая"); - } - | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - CONVERTER->error().error(@8, @9, "Ожидается высота"); - } - | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - CONVERTER->error().error(@7, "Ожидается запятая"); - } - | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@6, @7, "Ожидается ширина"); - } - | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@5, "Ожидается запятая"); - } - | RDO_s_bmp '[' frm_position_xy ',' error - { - CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - | RDO_s_bmp '[' frm_position_xy error - { - CONVERTER->error().error(@3, "Ожидается запятая"); - } - | RDO_s_bmp '[' error - { - CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); - } - | RDO_s_bmp error - { - CONVERTER->error().error(@1, "Ожидается '['"); - } - ; + : RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @12.m_first_seek, + @12.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); + LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMBitmapStretch pBitmap = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, CONVERTER->stack().pop($11)->value().getIdentificator()); + ASSERT(pBitmap); + $$ = CONVERTER->stack().push(pBitmap); + } + | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ',' RDO_IDENTIF ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @14.m_first_seek, + @14.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); + LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMBitmapStretch pBitmap = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, CONVERTER->stack().pop($11)->value().getIdentificator(), CONVERTER->stack().pop($13)->value().getIdentificator()); + ASSERT(pBitmap); + $$ = CONVERTER->stack().push(pBitmap); + } + | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ',' RDO_IDENTIF error + { + CONVERTER->error().error(@13, "Ожидается ']'"); + } + | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ',' error + { + CONVERTER->error().error(@12, @13, "Ожидается имя маски для картинки"); + } + | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF error + { + CONVERTER->error().error(@11, "Ожидается ']'"); + } + | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error + { + CONVERTER->error().error(@10, @11, "Ожидается имя картинки"); + } + | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + CONVERTER->error().error(@9, "Ожидается запятая"); + } + | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + CONVERTER->error().error(@8, @9, "Ожидается высота"); + } + | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + CONVERTER->error().error(@7, "Ожидается запятая"); + } + | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@6, @7, "Ожидается ширина"); + } + | RDO_s_bmp '[' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@5, "Ожидается запятая"); + } + | RDO_s_bmp '[' frm_position_xy ',' error + { + CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + | RDO_s_bmp '[' frm_position_xy error + { + CONVERTER->error().error(@3, "Ожидается запятая"); + } + | RDO_s_bmp '[' error + { + CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); + } + | RDO_s_bmp error + { + CONVERTER->error().error(@1, "Ожидается '['"); + } + ; frm_rect - : RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @14.m_first_seek, - @14.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); - LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = CONVERTER->stack().pop($11); - LPRDOFRMColor pFgColor = CONVERTER->stack().pop($13); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMRect pRect = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pRect); - $$ = CONVERTER->stack().push(pRect); - } - | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @12.m_first_seek, - @12.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); - LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = CONVERTER->stack().pop($11); - LPRDOFRMColor pFgColor = rdo::Factory::create(); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMRect pRect = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pRect); - $$ = CONVERTER->stack().push(pRect); - } - | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @10.m_first_seek, - @10.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); - LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = rdo::Factory::create(); - LPRDOFRMColor pFgColor = rdo::Factory::create(); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMRect pRect = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pRect); - $$ = CONVERTER->stack().push(pRect); - } - | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @8.m_first_seek, - @8.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); - LPRDOFRMPosition pHeight = rdo::Factory::create(rdo::Factory::create(0), RDOFRMPosition::PT_DELTA); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = rdo::Factory::create(); - LPRDOFRMColor pFgColor = rdo::Factory::create(); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMRect pRect = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pRect); - $$ = CONVERTER->stack().push(pRect); - } - | RDO_rect '[' frm_position_xy ',' frm_position_xy ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @6.m_first_seek, - @6.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = rdo::Factory::create(rdo::Factory::create(0), RDOFRMPosition::PT_DELTA); - LPRDOFRMPosition pHeight = rdo::Factory::create(rdo::Factory::create(0), RDOFRMPosition::PT_DELTA); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = rdo::Factory::create(); - LPRDOFRMColor pFgColor = rdo::Factory::create(); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMRect pRect = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pRect); - $$ = CONVERTER->stack().push(pRect); - } - | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error - { - CONVERTER->error().error(@13, "Ожидается ']'"); - } - | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error - { - CONVERTER->error().error(@12, @13, "Ожидается цвет линии прямоугольника"); - } - | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error - { - CONVERTER->error().error(@11, "Ожидается запятая"); - } - | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error - { - CONVERTER->error().error(@10, @11, "Ожидается цвет фона"); - } - | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - CONVERTER->error().error(@9, "Ожидается запятая"); - } - | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - CONVERTER->error().error(@8, @9, "Ожидается высота"); - } - | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - CONVERTER->error().error(@7, "Ожидается запятая"); - } - | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@6, @7, "Ожидается ширина"); - } - | RDO_rect '[' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@5, "Ожидается запятая"); - } - | RDO_rect '[' frm_position_xy ',' error - { - CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - | RDO_rect '[' frm_position_xy error - { - CONVERTER->error().error(@3, "Ожидается запятая"); - } - | RDO_rect '[' error - { - CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); - } - | RDO_rect error - { - CONVERTER->error().error(@1, "Ожидается '['"); - } - ; + : RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @14.m_first_seek, + @14.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); + LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = CONVERTER->stack().pop($11); + LPRDOFRMColor pFgColor = CONVERTER->stack().pop($13); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMRect pRect = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pRect); + $$ = CONVERTER->stack().push(pRect); + } + | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @12.m_first_seek, + @12.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); + LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = CONVERTER->stack().pop($11); + LPRDOFRMColor pFgColor = rdo::Factory::create(); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMRect pRect = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pRect); + $$ = CONVERTER->stack().push(pRect); + } + | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @10.m_first_seek, + @10.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); + LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = rdo::Factory::create(); + LPRDOFRMColor pFgColor = rdo::Factory::create(); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMRect pRect = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pRect); + $$ = CONVERTER->stack().push(pRect); + } + | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @8.m_first_seek, + @8.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); + LPRDOFRMPosition pHeight = rdo::Factory::create(rdo::Factory::create(0), RDOFRMPosition::Type::DELTA); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = rdo::Factory::create(); + LPRDOFRMColor pFgColor = rdo::Factory::create(); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMRect pRect = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pRect); + $$ = CONVERTER->stack().push(pRect); + } + | RDO_rect '[' frm_position_xy ',' frm_position_xy ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @6.m_first_seek, + @6.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = rdo::Factory::create(rdo::Factory::create(0), RDOFRMPosition::Type::DELTA); + LPRDOFRMPosition pHeight = rdo::Factory::create(rdo::Factory::create(0), RDOFRMPosition::Type::DELTA); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = rdo::Factory::create(); + LPRDOFRMColor pFgColor = rdo::Factory::create(); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMRect pRect = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pRect); + $$ = CONVERTER->stack().push(pRect); + } + | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error + { + CONVERTER->error().error(@13, "Ожидается ']'"); + } + | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error + { + CONVERTER->error().error(@12, @13, "Ожидается цвет линии прямоугольника"); + } + | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error + { + CONVERTER->error().error(@11, "Ожидается запятая"); + } + | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error + { + CONVERTER->error().error(@10, @11, "Ожидается цвет фона"); + } + | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + CONVERTER->error().error(@9, "Ожидается запятая"); + } + | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + CONVERTER->error().error(@8, @9, "Ожидается высота"); + } + | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + CONVERTER->error().error(@7, "Ожидается запятая"); + } + | RDO_rect '[' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@6, @7, "Ожидается ширина"); + } + | RDO_rect '[' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@5, "Ожидается запятая"); + } + | RDO_rect '[' frm_position_xy ',' error + { + CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + | RDO_rect '[' frm_position_xy error + { + CONVERTER->error().error(@3, "Ожидается запятая"); + } + | RDO_rect '[' error + { + CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); + } + | RDO_rect error + { + CONVERTER->error().error(@1, "Ожидается '['"); + } + ; frm_r_rect - : RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @14.m_first_seek, - @14.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); - LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = CONVERTER->stack().pop($11); - LPRDOFRMColor pFgColor = CONVERTER->stack().pop($13); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMRectRound pRoundRect = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pRoundRect); - $$ = CONVERTER->stack().push(pRoundRect); - } - | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error - { - CONVERTER->error().error(@13, "Ожидается ']'"); - } - | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error - { - CONVERTER->error().error(@12, @13, "Ожидается цвет линии прямоугольника"); - } - | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error - { - CONVERTER->error().error(@11, "Ожидается запятая"); - } - | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error - { - CONVERTER->error().error(@10, @11, "Ожидается цвет фона"); - } - | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - CONVERTER->error().error(@9, "Ожидается запятая"); - } - | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - CONVERTER->error().error(@8, @9, "Ожидается высота"); - } - | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - CONVERTER->error().error(@7, "Ожидается запятая"); - } - | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@6, @7, "Ожидается ширина"); - } - | RDO_r_rect '[' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@5, "Ожидается запятая"); - } - | RDO_r_rect '[' frm_position_xy ',' error - { - CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - | RDO_r_rect '[' frm_position_xy error - { - CONVERTER->error().error(@3, "Ожидается запятая"); - } - | RDO_r_rect '[' error - { - CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); - } - | RDO_r_rect error - { - CONVERTER->error().error(@1, "Ожидается '['"); - } - ; + : RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @14.m_first_seek, + @14.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); + LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = CONVERTER->stack().pop($11); + LPRDOFRMColor pFgColor = CONVERTER->stack().pop($13); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMRectRound pRoundRect = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pRoundRect); + $$ = CONVERTER->stack().push(pRoundRect); + } + | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error + { + CONVERTER->error().error(@13, "Ожидается ']'"); + } + | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error + { + CONVERTER->error().error(@12, @13, "Ожидается цвет линии прямоугольника"); + } + | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error + { + CONVERTER->error().error(@11, "Ожидается запятая"); + } + | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error + { + CONVERTER->error().error(@10, @11, "Ожидается цвет фона"); + } + | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + CONVERTER->error().error(@9, "Ожидается запятая"); + } + | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + CONVERTER->error().error(@8, @9, "Ожидается высота"); + } + | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + CONVERTER->error().error(@7, "Ожидается запятая"); + } + | RDO_r_rect '[' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@6, @7, "Ожидается ширина"); + } + | RDO_r_rect '[' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@5, "Ожидается запятая"); + } + | RDO_r_rect '[' frm_position_xy ',' error + { + CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + | RDO_r_rect '[' frm_position_xy error + { + CONVERTER->error().error(@3, "Ожидается запятая"); + } + | RDO_r_rect '[' error + { + CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); + } + | RDO_r_rect error + { + CONVERTER->error().error(@1, "Ожидается '['"); + } + ; frm_ellipse - : RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @14.m_first_seek, - @14.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); - LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = CONVERTER->stack().pop($11); - LPRDOFRMColor pFgColor = CONVERTER->stack().pop($13); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMEllipse pEllipse = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pEllipse); - $$ = CONVERTER->stack().push(pEllipse); - } - | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error - { - CONVERTER->error().error(@13, "Ожидается ']'"); - } - | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error - { - CONVERTER->error().error(@12, @13, "Ожидается цвет линии эллипса"); - } - | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error - { - CONVERTER->error().error(@11, "Ожидается запятая"); - } - | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error - { - CONVERTER->error().error(@10, @11, "Ожидается цвет фона"); - } - | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - CONVERTER->error().error(@9, "Ожидается запятая"); - } - | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - CONVERTER->error().error(@8, @9, "Ожидается высота"); - } - | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - CONVERTER->error().error(@7, "Ожидается запятая"); - } - | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@6, @7, "Ожидается ширина"); - } - | RDO_ellipse '[' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@5, "Ожидается запятая"); - } - | RDO_ellipse '[' frm_position_xy ',' error - { - CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - | RDO_ellipse '[' frm_position_xy error - { - CONVERTER->error().error(@3, "Ожидается запятая"); - } - | RDO_ellipse '[' error - { - CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); - } - | RDO_ellipse error - { - CONVERTER->error().error(@1, "Ожидается '['"); - } - ; + : RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @14.m_first_seek, + @14.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); + LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = CONVERTER->stack().pop($11); + LPRDOFRMColor pFgColor = CONVERTER->stack().pop($13); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMEllipse pEllipse = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pEllipse); + $$ = CONVERTER->stack().push(pEllipse); + } + | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error + { + CONVERTER->error().error(@13, "Ожидается ']'"); + } + | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error + { + CONVERTER->error().error(@12, @13, "Ожидается цвет линии эллипса"); + } + | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error + { + CONVERTER->error().error(@11, "Ожидается запятая"); + } + | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error + { + CONVERTER->error().error(@10, @11, "Ожидается цвет фона"); + } + | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + CONVERTER->error().error(@9, "Ожидается запятая"); + } + | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + CONVERTER->error().error(@8, @9, "Ожидается высота"); + } + | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + CONVERTER->error().error(@7, "Ожидается запятая"); + } + | RDO_ellipse '[' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@6, @7, "Ожидается ширина"); + } + | RDO_ellipse '[' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@5, "Ожидается запятая"); + } + | RDO_ellipse '[' frm_position_xy ',' error + { + CONVERTER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + | RDO_ellipse '[' frm_position_xy error + { + CONVERTER->error().error(@3, "Ожидается запятая"); + } + | RDO_ellipse '[' error + { + CONVERTER->error().error(@2, @3, "Ожидается координата по оси X"); + } + | RDO_ellipse error + { + CONVERTER->error().error(@1, "Ожидается '['"); + } + ; frm_line - : RDO_line '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @12.m_first_seek, - @12.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMPosition pX = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY = CONVERTER->stack().pop($5); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); - LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pColor = CONVERTER->stack().pop($11); - ASSERT(pColor); - pColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMLine pLine = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pColor); - ASSERT(pLine); - $$ = CONVERTER->stack().push(pLine); - } - | RDO_line '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color error - { - CONVERTER->error().error(@11, "Ожидается ']'"); - } - | RDO_line '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@10, @11, "Ожидается цвет линии"); - } - | RDO_line '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@9, "Ожидается запятая"); - } - | RDO_line '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@8, @9, "Ожидается Y2"); - } - | RDO_line '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@7, "Ожидается запятая"); - } - | RDO_line '[' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@6, @7, "Ожидается X2"); - } - | RDO_line '[' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@5, "Ожидается запятая"); - } - | RDO_line '[' frm_position_xy ',' error - { - CONVERTER->error().error(@4, @5, "Ожидается Y1"); - } - | RDO_line '[' frm_position_xy error - { - CONVERTER->error().error(@3, "Ожидается запятая"); - } - | RDO_line '[' error - { - CONVERTER->error().error(@2, @3, "Ожидается X1"); - } - | RDO_line error - { - CONVERTER->error().error(@1, "Ожидается '['"); - } - ; + : RDO_line '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @12.m_first_seek, + @12.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMPosition pX = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY = CONVERTER->stack().pop($5); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($7); + LPRDOFRMPosition pHeight = CONVERTER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pColor = CONVERTER->stack().pop($11); + ASSERT(pColor); + pColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMLine pLine = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, pColor); + ASSERT(pLine); + $$ = CONVERTER->stack().push(pLine); + } + | RDO_line '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color error + { + CONVERTER->error().error(@11, "Ожидается ']'"); + } + | RDO_line '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@10, @11, "Ожидается цвет линии"); + } + | RDO_line '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@9, "Ожидается запятая"); + } + | RDO_line '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@8, @9, "Ожидается Y2"); + } + | RDO_line '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@7, "Ожидается запятая"); + } + | RDO_line '[' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@6, @7, "Ожидается X2"); + } + | RDO_line '[' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@5, "Ожидается запятая"); + } + | RDO_line '[' frm_position_xy ',' error + { + CONVERTER->error().error(@4, @5, "Ожидается Y1"); + } + | RDO_line '[' frm_position_xy error + { + CONVERTER->error().error(@3, "Ожидается запятая"); + } + | RDO_line '[' error + { + CONVERTER->error().error(@2, @3, "Ожидается X1"); + } + | RDO_line error + { + CONVERTER->error().error(@1, "Ожидается '['"); + } + ; frm_triang - : RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ',' frm_color ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @18.m_first_seek, - @18.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - LPRDOFRMPosition pX1 = CONVERTER->stack().pop($3); - LPRDOFRMPosition pY1 = CONVERTER->stack().pop($5); - LPRDOFRMPosition pX2 = CONVERTER->stack().pop($7); - LPRDOFRMPosition pY2 = CONVERTER->stack().pop($9); - LPRDOFRMPosition pX3 = CONVERTER->stack().pop($11); - LPRDOFRMPosition pY3 = CONVERTER->stack().pop($13); - ASSERT(pX1); - ASSERT(pY1); - ASSERT(pX2); - ASSERT(pY2); - ASSERT(pX3); - ASSERT(pY3); - LPRDOFRMColor pBgColor = CONVERTER->stack().pop($15); - LPRDOFRMColor pFgColor = CONVERTER->stack().pop($17); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMTriang pTriang = rdo::Factory::create(RUNTIME->lastFrame(), pX1, pY1, pX2, pY2, pX3, pY3, pBgColor, pFgColor); - ASSERT(pTriang); - $$ = CONVERTER->stack().push(pTriang); - } - | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ',' frm_color error - { - CONVERTER->error().error(@17, "Ожидается ']'"); - } - | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ',' error - { - CONVERTER->error().error(@16, @17, "Ожидается цвет линии"); - } - | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color error - { - CONVERTER->error().error(@15, "Ожидается запятая"); - } - | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@14, @15, "Ожидается цвет треугольника"); - } - | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@13, "Ожидается запятая"); - } - | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@12, @13, "Ожидается Y3"); - } - | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@11, "Ожидается запятая"); - } - | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@10, @11, "Ожидается X3"); - } - | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@9, "Ожидается запятая"); - } - | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@8, @9, "Ожидается Y2"); - } - | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@7, "Ожидается запятая"); - } - | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@6, @7, "Ожидается X2"); - } - | RDO_triang '[' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@5, "Ожидается запятая"); - } - | RDO_triang '[' frm_position_xy ',' error - { - CONVERTER->error().error(@4, @5, "Ожидается Y1"); - } - | RDO_triang '[' frm_position_xy error - { - CONVERTER->error().error(@3, "Ожидается запятая"); - } - | RDO_triang '[' error - { - CONVERTER->error().error(@2, @3, "Ожидается X1"); - } - | RDO_triang error - { - CONVERTER->error().error(@1, "Ожидается '['"); - } - ; + : RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ',' frm_color ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @18.m_first_seek, + @18.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + LPRDOFRMPosition pX1 = CONVERTER->stack().pop($3); + LPRDOFRMPosition pY1 = CONVERTER->stack().pop($5); + LPRDOFRMPosition pX2 = CONVERTER->stack().pop($7); + LPRDOFRMPosition pY2 = CONVERTER->stack().pop($9); + LPRDOFRMPosition pX3 = CONVERTER->stack().pop($11); + LPRDOFRMPosition pY3 = CONVERTER->stack().pop($13); + ASSERT(pX1); + ASSERT(pY1); + ASSERT(pX2); + ASSERT(pY2); + ASSERT(pX3); + ASSERT(pY3); + LPRDOFRMColor pBgColor = CONVERTER->stack().pop($15); + LPRDOFRMColor pFgColor = CONVERTER->stack().pop($17); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMTriang pTriang = rdo::Factory::create(RUNTIME->lastFrame(), pX1, pY1, pX2, pY2, pX3, pY3, pBgColor, pFgColor); + ASSERT(pTriang); + $$ = CONVERTER->stack().push(pTriang); + } + | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ',' frm_color error + { + CONVERTER->error().error(@17, "Ожидается ']'"); + } + | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ',' error + { + CONVERTER->error().error(@16, @17, "Ожидается цвет линии"); + } + | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color error + { + CONVERTER->error().error(@15, "Ожидается запятая"); + } + | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@14, @15, "Ожидается цвет треугольника"); + } + | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@13, "Ожидается запятая"); + } + | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@12, @13, "Ожидается Y3"); + } + | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@11, "Ожидается запятая"); + } + | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@10, @11, "Ожидается X3"); + } + | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@9, "Ожидается запятая"); + } + | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@8, @9, "Ожидается Y2"); + } + | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@7, "Ожидается запятая"); + } + | RDO_triang '[' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@6, @7, "Ожидается X2"); + } + | RDO_triang '[' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@5, "Ожидается запятая"); + } + | RDO_triang '[' frm_position_xy ',' error + { + CONVERTER->error().error(@4, @5, "Ожидается Y1"); + } + | RDO_triang '[' frm_position_xy error + { + CONVERTER->error().error(@3, "Ожидается запятая"); + } + | RDO_triang '[' error + { + CONVERTER->error().error(@2, @3, "Ожидается X1"); + } + | RDO_triang error + { + CONVERTER->error().error(@1, "Ожидается '['"); + } + ; frm_active - : RDO_active RDO_IDENTIF '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ']' - { - LPDocUpdate pOpenBraceReplace = rdo::Factory::create( - @3.m_first_seek, - @3.m_last_seek, - "(" - ); - ASSERT(pOpenBraceReplace); - CONVERTER->insertDocUpdate(pOpenBraceReplace); - - LPDocUpdate pCloseBraceReplace = rdo::Factory::create( - @11.m_first_seek, - @11.m_last_seek, - ");" - ); - ASSERT(pCloseBraceReplace); - CONVERTER->insertDocUpdate(pCloseBraceReplace); - - const std::string oprName = CONVERTER->stack().pop($2)->value().getIdentificator(); - LPRDOOPROperation pOperation = CONVERTER->findOPROperation(oprName); - if (!pOperation) - { - LPRDODPTFreeActivity pActivity = CONVERTER->findDPTFreeActivity(oprName); - if (!pActivity) - { - CONVERTER->error().error(@2, rdo::format("Опереация '%s' не найдена", oprName.c_str())); - } - else - { - if (pActivity->pattern()->getType() != RDOPATPattern::PT_Keyboard) - { - CONVERTER->error().push_only(@2, rdo::format("Активность '%s' должна быть клавиатурной", pActivity->name().c_str())); - CONVERTER->error().push_only(pActivity->src_info(), "См. акивность"); - CONVERTER->error().push_only(pActivity->pattern()->src_info(), "См. образец"); - CONVERTER->error().push_done(); - } - } - } - else - { - if (pOperation->pattern()->getType() != RDOPATPattern::PT_Keyboard) - { - CONVERTER->error().push_only(@2, rdo::format("Операция '%s' должна быть клавиатурной", pOperation->name().c_str())); - CONVERTER->error().push_only(pOperation->src_info(), "См. операцию"); - CONVERTER->error().push_only(pOperation->pattern()->src_info(), "См. образец"); - CONVERTER->error().push_done(); - } - } - LPRDOFRMPosition pX = CONVERTER->stack().pop($4); - LPRDOFRMPosition pY = CONVERTER->stack().pop($6); - LPRDOFRMPosition pWidth = CONVERTER->stack().pop($8); - LPRDOFRMPosition pHeight = CONVERTER->stack().pop($10); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMActive pActive = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, oprName); - ASSERT(pActive); - $$ = CONVERTER->stack().push(pActive); - } - | RDO_active RDO_IDENTIF '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - CONVERTER->error().error(@10, "Ожидается ']'"); - } - | RDO_active RDO_IDENTIF '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - CONVERTER->error().error(@9, @10, "Ожидается высота"); - } - | RDO_active RDO_IDENTIF '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - CONVERTER->error().error(@8, "Ожидается запятая"); - } - | RDO_active RDO_IDENTIF '[' frm_position_xy ',' frm_position_xy ',' error - { - CONVERTER->error().error(@7, @8, "Ожидается ширина"); - } - | RDO_active RDO_IDENTIF '[' frm_position_xy ',' frm_position_xy error - { - CONVERTER->error().error(@6, "Ожидается запятая"); - } - | RDO_active RDO_IDENTIF '[' frm_position_xy ',' error - { - CONVERTER->error().error(@5, @6, "Ожидается координата по оси Y"); - } - | RDO_active RDO_IDENTIF '[' frm_position_xy error - { - CONVERTER->error().error(@4, "Ожидается запятая"); - } - | RDO_active RDO_IDENTIF '[' error - { - CONVERTER->error().error(@3, @4, "Ожидается координата по оси X"); - } - | RDO_active RDO_IDENTIF error - { - CONVERTER->error().error(@2, "Ожидается '['"); - } - | RDO_active error - { - CONVERTER->error().error(@1, "Ожидается имя клавиатурной операции"); - } - ; + : RDO_active RDO_IDENTIF '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ']' + { + LPDocUpdate pOpenBraceReplace = rdo::Factory::create( + @3.m_first_seek, + @3.m_last_seek, + "(" + ); + ASSERT(pOpenBraceReplace); + CONVERTER->insertDocUpdate(pOpenBraceReplace); + + LPDocUpdate pCloseBraceReplace = rdo::Factory::create( + @11.m_first_seek, + @11.m_last_seek, + ");" + ); + ASSERT(pCloseBraceReplace); + CONVERTER->insertDocUpdate(pCloseBraceReplace); + + const std::string oprName = CONVERTER->stack().pop($2)->value().getIdentificator(); + LPRDOOPROperation pOperation = CONVERTER->findOPROperation(oprName); + if (!pOperation) + { + LPRDODPTFreeActivity pActivity = CONVERTER->findDPTFreeActivity(oprName); + if (!pActivity) + { + CONVERTER->error().error(@2, rdo::format("Опереация '%s' не найдена", oprName.c_str())); + } + else + { + if (pActivity->pattern()->getType() != RDOPATPattern::Type::KEYBOARD) + { + CONVERTER->error().push_only(@2, rdo::format("Активность '%s' должна быть клавиатурной", pActivity->name().c_str())); + CONVERTER->error().push_only(pActivity->src_info(), "См. акивность"); + CONVERTER->error().push_only(pActivity->pattern()->src_info(), "См. образец"); + CONVERTER->error().push_done(); + } + } + } + else + { + if (pOperation->pattern()->getType() != RDOPATPattern::Type::KEYBOARD) + { + CONVERTER->error().push_only(@2, rdo::format("Операция '%s' должна быть клавиатурной", pOperation->name().c_str())); + CONVERTER->error().push_only(pOperation->src_info(), "См. операцию"); + CONVERTER->error().push_only(pOperation->pattern()->src_info(), "См. образец"); + CONVERTER->error().push_done(); + } + } + LPRDOFRMPosition pX = CONVERTER->stack().pop($4); + LPRDOFRMPosition pY = CONVERTER->stack().pop($6); + LPRDOFRMPosition pWidth = CONVERTER->stack().pop($8); + LPRDOFRMPosition pHeight = CONVERTER->stack().pop($10); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMActive pActive = rdo::Factory::create(RUNTIME->lastFrame(), pX, pY, pWidth, pHeight, oprName); + ASSERT(pActive); + $$ = CONVERTER->stack().push(pActive); + } + | RDO_active RDO_IDENTIF '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + CONVERTER->error().error(@10, "Ожидается ']'"); + } + | RDO_active RDO_IDENTIF '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + CONVERTER->error().error(@9, @10, "Ожидается высота"); + } + | RDO_active RDO_IDENTIF '[' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + CONVERTER->error().error(@8, "Ожидается запятая"); + } + | RDO_active RDO_IDENTIF '[' frm_position_xy ',' frm_position_xy ',' error + { + CONVERTER->error().error(@7, @8, "Ожидается ширина"); + } + | RDO_active RDO_IDENTIF '[' frm_position_xy ',' frm_position_xy error + { + CONVERTER->error().error(@6, "Ожидается запятая"); + } + | RDO_active RDO_IDENTIF '[' frm_position_xy ',' error + { + CONVERTER->error().error(@5, @6, "Ожидается координата по оси Y"); + } + | RDO_active RDO_IDENTIF '[' frm_position_xy error + { + CONVERTER->error().error(@4, "Ожидается запятая"); + } + | RDO_active RDO_IDENTIF '[' error + { + CONVERTER->error().error(@3, @4, "Ожидается координата по оси X"); + } + | RDO_active RDO_IDENTIF error + { + CONVERTER->error().error(@2, "Ожидается '['"); + } + | RDO_active error + { + CONVERTER->error().error(@1, "Ожидается имя клавиатурной операции"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Общие составные токены для всех объектов РДО @@ -1875,488 +1865,488 @@ frm_active // -------------------- Логические выражения // -------------------------------------------------------------------------------- fun_logic_eq - : '=' - { - LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); - ASSERT(pInsert); - CONVERTER->insertDocUpdate(pInsert); - - $$ = RDO_eq; - } - | RDO_eq - { - $$ = RDO_eq; - } - ; + : '=' + { + LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); + ASSERT(pInsert); + CONVERTER->insertDocUpdate(pInsert); + + $$ = RDO_eq; + } + | RDO_eq + { + $$ = RDO_eq; + } + ; fun_logic - : fun_arithm fun_logic_eq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_neq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '<' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '>' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_leq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_geq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_and fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_or fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pArithm); - LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_group - | fun_select_logic - | '[' fun_logic ']' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("[" + pLogic->src_text() + "]"); - $$ = CONVERTER->stack().push(pLogic); - } - | '(' fun_logic ')' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("(" + pLogic->src_text() + ")"); - $$ = CONVERTER->stack().push(pLogic); - } - | RDO_not fun_logic - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - LPRDOFUNLogic pLogicNot = pLogic->operator_not(); - ASSERT(pLogicNot); - pLogicNot->setSrcPos (@1, @2); - pLogicNot->setSrcText("not " + pLogic->src_text()); - $$ = CONVERTER->stack().push(pLogicNot); - } - | '[' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | '(' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - ; + : fun_arithm fun_logic_eq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_neq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '<' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '>' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_leq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_geq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_and fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_or fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pArithm); + LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_group + | fun_select_logic + | '[' fun_logic ']' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("[" + pLogic->src_text() + "]"); + $$ = CONVERTER->stack().push(pLogic); + } + | '(' fun_logic ')' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("(" + pLogic->src_text() + ")"); + $$ = CONVERTER->stack().push(pLogic); + } + | RDO_not fun_logic + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + LPRDOFUNLogic pLogicNot = pLogic->operator_not(); + ASSERT(pLogicNot); + pLogicNot->setSrcPos (@1, @2); + pLogicNot->setSrcText("not " + pLogic->src_text()); + $$ = CONVERTER->stack().push(pLogicNot); + } + | '[' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | '(' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Арифметические выражения // -------------------------------------------------------------------------------- fun_arithm - : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | fun_arithm '+' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '-' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '*' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '/' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm_func_call - | fun_select_arithm - | '(' fun_arithm ')' - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - pArithm->setSrcPos (@1, @3); - pArithm->setSrcText("(" + pArithm->src_text() + ")"); - $$ = CONVERTER->stack().push(pArithm); - } - | '-' fun_arithm %prec RDO_UMINUS - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - RDOParserSrcInfo info; - info.setSrcPos (@1, @2); - info.setSrcText("-" + pArithm->src_text()); - $$ = CONVERTER->stack().push( - rdo::Factory::create( - rdo::Factory::create(pArithm->type(), info), - rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() - ) - ); - } - ; + : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | fun_arithm '+' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '-' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '*' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '/' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm_func_call + | fun_select_arithm + | '(' fun_arithm ')' + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + pArithm->setSrcPos (@1, @3); + pArithm->setSrcText("(" + pArithm->src_text() + ")"); + $$ = CONVERTER->stack().push(pArithm); + } + | '-' fun_arithm %prec RDO_UMINUS + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + RDOParserSrcInfo info; + info.setSrcPos (@1, @2); + info.setSrcText("-" + pArithm->src_text()); + $$ = CONVERTER->stack().push( + rdo::Factory::create( + rdo::Factory::create(pArithm->type(), info), + rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() + ) + ); + } + ; // -------------------------------------------------------------------------------- // -------------------- Функции и последовательности // -------------------------------------------------------------------------------- fun_arithm_func_call - : RDO_IDENTIF '(' ')' - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @3); - pFunParams->setSrcText(funName + "()"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @4); - pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' error - { - CONVERTER->error().error(@3, "Ошибка в параметрах функции"); - } - ; + : RDO_IDENTIF '(' ')' + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @3); + pFunParams->setSrcText(funName + "()"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @4); + pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' error + { + CONVERTER->error().error(@3, "Ошибка в параметрах функции"); + } + ; fun_arithm_func_call_pars - : fun_arithm - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars ',' fun_arithm - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars error - { - CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); - } - | fun_arithm_func_call_pars ',' error - { - CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); - } - ; + : fun_arithm + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars ',' fun_arithm + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars error + { + CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); + } + | fun_arithm_func_call_pars ',' error + { + CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Групповые выражения // -------------------------------------------------------------------------------- fun_group_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_group_header - : fun_group_keyword '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - $$ = CONVERTER->stack().push(rdo::Factory::create((RDOFUNGroupLogic::FunGroupType)$1, pValue->src_info())); - } - | fun_group_keyword '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | fun_group_keyword error - { - CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); - } - ; + : fun_group_keyword '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + $$ = CONVERTER->stack().push(rdo::Factory::create(static_cast($1), pValue->src_info())); + } + | fun_group_keyword '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | fun_group_keyword error + { + CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); + } + ; fun_group - : fun_group_header fun_logic ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pGroupFun); - ASSERT(pLogic ); - pGroupFun->setSrcPos(@1, @3); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); - } - | fun_group_header RDO_NoCheck ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - ASSERT(pGroupFun); - pGroupFun->setSrcPos(@1, @3); - LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); - ASSERT(pTrueLogic); - pTrueLogic->setSrcPos (@2); - pTrueLogic->setSrcText("NoCheck"); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); - } - | fun_group_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_group_header fun_logic ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pGroupFun); + ASSERT(pLogic ); + pGroupFun->setSrcPos(@1, @3); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); + } + | fun_group_header RDO_NoCheck ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + ASSERT(pGroupFun); + pGroupFun->setSrcPos(@1, @3); + LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); + ASSERT(pTrueLogic); + pTrueLogic->setSrcPos (@2); + pTrueLogic->setSrcText("NoCheck"); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); + } + | fun_group_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Select // -------------------------------------------------------------------------------- fun_select_header - : RDO_Select '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); - ASSERT(pSelect); - pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); - $$ = CONVERTER->stack().push(pSelect); - } - | RDO_Select '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | RDO_Select error - { - CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); - } - ; + : RDO_Select '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); + ASSERT(pSelect); + pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); + $$ = CONVERTER->stack().push(pSelect); + } + | RDO_Select '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | RDO_Select error + { + CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); + } + ; fun_select_body - : fun_select_header fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header RDO_NoCheck ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - RDOParserSrcInfo logicInfo(@2, "NoCheck"); - pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); - rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); - ASSERT(pCalc); - LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); - ASSERT(pLogic); - pLogic->setSrcInfo(logicInfo); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_select_header fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header RDO_NoCheck ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + RDOParserSrcInfo logicInfo(@2, "NoCheck"); + pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); + rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); + ASSERT(pCalc); + LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); + ASSERT(pLogic); + pLogic->setSrcInfo(logicInfo); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; fun_select_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_select_logic - : fun_select_body '.' fun_select_keyword '(' fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcPos(@1, @6); - LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup((RDOFUNGroupLogic::FunGroupType)$3, pLogic); - ASSERT(pLogicSelect); - $$ = CONVERTER->stack().push(pLogicSelect); - } - | fun_select_body '.' fun_select_keyword '(' error - { - CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); - } - | fun_select_body '.' fun_select_keyword error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); - LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); - ASSERT(pLogic); - $$ = CONVERTER->stack().push(pLogic); - } - | fun_select_body '.' RDO_Empty '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' error - { - CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); - } - | fun_select_body error - { - CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); - } - ; + : fun_select_body '.' fun_select_keyword '(' fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcPos(@1, @6); + LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup(static_cast($3), pLogic); + ASSERT(pLogicSelect); + $$ = CONVERTER->stack().push(pLogicSelect); + } + | fun_select_body '.' fun_select_keyword '(' error + { + CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); + } + | fun_select_body '.' fun_select_keyword error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); + LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); + ASSERT(pLogic); + $$ = CONVERTER->stack().push(pLogic); + } + | fun_select_body '.' RDO_Empty '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' error + { + CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); + } + | fun_select_body error + { + CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); + } + ; fun_select_arithm - : fun_select_body '.' RDO_Size '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); - LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | fun_select_body '.' RDO_Size error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Size '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - ; + : fun_select_body '.' RDO_Size '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); + LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | fun_select_body '.' RDO_Size error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Size '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + ; %% diff --git a/converter/smr2rdox/grammar/rdofun.y b/converter/smr2rdox/grammar/rdofun.y index 7422e0882..e280984e2 100644 --- a/converter/smr2rdox/grammar/rdofun.y +++ b/converter/smr2rdox/grammar/rdofun.y @@ -1,13 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdofun.y - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \date - \brief - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -16,175 +6,175 @@ %pure-parser %param {void* lexer} -%token RDO_Resource_type 257 -%token RDO_permanent 258 -%token RDO_Parameters 259 -%token RDO_integer 260 -%token RDO_real 261 -%token RDO_End 262 -%token RDO_temporary 263 -%token RDO_IDENTIF 264 -%token RDO_INT_CONST 265 -%token RDO_REAL_CONST 266 -%token RDO_such_as 267 -%token RDO_dblpoint 268 -%token RDO_Resources 269 -%token RDO_trace 270 -%token RDO_no_trace 271 -%token RDO_IDENTIF_COLON 272 -%token RDO_Constant 273 -%token RDO_Body 274 -%token RDO_Function 275 -%token RDO_Type 276 -%token RDO_algorithmic 277 -%token RDO_table 278 -%token RDO_list 279 -%token RDO_Exist 281 -%token RDO_Not_Exist 282 -%token RDO_For_All 283 -%token RDO_Not_For_All 284 -%token RDO_neq 285 -%token RDO_leq 286 -%token RDO_geq 287 -%token RDO_NoCheck 288 -%token RDO_Calculate_if 289 -%token RDO_or 290 -%token RDO_and 291 -%token RDO_Sequence 292 -%token RDO_uniform 293 -%token RDO_exponential 294 -%token RDO_normal 295 -%token RDO_by_hist 296 -%token RDO_enumerative 297 - -%token RDO_Pattern 298 -%token RDO_operation 299 -%token RDO_irregular_event 300 -%token RDO_rule 301 -%token RDO_keyboard 302 -%token RDO_Relevant_resources 303 -%token RDO_Keep 304 -%token RDO_Create 305 -%token RDO_Erase 306 -%token RDO_NonExist 307 -%token RDO_IDENTIF_NoChange 308 -%token RDO_Time 309 -%token RDO_Choice 310 -%token RDO_from 311 -%token RDO_first 312 -%token RDO_Convert_begin 313 -%token RDO_Convert_end 314 -%token RDO_Convert_rule 315 -%token RDO_Convert_event 316 -%token RDO_with_max 317 -%token RDO_with_min 318 -%token RDO_set 319 -%token RDO_IDENTIF_NoChange_NoChange 320 -%token RDO_Operations 321 - -%token RDO_Results 322 -%token RDO_watch_par 323 -%token RDO_watch_state 324 -%token RDO_watch_quant 325 -%token RDO_watch_value 326 -%token RDO_get_value 327 - -%token RDO_Model_name 328 -%token RDO_Resource_file 329 -%token RDO_OprIev_file 330 -%token RDO_Frame_file 331 -%token RDO_Statistic_file 332 -%token RDO_Results_file 333 -%token RDO_Trace_file 334 -%token RDO_Show_mode 335 -%token RDO_Frame_number 336 -%token RDO_Show_rate 337 -%token RDO_Run_StartTime 338 -%token RDO_Trace_StartTime 339 -%token RDO_Trace_EndTime 340 -%token RDO_Terminate_if 341 -%token RDO_Break_point 342 -%token RDO_Seed 343 -%token RDO_NoShow 344 -%token RDO_Monitor 345 -%token RDO_Animation 346 -%token RDO_NoChange 347 - -%token RDO_Decision_point 348 -%token RDO_search 349 -%token RDO_trace_stat 350 -%token RDO_trace_tops 351 -%token RDO_trace_all 352 -%token RDO_Condition 353 -%token RDO_Term_condition 354 -%token RDO_Evaluate_by 355 -%token RDO_Compare_tops 356 -%token RDO_NO 357 -%token RDO_YES 358 -%token RDO_Activities 359 -%token RDO_value_before 360 -%token RDO_value_after 361 -%token RDO_some 362 -%token RDO_Process 363 -%token RDO_SEIZE 364 -%token RDO_GENERATE 365 -%token RDO_TERMINATE 366 -%token RDO_ADVANCE 367 -%token RDO_RELEASE 368 -%token RDO_if 369 -%token RDO_CF 370 -%token RDO_Priority 371 -%token RDO_prior 372 -%token RDO_Parent 373 - -%token RDO_Frame 400 -%token RDO_Show_if 401 -%token RDO_Back_picture 402 -%token RDO_Show 403 -%token RDO_frm_cell 404 -%token RDO_text 405 -%token RDO_bitmap 406 -%token RDO_s_bmp 407 -%token RDO_rect 408 -%token RDO_r_rect 409 -%token RDO_line 410 -%token RDO_ellipse 411 -%token RDO_triang 412 -%token RDO_active 413 -%token RDO_ruler 414 -%token RDO_space 415 -%token RDO_color_transparent 416 -%token RDO_color_last 417 -%token RDO_color_white 418 -%token RDO_color_black 419 -%token RDO_color_red 420 -%token RDO_color_green 421 -%token RDO_color_blue 422 -%token RDO_color_cyan 423 -%token RDO_color_magenta 424 -%token RDO_color_yellow 425 -%token RDO_color_gray 426 - -%token RDO_IDENTIF_RELRES 427 -%token RDO_typedef 428 -%token RDO_enum 429 - -%token RDO_STRING_CONST 430 -%token RDO_Select 431 -%token RDO_Size 432 -%token RDO_Empty 433 -%token RDO_not 434 -%token RDO_UMINUS 435 -%token RDO_string 436 -%token RDO_bool 437 -%token RDO_BOOL_CONST 438 -%token RDO_Fuzzy 439 -%token RDO_Fuzzy_Term 440 -%token RDO_eq 441 -%token RDO_External_Model 442 -%token RDO_QUEUE 443 -%token RDO_DEPART 444 -%token RDO_ASSIGN 445 +%token RDO_Resource_type 257 +%token RDO_permanent 258 +%token RDO_Parameters 259 +%token RDO_integer 260 +%token RDO_real 261 +%token RDO_End 262 +%token RDO_temporary 263 +%token RDO_IDENTIF 264 +%token RDO_INT_CONST 265 +%token RDO_REAL_CONST 266 +%token RDO_such_as 267 +%token RDO_dblpoint 268 +%token RDO_Resources 269 +%token RDO_trace 270 +%token RDO_no_trace 271 +%token RDO_IDENTIF_COLON 272 +%token RDO_Constant 273 +%token RDO_Body 274 +%token RDO_Function 275 +%token RDO_Type 276 +%token RDO_algorithmic 277 +%token RDO_table 278 +%token RDO_list 279 +%token RDO_Exist 281 +%token RDO_Not_Exist 282 +%token RDO_For_All 283 +%token RDO_Not_For_All 284 +%token RDO_neq 285 +%token RDO_leq 286 +%token RDO_geq 287 +%token RDO_NoCheck 288 +%token RDO_Calculate_if 289 +%token RDO_or 290 +%token RDO_and 291 +%token RDO_Sequence 292 +%token RDO_uniform 293 +%token RDO_exponential 294 +%token RDO_normal 295 +%token RDO_by_hist 296 +%token RDO_enumerative 297 + +%token RDO_Pattern 298 +%token RDO_operation 299 +%token RDO_irregular_event 300 +%token RDO_rule 301 +%token RDO_keyboard 302 +%token RDO_Relevant_resources 303 +%token RDO_Keep 304 +%token RDO_Create 305 +%token RDO_Erase 306 +%token RDO_NonExist 307 +%token RDO_IDENTIF_NoChange 308 +%token RDO_Time 309 +%token RDO_Choice 310 +%token RDO_from 311 +%token RDO_first 312 +%token RDO_Convert_begin 313 +%token RDO_Convert_end 314 +%token RDO_Convert_rule 315 +%token RDO_Convert_event 316 +%token RDO_with_max 317 +%token RDO_with_min 318 +%token RDO_set 319 +%token RDO_IDENTIF_NoChange_NoChange 320 +%token RDO_Operations 321 + +%token RDO_Results 322 +%token RDO_watch_par 323 +%token RDO_watch_state 324 +%token RDO_watch_quant 325 +%token RDO_watch_value 326 +%token RDO_get_value 327 + +%token RDO_Model_name 328 +%token RDO_Resource_file 329 +%token RDO_OprIev_file 330 +%token RDO_Frame_file 331 +%token RDO_Statistic_file 332 +%token RDO_Results_file 333 +%token RDO_Trace_file 334 +%token RDO_Show_mode 335 +%token RDO_Frame_number 336 +%token RDO_Show_rate 337 +%token RDO_Run_StartTime 338 +%token RDO_Trace_StartTime 339 +%token RDO_Trace_EndTime 340 +%token RDO_Terminate_if 341 +%token RDO_Break_point 342 +%token RDO_Seed 343 +%token RDO_NoShow 344 +%token RDO_Monitor 345 +%token RDO_Animation 346 +%token RDO_NoChange 347 + +%token RDO_Decision_point 348 +%token RDO_search 349 +%token RDO_trace_stat 350 +%token RDO_trace_tops 351 +%token RDO_trace_all 352 +%token RDO_Condition 353 +%token RDO_Term_condition 354 +%token RDO_Evaluate_by 355 +%token RDO_Compare_tops 356 +%token RDO_NO 357 +%token RDO_YES 358 +%token RDO_Activities 359 +%token RDO_value_before 360 +%token RDO_value_after 361 +%token RDO_some 362 +%token RDO_Process 363 +%token RDO_SEIZE 364 +%token RDO_GENERATE 365 +%token RDO_TERMINATE 366 +%token RDO_ADVANCE 367 +%token RDO_RELEASE 368 +%token RDO_if 369 +%token RDO_CF 370 +%token RDO_Priority 371 +%token RDO_prior 372 +%token RDO_Parent 373 + +%token RDO_Frame 400 +%token RDO_Show_if 401 +%token RDO_Back_picture 402 +%token RDO_Show 403 +%token RDO_frm_cell 404 +%token RDO_text 405 +%token RDO_bitmap 406 +%token RDO_s_bmp 407 +%token RDO_rect 408 +%token RDO_r_rect 409 +%token RDO_line 410 +%token RDO_ellipse 411 +%token RDO_triang 412 +%token RDO_active 413 +%token RDO_ruler 414 +%token RDO_space 415 +%token RDO_color_transparent 416 +%token RDO_color_last 417 +%token RDO_color_white 418 +%token RDO_color_black 419 +%token RDO_color_red 420 +%token RDO_color_green 421 +%token RDO_color_blue 422 +%token RDO_color_cyan 423 +%token RDO_color_magenta 424 +%token RDO_color_yellow 425 +%token RDO_color_gray 426 + +%token RDO_IDENTIF_RELRES 427 +%token RDO_typedef 428 +%token RDO_enum 429 + +%token RDO_STRING_CONST 430 +%token RDO_Select 431 +%token RDO_Size 432 +%token RDO_Empty 433 +%token RDO_not 434 +%token RDO_UMINUS 435 +%token RDO_string 436 +%token RDO_bool 437 +%token RDO_BOOL_CONST 438 +%token RDO_Fuzzy 439 +%token RDO_Fuzzy_Term 440 +%token RDO_eq 441 +%token RDO_External_Model 442 +%token RDO_QUEUE 443 +%token RDO_DEPART 444 +%token RDO_ASSIGN 445 %{ @@ -220,1344 +210,1344 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE %% fun_list - : fun_consts fun_func_seq - | error - { - if (CONVERTER->getFUNConstants().empty()) - { - CONVERTER->error().error(@1, "Ожидается описание функции, последовательности или константы"); - } - else - { - CONVERTER->error().error(@1, "Ожидается описание функции или последовательности"); - } - } - ; + : fun_consts fun_func_seq + | error + { + if (CONVERTER->getFUNConstants().empty()) + { + CONVERTER->error().error(@1, "Ожидается описание функции, последовательности или константы"); + } + else + { + CONVERTER->error().error(@1, "Ожидается описание функции или последовательности"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Константы // -------------------------------------------------------------------------------- fun_consts - : /* empty */ - | RDO_Constant fun_const_body RDO_End - | RDO_Constant fun_const_body - { - CONVERTER->error().error(@2, "После описания констант ожидается ключевое слово $End"); - } - ; + : /* empty */ + | RDO_Constant fun_const_body RDO_End + | RDO_Constant fun_const_body + { + CONVERTER->error().error(@2, "После описания констант ожидается ключевое слово $End"); + } + ; fun_const_body - : /* empty */ - | fun_const_body fun_const_param_desc - | fun_const_body error - { - CONVERTER->error().error(@2, "Ожидается описание константы"); - } - ; + : /* empty */ + | fun_const_body fun_const_param_desc + | fun_const_body error + { + CONVERTER->error().error(@2, "Ожидается описание константы"); + } + ; fun_const_param_desc - : RDO_IDENTIF_COLON param_type param_value_default - { - LPRDOValue pName = CONVERTER->stack().pop($1); - CONVERTER->checkFunctionName(pName->src_info()); - LPRDOTypeParam pParamType = CONVERTER->stack().pop($2); - ASSERT(pParamType); - LPRDOFUNConstant pConstant = rdo::Factory::create(pName->src_info(), pParamType, CONVERTER->stack().pop($3)); - ASSERT(pConstant); - RUNTIME->setConstValue(pConstant->getNumber(), pConstant->getDefault()->value()); - $$ = CONVERTER->stack().push(pConstant); - } - | RDO_IDENTIF_COLON - { - CONVERTER->error().error(@1, "Ожидается тип константы"); - } - | RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@2, "Ошибка описания типа константы"); - } - ; + : RDO_IDENTIF_COLON param_type param_value_default + { + LPRDOValue pName = CONVERTER->stack().pop($1); + CONVERTER->checkFunctionName(pName->src_info()); + LPRDOTypeParam pParamType = CONVERTER->stack().pop($2); + ASSERT(pParamType); + LPRDOFUNConstant pConstant = rdo::Factory::create(pName->src_info(), pParamType, CONVERTER->stack().pop($3)); + ASSERT(pConstant); + RUNTIME->setConstValue(pConstant->getNumber(), pConstant->getDefault()->value()); + $$ = CONVERTER->stack().push(pConstant); + } + | RDO_IDENTIF_COLON + { + CONVERTER->error().error(@1, "Ожидается тип константы"); + } + | RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@2, "Ошибка описания типа константы"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Последовательности и функции // -------------------------------------------------------------------------------- fun_func_seq - : /* empty */ - | fun_func_seq fun_func_descr - | fun_func_seq fun_seq_descr - | fun_func_seq RDO_Constant - { - CONVERTER->error().error(@2, "Константы долны быть описаны первыми, перед функциями и последовательностями"); - } - ; + : /* empty */ + | fun_func_seq fun_func_descr + | fun_func_seq fun_seq_descr + | fun_func_seq RDO_Constant + { + CONVERTER->error().error(@2, "Константы долны быть описаны первыми, перед функциями и последовательностями"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Функции // -------------------------------------------------------------------------------- fun_func_descr - : fun_func_header fun_func_footer - | fun_func_header error - { - LPRDOFUNFunction pFunction = CONVERTER->stack().pop($1); - ASSERT(pFunction); - CONVERTER->error().error(@2, rdo::format("Ожидается ключевое слово $Type с указанием типа функции '%s'", pFunction->name().c_str())); - } - ; + : fun_func_header fun_func_footer + | fun_func_header error + { + LPRDOFUNFunction pFunction = CONVERTER->stack().pop($1); + ASSERT(pFunction); + CONVERTER->error().error(@2, rdo::format("Ожидается ключевое слово $Type с указанием типа функции '%s'", pFunction->name().c_str())); + } + ; fun_func_header - : RDO_Function RDO_IDENTIF_COLON param_type param_value_default - { - LPRDOValue pName = CONVERTER->stack().pop($2); - CONVERTER->checkFunctionName(pName->src_info()); - LPRDOTypeParam pRetType = CONVERTER->stack().pop($3); - ASSERT(pRetType); - LPRDOParam pReturn = rdo::Factory::create(pName->src_info(), pRetType, CONVERTER->stack().pop($4)); - ASSERT(pReturn); - LPRDOFUNFunction pFunction = rdo::Factory::create(pName->src_info(), pReturn); - ASSERT(pFunction); - $$ = CONVERTER->stack().push(pFunction); - } - | RDO_Function RDO_IDENTIF_COLON error - { - const std::string name = CONVERTER->stack().pop($2)->value().getIdentificator(); - CONVERTER->error().error(@3, rdo::format("Ожидается тип возвращаемого значения функции '%s'", name.c_str())); - } - | RDO_Function error - { - CONVERTER->error().error(@2, "После ключевого слова $Function ожидается имя фунции"); - } - ; + : RDO_Function RDO_IDENTIF_COLON param_type param_value_default + { + LPRDOValue pName = CONVERTER->stack().pop($2); + CONVERTER->checkFunctionName(pName->src_info()); + LPRDOTypeParam pRetType = CONVERTER->stack().pop($3); + ASSERT(pRetType); + LPRDOParam pReturn = rdo::Factory::create(pName->src_info(), pRetType, CONVERTER->stack().pop($4)); + ASSERT(pReturn); + LPRDOFUNFunction pFunction = rdo::Factory::create(pName->src_info(), pReturn); + ASSERT(pFunction); + $$ = CONVERTER->stack().push(pFunction); + } + | RDO_Function RDO_IDENTIF_COLON error + { + const std::string name = CONVERTER->stack().pop($2)->value().getIdentificator(); + CONVERTER->error().error(@3, rdo::format("Ожидается тип возвращаемого значения функции '%s'", name.c_str())); + } + | RDO_Function error + { + CONVERTER->error().error(@2, "После ключевого слова $Function ожидается имя фунции"); + } + ; fun_func_parameters - : /* empty */ - | RDO_Parameters fun_func_params - ; + : /* empty */ + | RDO_Parameters fun_func_params + ; fun_func_params - : /* empty */ - | fun_func_params RDO_IDENTIF_COLON param_type param_value_default - { - LPRDOValue pName = CONVERTER->stack().pop($2); - LPRDOTypeParam pType = CONVERTER->stack().pop($3); - ASSERT(pType); - LPRDOParam pParam = rdo::Factory::create(pName->src_info(), pType, CONVERTER->stack().pop($4)); - ASSERT(pParam); - CONVERTER->getLastFUNFunction()->add(pParam); - } - | fun_func_params RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@3, "Ожидается тип параметра функции"); - } - | fun_func_params error - { - CONVERTER->error().error(@2, "Ожидается описание параметра функции в формате <имя>: <тип>"); - } - ; + : /* empty */ + | fun_func_params RDO_IDENTIF_COLON param_type param_value_default + { + LPRDOValue pName = CONVERTER->stack().pop($2); + LPRDOTypeParam pType = CONVERTER->stack().pop($3); + ASSERT(pType); + LPRDOParam pParam = rdo::Factory::create(pName->src_info(), pType, CONVERTER->stack().pop($4)); + ASSERT(pParam); + CONVERTER->getLastFUNFunction()->add(pParam); + } + | fun_func_params RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@3, "Ожидается тип параметра функции"); + } + | fun_func_params error + { + CONVERTER->error().error(@2, "Ожидается описание параметра функции в формате <имя>: <тип>"); + } + ; fun_func_footer - : RDO_Type '=' RDO_algorithmic fun_func_parameters RDO_Body fun_func_algorithmic_body RDO_End - { - LPRDOFUNFunction pFunction = CONVERTER->getLastFUNFunction(); - ASSERT(pFunction); - pFunction->createAlgorithmicCalc(@5); - } - | RDO_Type '=' RDO_list fun_func_parameters RDO_Body fun_func_list_body RDO_End - { - LPRDOFUNFunction pFunction = CONVERTER->getLastFUNFunction(); - ASSERT(pFunction); - pFunction->createListCalc(); - } - | RDO_Type '=' RDO_table fun_func_parameters RDO_Body fun_func_list_body RDO_End - { - LPRDOFUNFunction pFunction = CONVERTER->getLastFUNFunction(); - ASSERT(pFunction); - pFunction->createTableCalc(@6); - } - | RDO_Type '=' RDO_algorithmic fun_func_parameters RDO_Body fun_func_algorithmic_body error - { - CONVERTER->error().error(@7, "Ожидается ключевое слово $End"); - } - | RDO_Type '=' RDO_list fun_func_parameters RDO_Body fun_func_list_body error - { - CONVERTER->error().error(@7, "Ожидается ключевое слово $End"); - } - | RDO_Type '=' RDO_table fun_func_parameters RDO_Body fun_func_list_body error - { - CONVERTER->error().error(@7, "Ожидается ключевое слово $End"); - } - | RDO_Type '=' RDO_algorithmic error - { - CONVERTER->error().error(@4, "Ожидается ключевое слово $Parameters"); - } - | RDO_Type '=' RDO_list error - { - CONVERTER->error().error(@4, "Ожидается ключевое слово $Parameters"); - } - | RDO_Type '=' RDO_table error - { - CONVERTER->error().error(@4, "Ожидается ключевое слово $Parameters"); - } - | RDO_Type '=' error - { - CONVERTER->error().error(@3, "Неизвестный тип функции"); - } - | RDO_Type error - { - CONVERTER->error().error(@2, "После ключевого слова $Type ожидается тип функции"); - } - ; + : RDO_Type '=' RDO_algorithmic fun_func_parameters RDO_Body fun_func_algorithmic_body RDO_End + { + LPRDOFUNFunction pFunction = CONVERTER->getLastFUNFunction(); + ASSERT(pFunction); + pFunction->createAlgorithmicCalc(@5); + } + | RDO_Type '=' RDO_list fun_func_parameters RDO_Body fun_func_list_body RDO_End + { + LPRDOFUNFunction pFunction = CONVERTER->getLastFUNFunction(); + ASSERT(pFunction); + pFunction->createListCalc(); + } + | RDO_Type '=' RDO_table fun_func_parameters RDO_Body fun_func_list_body RDO_End + { + LPRDOFUNFunction pFunction = CONVERTER->getLastFUNFunction(); + ASSERT(pFunction); + pFunction->createTableCalc(@6); + } + | RDO_Type '=' RDO_algorithmic fun_func_parameters RDO_Body fun_func_algorithmic_body error + { + CONVERTER->error().error(@7, "Ожидается ключевое слово $End"); + } + | RDO_Type '=' RDO_list fun_func_parameters RDO_Body fun_func_list_body error + { + CONVERTER->error().error(@7, "Ожидается ключевое слово $End"); + } + | RDO_Type '=' RDO_table fun_func_parameters RDO_Body fun_func_list_body error + { + CONVERTER->error().error(@7, "Ожидается ключевое слово $End"); + } + | RDO_Type '=' RDO_algorithmic error + { + CONVERTER->error().error(@4, "Ожидается ключевое слово $Parameters"); + } + | RDO_Type '=' RDO_list error + { + CONVERTER->error().error(@4, "Ожидается ключевое слово $Parameters"); + } + | RDO_Type '=' RDO_table error + { + CONVERTER->error().error(@4, "Ожидается ключевое слово $Parameters"); + } + | RDO_Type '=' error + { + CONVERTER->error().error(@3, "Неизвестный тип функции"); + } + | RDO_Type error + { + CONVERTER->error().error(@2, "После ключевого слова $Type ожидается тип функции"); + } + ; fun_func_algorithmic_body - : /* empty */ - | fun_func_algorithmic_body fun_func_algorithmic_calc_if - { - LPRDOFUNCalculateIf pCalculateIf = CONVERTER->stack().pop($2); - ASSERT(pCalculateIf); - CONVERTER->getLastFUNFunction()->add(pCalculateIf); - } - ; + : /* empty */ + | fun_func_algorithmic_body fun_func_algorithmic_calc_if + { + LPRDOFUNCalculateIf pCalculateIf = CONVERTER->stack().pop($2); + ASSERT(pCalculateIf); + CONVERTER->getLastFUNFunction()->add(pCalculateIf); + } + ; fun_func_calc_if - : RDO_Calculate_if - | RDO_if - ; + : RDO_Calculate_if + | RDO_if + ; fun_func_calc_name - : RDO_IDENTIF - { - const std::string name = CONVERTER->stack().pop($1)->value().getIdentificator(); - if (name != CONVERTER->getLastFUNFunction()->name() && name != "result") - { - CONVERTER->error().error(@1, rdo::format("Ожидается имя функции '%s'", CONVERTER->getLastFUNFunction()->name().c_str())); - } - } - ; + : RDO_IDENTIF + { + const std::string name = CONVERTER->stack().pop($1)->value().getIdentificator(); + if (name != CONVERTER->getLastFUNFunction()->name() && name != "result") + { + CONVERTER->error().error(@1, rdo::format("Ожидается имя функции '%s'", CONVERTER->getLastFUNFunction()->name().c_str())); + } + } + ; fun_func_algorithmic_calc_if - : fun_func_calc_if fun_logic fun_func_calc_name '=' fun_arithm - { - LPDocUpdate pIFReplace = rdo::Factory::create( - @1.m_first_seek, - @1.m_last_seek, - "if" - ); - ASSERT(pIFReplace); - CONVERTER->insertDocUpdate(pIFReplace); - - LPDocUpdate pIFInsertOpenBrace = rdo::Factory::create( - @2.m_first_seek, - "(" - ); - ASSERT(pIFInsertOpenBrace); - CONVERTER->insertDocUpdate(pIFInsertOpenBrace); - - LPDocUpdate pIFInsertCloseBrace = rdo::Factory::create( - @2.m_last_seek, - ")" - ); - ASSERT(pIFInsertCloseBrace); - CONVERTER->insertDocUpdate(pIFInsertCloseBrace); - - LPDocUpdate pReturnReplace = rdo::Factory::create( - @3.m_first_seek, - @4.m_last_seek, - "return" - ); - ASSERT(pReturnReplace); - CONVERTER->insertDocUpdate(pReturnReplace); - - LPDocUpdate pSemicolonInsert = rdo::Factory::create( - @5.m_last_seek, - ";" - ); - ASSERT(pSemicolonInsert); - CONVERTER->insertDocUpdate(pSemicolonInsert); - - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcText("Calculate_if " + pLogic->src_text()); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($5); - ASSERT(pArithm); - LPRDOFUNCalculateIf pCalculateIf = rdo::Factory::create(pLogic, pArithm); - ASSERT(pCalculateIf); - $$ = CONVERTER->stack().push(pCalculateIf); - } - | fun_func_calc_if fun_logic fun_func_calc_name '=' error - { - CONVERTER->error().error(@5, "Ошибка в арифметическом выражении"); - } - | fun_func_calc_name '=' fun_arithm - { - rdo::runtime::LPRDOCalc pCondition = rdo::Factory::create(1); - RDOParserSrcInfo logic_src_info("Calculate_if 1 = 1"); - logic_src_info.setSrcPos( @1.m_first_line, @1.m_first_pos, @1.m_first_line, @1.m_first_pos ); - pCondition->setSrcInfo( logic_src_info ); - LPRDOFUNLogic pLogic = rdo::Factory::create(pCondition, true); - pLogic->setSrcInfo( logic_src_info ); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pArithm); - LPRDOFUNCalculateIf pCalculateIf = rdo::Factory::create(pLogic, pArithm); - ASSERT(pCalculateIf); - $$ = CONVERTER->stack().push(pCalculateIf); - } - | fun_func_calc_name '=' error - { - CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); - } - | fun_func_calc_if fun_logic fun_func_calc_name error - { - CONVERTER->error().error(@4, "Ожидается '='"); - } - | fun_func_calc_name error - { - CONVERTER->error().error(@2, "Ожидается '='"); - } - | fun_func_calc_if fun_logic error - { - CONVERTER->error().error(@2, @3, "После логического выражения ожидается <имя_функции> = <результат_функции>"); - } - | fun_func_calc_if error - { - CONVERTER->error().error(@2, "Ошибка в логическом выражении"); - } - | error - { - CONVERTER->error().error(@1, "Ожидается ключевое слово Calculate_if"); - } - ; + : fun_func_calc_if fun_logic fun_func_calc_name '=' fun_arithm + { + LPDocUpdate pIFReplace = rdo::Factory::create( + @1.m_first_seek, + @1.m_last_seek, + "if" + ); + ASSERT(pIFReplace); + CONVERTER->insertDocUpdate(pIFReplace); + + LPDocUpdate pIFInsertOpenBrace = rdo::Factory::create( + @2.m_first_seek, + "(" + ); + ASSERT(pIFInsertOpenBrace); + CONVERTER->insertDocUpdate(pIFInsertOpenBrace); + + LPDocUpdate pIFInsertCloseBrace = rdo::Factory::create( + @2.m_last_seek, + ")" + ); + ASSERT(pIFInsertCloseBrace); + CONVERTER->insertDocUpdate(pIFInsertCloseBrace); + + LPDocUpdate pReturnReplace = rdo::Factory::create( + @3.m_first_seek, + @4.m_last_seek, + "return" + ); + ASSERT(pReturnReplace); + CONVERTER->insertDocUpdate(pReturnReplace); + + LPDocUpdate pSemicolonInsert = rdo::Factory::create( + @5.m_last_seek, + ";" + ); + ASSERT(pSemicolonInsert); + CONVERTER->insertDocUpdate(pSemicolonInsert); + + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcText("Calculate_if " + pLogic->src_text()); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($5); + ASSERT(pArithm); + LPRDOFUNCalculateIf pCalculateIf = rdo::Factory::create(pLogic, pArithm); + ASSERT(pCalculateIf); + $$ = CONVERTER->stack().push(pCalculateIf); + } + | fun_func_calc_if fun_logic fun_func_calc_name '=' error + { + CONVERTER->error().error(@5, "Ошибка в арифметическом выражении"); + } + | fun_func_calc_name '=' fun_arithm + { + rdo::runtime::LPRDOCalc pCondition = rdo::Factory::create(1); + RDOParserSrcInfo logic_src_info("Calculate_if 1 = 1"); + logic_src_info.setSrcPos( @1.m_first_line, @1.m_first_pos, @1.m_first_line, @1.m_first_pos ); + pCondition->setSrcInfo( logic_src_info ); + LPRDOFUNLogic pLogic = rdo::Factory::create(pCondition, true); + pLogic->setSrcInfo( logic_src_info ); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pArithm); + LPRDOFUNCalculateIf pCalculateIf = rdo::Factory::create(pLogic, pArithm); + ASSERT(pCalculateIf); + $$ = CONVERTER->stack().push(pCalculateIf); + } + | fun_func_calc_name '=' error + { + CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); + } + | fun_func_calc_if fun_logic fun_func_calc_name error + { + CONVERTER->error().error(@4, "Ожидается '='"); + } + | fun_func_calc_name error + { + CONVERTER->error().error(@2, "Ожидается '='"); + } + | fun_func_calc_if fun_logic error + { + CONVERTER->error().error(@2, @3, "После логического выражения ожидается <имя_функции> = <результат_функции>"); + } + | fun_func_calc_if error + { + CONVERTER->error().error(@2, "Ошибка в логическом выражении"); + } + | error + { + CONVERTER->error().error(@1, "Ожидается ключевое слово Calculate_if"); + } + ; fun_func_list_body - : /* empty */ - | fun_func_list_body fun_func_list_value - ; + : /* empty */ + | fun_func_list_body fun_func_list_value + ; fun_func_list_value - : RDO_IDENTIF - { - const std::string str = CONVERTER->stack().pop($1)->value().getIdentificator(); - LPRDOFUNFunctionListElementIdentif pValue = rdo::Factory::create(RDOParserSrcInfo(@1, str)); - ASSERT(pValue); - CONVERTER->getLastFUNFunction()->add(pValue.object_parent_cast()); - $$ = CONVERTER->stack().push(pValue); - } - | RDO_REAL_CONST - { - LPRDOFUNFunctionListElementReal pValue = rdo::Factory::create(@1, CONVERTER->stack().pop($1)->value().getDouble()); - ASSERT(pValue); - CONVERTER->getLastFUNFunction()->add(pValue.object_parent_cast()); - $$ = CONVERTER->stack().push(pValue); - } - | RDO_INT_CONST - { - LPRDOFUNFunctionListElementInt pValue = rdo::Factory::create(@1, CONVERTER->stack().pop($1)->value().getInt()); - ASSERT(pValue); - CONVERTER->getLastFUNFunction()->add(pValue.object_parent_cast()); - $$ = CONVERTER->stack().push(pValue); - } - | '=' - { - LPRDOFUNFunctionListElementEq pValue = rdo::Factory::create(@1); - ASSERT(pValue); - CONVERTER->getLastFUNFunction()->add(pValue.object_parent_cast()); - $$ = CONVERTER->stack().push(pValue); - } - ; + : RDO_IDENTIF + { + const std::string str = CONVERTER->stack().pop($1)->value().getIdentificator(); + LPRDOFUNFunctionListElementIdentif pValue = rdo::Factory::create(RDOParserSrcInfo(@1, str)); + ASSERT(pValue); + CONVERTER->getLastFUNFunction()->add(pValue.object_parent_cast()); + $$ = CONVERTER->stack().push(pValue); + } + | RDO_REAL_CONST + { + LPRDOFUNFunctionListElementReal pValue = rdo::Factory::create(@1, CONVERTER->stack().pop($1)->value().getDouble()); + ASSERT(pValue); + CONVERTER->getLastFUNFunction()->add(pValue.object_parent_cast()); + $$ = CONVERTER->stack().push(pValue); + } + | RDO_INT_CONST + { + LPRDOFUNFunctionListElementInt pValue = rdo::Factory::create(@1, CONVERTER->stack().pop($1)->value().getInt()); + ASSERT(pValue); + CONVERTER->getLastFUNFunction()->add(pValue.object_parent_cast()); + $$ = CONVERTER->stack().push(pValue); + } + | '=' + { + LPRDOFUNFunctionListElementEq pValue = rdo::Factory::create(@1); + ASSERT(pValue); + CONVERTER->getLastFUNFunction()->add(pValue.object_parent_cast()); + $$ = CONVERTER->stack().push(pValue); + } + ; // -------------------------------------------------------------------------------- // -------------------- Последовательности // -------------------------------------------------------------------------------- fun_seq_descr - : fun_seq_uniform - | fun_seq_exponential - | fun_seq_normal - | fun_seq_by_hist - | fun_seq_enumerative - ; + : fun_seq_uniform + | fun_seq_exponential + | fun_seq_normal + | fun_seq_by_hist + | fun_seq_enumerative + ; fun_seq_header - : RDO_Sequence RDO_IDENTIF_COLON param_type RDO_Type '=' - { - LPRDOValue pName = CONVERTER->stack().pop($2); - CONVERTER->checkFunctionName(pName->src_info()); - LPRDOTypeParam pType = CONVERTER->stack().pop($3); - ASSERT(pType); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = rdo::Factory::create(pType, pName->src_info()); - ASSERT(pHeader); - $$ = CONVERTER->stack().push(pHeader); - } - | RDO_Sequence RDO_IDENTIF_COLON param_type RDO_Type '=' error - { - CONVERTER->error().error(@6, "После знака равенства ожидается тип последовательности"); - } - | RDO_Sequence RDO_IDENTIF_COLON param_type RDO_Type error - { - CONVERTER->error().error(@5, "После ключевого слова $Type ожидается знак равенства и тип последовательности"); - } - | RDO_Sequence RDO_IDENTIF_COLON param_type error - { - CONVERTER->error().error(@4, "Ожидается ключевое слово $Type"); - } - | RDO_Sequence RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@2, @3, "После имени последовательности ожидается тип возвращаемого значения"); - } - | RDO_Sequence error - { - CONVERTER->error().error(@1, @2, "После ключевого слова $Sequence ожидаются имя и тип результата последовательности в формате '<имя> : <тип>'"); - } - ; + : RDO_Sequence RDO_IDENTIF_COLON param_type RDO_Type '=' + { + LPRDOValue pName = CONVERTER->stack().pop($2); + CONVERTER->checkFunctionName(pName->src_info()); + LPRDOTypeParam pType = CONVERTER->stack().pop($3); + ASSERT(pType); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = rdo::Factory::create(pType, pName->src_info()); + ASSERT(pHeader); + $$ = CONVERTER->stack().push(pHeader); + } + | RDO_Sequence RDO_IDENTIF_COLON param_type RDO_Type '=' error + { + CONVERTER->error().error(@6, "После знака равенства ожидается тип последовательности"); + } + | RDO_Sequence RDO_IDENTIF_COLON param_type RDO_Type error + { + CONVERTER->error().error(@5, "После ключевого слова $Type ожидается знак равенства и тип последовательности"); + } + | RDO_Sequence RDO_IDENTIF_COLON param_type error + { + CONVERTER->error().error(@4, "Ожидается ключевое слово $Type"); + } + | RDO_Sequence RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@2, @3, "После имени последовательности ожидается тип возвращаемого значения"); + } + | RDO_Sequence error + { + CONVERTER->error().error(@1, @2, "После ключевого слова $Sequence ожидаются имя и тип результата последовательности в формате '<имя> : <тип>'"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Датчики случайных чисел // -------------------------------------------------------------------------------- fun_seq_uniform - : fun_seq_header RDO_uniform RDO_End - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_header RDO_uniform RDO_INT_CONST RDO_End - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($3)->value().getInt()); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_header RDO_uniform RDO_INT_CONST error - { - CONVERTER->error().error(@4, "После базы ожидается ключевое слово $End"); - } - | fun_seq_header RDO_uniform error - { - CONVERTER->error().error(@3, "После типа последовательности ожидается база генератора или ключевое слово $End"); - } - ; + : fun_seq_header RDO_uniform RDO_End + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_header RDO_uniform RDO_INT_CONST RDO_End + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($3)->value().getInt()); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_header RDO_uniform RDO_INT_CONST error + { + CONVERTER->error().error(@4, "После базы ожидается ключевое слово $End"); + } + | fun_seq_header RDO_uniform error + { + CONVERTER->error().error(@3, "После типа последовательности ожидается база генератора или ключевое слово $End"); + } + ; fun_seq_exponential - : fun_seq_header RDO_exponential RDO_End - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_header RDO_exponential RDO_INT_CONST RDO_End - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($3)->value().getInt()); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_header RDO_exponential RDO_INT_CONST error - { - CONVERTER->error().error( @4, "После базы ожидается ключевое слово $End"); - } - | fun_seq_header RDO_exponential error - { - CONVERTER->error().error( @3, "После типа последовательности ожидается база генератора или ключевое слово $End"); - } - ; + : fun_seq_header RDO_exponential RDO_End + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_header RDO_exponential RDO_INT_CONST RDO_End + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($3)->value().getInt()); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_header RDO_exponential RDO_INT_CONST error + { + CONVERTER->error().error( @4, "После базы ожидается ключевое слово $End"); + } + | fun_seq_header RDO_exponential error + { + CONVERTER->error().error( @3, "После типа последовательности ожидается база генератора или ключевое слово $End"); + } + ; fun_seq_normal - : fun_seq_header RDO_normal RDO_End - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_header RDO_normal RDO_INT_CONST RDO_End - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($3)->value().getInt()); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_header RDO_normal RDO_INT_CONST error - { - CONVERTER->error().error( @4, "После базы ожидается ключевое слово $End"); - } - | fun_seq_header RDO_normal error - { - CONVERTER->error().error( @3, "После типа последовательности ожидается база генератора или ключевое слово $End"); - } - ; + : fun_seq_header RDO_normal RDO_End + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_header RDO_normal RDO_INT_CONST RDO_End + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($3)->value().getInt()); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_header RDO_normal RDO_INT_CONST error + { + CONVERTER->error().error( @4, "После базы ожидается ключевое слово $End"); + } + | fun_seq_header RDO_normal error + { + CONVERTER->error().error( @3, "После типа последовательности ожидается база генератора или ключевое слово $End"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Гистограмма // -------------------------------------------------------------------------------- fun_seq_by_hist_header - : fun_seq_header RDO_by_hist RDO_Body - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pByHistHeader = rdo::Factory::create(pHeader); - ASSERT(pByHistHeader); - $$ = CONVERTER->stack().push(pByHistHeader); - } - | fun_seq_header RDO_by_hist RDO_INT_CONST RDO_Body - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pByHistHeader = rdo::Factory::create(pHeader, CONVERTER->stack().pop($3)->value().getInt()); - ASSERT(pByHistHeader); - $$ = CONVERTER->stack().push(pByHistHeader); - } - | fun_seq_header RDO_by_hist RDO_INT_CONST error - { - CONVERTER->error().error( @4, "После базы ожидается ключевое слово $Body"); - } - | fun_seq_header RDO_by_hist error - { - CONVERTER->error().error( @3, "После типа последовательности ожидается база генератора или ключевое слово $Body"); - } - ; + : fun_seq_header RDO_by_hist RDO_Body + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pByHistHeader = rdo::Factory::create(pHeader); + ASSERT(pByHistHeader); + $$ = CONVERTER->stack().push(pByHistHeader); + } + | fun_seq_header RDO_by_hist RDO_INT_CONST RDO_Body + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pByHistHeader = rdo::Factory::create(pHeader, CONVERTER->stack().pop($3)->value().getInt()); + ASSERT(pByHistHeader); + $$ = CONVERTER->stack().push(pByHistHeader); + } + | fun_seq_header RDO_by_hist RDO_INT_CONST error + { + CONVERTER->error().error( @4, "После базы ожидается ключевое слово $Body"); + } + | fun_seq_header RDO_by_hist error + { + CONVERTER->error().error( @3, "После типа последовательности ожидается база генератора или ключевое слово $Body"); + } + ; fun_seq_by_hist_body_real - : fun_seq_by_hist_header RDO_REAL_CONST RDO_REAL_CONST RDO_REAL_CONST - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - if ( pHeader->getHeader()->getType()->type()->typeID() == rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str()) ); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_header RDO_INT_CONST RDO_REAL_CONST RDO_REAL_CONST - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - if ( pHeader->getHeader()->getType()->type()->typeID() == rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str()) ); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_header RDO_REAL_CONST RDO_INT_CONST RDO_REAL_CONST - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - if ( pHeader->getHeader()->getType()->type()->typeID() == rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str()) ); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_header RDO_REAL_CONST RDO_REAL_CONST RDO_INT_CONST - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - if ( pHeader->getHeader()->getType()->type()->typeID() == rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str()) ); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_header RDO_INT_CONST RDO_INT_CONST RDO_REAL_CONST - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_header RDO_REAL_CONST RDO_INT_CONST RDO_INT_CONST - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - if ( pHeader->getHeader()->getType()->type()->typeID() == rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str()) ); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_header RDO_INT_CONST RDO_REAL_CONST RDO_INT_CONST - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - if ( pHeader->getHeader()->getType()->type()->typeID() == rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str()) ); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_header RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_REAL_CONST RDO_REAL_CONST - { - LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); - ASSERT(pHeader); - if ( pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str()) ); - } - pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_body_real RDO_INT_CONST RDO_REAL_CONST RDO_REAL_CONST - { - LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); - ASSERT(pHeader); - if ( pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str()) ); - } - pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_INT_CONST RDO_REAL_CONST - { - LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); - ASSERT(pHeader); - if ( pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str()) ); - } - pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_REAL_CONST RDO_INT_CONST - { - LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); - ASSERT(pHeader); - if ( pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str()) ); - } - pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_body_real RDO_INT_CONST RDO_INT_CONST RDO_REAL_CONST - { - LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_INT_CONST RDO_INT_CONST - { - LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); - ASSERT(pHeader); - if ( pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str()) ); - } - pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_body_real RDO_INT_CONST RDO_REAL_CONST RDO_INT_CONST - { - LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); - ASSERT(pHeader); - if ( pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str()) ); - } - pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_body_real RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST - { - LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_header RDO_REAL_CONST error - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - CONVERTER->error().error( @2, @3, "Ожидается конец диапазона" ); - } - | fun_seq_by_hist_header RDO_INT_CONST error - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - CONVERTER->error().error( @2, @3, "Ожидается конец диапазона" ); - } - | fun_seq_by_hist_header RDO_REAL_CONST RDO_REAL_CONST error - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); - } - | fun_seq_by_hist_header RDO_INT_CONST RDO_REAL_CONST error - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); - } - | fun_seq_by_hist_header RDO_REAL_CONST RDO_INT_CONST error - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность"); - } - | fun_seq_by_hist_header RDO_INT_CONST RDO_INT_CONST error - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_int ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); - } - | fun_seq_by_hist_body_real RDO_REAL_CONST error - { - CONVERTER->error().error( @2, @3, "Ожидается конец диапазона" ); - } - | fun_seq_by_hist_body_real RDO_INT_CONST error - { - CONVERTER->error().error( @2, @3, "Ожидается конец диапазона" ); - } - | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_REAL_CONST error - { - CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); - } - | fun_seq_by_hist_body_real RDO_INT_CONST RDO_REAL_CONST error - { - CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); - } - | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_INT_CONST error - { - CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); - } - | fun_seq_by_hist_body_real RDO_INT_CONST RDO_INT_CONST error - { - CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); - } - | fun_seq_by_hist_header RDO_End - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - CONVERTER->error().error( pHeader->src_info(), rdo::format("Последовательность '%s' не должна быть пустой", pHeader->src_text().c_str()) ); - } - ; + : fun_seq_by_hist_header RDO_REAL_CONST RDO_REAL_CONST RDO_REAL_CONST + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + if ( pHeader->getHeader()->getType()->type()->typeID() == rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str()) ); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_header RDO_INT_CONST RDO_REAL_CONST RDO_REAL_CONST + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + if ( pHeader->getHeader()->getType()->type()->typeID() == rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str()) ); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_header RDO_REAL_CONST RDO_INT_CONST RDO_REAL_CONST + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + if ( pHeader->getHeader()->getType()->type()->typeID() == rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str()) ); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_header RDO_REAL_CONST RDO_REAL_CONST RDO_INT_CONST + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + if ( pHeader->getHeader()->getType()->type()->typeID() == rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str()) ); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_header RDO_INT_CONST RDO_INT_CONST RDO_REAL_CONST + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_header RDO_REAL_CONST RDO_INT_CONST RDO_INT_CONST + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + if ( pHeader->getHeader()->getType()->type()->typeID() == rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str()) ); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_header RDO_INT_CONST RDO_REAL_CONST RDO_INT_CONST + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + if ( pHeader->getHeader()->getType()->type()->typeID() == rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str()) ); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_header RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_REAL_CONST RDO_REAL_CONST + { + LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); + ASSERT(pHeader); + if ( pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str()) ); + } + pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_body_real RDO_INT_CONST RDO_REAL_CONST RDO_REAL_CONST + { + LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); + ASSERT(pHeader); + if ( pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str()) ); + } + pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_INT_CONST RDO_REAL_CONST + { + LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); + ASSERT(pHeader); + if ( pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str()) ); + } + pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_REAL_CONST RDO_INT_CONST + { + LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); + ASSERT(pHeader); + if ( pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str()) ); + } + pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_body_real RDO_INT_CONST RDO_INT_CONST RDO_REAL_CONST + { + LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_INT_CONST RDO_INT_CONST + { + LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); + ASSERT(pHeader); + if ( pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str()) ); + } + pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_body_real RDO_INT_CONST RDO_REAL_CONST RDO_INT_CONST + { + LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); + ASSERT(pHeader); + if ( pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str()) ); + } + pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_body_real RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST + { + LPRDOFUNSequenceByHistReal pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + pSequence->addReal(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3), CONVERTER->stack().pop($4)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_header RDO_REAL_CONST error + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + CONVERTER->error().error( @2, @3, "Ожидается конец диапазона" ); + } + | fun_seq_by_hist_header RDO_INT_CONST error + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + CONVERTER->error().error( @2, @3, "Ожидается конец диапазона" ); + } + | fun_seq_by_hist_header RDO_REAL_CONST RDO_REAL_CONST error + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); + } + | fun_seq_by_hist_header RDO_INT_CONST RDO_REAL_CONST error + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); + } + | fun_seq_by_hist_header RDO_REAL_CONST RDO_INT_CONST error + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность"); + } + | fun_seq_by_hist_header RDO_INT_CONST RDO_INT_CONST error + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); + } + | fun_seq_by_hist_body_real RDO_REAL_CONST error + { + CONVERTER->error().error( @2, @3, "Ожидается конец диапазона" ); + } + | fun_seq_by_hist_body_real RDO_INT_CONST error + { + CONVERTER->error().error( @2, @3, "Ожидается конец диапазона" ); + } + | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_REAL_CONST error + { + CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); + } + | fun_seq_by_hist_body_real RDO_INT_CONST RDO_REAL_CONST error + { + CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); + } + | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_INT_CONST error + { + CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); + } + | fun_seq_by_hist_body_real RDO_INT_CONST RDO_INT_CONST error + { + CONVERTER->error().error( @3, @4, "Ожидается относительная вероятность" ); + } + | fun_seq_by_hist_header RDO_End + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + CONVERTER->error().error( pHeader->src_info(), rdo::format("Последовательность '%s' не должна быть пустой", pHeader->src_text().c_str()) ); + } + ; fun_seq_by_hist_body_enum - : fun_seq_by_hist_header RDO_IDENTIF RDO_REAL_CONST - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_enum ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - LPRDOFUNSequenceByHistEnum pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_header RDO_IDENTIF RDO_INT_CONST - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_enum ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - LPRDOFUNSequenceByHistEnum pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_body_enum RDO_IDENTIF RDO_REAL_CONST - { - LPRDOFUNSequenceByHistEnum pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - pSequence->addEnum(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_body_enum RDO_IDENTIF RDO_INT_CONST - { - LPRDOFUNSequenceByHistEnum pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - pSequence->addEnum(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_header RDO_IDENTIF error - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::t_enum ) - { - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - CONVERTER->error().error( @2, @3, rdo::format("Ожидается относительная вероятность для значения: %s", CONVERTER->stack().pop($2)->value().getIdentificator().c_str()) ); - } - | fun_seq_by_hist_body_enum RDO_IDENTIF error - { - CONVERTER->error().error( @2, @3, rdo::format("Ожидается относительная вероятность для значения: %s", CONVERTER->stack().pop($2)->value().getIdentificator().c_str()) ); - } - | fun_seq_by_hist_body_enum RDO_REAL_CONST error - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - | fun_seq_by_hist_body_enum RDO_INT_CONST error - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); - } - ; + : fun_seq_by_hist_header RDO_IDENTIF RDO_REAL_CONST + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::ENUM ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + LPRDOFUNSequenceByHistEnum pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_header RDO_IDENTIF RDO_INT_CONST + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::ENUM ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + LPRDOFUNSequenceByHistEnum pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2), CONVERTER->stack().pop($3)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_body_enum RDO_IDENTIF RDO_REAL_CONST + { + LPRDOFUNSequenceByHistEnum pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + pSequence->addEnum(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_body_enum RDO_IDENTIF RDO_INT_CONST + { + LPRDOFUNSequenceByHistEnum pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + pSequence->addEnum(CONVERTER->stack().pop($2), CONVERTER->stack().pop($3)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_header RDO_IDENTIF error + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + if ( pHeader->getHeader()->getType()->type()->typeID() != rdo::runtime::RDOType::Type::ENUM ) + { + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + CONVERTER->error().error( @2, @3, rdo::format("Ожидается относительная вероятность для значения: %s", CONVERTER->stack().pop($2)->value().getIdentificator().c_str()) ); + } + | fun_seq_by_hist_body_enum RDO_IDENTIF error + { + CONVERTER->error().error( @2, @3, rdo::format("Ожидается относительная вероятность для значения: %s", CONVERTER->stack().pop($2)->value().getIdentificator().c_str()) ); + } + | fun_seq_by_hist_body_enum RDO_REAL_CONST error + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + | fun_seq_by_hist_body_enum RDO_INT_CONST error + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + CONVERTER->error().error( @2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getType()->src_text().c_str()) ); + } + ; fun_seq_by_hist - : fun_seq_by_hist_body_real RDO_End - { - LPRDOFUNSequence pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_body_enum RDO_End - { - LPRDOFUNSequence pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_by_hist_body_real error - { - CONVERTER->error().error( @2, "Ошибка в описании последовательности" ); - } - | fun_seq_by_hist_body_enum error - { - CONVERTER->error().error( @2, "Ошибка в описании последовательности" ); - } - | fun_seq_by_hist_body_real - { - CONVERTER->error().error( @1, "Ожидается ключевое слово $End" ); - } - | fun_seq_by_hist_body_enum - { - CONVERTER->error().error( @1, "Ожидается ключевое слово $End" ); - } - ; + : fun_seq_by_hist_body_real RDO_End + { + LPRDOFUNSequence pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_body_enum RDO_End + { + LPRDOFUNSequence pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_by_hist_body_real error + { + CONVERTER->error().error( @2, "Ошибка в описании последовательности" ); + } + | fun_seq_by_hist_body_enum error + { + CONVERTER->error().error( @2, "Ошибка в описании последовательности" ); + } + | fun_seq_by_hist_body_real + { + CONVERTER->error().error( @1, "Ожидается ключевое слово $End" ); + } + | fun_seq_by_hist_body_enum + { + CONVERTER->error().error( @1, "Ожидается ключевое слово $End" ); + } + ; // -------------------------------------------------------------------------------- // -------------------- Перечень значений // -------------------------------------------------------------------------------- fun_seq_enumerative - : fun_seq_enumerative_body RDO_End - { - LPRDOFUNSequence pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_enumerative_header RDO_End - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - CONVERTER->error().error( pHeader->src_info(), rdo::format("Последовательность '%s' не должна быть пустой", pHeader->src_text().c_str()) ); - } - ; + : fun_seq_enumerative_body RDO_End + { + LPRDOFUNSequence pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_enumerative_header RDO_End + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + CONVERTER->error().error( pHeader->src_info(), rdo::format("Последовательность '%s' не должна быть пустой", pHeader->src_text().c_str()) ); + } + ; fun_seq_enumerative_header - : fun_seq_header RDO_enumerative RDO_Body - | fun_seq_header RDO_enumerative RDO_INT_CONST error - { - CONVERTER->error().error( @3, "У последовательности типа enumerative нет базы генератора" ); - } - | fun_seq_header RDO_enumerative RDO_Parameters error - { - CONVERTER->error().error( @3, "У последовательности типа enumerative нет параметров" ); - } - | fun_seq_header RDO_enumerative error - { - CONVERTER->error().error( @3, "После типа последовательности ожидается ключевое слово $Body" ); - } - ; + : fun_seq_header RDO_enumerative RDO_Body + | fun_seq_header RDO_enumerative RDO_INT_CONST error + { + CONVERTER->error().error( @3, "У последовательности типа enumerative нет базы генератора" ); + } + | fun_seq_header RDO_enumerative RDO_Parameters error + { + CONVERTER->error().error( @3, "У последовательности типа enumerative нет параметров" ); + } + | fun_seq_header RDO_enumerative error + { + CONVERTER->error().error( @3, "После типа последовательности ожидается ключевое слово $Body" ); + } + ; fun_seq_enumerative_body - : fun_seq_enumerative_header RDO_INT_CONST - { - RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_enumerative_header RDO_REAL_CONST - { - RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_enumerative_header RDO_BOOL_CONST - { - RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_enumerative_header RDO_STRING_CONST - { - RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_enumerative_header RDO_IDENTIF - { - RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2)); - ASSERT(pSequence); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_enumerative_body RDO_INT_CONST - { - LPRDOFUNSequenceEnumerative pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - pSequence->addValue(CONVERTER->stack().pop($2)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_enumerative_body RDO_REAL_CONST - { - LPRDOFUNSequenceEnumerative pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - pSequence->addValue(CONVERTER->stack().pop($2)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_enumerative_body RDO_BOOL_CONST - { - LPRDOFUNSequenceEnumerative pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - pSequence->addValue(CONVERTER->stack().pop($2)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_enumerative_body RDO_STRING_CONST - { - LPRDOFUNSequenceEnumerative pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - pSequence->addValue(CONVERTER->stack().pop($2)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_enumerative_body RDO_IDENTIF - { - LPRDOFUNSequenceEnumerative pSequence = CONVERTER->stack().pop($1); - ASSERT(pSequence); - pSequence->addValue(CONVERTER->stack().pop($2)); - $$ = CONVERTER->stack().push(pSequence); - } - | fun_seq_enumerative_body error - { - CONVERTER->error().error(@1, @2, "Ожидается элемент последовательности или ключевое слово $End"); - } - ; + : fun_seq_enumerative_header RDO_INT_CONST + { + RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_enumerative_header RDO_REAL_CONST + { + RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_enumerative_header RDO_BOOL_CONST + { + RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_enumerative_header RDO_STRING_CONST + { + RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_enumerative_header RDO_IDENTIF + { + RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = CONVERTER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, CONVERTER->stack().pop($2)); + ASSERT(pSequence); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_enumerative_body RDO_INT_CONST + { + LPRDOFUNSequenceEnumerative pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + pSequence->addValue(CONVERTER->stack().pop($2)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_enumerative_body RDO_REAL_CONST + { + LPRDOFUNSequenceEnumerative pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + pSequence->addValue(CONVERTER->stack().pop($2)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_enumerative_body RDO_BOOL_CONST + { + LPRDOFUNSequenceEnumerative pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + pSequence->addValue(CONVERTER->stack().pop($2)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_enumerative_body RDO_STRING_CONST + { + LPRDOFUNSequenceEnumerative pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + pSequence->addValue(CONVERTER->stack().pop($2)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_enumerative_body RDO_IDENTIF + { + LPRDOFUNSequenceEnumerative pSequence = CONVERTER->stack().pop($1); + ASSERT(pSequence); + pSequence->addValue(CONVERTER->stack().pop($2)); + $$ = CONVERTER->stack().push(pSequence); + } + | fun_seq_enumerative_body error + { + CONVERTER->error().error(@1, @2, "Ожидается элемент последовательности или ключевое слово $End"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Описание типа параметра // -------------------------------------------------------------------------------- param_type - : RDO_integer param_type_range - { - LPDocUpdate pReplace = rdo::Factory::create(@1.m_first_seek, @1.m_last_seek, "int"); - ASSERT(pReplace); - //CONVERTER->insertDocUpdate(pReplace); - - LPRDOTypeRangeRange pRange = CONVERTER->stack().pop($2); - LPRDOTypeParam pType; - if (pRange) - { - if (pRange->getMin()->typeID() != rdo::runtime::RDOType::t_int || - pRange->getMax()->typeID() != rdo::runtime::RDOType::t_int) - { - CONVERTER->error().error(@2, "Диапазон целого типа должен быть целочисленным"); - } - LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); - ASSERT(pIntRange); - pType = rdo::Factory::create(pIntRange, RDOParserSrcInfo(@1, @2)); - } - else - { - pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1, @2)); - } - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | RDO_real param_type_range - { - LPRDOTypeRangeRange pRange = CONVERTER->stack().pop($2); - LPRDOTypeParam pType; - if (pRange) - { - LPRDOTypeRealRange pRealRange = rdo::Factory::create(pRange); - ASSERT(pRealRange); - pType = rdo::Factory::create(pRealRange, RDOParserSrcInfo(@1, @2)); - } - else - { - pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1, @2)); - } - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | RDO_string - { - LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1)); - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | RDO_bool - { - LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1)); - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | param_type_enum - { - LEXER->enumReset(); - LPRDOEnumType pEnum = CONVERTER->stack().pop($1); - ASSERT(pEnum); - LPRDOTypeParam pType = rdo::Factory::create(pEnum, RDOParserSrcInfo(@1)); - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | param_type_such_as - { - LPRDOTypeParamSuchAs pTypeSuchAs = CONVERTER->stack().pop($1); - ASSERT(pTypeSuchAs); - LPRDOTypeParam pType = pTypeSuchAs.object_parent_cast(); - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - ; + : RDO_integer param_type_range + { + LPDocUpdate pReplace = rdo::Factory::create(@1.m_first_seek, @1.m_last_seek, "int"); + ASSERT(pReplace); + //CONVERTER->insertDocUpdate(pReplace); + + LPRDOTypeRangeRange pRange = CONVERTER->stack().pop($2); + LPRDOTypeParam pType; + if (pRange) + { + if (pRange->getMin()->typeID() != rdo::runtime::RDOType::Type::INT || + pRange->getMax()->typeID() != rdo::runtime::RDOType::Type::INT) + { + CONVERTER->error().error(@2, "Диапазон целого типа должен быть целочисленным"); + } + LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); + ASSERT(pIntRange); + pType = rdo::Factory::create(pIntRange, RDOParserSrcInfo(@1, @2)); + } + else + { + pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1, @2)); + } + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | RDO_real param_type_range + { + LPRDOTypeRangeRange pRange = CONVERTER->stack().pop($2); + LPRDOTypeParam pType; + if (pRange) + { + LPRDOTypeRealRange pRealRange = rdo::Factory::create(pRange); + ASSERT(pRealRange); + pType = rdo::Factory::create(pRealRange, RDOParserSrcInfo(@1, @2)); + } + else + { + pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1, @2)); + } + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | RDO_string + { + LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1)); + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | RDO_bool + { + LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1)); + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | param_type_enum + { + LEXER->enumReset(); + LPRDOEnumType pEnum = CONVERTER->stack().pop($1); + ASSERT(pEnum); + LPRDOTypeParam pType = rdo::Factory::create(pEnum, RDOParserSrcInfo(@1)); + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | param_type_such_as + { + LPRDOTypeParamSuchAs pTypeSuchAs = CONVERTER->stack().pop($1); + ASSERT(pTypeSuchAs); + LPRDOTypeParam pType = pTypeSuchAs.object_parent_cast(); + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + ; param_type_range - : /* empty */ - { - $$ = CONVERTER->stack().push(LPRDOTypeRangeRange()); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = CONVERTER->stack().push(pRange); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = CONVERTER->stack().push(pRange); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = CONVERTER->stack().push(pRange); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = CONVERTER->stack().push(pRange); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_REAL_CONST RDO_dblpoint error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_INT_CONST RDO_dblpoint error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' error - { - CONVERTER->error().error(@2, "Диапазон задан неверно"); - } - ; + : /* empty */ + { + $$ = CONVERTER->stack().push(LPRDOTypeRangeRange()); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = CONVERTER->stack().push(pRange); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = CONVERTER->stack().push(pRange); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = CONVERTER->stack().push(pRange); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = CONVERTER->stack().push(pRange); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_REAL_CONST RDO_dblpoint error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_INT_CONST RDO_dblpoint error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' error + { + CONVERTER->error().error(@2, "Диапазон задан неверно"); + } + ; param_type_enum - : '(' param_type_enum_list ')' - { - LPRDOEnumType pEnum = CONVERTER->stack().pop($2); - ASSERT(pEnum); - $$ = CONVERTER->stack().push(pEnum); - } - | '(' param_type_enum_list error - { - CONVERTER->error().error(@2, "Перечисление должно заканчиваться скобкой"); - } - ; + : '(' param_type_enum_list ')' + { + LPRDOEnumType pEnum = CONVERTER->stack().pop($2); + ASSERT(pEnum); + $$ = CONVERTER->stack().push(pEnum); + } + | '(' param_type_enum_list error + { + CONVERTER->error().error(@2, "Перечисление должно заканчиваться скобкой"); + } + ; param_type_enum_list - : RDO_IDENTIF - { - LPRDOEnumType pEnum = rdo::Factory::create(); - ASSERT(pEnum); - pEnum->add(CONVERTER->stack().pop($1)); - LEXER->enumBegin(); - $$ = CONVERTER->stack().push(pEnum); - } - | param_type_enum_list ',' RDO_IDENTIF - { - if (!LEXER->enumEmpty()) - { - LPRDOEnumType pEnum = CONVERTER->stack().pop($1); - ASSERT(pEnum); - pEnum->add(CONVERTER->stack().pop($3)); - $$ = CONVERTER->stack().push(pEnum); - } - else - { - CONVERTER->error().error(@3, "Ошибка в описании значений перечислимого типа"); - } - } - | param_type_enum_list RDO_IDENTIF - { - if (!LEXER->enumEmpty()) - { - LPRDOEnumType pEnum = CONVERTER->stack().pop($1); - ASSERT(pEnum); - pEnum->add(CONVERTER->stack().pop($2)); - $$ = CONVERTER->stack().push(pEnum); - CONVERTER->error().warning(@1, rdo::format("Пропущена запятая перед: %s", CONVERTER->stack().pop($2)->value().getIdentificator().c_str())); - } - else - { - CONVERTER->error().error(@2, "Ошибка в описании значений перечислимого типа"); - } - } - | param_type_enum_list ',' RDO_INT_CONST - { - CONVERTER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); - } - | param_type_enum_list ',' RDO_REAL_CONST - { - CONVERTER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); - } - | param_type_enum_list RDO_INT_CONST - { - CONVERTER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); - } - | param_type_enum_list RDO_REAL_CONST - { - CONVERTER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); - } - | RDO_INT_CONST - { - CONVERTER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); - } - | RDO_REAL_CONST - { - CONVERTER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); - } - ; + : RDO_IDENTIF + { + LPRDOEnumType pEnum = rdo::Factory::create(); + ASSERT(pEnum); + pEnum->add(CONVERTER->stack().pop($1)); + LEXER->enumBegin(); + $$ = CONVERTER->stack().push(pEnum); + } + | param_type_enum_list ',' RDO_IDENTIF + { + if (!LEXER->enumEmpty()) + { + LPRDOEnumType pEnum = CONVERTER->stack().pop($1); + ASSERT(pEnum); + pEnum->add(CONVERTER->stack().pop($3)); + $$ = CONVERTER->stack().push(pEnum); + } + else + { + CONVERTER->error().error(@3, "Ошибка в описании значений перечислимого типа"); + } + } + | param_type_enum_list RDO_IDENTIF + { + if (!LEXER->enumEmpty()) + { + LPRDOEnumType pEnum = CONVERTER->stack().pop($1); + ASSERT(pEnum); + pEnum->add(CONVERTER->stack().pop($2)); + $$ = CONVERTER->stack().push(pEnum); + CONVERTER->error().warning(@1, rdo::format("Пропущена запятая перед: %s", CONVERTER->stack().pop($2)->value().getIdentificator().c_str())); + } + else + { + CONVERTER->error().error(@2, "Ошибка в описании значений перечислимого типа"); + } + } + | param_type_enum_list ',' RDO_INT_CONST + { + CONVERTER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); + } + | param_type_enum_list ',' RDO_REAL_CONST + { + CONVERTER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); + } + | param_type_enum_list RDO_INT_CONST + { + CONVERTER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); + } + | param_type_enum_list RDO_REAL_CONST + { + CONVERTER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); + } + | RDO_INT_CONST + { + CONVERTER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); + } + | RDO_REAL_CONST + { + CONVERTER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); + } + ; param_type_such_as - : RDO_such_as RDO_IDENTIF '.' RDO_IDENTIF - { - const std::string type = CONVERTER->stack().pop($2)->value().getIdentificator(); - const std::string param = CONVERTER->stack().pop($4)->value().getIdentificator(); - LPRDORTPResType pResType = CONVERTER->findRTPResType(type); - if (!pResType) - { - CONVERTER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); - } - LPRDORTPParam pRTPParam = pResType->findRTPParam(param); - if (!pRTPParam) - { - CONVERTER->error().error(@4, rdo::format("Ссылка на неизвестный параметр ресурса: %s.%s", type.c_str(), param.c_str())); - } - LPRDOParam pParam = pRTPParam.object_parent_cast(); - ASSERT(pParam); - LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); - ASSERT(pTypeSuchAs); - $$ = CONVERTER->stack().push(pTypeSuchAs); - } - | RDO_such_as RDO_IDENTIF - { - const std::string constName = CONVERTER->stack().pop($2)->value().getIdentificator(); - LPRDOFUNConstant pConstant = CONVERTER->findFUNConstant(constName); - if (!pConstant) - { - CONVERTER->error().error(@2, rdo::format("Ссылка на несуществующую константу: %s", constName.c_str())); - } - LPRDOParam pParam = pConstant.object_parent_cast(); - ASSERT(pParam); - LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); - ASSERT(pTypeSuchAs); - $$ = CONVERTER->stack().push(pTypeSuchAs); - } - | RDO_such_as RDO_IDENTIF '.' error - { - const std::string type = CONVERTER->stack().pop($2)->value().getIdentificator(); - LPRDORTPResType pResType = CONVERTER->findRTPResType(type); - if (!pResType) - { - CONVERTER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); - } - else - { - CONVERTER->error().error(@4, "Ошибка при указании параметра"); - } - } - | RDO_such_as error - { - CONVERTER->error().error(@2, "После ключевого слова such_as необходимо указать тип и параметер ресурса для ссылки"); - } - ; + : RDO_such_as RDO_IDENTIF '.' RDO_IDENTIF + { + const std::string type = CONVERTER->stack().pop($2)->value().getIdentificator(); + const std::string param = CONVERTER->stack().pop($4)->value().getIdentificator(); + LPRDORTPResType pResType = CONVERTER->findRTPResType(type); + if (!pResType) + { + CONVERTER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); + } + LPRDORTPParam pRTPParam = pResType->findRTPParam(param); + if (!pRTPParam) + { + CONVERTER->error().error(@4, rdo::format("Ссылка на неизвестный параметр ресурса: %s.%s", type.c_str(), param.c_str())); + } + LPRDOParam pParam = pRTPParam.object_parent_cast(); + ASSERT(pParam); + LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); + ASSERT(pTypeSuchAs); + $$ = CONVERTER->stack().push(pTypeSuchAs); + } + | RDO_such_as RDO_IDENTIF + { + const std::string constName = CONVERTER->stack().pop($2)->value().getIdentificator(); + LPRDOFUNConstant pConstant = CONVERTER->findFUNConstant(constName); + if (!pConstant) + { + CONVERTER->error().error(@2, rdo::format("Ссылка на несуществующую константу: %s", constName.c_str())); + } + LPRDOParam pParam = pConstant.object_parent_cast(); + ASSERT(pParam); + LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); + ASSERT(pTypeSuchAs); + $$ = CONVERTER->stack().push(pTypeSuchAs); + } + | RDO_such_as RDO_IDENTIF '.' error + { + const std::string type = CONVERTER->stack().pop($2)->value().getIdentificator(); + LPRDORTPResType pResType = CONVERTER->findRTPResType(type); + if (!pResType) + { + CONVERTER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); + } + else + { + CONVERTER->error().error(@4, "Ошибка при указании параметра"); + } + } + | RDO_such_as error + { + CONVERTER->error().error(@2, "После ключевого слова such_as необходимо указать тип и параметер ресурса для ссылки"); + } + ; param_value_default - : /* empty */ - { - $$ = CONVERTER->stack().push(rdo::Factory::create()); - } - | '=' RDO_INT_CONST - { - $$ = $2; - } - | '=' RDO_REAL_CONST - { - $$ = $2; - } - | '=' RDO_STRING_CONST - { - $$ = $2; - } - | '=' RDO_IDENTIF - { - $$ = $2; - } - | '=' RDO_BOOL_CONST - { - $$ = $2; - } - | '=' error - { - RDOParserSrcInfo src_info(@1, @2, true); - if (src_info.src_pos().point()) - { - CONVERTER->error().error(src_info, "Не указано значение по умолчанию"); - } - else - { - CONVERTER->error().error(src_info, "Неверное значение по умолчанию"); - } - } - ; + : /* empty */ + { + $$ = CONVERTER->stack().push(rdo::Factory::create()); + } + | '=' RDO_INT_CONST + { + $$ = $2; + } + | '=' RDO_REAL_CONST + { + $$ = $2; + } + | '=' RDO_STRING_CONST + { + $$ = $2; + } + | '=' RDO_IDENTIF + { + $$ = $2; + } + | '=' RDO_BOOL_CONST + { + $$ = $2; + } + | '=' error + { + RDOParserSrcInfo src_info(@1, @2, true); + if (src_info.src_pos().point()) + { + CONVERTER->error().error(src_info, "Не указано значение по умолчанию"); + } + else + { + CONVERTER->error().error(src_info, "Неверное значение по умолчанию"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Общие составные токены для всех объектов РДО @@ -1565,488 +1555,488 @@ param_value_default // -------------------- Логические выражения // -------------------------------------------------------------------------------- fun_logic_eq - : '=' - { - LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); - ASSERT(pInsert); - CONVERTER->insertDocUpdate(pInsert); - - $$ = RDO_eq; - } - | RDO_eq - { - $$ = RDO_eq; - } - ; + : '=' + { + LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); + ASSERT(pInsert); + CONVERTER->insertDocUpdate(pInsert); + + $$ = RDO_eq; + } + | RDO_eq + { + $$ = RDO_eq; + } + ; fun_logic - : fun_arithm fun_logic_eq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_neq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '<' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '>' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_leq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_geq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_and fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_or fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pArithm); - LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_group - | fun_select_logic - | '[' fun_logic ']' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("[" + pLogic->src_text() + "]"); - $$ = CONVERTER->stack().push(pLogic); - } - | '(' fun_logic ')' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("(" + pLogic->src_text() + ")"); - $$ = CONVERTER->stack().push(pLogic); - } - | RDO_not fun_logic - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - LPRDOFUNLogic pLogicNot = pLogic->operator_not(); - ASSERT(pLogicNot); - pLogicNot->setSrcPos (@1, @2); - pLogicNot->setSrcText("not " + pLogic->src_text()); - $$ = CONVERTER->stack().push(pLogicNot); - } - | '[' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | '(' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - ; + : fun_arithm fun_logic_eq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_neq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '<' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '>' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_leq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_geq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_and fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_or fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pArithm); + LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_group + | fun_select_logic + | '[' fun_logic ']' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("[" + pLogic->src_text() + "]"); + $$ = CONVERTER->stack().push(pLogic); + } + | '(' fun_logic ')' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("(" + pLogic->src_text() + ")"); + $$ = CONVERTER->stack().push(pLogic); + } + | RDO_not fun_logic + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + LPRDOFUNLogic pLogicNot = pLogic->operator_not(); + ASSERT(pLogicNot); + pLogicNot->setSrcPos (@1, @2); + pLogicNot->setSrcText("not " + pLogic->src_text()); + $$ = CONVERTER->stack().push(pLogicNot); + } + | '[' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | '(' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Арифметические выражения // -------------------------------------------------------------------------------- fun_arithm - : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | fun_arithm '+' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '-' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '*' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '/' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm_func_call - | fun_select_arithm - | '(' fun_arithm ')' - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - pArithm->setSrcPos (@1, @3); - pArithm->setSrcText("(" + pArithm->src_text() + ")"); - $$ = CONVERTER->stack().push(pArithm); - } - | '-' fun_arithm %prec RDO_UMINUS - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - RDOParserSrcInfo info; - info.setSrcPos (@1, @2); - info.setSrcText("-" + pArithm->src_text()); - $$ = CONVERTER->stack().push( - rdo::Factory::create( - rdo::Factory::create(pArithm->type(), info), - rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() - ) - ); - } - ; + : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | fun_arithm '+' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '-' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '*' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '/' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm_func_call + | fun_select_arithm + | '(' fun_arithm ')' + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + pArithm->setSrcPos (@1, @3); + pArithm->setSrcText("(" + pArithm->src_text() + ")"); + $$ = CONVERTER->stack().push(pArithm); + } + | '-' fun_arithm %prec RDO_UMINUS + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + RDOParserSrcInfo info; + info.setSrcPos (@1, @2); + info.setSrcText("-" + pArithm->src_text()); + $$ = CONVERTER->stack().push( + rdo::Factory::create( + rdo::Factory::create(pArithm->type(), info), + rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() + ) + ); + } + ; // -------------------------------------------------------------------------------- // -------------------- Функции и последовательности // -------------------------------------------------------------------------------- fun_arithm_func_call - : RDO_IDENTIF '(' ')' - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @3); - pFunParams->setSrcText(funName + "()"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @4); - pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' error - { - CONVERTER->error().error(@3, "Ошибка в параметрах функции"); - } - ; + : RDO_IDENTIF '(' ')' + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @3); + pFunParams->setSrcText(funName + "()"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @4); + pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' error + { + CONVERTER->error().error(@3, "Ошибка в параметрах функции"); + } + ; fun_arithm_func_call_pars - : fun_arithm - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars ',' fun_arithm - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars error - { - CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); - } - | fun_arithm_func_call_pars ',' error - { - CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); - } - ; + : fun_arithm + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars ',' fun_arithm + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars error + { + CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); + } + | fun_arithm_func_call_pars ',' error + { + CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Групповые выражения // -------------------------------------------------------------------------------- fun_group_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_group_header - : fun_group_keyword '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - $$ = CONVERTER->stack().push(rdo::Factory::create((RDOFUNGroupLogic::FunGroupType)$1, pValue->src_info())); - } - | fun_group_keyword '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | fun_group_keyword error - { - CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); - } - ; + : fun_group_keyword '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + $$ = CONVERTER->stack().push(rdo::Factory::create(static_cast($1), pValue->src_info())); + } + | fun_group_keyword '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | fun_group_keyword error + { + CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); + } + ; fun_group - : fun_group_header fun_logic ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pGroupFun); - ASSERT(pLogic ); - pGroupFun->setSrcPos(@1, @3); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); - } - | fun_group_header RDO_NoCheck ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - ASSERT(pGroupFun); - pGroupFun->setSrcPos(@1, @3); - LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); - ASSERT(pTrueLogic); - pTrueLogic->setSrcPos (@2); - pTrueLogic->setSrcText("NoCheck"); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); - } - | fun_group_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_group_header fun_logic ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pGroupFun); + ASSERT(pLogic ); + pGroupFun->setSrcPos(@1, @3); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); + } + | fun_group_header RDO_NoCheck ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + ASSERT(pGroupFun); + pGroupFun->setSrcPos(@1, @3); + LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); + ASSERT(pTrueLogic); + pTrueLogic->setSrcPos (@2); + pTrueLogic->setSrcText("NoCheck"); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); + } + | fun_group_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Select // -------------------------------------------------------------------------------- fun_select_header - : RDO_Select '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); - ASSERT(pSelect); - pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); - $$ = CONVERTER->stack().push(pSelect); - } - | RDO_Select '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | RDO_Select error - { - CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); - } - ; + : RDO_Select '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); + ASSERT(pSelect); + pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); + $$ = CONVERTER->stack().push(pSelect); + } + | RDO_Select '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | RDO_Select error + { + CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); + } + ; fun_select_body - : fun_select_header fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header RDO_NoCheck ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - RDOParserSrcInfo logicInfo(@2, "NoCheck"); - pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); - rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); - ASSERT(pCalc); - LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); - ASSERT(pLogic); - pLogic->setSrcInfo(logicInfo); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_select_header fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header RDO_NoCheck ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + RDOParserSrcInfo logicInfo(@2, "NoCheck"); + pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); + rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); + ASSERT(pCalc); + LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); + ASSERT(pLogic); + pLogic->setSrcInfo(logicInfo); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; fun_select_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_select_logic - : fun_select_body '.' fun_select_keyword '(' fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcPos(@1, @6); - LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup((RDOFUNGroupLogic::FunGroupType)$3, pLogic); - ASSERT(pLogicSelect); - $$ = CONVERTER->stack().push(pLogicSelect); - } - | fun_select_body '.' fun_select_keyword '(' error - { - CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); - } - | fun_select_body '.' fun_select_keyword error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); - LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); - ASSERT(pLogic); - $$ = CONVERTER->stack().push(pLogic); - } - | fun_select_body '.' RDO_Empty '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' error - { - CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); - } - | fun_select_body error - { - CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); - } - ; + : fun_select_body '.' fun_select_keyword '(' fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcPos(@1, @6); + LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup(static_cast($3), pLogic); + ASSERT(pLogicSelect); + $$ = CONVERTER->stack().push(pLogicSelect); + } + | fun_select_body '.' fun_select_keyword '(' error + { + CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); + } + | fun_select_body '.' fun_select_keyword error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); + LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); + ASSERT(pLogic); + $$ = CONVERTER->stack().push(pLogic); + } + | fun_select_body '.' RDO_Empty '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' error + { + CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); + } + | fun_select_body error + { + CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); + } + ; fun_select_arithm - : fun_select_body '.' RDO_Size '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); - LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | fun_select_body '.' RDO_Size error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Size '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - ; + : fun_select_body '.' RDO_Size '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); + LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | fun_select_body '.' RDO_Size error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Size '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + ; %% diff --git a/converter/smr2rdox/grammar/rdoopr.y b/converter/smr2rdox/grammar/rdoopr.y index 1d6856992..0ca700081 100644 --- a/converter/smr2rdox/grammar/rdoopr.y +++ b/converter/smr2rdox/grammar/rdoopr.y @@ -1,14 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdoopr.y - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \authors Лущан Дмитрий (dluschan@rk9.bmstu.ru) - \date - \brief - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -17,175 +6,175 @@ %pure-parser %param {void* lexer} -%token RDO_Resource_type 257 -%token RDO_permanent 258 -%token RDO_Parameters 259 -%token RDO_integer 260 -%token RDO_real 261 -%token RDO_End 262 -%token RDO_temporary 263 -%token RDO_IDENTIF 264 -%token RDO_INT_CONST 265 -%token RDO_REAL_CONST 266 -%token RDO_such_as 267 -%token RDO_dblpoint 268 -%token RDO_Resources 269 -%token RDO_trace 270 -%token RDO_no_trace 271 -%token RDO_IDENTIF_COLON 272 -%token RDO_Constant 273 -%token RDO_Body 274 -%token RDO_Function 275 -%token RDO_Type 276 -%token RDO_algorithmic 277 -%token RDO_table 278 -%token RDO_list 279 -%token RDO_Exist 281 -%token RDO_Not_Exist 282 -%token RDO_For_All 283 -%token RDO_Not_For_All 284 -%token RDO_neq 285 -%token RDO_leq 286 -%token RDO_geq 287 -%token RDO_NoCheck 288 -%token RDO_Calculate_if 289 -%token RDO_or 290 -%token RDO_and 291 -%token RDO_Sequence 292 -%token RDO_uniform 293 -%token RDO_exponential 294 -%token RDO_normal 295 -%token RDO_by_hist 296 -%token RDO_enumerative 297 - -%token RDO_Pattern 298 -%token RDO_operation 299 -%token RDO_irregular_event 300 -%token RDO_rule 301 -%token RDO_keyboard 302 -%token RDO_Relevant_resources 303 -%token RDO_Keep 304 -%token RDO_Create 305 -%token RDO_Erase 306 -%token RDO_NonExist 307 -%token RDO_IDENTIF_NoChange 308 -%token RDO_Time 309 -%token RDO_Choice 310 -%token RDO_from 311 -%token RDO_first 312 -%token RDO_Convert_begin 313 -%token RDO_Convert_end 314 -%token RDO_Convert_rule 315 -%token RDO_Convert_event 316 -%token RDO_with_max 317 -%token RDO_with_min 318 -%token RDO_set 319 -%token RDO_IDENTIF_NoChange_NoChange 320 -%token RDO_Operations 321 - -%token RDO_Results 322 -%token RDO_watch_par 323 -%token RDO_watch_state 324 -%token RDO_watch_quant 325 -%token RDO_watch_value 326 -%token RDO_get_value 327 - -%token RDO_Model_name 328 -%token RDO_Resource_file 329 -%token RDO_OprIev_file 330 -%token RDO_Frame_file 331 -%token RDO_Statistic_file 332 -%token RDO_Results_file 333 -%token RDO_Trace_file 334 -%token RDO_Show_mode 335 -%token RDO_Frame_number 336 -%token RDO_Show_rate 337 -%token RDO_Run_StartTime 338 -%token RDO_Trace_StartTime 339 -%token RDO_Trace_EndTime 340 -%token RDO_Terminate_if 341 -%token RDO_Break_point 342 -%token RDO_Seed 343 -%token RDO_NoShow 344 -%token RDO_Monitor 345 -%token RDO_Animation 346 -%token RDO_NoChange 347 - -%token RDO_Decision_point 348 -%token RDO_search 349 -%token RDO_trace_stat 350 -%token RDO_trace_tops 351 -%token RDO_trace_all 352 -%token RDO_Condition 353 -%token RDO_Term_condition 354 -%token RDO_Evaluate_by 355 -%token RDO_Compare_tops 356 -%token RDO_NO 357 -%token RDO_YES 358 -%token RDO_Activities 359 -%token RDO_value_before 360 -%token RDO_value_after 361 -%token RDO_some 362 -%token RDO_Process 363 -%token RDO_SEIZE 364 -%token RDO_GENERATE 365 -%token RDO_TERMINATE 366 -%token RDO_ADVANCE 367 -%token RDO_RELEASE 368 -%token RDO_if 369 -%token RDO_CF 370 -%token RDO_Priority 371 -%token RDO_prior 372 -%token RDO_Parent 373 - -%token RDO_Frame 400 -%token RDO_Show_if 401 -%token RDO_Back_picture 402 -%token RDO_Show 403 -%token RDO_frm_cell 404 -%token RDO_text 405 -%token RDO_bitmap 406 -%token RDO_s_bmp 407 -%token RDO_rect 408 -%token RDO_r_rect 409 -%token RDO_line 410 -%token RDO_ellipse 411 -%token RDO_triang 412 -%token RDO_active 413 -%token RDO_ruler 414 -%token RDO_space 415 -%token RDO_color_transparent 416 -%token RDO_color_last 417 -%token RDO_color_white 418 -%token RDO_color_black 419 -%token RDO_color_red 420 -%token RDO_color_green 421 -%token RDO_color_blue 422 -%token RDO_color_cyan 423 -%token RDO_color_magenta 424 -%token RDO_color_yellow 425 -%token RDO_color_gray 426 - -%token RDO_IDENTIF_RELRES 427 -%token RDO_typedef 428 -%token RDO_enum 429 - -%token RDO_STRING_CONST 430 -%token RDO_Select 431 -%token RDO_Size 432 -%token RDO_Empty 433 -%token RDO_not 434 -%token RDO_UMINUS 435 -%token RDO_string 436 -%token RDO_bool 437 -%token RDO_BOOL_CONST 438 -%token RDO_Fuzzy 439 -%token RDO_Fuzzy_Term 440 -%token RDO_eq 441 -%token RDO_External_Model 442 -%token RDO_QUEUE 443 -%token RDO_DEPART 444 -%token RDO_ASSIGN 445 +%token RDO_Resource_type 257 +%token RDO_permanent 258 +%token RDO_Parameters 259 +%token RDO_integer 260 +%token RDO_real 261 +%token RDO_End 262 +%token RDO_temporary 263 +%token RDO_IDENTIF 264 +%token RDO_INT_CONST 265 +%token RDO_REAL_CONST 266 +%token RDO_such_as 267 +%token RDO_dblpoint 268 +%token RDO_Resources 269 +%token RDO_trace 270 +%token RDO_no_trace 271 +%token RDO_IDENTIF_COLON 272 +%token RDO_Constant 273 +%token RDO_Body 274 +%token RDO_Function 275 +%token RDO_Type 276 +%token RDO_algorithmic 277 +%token RDO_table 278 +%token RDO_list 279 +%token RDO_Exist 281 +%token RDO_Not_Exist 282 +%token RDO_For_All 283 +%token RDO_Not_For_All 284 +%token RDO_neq 285 +%token RDO_leq 286 +%token RDO_geq 287 +%token RDO_NoCheck 288 +%token RDO_Calculate_if 289 +%token RDO_or 290 +%token RDO_and 291 +%token RDO_Sequence 292 +%token RDO_uniform 293 +%token RDO_exponential 294 +%token RDO_normal 295 +%token RDO_by_hist 296 +%token RDO_enumerative 297 + +%token RDO_Pattern 298 +%token RDO_operation 299 +%token RDO_irregular_event 300 +%token RDO_rule 301 +%token RDO_keyboard 302 +%token RDO_Relevant_resources 303 +%token RDO_Keep 304 +%token RDO_Create 305 +%token RDO_Erase 306 +%token RDO_NonExist 307 +%token RDO_IDENTIF_NoChange 308 +%token RDO_Time 309 +%token RDO_Choice 310 +%token RDO_from 311 +%token RDO_first 312 +%token RDO_Convert_begin 313 +%token RDO_Convert_end 314 +%token RDO_Convert_rule 315 +%token RDO_Convert_event 316 +%token RDO_with_max 317 +%token RDO_with_min 318 +%token RDO_set 319 +%token RDO_IDENTIF_NoChange_NoChange 320 +%token RDO_Operations 321 + +%token RDO_Results 322 +%token RDO_watch_par 323 +%token RDO_watch_state 324 +%token RDO_watch_quant 325 +%token RDO_watch_value 326 +%token RDO_get_value 327 + +%token RDO_Model_name 328 +%token RDO_Resource_file 329 +%token RDO_OprIev_file 330 +%token RDO_Frame_file 331 +%token RDO_Statistic_file 332 +%token RDO_Results_file 333 +%token RDO_Trace_file 334 +%token RDO_Show_mode 335 +%token RDO_Frame_number 336 +%token RDO_Show_rate 337 +%token RDO_Run_StartTime 338 +%token RDO_Trace_StartTime 339 +%token RDO_Trace_EndTime 340 +%token RDO_Terminate_if 341 +%token RDO_Break_point 342 +%token RDO_Seed 343 +%token RDO_NoShow 344 +%token RDO_Monitor 345 +%token RDO_Animation 346 +%token RDO_NoChange 347 + +%token RDO_Decision_point 348 +%token RDO_search 349 +%token RDO_trace_stat 350 +%token RDO_trace_tops 351 +%token RDO_trace_all 352 +%token RDO_Condition 353 +%token RDO_Term_condition 354 +%token RDO_Evaluate_by 355 +%token RDO_Compare_tops 356 +%token RDO_NO 357 +%token RDO_YES 358 +%token RDO_Activities 359 +%token RDO_value_before 360 +%token RDO_value_after 361 +%token RDO_some 362 +%token RDO_Process 363 +%token RDO_SEIZE 364 +%token RDO_GENERATE 365 +%token RDO_TERMINATE 366 +%token RDO_ADVANCE 367 +%token RDO_RELEASE 368 +%token RDO_if 369 +%token RDO_CF 370 +%token RDO_Priority 371 +%token RDO_prior 372 +%token RDO_Parent 373 + +%token RDO_Frame 400 +%token RDO_Show_if 401 +%token RDO_Back_picture 402 +%token RDO_Show 403 +%token RDO_frm_cell 404 +%token RDO_text 405 +%token RDO_bitmap 406 +%token RDO_s_bmp 407 +%token RDO_rect 408 +%token RDO_r_rect 409 +%token RDO_line 410 +%token RDO_ellipse 411 +%token RDO_triang 412 +%token RDO_active 413 +%token RDO_ruler 414 +%token RDO_space 415 +%token RDO_color_transparent 416 +%token RDO_color_last 417 +%token RDO_color_white 418 +%token RDO_color_black 419 +%token RDO_color_red 420 +%token RDO_color_green 421 +%token RDO_color_blue 422 +%token RDO_color_cyan 423 +%token RDO_color_magenta 424 +%token RDO_color_yellow 425 +%token RDO_color_gray 426 + +%token RDO_IDENTIF_RELRES 427 +%token RDO_typedef 428 +%token RDO_enum 429 + +%token RDO_STRING_CONST 430 +%token RDO_Select 431 +%token RDO_Size 432 +%token RDO_Empty 433 +%token RDO_not 434 +%token RDO_UMINUS 435 +%token RDO_string 436 +%token RDO_bool 437 +%token RDO_BOOL_CONST 438 +%token RDO_Fuzzy 439 +%token RDO_Fuzzy_Term 440 +%token RDO_eq 441 +%token RDO_External_Model 442 +%token RDO_QUEUE 443 +%token RDO_DEPART 444 +%token RDO_ASSIGN 445 %{ @@ -210,243 +199,279 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE %% opr_main - : /* empty */ - | opr_end - { - LPDocUpdate pOperationsMove = rdo::Factory::create( - @1.m_first_seek, - @1.m_last_seek, - 0, - IDocument::DPT - ); - ASSERT(pOperationsMove); - CONVERTER->insertDocUpdate(pOperationsMove); - } - | error - { - CONVERTER->error().error(@1, "Неизвестная ошибка"); - } - ; - -opr_header - : RDO_Operations - { - LPDocUpdate pOperationsReplace = rdo::Factory::create( - @1.m_first_seek, - @1.m_last_seek, - "$Decision_point Operations: some\n$Activities" - ); - ASSERT(pOperationsReplace); - CONVERTER->insertDocUpdate(pOperationsReplace); - - LPRDOOperations pOperations = rdo::Factory::create(@1); - ASSERT(pOperations); - $$ = CONVERTER->stack().push(pOperations); - } - ; - -opr_body - : opr_header RDO_IDENTIF_COLON RDO_IDENTIF - { - LPRDOOperations pOperations = CONVERTER->stack().pop($1); - ASSERT(pOperations); - LPRDOValue pName = CONVERTER->stack().pop($2); - LPRDOValue pPattern = CONVERTER->stack().pop($3); - LPRDOOPROperation pOperation = pOperations->addNewActivity(pName->src_info(), pPattern->src_info()).object_dynamic_cast(); - ASSERT(pOperation); - - if (pOperation->pattern()->getType() == RDOPATPattern::PT_IE) - { - LPDocUpdate pIEDelete = rdo::Factory::create( - @2.m_first_seek, - @3.m_last_seek - ); - ASSERT(pIEDelete); - CONVERTER->insertDocUpdate(pIEDelete); - } - - $$ = CONVERTER->stack().push(pOperation); - } - | opr_param RDO_IDENTIF_COLON RDO_IDENTIF - { - LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); - ASSERT(pOperation); - pOperation->endParam(@1); - - LPRDOOperations pOperations = CONVERTER->getLastOperations(); - ASSERT(pOperations); - LPRDOValue pName = CONVERTER->stack().pop($2); - LPRDOValue pPattern = CONVERTER->stack().pop($3); - pOperation = pOperations->addNewActivity(pName->src_info(), pPattern->src_info()); - ASSERT(pOperation); - - if (pOperation->pattern()->getType() == RDOPATPattern::PT_IE) - { - LPDocUpdate pIEDelete = rdo::Factory::create( - @2.m_first_seek, - @3.m_last_seek - ); - ASSERT(pIEDelete); - CONVERTER->insertDocUpdate(pIEDelete); - } - - $$ = CONVERTER->stack().push(pOperation); - } - | opr_header RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@2, @3, "Ожидается имя образца"); - } - | opr_param RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@2, @3, "Ожидается имя образца"); - } - | opr_header error - { - CONVERTER->error().error( @2, "Ожидается имя операции"); - } - ; + : /* empty */ + | opr_end + { + LPDocUpdate pOperationsMove = rdo::Factory::create( + @1.m_first_seek, + @1.m_last_seek, + 0, + IDocument::Type::DPT + ); + ASSERT(pOperationsMove); + CONVERTER->insertDocUpdate(pOperationsMove); + } + | error + { + CONVERTER->error().error(@1, "Неизвестная ошибка"); + } + ; opr_keyb - : opr_body - | opr_keyb RDO_STRING_CONST - { - LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); - ASSERT(pOperation); - const std::string key = CONVERTER->stack().pop($2)->value().getString(); - pOperation->addHotKey(key, @2); - $$ = CONVERTER->stack().push(pOperation); - } - | opr_keyb '+' RDO_STRING_CONST - { - LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); - ASSERT(pOperation); - const std::string key = CONVERTER->stack().pop($3)->value().getString(); - pOperation->addHotKey(key, @3); - $$ = CONVERTER->stack().push(pOperation); - } - ; + : RDO_STRING_CONST + { + LPRDOOPROperation pOperation = CONVERTER->getLastOPROperation(); + ASSERT(pOperation); + const std::string key = CONVERTER->stack().pop($1)->value().getString(); + pOperation->addHotKey(key, @1); + } + | opr_keyb '+' RDO_STRING_CONST + { + LPRDOOPROperation pOperation = CONVERTER->getLastOPROperation(); + ASSERT(pOperation); + const std::string key = CONVERTER->stack().pop($3)->value().getString(); + pOperation->addHotKey(key, @3); + } + ; opr_param - : opr_param '*' - { - LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); - ASSERT(pOperation); - - if (pOperation->pattern()->getType() == RDOPATPattern::PT_IE) - { - LPDocUpdate pIEParamDelete = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek - ); - ASSERT(pIEParamDelete); - CONVERTER->insertDocUpdate(pIEParamDelete); - } - - pOperation->addParam(rdo::Factory::create(RDOParserSrcInfo(@2, "*"))); - $$ = CONVERTER->stack().push(pOperation); - } - | opr_param RDO_INT_CONST - { - LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); - ASSERT(pOperation); - - if (pOperation->pattern()->getType() == RDOPATPattern::PT_IE) - { - LPDocUpdate pIEParamDelete = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek - ); - ASSERT(pIEParamDelete); - CONVERTER->insertDocUpdate(pIEParamDelete); - } - - pOperation->addParam(CONVERTER->stack().pop($2)); - $$ = CONVERTER->stack().push(pOperation); - } - | opr_param RDO_REAL_CONST - { - LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); - ASSERT(pOperation); - - if (pOperation->pattern()->getType() == RDOPATPattern::PT_IE) - { - LPDocUpdate pIEParamDelete = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek - ); - ASSERT(pIEParamDelete); - CONVERTER->insertDocUpdate(pIEParamDelete); - } - - pOperation->addParam(CONVERTER->stack().pop($2)); - $$ = CONVERTER->stack().push(pOperation); - } - | opr_param RDO_BOOL_CONST - { - LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); - ASSERT(pOperation); - - if (pOperation->pattern()->getType() == RDOPATPattern::PT_IE) - { - LPDocUpdate pIEParamDelete = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek - ); - ASSERT(pIEParamDelete); - CONVERTER->insertDocUpdate(pIEParamDelete); - } - - pOperation->addParam(CONVERTER->stack().pop($2)); - $$ = CONVERTER->stack().push(pOperation); - } - | opr_param RDO_STRING_CONST - { - LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); - ASSERT(pOperation); - - if (pOperation->pattern()->getType() == RDOPATPattern::PT_IE) - { - LPDocUpdate pIEParamDelete = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek - ); - ASSERT(pIEParamDelete); - CONVERTER->insertDocUpdate(pIEParamDelete); - } - - pOperation->addParam(CONVERTER->stack().pop($2)); - $$ = CONVERTER->stack().push(pOperation); - } - | opr_param RDO_IDENTIF - { - LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); - ASSERT(pOperation); - - if (pOperation->pattern()->getType() == RDOPATPattern::PT_IE) - { - LPDocUpdate pIEParamDelete = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek - ); - ASSERT(pIEParamDelete); - CONVERTER->insertDocUpdate(pIEParamDelete); - } - - pOperation->addParam(CONVERTER->stack().pop($2)); - $$ = CONVERTER->stack().push(pOperation); - } - | opr_keyb - ; + : opr_param_atomic + { + $$ = 0; + } + | opr_param opr_param_atomic + { + const std::string comma(","); + + LPDocUpdate pCommaInsert = rdo::Factory::create( + @1.m_last_seek, + comma + ); + ASSERT(pCommaInsert); + CONVERTER->insertDocUpdate(pCommaInsert); + + $$ = $1 + comma.length(); + } + ; + +opr_param_atomic + : '*' + { + LPRDOOPROperation pOperation = CONVERTER->getLastOPROperation(); + ASSERT(pOperation); + + pOperation->addParam(rdo::Factory::create(RDOParserSrcInfo(@1, "*"))); + } + | RDO_INT_CONST + { + LPRDOOPROperation pOperation = CONVERTER->getLastOPROperation(); + ASSERT(pOperation); + + pOperation->addParam(CONVERTER->stack().pop($1)); + } + | RDO_REAL_CONST + { + LPRDOOPROperation pOperation = CONVERTER->getLastOPROperation(); + ASSERT(pOperation); + + pOperation->addParam(CONVERTER->stack().pop($1)); + } + | RDO_BOOL_CONST + { + LPRDOOPROperation pOperation = CONVERTER->getLastOPROperation(); + ASSERT(pOperation); + + pOperation->addParam(CONVERTER->stack().pop($1)); + } + | RDO_STRING_CONST + { + LPRDOOPROperation pOperation = CONVERTER->getLastOPROperation(); + ASSERT(pOperation); + + pOperation->addParam(CONVERTER->stack().pop($1)); + } + | RDO_IDENTIF + { + LPRDOOPROperation pOperation = CONVERTER->getLastOPROperation(); + ASSERT(pOperation); + + pOperation->addParam(CONVERTER->stack().pop($1)); + } + ; + +opr_body + : opr_activity + | opr_body opr_activity + ; + +opr_name + : RDO_IDENTIF_COLON RDO_IDENTIF + { + LPRDOOperations pOperations = CONVERTER->getLastOperations(); + ASSERT(pOperations); + + LPRDOValue pName = CONVERTER->stack().pop($1); + LPRDOValue pPattern = CONVERTER->stack().pop($2); + LPRDOOPROperation pOperation = pOperations->addNewActivity(pName->src_info(), pPattern->src_info()).object_dynamic_cast(); + ASSERT(pOperation); + + $$ = CONVERTER->stack().push(pOperation); + } + +opr_activity + : opr_name + { + LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); + ASSERT(pOperation); + + if (pOperation->pattern()->getType() == RDOPATPattern::Type::IE) + { + LPDocUpdate pIEDelete = rdo::Factory::create( + @1.m_first_seek, + @1.m_last_seek + ); + ASSERT(pIEDelete); + CONVERTER->insertDocUpdate(pIEDelete); + } + else + { + LPDocUpdate pSemicolonInsert = rdo::Factory::create( + @1.m_last_seek, + ";" + ); + ASSERT(pSemicolonInsert); + CONVERTER->insertDocUpdate(pSemicolonInsert); + } + + pOperation->endParam(@1); + } + | opr_name opr_keyb + { + LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); + ASSERT(pOperation); + + if (pOperation->pattern()->getType() == RDOPATPattern::Type::IE) + { + LPDocUpdate pIEDelete = rdo::Factory::create( + @1.m_first_seek, + @2.m_last_seek + ); + ASSERT(pIEDelete); + CONVERTER->insertDocUpdate(pIEDelete); + } + else + { + LPDocUpdate pLeftBracketInsert = rdo::Factory::create( + @2.m_first_seek, + "(" + ); + ASSERT(pLeftBracketInsert); + CONVERTER->insertDocUpdate(pLeftBracketInsert); + + LPDocUpdate pRightBracketAndSemicolonInsert = rdo::Factory::create( + @2.m_last_seek, + ");" + ); + ASSERT(pRightBracketAndSemicolonInsert); + CONVERTER->insertDocUpdate(pRightBracketAndSemicolonInsert); + } + + pOperation->endParam(@2); + } + | opr_name opr_param + { + LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); + ASSERT(pOperation); + + if (pOperation->pattern()->getType() == RDOPATPattern::Type::IE) + { + LPDocUpdate pIEDelete = rdo::Factory::create( + @1.m_first_seek, + @2.m_last_seek + ); + ASSERT(pIEDelete); + CONVERTER->insertDocUpdate(pIEDelete); + } + else + { + LPDocUpdate pLeftBracketInsert = rdo::Factory::create( + @2.m_first_seek, + "(" + ); + ASSERT(pLeftBracketInsert); + CONVERTER->insertDocUpdate(pLeftBracketInsert); + + LPDocUpdate pRightBracketAndSemicolonInsert = rdo::Factory::create( + @2.m_last_seek, + ");" + ); + ASSERT(pRightBracketAndSemicolonInsert); + CONVERTER->insertDocUpdate(pRightBracketAndSemicolonInsert); + } + + pOperation->endParam(@2); + } + | opr_name opr_keyb opr_param + { + LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); + ASSERT(pOperation); + + if (pOperation->pattern()->getType() == RDOPATPattern::Type::IE) + { + LPDocUpdate pIEDelete = rdo::Factory::create( + @1.m_first_seek, + @3.m_last_seek + ); + ASSERT(pIEDelete); + CONVERTER->insertDocUpdate(pIEDelete); + } + else + { + LPDocUpdate pLeftBracketInsert = rdo::Factory::create( + @2.m_first_seek, + "(" + ); + ASSERT(pLeftBracketInsert); + CONVERTER->insertDocUpdate(pLeftBracketInsert); + + LPDocUpdate pCommaInsert = rdo::Factory::create( + @2.m_last_seek, + "," + ); + ASSERT(pCommaInsert); + CONVERTER->insertDocUpdate(pCommaInsert); + + LPDocUpdate pRightBracketAndSemicolonInsert = rdo::Factory::create( + @3.m_last_seek, + ");" + ); + ASSERT(pRightBracketAndSemicolonInsert); + CONVERTER->insertDocUpdate(pRightBracketAndSemicolonInsert); + } + + pOperation->endParam(@2); + } + ; + +opr_header + : RDO_Operations + { + LPDocUpdate pOperationsReplace = rdo::Factory::create( + @1.m_first_seek, + @1.m_last_seek, + "$Decision_point Operations: some\n$Activities" + ); + ASSERT(pOperationsReplace); + CONVERTER->insertDocUpdate(pOperationsReplace); + + LPRDOOperations pOperations = rdo::Factory::create(@1); + ASSERT(pOperations); + } + ; opr_end - : opr_param RDO_End - { - LPRDOOPROperation pOperation = CONVERTER->stack().pop($1); - ASSERT(pOperation); - pOperation->endParam(@1); - $$ = CONVERTER->stack().push(pOperation); - } - ; + : opr_header opr_body RDO_End + ; // -------------------------------------------------------------------------------- // -------------------- Общие составные токены для всех объектов РДО @@ -454,488 +479,488 @@ opr_end // -------------------- Логические выражения // -------------------------------------------------------------------------------- fun_logic_eq - : '=' - { - LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); - ASSERT(pInsert); - CONVERTER->insertDocUpdate(pInsert); - - $$ = RDO_eq; - } - | RDO_eq - { - $$ = RDO_eq; - } - ; + : '=' + { + LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); + ASSERT(pInsert); + CONVERTER->insertDocUpdate(pInsert); + + $$ = RDO_eq; + } + | RDO_eq + { + $$ = RDO_eq; + } + ; fun_logic - : fun_arithm fun_logic_eq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_neq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '<' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '>' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_leq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_geq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_and fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_or fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pArithm); - LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_group - | fun_select_logic - | '[' fun_logic ']' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("[" + pLogic->src_text() + "]"); - $$ = CONVERTER->stack().push(pLogic); - } - | '(' fun_logic ')' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("(" + pLogic->src_text() + ")"); - $$ = CONVERTER->stack().push(pLogic); - } - | RDO_not fun_logic - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - LPRDOFUNLogic pLogicNot = pLogic->operator_not(); - ASSERT(pLogicNot); - pLogicNot->setSrcPos (@1, @2); - pLogicNot->setSrcText("not " + pLogic->src_text()); - $$ = CONVERTER->stack().push(pLogicNot); - } - | '[' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | '(' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - ; + : fun_arithm fun_logic_eq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_neq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '<' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '>' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_leq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_geq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_and fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_or fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pArithm); + LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_group + | fun_select_logic + | '[' fun_logic ']' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("[" + pLogic->src_text() + "]"); + $$ = CONVERTER->stack().push(pLogic); + } + | '(' fun_logic ')' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("(" + pLogic->src_text() + ")"); + $$ = CONVERTER->stack().push(pLogic); + } + | RDO_not fun_logic + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + LPRDOFUNLogic pLogicNot = pLogic->operator_not(); + ASSERT(pLogicNot); + pLogicNot->setSrcPos (@1, @2); + pLogicNot->setSrcText("not " + pLogic->src_text()); + $$ = CONVERTER->stack().push(pLogicNot); + } + | '[' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | '(' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Арифметические выражения // -------------------------------------------------------------------------------- fun_arithm - : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | fun_arithm '+' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '-' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '*' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '/' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm_func_call - | fun_select_arithm - | '(' fun_arithm ')' - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - pArithm->setSrcPos (@1, @3); - pArithm->setSrcText("(" + pArithm->src_text() + ")"); - $$ = CONVERTER->stack().push(pArithm); - } - | '-' fun_arithm %prec RDO_UMINUS - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - RDOParserSrcInfo info; - info.setSrcPos (@1, @2); - info.setSrcText("-" + pArithm->src_text()); - $$ = CONVERTER->stack().push( - rdo::Factory::create( - rdo::Factory::create(pArithm->type(), info), - rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() - ) - ); - } - ; + : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | fun_arithm '+' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '-' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '*' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '/' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm_func_call + | fun_select_arithm + | '(' fun_arithm ')' + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + pArithm->setSrcPos (@1, @3); + pArithm->setSrcText("(" + pArithm->src_text() + ")"); + $$ = CONVERTER->stack().push(pArithm); + } + | '-' fun_arithm %prec RDO_UMINUS + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + RDOParserSrcInfo info; + info.setSrcPos (@1, @2); + info.setSrcText("-" + pArithm->src_text()); + $$ = CONVERTER->stack().push( + rdo::Factory::create( + rdo::Factory::create(pArithm->type(), info), + rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() + ) + ); + } + ; // -------------------------------------------------------------------------------- // -------------------- Функции и последовательности // -------------------------------------------------------------------------------- fun_arithm_func_call - : RDO_IDENTIF '(' ')' - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @3); - pFunParams->setSrcText(funName + "()"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @4); - pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' error - { - CONVERTER->error().error(@3, "Ошибка в параметрах функции"); - } - ; + : RDO_IDENTIF '(' ')' + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @3); + pFunParams->setSrcText(funName + "()"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @4); + pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' error + { + CONVERTER->error().error(@3, "Ошибка в параметрах функции"); + } + ; fun_arithm_func_call_pars - : fun_arithm - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars ',' fun_arithm - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars error - { - CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); - } - | fun_arithm_func_call_pars ',' error - { - CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); - } - ; + : fun_arithm + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars ',' fun_arithm + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars error + { + CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); + } + | fun_arithm_func_call_pars ',' error + { + CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Групповые выражения // -------------------------------------------------------------------------------- fun_group_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_group_header - : fun_group_keyword '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - $$ = CONVERTER->stack().push(rdo::Factory::create((RDOFUNGroupLogic::FunGroupType)$1, pValue->src_info())); - } - | fun_group_keyword '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | fun_group_keyword error - { - CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); - } - ; + : fun_group_keyword '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + $$ = CONVERTER->stack().push(rdo::Factory::create(static_cast($1), pValue->src_info())); + } + | fun_group_keyword '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | fun_group_keyword error + { + CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); + } + ; fun_group - : fun_group_header fun_logic ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pGroupFun); - ASSERT(pLogic ); - pGroupFun->setSrcPos(@1, @3); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); - } - | fun_group_header RDO_NoCheck ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - ASSERT(pGroupFun); - pGroupFun->setSrcPos(@1, @3); - LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); - ASSERT(pTrueLogic); - pTrueLogic->setSrcPos (@2); - pTrueLogic->setSrcText("NoCheck"); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); - } - | fun_group_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_group_header fun_logic ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pGroupFun); + ASSERT(pLogic ); + pGroupFun->setSrcPos(@1, @3); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); + } + | fun_group_header RDO_NoCheck ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + ASSERT(pGroupFun); + pGroupFun->setSrcPos(@1, @3); + LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); + ASSERT(pTrueLogic); + pTrueLogic->setSrcPos (@2); + pTrueLogic->setSrcText("NoCheck"); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); + } + | fun_group_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Select // -------------------------------------------------------------------------------- fun_select_header - : RDO_Select '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); - ASSERT(pSelect); - pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); - $$ = CONVERTER->stack().push(pSelect); - } - | RDO_Select '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | RDO_Select error - { - CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); - } - ; + : RDO_Select '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); + ASSERT(pSelect); + pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); + $$ = CONVERTER->stack().push(pSelect); + } + | RDO_Select '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | RDO_Select error + { + CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); + } + ; fun_select_body - : fun_select_header fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header RDO_NoCheck ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - RDOParserSrcInfo logicInfo(@2, "NoCheck"); - pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); - rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); - ASSERT(pCalc); - LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); - ASSERT(pLogic); - pLogic->setSrcInfo(logicInfo); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_select_header fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header RDO_NoCheck ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + RDOParserSrcInfo logicInfo(@2, "NoCheck"); + pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); + rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); + ASSERT(pCalc); + LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); + ASSERT(pLogic); + pLogic->setSrcInfo(logicInfo); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; fun_select_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_select_logic - : fun_select_body '.' fun_select_keyword '(' fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcPos(@1, @6); - LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup((RDOFUNGroupLogic::FunGroupType)$3, pLogic); - ASSERT(pLogicSelect); - $$ = CONVERTER->stack().push(pLogicSelect); - } - | fun_select_body '.' fun_select_keyword '(' error - { - CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); - } - | fun_select_body '.' fun_select_keyword error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); - LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); - ASSERT(pLogic); - $$ = CONVERTER->stack().push(pLogic); - } - | fun_select_body '.' RDO_Empty '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' error - { - CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); - } - | fun_select_body error - { - CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); - } - ; + : fun_select_body '.' fun_select_keyword '(' fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcPos(@1, @6); + LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup(static_cast($3), pLogic); + ASSERT(pLogicSelect); + $$ = CONVERTER->stack().push(pLogicSelect); + } + | fun_select_body '.' fun_select_keyword '(' error + { + CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); + } + | fun_select_body '.' fun_select_keyword error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); + LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); + ASSERT(pLogic); + $$ = CONVERTER->stack().push(pLogic); + } + | fun_select_body '.' RDO_Empty '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' error + { + CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); + } + | fun_select_body error + { + CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); + } + ; fun_select_arithm - : fun_select_body '.' RDO_Size '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); - LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | fun_select_body '.' RDO_Size error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Size '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - ; + : fun_select_body '.' RDO_Size '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); + LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | fun_select_body '.' RDO_Size error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Size '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + ; %% diff --git a/converter/smr2rdox/grammar/rdopat.y b/converter/smr2rdox/grammar/rdopat.y index 72f02bb26..f7f6aad21 100644 --- a/converter/smr2rdox/grammar/rdopat.y +++ b/converter/smr2rdox/grammar/rdopat.y @@ -1,14 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdopat.y - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \authors Лущан Дмитрий (dluschan@rk9.bmstu.ru) - \date 12.07.2010 - \brief закладка PAT - описание образцов активностей модели - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -17,175 +6,175 @@ %pure-parser %param {void* lexer} -%token RDO_Resource_type 257 -%token RDO_permanent 258 -%token RDO_Parameters 259 -%token RDO_integer 260 -%token RDO_real 261 -%token RDO_End 262 -%token RDO_temporary 263 -%token RDO_IDENTIF 264 -%token RDO_INT_CONST 265 -%token RDO_REAL_CONST 266 -%token RDO_such_as 267 -%token RDO_dblpoint 268 -%token RDO_Resources 269 -%token RDO_trace 270 -%token RDO_no_trace 271 -%token RDO_IDENTIF_COLON 272 -%token RDO_Constant 273 -%token RDO_Body 274 -%token RDO_Function 275 -%token RDO_Type 276 -%token RDO_algorithmic 277 -%token RDO_table 278 -%token RDO_list 279 -%token RDO_Exist 281 -%token RDO_Not_Exist 282 -%token RDO_For_All 283 -%token RDO_Not_For_All 284 -%token RDO_neq 285 -%token RDO_leq 286 -%token RDO_geq 287 -%token RDO_NoCheck 288 -%token RDO_Calculate_if 289 -%token RDO_or 290 -%token RDO_and 291 -%token RDO_Sequence 292 -%token RDO_uniform 293 -%token RDO_exponential 294 -%token RDO_normal 295 -%token RDO_by_hist 296 -%token RDO_enumerative 297 - -%token RDO_Pattern 298 -%token RDO_operation 299 -%token RDO_irregular_event 300 -%token RDO_rule 301 -%token RDO_keyboard 302 -%token RDO_Relevant_resources 303 -%token RDO_Keep 304 -%token RDO_Create 305 -%token RDO_Erase 306 -%token RDO_NonExist 307 -%token RDO_IDENTIF_NoChange 308 -%token RDO_Time 309 -%token RDO_Choice 310 -%token RDO_from 311 -%token RDO_first 312 -%token RDO_Convert_begin 313 -%token RDO_Convert_end 314 -%token RDO_Convert_rule 315 -%token RDO_Convert_event 316 -%token RDO_with_max 317 -%token RDO_with_min 318 -%token RDO_set 319 -%token RDO_IDENTIF_NoChange_NoChange 320 -%token RDO_Operations 321 - -%token RDO_Results 322 -%token RDO_watch_par 323 -%token RDO_watch_state 324 -%token RDO_watch_quant 325 -%token RDO_watch_value 326 -%token RDO_get_value 327 - -%token RDO_Model_name 328 -%token RDO_Resource_file 329 -%token RDO_OprIev_file 330 -%token RDO_Frame_file 331 -%token RDO_Statistic_file 332 -%token RDO_Results_file 333 -%token RDO_Trace_file 334 -%token RDO_Show_mode 335 -%token RDO_Frame_number 336 -%token RDO_Show_rate 337 -%token RDO_Run_StartTime 338 -%token RDO_Trace_StartTime 339 -%token RDO_Trace_EndTime 340 -%token RDO_Terminate_if 341 -%token RDO_Break_point 342 -%token RDO_Seed 343 -%token RDO_NoShow 344 -%token RDO_Monitor 345 -%token RDO_Animation 346 -%token RDO_NoChange 347 - -%token RDO_Decision_point 348 -%token RDO_search 349 -%token RDO_trace_stat 350 -%token RDO_trace_tops 351 -%token RDO_trace_all 352 -%token RDO_Condition 353 -%token RDO_Term_condition 354 -%token RDO_Evaluate_by 355 -%token RDO_Compare_tops 356 -%token RDO_NO 357 -%token RDO_YES 358 -%token RDO_Activities 359 -%token RDO_value_before 360 -%token RDO_value_after 361 -%token RDO_some 362 -%token RDO_Process 363 -%token RDO_SEIZE 364 -%token RDO_GENERATE 365 -%token RDO_TERMINATE 366 -%token RDO_ADVANCE 367 -%token RDO_RELEASE 368 -%token RDO_if 369 -%token RDO_CF 370 -%token RDO_Priority 371 -%token RDO_prior 372 -%token RDO_Parent 373 - -%token RDO_Frame 400 -%token RDO_Show_if 401 -%token RDO_Back_picture 402 -%token RDO_Show 403 -%token RDO_frm_cell 404 -%token RDO_text 405 -%token RDO_bitmap 406 -%token RDO_s_bmp 407 -%token RDO_rect 408 -%token RDO_r_rect 409 -%token RDO_line 410 -%token RDO_ellipse 411 -%token RDO_triang 412 -%token RDO_active 413 -%token RDO_ruler 414 -%token RDO_space 415 -%token RDO_color_transparent 416 -%token RDO_color_last 417 -%token RDO_color_white 418 -%token RDO_color_black 419 -%token RDO_color_red 420 -%token RDO_color_green 421 -%token RDO_color_blue 422 -%token RDO_color_cyan 423 -%token RDO_color_magenta 424 -%token RDO_color_yellow 425 -%token RDO_color_gray 426 - -%token RDO_IDENTIF_RELRES 427 -%token RDO_typedef 428 -%token RDO_enum 429 - -%token RDO_STRING_CONST 430 -%token RDO_Select 431 -%token RDO_Size 432 -%token RDO_Empty 433 -%token RDO_not 434 -%token RDO_UMINUS 435 -%token RDO_string 436 -%token RDO_bool 437 -%token RDO_BOOL_CONST 438 -%token RDO_Fuzzy 439 -%token RDO_Fuzzy_Term 440 -%token RDO_eq 441 -%token RDO_External_Model 442 -%token RDO_QUEUE 443 -%token RDO_DEPART 444 -%token RDO_ASSIGN 445 +%token RDO_Resource_type 257 +%token RDO_permanent 258 +%token RDO_Parameters 259 +%token RDO_integer 260 +%token RDO_real 261 +%token RDO_End 262 +%token RDO_temporary 263 +%token RDO_IDENTIF 264 +%token RDO_INT_CONST 265 +%token RDO_REAL_CONST 266 +%token RDO_such_as 267 +%token RDO_dblpoint 268 +%token RDO_Resources 269 +%token RDO_trace 270 +%token RDO_no_trace 271 +%token RDO_IDENTIF_COLON 272 +%token RDO_Constant 273 +%token RDO_Body 274 +%token RDO_Function 275 +%token RDO_Type 276 +%token RDO_algorithmic 277 +%token RDO_table 278 +%token RDO_list 279 +%token RDO_Exist 281 +%token RDO_Not_Exist 282 +%token RDO_For_All 283 +%token RDO_Not_For_All 284 +%token RDO_neq 285 +%token RDO_leq 286 +%token RDO_geq 287 +%token RDO_NoCheck 288 +%token RDO_Calculate_if 289 +%token RDO_or 290 +%token RDO_and 291 +%token RDO_Sequence 292 +%token RDO_uniform 293 +%token RDO_exponential 294 +%token RDO_normal 295 +%token RDO_by_hist 296 +%token RDO_enumerative 297 + +%token RDO_Pattern 298 +%token RDO_operation 299 +%token RDO_irregular_event 300 +%token RDO_rule 301 +%token RDO_keyboard 302 +%token RDO_Relevant_resources 303 +%token RDO_Keep 304 +%token RDO_Create 305 +%token RDO_Erase 306 +%token RDO_NonExist 307 +%token RDO_IDENTIF_NoChange 308 +%token RDO_Time 309 +%token RDO_Choice 310 +%token RDO_from 311 +%token RDO_first 312 +%token RDO_Convert_begin 313 +%token RDO_Convert_end 314 +%token RDO_Convert_rule 315 +%token RDO_Convert_event 316 +%token RDO_with_max 317 +%token RDO_with_min 318 +%token RDO_set 319 +%token RDO_IDENTIF_NoChange_NoChange 320 +%token RDO_Operations 321 + +%token RDO_Results 322 +%token RDO_watch_par 323 +%token RDO_watch_state 324 +%token RDO_watch_quant 325 +%token RDO_watch_value 326 +%token RDO_get_value 327 + +%token RDO_Model_name 328 +%token RDO_Resource_file 329 +%token RDO_OprIev_file 330 +%token RDO_Frame_file 331 +%token RDO_Statistic_file 332 +%token RDO_Results_file 333 +%token RDO_Trace_file 334 +%token RDO_Show_mode 335 +%token RDO_Frame_number 336 +%token RDO_Show_rate 337 +%token RDO_Run_StartTime 338 +%token RDO_Trace_StartTime 339 +%token RDO_Trace_EndTime 340 +%token RDO_Terminate_if 341 +%token RDO_Break_point 342 +%token RDO_Seed 343 +%token RDO_NoShow 344 +%token RDO_Monitor 345 +%token RDO_Animation 346 +%token RDO_NoChange 347 + +%token RDO_Decision_point 348 +%token RDO_search 349 +%token RDO_trace_stat 350 +%token RDO_trace_tops 351 +%token RDO_trace_all 352 +%token RDO_Condition 353 +%token RDO_Term_condition 354 +%token RDO_Evaluate_by 355 +%token RDO_Compare_tops 356 +%token RDO_NO 357 +%token RDO_YES 358 +%token RDO_Activities 359 +%token RDO_value_before 360 +%token RDO_value_after 361 +%token RDO_some 362 +%token RDO_Process 363 +%token RDO_SEIZE 364 +%token RDO_GENERATE 365 +%token RDO_TERMINATE 366 +%token RDO_ADVANCE 367 +%token RDO_RELEASE 368 +%token RDO_if 369 +%token RDO_CF 370 +%token RDO_Priority 371 +%token RDO_prior 372 +%token RDO_Parent 373 + +%token RDO_Frame 400 +%token RDO_Show_if 401 +%token RDO_Back_picture 402 +%token RDO_Show 403 +%token RDO_frm_cell 404 +%token RDO_text 405 +%token RDO_bitmap 406 +%token RDO_s_bmp 407 +%token RDO_rect 408 +%token RDO_r_rect 409 +%token RDO_line 410 +%token RDO_ellipse 411 +%token RDO_triang 412 +%token RDO_active 413 +%token RDO_ruler 414 +%token RDO_space 415 +%token RDO_color_transparent 416 +%token RDO_color_last 417 +%token RDO_color_white 418 +%token RDO_color_black 419 +%token RDO_color_red 420 +%token RDO_color_green 421 +%token RDO_color_blue 422 +%token RDO_color_cyan 423 +%token RDO_color_magenta 424 +%token RDO_color_yellow 425 +%token RDO_color_gray 426 + +%token RDO_IDENTIF_RELRES 427 +%token RDO_typedef 428 +%token RDO_enum 429 + +%token RDO_STRING_CONST 430 +%token RDO_Select 431 +%token RDO_Size 432 +%token RDO_Empty 433 +%token RDO_not 434 +%token RDO_UMINUS 435 +%token RDO_string 436 +%token RDO_bool 437 +%token RDO_BOOL_CONST 438 +%token RDO_Fuzzy 439 +%token RDO_Fuzzy_Term 440 +%token RDO_eq 441 +%token RDO_External_Model 442 +%token RDO_QUEUE 443 +%token RDO_DEPART 444 +%token RDO_ASSIGN 445 %{ @@ -222,1706 +211,1706 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE %% pat_main - : /* empty */ - | pat_main pat_pattern - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($2); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_IE: - { - LPDocUpdate pEventMove = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek, - IDocUpdate::Position::POSITION_END, - IDocument::EVN - ); - ASSERT(pEventMove); - CONVERTER->insertDocUpdate(pEventMove); - - LPDocUpdate pReturnInsert = rdo::Factory::create( - IDocUpdate::Position::POSITION_END, - "\r\n\r\n", - IDocument::EVN - ); - ASSERT(pReturnInsert); - CONVERTER->insertDocUpdate(pReturnInsert); - } - - default: - break; - } - CONVERTER->stack().push(pPattern); - } - | error - { - CONVERTER->error().error(@1, "Неизвестная ошибка"); - } - ; + : /* empty */ + | pat_main pat_pattern + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($2); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::IE: + { + LPDocUpdate pEventMove = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek, + IDocUpdate::Position::Type::POSITION_END, + IDocument::Type::EVN + ); + ASSERT(pEventMove); + CONVERTER->insertDocUpdate(pEventMove); + + LPDocUpdate pReturnInsert = rdo::Factory::create( + IDocUpdate::Position::Type::POSITION_END, + "\r\n\r\n", + IDocument::Type::EVN + ); + ASSERT(pReturnInsert); + CONVERTER->insertDocUpdate(pReturnInsert); + } + + default: + break; + } + CONVERTER->stack().push(pPattern); + } + | error + { + CONVERTER->error().error(@1, "Неизвестная ошибка"); + } + ; pat_header - : RDO_Pattern RDO_IDENTIF_COLON RDO_operation pat_trace - { - LPRDOValue pName = CONVERTER->stack().pop($2); - ASSERT(pName); - LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); - ASSERT(pPattern); - $$ = CONVERTER->stack().push(pPattern); - } - | RDO_Pattern RDO_IDENTIF_COLON RDO_irregular_event pat_trace - { - LPRDOValue pName = CONVERTER->stack().pop($2); - ASSERT(pName); - LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); - ASSERT(pPattern); - - LPDocUpdate pIEReplace = rdo::Factory::create( - @3.m_first_seek, - @3.m_last_seek, - "event" - ); - ASSERT(pIEReplace); - CONVERTER->insertDocUpdate(pIEReplace); - - $$ = CONVERTER->stack().push(pPattern); - } - | RDO_Pattern RDO_IDENTIF_COLON RDO_rule pat_trace - { - LPRDOValue pName = CONVERTER->stack().pop($2); - ASSERT(pName); - LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); - ASSERT(pPattern); - $$ = CONVERTER->stack().push(pPattern); - } - | RDO_Pattern RDO_IDENTIF_COLON RDO_keyboard pat_trace - { - LPRDOValue pName = CONVERTER->stack().pop($2); - ASSERT(pName); - LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); - ASSERT(pPattern); - $$ = CONVERTER->stack().push(pPattern); - } - | RDO_Pattern error - { - CONVERTER->error().error(@2, "Ожидается имя образца"); - } - | RDO_Pattern RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@2, @3, "Ожидается тип образца"); - } - ; + : RDO_Pattern RDO_IDENTIF_COLON RDO_operation pat_trace + { + LPRDOValue pName = CONVERTER->stack().pop($2); + ASSERT(pName); + LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); + ASSERT(pPattern); + $$ = CONVERTER->stack().push(pPattern); + } + | RDO_Pattern RDO_IDENTIF_COLON RDO_irregular_event pat_trace + { + LPRDOValue pName = CONVERTER->stack().pop($2); + ASSERT(pName); + LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); + ASSERT(pPattern); + + LPDocUpdate pIEReplace = rdo::Factory::create( + @3.m_first_seek, + @3.m_last_seek, + "event" + ); + ASSERT(pIEReplace); + CONVERTER->insertDocUpdate(pIEReplace); + + $$ = CONVERTER->stack().push(pPattern); + } + | RDO_Pattern RDO_IDENTIF_COLON RDO_rule pat_trace + { + LPRDOValue pName = CONVERTER->stack().pop($2); + ASSERT(pName); + LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); + ASSERT(pPattern); + $$ = CONVERTER->stack().push(pPattern); + } + | RDO_Pattern RDO_IDENTIF_COLON RDO_keyboard pat_trace + { + LPRDOValue pName = CONVERTER->stack().pop($2); + ASSERT(pName); + LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); + ASSERT(pPattern); + $$ = CONVERTER->stack().push(pPattern); + } + | RDO_Pattern error + { + CONVERTER->error().error(@2, "Ожидается имя образца"); + } + | RDO_Pattern RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@2, @3, "Ожидается тип образца"); + } + ; pat_trace - : /* empty */ { $$ = 0; } - | RDO_trace { $$ = 1; } - | RDO_no_trace { $$ = 0; } - ; + : /* empty */ { $$ = 0; } + | RDO_trace { $$ = 1; } + | RDO_no_trace { $$ = 0; } + ; pat_params_begin - : pat_header RDO_Parameters - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - $$ = CONVERTER->stack().push(pPattern); - } - ; + : pat_header RDO_Parameters + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + $$ = CONVERTER->stack().push(pPattern); + } + ; pat_params - : pat_params_begin RDO_IDENTIF_COLON param_type param_value_default - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - LPRDOValue pParamName = CONVERTER->stack().pop($2); - LPRDOTypeParam pParamType = CONVERTER->stack().pop($3); - LPRDOParam pParam = rdo::Factory::create(pParamName->src_info(), pParamType, CONVERTER->stack().pop($4)); - pPattern->add(pParam); - $$ = CONVERTER->stack().push(pPattern); - } - | pat_params RDO_IDENTIF_COLON param_type param_value_default - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - LPRDOValue pParamName = CONVERTER->stack().pop($2); - LPRDOTypeParam pParamType = CONVERTER->stack().pop($3); - LPRDOParam pParam = rdo::Factory::create(pParamName->src_info(), pParamType, CONVERTER->stack().pop($4)); - pPattern->add(pParam); - $$ = CONVERTER->stack().push(pPattern); - } - | pat_params_begin error - { - if (@1.m_last_line != @2.m_last_line) - { - CONVERTER->error().error(@2, "Ожидается имя параметра образца"); - } - else - { - CONVERTER->error().error(@2, rdo::format("Ожидается имя параметра образца, найдено: %s", LEXER->YYText())); - } - } - | pat_params_begin RDO_IDENTIF error - { - if (@2.m_last_line != @3.m_last_line) - { - CONVERTER->error().error(@2, @3, "Ожидается двоеточие"); - } - else - { - CONVERTER->error().error(@2, @3, rdo::format("Ожидается двоеточие, найдено: %s", LEXER->YYText())); - } - } - | pat_params_begin RDO_IDENTIF_COLON error - { - if (@2.m_last_line != @3.m_last_line) - { - CONVERTER->error().error(@2, @3, "Ожидается тип параметра образца"); - } - else - { - CONVERTER->error().error(@2, @3, rdo::format("Ожидается тип параметра образца, найдено: %s", LEXER->YYText())); - } - } - | pat_params error - { - if (@1.m_last_line != @2.m_last_line) - { - CONVERTER->error().error(@2, "Ожидается имя параметра образца"); - } - else - { - CONVERTER->error().error(@2, rdo::format("Ожидается имя параметра образца, найдено: %s", LEXER->YYText())); - } - } - | pat_params RDO_IDENTIF error - { - if (@2.m_last_line != @3.m_last_line) - { - CONVERTER->error().error(@2, @3, "Ожидается двоеточие"); - } - else - { - CONVERTER->error().error(@2, @3, rdo::format("Ожидается двоеточие, найдено: %s", LEXER->YYText())); - } - } - | pat_params RDO_IDENTIF_COLON error - { - if (@2.m_last_line != @3.m_last_line) - { - CONVERTER->error().error(@2, @3, "Ожидается тип параметра образца"); - } - else - { - CONVERTER->error().error(@2, @3, rdo::format("Ожидается тип параметра образца, найдено: %s", LEXER->YYText())); - } - } - ; + : pat_params_begin RDO_IDENTIF_COLON param_type param_value_default + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + LPRDOValue pParamName = CONVERTER->stack().pop($2); + LPRDOTypeParam pParamType = CONVERTER->stack().pop($3); + LPRDOParam pParam = rdo::Factory::create(pParamName->src_info(), pParamType, CONVERTER->stack().pop($4)); + pPattern->add(pParam); + $$ = CONVERTER->stack().push(pPattern); + } + | pat_params RDO_IDENTIF_COLON param_type param_value_default + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + LPRDOValue pParamName = CONVERTER->stack().pop($2); + LPRDOTypeParam pParamType = CONVERTER->stack().pop($3); + LPRDOParam pParam = rdo::Factory::create(pParamName->src_info(), pParamType, CONVERTER->stack().pop($4)); + pPattern->add(pParam); + $$ = CONVERTER->stack().push(pPattern); + } + | pat_params_begin error + { + if (@1.m_last_line != @2.m_last_line) + { + CONVERTER->error().error(@2, "Ожидается имя параметра образца"); + } + else + { + CONVERTER->error().error(@2, rdo::format("Ожидается имя параметра образца, найдено: %s", LEXER->YYText())); + } + } + | pat_params_begin RDO_IDENTIF error + { + if (@2.m_last_line != @3.m_last_line) + { + CONVERTER->error().error(@2, @3, "Ожидается двоеточие"); + } + else + { + CONVERTER->error().error(@2, @3, rdo::format("Ожидается двоеточие, найдено: %s", LEXER->YYText())); + } + } + | pat_params_begin RDO_IDENTIF_COLON error + { + if (@2.m_last_line != @3.m_last_line) + { + CONVERTER->error().error(@2, @3, "Ожидается тип параметра образца"); + } + else + { + CONVERTER->error().error(@2, @3, rdo::format("Ожидается тип параметра образца, найдено: %s", LEXER->YYText())); + } + } + | pat_params error + { + if (@1.m_last_line != @2.m_last_line) + { + CONVERTER->error().error(@2, "Ожидается имя параметра образца"); + } + else + { + CONVERTER->error().error(@2, rdo::format("Ожидается имя параметра образца, найдено: %s", LEXER->YYText())); + } + } + | pat_params RDO_IDENTIF error + { + if (@2.m_last_line != @3.m_last_line) + { + CONVERTER->error().error(@2, @3, "Ожидается двоеточие"); + } + else + { + CONVERTER->error().error(@2, @3, rdo::format("Ожидается двоеточие, найдено: %s", LEXER->YYText())); + } + } + | pat_params RDO_IDENTIF_COLON error + { + if (@2.m_last_line != @3.m_last_line) + { + CONVERTER->error().error(@2, @3, "Ожидается тип параметра образца"); + } + else + { + CONVERTER->error().error(@2, @3, rdo::format("Ожидается тип параметра образца, найдено: %s", LEXER->YYText())); + } + } + ; pat_params_end - : pat_params RDO_Relevant_resources - { - $$ = $1; - } - | pat_header RDO_Relevant_resources - { - $$ = $1; - } - | pat_header error - { - CONVERTER->error().error(@2, "Ожидается ключевое слово $Relevant_resources"); - } - ; + : pat_params RDO_Relevant_resources + { + $$ = $1; + } + | pat_header RDO_Relevant_resources + { + $$ = $1; + } + | pat_header error + { + CONVERTER->error().error(@2, "Ожидается ключевое слово $Relevant_resources"); + } + ; pat_rel_res - : pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF pat_conv pat_conv - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = CONVERTER->stack().pop($2); - LPRDOValue pTypeName = CONVERTER->stack().pop($3); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, (rdo::runtime::RDOResource::ConvertStatus)$5, @4, @5); - break; - } - case RDOPATPattern::PT_IE: - { - CONVERTER->error().error(@5, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@5, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF pat_conv pat_conv - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = CONVERTER->stack().pop($2); - LPRDOValue pTypeName = CONVERTER->stack().pop($3); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, (rdo::runtime::RDOResource::ConvertStatus)$5, @4, @5); - break; - } - case RDOPATPattern::PT_IE: - { - CONVERTER->error().error(@5, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@5, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF pat_conv - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - CONVERTER->error().error(@4, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr((rdo::runtime::RDOResource::ConvertStatus)$4).c_str())); - break; - } - case RDOPATPattern::PT_IE : - case RDOPATPattern::PT_Rule: - { - LPRDOValue pRelName = CONVERTER->stack().pop($2); - LPRDOValue pTypeName = CONVERTER->stack().pop($3); - pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, @4); - break; - } - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF pat_conv - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - CONVERTER->error().error(@4, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr((rdo::runtime::RDOResource::ConvertStatus)$4).c_str())); - break; - } - case RDOPATPattern::PT_IE : - case RDOPATPattern::PT_Rule: - { - LPRDOValue pRelName = CONVERTER->stack().pop($2); - LPRDOValue pTypeName = CONVERTER->stack().pop($3); - pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, @4); - break; - } - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange pat_conv - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = CONVERTER->stack().pop($2); - LPRDOValue pTypeName = CONVERTER->stack().pop($3); - YYLTYPE convertor_pos = @3; - convertor_pos.m_first_line = convertor_pos.m_last_line; - convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::CS_NoChange, (rdo::runtime::RDOResource::ConvertStatus)$4, convertor_pos, @4); - break; - } - case RDOPATPattern::PT_IE: - { - CONVERTER->error().error(@4, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange pat_conv - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = CONVERTER->stack().pop($2); - LPRDOValue pTypeName = CONVERTER->stack().pop($3); - YYLTYPE convertor_pos = @3; - convertor_pos.m_first_line = convertor_pos.m_last_line; - convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::CS_NoChange, (rdo::runtime::RDOResource::ConvertStatus)$4, convertor_pos, @4); - break; - } - case RDOPATPattern::PT_IE: - { - CONVERTER->error().error(@4, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange_NoChange - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = CONVERTER->stack().pop($2); - LPRDOValue pTypeName = CONVERTER->stack().pop($3); - YYLTYPE convertor_begin_pos = @3; - const std::string str = boost::algorithm::to_lower_copy(std::string(LEXER->YYText())); - const std::string::size_type first_nochange = str.find("nochange"); - std::size_t i = 0; - for (;;) - { - if (str[i] == '\n') - { - convertor_begin_pos.m_first_line++; - convertor_begin_pos.m_first_seek++; - convertor_begin_pos.m_first_pos = 0; - } - else if (str[i] != '\r') - { - convertor_begin_pos.m_first_pos++; - convertor_begin_pos.m_first_seek++; - } - i++; - if (i == first_nochange) - break; - } - convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; - convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - YYLTYPE convertor_end_pos = @3; - convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; - convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::CS_NoChange, rdo::runtime::RDOResource::CS_NoChange, convertor_begin_pos, convertor_end_pos); - break; - } - case RDOPATPattern::PT_IE: - { - CONVERTER->error().error(@3, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@3, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange_NoChange - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = CONVERTER->stack().pop($2); - LPRDOValue pTypeName = CONVERTER->stack().pop($3); - YYLTYPE convertor_begin_pos = @3; - const std::string str = boost::algorithm::to_lower_copy(std::string(LEXER->YYText())); - const std::string::size_type first_nochange = str.find("nochange"); - std::size_t i = 0; - for (;;) - { - if (str[i] == '\n') - { - convertor_begin_pos.m_first_line++; - convertor_begin_pos.m_first_seek++; - convertor_begin_pos.m_first_pos = 0; - } - else if (str[i] != '\r') - { - convertor_begin_pos.m_first_pos++; - convertor_begin_pos.m_first_seek++; - } - i++; - if (i == first_nochange) - break; - } - convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; - convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - YYLTYPE convertor_end_pos = @3; - convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; - convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::CS_NoChange, rdo::runtime::RDOResource::CS_NoChange, convertor_begin_pos, convertor_end_pos); - break; - } - case RDOPATPattern::PT_IE: - { - CONVERTER->error().error(@3, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@3, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange - { - // проверено для ie,rule,opr,key - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - CONVERTER->error().error(@3, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).c_str())); - break; - } - case RDOPATPattern::PT_IE : - case RDOPATPattern::PT_Rule: - { - LPRDOValue pRelName = CONVERTER->stack().pop($2); - LPRDOValue pTypeName = CONVERTER->stack().pop($3); - YYLTYPE convertor_pos = @3; - convertor_pos.m_first_line = convertor_pos.m_last_line; - convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::CS_NoChange, convertor_pos); - break; - } - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - CONVERTER->error().error(@3, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).c_str())); - break; - } - case RDOPATPattern::PT_IE : - case RDOPATPattern::PT_Rule : - { - LPRDOValue pRelName = CONVERTER->stack().pop($2); - LPRDOValue pTypeName = CONVERTER->stack().pop($3); - YYLTYPE convertor_pos = @3; - convertor_pos.m_first_line = convertor_pos.m_last_line; - convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::CS_NoChange, convertor_pos); - break; - } - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF RDO_IDENTIF_NoChange - { - // проверено для ie,rule,opr,key - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = CONVERTER->stack().pop($2); - LPRDOValue pTypeName = CONVERTER->stack().pop($3); - const std::string convert_begin = CONVERTER->stack().pop($4)->value().getIdentificator(); - YYLTYPE convertor_begin_pos = @4; - convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; - convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + convert_begin.length(); - convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + convert_begin.length(); - YYLTYPE convertor_end_pos = @4; - convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; - convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), pPattern->StrToStatus(convert_begin, convertor_begin_pos), rdo::runtime::RDOResource::CS_NoChange, convertor_begin_pos, convertor_end_pos); - break; - } - case RDOPATPattern::PT_IE: - { - CONVERTER->error().error(@4, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF RDO_IDENTIF_NoChange - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = CONVERTER->stack().pop($2); - LPRDOValue pTypeName = CONVERTER->stack().pop($3); - const std::string convert_begin = CONVERTER->stack().pop($4)->value().getIdentificator(); - YYLTYPE convertor_begin_pos = @4; - convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; - convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + convert_begin.length(); - convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + convert_begin.length(); - YYLTYPE convertor_end_pos = @4; - convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; - convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), pPattern->StrToStatus(convert_begin, convertor_begin_pos), rdo::runtime::RDOResource::CS_NoChange, convertor_begin_pos, convertor_end_pos); - break; - } - case RDOPATPattern::PT_IE: - { - CONVERTER->error().error(@4, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_params_end error - { - CONVERTER->error().error(@2, "Ошибка в описании релевантных ресурсов"); - } - | pat_rel_res error - { - CONVERTER->error().error(@2, "Ошибка в описании релевантных ресурсов"); - } - | pat_params_end RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@2, @3, "Ожидается описатель (имя типа или ресурса)"); - } - | pat_rel_res RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@2, @3, "Ожидается описатель (имя типа или ресурса)"); - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF error - { - if (CONVERTER->getLastPATPattern()->isHaveConvertEnd()) - { - CONVERTER->error().error(@3, @4, "Ожидается статус конвертора начала"); - } - else - { - CONVERTER->error().error(@3, @4, "Ожидается статус конвертора"); - } - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF error - { - if (CONVERTER->getLastPATPattern()->isHaveConvertEnd()) - { - CONVERTER->error().error(@3, @4, "Ожидается статус конвертора начала"); - } - else - { - CONVERTER->error().error(@3, @4, "Ожидается статус конвертора"); - } - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF pat_conv error - { - switch (CONVERTER->getLastPATPattern()->getType()) - { - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Body"); - break; - } - case RDOPATPattern::PT_IE: - { - CONVERTER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Time"); - break; - } - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - CONVERTER->error().error(@4, @5, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); - break; - } - } - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF pat_conv error - { - switch (CONVERTER->getLastPATPattern()->getType()) - { - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Body"); - break; - } - case RDOPATPattern::PT_IE: - { - CONVERTER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Time"); - break; - } - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - CONVERTER->error().error(@4, @5, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); - break; - } - } - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange error - { - switch (CONVERTER->getLastPATPattern()->getType()) - { - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Body"); - break; - } - case RDOPATPattern::PT_IE: - { - CONVERTER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Time"); - break; - } - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - CONVERTER->error().error(@3, @4, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); - break; - } - } - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange error - { - switch (CONVERTER->getLastPATPattern()->getType()) - { - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Body"); - break; - } - case RDOPATPattern::PT_IE: - { - CONVERTER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Time"); - break; - } - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - CONVERTER->error().error(@3, @4, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); - break; - } - } - } - ; + : pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF pat_conv pat_conv + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = CONVERTER->stack().pop($2); + LPRDOValue pTypeName = CONVERTER->stack().pop($3); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, (rdo::runtime::RDOResource::ConvertStatus)$5, @4, @5); + break; + } + case RDOPATPattern::Type::IE: + { + CONVERTER->error().error(@5, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@5, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF pat_conv pat_conv + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = CONVERTER->stack().pop($2); + LPRDOValue pTypeName = CONVERTER->stack().pop($3); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, (rdo::runtime::RDOResource::ConvertStatus)$5, @4, @5); + break; + } + case RDOPATPattern::Type::IE: + { + CONVERTER->error().error(@5, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@5, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF pat_conv + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + CONVERTER->error().error(@4, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr((rdo::runtime::RDOResource::ConvertStatus)$4).c_str())); + break; + } + case RDOPATPattern::Type::IE : + case RDOPATPattern::Type::RULE: + { + LPRDOValue pRelName = CONVERTER->stack().pop($2); + LPRDOValue pTypeName = CONVERTER->stack().pop($3); + pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, @4); + break; + } + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF pat_conv + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + CONVERTER->error().error(@4, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr((rdo::runtime::RDOResource::ConvertStatus)$4).c_str())); + break; + } + case RDOPATPattern::Type::IE : + case RDOPATPattern::Type::RULE: + { + LPRDOValue pRelName = CONVERTER->stack().pop($2); + LPRDOValue pTypeName = CONVERTER->stack().pop($3); + pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, @4); + break; + } + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange pat_conv + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = CONVERTER->stack().pop($2); + LPRDOValue pTypeName = CONVERTER->stack().pop($3); + YYLTYPE convertor_pos = @3; + convertor_pos.m_first_line = convertor_pos.m_last_line; + convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, (rdo::runtime::RDOResource::ConvertStatus)$4, convertor_pos, @4); + break; + } + case RDOPATPattern::Type::IE: + { + CONVERTER->error().error(@4, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange pat_conv + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = CONVERTER->stack().pop($2); + LPRDOValue pTypeName = CONVERTER->stack().pop($3); + YYLTYPE convertor_pos = @3; + convertor_pos.m_first_line = convertor_pos.m_last_line; + convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, (rdo::runtime::RDOResource::ConvertStatus)$4, convertor_pos, @4); + break; + } + case RDOPATPattern::Type::IE: + { + CONVERTER->error().error(@4, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange_NoChange + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = CONVERTER->stack().pop($2); + LPRDOValue pTypeName = CONVERTER->stack().pop($3); + YYLTYPE convertor_begin_pos = @3; + const std::string str = boost::algorithm::to_lower_copy(std::string(LEXER->YYText())); + const std::string::size_type first_nochange = str.find("nochange"); + std::size_t i = 0; + for (;;) + { + if (str[i] == '\n') + { + convertor_begin_pos.m_first_line++; + convertor_begin_pos.m_first_seek++; + convertor_begin_pos.m_first_pos = 0; + } + else if (str[i] != '\r') + { + convertor_begin_pos.m_first_pos++; + convertor_begin_pos.m_first_seek++; + } + i++; + if (i == first_nochange) + break; + } + convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; + convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + YYLTYPE convertor_end_pos = @3; + convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; + convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, convertor_begin_pos, convertor_end_pos); + break; + } + case RDOPATPattern::Type::IE: + { + CONVERTER->error().error(@3, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@3, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange_NoChange + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = CONVERTER->stack().pop($2); + LPRDOValue pTypeName = CONVERTER->stack().pop($3); + YYLTYPE convertor_begin_pos = @3; + const std::string str = boost::algorithm::to_lower_copy(std::string(LEXER->YYText())); + const std::string::size_type first_nochange = str.find("nochange"); + std::size_t i = 0; + for (;;) + { + if (str[i] == '\n') + { + convertor_begin_pos.m_first_line++; + convertor_begin_pos.m_first_seek++; + convertor_begin_pos.m_first_pos = 0; + } + else if (str[i] != '\r') + { + convertor_begin_pos.m_first_pos++; + convertor_begin_pos.m_first_seek++; + } + i++; + if (i == first_nochange) + break; + } + convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; + convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + YYLTYPE convertor_end_pos = @3; + convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; + convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, convertor_begin_pos, convertor_end_pos); + break; + } + case RDOPATPattern::Type::IE: + { + CONVERTER->error().error(@3, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@3, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange + { + // проверено для ie,rule,opr,key + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + CONVERTER->error().error(@3, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).c_str())); + break; + } + case RDOPATPattern::Type::IE : + case RDOPATPattern::Type::RULE: + { + LPRDOValue pRelName = CONVERTER->stack().pop($2); + LPRDOValue pTypeName = CONVERTER->stack().pop($3); + YYLTYPE convertor_pos = @3; + convertor_pos.m_first_line = convertor_pos.m_last_line; + convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, convertor_pos); + break; + } + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + CONVERTER->error().error(@3, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).c_str())); + break; + } + case RDOPATPattern::Type::IE : + case RDOPATPattern::Type::RULE : + { + LPRDOValue pRelName = CONVERTER->stack().pop($2); + LPRDOValue pTypeName = CONVERTER->stack().pop($3); + YYLTYPE convertor_pos = @3; + convertor_pos.m_first_line = convertor_pos.m_last_line; + convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, convertor_pos); + break; + } + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF RDO_IDENTIF_NoChange + { + // проверено для ie,rule,opr,key + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = CONVERTER->stack().pop($2); + LPRDOValue pTypeName = CONVERTER->stack().pop($3); + const std::string convert_begin = CONVERTER->stack().pop($4)->value().getIdentificator(); + YYLTYPE convertor_begin_pos = @4; + convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; + convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + convert_begin.length(); + convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + convert_begin.length(); + YYLTYPE convertor_end_pos = @4; + convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; + convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), pPattern->StrToStatus(convert_begin, convertor_begin_pos), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, convertor_begin_pos, convertor_end_pos); + break; + } + case RDOPATPattern::Type::IE: + { + CONVERTER->error().error(@4, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF RDO_IDENTIF_NoChange + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = CONVERTER->stack().pop($2); + LPRDOValue pTypeName = CONVERTER->stack().pop($3); + const std::string convert_begin = CONVERTER->stack().pop($4)->value().getIdentificator(); + YYLTYPE convertor_begin_pos = @4; + convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; + convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + convert_begin.length(); + convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + convert_begin.length(); + YYLTYPE convertor_end_pos = @4; + convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; + convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), pPattern->StrToStatus(convert_begin, convertor_begin_pos), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, convertor_begin_pos, convertor_end_pos); + break; + } + case RDOPATPattern::Type::IE: + { + CONVERTER->error().error(@4, "У нерегулярного события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_params_end error + { + CONVERTER->error().error(@2, "Ошибка в описании релевантных ресурсов"); + } + | pat_rel_res error + { + CONVERTER->error().error(@2, "Ошибка в описании релевантных ресурсов"); + } + | pat_params_end RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@2, @3, "Ожидается описатель (имя типа или ресурса)"); + } + | pat_rel_res RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@2, @3, "Ожидается описатель (имя типа или ресурса)"); + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF error + { + if (CONVERTER->getLastPATPattern()->isHaveConvertEnd()) + { + CONVERTER->error().error(@3, @4, "Ожидается статус конвертора начала"); + } + else + { + CONVERTER->error().error(@3, @4, "Ожидается статус конвертора"); + } + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF error + { + if (CONVERTER->getLastPATPattern()->isHaveConvertEnd()) + { + CONVERTER->error().error(@3, @4, "Ожидается статус конвертора начала"); + } + else + { + CONVERTER->error().error(@3, @4, "Ожидается статус конвертора"); + } + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF pat_conv error + { + switch (CONVERTER->getLastPATPattern()->getType()) + { + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Body"); + break; + } + case RDOPATPattern::Type::IE: + { + CONVERTER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Time"); + break; + } + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + CONVERTER->error().error(@4, @5, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); + break; + } + } + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF pat_conv error + { + switch (CONVERTER->getLastPATPattern()->getType()) + { + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Body"); + break; + } + case RDOPATPattern::Type::IE: + { + CONVERTER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Time"); + break; + } + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + CONVERTER->error().error(@4, @5, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); + break; + } + } + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange error + { + switch (CONVERTER->getLastPATPattern()->getType()) + { + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Body"); + break; + } + case RDOPATPattern::Type::IE: + { + CONVERTER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Time"); + break; + } + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + CONVERTER->error().error(@3, @4, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); + break; + } + } + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange error + { + switch (CONVERTER->getLastPATPattern()->getType()) + { + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Body"); + break; + } + case RDOPATPattern::Type::IE: + { + CONVERTER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Time"); + break; + } + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + CONVERTER->error().error(@3, @4, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); + break; + } + } + } + ; pat_conv - : RDO_Keep { $$ = rdo::runtime::RDOResource::CS_Keep; } - | RDO_Create { $$ = rdo::runtime::RDOResource::CS_Create; } - | RDO_Erase { $$ = rdo::runtime::RDOResource::CS_Erase; } - | RDO_NonExist { $$ = rdo::runtime::RDOResource::CS_NonExist; } - ; + : RDO_Keep { $$ = static_cast(rdo::runtime::RDOResource::ConvertStatus::KEEP); } + | RDO_Create { $$ = static_cast(rdo::runtime::RDOResource::ConvertStatus::CREATE); } + | RDO_Erase { $$ = static_cast(rdo::runtime::RDOResource::ConvertStatus::ERASE); } + | RDO_NonExist { $$ = static_cast(rdo::runtime::RDOResource::ConvertStatus::NONEXIST); } + ; pat_common_choice - : pat_rel_res - | pat_rel_res RDO_first - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - if (pPattern->getType() == RDOPATPattern::PT_IE) - { - CONVERTER->error().error(@2, "В событиях не используется способ выбора релевантных ресурсов"); - } - else - { - pPattern->setCommonChoiceFirst(); - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_rel_res RDO_with_min fun_arithm - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - if (pPattern->getType() == RDOPATPattern::PT_IE) - { - CONVERTER->error().error(@2, "В событиях не используется способ выбора релевантных ресурсов"); - } - else - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pArithm); - pArithm->setSrcPos (@2, @3); - pArithm->setSrcText("with_min " + pArithm->src_text()); - pPattern->setCommonChoiceWithMin(pArithm); - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_rel_res RDO_with_max fun_arithm - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - if (pPattern->getType() == RDOPATPattern::PT_IE) - { - CONVERTER->error().error(@2, "В событиях не используется способ выбора релевантных ресурсов"); - } - else - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pArithm); - pArithm->setSrcPos (@2, @3); - pArithm->setSrcText("with_max " + pArithm->src_text()); - pPattern->setCommonChoiceWithMax(pArithm); - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_rel_res RDO_with_min error - { - CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); - } - | pat_rel_res RDO_with_max error - { - CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); - } - ; + : pat_rel_res + | pat_rel_res RDO_first + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + if (pPattern->getType() == RDOPATPattern::Type::IE) + { + CONVERTER->error().error(@2, "В событиях не используется способ выбора релевантных ресурсов"); + } + else + { + pPattern->setCommonChoiceFirst(); + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_rel_res RDO_with_min fun_arithm + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + if (pPattern->getType() == RDOPATPattern::Type::IE) + { + CONVERTER->error().error(@2, "В событиях не используется способ выбора релевантных ресурсов"); + } + else + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pArithm); + pArithm->setSrcPos (@2, @3); + pArithm->setSrcText("with_min " + pArithm->src_text()); + pPattern->setCommonChoiceWithMin(pArithm); + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_rel_res RDO_with_max fun_arithm + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + if (pPattern->getType() == RDOPATPattern::Type::IE) + { + CONVERTER->error().error(@2, "В событиях не используется способ выбора релевантных ресурсов"); + } + else + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pArithm); + pArithm->setSrcPos (@2, @3); + pArithm->setSrcText("with_max " + pArithm->src_text()); + pPattern->setCommonChoiceWithMax(pArithm); + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_rel_res RDO_with_min error + { + CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); + } + | pat_rel_res RDO_with_max error + { + CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); + } + ; pat_time - : pat_common_choice RDO_Body - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_IE : - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - CONVERTER->error().error(@2, "Перед $Body пропущено ключевое слово $Time"); - break; - } - default: break; - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_common_choice RDO_Time '=' fun_arithm RDO_Body - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@2, "Поле $Time не используется в продукционном правиле"); - break; - } - default: break; - } - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($4); - ASSERT(pArithm); - pArithm->setSrcPos (@2, @4); - //pArithm->setSrcText("$Time = " + pArithm->src_text()); - pPattern->setTime(pArithm); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_IE: - { - LPDocUpdate pTimeDelete1 = rdo::Factory::create(@2.m_first_seek, @2.m_last_seek); - ASSERT(pTimeDelete1); - CONVERTER->insertDocUpdate(pTimeDelete1); - - LPDocUpdate pTimeDelete2 = rdo::Factory::create(@3.m_first_seek, @3.m_last_seek); - ASSERT(pTimeDelete2); - CONVERTER->insertDocUpdate(pTimeDelete2); - - LPDocUpdate pTimeDelete3 = rdo::Factory::create(@4.m_first_seek, @4.m_last_seek); - ASSERT(pTimeDelete3); - CONVERTER->insertDocUpdate(pTimeDelete3); - } - - default: - break; - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_common_choice RDO_Time '=' fun_arithm error - { - CONVERTER->error().error(@4, @5, "Ожидается ключевое слово $Body"); - } - | pat_common_choice RDO_Time '=' error - { - CONVERTER->error().error(@4, "Ошибка в арифметическом выражении"); - } - | pat_common_choice RDO_Time error - { - CONVERTER->error().error(@2, @3, "После ключевого слова $Time ожидается знак равенства"); - } - | pat_common_choice error - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@2, rdo::format("Ожидается $Body, найдено: %s", LEXER->YYText())); - break; - } - case RDOPATPattern::PT_IE : - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - CONVERTER->error().error(@2, rdo::format("Ожидается $Time, найдено: %s", LEXER->YYText())); - break; - } - } - $$ = CONVERTER->stack().push(pPattern); - } - ; + : pat_common_choice RDO_Body + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::IE : + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + CONVERTER->error().error(@2, "Перед $Body пропущено ключевое слово $Time"); + break; + } + default: break; + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_common_choice RDO_Time '=' fun_arithm RDO_Body + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@2, "Поле $Time не используется в продукционном правиле"); + break; + } + default: break; + } + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($4); + ASSERT(pArithm); + pArithm->setSrcPos (@2, @4); + //pArithm->setSrcText("$Time = " + pArithm->src_text()); + pPattern->setTime(pArithm); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::IE: + { + LPDocUpdate pTimeDelete1 = rdo::Factory::create(@2.m_first_seek, @2.m_last_seek); + ASSERT(pTimeDelete1); + CONVERTER->insertDocUpdate(pTimeDelete1); + + LPDocUpdate pTimeDelete2 = rdo::Factory::create(@3.m_first_seek, @3.m_last_seek); + ASSERT(pTimeDelete2); + CONVERTER->insertDocUpdate(pTimeDelete2); + + LPDocUpdate pTimeDelete3 = rdo::Factory::create(@4.m_first_seek, @4.m_last_seek); + ASSERT(pTimeDelete3); + CONVERTER->insertDocUpdate(pTimeDelete3); + } + + default: + break; + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_common_choice RDO_Time '=' fun_arithm error + { + CONVERTER->error().error(@4, @5, "Ожидается ключевое слово $Body"); + } + | pat_common_choice RDO_Time '=' error + { + CONVERTER->error().error(@4, "Ошибка в арифметическом выражении"); + } + | pat_common_choice RDO_Time error + { + CONVERTER->error().error(@2, @3, "После ключевого слова $Time ожидается знак равенства"); + } + | pat_common_choice error + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@2, rdo::format("Ожидается $Body, найдено: %s", LEXER->YYText())); + break; + } + case RDOPATPattern::Type::IE : + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + CONVERTER->error().error(@2, rdo::format("Ожидается $Time, найдено: %s", LEXER->YYText())); + break; + } + } + $$ = CONVERTER->stack().push(pPattern); + } + ; pat_body - : pat_time RDO_IDENTIF_RELRES - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - const std::string name = CONVERTER->stack().pop($2)->value().getIdentificator(); - pPattern->addRelResBody(RDOParserSrcInfo(@2, name)); - - LPDocUpdate pInsert = rdo::Factory::create(@2.m_last_seek, ":"); - ASSERT(pInsert); - CONVERTER->insertDocUpdate(pInsert); - - $$ = CONVERTER->stack().push(pPattern); - } - | pat_convert RDO_IDENTIF_RELRES - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - const std::string name = CONVERTER->stack().pop($2)->value().getIdentificator(); - pPattern->addRelResBody(RDOParserSrcInfo(@2, name)); - - LPDocUpdate pInsert = rdo::Factory::create(@2.m_last_seek, ":"); - ASSERT(pInsert); - CONVERTER->insertDocUpdate(pInsert); - - $$ = CONVERTER->stack().push(pPattern); - } - | pat_time error - { - const std::string str(LEXER->YYText()); - CONVERTER->error().error(@2, rdo::format("Неизвестный релевантный ресурс: %s", str.c_str())); - } - | pat_convert error - { - const std::string str(LEXER->YYText()); - CONVERTER->error().error(@2, rdo::format("Неизвестный релевантный ресурс: %s", str.c_str())); - } - ; + : pat_time RDO_IDENTIF_RELRES + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + const std::string name = CONVERTER->stack().pop($2)->value().getIdentificator(); + pPattern->addRelResBody(RDOParserSrcInfo(@2, name)); + + LPDocUpdate pInsert = rdo::Factory::create(@2.m_last_seek, ":"); + ASSERT(pInsert); + CONVERTER->insertDocUpdate(pInsert); + + $$ = CONVERTER->stack().push(pPattern); + } + | pat_convert RDO_IDENTIF_RELRES + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + const std::string name = CONVERTER->stack().pop($2)->value().getIdentificator(); + pPattern->addRelResBody(RDOParserSrcInfo(@2, name)); + + LPDocUpdate pInsert = rdo::Factory::create(@2.m_last_seek, ":"); + ASSERT(pInsert); + CONVERTER->insertDocUpdate(pInsert); + + $$ = CONVERTER->stack().push(pPattern); + } + | pat_time error + { + const std::string str(LEXER->YYText()); + CONVERTER->error().error(@2, rdo::format("Неизвестный релевантный ресурс: %s", str.c_str())); + } + | pat_convert error + { + const std::string str(LEXER->YYText()); + CONVERTER->error().error(@2, rdo::format("Неизвестный релевантный ресурс: %s", str.c_str())); + } + ; pat_res_usage - : pat_body pat_choice pat_order - { - LPRDOPATChoiceFrom pChoiceFrom = CONVERTER->stack().pop($2); - ASSERT(pChoiceFrom); - pChoiceFrom->setSrcPos(@2); - - LPRDOPATChoiceOrder pChoiceOrder = CONVERTER->stack().pop($3); - pChoiceOrder->setSrcPos(@3); - - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - pPattern->addRelResUsage(pChoiceFrom, pChoiceOrder); - $$ = CONVERTER->stack().push(pPattern); - } - ; + : pat_body pat_choice pat_order + { + LPRDOPATChoiceFrom pChoiceFrom = CONVERTER->stack().pop($2); + ASSERT(pChoiceFrom); + pChoiceFrom->setSrcPos(@2); + + LPRDOPATChoiceOrder pChoiceOrder = CONVERTER->stack().pop($3); + pChoiceOrder->setSrcPos(@3); + + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + pPattern->addRelResUsage(pChoiceFrom, pChoiceOrder); + $$ = CONVERTER->stack().push(pPattern); + } + ; pat_choice - : /* empty */ - { - CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceEmpty; - LPRDOPATChoiceFrom pChoiceFrom = rdo::Factory::create(RDOParserSrcInfo("Choice NoCheck"), RDOPATChoiceFrom::ch_empty); - ASSERT(pChoiceFrom); - $$ = CONVERTER->stack().push(pChoiceFrom); - } - | pat_choice_nocheck - { - LPRDOPATChoiceFrom pChoiceFrom = rdo::Factory::create(RDOParserSrcInfo("Choice NoCheck"), RDOPATChoiceFrom::ch_nocheck); - ASSERT(pChoiceFrom); - $$ = CONVERTER->stack().push(pChoiceFrom); - } - | pat_choice_from fun_logic - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - LPRDOPATChoiceFrom pChoiceFrom = rdo::Factory::create(RDOParserSrcInfo("Choice from " + pLogic->src_text()), RDOPATChoiceFrom::ch_from, pLogic); - ASSERT(pChoiceFrom); - $$ = CONVERTER->stack().push(pChoiceFrom); - } - | pat_choice_from error - { - CONVERTER->error().error(@2, "Ошибка в логическом выражении"); - } - ; + : /* empty */ + { + CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::State::EMPTY; + LPRDOPATChoiceFrom pChoiceFrom = rdo::Factory::create(RDOParserSrcInfo("Choice NoCheck"), RDOPATChoiceFrom::Type::EMPTY); + ASSERT(pChoiceFrom); + $$ = CONVERTER->stack().push(pChoiceFrom); + } + | pat_choice_nocheck + { + LPRDOPATChoiceFrom pChoiceFrom = rdo::Factory::create(RDOParserSrcInfo("Choice NoCheck"), RDOPATChoiceFrom::Type::NOCHECK); + ASSERT(pChoiceFrom); + $$ = CONVERTER->stack().push(pChoiceFrom); + } + | pat_choice_from fun_logic + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + LPRDOPATChoiceFrom pChoiceFrom = rdo::Factory::create(RDOParserSrcInfo("Choice from " + pLogic->src_text()), RDOPATChoiceFrom::Type::FROM, pLogic); + ASSERT(pChoiceFrom); + $$ = CONVERTER->stack().push(pChoiceFrom); + } + | pat_choice_from error + { + CONVERTER->error().error(@2, "Ошибка в логическом выражении"); + } + ; pat_choice_nocheck - : RDO_Choice RDO_NoCheck - { - CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceNoCheck; - } - ; + : RDO_Choice RDO_NoCheck + { + CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CHOICE_NOCHECK; + } + ; pat_choice_from - : RDO_Choice RDO_from - { - CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceFrom; - } - ; + : RDO_Choice RDO_from + { + CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CHOICE_FROM; + } + ; pat_order - : /* empty */ - { - CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceOrderEmpty; - LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo(), rdo::runtime::RDOSelectResourceCalc::order_empty); - ASSERT(pChoiceOrder); - $$ = CONVERTER->stack().push(pChoiceOrder); - } - | pat_choice_first - { - LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo("first"), rdo::runtime::RDOSelectResourceCalc::order_first); - ASSERT(pChoiceOrder); - $$ = CONVERTER->stack().push(pChoiceOrder); - } - | pat_choice_with_min fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo("with_min " + pArithm->src_text()), rdo::runtime::RDOSelectResourceCalc::order_with_min, pArithm); - ASSERT(pChoiceOrder); - $$ = CONVERTER->stack().push(pChoiceOrder); - } - | pat_choice_with_max fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo("with_max " + pArithm->src_text()), rdo::runtime::RDOSelectResourceCalc::order_with_max, pArithm); - ASSERT(pChoiceOrder); - $$ = CONVERTER->stack().push(pChoiceOrder); - } - | pat_choice_with_min error - { - CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); - } - | pat_choice_with_max error - { - CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); - } - ; + : /* empty */ + { + CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CHOICE_ORDER_EMPTY; + LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo(), rdo::runtime::RDOSelectResourceCalc::Type::EMPTY); + ASSERT(pChoiceOrder); + $$ = CONVERTER->stack().push(pChoiceOrder); + } + | pat_choice_first + { + LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo("first"), rdo::runtime::RDOSelectResourceCalc::Type::FIRST); + ASSERT(pChoiceOrder); + $$ = CONVERTER->stack().push(pChoiceOrder); + } + | pat_choice_with_min fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo("with_min " + pArithm->src_text()), rdo::runtime::RDOSelectResourceCalc::Type::WITH_MIN, pArithm); + ASSERT(pChoiceOrder); + $$ = CONVERTER->stack().push(pChoiceOrder); + } + | pat_choice_with_max fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo("with_max " + pArithm->src_text()), rdo::runtime::RDOSelectResourceCalc::Type::WITH_MAX, pArithm); + ASSERT(pChoiceOrder); + $$ = CONVERTER->stack().push(pChoiceOrder); + } + | pat_choice_with_min error + { + CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); + } + | pat_choice_with_max error + { + CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); + } + ; pat_choice_first - : RDO_first - { - CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceOrderFirst; - } - ; + : RDO_first + { + CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CHOICE_ORDER_FIRST; + } + ; pat_choice_with_min - : RDO_with_min - { - CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceOrderWithMin; - } - ; + : RDO_with_min + { + CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CHOICE_ORDER_WITH_MIN; + } + ; pat_choice_with_max - : RDO_with_max - { - CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceOrderWithMax; - } - ; + : RDO_with_max + { + CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CHOICE_ORDER_WITH_MAX; + } + ; pat_convert - : pat_res_usage - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - LPRDORelevantResource rel_res = pPattern->m_pCurrRelRes; - std::string str; - if (rel_res->m_pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::order_empty) - { - str = "Сразу после ключевого слова " + rel_res->m_pChoiceOrder->asString(); - } - else if (rel_res->m_pChoiceFrom->m_type != RDOPATChoiceFrom::ch_empty) - { - str = "Сразу после условия выбора"; - } - else - { - str = "Сразу после имени"; - } - if (rel_res->m_statusBegin != rdo::runtime::RDOResource::CS_NoChange && rel_res->m_statusBegin != rdo::runtime::RDOResource::CS_Erase && rel_res->m_statusBegin != rdo::runtime::RDOResource::CS_NonExist) - { - switch (pPattern->getType()) - { - case RDOPATPattern::PT_IE: - { - CONVERTER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_event для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); - break; - } - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_rule для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); - break; - } - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - CONVERTER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_begin для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); - break; - } - } - } - if (rel_res->m_statusEnd != rdo::runtime::RDOResource::CS_NoChange && rel_res->m_statusEnd != rdo::runtime::RDOResource::CS_Erase && rel_res->m_statusEnd != rdo::runtime::RDOResource::CS_NonExist) - { - switch (pPattern->getType()) - { - case RDOPATPattern::PT_IE : - case RDOPATPattern::PT_Rule: - { - CONVERTER->error().error(@1, "Внутренняя ошибка"); - break; - } - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - CONVERTER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_end для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); - break; - } - } - } - $$ = CONVERTER->stack().push(pPattern); - } - | pat_res_usage convert_begin pat_trace pat_convert_cmd - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - if (pPattern->getType() != RDOPATPattern::PT_Operation && pPattern->getType() != RDOPATPattern::PT_Keyboard) - { - std::string type = ""; - switch (pPattern->getType()) - { - case RDOPATPattern::PT_IE: - { - type = "нерегулярном событии"; - break; - } - case RDOPATPattern::PT_Rule: - { - type = "продукционном правиле"; - break; - } - default: break; - } - CONVERTER->error().error(@2, rdo::format("Ключевое слово Convert_begin может быть использовано в обыкновенной или клавиатурной операции, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); - } - LPConvertCmdList pCmdList = CONVERTER->stack().pop($4); - pPattern.object_static_cast()->addRelResConvertBeginEnd($3 != 0, pCmdList, false, NULL, @2, @2, @3, @3); - $$ = CONVERTER->stack().push(pPattern); - } - | pat_res_usage convert_end pat_trace pat_convert_cmd - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - if (pPattern->getType() != RDOPATPattern::PT_Operation && pPattern->getType() != RDOPATPattern::PT_Keyboard) - { - std::string type = ""; - switch (pPattern->getType()) - { - case RDOPATPattern::PT_IE: - { - type = "нерегулярном событии"; - break; - } - case RDOPATPattern::PT_Rule: - { - type = "продукционном правиле"; - break; - } - default: break; - } - CONVERTER->error().error(@2, rdo::format("Ключевое слово Convert_end может быть использовано в обыкновенной и клавиатурной операции, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); - } - LPConvertCmdList pCmdList = CONVERTER->stack().pop($4); - pPattern.object_static_cast()->addRelResConvertBeginEnd(false, NULL, $3 != 0, pCmdList, @2, @2, @3, @3); - $$ = CONVERTER->stack().push(pPattern); - } - | pat_res_usage convert_begin pat_trace pat_convert_cmd convert_end pat_trace pat_convert_cmd - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - if (pPattern->getType() != RDOPATPattern::PT_Operation && pPattern->getType() != RDOPATPattern::PT_Keyboard) - { - std::string type = ""; - switch (pPattern->getType()) - { - case RDOPATPattern::PT_IE: - { - type = "нерегулярном событии"; - break; - } - case RDOPATPattern::PT_Rule: - { - type = "продукционном правиле"; - break; - } - default: break; - } - CONVERTER->error().error(@2, rdo::format("Ключевые слова Convert_begin и Convert_end могут быть использованы в обыкновенной и клавиатурной операции, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); - } - LPConvertCmdList pCmdListBegin = CONVERTER->stack().pop($4); - LPConvertCmdList pCmdListEnd = CONVERTER->stack().pop($7); - pPattern.object_static_cast()->addRelResConvertBeginEnd($3 != 0, pCmdListBegin, $6 != 0, pCmdListEnd, @2, @5, @3, @6); - $$ = CONVERTER->stack().push(pPattern); - } - | pat_res_usage convert_rule pat_trace pat_convert_cmd - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - if (pPattern->getType() != RDOPATPattern::PT_Rule) - { - std::string type = ""; - switch (pPattern->getType()) - { - case RDOPATPattern::PT_IE: - { - type = "нерегулярном событии"; - break; - } - case RDOPATPattern::PT_Operation: - { - type = "операции"; - break; - } - case RDOPATPattern::PT_Keyboard : - { - type = "клавиатурной операции"; - break; - } - default: break; - } - CONVERTER->error().error(@2, rdo::format("Ключевое слово Convert_rule может быть использовано в продукционном правиле, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); - } - LPConvertCmdList pCmdList = CONVERTER->stack().pop($4); - ASSERT(pPattern->m_pCurrRelRes); - pPattern->addRelResConvert($3 != 0, pCmdList, @2, @3, pPattern->m_pCurrRelRes->m_statusBegin); - $$ = CONVERTER->stack().push(pPattern); - } - | pat_res_usage convert_event pat_trace pat_convert_cmd - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - ASSERT(pPattern); - if (pPattern->getType() != RDOPATPattern::PT_IE) - { - std::string type = ""; - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Rule : - { - type = "продукционном правиле"; - break; - } - case RDOPATPattern::PT_Operation: - { - type = "операции"; - break; - } - case RDOPATPattern::PT_Keyboard : - { - type = "клавиатурной операции"; - break; - } - default: break; - } - CONVERTER->error().error(@2, rdo::format("Ключевое слово Convert_event может быть использовано в событии или в нерегулярном событии, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); - } - - LPConvertCmdList pCmdList = CONVERTER->stack().pop($4); - ASSERT(pPattern->m_pCurrRelRes); - pPattern->addRelResConvert($3 != 0, pCmdList, @2, @3, pPattern->m_pCurrRelRes->m_statusBegin); - $$ = CONVERTER->stack().push(pPattern); - } - ; + : pat_res_usage + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + LPRDORelevantResource rel_res = pPattern->m_pCurrRelRes; + std::string str; + if (rel_res->m_pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::Type::EMPTY) + { + str = "Сразу после ключевого слова " + rel_res->m_pChoiceOrder->asString(); + } + else if (rel_res->m_pChoiceFrom->m_type != RDOPATChoiceFrom::Type::EMPTY) + { + str = "Сразу после условия выбора"; + } + else + { + str = "Сразу после имени"; + } + if (rel_res->m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::NOCHANGE && rel_res->m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::ERASE && rel_res->m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + switch (pPattern->getType()) + { + case RDOPATPattern::Type::IE: + { + CONVERTER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_event для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); + break; + } + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_rule для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); + break; + } + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + CONVERTER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_begin для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); + break; + } + } + } + if (rel_res->m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::NOCHANGE && rel_res->m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::ERASE && rel_res->m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + switch (pPattern->getType()) + { + case RDOPATPattern::Type::IE : + case RDOPATPattern::Type::RULE: + { + CONVERTER->error().error(@1, "Внутренняя ошибка"); + break; + } + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + CONVERTER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_end для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); + break; + } + } + } + $$ = CONVERTER->stack().push(pPattern); + } + | pat_res_usage convert_begin pat_trace pat_convert_cmd + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + if (pPattern->getType() != RDOPATPattern::Type::OPERATION && pPattern->getType() != RDOPATPattern::Type::KEYBOARD) + { + std::string type = ""; + switch (pPattern->getType()) + { + case RDOPATPattern::Type::IE: + { + type = "нерегулярном событии"; + break; + } + case RDOPATPattern::Type::RULE: + { + type = "продукционном правиле"; + break; + } + default: break; + } + CONVERTER->error().error(@2, rdo::format("Ключевое слово Convert_begin может быть использовано в обыкновенной или клавиатурной операции, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); + } + LPConvertCmdList pCmdList = CONVERTER->stack().pop($4); + pPattern.object_static_cast()->addRelResConvertBeginEnd($3 != 0, pCmdList, false, NULL, @2, @2, @3, @3); + $$ = CONVERTER->stack().push(pPattern); + } + | pat_res_usage convert_end pat_trace pat_convert_cmd + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + if (pPattern->getType() != RDOPATPattern::Type::OPERATION && pPattern->getType() != RDOPATPattern::Type::KEYBOARD) + { + std::string type = ""; + switch (pPattern->getType()) + { + case RDOPATPattern::Type::IE: + { + type = "нерегулярном событии"; + break; + } + case RDOPATPattern::Type::RULE: + { + type = "продукционном правиле"; + break; + } + default: break; + } + CONVERTER->error().error(@2, rdo::format("Ключевое слово Convert_end может быть использовано в обыкновенной и клавиатурной операции, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); + } + LPConvertCmdList pCmdList = CONVERTER->stack().pop($4); + pPattern.object_static_cast()->addRelResConvertBeginEnd(false, NULL, $3 != 0, pCmdList, @2, @2, @3, @3); + $$ = CONVERTER->stack().push(pPattern); + } + | pat_res_usage convert_begin pat_trace pat_convert_cmd convert_end pat_trace pat_convert_cmd + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + if (pPattern->getType() != RDOPATPattern::Type::OPERATION && pPattern->getType() != RDOPATPattern::Type::KEYBOARD) + { + std::string type = ""; + switch (pPattern->getType()) + { + case RDOPATPattern::Type::IE: + { + type = "нерегулярном событии"; + break; + } + case RDOPATPattern::Type::RULE: + { + type = "продукционном правиле"; + break; + } + default: break; + } + CONVERTER->error().error(@2, rdo::format("Ключевые слова Convert_begin и Convert_end могут быть использованы в обыкновенной и клавиатурной операции, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); + } + LPConvertCmdList pCmdListBegin = CONVERTER->stack().pop($4); + LPConvertCmdList pCmdListEnd = CONVERTER->stack().pop($7); + pPattern.object_static_cast()->addRelResConvertBeginEnd($3 != 0, pCmdListBegin, $6 != 0, pCmdListEnd, @2, @5, @3, @6); + $$ = CONVERTER->stack().push(pPattern); + } + | pat_res_usage convert_rule pat_trace pat_convert_cmd + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + if (pPattern->getType() != RDOPATPattern::Type::RULE) + { + std::string type = ""; + switch (pPattern->getType()) + { + case RDOPATPattern::Type::IE: + { + type = "нерегулярном событии"; + break; + } + case RDOPATPattern::Type::OPERATION: + { + type = "операции"; + break; + } + case RDOPATPattern::Type::KEYBOARD : + { + type = "клавиатурной операции"; + break; + } + default: break; + } + CONVERTER->error().error(@2, rdo::format("Ключевое слово Convert_rule может быть использовано в продукционном правиле, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); + } + LPConvertCmdList pCmdList = CONVERTER->stack().pop($4); + ASSERT(pPattern->m_pCurrRelRes); + pPattern->addRelResConvert($3 != 0, pCmdList, @2, @3, pPattern->m_pCurrRelRes->m_statusBegin); + $$ = CONVERTER->stack().push(pPattern); + } + | pat_res_usage convert_event pat_trace pat_convert_cmd + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + ASSERT(pPattern); + if (pPattern->getType() != RDOPATPattern::Type::IE) + { + std::string type = ""; + switch (pPattern->getType()) + { + case RDOPATPattern::Type::RULE : + { + type = "продукционном правиле"; + break; + } + case RDOPATPattern::Type::OPERATION: + { + type = "операции"; + break; + } + case RDOPATPattern::Type::KEYBOARD : + { + type = "клавиатурной операции"; + break; + } + default: break; + } + CONVERTER->error().error(@2, rdo::format("Ключевое слово Convert_event может быть использовано в событии или в нерегулярном событии, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); + } + + LPConvertCmdList pCmdList = CONVERTER->stack().pop($4); + ASSERT(pPattern->m_pCurrRelRes); + pPattern->addRelResConvert($3 != 0, pCmdList, @2, @3, pPattern->m_pCurrRelRes->m_statusBegin); + $$ = CONVERTER->stack().push(pPattern); + } + ; convert_rule - : RDO_Convert_rule - { - CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::convertBegin; - } - ; + : RDO_Convert_rule + { + CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CONVERT_BEGIN; + } + ; convert_event - : RDO_Convert_event - { - CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::convertBegin; - } - ; + : RDO_Convert_event + { + CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CONVERT_BEGIN; + } + ; convert_begin - : RDO_Convert_begin - { - CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::convertBegin; - } - ; + : RDO_Convert_begin + { + CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CONVERT_BEGIN; + } + ; convert_end - : RDO_Convert_end - { - CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::convertEnd; - } - ; + : RDO_Convert_end + { + CONVERTER->getLastPATPattern()->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CONVERT_END; + } + ; pat_convert_cmd - : /* empty */ - { - LPConvertCmdList pCmdList = rdo::Factory::create(); - LPRDORelevantResource pRelRes = CONVERTER->getLastPATPattern()->m_pCurrRelRes; - ASSERT(pRelRes); - pRelRes->getParamSetList().reset(); - $$ = CONVERTER->stack().push(pCmdList); - } - | pat_convert_cmd RDO_IDENTIF param_equal_type fun_arithm - { - LPConvertCmdList pCmdList = CONVERTER->stack().pop($1); - const std::string paramName = CONVERTER->stack().pop($2)->value().getIdentificator(); - LPRDORelevantResource pRelRes = CONVERTER->getLastPATPattern()->m_pCurrRelRes; - ASSERT(pRelRes); - LPRDORTPParam param = pRelRes->getType()->findRTPParam(paramName); - if (!param) - { - CONVERTER->error().error(@2, rdo::format("Неизвестный параметр: %s", paramName.c_str())); - } - pRelRes->getParamSetList().insert(param); - LPDocUpdate pInsert = rdo::Factory::create(@4.m_last_seek, ";"); - ASSERT(pInsert); - CONVERTER->insertDocUpdate(pInsert); - - $$ = CONVERTER->stack().push(pCmdList); - } - | pat_convert_cmd RDO_IDENTIF param_equal_type error - { - CONVERTER->error().error(@4, "Ошибка в арифметическом выражении"); - } - | pat_convert_cmd RDO_IDENTIF_NoChange - { - LPConvertCmdList pCmdList = CONVERTER->stack().pop($1); - - LPDocUpdate pInsert = rdo::Factory::create(@2.m_last_seek, ";"); - ASSERT(pInsert); - CONVERTER->insertDocUpdate(pInsert); - - $$ = CONVERTER->stack().push(pCmdList); - } - ; + : /* empty */ + { + LPConvertCmdList pCmdList = rdo::Factory::create(); + LPRDORelevantResource pRelRes = CONVERTER->getLastPATPattern()->m_pCurrRelRes; + ASSERT(pRelRes); + pRelRes->getParamSetList().reset(); + $$ = CONVERTER->stack().push(pCmdList); + } + | pat_convert_cmd RDO_IDENTIF param_equal_type fun_arithm + { + LPConvertCmdList pCmdList = CONVERTER->stack().pop($1); + const std::string paramName = CONVERTER->stack().pop($2)->value().getIdentificator(); + LPRDORelevantResource pRelRes = CONVERTER->getLastPATPattern()->m_pCurrRelRes; + ASSERT(pRelRes); + LPRDORTPParam param = pRelRes->getType()->findRTPParam(paramName); + if (!param) + { + CONVERTER->error().error(@2, rdo::format("Неизвестный параметр: %s", paramName.c_str())); + } + pRelRes->getParamSetList().insert(param); + LPDocUpdate pInsert = rdo::Factory::create(@4.m_last_seek, ";"); + ASSERT(pInsert); + CONVERTER->insertDocUpdate(pInsert); + + $$ = CONVERTER->stack().push(pCmdList); + } + | pat_convert_cmd RDO_IDENTIF param_equal_type error + { + CONVERTER->error().error(@4, "Ошибка в арифметическом выражении"); + } + | pat_convert_cmd RDO_IDENTIF_NoChange + { + LPConvertCmdList pCmdList = CONVERTER->stack().pop($1); + + LPDocUpdate pInsert = rdo::Factory::create(@2.m_last_seek, ";"); + ASSERT(pInsert); + CONVERTER->insertDocUpdate(pInsert); + + $$ = CONVERTER->stack().push(pCmdList); + } + ; param_equal_type - : RDO_set - { - LPDocUpdate pDelete = rdo::Factory::create(@1.m_first_seek, @1.m_last_seek); - ASSERT(pDelete); - CONVERTER->insertDocUpdate(pDelete); + : RDO_set + { + LPDocUpdate pDelete = rdo::Factory::create(@1.m_first_seek, @1.m_last_seek); + ASSERT(pDelete); + CONVERTER->insertDocUpdate(pDelete); - LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); - ASSERT(pInsert); - CONVERTER->insertDocUpdate(pInsert); + LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); + ASSERT(pInsert); + CONVERTER->insertDocUpdate(pInsert); - $$ = rdo::runtime::SetOperationType::SET; - } - ; + $$ = static_cast(rdo::runtime::SetOperation::Type::SET); + } + ; pat_pattern - : pat_convert RDO_End - { - LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); - if (pPattern->getType() == RDOPATPattern::PT_IE) - { - const std::string planning_time = boost::str(boost::format("time_now + %s") - % pPattern->time->calc()->srcInfo().src_text()); - - std::vector planning_params; - planning_params.push_back(planning_time); - - for (const LPRDOParam& param: pPattern->getParamList()) - { - planning_params.push_back(param->name()); - } - - const std::string planning = boost::str(boost::format("\r\n\t\t%s.planning(%s);") - % pPattern->name() - % boost::algorithm::join(planning_params, ", ")); - - LPDocUpdate pPlanningInsertIntoEvent = rdo::Factory::create( - @1.m_last_seek, - planning); - CONVERTER->insertDocUpdate(pPlanningInsertIntoEvent); - } - pPattern->end(); - $$ = CONVERTER->stack().push(pPattern); - } - ; + : pat_convert RDO_End + { + LPRDOPATPattern pPattern = CONVERTER->stack().pop($1); + if (pPattern->getType() == RDOPATPattern::Type::IE) + { + const std::string planning_time = boost::str(boost::format("time_now + %s") + % pPattern->time->calc()->srcInfo().src_text()); + + std::vector planning_params; + planning_params.push_back(planning_time); + + for (const LPRDOParam& param: pPattern->getParamList()) + { + planning_params.push_back(param->name()); + } + + const std::string planning = boost::str(boost::format("\r\n\t\t%s.planning(%s);") + % pPattern->name() + % boost::algorithm::join(planning_params, ", ")); + + LPDocUpdate pPlanningInsertIntoEvent = rdo::Factory::create( + @1.m_last_seek, + planning); + CONVERTER->insertDocUpdate(pPlanningInsertIntoEvent); + } + pPattern->end(); + $$ = CONVERTER->stack().push(pPattern); + } + ; // -------------------------------------------------------------------------------- // -------------------- Описание типа параметра // -------------------------------------------------------------------------------- param_type - : RDO_integer param_type_range - { - LPDocUpdate pReplace = rdo::Factory::create(@1.m_first_seek, @1.m_last_seek, "int"); - ASSERT(pReplace); - //CONVERTER->insertDocUpdate(pReplace); - - LPRDOTypeRangeRange pRange = CONVERTER->stack().pop($2); - LPRDOTypeParam pType; - if (pRange) - { - if (pRange->getMin()->typeID() != rdo::runtime::RDOType::t_int || - pRange->getMax()->typeID() != rdo::runtime::RDOType::t_int) - { - CONVERTER->error().error(@2, "Диапазон целого типа должен быть целочисленным"); - } - LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); - ASSERT(pIntRange); - pType = rdo::Factory::create(pIntRange, RDOParserSrcInfo(@1, @2)); - } - else - { - pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1, @2)); - } - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | RDO_real param_type_range - { - LPRDOTypeRangeRange pRange = CONVERTER->stack().pop($2); - LPRDOTypeParam pType; - if (pRange) - { - LPRDOTypeRealRange pRealRange = rdo::Factory::create(pRange); - ASSERT(pRealRange); - pType = rdo::Factory::create(pRealRange, RDOParserSrcInfo(@1, @2)); - } - else - { - pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1, @2)); - } - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | RDO_string - { - LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1)); - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | RDO_bool - { - LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1)); - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | param_type_enum - { - LEXER->enumReset(); - LPRDOEnumType pEnum = CONVERTER->stack().pop($1); - ASSERT(pEnum); - LPRDOTypeParam pType = rdo::Factory::create(pEnum, RDOParserSrcInfo(@1)); - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | param_type_such_as - { - LPRDOTypeParamSuchAs pTypeSuchAs = CONVERTER->stack().pop($1); - ASSERT(pTypeSuchAs); - LPRDOTypeParam pType = pTypeSuchAs.object_parent_cast(); - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - ; + : RDO_integer param_type_range + { + LPDocUpdate pReplace = rdo::Factory::create(@1.m_first_seek, @1.m_last_seek, "int"); + ASSERT(pReplace); + //CONVERTER->insertDocUpdate(pReplace); + + LPRDOTypeRangeRange pRange = CONVERTER->stack().pop($2); + LPRDOTypeParam pType; + if (pRange) + { + if (pRange->getMin()->typeID() != rdo::runtime::RDOType::Type::INT || + pRange->getMax()->typeID() != rdo::runtime::RDOType::Type::INT) + { + CONVERTER->error().error(@2, "Диапазон целого типа должен быть целочисленным"); + } + LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); + ASSERT(pIntRange); + pType = rdo::Factory::create(pIntRange, RDOParserSrcInfo(@1, @2)); + } + else + { + pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1, @2)); + } + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | RDO_real param_type_range + { + LPRDOTypeRangeRange pRange = CONVERTER->stack().pop($2); + LPRDOTypeParam pType; + if (pRange) + { + LPRDOTypeRealRange pRealRange = rdo::Factory::create(pRange); + ASSERT(pRealRange); + pType = rdo::Factory::create(pRealRange, RDOParserSrcInfo(@1, @2)); + } + else + { + pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1, @2)); + } + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | RDO_string + { + LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1)); + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | RDO_bool + { + LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1)); + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | param_type_enum + { + LEXER->enumReset(); + LPRDOEnumType pEnum = CONVERTER->stack().pop($1); + ASSERT(pEnum); + LPRDOTypeParam pType = rdo::Factory::create(pEnum, RDOParserSrcInfo(@1)); + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | param_type_such_as + { + LPRDOTypeParamSuchAs pTypeSuchAs = CONVERTER->stack().pop($1); + ASSERT(pTypeSuchAs); + LPRDOTypeParam pType = pTypeSuchAs.object_parent_cast(); + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + ; param_type_range - : /* empty */ - { - $$ = CONVERTER->stack().push(LPRDOTypeRangeRange()); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = CONVERTER->stack().push(pRange); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = CONVERTER->stack().push(pRange); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = CONVERTER->stack().push(pRange); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = CONVERTER->stack().push(pRange); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_REAL_CONST RDO_dblpoint error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_INT_CONST RDO_dblpoint error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' error - { - CONVERTER->error().error(@2, "Диапазон задан неверно"); - } - ; + : /* empty */ + { + $$ = CONVERTER->stack().push(LPRDOTypeRangeRange()); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = CONVERTER->stack().push(pRange); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = CONVERTER->stack().push(pRange); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = CONVERTER->stack().push(pRange); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = CONVERTER->stack().push(pRange); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_REAL_CONST RDO_dblpoint error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_INT_CONST RDO_dblpoint error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' error + { + CONVERTER->error().error(@2, "Диапазон задан неверно"); + } + ; param_type_enum - : '(' param_type_enum_list ')' - { - LPRDOEnumType pEnum = CONVERTER->stack().pop($2); - ASSERT(pEnum); - $$ = CONVERTER->stack().push(pEnum); - } - | '(' param_type_enum_list error - { - CONVERTER->error().error(@2, "Перечисление должно заканчиваться скобкой"); - } - ; + : '(' param_type_enum_list ')' + { + LPRDOEnumType pEnum = CONVERTER->stack().pop($2); + ASSERT(pEnum); + $$ = CONVERTER->stack().push(pEnum); + } + | '(' param_type_enum_list error + { + CONVERTER->error().error(@2, "Перечисление должно заканчиваться скобкой"); + } + ; param_type_enum_list - : RDO_IDENTIF - { - LPRDOEnumType pEnum = rdo::Factory::create(); - ASSERT(pEnum); - pEnum->add(CONVERTER->stack().pop($1)); - LEXER->enumBegin(); - $$ = CONVERTER->stack().push(pEnum); - } - | param_type_enum_list ',' RDO_IDENTIF - { - if (!LEXER->enumEmpty()) - { - LPRDOEnumType pEnum = CONVERTER->stack().pop($1); - ASSERT(pEnum); - pEnum->add(CONVERTER->stack().pop($3)); - $$ = CONVERTER->stack().push(pEnum); - } - else - { - CONVERTER->error().error(@3, "Ошибка в описании значений перечислимого типа"); - } - } - | param_type_enum_list RDO_IDENTIF - { - if (!LEXER->enumEmpty()) - { - LPRDOEnumType pEnum = CONVERTER->stack().pop($1); - ASSERT(pEnum); - pEnum->add(CONVERTER->stack().pop($2)); - $$ = CONVERTER->stack().push(pEnum); - CONVERTER->error().warning(@1, rdo::format("Пропущена запятая перед: %s", CONVERTER->stack().pop($2)->value().getIdentificator().c_str())); - } - else - { - CONVERTER->error().error(@2, "Ошибка в описании значений перечислимого типа"); - } - } - | param_type_enum_list ',' RDO_INT_CONST - { - CONVERTER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); - } - | param_type_enum_list ',' RDO_REAL_CONST - { - CONVERTER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); - } - | param_type_enum_list RDO_INT_CONST - { - CONVERTER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); - } - | param_type_enum_list RDO_REAL_CONST - { - CONVERTER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); - } - | RDO_INT_CONST - { - CONVERTER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); - } - | RDO_REAL_CONST - { - CONVERTER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); - } - ; + : RDO_IDENTIF + { + LPRDOEnumType pEnum = rdo::Factory::create(); + ASSERT(pEnum); + pEnum->add(CONVERTER->stack().pop($1)); + LEXER->enumBegin(); + $$ = CONVERTER->stack().push(pEnum); + } + | param_type_enum_list ',' RDO_IDENTIF + { + if (!LEXER->enumEmpty()) + { + LPRDOEnumType pEnum = CONVERTER->stack().pop($1); + ASSERT(pEnum); + pEnum->add(CONVERTER->stack().pop($3)); + $$ = CONVERTER->stack().push(pEnum); + } + else + { + CONVERTER->error().error(@3, "Ошибка в описании значений перечислимого типа"); + } + } + | param_type_enum_list RDO_IDENTIF + { + if (!LEXER->enumEmpty()) + { + LPRDOEnumType pEnum = CONVERTER->stack().pop($1); + ASSERT(pEnum); + pEnum->add(CONVERTER->stack().pop($2)); + $$ = CONVERTER->stack().push(pEnum); + CONVERTER->error().warning(@1, rdo::format("Пропущена запятая перед: %s", CONVERTER->stack().pop($2)->value().getIdentificator().c_str())); + } + else + { + CONVERTER->error().error(@2, "Ошибка в описании значений перечислимого типа"); + } + } + | param_type_enum_list ',' RDO_INT_CONST + { + CONVERTER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); + } + | param_type_enum_list ',' RDO_REAL_CONST + { + CONVERTER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); + } + | param_type_enum_list RDO_INT_CONST + { + CONVERTER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); + } + | param_type_enum_list RDO_REAL_CONST + { + CONVERTER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); + } + | RDO_INT_CONST + { + CONVERTER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); + } + | RDO_REAL_CONST + { + CONVERTER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); + } + ; param_type_such_as - : RDO_such_as RDO_IDENTIF '.' RDO_IDENTIF - { - const std::string type = CONVERTER->stack().pop($2)->value().getIdentificator(); - const std::string param = CONVERTER->stack().pop($4)->value().getIdentificator(); - LPRDORTPResType pResType = CONVERTER->findRTPResType(type); - if (!pResType) - { - CONVERTER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); - } - LPRDORTPParam pRTPParam = pResType->findRTPParam(param); - if (!pRTPParam) - { - CONVERTER->error().error(@4, rdo::format("Ссылка на неизвестный параметр ресурса: %s.%s", type.c_str(), param.c_str())); - } - LPRDOParam pParam = pRTPParam.object_parent_cast(); - ASSERT(pParam); - LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); - ASSERT(pTypeSuchAs); - $$ = CONVERTER->stack().push(pTypeSuchAs); - } - | RDO_such_as RDO_IDENTIF - { - const std::string constName = CONVERTER->stack().pop($2)->value().getIdentificator(); - LPRDOFUNConstant pConstant = CONVERTER->findFUNConstant(constName); - if (!pConstant) - { - CONVERTER->error().error(@2, rdo::format("Ссылка на несуществующую константу: %s", constName.c_str())); - } - LPRDOParam pParam = pConstant.object_parent_cast(); - ASSERT(pParam); - LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); - ASSERT(pTypeSuchAs); - $$ = CONVERTER->stack().push(pTypeSuchAs); - } - | RDO_such_as RDO_IDENTIF '.' error - { - const std::string type = CONVERTER->stack().pop($2)->value().getIdentificator(); - LPRDORTPResType pResType = CONVERTER->findRTPResType(type); - if (!pResType) - { - CONVERTER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); - } - else - { - CONVERTER->error().error(@4, "Ошибка при указании параметра"); - } - } - | RDO_such_as error - { - CONVERTER->error().error(@2, "После ключевого слова such_as необходимо указать тип и параметер ресурса для ссылки"); - } - ; + : RDO_such_as RDO_IDENTIF '.' RDO_IDENTIF + { + const std::string type = CONVERTER->stack().pop($2)->value().getIdentificator(); + const std::string param = CONVERTER->stack().pop($4)->value().getIdentificator(); + LPRDORTPResType pResType = CONVERTER->findRTPResType(type); + if (!pResType) + { + CONVERTER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); + } + LPRDORTPParam pRTPParam = pResType->findRTPParam(param); + if (!pRTPParam) + { + CONVERTER->error().error(@4, rdo::format("Ссылка на неизвестный параметр ресурса: %s.%s", type.c_str(), param.c_str())); + } + LPRDOParam pParam = pRTPParam.object_parent_cast(); + ASSERT(pParam); + LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); + ASSERT(pTypeSuchAs); + $$ = CONVERTER->stack().push(pTypeSuchAs); + } + | RDO_such_as RDO_IDENTIF + { + const std::string constName = CONVERTER->stack().pop($2)->value().getIdentificator(); + LPRDOFUNConstant pConstant = CONVERTER->findFUNConstant(constName); + if (!pConstant) + { + CONVERTER->error().error(@2, rdo::format("Ссылка на несуществующую константу: %s", constName.c_str())); + } + LPRDOParam pParam = pConstant.object_parent_cast(); + ASSERT(pParam); + LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); + ASSERT(pTypeSuchAs); + $$ = CONVERTER->stack().push(pTypeSuchAs); + } + | RDO_such_as RDO_IDENTIF '.' error + { + const std::string type = CONVERTER->stack().pop($2)->value().getIdentificator(); + LPRDORTPResType pResType = CONVERTER->findRTPResType(type); + if (!pResType) + { + CONVERTER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); + } + else + { + CONVERTER->error().error(@4, "Ошибка при указании параметра"); + } + } + | RDO_such_as error + { + CONVERTER->error().error(@2, "После ключевого слова such_as необходимо указать тип и параметер ресурса для ссылки"); + } + ; param_value_default - : /* empty */ - { - $$ = CONVERTER->stack().push(rdo::Factory::create()); - } - | '=' RDO_INT_CONST - { - $$ = $2; - } - | '=' RDO_REAL_CONST - { - $$ = $2; - } - | '=' RDO_STRING_CONST - { - $$ = $2; - } - | '=' RDO_IDENTIF - { - $$ = $2; - } - | '=' RDO_BOOL_CONST - { - $$ = $2; - } - | '=' error - { - RDOParserSrcInfo src_info(@1, @2, true); - if (src_info.src_pos().point()) - { - CONVERTER->error().error(src_info, "Не указано значение по умолчанию"); - } - else - { - CONVERTER->error().error(src_info, "Неверное значение по умолчанию"); - } - } - ; + : /* empty */ + { + $$ = CONVERTER->stack().push(rdo::Factory::create()); + } + | '=' RDO_INT_CONST + { + $$ = $2; + } + | '=' RDO_REAL_CONST + { + $$ = $2; + } + | '=' RDO_STRING_CONST + { + $$ = $2; + } + | '=' RDO_IDENTIF + { + $$ = $2; + } + | '=' RDO_BOOL_CONST + { + $$ = $2; + } + | '=' error + { + RDOParserSrcInfo src_info(@1, @2, true); + if (src_info.src_pos().point()) + { + CONVERTER->error().error(src_info, "Не указано значение по умолчанию"); + } + else + { + CONVERTER->error().error(src_info, "Неверное значение по умолчанию"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Общие составные токены для всех объектов РДО @@ -1929,488 +1918,488 @@ param_value_default // -------------------- Логические выражения // -------------------------------------------------------------------------------- fun_logic_eq - : '=' - { - LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); - ASSERT(pInsert); - CONVERTER->insertDocUpdate(pInsert); - - $$ = RDO_eq; - } - | RDO_eq - { - $$ = RDO_eq; - } - ; + : '=' + { + LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); + ASSERT(pInsert); + CONVERTER->insertDocUpdate(pInsert); + + $$ = RDO_eq; + } + | RDO_eq + { + $$ = RDO_eq; + } + ; fun_logic - : fun_arithm fun_logic_eq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_neq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '<' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '>' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_leq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_geq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_and fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_or fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pArithm); - LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_group - | fun_select_logic - | '[' fun_logic ']' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("[" + pLogic->src_text() + "]"); - $$ = CONVERTER->stack().push(pLogic); - } - | '(' fun_logic ')' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("(" + pLogic->src_text() + ")"); - $$ = CONVERTER->stack().push(pLogic); - } - | RDO_not fun_logic - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - LPRDOFUNLogic pLogicNot = pLogic->operator_not(); - ASSERT(pLogicNot); - pLogicNot->setSrcPos (@1, @2); - pLogicNot->setSrcText("not " + pLogic->src_text()); - $$ = CONVERTER->stack().push(pLogicNot); - } - | '[' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | '(' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - ; + : fun_arithm fun_logic_eq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_neq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '<' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '>' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_leq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_geq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_and fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_or fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pArithm); + LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_group + | fun_select_logic + | '[' fun_logic ']' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("[" + pLogic->src_text() + "]"); + $$ = CONVERTER->stack().push(pLogic); + } + | '(' fun_logic ')' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("(" + pLogic->src_text() + ")"); + $$ = CONVERTER->stack().push(pLogic); + } + | RDO_not fun_logic + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + LPRDOFUNLogic pLogicNot = pLogic->operator_not(); + ASSERT(pLogicNot); + pLogicNot->setSrcPos (@1, @2); + pLogicNot->setSrcText("not " + pLogic->src_text()); + $$ = CONVERTER->stack().push(pLogicNot); + } + | '[' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | '(' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Арифметические выражения // -------------------------------------------------------------------------------- fun_arithm - : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | fun_arithm '+' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '-' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '*' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '/' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm_func_call - | fun_select_arithm - | '(' fun_arithm ')' - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - pArithm->setSrcPos (@1, @3); - pArithm->setSrcText("(" + pArithm->src_text() + ")"); - $$ = CONVERTER->stack().push(pArithm); - } - | '-' fun_arithm %prec RDO_UMINUS - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - RDOParserSrcInfo info; - info.setSrcPos (@1, @2); - info.setSrcText("-" + pArithm->src_text()); - $$ = CONVERTER->stack().push( - rdo::Factory::create( - rdo::Factory::create(pArithm->type(), info), - rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() - ) - ); - } - ; + : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | fun_arithm '+' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '-' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '*' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '/' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm_func_call + | fun_select_arithm + | '(' fun_arithm ')' + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + pArithm->setSrcPos (@1, @3); + pArithm->setSrcText("(" + pArithm->src_text() + ")"); + $$ = CONVERTER->stack().push(pArithm); + } + | '-' fun_arithm %prec RDO_UMINUS + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + RDOParserSrcInfo info; + info.setSrcPos (@1, @2); + info.setSrcText("-" + pArithm->src_text()); + $$ = CONVERTER->stack().push( + rdo::Factory::create( + rdo::Factory::create(pArithm->type(), info), + rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() + ) + ); + } + ; // -------------------------------------------------------------------------------- // -------------------- Функции и последовательности // -------------------------------------------------------------------------------- fun_arithm_func_call - : RDO_IDENTIF '(' ')' - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @3); - pFunParams->setSrcText(funName + "()"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @4); - pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' error - { - CONVERTER->error().error(@3, "Ошибка в параметрах функции"); - } - ; + : RDO_IDENTIF '(' ')' + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @3); + pFunParams->setSrcText(funName + "()"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @4); + pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' error + { + CONVERTER->error().error(@3, "Ошибка в параметрах функции"); + } + ; fun_arithm_func_call_pars - : fun_arithm - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars ',' fun_arithm - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars error - { - CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); - } - | fun_arithm_func_call_pars ',' error - { - CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); - } - ; + : fun_arithm + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars ',' fun_arithm + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars error + { + CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); + } + | fun_arithm_func_call_pars ',' error + { + CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Групповые выражения // -------------------------------------------------------------------------------- fun_group_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_group_header - : fun_group_keyword '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - $$ = CONVERTER->stack().push(rdo::Factory::create((RDOFUNGroupLogic::FunGroupType)$1, pValue->src_info())); - } - | fun_group_keyword '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | fun_group_keyword error - { - CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); - } - ; + : fun_group_keyword '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + $$ = CONVERTER->stack().push(rdo::Factory::create(static_cast($1), pValue->src_info())); + } + | fun_group_keyword '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | fun_group_keyword error + { + CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); + } + ; fun_group - : fun_group_header fun_logic ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pGroupFun); - ASSERT(pLogic ); - pGroupFun->setSrcPos(@1, @3); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); - } - | fun_group_header RDO_NoCheck ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - ASSERT(pGroupFun); - pGroupFun->setSrcPos(@1, @3); - LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); - ASSERT(pTrueLogic); - pTrueLogic->setSrcPos (@2); - pTrueLogic->setSrcText("NoCheck"); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); - } - | fun_group_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_group_header fun_logic ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pGroupFun); + ASSERT(pLogic ); + pGroupFun->setSrcPos(@1, @3); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); + } + | fun_group_header RDO_NoCheck ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + ASSERT(pGroupFun); + pGroupFun->setSrcPos(@1, @3); + LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); + ASSERT(pTrueLogic); + pTrueLogic->setSrcPos (@2); + pTrueLogic->setSrcText("NoCheck"); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); + } + | fun_group_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Select // -------------------------------------------------------------------------------- fun_select_header - : RDO_Select '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); - ASSERT(pSelect); - pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); - $$ = CONVERTER->stack().push(pSelect); - } - | RDO_Select '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | RDO_Select error - { - CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); - } - ; + : RDO_Select '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); + ASSERT(pSelect); + pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); + $$ = CONVERTER->stack().push(pSelect); + } + | RDO_Select '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | RDO_Select error + { + CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); + } + ; fun_select_body - : fun_select_header fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header RDO_NoCheck ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - RDOParserSrcInfo logicInfo(@2, "NoCheck"); - pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); - rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); - ASSERT(pCalc); - LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); - ASSERT(pLogic); - pLogic->setSrcInfo(logicInfo); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_select_header fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header RDO_NoCheck ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + RDOParserSrcInfo logicInfo(@2, "NoCheck"); + pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); + rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); + ASSERT(pCalc); + LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); + ASSERT(pLogic); + pLogic->setSrcInfo(logicInfo); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; fun_select_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_select_logic - : fun_select_body '.' fun_select_keyword '(' fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcPos(@1, @6); - LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup((RDOFUNGroupLogic::FunGroupType)$3, pLogic); - ASSERT(pLogicSelect); - $$ = CONVERTER->stack().push(pLogicSelect); - } - | fun_select_body '.' fun_select_keyword '(' error - { - CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); - } - | fun_select_body '.' fun_select_keyword error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); - LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); - ASSERT(pLogic); - $$ = CONVERTER->stack().push(pLogic); - } - | fun_select_body '.' RDO_Empty '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' error - { - CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); - } - | fun_select_body error - { - CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); - } - ; + : fun_select_body '.' fun_select_keyword '(' fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcPos(@1, @6); + LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup(static_cast($3), pLogic); + ASSERT(pLogicSelect); + $$ = CONVERTER->stack().push(pLogicSelect); + } + | fun_select_body '.' fun_select_keyword '(' error + { + CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); + } + | fun_select_body '.' fun_select_keyword error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); + LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); + ASSERT(pLogic); + $$ = CONVERTER->stack().push(pLogic); + } + | fun_select_body '.' RDO_Empty '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' error + { + CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); + } + | fun_select_body error + { + CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); + } + ; fun_select_arithm - : fun_select_body '.' RDO_Size '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); - LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | fun_select_body '.' RDO_Size error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Size '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - ; + : fun_select_body '.' RDO_Size '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); + LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | fun_select_body '.' RDO_Size error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Size '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + ; %% diff --git a/converter/smr2rdox/grammar/rdopmd.y b/converter/smr2rdox/grammar/rdopmd.y index 5ec7c7107..5bd23aea0 100644 --- a/converter/smr2rdox/grammar/rdopmd.y +++ b/converter/smr2rdox/grammar/rdopmd.y @@ -1,13 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdopmd.y - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \date - \brief - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -16,175 +6,175 @@ %pure-parser %param {void* lexer} -%token RDO_Resource_type 257 -%token RDO_permanent 258 -%token RDO_Parameters 259 -%token RDO_integer 260 -%token RDO_real 261 -%token RDO_End 262 -%token RDO_temporary 263 -%token RDO_IDENTIF 264 -%token RDO_INT_CONST 265 -%token RDO_REAL_CONST 266 -%token RDO_such_as 267 -%token RDO_dblpoint 268 -%token RDO_Resources 269 -%token RDO_trace 270 -%token RDO_no_trace 271 -%token RDO_IDENTIF_COLON 272 -%token RDO_Constant 273 -%token RDO_Body 274 -%token RDO_Function 275 -%token RDO_Type 276 -%token RDO_algorithmic 277 -%token RDO_table 278 -%token RDO_list 279 -%token RDO_Exist 281 -%token RDO_Not_Exist 282 -%token RDO_For_All 283 -%token RDO_Not_For_All 284 -%token RDO_neq 285 -%token RDO_leq 286 -%token RDO_geq 287 -%token RDO_NoCheck 288 -%token RDO_Calculate_if 289 -%token RDO_or 290 -%token RDO_and 291 -%token RDO_Sequence 292 -%token RDO_uniform 293 -%token RDO_exponential 294 -%token RDO_normal 295 -%token RDO_by_hist 296 -%token RDO_enumerative 297 - -%token RDO_Pattern 298 -%token RDO_operation 299 -%token RDO_irregular_event 300 -%token RDO_rule 301 -%token RDO_keyboard 302 -%token RDO_Relevant_resources 303 -%token RDO_Keep 304 -%token RDO_Create 305 -%token RDO_Erase 306 -%token RDO_NonExist 307 -%token RDO_IDENTIF_NoChange 308 -%token RDO_Time 309 -%token RDO_Choice 310 -%token RDO_from 311 -%token RDO_first 312 -%token RDO_Convert_begin 313 -%token RDO_Convert_end 314 -%token RDO_Convert_rule 315 -%token RDO_Convert_event 316 -%token RDO_with_max 317 -%token RDO_with_min 318 -%token RDO_set 319 -%token RDO_IDENTIF_NoChange_NoChange 320 -%token RDO_Operations 321 - -%token RDO_Results 322 -%token RDO_watch_par 323 -%token RDO_watch_state 324 -%token RDO_watch_quant 325 -%token RDO_watch_value 326 -%token RDO_get_value 327 - -%token RDO_Model_name 328 -%token RDO_Resource_file 329 -%token RDO_OprIev_file 330 -%token RDO_Frame_file 331 -%token RDO_Statistic_file 332 -%token RDO_Results_file 333 -%token RDO_Trace_file 334 -%token RDO_Show_mode 335 -%token RDO_Frame_number 336 -%token RDO_Show_rate 337 -%token RDO_Run_StartTime 338 -%token RDO_Trace_StartTime 339 -%token RDO_Trace_EndTime 340 -%token RDO_Terminate_if 341 -%token RDO_Break_point 342 -%token RDO_Seed 343 -%token RDO_NoShow 344 -%token RDO_Monitor 345 -%token RDO_Animation 346 -%token RDO_NoChange 347 - -%token RDO_Decision_point 348 -%token RDO_search 349 -%token RDO_trace_stat 350 -%token RDO_trace_tops 351 -%token RDO_trace_all 352 -%token RDO_Condition 353 -%token RDO_Term_condition 354 -%token RDO_Evaluate_by 355 -%token RDO_Compare_tops 356 -%token RDO_NO 357 -%token RDO_YES 358 -%token RDO_Activities 359 -%token RDO_value_before 360 -%token RDO_value_after 361 -%token RDO_some 362 -%token RDO_Process 363 -%token RDO_SEIZE 364 -%token RDO_GENERATE 365 -%token RDO_TERMINATE 366 -%token RDO_ADVANCE 367 -%token RDO_RELEASE 368 -%token RDO_if 369 -%token RDO_CF 370 -%token RDO_Priority 371 -%token RDO_prior 372 -%token RDO_Parent 373 - -%token RDO_Frame 400 -%token RDO_Show_if 401 -%token RDO_Back_picture 402 -%token RDO_Show 403 -%token RDO_frm_cell 404 -%token RDO_text 405 -%token RDO_bitmap 406 -%token RDO_s_bmp 407 -%token RDO_rect 408 -%token RDO_r_rect 409 -%token RDO_line 410 -%token RDO_ellipse 411 -%token RDO_triang 412 -%token RDO_active 413 -%token RDO_ruler 414 -%token RDO_space 415 -%token RDO_color_transparent 416 -%token RDO_color_last 417 -%token RDO_color_white 418 -%token RDO_color_black 419 -%token RDO_color_red 420 -%token RDO_color_green 421 -%token RDO_color_blue 422 -%token RDO_color_cyan 423 -%token RDO_color_magenta 424 -%token RDO_color_yellow 425 -%token RDO_color_gray 426 - -%token RDO_IDENTIF_RELRES 427 -%token RDO_typedef 428 -%token RDO_enum 429 - -%token RDO_STRING_CONST 430 -%token RDO_Select 431 -%token RDO_Size 432 -%token RDO_Empty 433 -%token RDO_not 434 -%token RDO_UMINUS 435 -%token RDO_string 436 -%token RDO_bool 437 -%token RDO_BOOL_CONST 438 -%token RDO_Fuzzy 439 -%token RDO_Fuzzy_Term 440 -%token RDO_eq 441 -%token RDO_External_Model 442 -%token RDO_QUEUE 443 -%token RDO_DEPART 444 -%token RDO_ASSIGN 445 +%token RDO_Resource_type 257 +%token RDO_permanent 258 +%token RDO_Parameters 259 +%token RDO_integer 260 +%token RDO_real 261 +%token RDO_End 262 +%token RDO_temporary 263 +%token RDO_IDENTIF 264 +%token RDO_INT_CONST 265 +%token RDO_REAL_CONST 266 +%token RDO_such_as 267 +%token RDO_dblpoint 268 +%token RDO_Resources 269 +%token RDO_trace 270 +%token RDO_no_trace 271 +%token RDO_IDENTIF_COLON 272 +%token RDO_Constant 273 +%token RDO_Body 274 +%token RDO_Function 275 +%token RDO_Type 276 +%token RDO_algorithmic 277 +%token RDO_table 278 +%token RDO_list 279 +%token RDO_Exist 281 +%token RDO_Not_Exist 282 +%token RDO_For_All 283 +%token RDO_Not_For_All 284 +%token RDO_neq 285 +%token RDO_leq 286 +%token RDO_geq 287 +%token RDO_NoCheck 288 +%token RDO_Calculate_if 289 +%token RDO_or 290 +%token RDO_and 291 +%token RDO_Sequence 292 +%token RDO_uniform 293 +%token RDO_exponential 294 +%token RDO_normal 295 +%token RDO_by_hist 296 +%token RDO_enumerative 297 + +%token RDO_Pattern 298 +%token RDO_operation 299 +%token RDO_irregular_event 300 +%token RDO_rule 301 +%token RDO_keyboard 302 +%token RDO_Relevant_resources 303 +%token RDO_Keep 304 +%token RDO_Create 305 +%token RDO_Erase 306 +%token RDO_NonExist 307 +%token RDO_IDENTIF_NoChange 308 +%token RDO_Time 309 +%token RDO_Choice 310 +%token RDO_from 311 +%token RDO_first 312 +%token RDO_Convert_begin 313 +%token RDO_Convert_end 314 +%token RDO_Convert_rule 315 +%token RDO_Convert_event 316 +%token RDO_with_max 317 +%token RDO_with_min 318 +%token RDO_set 319 +%token RDO_IDENTIF_NoChange_NoChange 320 +%token RDO_Operations 321 + +%token RDO_Results 322 +%token RDO_watch_par 323 +%token RDO_watch_state 324 +%token RDO_watch_quant 325 +%token RDO_watch_value 326 +%token RDO_get_value 327 + +%token RDO_Model_name 328 +%token RDO_Resource_file 329 +%token RDO_OprIev_file 330 +%token RDO_Frame_file 331 +%token RDO_Statistic_file 332 +%token RDO_Results_file 333 +%token RDO_Trace_file 334 +%token RDO_Show_mode 335 +%token RDO_Frame_number 336 +%token RDO_Show_rate 337 +%token RDO_Run_StartTime 338 +%token RDO_Trace_StartTime 339 +%token RDO_Trace_EndTime 340 +%token RDO_Terminate_if 341 +%token RDO_Break_point 342 +%token RDO_Seed 343 +%token RDO_NoShow 344 +%token RDO_Monitor 345 +%token RDO_Animation 346 +%token RDO_NoChange 347 + +%token RDO_Decision_point 348 +%token RDO_search 349 +%token RDO_trace_stat 350 +%token RDO_trace_tops 351 +%token RDO_trace_all 352 +%token RDO_Condition 353 +%token RDO_Term_condition 354 +%token RDO_Evaluate_by 355 +%token RDO_Compare_tops 356 +%token RDO_NO 357 +%token RDO_YES 358 +%token RDO_Activities 359 +%token RDO_value_before 360 +%token RDO_value_after 361 +%token RDO_some 362 +%token RDO_Process 363 +%token RDO_SEIZE 364 +%token RDO_GENERATE 365 +%token RDO_TERMINATE 366 +%token RDO_ADVANCE 367 +%token RDO_RELEASE 368 +%token RDO_if 369 +%token RDO_CF 370 +%token RDO_Priority 371 +%token RDO_prior 372 +%token RDO_Parent 373 + +%token RDO_Frame 400 +%token RDO_Show_if 401 +%token RDO_Back_picture 402 +%token RDO_Show 403 +%token RDO_frm_cell 404 +%token RDO_text 405 +%token RDO_bitmap 406 +%token RDO_s_bmp 407 +%token RDO_rect 408 +%token RDO_r_rect 409 +%token RDO_line 410 +%token RDO_ellipse 411 +%token RDO_triang 412 +%token RDO_active 413 +%token RDO_ruler 414 +%token RDO_space 415 +%token RDO_color_transparent 416 +%token RDO_color_last 417 +%token RDO_color_white 418 +%token RDO_color_black 419 +%token RDO_color_red 420 +%token RDO_color_green 421 +%token RDO_color_blue 422 +%token RDO_color_cyan 423 +%token RDO_color_magenta 424 +%token RDO_color_yellow 425 +%token RDO_color_gray 426 + +%token RDO_IDENTIF_RELRES 427 +%token RDO_typedef 428 +%token RDO_enum 429 + +%token RDO_STRING_CONST 430 +%token RDO_Select 431 +%token RDO_Size 432 +%token RDO_Empty 433 +%token RDO_not 434 +%token RDO_UMINUS 435 +%token RDO_string 436 +%token RDO_bool 437 +%token RDO_BOOL_CONST 438 +%token RDO_Fuzzy 439 +%token RDO_Fuzzy_Term 440 +%token RDO_eq 441 +%token RDO_External_Model 442 +%token RDO_QUEUE 443 +%token RDO_DEPART 444 +%token RDO_ASSIGN 445 %{ @@ -216,180 +206,180 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE %% pmd_main - : /* empty */ - | pmd_end - ; + : /* empty */ + | pmd_end + ; pmd_body - : /* empty */ - | pmd_body pmd_result - ; + : /* empty */ + | pmd_body pmd_result + ; pmd_trace - : /* empty */ - { - $$ = 0; - } - | RDO_trace - { - $$ = 1; - } - | RDO_no_trace - { - $$ = 0; - } - ; + : /* empty */ + { + $$ = 0; + } + | RDO_trace + { + $$ = 1; + } + | RDO_no_trace + { + $$ = 0; + } + ; pmd_result_watch_quant_begin - : RDO_IDENTIF_COLON pmd_trace RDO_watch_quant RDO_IDENTIF - { - LPRDOPMDWatchQuant pWatchQuant = rdo::Factory::create(CONVERTER->stack().pop($1)->src_info(), $2 != 0, CONVERTER->stack().pop($4)->src_info()); - ASSERT(pWatchQuant); - $$ = CONVERTER->stack().push(pWatchQuant); - } - ; + : RDO_IDENTIF_COLON pmd_trace RDO_watch_quant RDO_IDENTIF + { + LPRDOPMDWatchQuant pWatchQuant = rdo::Factory::create(CONVERTER->stack().pop($1)->src_info(), $2 != 0, CONVERTER->stack().pop($4)->src_info()); + ASSERT(pWatchQuant); + $$ = CONVERTER->stack().push(pWatchQuant); + } + ; pmd_result_watch_value_begin - : RDO_IDENTIF_COLON pmd_trace RDO_watch_value RDO_IDENTIF - { - LPRDOPMDWatchValue pWatchValue = rdo::Factory::create(CONVERTER->stack().pop($1)->src_info(), $2 != 0, CONVERTER->stack().pop($4)->src_info()); - ASSERT(pWatchValue); - $$ = CONVERTER->stack().push(pWatchValue); - } - ; + : RDO_IDENTIF_COLON pmd_trace RDO_watch_value RDO_IDENTIF + { + LPRDOPMDWatchValue pWatchValue = rdo::Factory::create(CONVERTER->stack().pop($1)->src_info(), $2 != 0, CONVERTER->stack().pop($4)->src_info()); + ASSERT(pWatchValue); + $$ = CONVERTER->stack().push(pWatchValue); + } + ; pmd_result - : RDO_IDENTIF_COLON pmd_trace RDO_watch_par RDO_IDENTIF '.' RDO_IDENTIF - { - LPRDOPMDResult pResult = rdo::Factory::create(CONVERTER->stack().pop($1)->src_info(), $2 != 0, CONVERTER->stack().pop($4)->src_info(), CONVERTER->stack().pop($6)->src_info()); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | RDO_IDENTIF_COLON pmd_trace RDO_watch_par RDO_IDENTIF '.' error - { - CONVERTER->error().error(@5, @6, "Ожидается имя параметра"); - } - | RDO_IDENTIF_COLON pmd_trace RDO_watch_par RDO_IDENTIF error - { - CONVERTER->error().error(@4, "Ожидается '.'"); - } - | RDO_IDENTIF_COLON pmd_trace RDO_watch_par error - { - CONVERTER->error().error(@3, @4, "После ключевого слова watch_par ожидается имя ресурса"); - } - | RDO_IDENTIF_COLON pmd_trace error - { - CONVERTER->error().error(@2, @3, "Ожидается тип показателя"); - } - | RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@1, @2, "Ожидается признак трассировки или тип показателя"); - } - | RDO_IDENTIF error - { - CONVERTER->error().error(@1, @2, "Ожидается ':'"); - } - | error - { - CONVERTER->error().error(@1, "Ожидается имя показателя"); - } - | RDO_IDENTIF_COLON pmd_trace RDO_watch_state fun_logic - { - LPRDOPMDResult pResult = rdo::Factory::create(CONVERTER->stack().pop($1)->src_info(), $2 != 0, CONVERTER->stack().pop($4)); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | RDO_IDENTIF_COLON pmd_trace RDO_watch_state error - { - CONVERTER->error().error(@3, @4, "После ключевого слова watch_state ожидается логическое выражение"); - } - | pmd_result_watch_quant_begin fun_logic - { - LPRDOPMDWatchQuant pWatchQuant = CONVERTER->stack().pop($1); - ASSERT(pWatchQuant); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pWatchQuant->setLogic(pLogic); - $$ = CONVERTER->stack().push(pWatchQuant); - } - | pmd_result_watch_quant_begin RDO_NoCheck - { - LPRDOPMDWatchQuant pWatchQuant = CONVERTER->stack().pop($1); - ASSERT(pWatchQuant); - pWatchQuant->setLogicNoCheck(); - $$ = CONVERTER->stack().push(pWatchQuant); - } - | pmd_result_watch_quant_begin error - { - CONVERTER->error().error(@1, @2, "После имени типа ожидается логическое выражение"); - } - | RDO_IDENTIF_COLON pmd_trace RDO_watch_quant error - { - CONVERTER->error().error(@3, @4, "После ключевого слова watch_quant ожидается тип ресурса"); - } - | pmd_result_watch_value_begin fun_logic fun_arithm - { - LPRDOPMDWatchValue pWatchValue = CONVERTER->stack().pop($1); - ASSERT(pWatchValue); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pArithm); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pWatchValue->setLogic(pLogic, pArithm); - $$ = CONVERTER->stack().push(pWatchValue); - } - | pmd_result_watch_value_begin RDO_NoCheck fun_arithm - { - LPRDOPMDWatchValue pWatchValue = CONVERTER->stack().pop($1); - ASSERT(pWatchValue); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pArithm); - pWatchValue->setLogicNoCheck(pArithm); - $$ = CONVERTER->stack().push(pWatchValue); - } - | pmd_result_watch_value_begin fun_logic error - { - CONVERTER->error().error(@2, @3, "После логического ожидается арифметическое выражение"); - } - | pmd_result_watch_value_begin RDO_NoCheck error - { - CONVERTER->error().error(@2, @3, "После логического ожидается арифметическое выражение"); - } - | pmd_result_watch_value_begin error - { - CONVERTER->error().error(@1, @2, "После имени типа ожидается логическое выражение"); - } - | RDO_IDENTIF_COLON pmd_trace RDO_watch_value error - { - CONVERTER->error().error(@3, @4, "После ключевого слова watch_value ожидается тип ресурса"); - } - | RDO_IDENTIF_COLON RDO_get_value fun_arithm - { - LPRDOPMDResult pResult = rdo::Factory::create(CONVERTER->stack().pop($1)->src_info(), CONVERTER->stack().pop($3)); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | RDO_IDENTIF_COLON RDO_get_value error - { - CONVERTER->error().error(@2, @3, "После ключевого слова get_value ожидается арифметическое выражение"); - } - ; + : RDO_IDENTIF_COLON pmd_trace RDO_watch_par RDO_IDENTIF '.' RDO_IDENTIF + { + LPRDOPMDResult pResult = rdo::Factory::create(CONVERTER->stack().pop($1)->src_info(), $2 != 0, CONVERTER->stack().pop($4)->src_info(), CONVERTER->stack().pop($6)->src_info()); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | RDO_IDENTIF_COLON pmd_trace RDO_watch_par RDO_IDENTIF '.' error + { + CONVERTER->error().error(@5, @6, "Ожидается имя параметра"); + } + | RDO_IDENTIF_COLON pmd_trace RDO_watch_par RDO_IDENTIF error + { + CONVERTER->error().error(@4, "Ожидается '.'"); + } + | RDO_IDENTIF_COLON pmd_trace RDO_watch_par error + { + CONVERTER->error().error(@3, @4, "После ключевого слова watch_par ожидается имя ресурса"); + } + | RDO_IDENTIF_COLON pmd_trace error + { + CONVERTER->error().error(@2, @3, "Ожидается тип показателя"); + } + | RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@1, @2, "Ожидается признак трассировки или тип показателя"); + } + | RDO_IDENTIF error + { + CONVERTER->error().error(@1, @2, "Ожидается ':'"); + } + | error + { + CONVERTER->error().error(@1, "Ожидается имя показателя"); + } + | RDO_IDENTIF_COLON pmd_trace RDO_watch_state fun_logic + { + LPRDOPMDResult pResult = rdo::Factory::create(CONVERTER->stack().pop($1)->src_info(), $2 != 0, CONVERTER->stack().pop($4)); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | RDO_IDENTIF_COLON pmd_trace RDO_watch_state error + { + CONVERTER->error().error(@3, @4, "После ключевого слова watch_state ожидается логическое выражение"); + } + | pmd_result_watch_quant_begin fun_logic + { + LPRDOPMDWatchQuant pWatchQuant = CONVERTER->stack().pop($1); + ASSERT(pWatchQuant); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pWatchQuant->setLogic(pLogic); + $$ = CONVERTER->stack().push(pWatchQuant); + } + | pmd_result_watch_quant_begin RDO_NoCheck + { + LPRDOPMDWatchQuant pWatchQuant = CONVERTER->stack().pop($1); + ASSERT(pWatchQuant); + pWatchQuant->setLogicNoCheck(); + $$ = CONVERTER->stack().push(pWatchQuant); + } + | pmd_result_watch_quant_begin error + { + CONVERTER->error().error(@1, @2, "После имени типа ожидается логическое выражение"); + } + | RDO_IDENTIF_COLON pmd_trace RDO_watch_quant error + { + CONVERTER->error().error(@3, @4, "После ключевого слова watch_quant ожидается тип ресурса"); + } + | pmd_result_watch_value_begin fun_logic fun_arithm + { + LPRDOPMDWatchValue pWatchValue = CONVERTER->stack().pop($1); + ASSERT(pWatchValue); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pArithm); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pWatchValue->setLogic(pLogic, pArithm); + $$ = CONVERTER->stack().push(pWatchValue); + } + | pmd_result_watch_value_begin RDO_NoCheck fun_arithm + { + LPRDOPMDWatchValue pWatchValue = CONVERTER->stack().pop($1); + ASSERT(pWatchValue); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pArithm); + pWatchValue->setLogicNoCheck(pArithm); + $$ = CONVERTER->stack().push(pWatchValue); + } + | pmd_result_watch_value_begin fun_logic error + { + CONVERTER->error().error(@2, @3, "После логического ожидается арифметическое выражение"); + } + | pmd_result_watch_value_begin RDO_NoCheck error + { + CONVERTER->error().error(@2, @3, "После логического ожидается арифметическое выражение"); + } + | pmd_result_watch_value_begin error + { + CONVERTER->error().error(@1, @2, "После имени типа ожидается логическое выражение"); + } + | RDO_IDENTIF_COLON pmd_trace RDO_watch_value error + { + CONVERTER->error().error(@3, @4, "После ключевого слова watch_value ожидается тип ресурса"); + } + | RDO_IDENTIF_COLON RDO_get_value fun_arithm + { + LPRDOPMDResult pResult = rdo::Factory::create(CONVERTER->stack().pop($1)->src_info(), CONVERTER->stack().pop($3)); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | RDO_IDENTIF_COLON RDO_get_value error + { + CONVERTER->error().error(@2, @3, "После ключевого слова get_value ожидается арифметическое выражение"); + } + ; pmd_end - : RDO_Results pmd_body RDO_End - | error - { - YYLTYPE pos( @1 ); - pos.m_last_line = pos.m_first_line; - pos.m_last_pos = pos.m_first_pos; - pos.m_last_seek = pos.m_first_seek; - CONVERTER->error().error(pos, "Ожидается ключевое слово $Results"); - } - | RDO_Results pmd_body error - { - CONVERTER->error().error(@3, "Ожидается ключевое слово $End"); - } - ; + : RDO_Results pmd_body RDO_End + | error + { + YYLTYPE pos( @1 ); + pos.m_last_line = pos.m_first_line; + pos.m_last_pos = pos.m_first_pos; + pos.m_last_seek = pos.m_first_seek; + CONVERTER->error().error(pos, "Ожидается ключевое слово $Results"); + } + | RDO_Results pmd_body error + { + CONVERTER->error().error(@3, "Ожидается ключевое слово $End"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Общие составные токены для всех объектов РДО @@ -397,488 +387,488 @@ pmd_end // -------------------- Логические выражения // -------------------------------------------------------------------------------- fun_logic_eq - : '=' - { - LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); - ASSERT(pInsert); - CONVERTER->insertDocUpdate(pInsert); - - $$ = RDO_eq; - } - | RDO_eq - { - $$ = RDO_eq; - } - ; + : '=' + { + LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); + ASSERT(pInsert); + CONVERTER->insertDocUpdate(pInsert); + + $$ = RDO_eq; + } + | RDO_eq + { + $$ = RDO_eq; + } + ; fun_logic - : fun_arithm fun_logic_eq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_neq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '<' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '>' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_leq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_geq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_and fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_or fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pArithm); - LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_group - | fun_select_logic - | '[' fun_logic ']' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("[" + pLogic->src_text() + "]"); - $$ = CONVERTER->stack().push(pLogic); - } - | '(' fun_logic ')' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("(" + pLogic->src_text() + ")"); - $$ = CONVERTER->stack().push(pLogic); - } - | RDO_not fun_logic - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - LPRDOFUNLogic pLogicNot = pLogic->operator_not(); - ASSERT(pLogicNot); - pLogicNot->setSrcPos (@1, @2); - pLogicNot->setSrcText("not " + pLogic->src_text()); - $$ = CONVERTER->stack().push(pLogicNot); - } - | '[' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | '(' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - ; + : fun_arithm fun_logic_eq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_neq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '<' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '>' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_leq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_geq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_and fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_or fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pArithm); + LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_group + | fun_select_logic + | '[' fun_logic ']' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("[" + pLogic->src_text() + "]"); + $$ = CONVERTER->stack().push(pLogic); + } + | '(' fun_logic ')' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("(" + pLogic->src_text() + ")"); + $$ = CONVERTER->stack().push(pLogic); + } + | RDO_not fun_logic + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + LPRDOFUNLogic pLogicNot = pLogic->operator_not(); + ASSERT(pLogicNot); + pLogicNot->setSrcPos (@1, @2); + pLogicNot->setSrcText("not " + pLogic->src_text()); + $$ = CONVERTER->stack().push(pLogicNot); + } + | '[' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | '(' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Арифметические выражения // -------------------------------------------------------------------------------- fun_arithm - : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | fun_arithm '+' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '-' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '*' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '/' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm_func_call - | fun_select_arithm - | '(' fun_arithm ')' - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - pArithm->setSrcPos (@1, @3); - pArithm->setSrcText("(" + pArithm->src_text() + ")"); - $$ = CONVERTER->stack().push(pArithm); - } - | '-' fun_arithm %prec RDO_UMINUS - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - RDOParserSrcInfo info; - info.setSrcPos (@1, @2); - info.setSrcText("-" + pArithm->src_text()); - $$ = CONVERTER->stack().push( - rdo::Factory::create( - rdo::Factory::create(pArithm->type(), info), - rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() - ) - ); - } - ; + : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | fun_arithm '+' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '-' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '*' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '/' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm_func_call + | fun_select_arithm + | '(' fun_arithm ')' + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + pArithm->setSrcPos (@1, @3); + pArithm->setSrcText("(" + pArithm->src_text() + ")"); + $$ = CONVERTER->stack().push(pArithm); + } + | '-' fun_arithm %prec RDO_UMINUS + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + RDOParserSrcInfo info; + info.setSrcPos (@1, @2); + info.setSrcText("-" + pArithm->src_text()); + $$ = CONVERTER->stack().push( + rdo::Factory::create( + rdo::Factory::create(pArithm->type(), info), + rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() + ) + ); + } + ; // -------------------------------------------------------------------------------- // -------------------- Функции и последовательности // -------------------------------------------------------------------------------- fun_arithm_func_call - : RDO_IDENTIF '(' ')' - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @3); - pFunParams->setSrcText(funName + "()"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @4); - pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' error - { - CONVERTER->error().error(@3, "Ошибка в параметрах функции"); - } - ; + : RDO_IDENTIF '(' ')' + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @3); + pFunParams->setSrcText(funName + "()"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @4); + pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' error + { + CONVERTER->error().error(@3, "Ошибка в параметрах функции"); + } + ; fun_arithm_func_call_pars - : fun_arithm - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars ',' fun_arithm - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars error - { - CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); - } - | fun_arithm_func_call_pars ',' error - { - CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); - } - ; + : fun_arithm + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars ',' fun_arithm + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars error + { + CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); + } + | fun_arithm_func_call_pars ',' error + { + CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Групповые выражения // -------------------------------------------------------------------------------- fun_group_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_group_header - : fun_group_keyword '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - $$ = CONVERTER->stack().push(rdo::Factory::create((RDOFUNGroupLogic::FunGroupType)$1, pValue->src_info())); - } - | fun_group_keyword '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | fun_group_keyword error - { - CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); - } - ; + : fun_group_keyword '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + $$ = CONVERTER->stack().push(rdo::Factory::create(static_cast($1), pValue->src_info())); + } + | fun_group_keyword '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | fun_group_keyword error + { + CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); + } + ; fun_group - : fun_group_header fun_logic ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pGroupFun); - ASSERT(pLogic ); - pGroupFun->setSrcPos(@1, @3); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); - } - | fun_group_header RDO_NoCheck ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - ASSERT(pGroupFun); - pGroupFun->setSrcPos(@1, @3); - LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); - ASSERT(pTrueLogic); - pTrueLogic->setSrcPos (@2); - pTrueLogic->setSrcText("NoCheck"); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); - } - | fun_group_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_group_header fun_logic ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pGroupFun); + ASSERT(pLogic ); + pGroupFun->setSrcPos(@1, @3); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); + } + | fun_group_header RDO_NoCheck ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + ASSERT(pGroupFun); + pGroupFun->setSrcPos(@1, @3); + LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); + ASSERT(pTrueLogic); + pTrueLogic->setSrcPos (@2); + pTrueLogic->setSrcText("NoCheck"); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); + } + | fun_group_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Select // -------------------------------------------------------------------------------- fun_select_header - : RDO_Select '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); - ASSERT(pSelect); - pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); - $$ = CONVERTER->stack().push(pSelect); - } - | RDO_Select '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | RDO_Select error - { - CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); - } - ; + : RDO_Select '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); + ASSERT(pSelect); + pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); + $$ = CONVERTER->stack().push(pSelect); + } + | RDO_Select '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | RDO_Select error + { + CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); + } + ; fun_select_body - : fun_select_header fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header RDO_NoCheck ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - RDOParserSrcInfo logicInfo(@2, "NoCheck"); - pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); - rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); - ASSERT(pCalc); - LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); - ASSERT(pLogic); - pLogic->setSrcInfo(logicInfo); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_select_header fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header RDO_NoCheck ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + RDOParserSrcInfo logicInfo(@2, "NoCheck"); + pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); + rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); + ASSERT(pCalc); + LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); + ASSERT(pLogic); + pLogic->setSrcInfo(logicInfo); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; fun_select_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_select_logic - : fun_select_body '.' fun_select_keyword '(' fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcPos(@1, @6); - LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup((RDOFUNGroupLogic::FunGroupType)$3, pLogic); - ASSERT(pLogicSelect); - $$ = CONVERTER->stack().push(pLogicSelect); - } - | fun_select_body '.' fun_select_keyword '(' error - { - CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); - } - | fun_select_body '.' fun_select_keyword error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); - LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); - ASSERT(pLogic); - $$ = CONVERTER->stack().push(pLogic); - } - | fun_select_body '.' RDO_Empty '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' error - { - CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); - } - | fun_select_body error - { - CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); - } - ; + : fun_select_body '.' fun_select_keyword '(' fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcPos(@1, @6); + LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup(static_cast($3), pLogic); + ASSERT(pLogicSelect); + $$ = CONVERTER->stack().push(pLogicSelect); + } + | fun_select_body '.' fun_select_keyword '(' error + { + CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); + } + | fun_select_body '.' fun_select_keyword error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); + LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); + ASSERT(pLogic); + $$ = CONVERTER->stack().push(pLogic); + } + | fun_select_body '.' RDO_Empty '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' error + { + CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); + } + | fun_select_body error + { + CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); + } + ; fun_select_arithm - : fun_select_body '.' RDO_Size '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); - LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | fun_select_body '.' RDO_Size error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Size '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - ; + : fun_select_body '.' RDO_Size '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); + LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | fun_select_body '.' RDO_Size error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Size '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + ; %% diff --git a/converter/smr2rdox/grammar/rdoproc_opr.y b/converter/smr2rdox/grammar/rdoproc_opr.y index 698b8e28d..874d8e75b 100644 --- a/converter/smr2rdox/grammar/rdoproc_opr.y +++ b/converter/smr2rdox/grammar/rdoproc_opr.y @@ -1,13 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdoproc_opr.y - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \date - \brief - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -16,175 +6,175 @@ %pure-parser %param {void* lexer} -%token RDO_Resource_type 257 -%token RDO_permanent 258 -%token RDO_Parameters 259 -%token RDO_integer 260 -%token RDO_real 261 -%token RDO_End 262 -%token RDO_temporary 263 -%token RDO_IDENTIF 264 -%token RDO_INT_CONST 265 -%token RDO_REAL_CONST 266 -%token RDO_such_as 267 -%token RDO_dblpoint 268 -%token RDO_Resources 269 -%token RDO_trace 270 -%token RDO_no_trace 271 -%token RDO_IDENTIF_COLON 272 -%token RDO_Constant 273 -%token RDO_Body 274 -%token RDO_Function 275 -%token RDO_Type 276 -%token RDO_algorithmic 277 -%token RDO_table 278 -%token RDO_list 279 -%token RDO_Exist 281 -%token RDO_Not_Exist 282 -%token RDO_For_All 283 -%token RDO_Not_For_All 284 -%token RDO_neq 285 -%token RDO_leq 286 -%token RDO_geq 287 -%token RDO_NoCheck 288 -%token RDO_Calculate_if 289 -%token RDO_or 290 -%token RDO_and 291 -%token RDO_Sequence 292 -%token RDO_uniform 293 -%token RDO_exponential 294 -%token RDO_normal 295 -%token RDO_by_hist 296 -%token RDO_enumerative 297 - -%token RDO_Pattern 298 -%token RDO_operation 299 -%token RDO_irregular_event 300 -%token RDO_rule 301 -%token RDO_keyboard 302 -%token RDO_Relevant_resources 303 -%token RDO_Keep 304 -%token RDO_Create 305 -%token RDO_Erase 306 -%token RDO_NonExist 307 -%token RDO_IDENTIF_NoChange 308 -%token RDO_Time 309 -%token RDO_Choice 310 -%token RDO_from 311 -%token RDO_first 312 -%token RDO_Convert_begin 313 -%token RDO_Convert_end 314 -%token RDO_Convert_rule 315 -%token RDO_Convert_event 316 -%token RDO_with_max 317 -%token RDO_with_min 318 -%token RDO_set 319 -%token RDO_IDENTIF_NoChange_NoChange 320 -%token RDO_Operations 321 - -%token RDO_Results 322 -%token RDO_watch_par 323 -%token RDO_watch_state 324 -%token RDO_watch_quant 325 -%token RDO_watch_value 326 -%token RDO_get_value 327 - -%token RDO_Model_name 328 -%token RDO_Resource_file 329 -%token RDO_OprIev_file 330 -%token RDO_Frame_file 331 -%token RDO_Statistic_file 332 -%token RDO_Results_file 333 -%token RDO_Trace_file 334 -%token RDO_Show_mode 335 -%token RDO_Frame_number 336 -%token RDO_Show_rate 337 -%token RDO_Run_StartTime 338 -%token RDO_Trace_StartTime 339 -%token RDO_Trace_EndTime 340 -%token RDO_Terminate_if 341 -%token RDO_Break_point 342 -%token RDO_Seed 343 -%token RDO_NoShow 344 -%token RDO_Monitor 345 -%token RDO_Animation 346 -%token RDO_NoChange 347 - -%token RDO_Decision_point 348 -%token RDO_search 349 -%token RDO_trace_stat 350 -%token RDO_trace_tops 351 -%token RDO_trace_all 352 -%token RDO_Condition 353 -%token RDO_Term_condition 354 -%token RDO_Evaluate_by 355 -%token RDO_Compare_tops 356 -%token RDO_NO 357 -%token RDO_YES 358 -%token RDO_Activities 359 -%token RDO_value_before 360 -%token RDO_value_after 361 -%token RDO_some 362 -%token RDO_Process 363 -%token RDO_SEIZE 364 -%token RDO_GENERATE 365 -%token RDO_TERMINATE 366 -%token RDO_ADVANCE 367 -%token RDO_RELEASE 368 -%token RDO_if 369 -%token RDO_CF 370 -%token RDO_Priority 371 -%token RDO_prior 372 -%token RDO_Parent 373 - -%token RDO_Frame 400 -%token RDO_Show_if 401 -%token RDO_Back_picture 402 -%token RDO_Show 403 -%token RDO_frm_cell 404 -%token RDO_text 405 -%token RDO_bitmap 406 -%token RDO_s_bmp 407 -%token RDO_rect 408 -%token RDO_r_rect 409 -%token RDO_line 410 -%token RDO_ellipse 411 -%token RDO_triang 412 -%token RDO_active 413 -%token RDO_ruler 414 -%token RDO_space 415 -%token RDO_color_transparent 416 -%token RDO_color_last 417 -%token RDO_color_white 418 -%token RDO_color_black 419 -%token RDO_color_red 420 -%token RDO_color_green 421 -%token RDO_color_blue 422 -%token RDO_color_cyan 423 -%token RDO_color_magenta 424 -%token RDO_color_yellow 425 -%token RDO_color_gray 426 - -%token RDO_IDENTIF_RELRES 427 -%token RDO_typedef 428 -%token RDO_enum 429 - -%token RDO_STRING_CONST 430 -%token RDO_Select 431 -%token RDO_Size 432 -%token RDO_Empty 433 -%token RDO_not 434 -%token RDO_UMINUS 435 -%token RDO_string 436 -%token RDO_bool 437 -%token RDO_BOOL_CONST 438 -%token RDO_Fuzzy 439 -%token RDO_Fuzzy_Term 440 -%token RDO_eq 441 -%token RDO_External_Model 442 -%token RDO_QUEUE 443 -%token RDO_DEPART 444 -%token RDO_ASSIGN 445 +%token RDO_Resource_type 257 +%token RDO_permanent 258 +%token RDO_Parameters 259 +%token RDO_integer 260 +%token RDO_real 261 +%token RDO_End 262 +%token RDO_temporary 263 +%token RDO_IDENTIF 264 +%token RDO_INT_CONST 265 +%token RDO_REAL_CONST 266 +%token RDO_such_as 267 +%token RDO_dblpoint 268 +%token RDO_Resources 269 +%token RDO_trace 270 +%token RDO_no_trace 271 +%token RDO_IDENTIF_COLON 272 +%token RDO_Constant 273 +%token RDO_Body 274 +%token RDO_Function 275 +%token RDO_Type 276 +%token RDO_algorithmic 277 +%token RDO_table 278 +%token RDO_list 279 +%token RDO_Exist 281 +%token RDO_Not_Exist 282 +%token RDO_For_All 283 +%token RDO_Not_For_All 284 +%token RDO_neq 285 +%token RDO_leq 286 +%token RDO_geq 287 +%token RDO_NoCheck 288 +%token RDO_Calculate_if 289 +%token RDO_or 290 +%token RDO_and 291 +%token RDO_Sequence 292 +%token RDO_uniform 293 +%token RDO_exponential 294 +%token RDO_normal 295 +%token RDO_by_hist 296 +%token RDO_enumerative 297 + +%token RDO_Pattern 298 +%token RDO_operation 299 +%token RDO_irregular_event 300 +%token RDO_rule 301 +%token RDO_keyboard 302 +%token RDO_Relevant_resources 303 +%token RDO_Keep 304 +%token RDO_Create 305 +%token RDO_Erase 306 +%token RDO_NonExist 307 +%token RDO_IDENTIF_NoChange 308 +%token RDO_Time 309 +%token RDO_Choice 310 +%token RDO_from 311 +%token RDO_first 312 +%token RDO_Convert_begin 313 +%token RDO_Convert_end 314 +%token RDO_Convert_rule 315 +%token RDO_Convert_event 316 +%token RDO_with_max 317 +%token RDO_with_min 318 +%token RDO_set 319 +%token RDO_IDENTIF_NoChange_NoChange 320 +%token RDO_Operations 321 + +%token RDO_Results 322 +%token RDO_watch_par 323 +%token RDO_watch_state 324 +%token RDO_watch_quant 325 +%token RDO_watch_value 326 +%token RDO_get_value 327 + +%token RDO_Model_name 328 +%token RDO_Resource_file 329 +%token RDO_OprIev_file 330 +%token RDO_Frame_file 331 +%token RDO_Statistic_file 332 +%token RDO_Results_file 333 +%token RDO_Trace_file 334 +%token RDO_Show_mode 335 +%token RDO_Frame_number 336 +%token RDO_Show_rate 337 +%token RDO_Run_StartTime 338 +%token RDO_Trace_StartTime 339 +%token RDO_Trace_EndTime 340 +%token RDO_Terminate_if 341 +%token RDO_Break_point 342 +%token RDO_Seed 343 +%token RDO_NoShow 344 +%token RDO_Monitor 345 +%token RDO_Animation 346 +%token RDO_NoChange 347 + +%token RDO_Decision_point 348 +%token RDO_search 349 +%token RDO_trace_stat 350 +%token RDO_trace_tops 351 +%token RDO_trace_all 352 +%token RDO_Condition 353 +%token RDO_Term_condition 354 +%token RDO_Evaluate_by 355 +%token RDO_Compare_tops 356 +%token RDO_NO 357 +%token RDO_YES 358 +%token RDO_Activities 359 +%token RDO_value_before 360 +%token RDO_value_after 361 +%token RDO_some 362 +%token RDO_Process 363 +%token RDO_SEIZE 364 +%token RDO_GENERATE 365 +%token RDO_TERMINATE 366 +%token RDO_ADVANCE 367 +%token RDO_RELEASE 368 +%token RDO_if 369 +%token RDO_CF 370 +%token RDO_Priority 371 +%token RDO_prior 372 +%token RDO_Parent 373 + +%token RDO_Frame 400 +%token RDO_Show_if 401 +%token RDO_Back_picture 402 +%token RDO_Show 403 +%token RDO_frm_cell 404 +%token RDO_text 405 +%token RDO_bitmap 406 +%token RDO_s_bmp 407 +%token RDO_rect 408 +%token RDO_r_rect 409 +%token RDO_line 410 +%token RDO_ellipse 411 +%token RDO_triang 412 +%token RDO_active 413 +%token RDO_ruler 414 +%token RDO_space 415 +%token RDO_color_transparent 416 +%token RDO_color_last 417 +%token RDO_color_white 418 +%token RDO_color_black 419 +%token RDO_color_red 420 +%token RDO_color_green 421 +%token RDO_color_blue 422 +%token RDO_color_cyan 423 +%token RDO_color_magenta 424 +%token RDO_color_yellow 425 +%token RDO_color_gray 426 + +%token RDO_IDENTIF_RELRES 427 +%token RDO_typedef 428 +%token RDO_enum 429 + +%token RDO_STRING_CONST 430 +%token RDO_Select 431 +%token RDO_Size 432 +%token RDO_Empty 433 +%token RDO_not 434 +%token RDO_UMINUS 435 +%token RDO_string 436 +%token RDO_bool 437 +%token RDO_BOOL_CONST 438 +%token RDO_Fuzzy 439 +%token RDO_Fuzzy_Term 440 +%token RDO_eq 441 +%token RDO_External_Model 442 +%token RDO_QUEUE 443 +%token RDO_DEPART 444 +%token RDO_ASSIGN 445 %{ @@ -222,300 +212,300 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- General part // -------------------------------------------------------------------------------- dptrtp_main: - | dptrtp_main RDO_Decision_point error RDO_End /* заглушка для $Decision_point */ - | dptrtp_main RDO_Activities error RDO_End /* заглушка для $Activities */ - | dptrtp_main dpt_process_end - ; + | dptrtp_main RDO_Decision_point error RDO_End /* заглушка для $Decision_point */ + | dptrtp_main RDO_Activities error RDO_End /* заглушка для $Activities */ + | dptrtp_main dpt_process_end + ; // -------------------------------------------------------------------------------- // -------------------- Process // -------------------------------------------------------------------------------- dpt_process - : dpt_process_header dpt_process_input - ; + : dpt_process_header dpt_process_input + ; dpt_process_header - : dpt_process_begin dpt_process_condition dpt_process_prior - ; + : dpt_process_begin dpt_process_condition dpt_process_prior + ; dpt_process_begin - : RDO_Process - { - LPRDOPROCProcess pProcess = CONVERTER->getLastPROCProcess(); - if (pProcess && !pProcess->closed()) - { - CONVERTER->error().error(pProcess->src_info(), "Незакрыт предыдущий блок $Process"); - } - pProcess = rdo::Factory::create(RDOParserSrcInfo(@1, "Process")); - ASSERT(pProcess); - } - ; + : RDO_Process + { + LPRDOPROCProcess pProcess = CONVERTER->getLastPROCProcess(); + if (pProcess && !pProcess->closed()) + { + CONVERTER->error().error(pProcess->src_info(), "Незакрыт предыдущий блок $Process"); + } + pProcess = rdo::Factory::create(RDOParserSrcInfo(@1, "Process")); + ASSERT(pProcess); + } + ; dpt_process_condition - : /* empty */ - { - LPRDOPROCProcess pProcess = CONVERTER->getLastPROCProcess(); - ASSERT(pProcess); - pProcess->setCondition(); - } - | RDO_Condition fun_logic - { - LPRDOPROCProcess pProcess = CONVERTER->getLastPROCProcess(); - ASSERT(pProcess); - pProcess->setCondition(CONVERTER->stack().pop($2)); - } - | RDO_Condition RDO_NoCheck - { - LPRDOPROCProcess pProcess = CONVERTER->getLastPROCProcess(); - ASSERT(pProcess); - pProcess->setCondition(); - } - | RDO_Condition error - { - CONVERTER->error().error(@2, @2, "После ключевого слова $Condition ожидается условие активации процесса"); - } - | error - { - CONVERTER->error().error(@1, "Ожидается ключевое слово $Condition"); - } - ; + : /* empty */ + { + LPRDOPROCProcess pProcess = CONVERTER->getLastPROCProcess(); + ASSERT(pProcess); + pProcess->setCondition(); + } + | RDO_Condition fun_logic + { + LPRDOPROCProcess pProcess = CONVERTER->getLastPROCProcess(); + ASSERT(pProcess); + pProcess->setCondition(CONVERTER->stack().pop($2)); + } + | RDO_Condition RDO_NoCheck + { + LPRDOPROCProcess pProcess = CONVERTER->getLastPROCProcess(); + ASSERT(pProcess); + pProcess->setCondition(); + } + | RDO_Condition error + { + CONVERTER->error().error(@2, @2, "После ключевого слова $Condition ожидается условие активации процесса"); + } + | error + { + CONVERTER->error().error(@1, "Ожидается ключевое слово $Condition"); + } + ; dpt_process_prior - : /* empty */ - | RDO_Priority fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - if (!CONVERTER->getLastPROCProcess()->setPrior(pArithm)) - { - CONVERTER->error().error(@2, "Процесс пока не может иметь приоритет"); - } - } - | RDO_Priority error - { - CONVERTER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); - } - | error - { - CONVERTER->error().error(@1, @1, "Ожидается ключевое слово $Priority"); - } - ; + : /* empty */ + | RDO_Priority fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + if (!CONVERTER->getLastPROCProcess()->setPrior(pArithm)) + { + CONVERTER->error().error(@2, "Процесс пока не может иметь приоритет"); + } + } + | RDO_Priority error + { + CONVERTER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); + } + | error + { + CONVERTER->error().error(@1, @1, "Ожидается ключевое слово $Priority"); + } + ; dpt_process_input - : /* empty */ - | dpt_process_input dpt_process_line - ; + : /* empty */ + | dpt_process_input dpt_process_line + ; dpt_process_line - : RDO_IDENTIF - { - CONVERTER->error().error(@1, rdo::format("Неизвестный оператор '%s'", CONVERTER->stack().pop($1)->value().getIdentificator().c_str())); - } - | RDO_GENERATE fun_arithm - { - } - | RDO_GENERATE fun_arithm error - { - CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); - } - | RDO_TERMINATE dpt_term_param - { - LPRDOPROCOperator pBlock = CONVERTER->stack().pop($2); - ASSERT(pBlock); - $$ = CONVERTER->stack().push(pBlock); - } - | RDO_TERMINATE error - { - CONVERTER->error().error(@1, "Ошибка в параметре оператора TERMINATE"); - } - | RDO_ADVANCE fun_arithm - { - LPRDOPROCOperator pBlock = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "ADVANCE", CONVERTER->stack().pop($2)->createCalc()); - ASSERT(pBlock); - $$ = CONVERTER->stack().push(pBlock); - } - | RDO_ADVANCE fun_arithm error - { - CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); - } - | RDO_QUEUE dpt_queue_param - { - TRACE("QUEUE dpt_queue_param\n"); - LPRDOPROCQueue pQueue = CONVERTER->stack().pop($2); - ASSERT(pQueue); - pQueue->createRuntime(); - $$ = CONVERTER->stack().push(pQueue); - } - | RDO_QUEUE error - { - CONVERTER->error().error(@1, "Ожидается имя ресурса для сбора статистики по очереди"); - } - | RDO_DEPART dpt_depart_param - { - TRACE("DEPART dpt_depart_param\n"); - LPRDOPROCDepart pDepart = CONVERTER->stack().pop($2); - ASSERT(pDepart); - pDepart->createRuntime(); - $$ = CONVERTER->stack().push(pDepart); - } - | RDO_DEPART error - { - CONVERTER->error().error(@1, "Ожидается имя ресурса для сбора статистики по очереди"); - } - | RDO_SEIZE dpt_seize_param - { - TRACE("SEIZE dpt_seize_param\n"); - LPRDOPROCSeize pSeize = CONVERTER->stack().pop($2); - ASSERT(pSeize); - pSeize->createRuntime(); - $$ = CONVERTER->stack().push(pSeize); - } - | RDO_SEIZE error - { - CONVERTER->error().error(@1, rdo::format("Ожидается список ресурсов, объединяемых в блок, через запятую")); - } - | RDO_RELEASE dpt_release_param - { - TRACE("RELEASE dpt_release_param\n"); - LPRDOPROCRelease pRelease = CONVERTER->stack().pop($2); - ASSERT(pRelease); - pRelease->createRuntime(); - $$ = CONVERTER->stack().push(pRelease); - } - | RDO_RELEASE error - { - CONVERTER->error().error(@1, rdo::format("Ожидается список ресурсов, объединяемых в блок, через запятую")); - } - | RDO_ASSIGN dpt_assign_param - { - } - | RDO_ASSIGN error - { - CONVERTER->error().error(@1, rdo::format("Ожидается строка изменения параметра")); - } - ; + : RDO_IDENTIF + { + CONVERTER->error().error(@1, rdo::format("Неизвестный оператор '%s'", CONVERTER->stack().pop($1)->value().getIdentificator().c_str())); + } + | RDO_GENERATE fun_arithm + { + } + | RDO_GENERATE fun_arithm error + { + CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); + } + | RDO_TERMINATE dpt_term_param + { + LPRDOPROCOperator pBlock = CONVERTER->stack().pop($2); + ASSERT(pBlock); + $$ = CONVERTER->stack().push(pBlock); + } + | RDO_TERMINATE error + { + CONVERTER->error().error(@1, "Ошибка в параметре оператора TERMINATE"); + } + | RDO_ADVANCE fun_arithm + { + LPRDOPROCOperator pBlock = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "ADVANCE", CONVERTER->stack().pop($2)->createCalc()); + ASSERT(pBlock); + $$ = CONVERTER->stack().push(pBlock); + } + | RDO_ADVANCE fun_arithm error + { + CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); + } + | RDO_QUEUE dpt_queue_param + { + TRACE("QUEUE dpt_queue_param\n"); + LPRDOPROCQueue pQueue = CONVERTER->stack().pop($2); + ASSERT(pQueue); + pQueue->createRuntime(); + $$ = CONVERTER->stack().push(pQueue); + } + | RDO_QUEUE error + { + CONVERTER->error().error(@1, "Ожидается имя ресурса для сбора статистики по очереди"); + } + | RDO_DEPART dpt_depart_param + { + TRACE("DEPART dpt_depart_param\n"); + LPRDOPROCDepart pDepart = CONVERTER->stack().pop($2); + ASSERT(pDepart); + pDepart->createRuntime(); + $$ = CONVERTER->stack().push(pDepart); + } + | RDO_DEPART error + { + CONVERTER->error().error(@1, "Ожидается имя ресурса для сбора статистики по очереди"); + } + | RDO_SEIZE dpt_seize_param + { + TRACE("SEIZE dpt_seize_param\n"); + LPRDOPROCSeize pSeize = CONVERTER->stack().pop($2); + ASSERT(pSeize); + pSeize->createRuntime(); + $$ = CONVERTER->stack().push(pSeize); + } + | RDO_SEIZE error + { + CONVERTER->error().error(@1, rdo::format("Ожидается список ресурсов, объединяемых в блок, через запятую")); + } + | RDO_RELEASE dpt_release_param + { + TRACE("RELEASE dpt_release_param\n"); + LPRDOPROCRelease pRelease = CONVERTER->stack().pop($2); + ASSERT(pRelease); + pRelease->createRuntime(); + $$ = CONVERTER->stack().push(pRelease); + } + | RDO_RELEASE error + { + CONVERTER->error().error(@1, rdo::format("Ожидается список ресурсов, объединяемых в блок, через запятую")); + } + | RDO_ASSIGN dpt_assign_param + { + } + | RDO_ASSIGN error + { + CONVERTER->error().error(@1, rdo::format("Ожидается строка изменения параметра")); + } + ; dpt_queue_param - : RDO_IDENTIF - { - const std::string res_name = CONVERTER->stack().pop($1)->value().getIdentificator(); - TRACE1("%s _good\n", res_name.c_str()); - LPRDOPROCQueue pQueue = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "QUEUE"); - ASSERT(pQueue); - pQueue->setResource(res_name); - $$ = CONVERTER->stack().push(pQueue); - } - | RDO_IDENTIF error - { - CONVERTER->error().error(@1, "Ошибка в миени очереди"); - } - ; + : RDO_IDENTIF + { + const std::string res_name = CONVERTER->stack().pop($1)->value().getIdentificator(); + TRACE1("%s _good\n", res_name.c_str()); + LPRDOPROCQueue pQueue = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "QUEUE"); + ASSERT(pQueue); + pQueue->setResource(res_name); + $$ = CONVERTER->stack().push(pQueue); + } + | RDO_IDENTIF error + { + CONVERTER->error().error(@1, "Ошибка в миени очереди"); + } + ; dpt_depart_param - : RDO_IDENTIF - { - const std::string res_name = CONVERTER->stack().pop($1)->value().getIdentificator(); - TRACE1("%s _good\n", res_name.c_str()); - LPRDOPROCDepart pDepart = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "DEPART"); - ASSERT(pDepart); - pDepart->setResource(res_name); - $$ = CONVERTER->stack().push(pDepart); - } - | RDO_IDENTIF error - { - CONVERTER->error().error(@1, "Ошибка в имени ресурса"); - } - ; + : RDO_IDENTIF + { + const std::string res_name = CONVERTER->stack().pop($1)->value().getIdentificator(); + TRACE1("%s _good\n", res_name.c_str()); + LPRDOPROCDepart pDepart = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "DEPART"); + ASSERT(pDepart); + pDepart->setResource(res_name); + $$ = CONVERTER->stack().push(pDepart); + } + | RDO_IDENTIF error + { + CONVERTER->error().error(@1, "Ошибка в имени ресурса"); + } + ; dpt_term_param - : /* empty */ - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(rdo::runtime::RDOValue(0)); - LPRDOPROCOperator pBlock = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "TERMINATE", pCalc); - ASSERT(pBlock); - $$ = CONVERTER->stack().push(pBlock); - } - | fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pArithm); - //! @todo очень спорное решение узнать тип - if (pArithm->createCalc()->calcValue(RUNTIME).type()->typeID() == rdo::runtime::RDOType::t_int) - { - rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(NULL); - LPRDOPROCOperator pBlock = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "TERMINATE", pCalc); - ASSERT(pBlock); - $$ = CONVERTER->stack().push(pBlock); - } - else - { - CONVERTER->error().error(@1, "Ошибка, для оператора TERMINATE можно использовать только целое значение"); - } - } - | fun_arithm error - { - CONVERTER->error().error(@1, "Ошибка, после оператора TERMINATE может быть указано только одно целое положительное число"); - } - ; + : /* empty */ + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(rdo::runtime::RDOValue(0)); + LPRDOPROCOperator pBlock = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "TERMINATE", pCalc); + ASSERT(pBlock); + $$ = CONVERTER->stack().push(pBlock); + } + | fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pArithm); + // TODO очень спорное решение узнать тип + if (pArithm->createCalc()->calcValue(RUNTIME).type()->typeID() == rdo::runtime::RDOType::Type::INT) + { + rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(NULL); + LPRDOPROCOperator pBlock = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "TERMINATE", pCalc); + ASSERT(pBlock); + $$ = CONVERTER->stack().push(pBlock); + } + else + { + CONVERTER->error().error(@1, "Ошибка, для оператора TERMINATE можно использовать только целое значение"); + } + } + | fun_arithm error + { + CONVERTER->error().error(@1, "Ошибка, после оператора TERMINATE может быть указано только одно целое положительное число"); + } + ; dpt_seize_param - : RDO_IDENTIF - { - const std::string res_name = CONVERTER->stack().pop($1)->value().getIdentificator().c_str(); - LPRDOPROCSeize pSeize = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "SEIZE"); - ASSERT(pSeize); - pSeize->addResource(res_name); - $$ = CONVERTER->stack().push(pSeize); - } - | dpt_seize_param ',' RDO_IDENTIF - { - LPRDOPROCSeize pSeize = CONVERTER->stack().pop($1); - ASSERT(pSeize); - const std::string res_name = CONVERTER->stack().pop($3)->value().getIdentificator().c_str(); - pSeize->addResource(res_name); - $$ = CONVERTER->stack().push(pSeize); - } - | dpt_seize_param error - { - CONVERTER->error().error(@1, "Ошибка в имени ресурса"); - } - ; + : RDO_IDENTIF + { + const std::string res_name = CONVERTER->stack().pop($1)->value().getIdentificator().c_str(); + LPRDOPROCSeize pSeize = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "SEIZE"); + ASSERT(pSeize); + pSeize->addResource(res_name); + $$ = CONVERTER->stack().push(pSeize); + } + | dpt_seize_param ',' RDO_IDENTIF + { + LPRDOPROCSeize pSeize = CONVERTER->stack().pop($1); + ASSERT(pSeize); + const std::string res_name = CONVERTER->stack().pop($3)->value().getIdentificator().c_str(); + pSeize->addResource(res_name); + $$ = CONVERTER->stack().push(pSeize); + } + | dpt_seize_param error + { + CONVERTER->error().error(@1, "Ошибка в имени ресурса"); + } + ; dpt_release_param - : RDO_IDENTIF - { - const std::string res_name = CONVERTER->stack().pop($1)->value().getIdentificator().c_str(); - LPRDOPROCRelease pRelease = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "RELEASE"); - ASSERT(pRelease); - pRelease->addResource(res_name); - $$ = CONVERTER->stack().push(pRelease); - } - | dpt_release_param ',' RDO_IDENTIF - { - LPRDOPROCRelease pRelease = CONVERTER->stack().pop($1); - ASSERT(pRelease); - const std::string res_name = CONVERTER->stack().pop($3)->value().getIdentificator().c_str(); - pRelease->addResource(res_name); - $$ = CONVERTER->stack().push(pRelease); - } - | dpt_release_param error - { - CONVERTER->error().error(@1, "Ошибка в имени ресурса"); - } - ; + : RDO_IDENTIF + { + const std::string res_name = CONVERTER->stack().pop($1)->value().getIdentificator().c_str(); + LPRDOPROCRelease pRelease = rdo::Factory::create(CONVERTER->getLastPROCProcess(), "RELEASE"); + ASSERT(pRelease); + pRelease->addResource(res_name); + $$ = CONVERTER->stack().push(pRelease); + } + | dpt_release_param ',' RDO_IDENTIF + { + LPRDOPROCRelease pRelease = CONVERTER->stack().pop($1); + ASSERT(pRelease); + const std::string res_name = CONVERTER->stack().pop($3)->value().getIdentificator().c_str(); + pRelease->addResource(res_name); + $$ = CONVERTER->stack().push(pRelease); + } + | dpt_release_param error + { + CONVERTER->error().error(@1, "Ошибка в имени ресурса"); + } + ; dpt_assign_param - : RDO_IDENTIF '.' RDO_IDENTIF '=' fun_arithm - { - } - ; + : RDO_IDENTIF '.' RDO_IDENTIF '=' fun_arithm + { + } + ; dpt_process_end - : dpt_process RDO_End - { - CONVERTER->getLastPROCProcess()->end(); - } - ; + : dpt_process RDO_End + { + CONVERTER->getLastPROCProcess()->end(); + } + ; // -------------------------------------------------------------------------------- // -------------------- Общие составные токены для всех объектов РДО @@ -523,488 +513,488 @@ dpt_process_end // -------------------- Логические выражения // -------------------------------------------------------------------------------- fun_logic_eq - : '=' - { - LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); - ASSERT(pInsert); - CONVERTER->insertDocUpdate(pInsert); - - $$ = RDO_eq; - } - | RDO_eq - { - $$ = RDO_eq; - } - ; + : '=' + { + LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); + ASSERT(pInsert); + CONVERTER->insertDocUpdate(pInsert); + + $$ = RDO_eq; + } + | RDO_eq + { + $$ = RDO_eq; + } + ; fun_logic - : fun_arithm fun_logic_eq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_neq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '<' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '>' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_leq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_geq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_and fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_or fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pArithm); - LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_group - | fun_select_logic - | '[' fun_logic ']' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("[" + pLogic->src_text() + "]"); - $$ = CONVERTER->stack().push(pLogic); - } - | '(' fun_logic ')' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("(" + pLogic->src_text() + ")"); - $$ = CONVERTER->stack().push(pLogic); - } - | RDO_not fun_logic - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - LPRDOFUNLogic pLogicNot = pLogic->operator_not(); - ASSERT(pLogicNot); - pLogicNot->setSrcPos (@1, @2); - pLogicNot->setSrcText("not " + pLogic->src_text()); - $$ = CONVERTER->stack().push(pLogicNot); - } - | '[' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | '(' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - ; + : fun_arithm fun_logic_eq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_neq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '<' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '>' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_leq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_geq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_and fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_or fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pArithm); + LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_group + | fun_select_logic + | '[' fun_logic ']' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("[" + pLogic->src_text() + "]"); + $$ = CONVERTER->stack().push(pLogic); + } + | '(' fun_logic ')' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("(" + pLogic->src_text() + ")"); + $$ = CONVERTER->stack().push(pLogic); + } + | RDO_not fun_logic + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + LPRDOFUNLogic pLogicNot = pLogic->operator_not(); + ASSERT(pLogicNot); + pLogicNot->setSrcPos (@1, @2); + pLogicNot->setSrcText("not " + pLogic->src_text()); + $$ = CONVERTER->stack().push(pLogicNot); + } + | '[' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | '(' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Арифметические выражения // -------------------------------------------------------------------------------- fun_arithm - : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | fun_arithm '+' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '-' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '*' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '/' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm_func_call - | fun_select_arithm - | '(' fun_arithm ')' - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - pArithm->setSrcPos (@1, @3); - pArithm->setSrcText("(" + pArithm->src_text() + ")"); - $$ = CONVERTER->stack().push(pArithm); - } - | '-' fun_arithm %prec RDO_UMINUS - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - RDOParserSrcInfo info; - info.setSrcPos (@1, @2); - info.setSrcText("-" + pArithm->src_text()); - $$ = CONVERTER->stack().push( - rdo::Factory::create( - rdo::Factory::create(pArithm->type(), info), - rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() - ) - ); - } - ; + : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | fun_arithm '+' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '-' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '*' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '/' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm_func_call + | fun_select_arithm + | '(' fun_arithm ')' + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + pArithm->setSrcPos (@1, @3); + pArithm->setSrcText("(" + pArithm->src_text() + ")"); + $$ = CONVERTER->stack().push(pArithm); + } + | '-' fun_arithm %prec RDO_UMINUS + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + RDOParserSrcInfo info; + info.setSrcPos (@1, @2); + info.setSrcText("-" + pArithm->src_text()); + $$ = CONVERTER->stack().push( + rdo::Factory::create( + rdo::Factory::create(pArithm->type(), info), + rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() + ) + ); + } + ; // -------------------------------------------------------------------------------- // -------------------- Функции и последовательности // -------------------------------------------------------------------------------- fun_arithm_func_call - : RDO_IDENTIF '(' ')' - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @3); - pFunParams->setSrcText(funName + "()"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @4); - pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' error - { - CONVERTER->error().error(@3, "Ошибка в параметрах функции"); - } - ; + : RDO_IDENTIF '(' ')' + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @3); + pFunParams->setSrcText(funName + "()"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @4); + pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' error + { + CONVERTER->error().error(@3, "Ошибка в параметрах функции"); + } + ; fun_arithm_func_call_pars - : fun_arithm - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars ',' fun_arithm - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars error - { - CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); - } - | fun_arithm_func_call_pars ',' error - { - CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); - } - ; + : fun_arithm + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars ',' fun_arithm + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars error + { + CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); + } + | fun_arithm_func_call_pars ',' error + { + CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Групповые выражения // -------------------------------------------------------------------------------- fun_group_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_group_header - : fun_group_keyword '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - $$ = CONVERTER->stack().push(rdo::Factory::create((RDOFUNGroupLogic::FunGroupType)$1, pValue->src_info())); - } - | fun_group_keyword '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | fun_group_keyword error - { - CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); - } - ; + : fun_group_keyword '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + $$ = CONVERTER->stack().push(rdo::Factory::create(static_cast($1), pValue->src_info())); + } + | fun_group_keyword '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | fun_group_keyword error + { + CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); + } + ; fun_group - : fun_group_header fun_logic ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pGroupFun); - ASSERT(pLogic ); - pGroupFun->setSrcPos(@1, @3); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); - } - | fun_group_header RDO_NoCheck ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - ASSERT(pGroupFun); - pGroupFun->setSrcPos(@1, @3); - LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); - ASSERT(pTrueLogic); - pTrueLogic->setSrcPos (@2); - pTrueLogic->setSrcText("NoCheck"); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); - } - | fun_group_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_group_header fun_logic ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pGroupFun); + ASSERT(pLogic ); + pGroupFun->setSrcPos(@1, @3); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); + } + | fun_group_header RDO_NoCheck ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + ASSERT(pGroupFun); + pGroupFun->setSrcPos(@1, @3); + LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); + ASSERT(pTrueLogic); + pTrueLogic->setSrcPos (@2); + pTrueLogic->setSrcText("NoCheck"); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); + } + | fun_group_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Select // -------------------------------------------------------------------------------- fun_select_header - : RDO_Select '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); - ASSERT(pSelect); - pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); - $$ = CONVERTER->stack().push(pSelect); - } - | RDO_Select '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | RDO_Select error - { - CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); - } - ; + : RDO_Select '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); + ASSERT(pSelect); + pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); + $$ = CONVERTER->stack().push(pSelect); + } + | RDO_Select '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | RDO_Select error + { + CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); + } + ; fun_select_body - : fun_select_header fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header RDO_NoCheck ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - RDOParserSrcInfo logicInfo(@2, "NoCheck"); - pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); - rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); - ASSERT(pCalc); - LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); - ASSERT(pLogic); - pLogic->setSrcInfo(logicInfo); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_select_header fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header RDO_NoCheck ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + RDOParserSrcInfo logicInfo(@2, "NoCheck"); + pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); + rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); + ASSERT(pCalc); + LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); + ASSERT(pLogic); + pLogic->setSrcInfo(logicInfo); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; fun_select_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_select_logic - : fun_select_body '.' fun_select_keyword '(' fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcPos(@1, @6); - LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup((RDOFUNGroupLogic::FunGroupType)$3, pLogic); - ASSERT(pLogicSelect); - $$ = CONVERTER->stack().push(pLogicSelect); - } - | fun_select_body '.' fun_select_keyword '(' error - { - CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); - } - | fun_select_body '.' fun_select_keyword error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); - LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); - ASSERT(pLogic); - $$ = CONVERTER->stack().push(pLogic); - } - | fun_select_body '.' RDO_Empty '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' error - { - CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); - } - | fun_select_body error - { - CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); - } - ; + : fun_select_body '.' fun_select_keyword '(' fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcPos(@1, @6); + LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup(static_cast($3), pLogic); + ASSERT(pLogicSelect); + $$ = CONVERTER->stack().push(pLogicSelect); + } + | fun_select_body '.' fun_select_keyword '(' error + { + CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); + } + | fun_select_body '.' fun_select_keyword error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); + LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); + ASSERT(pLogic); + $$ = CONVERTER->stack().push(pLogic); + } + | fun_select_body '.' RDO_Empty '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' error + { + CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); + } + | fun_select_body error + { + CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); + } + ; fun_select_arithm - : fun_select_body '.' RDO_Size '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); - LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | fun_select_body '.' RDO_Size error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Size '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - ; + : fun_select_body '.' RDO_Size '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); + LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | fun_select_body '.' RDO_Size error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Size '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + ; %% diff --git a/converter/smr2rdox/grammar/rdoproc_rss.y b/converter/smr2rdox/grammar/rdoproc_rss.y index 56489c25e..e6cbcafb2 100644 --- a/converter/smr2rdox/grammar/rdoproc_rss.y +++ b/converter/smr2rdox/grammar/rdoproc_rss.y @@ -1,13 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdoproc_rss.y - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \date - \brief - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -16,175 +6,175 @@ %pure-parser %param {void* lexer} -%token RDO_Resource_type 257 -%token RDO_permanent 258 -%token RDO_Parameters 259 -%token RDO_integer 260 -%token RDO_real 261 -%token RDO_End 262 -%token RDO_temporary 263 -%token RDO_IDENTIF 264 -%token RDO_INT_CONST 265 -%token RDO_REAL_CONST 266 -%token RDO_such_as 267 -%token RDO_dblpoint 268 -%token RDO_Resources 269 -%token RDO_trace 270 -%token RDO_no_trace 271 -%token RDO_IDENTIF_COLON 272 -%token RDO_Constant 273 -%token RDO_Body 274 -%token RDO_Function 275 -%token RDO_Type 276 -%token RDO_algorithmic 277 -%token RDO_table 278 -%token RDO_list 279 -%token RDO_Exist 281 -%token RDO_Not_Exist 282 -%token RDO_For_All 283 -%token RDO_Not_For_All 284 -%token RDO_neq 285 -%token RDO_leq 286 -%token RDO_geq 287 -%token RDO_NoCheck 288 -%token RDO_Calculate_if 289 -%token RDO_or 290 -%token RDO_and 291 -%token RDO_Sequence 292 -%token RDO_uniform 293 -%token RDO_exponential 294 -%token RDO_normal 295 -%token RDO_by_hist 296 -%token RDO_enumerative 297 - -%token RDO_Pattern 298 -%token RDO_operation 299 -%token RDO_irregular_event 300 -%token RDO_rule 301 -%token RDO_keyboard 302 -%token RDO_Relevant_resources 303 -%token RDO_Keep 304 -%token RDO_Create 305 -%token RDO_Erase 306 -%token RDO_NonExist 307 -%token RDO_IDENTIF_NoChange 308 -%token RDO_Time 309 -%token RDO_Choice 310 -%token RDO_from 311 -%token RDO_first 312 -%token RDO_Convert_begin 313 -%token RDO_Convert_end 314 -%token RDO_Convert_rule 315 -%token RDO_Convert_event 316 -%token RDO_with_max 317 -%token RDO_with_min 318 -%token RDO_set 319 -%token RDO_IDENTIF_NoChange_NoChange 320 -%token RDO_Operations 321 - -%token RDO_Results 322 -%token RDO_watch_par 323 -%token RDO_watch_state 324 -%token RDO_watch_quant 325 -%token RDO_watch_value 326 -%token RDO_get_value 327 - -%token RDO_Model_name 328 -%token RDO_Resource_file 329 -%token RDO_OprIev_file 330 -%token RDO_Frame_file 331 -%token RDO_Statistic_file 332 -%token RDO_Results_file 333 -%token RDO_Trace_file 334 -%token RDO_Show_mode 335 -%token RDO_Frame_number 336 -%token RDO_Show_rate 337 -%token RDO_Run_StartTime 338 -%token RDO_Trace_StartTime 339 -%token RDO_Trace_EndTime 340 -%token RDO_Terminate_if 341 -%token RDO_Break_point 342 -%token RDO_Seed 343 -%token RDO_NoShow 344 -%token RDO_Monitor 345 -%token RDO_Animation 346 -%token RDO_NoChange 347 - -%token RDO_Decision_point 348 -%token RDO_search 349 -%token RDO_trace_stat 350 -%token RDO_trace_tops 351 -%token RDO_trace_all 352 -%token RDO_Condition 353 -%token RDO_Term_condition 354 -%token RDO_Evaluate_by 355 -%token RDO_Compare_tops 356 -%token RDO_NO 357 -%token RDO_YES 358 -%token RDO_Activities 359 -%token RDO_value_before 360 -%token RDO_value_after 361 -%token RDO_some 362 -%token RDO_Process 363 -%token RDO_SEIZE 364 -%token RDO_GENERATE 365 -%token RDO_TERMINATE 366 -%token RDO_ADVANCE 367 -%token RDO_RELEASE 368 -%token RDO_if 369 -%token RDO_CF 370 -%token RDO_Priority 371 -%token RDO_prior 372 -%token RDO_Parent 373 - -%token RDO_Frame 400 -%token RDO_Show_if 401 -%token RDO_Back_picture 402 -%token RDO_Show 403 -%token RDO_frm_cell 404 -%token RDO_text 405 -%token RDO_bitmap 406 -%token RDO_s_bmp 407 -%token RDO_rect 408 -%token RDO_r_rect 409 -%token RDO_line 410 -%token RDO_ellipse 411 -%token RDO_triang 412 -%token RDO_active 413 -%token RDO_ruler 414 -%token RDO_space 415 -%token RDO_color_transparent 416 -%token RDO_color_last 417 -%token RDO_color_white 418 -%token RDO_color_black 419 -%token RDO_color_red 420 -%token RDO_color_green 421 -%token RDO_color_blue 422 -%token RDO_color_cyan 423 -%token RDO_color_magenta 424 -%token RDO_color_yellow 425 -%token RDO_color_gray 426 - -%token RDO_IDENTIF_RELRES 427 -%token RDO_typedef 428 -%token RDO_enum 429 - -%token RDO_STRING_CONST 430 -%token RDO_Select 431 -%token RDO_Size 432 -%token RDO_Empty 433 -%token RDO_not 434 -%token RDO_UMINUS 435 -%token RDO_string 436 -%token RDO_bool 437 -%token RDO_BOOL_CONST 438 -%token RDO_Fuzzy 439 -%token RDO_Fuzzy_Term 440 -%token RDO_eq 441 -%token RDO_External_Model 442 -%token RDO_QUEUE 443 -%token RDO_DEPART 444 -%token RDO_ASSIGN 445 +%token RDO_Resource_type 257 +%token RDO_permanent 258 +%token RDO_Parameters 259 +%token RDO_integer 260 +%token RDO_real 261 +%token RDO_End 262 +%token RDO_temporary 263 +%token RDO_IDENTIF 264 +%token RDO_INT_CONST 265 +%token RDO_REAL_CONST 266 +%token RDO_such_as 267 +%token RDO_dblpoint 268 +%token RDO_Resources 269 +%token RDO_trace 270 +%token RDO_no_trace 271 +%token RDO_IDENTIF_COLON 272 +%token RDO_Constant 273 +%token RDO_Body 274 +%token RDO_Function 275 +%token RDO_Type 276 +%token RDO_algorithmic 277 +%token RDO_table 278 +%token RDO_list 279 +%token RDO_Exist 281 +%token RDO_Not_Exist 282 +%token RDO_For_All 283 +%token RDO_Not_For_All 284 +%token RDO_neq 285 +%token RDO_leq 286 +%token RDO_geq 287 +%token RDO_NoCheck 288 +%token RDO_Calculate_if 289 +%token RDO_or 290 +%token RDO_and 291 +%token RDO_Sequence 292 +%token RDO_uniform 293 +%token RDO_exponential 294 +%token RDO_normal 295 +%token RDO_by_hist 296 +%token RDO_enumerative 297 + +%token RDO_Pattern 298 +%token RDO_operation 299 +%token RDO_irregular_event 300 +%token RDO_rule 301 +%token RDO_keyboard 302 +%token RDO_Relevant_resources 303 +%token RDO_Keep 304 +%token RDO_Create 305 +%token RDO_Erase 306 +%token RDO_NonExist 307 +%token RDO_IDENTIF_NoChange 308 +%token RDO_Time 309 +%token RDO_Choice 310 +%token RDO_from 311 +%token RDO_first 312 +%token RDO_Convert_begin 313 +%token RDO_Convert_end 314 +%token RDO_Convert_rule 315 +%token RDO_Convert_event 316 +%token RDO_with_max 317 +%token RDO_with_min 318 +%token RDO_set 319 +%token RDO_IDENTIF_NoChange_NoChange 320 +%token RDO_Operations 321 + +%token RDO_Results 322 +%token RDO_watch_par 323 +%token RDO_watch_state 324 +%token RDO_watch_quant 325 +%token RDO_watch_value 326 +%token RDO_get_value 327 + +%token RDO_Model_name 328 +%token RDO_Resource_file 329 +%token RDO_OprIev_file 330 +%token RDO_Frame_file 331 +%token RDO_Statistic_file 332 +%token RDO_Results_file 333 +%token RDO_Trace_file 334 +%token RDO_Show_mode 335 +%token RDO_Frame_number 336 +%token RDO_Show_rate 337 +%token RDO_Run_StartTime 338 +%token RDO_Trace_StartTime 339 +%token RDO_Trace_EndTime 340 +%token RDO_Terminate_if 341 +%token RDO_Break_point 342 +%token RDO_Seed 343 +%token RDO_NoShow 344 +%token RDO_Monitor 345 +%token RDO_Animation 346 +%token RDO_NoChange 347 + +%token RDO_Decision_point 348 +%token RDO_search 349 +%token RDO_trace_stat 350 +%token RDO_trace_tops 351 +%token RDO_trace_all 352 +%token RDO_Condition 353 +%token RDO_Term_condition 354 +%token RDO_Evaluate_by 355 +%token RDO_Compare_tops 356 +%token RDO_NO 357 +%token RDO_YES 358 +%token RDO_Activities 359 +%token RDO_value_before 360 +%token RDO_value_after 361 +%token RDO_some 362 +%token RDO_Process 363 +%token RDO_SEIZE 364 +%token RDO_GENERATE 365 +%token RDO_TERMINATE 366 +%token RDO_ADVANCE 367 +%token RDO_RELEASE 368 +%token RDO_if 369 +%token RDO_CF 370 +%token RDO_Priority 371 +%token RDO_prior 372 +%token RDO_Parent 373 + +%token RDO_Frame 400 +%token RDO_Show_if 401 +%token RDO_Back_picture 402 +%token RDO_Show 403 +%token RDO_frm_cell 404 +%token RDO_text 405 +%token RDO_bitmap 406 +%token RDO_s_bmp 407 +%token RDO_rect 408 +%token RDO_r_rect 409 +%token RDO_line 410 +%token RDO_ellipse 411 +%token RDO_triang 412 +%token RDO_active 413 +%token RDO_ruler 414 +%token RDO_space 415 +%token RDO_color_transparent 416 +%token RDO_color_last 417 +%token RDO_color_white 418 +%token RDO_color_black 419 +%token RDO_color_red 420 +%token RDO_color_green 421 +%token RDO_color_blue 422 +%token RDO_color_cyan 423 +%token RDO_color_magenta 424 +%token RDO_color_yellow 425 +%token RDO_color_gray 426 + +%token RDO_IDENTIF_RELRES 427 +%token RDO_typedef 428 +%token RDO_enum 429 + +%token RDO_STRING_CONST 430 +%token RDO_Select 431 +%token RDO_Size 432 +%token RDO_Empty 433 +%token RDO_not 434 +%token RDO_UMINUS 435 +%token RDO_string 436 +%token RDO_bool 437 +%token RDO_BOOL_CONST 438 +%token RDO_Fuzzy 439 +%token RDO_Fuzzy_Term 440 +%token RDO_eq 441 +%token RDO_External_Model 442 +%token RDO_QUEUE 443 +%token RDO_DEPART 444 +%token RDO_ASSIGN 445 %{ @@ -224,119 +214,119 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- General part // -------------------------------------------------------------------------------- dptrtp_main: - | dptrtp_main RDO_Decision_point error RDO_End /* заглушка для $Decision_point */ - | dptrtp_main RDO_Activities error RDO_End /* заглушка для $Activities */ - | dptrtp_main dpt_process_end - ; + | dptrtp_main RDO_Decision_point error RDO_End /* заглушка для $Decision_point */ + | dptrtp_main RDO_Activities error RDO_End /* заглушка для $Activities */ + | dptrtp_main dpt_process_end + ; // -------------------------------------------------------------------------------- // -------------------- Process // -------------------------------------------------------------------------------- dpt_process - : dpt_process_header dpt_process_input - ; + : dpt_process_header dpt_process_input + ; dpt_process_header - : dpt_process_begin dpt_process_condition dpt_process_prior - ; + : dpt_process_begin dpt_process_condition dpt_process_prior + ; dpt_process_begin - : RDO_Process - ; + : RDO_Process + ; dpt_process_condition - : /* empty */ - | RDO_Condition error - ; + : /* empty */ + | RDO_Condition error + ; dpt_process_prior - : /* empty */ - | RDO_Priority error - ; + : /* empty */ + | RDO_Priority error + ; dpt_process_input - : /* empty */ - | dpt_process_input dpt_process_line - | dpt_process_input error dpt_process_line - ; + : /* empty */ + | dpt_process_input dpt_process_line + | dpt_process_input error dpt_process_line + ; dpt_process_line - : RDO_IDENTIF - | RDO_GENERATE - | RDO_TERMINATE - | RDO_ADVANCE - | RDO_ASSIGN - | RDO_QUEUE dpt_queue_param - | RDO_QUEUE error - { - CONVERTER->error().error(@1, rdo::format("Ожидается имя ресурса для сбора статистики по очереди")); - } - | RDO_DEPART dpt_depart_param - | RDO_DEPART error - { - CONVERTER->error().error(@1, rdo::format("Ожидается имя ресурса для сбора статистики по очереди")); - } - | RDO_SEIZE dpt_seize_param - | RDO_SEIZE error - { - CONVERTER->error().error(@1, rdo::format("Ожидается список ресурсов, объединяемых в блок, через запятую")); - } - | RDO_RELEASE dpt_release_param - | RDO_RELEASE error - { - CONVERTER->error().error(@1, rdo::format("Ожидается список ресурсов, объединяемых в блок, через запятую")); - } - ; + : RDO_IDENTIF + | RDO_GENERATE + | RDO_TERMINATE + | RDO_ADVANCE + | RDO_ASSIGN + | RDO_QUEUE dpt_queue_param + | RDO_QUEUE error + { + CONVERTER->error().error(@1, rdo::format("Ожидается имя ресурса для сбора статистики по очереди")); + } + | RDO_DEPART dpt_depart_param + | RDO_DEPART error + { + CONVERTER->error().error(@1, rdo::format("Ожидается имя ресурса для сбора статистики по очереди")); + } + | RDO_SEIZE dpt_seize_param + | RDO_SEIZE error + { + CONVERTER->error().error(@1, rdo::format("Ожидается список ресурсов, объединяемых в блок, через запятую")); + } + | RDO_RELEASE dpt_release_param + | RDO_RELEASE error + { + CONVERTER->error().error(@1, rdo::format("Ожидается список ресурсов, объединяемых в блок, через запятую")); + } + ; dpt_queue_param - : RDO_IDENTIF - { - } - | RDO_IDENTIF error - { - CONVERTER->error().error(@1, "Ошибка в имени ресурса"); - } - ; + : RDO_IDENTIF + { + } + | RDO_IDENTIF error + { + CONVERTER->error().error(@1, "Ошибка в имени ресурса"); + } + ; dpt_depart_param - : RDO_IDENTIF - { - } - | RDO_IDENTIF error - { - CONVERTER->error().error(@1, "Ошибка в имени ресурса"); - } - ; + : RDO_IDENTIF + { + } + | RDO_IDENTIF error + { + CONVERTER->error().error(@1, "Ошибка в имени ресурса"); + } + ; dpt_seize_param - : RDO_IDENTIF - { - } - | dpt_seize_param ',' RDO_IDENTIF - { - } - | dpt_seize_param error - { - CONVERTER->error().error(@1, "Ошибка в имени ресурса"); - } - ; + : RDO_IDENTIF + { + } + | dpt_seize_param ',' RDO_IDENTIF + { + } + | dpt_seize_param error + { + CONVERTER->error().error(@1, "Ошибка в имени ресурса"); + } + ; dpt_release_param - : RDO_IDENTIF - { - } - | dpt_release_param ',' RDO_IDENTIF - { - } - | dpt_release_param error - { - CONVERTER->error().error(@1, "Ошибка в имени ресурса"); - } - ; + : RDO_IDENTIF + { + } + | dpt_release_param ',' RDO_IDENTIF + { + } + | dpt_release_param error + { + CONVERTER->error().error(@1, "Ошибка в имени ресурса"); + } + ; dpt_process_end - : dpt_process RDO_End - ; + : dpt_process RDO_End + ; %% diff --git a/converter/smr2rdox/grammar/rdoproc_rtp.y b/converter/smr2rdox/grammar/rdoproc_rtp.y index 23298ce1c..857821afe 100644 --- a/converter/smr2rdox/grammar/rdoproc_rtp.y +++ b/converter/smr2rdox/grammar/rdoproc_rtp.y @@ -1,13 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdoproc_rtp.y - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \date - \brief - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -16,175 +6,175 @@ %pure-parser %param {void* lexer} -%token RDO_Resource_type 257 -%token RDO_permanent 258 -%token RDO_Parameters 259 -%token RDO_integer 260 -%token RDO_real 261 -%token RDO_End 262 -%token RDO_temporary 263 -%token RDO_IDENTIF 264 -%token RDO_INT_CONST 265 -%token RDO_REAL_CONST 266 -%token RDO_such_as 267 -%token RDO_dblpoint 268 -%token RDO_Resources 269 -%token RDO_trace 270 -%token RDO_no_trace 271 -%token RDO_IDENTIF_COLON 272 -%token RDO_Constant 273 -%token RDO_Body 274 -%token RDO_Function 275 -%token RDO_Type 276 -%token RDO_algorithmic 277 -%token RDO_table 278 -%token RDO_list 279 -%token RDO_Exist 281 -%token RDO_Not_Exist 282 -%token RDO_For_All 283 -%token RDO_Not_For_All 284 -%token RDO_neq 285 -%token RDO_leq 286 -%token RDO_geq 287 -%token RDO_NoCheck 288 -%token RDO_Calculate_if 289 -%token RDO_or 290 -%token RDO_and 291 -%token RDO_Sequence 292 -%token RDO_uniform 293 -%token RDO_exponential 294 -%token RDO_normal 295 -%token RDO_by_hist 296 -%token RDO_enumerative 297 - -%token RDO_Pattern 298 -%token RDO_operation 299 -%token RDO_irregular_event 300 -%token RDO_rule 301 -%token RDO_keyboard 302 -%token RDO_Relevant_resources 303 -%token RDO_Keep 304 -%token RDO_Create 305 -%token RDO_Erase 306 -%token RDO_NonExist 307 -%token RDO_IDENTIF_NoChange 308 -%token RDO_Time 309 -%token RDO_Choice 310 -%token RDO_from 311 -%token RDO_first 312 -%token RDO_Convert_begin 313 -%token RDO_Convert_end 314 -%token RDO_Convert_rule 315 -%token RDO_Convert_event 316 -%token RDO_with_max 317 -%token RDO_with_min 318 -%token RDO_set 319 -%token RDO_IDENTIF_NoChange_NoChange 320 -%token RDO_Operations 321 - -%token RDO_Results 322 -%token RDO_watch_par 323 -%token RDO_watch_state 324 -%token RDO_watch_quant 325 -%token RDO_watch_value 326 -%token RDO_get_value 327 - -%token RDO_Model_name 328 -%token RDO_Resource_file 329 -%token RDO_OprIev_file 330 -%token RDO_Frame_file 331 -%token RDO_Statistic_file 332 -%token RDO_Results_file 333 -%token RDO_Trace_file 334 -%token RDO_Show_mode 335 -%token RDO_Frame_number 336 -%token RDO_Show_rate 337 -%token RDO_Run_StartTime 338 -%token RDO_Trace_StartTime 339 -%token RDO_Trace_EndTime 340 -%token RDO_Terminate_if 341 -%token RDO_Break_point 342 -%token RDO_Seed 343 -%token RDO_NoShow 344 -%token RDO_Monitor 345 -%token RDO_Animation 346 -%token RDO_NoChange 347 - -%token RDO_Decision_point 348 -%token RDO_search 349 -%token RDO_trace_stat 350 -%token RDO_trace_tops 351 -%token RDO_trace_all 352 -%token RDO_Condition 353 -%token RDO_Term_condition 354 -%token RDO_Evaluate_by 355 -%token RDO_Compare_tops 356 -%token RDO_NO 357 -%token RDO_YES 358 -%token RDO_Activities 359 -%token RDO_value_before 360 -%token RDO_value_after 361 -%token RDO_some 362 -%token RDO_Process 363 -%token RDO_SEIZE 364 -%token RDO_GENERATE 365 -%token RDO_TERMINATE 366 -%token RDO_ADVANCE 367 -%token RDO_RELEASE 368 -%token RDO_if 369 -%token RDO_CF 370 -%token RDO_Priority 371 -%token RDO_prior 372 -%token RDO_Parent 373 - -%token RDO_Frame 400 -%token RDO_Show_if 401 -%token RDO_Back_picture 402 -%token RDO_Show 403 -%token RDO_frm_cell 404 -%token RDO_text 405 -%token RDO_bitmap 406 -%token RDO_s_bmp 407 -%token RDO_rect 408 -%token RDO_r_rect 409 -%token RDO_line 410 -%token RDO_ellipse 411 -%token RDO_triang 412 -%token RDO_active 413 -%token RDO_ruler 414 -%token RDO_space 415 -%token RDO_color_transparent 416 -%token RDO_color_last 417 -%token RDO_color_white 418 -%token RDO_color_black 419 -%token RDO_color_red 420 -%token RDO_color_green 421 -%token RDO_color_blue 422 -%token RDO_color_cyan 423 -%token RDO_color_magenta 424 -%token RDO_color_yellow 425 -%token RDO_color_gray 426 - -%token RDO_IDENTIF_RELRES 427 -%token RDO_typedef 428 -%token RDO_enum 429 - -%token RDO_STRING_CONST 430 -%token RDO_Select 431 -%token RDO_Size 432 -%token RDO_Empty 433 -%token RDO_not 434 -%token RDO_UMINUS 435 -%token RDO_string 436 -%token RDO_bool 437 -%token RDO_BOOL_CONST 438 -%token RDO_Fuzzy 439 -%token RDO_Fuzzy_Term 440 -%token RDO_eq 441 -%token RDO_External_Model 442 -%token RDO_QUEUE 443 -%token RDO_DEPART 444 -%token RDO_ASSIGN 445 +%token RDO_Resource_type 257 +%token RDO_permanent 258 +%token RDO_Parameters 259 +%token RDO_integer 260 +%token RDO_real 261 +%token RDO_End 262 +%token RDO_temporary 263 +%token RDO_IDENTIF 264 +%token RDO_INT_CONST 265 +%token RDO_REAL_CONST 266 +%token RDO_such_as 267 +%token RDO_dblpoint 268 +%token RDO_Resources 269 +%token RDO_trace 270 +%token RDO_no_trace 271 +%token RDO_IDENTIF_COLON 272 +%token RDO_Constant 273 +%token RDO_Body 274 +%token RDO_Function 275 +%token RDO_Type 276 +%token RDO_algorithmic 277 +%token RDO_table 278 +%token RDO_list 279 +%token RDO_Exist 281 +%token RDO_Not_Exist 282 +%token RDO_For_All 283 +%token RDO_Not_For_All 284 +%token RDO_neq 285 +%token RDO_leq 286 +%token RDO_geq 287 +%token RDO_NoCheck 288 +%token RDO_Calculate_if 289 +%token RDO_or 290 +%token RDO_and 291 +%token RDO_Sequence 292 +%token RDO_uniform 293 +%token RDO_exponential 294 +%token RDO_normal 295 +%token RDO_by_hist 296 +%token RDO_enumerative 297 + +%token RDO_Pattern 298 +%token RDO_operation 299 +%token RDO_irregular_event 300 +%token RDO_rule 301 +%token RDO_keyboard 302 +%token RDO_Relevant_resources 303 +%token RDO_Keep 304 +%token RDO_Create 305 +%token RDO_Erase 306 +%token RDO_NonExist 307 +%token RDO_IDENTIF_NoChange 308 +%token RDO_Time 309 +%token RDO_Choice 310 +%token RDO_from 311 +%token RDO_first 312 +%token RDO_Convert_begin 313 +%token RDO_Convert_end 314 +%token RDO_Convert_rule 315 +%token RDO_Convert_event 316 +%token RDO_with_max 317 +%token RDO_with_min 318 +%token RDO_set 319 +%token RDO_IDENTIF_NoChange_NoChange 320 +%token RDO_Operations 321 + +%token RDO_Results 322 +%token RDO_watch_par 323 +%token RDO_watch_state 324 +%token RDO_watch_quant 325 +%token RDO_watch_value 326 +%token RDO_get_value 327 + +%token RDO_Model_name 328 +%token RDO_Resource_file 329 +%token RDO_OprIev_file 330 +%token RDO_Frame_file 331 +%token RDO_Statistic_file 332 +%token RDO_Results_file 333 +%token RDO_Trace_file 334 +%token RDO_Show_mode 335 +%token RDO_Frame_number 336 +%token RDO_Show_rate 337 +%token RDO_Run_StartTime 338 +%token RDO_Trace_StartTime 339 +%token RDO_Trace_EndTime 340 +%token RDO_Terminate_if 341 +%token RDO_Break_point 342 +%token RDO_Seed 343 +%token RDO_NoShow 344 +%token RDO_Monitor 345 +%token RDO_Animation 346 +%token RDO_NoChange 347 + +%token RDO_Decision_point 348 +%token RDO_search 349 +%token RDO_trace_stat 350 +%token RDO_trace_tops 351 +%token RDO_trace_all 352 +%token RDO_Condition 353 +%token RDO_Term_condition 354 +%token RDO_Evaluate_by 355 +%token RDO_Compare_tops 356 +%token RDO_NO 357 +%token RDO_YES 358 +%token RDO_Activities 359 +%token RDO_value_before 360 +%token RDO_value_after 361 +%token RDO_some 362 +%token RDO_Process 363 +%token RDO_SEIZE 364 +%token RDO_GENERATE 365 +%token RDO_TERMINATE 366 +%token RDO_ADVANCE 367 +%token RDO_RELEASE 368 +%token RDO_if 369 +%token RDO_CF 370 +%token RDO_Priority 371 +%token RDO_prior 372 +%token RDO_Parent 373 + +%token RDO_Frame 400 +%token RDO_Show_if 401 +%token RDO_Back_picture 402 +%token RDO_Show 403 +%token RDO_frm_cell 404 +%token RDO_text 405 +%token RDO_bitmap 406 +%token RDO_s_bmp 407 +%token RDO_rect 408 +%token RDO_r_rect 409 +%token RDO_line 410 +%token RDO_ellipse 411 +%token RDO_triang 412 +%token RDO_active 413 +%token RDO_ruler 414 +%token RDO_space 415 +%token RDO_color_transparent 416 +%token RDO_color_last 417 +%token RDO_color_white 418 +%token RDO_color_black 419 +%token RDO_color_red 420 +%token RDO_color_green 421 +%token RDO_color_blue 422 +%token RDO_color_cyan 423 +%token RDO_color_magenta 424 +%token RDO_color_yellow 425 +%token RDO_color_gray 426 + +%token RDO_IDENTIF_RELRES 427 +%token RDO_typedef 428 +%token RDO_enum 429 + +%token RDO_STRING_CONST 430 +%token RDO_Select 431 +%token RDO_Size 432 +%token RDO_Empty 433 +%token RDO_not 434 +%token RDO_UMINUS 435 +%token RDO_string 436 +%token RDO_bool 437 +%token RDO_BOOL_CONST 438 +%token RDO_Fuzzy 439 +%token RDO_Fuzzy_Term 440 +%token RDO_eq 441 +%token RDO_External_Model 442 +%token RDO_QUEUE 443 +%token RDO_DEPART 444 +%token RDO_ASSIGN 445 %{ @@ -222,10 +212,10 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- General part // -------------------------------------------------------------------------------- dptrtp_main: - | dptrtp_main RDO_Decision_point error RDO_End {(void)(@1);} /* заглушка для $Decision_point */ - | dptrtp_main RDO_Activities error RDO_End /* заглушка для $Activities */ - | dptrtp_main RDO_Process error RDO_End /* заглушка для $Process */ - ; + | dptrtp_main RDO_Decision_point error RDO_End {(void)(@1);} /* заглушка для $Decision_point */ + | dptrtp_main RDO_Activities error RDO_End /* заглушка для $Activities */ + | dptrtp_main RDO_Process error RDO_End /* заглушка для $Process */ + ; // -------------------------------------------------------------------------------- // -------------------- Process diff --git a/converter/smr2rdox/grammar/rdorss.y b/converter/smr2rdox/grammar/rdorss.y index 5bc242c42..b78c8de2e 100644 --- a/converter/smr2rdox/grammar/rdorss.y +++ b/converter/smr2rdox/grammar/rdorss.y @@ -1,13 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdorss.y - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \date - \brief - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -16,175 +6,175 @@ %pure-parser %param {void* lexer} -%token RDO_Resource_type 257 -%token RDO_permanent 258 -%token RDO_Parameters 259 -%token RDO_integer 260 -%token RDO_real 261 -%token RDO_End 262 -%token RDO_temporary 263 -%token RDO_IDENTIF 264 -%token RDO_INT_CONST 265 -%token RDO_REAL_CONST 266 -%token RDO_such_as 267 -%token RDO_dblpoint 268 -%token RDO_Resources 269 -%token RDO_trace 270 -%token RDO_no_trace 271 -%token RDO_IDENTIF_COLON 272 -%token RDO_Constant 273 -%token RDO_Body 274 -%token RDO_Function 275 -%token RDO_Type 276 -%token RDO_algorithmic 277 -%token RDO_table 278 -%token RDO_list 279 -%token RDO_Exist 281 -%token RDO_Not_Exist 282 -%token RDO_For_All 283 -%token RDO_Not_For_All 284 -%token RDO_neq 285 -%token RDO_leq 286 -%token RDO_geq 287 -%token RDO_NoCheck 288 -%token RDO_Calculate_if 289 -%token RDO_or 290 -%token RDO_and 291 -%token RDO_Sequence 292 -%token RDO_uniform 293 -%token RDO_exponential 294 -%token RDO_normal 295 -%token RDO_by_hist 296 -%token RDO_enumerative 297 - -%token RDO_Pattern 298 -%token RDO_operation 299 -%token RDO_irregular_event 300 -%token RDO_rule 301 -%token RDO_keyboard 302 -%token RDO_Relevant_resources 303 -%token RDO_Keep 304 -%token RDO_Create 305 -%token RDO_Erase 306 -%token RDO_NonExist 307 -%token RDO_IDENTIF_NoChange 308 -%token RDO_Time 309 -%token RDO_Choice 310 -%token RDO_from 311 -%token RDO_first 312 -%token RDO_Convert_begin 313 -%token RDO_Convert_end 314 -%token RDO_Convert_rule 315 -%token RDO_Convert_event 316 -%token RDO_with_max 317 -%token RDO_with_min 318 -%token RDO_set 319 -%token RDO_IDENTIF_NoChange_NoChange 320 -%token RDO_Operations 321 - -%token RDO_Results 322 -%token RDO_watch_par 323 -%token RDO_watch_state 324 -%token RDO_watch_quant 325 -%token RDO_watch_value 326 -%token RDO_get_value 327 - -%token RDO_Model_name 328 -%token RDO_Resource_file 329 -%token RDO_OprIev_file 330 -%token RDO_Frame_file 331 -%token RDO_Statistic_file 332 -%token RDO_Results_file 333 -%token RDO_Trace_file 334 -%token RDO_Show_mode 335 -%token RDO_Frame_number 336 -%token RDO_Show_rate 337 -%token RDO_Run_StartTime 338 -%token RDO_Trace_StartTime 339 -%token RDO_Trace_EndTime 340 -%token RDO_Terminate_if 341 -%token RDO_Break_point 342 -%token RDO_Seed 343 -%token RDO_NoShow 344 -%token RDO_Monitor 345 -%token RDO_Animation 346 -%token RDO_NoChange 347 - -%token RDO_Decision_point 348 -%token RDO_search 349 -%token RDO_trace_stat 350 -%token RDO_trace_tops 351 -%token RDO_trace_all 352 -%token RDO_Condition 353 -%token RDO_Term_condition 354 -%token RDO_Evaluate_by 355 -%token RDO_Compare_tops 356 -%token RDO_NO 357 -%token RDO_YES 358 -%token RDO_Activities 359 -%token RDO_value_before 360 -%token RDO_value_after 361 -%token RDO_some 362 -%token RDO_Process 363 -%token RDO_SEIZE 364 -%token RDO_GENERATE 365 -%token RDO_TERMINATE 366 -%token RDO_ADVANCE 367 -%token RDO_RELEASE 368 -%token RDO_if 369 -%token RDO_CF 370 -%token RDO_Priority 371 -%token RDO_prior 372 -%token RDO_Parent 373 - -%token RDO_Frame 400 -%token RDO_Show_if 401 -%token RDO_Back_picture 402 -%token RDO_Show 403 -%token RDO_frm_cell 404 -%token RDO_text 405 -%token RDO_bitmap 406 -%token RDO_s_bmp 407 -%token RDO_rect 408 -%token RDO_r_rect 409 -%token RDO_line 410 -%token RDO_ellipse 411 -%token RDO_triang 412 -%token RDO_active 413 -%token RDO_ruler 414 -%token RDO_space 415 -%token RDO_color_transparent 416 -%token RDO_color_last 417 -%token RDO_color_white 418 -%token RDO_color_black 419 -%token RDO_color_red 420 -%token RDO_color_green 421 -%token RDO_color_blue 422 -%token RDO_color_cyan 423 -%token RDO_color_magenta 424 -%token RDO_color_yellow 425 -%token RDO_color_gray 426 - -%token RDO_IDENTIF_RELRES 427 -%token RDO_typedef 428 -%token RDO_enum 429 - -%token RDO_STRING_CONST 430 -%token RDO_Select 431 -%token RDO_Size 432 -%token RDO_Empty 433 -%token RDO_not 434 -%token RDO_UMINUS 435 -%token RDO_string 436 -%token RDO_bool 437 -%token RDO_BOOL_CONST 438 -%token RDO_Fuzzy 439 -%token RDO_Fuzzy_Term 440 -%token RDO_eq 441 -%token RDO_External_Model 442 -%token RDO_QUEUE 443 -%token RDO_DEPART 444 -%token RDO_ASSIGN 445 +%token RDO_Resource_type 257 +%token RDO_permanent 258 +%token RDO_Parameters 259 +%token RDO_integer 260 +%token RDO_real 261 +%token RDO_End 262 +%token RDO_temporary 263 +%token RDO_IDENTIF 264 +%token RDO_INT_CONST 265 +%token RDO_REAL_CONST 266 +%token RDO_such_as 267 +%token RDO_dblpoint 268 +%token RDO_Resources 269 +%token RDO_trace 270 +%token RDO_no_trace 271 +%token RDO_IDENTIF_COLON 272 +%token RDO_Constant 273 +%token RDO_Body 274 +%token RDO_Function 275 +%token RDO_Type 276 +%token RDO_algorithmic 277 +%token RDO_table 278 +%token RDO_list 279 +%token RDO_Exist 281 +%token RDO_Not_Exist 282 +%token RDO_For_All 283 +%token RDO_Not_For_All 284 +%token RDO_neq 285 +%token RDO_leq 286 +%token RDO_geq 287 +%token RDO_NoCheck 288 +%token RDO_Calculate_if 289 +%token RDO_or 290 +%token RDO_and 291 +%token RDO_Sequence 292 +%token RDO_uniform 293 +%token RDO_exponential 294 +%token RDO_normal 295 +%token RDO_by_hist 296 +%token RDO_enumerative 297 + +%token RDO_Pattern 298 +%token RDO_operation 299 +%token RDO_irregular_event 300 +%token RDO_rule 301 +%token RDO_keyboard 302 +%token RDO_Relevant_resources 303 +%token RDO_Keep 304 +%token RDO_Create 305 +%token RDO_Erase 306 +%token RDO_NonExist 307 +%token RDO_IDENTIF_NoChange 308 +%token RDO_Time 309 +%token RDO_Choice 310 +%token RDO_from 311 +%token RDO_first 312 +%token RDO_Convert_begin 313 +%token RDO_Convert_end 314 +%token RDO_Convert_rule 315 +%token RDO_Convert_event 316 +%token RDO_with_max 317 +%token RDO_with_min 318 +%token RDO_set 319 +%token RDO_IDENTIF_NoChange_NoChange 320 +%token RDO_Operations 321 + +%token RDO_Results 322 +%token RDO_watch_par 323 +%token RDO_watch_state 324 +%token RDO_watch_quant 325 +%token RDO_watch_value 326 +%token RDO_get_value 327 + +%token RDO_Model_name 328 +%token RDO_Resource_file 329 +%token RDO_OprIev_file 330 +%token RDO_Frame_file 331 +%token RDO_Statistic_file 332 +%token RDO_Results_file 333 +%token RDO_Trace_file 334 +%token RDO_Show_mode 335 +%token RDO_Frame_number 336 +%token RDO_Show_rate 337 +%token RDO_Run_StartTime 338 +%token RDO_Trace_StartTime 339 +%token RDO_Trace_EndTime 340 +%token RDO_Terminate_if 341 +%token RDO_Break_point 342 +%token RDO_Seed 343 +%token RDO_NoShow 344 +%token RDO_Monitor 345 +%token RDO_Animation 346 +%token RDO_NoChange 347 + +%token RDO_Decision_point 348 +%token RDO_search 349 +%token RDO_trace_stat 350 +%token RDO_trace_tops 351 +%token RDO_trace_all 352 +%token RDO_Condition 353 +%token RDO_Term_condition 354 +%token RDO_Evaluate_by 355 +%token RDO_Compare_tops 356 +%token RDO_NO 357 +%token RDO_YES 358 +%token RDO_Activities 359 +%token RDO_value_before 360 +%token RDO_value_after 361 +%token RDO_some 362 +%token RDO_Process 363 +%token RDO_SEIZE 364 +%token RDO_GENERATE 365 +%token RDO_TERMINATE 366 +%token RDO_ADVANCE 367 +%token RDO_RELEASE 368 +%token RDO_if 369 +%token RDO_CF 370 +%token RDO_Priority 371 +%token RDO_prior 372 +%token RDO_Parent 373 + +%token RDO_Frame 400 +%token RDO_Show_if 401 +%token RDO_Back_picture 402 +%token RDO_Show 403 +%token RDO_frm_cell 404 +%token RDO_text 405 +%token RDO_bitmap 406 +%token RDO_s_bmp 407 +%token RDO_rect 408 +%token RDO_r_rect 409 +%token RDO_line 410 +%token RDO_ellipse 411 +%token RDO_triang 412 +%token RDO_active 413 +%token RDO_ruler 414 +%token RDO_space 415 +%token RDO_color_transparent 416 +%token RDO_color_last 417 +%token RDO_color_white 418 +%token RDO_color_black 419 +%token RDO_color_red 420 +%token RDO_color_green 421 +%token RDO_color_blue 422 +%token RDO_color_cyan 423 +%token RDO_color_magenta 424 +%token RDO_color_yellow 425 +%token RDO_color_gray 426 + +%token RDO_IDENTIF_RELRES 427 +%token RDO_typedef 428 +%token RDO_enum 429 + +%token RDO_STRING_CONST 430 +%token RDO_Select 431 +%token RDO_Size 432 +%token RDO_Empty 433 +%token RDO_not 434 +%token RDO_UMINUS 435 +%token RDO_string 436 +%token RDO_bool 437 +%token RDO_BOOL_CONST 438 +%token RDO_Fuzzy 439 +%token RDO_Fuzzy_Term 440 +%token RDO_eq 441 +%token RDO_External_Model 442 +%token RDO_QUEUE 443 +%token RDO_DEPART 444 +%token RDO_ASSIGN 445 %{ @@ -213,195 +203,195 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE %% rss_main - : /* empty */ - | rss_resources_begin rss_resources rss_resources_end - | rss_resources_begin rss_resources - { - CONVERTER->error().error(@2, "После описания всех ресурсов ожидается ключевое слово $End"); - } - | error - { - if (!CONVERTER->isHaveKWResources()) - { - CONVERTER->error().error(@1, "Ожидается ключевое слово $Resources"); - } - else - { - if (CONVERTER->isHaveKWResourcesEnd()) - { - CONVERTER->error().error(@1, "Ресурсы уже определены"); - } - else - { - CONVERTER->error().error(@1, "Неизвестная ошибка"); - } - } - } - ; + : /* empty */ + | rss_resources_begin rss_resources rss_resources_end + | rss_resources_begin rss_resources + { + CONVERTER->error().error(@2, "После описания всех ресурсов ожидается ключевое слово $End"); + } + | error + { + if (!CONVERTER->isHaveKWResources()) + { + CONVERTER->error().error(@1, "Ожидается ключевое слово $Resources"); + } + else + { + if (CONVERTER->isHaveKWResourcesEnd()) + { + CONVERTER->error().error(@1, "Ресурсы уже определены"); + } + else + { + CONVERTER->error().error(@1, "Неизвестная ошибка"); + } + } + } + ; rss_resources_begin - : RDO_Resources - { - CONVERTER->setHaveKWResources(true); - } - ; + : RDO_Resources + { + CONVERTER->setHaveKWResources(true); + } + ; rss_resources_end - : RDO_End - { - CONVERTER->setHaveKWResourcesEnd(true); - } - ; + : RDO_End + { + CONVERTER->setHaveKWResourcesEnd(true); + } + ; rss_resources - : /* empty */ - | rss_resources rss_res_descr - ; + : /* empty */ + | rss_resources rss_res_descr + ; rss_res_descr - : rss_res_type rss_trace rss_values - { - LPRDORSSResource pResource = CONVERTER->stack().pop($1); - ASSERT(pResource); - if (!pResource->defined()) - { - CONVERTER->error().error(@3, rdo::format("Заданы не все параметры ресурса: %s", pResource->name().c_str())); - } - pResource->setTrace($2 == 1); - - if ($2 != 2) - { - LPDocUpdate pTraceDelete = rdo::Factory::create( - @2.m_first_seek, - @2.m_last_seek - ); - ASSERT(pTraceDelete); - CONVERTER->insertDocUpdate(pTraceDelete); - } - - LPDocUpdate pLeftParenInsert = rdo::Factory::create( - @3.m_first_seek, - "(" - ); - ASSERT(pLeftParenInsert); - CONVERTER->insertDocUpdate(pLeftParenInsert); - - LPDocUpdate pRightParenSemicolonInsert = rdo::Factory::create( - @3.m_last_seek, - ");" - ); - ASSERT(pRightParenSemicolonInsert); - CONVERTER->insertDocUpdate(pRightParenSemicolonInsert); - - switch ($2) - { - case 0: - { - LPDocUpdate pAddTrace = rdo::Factory::create( - @3.m_last_seek, - "\n\t" + pResource->name() + ".no_trace();" - ); - ASSERT(pAddTrace); - CONVERTER->insertDocUpdate(pAddTrace); - break; - } - case 1: - { - LPDocUpdate pAddTrace = rdo::Factory::create( - @3.m_last_seek, - "\n\t" + pResource->name() + ".trace();" - ); - ASSERT(pAddTrace); - CONVERTER->insertDocUpdate(pAddTrace); - break; - } - default: - break; - } - } - ; + : rss_res_type rss_trace rss_values + { + LPRDORSSResource pResource = CONVERTER->stack().pop($1); + ASSERT(pResource); + if (!pResource->defined()) + { + CONVERTER->error().error(@3, rdo::format("Заданы не все параметры ресурса: %s", pResource->name().c_str())); + } + pResource->setTrace($2 == 1); + + if ($2 != 2) + { + LPDocUpdate pTraceDelete = rdo::Factory::create( + @2.m_first_seek, + @2.m_last_seek + ); + ASSERT(pTraceDelete); + CONVERTER->insertDocUpdate(pTraceDelete); + } + + LPDocUpdate pLeftParenInsert = rdo::Factory::create( + @3.m_first_seek, + "(" + ); + ASSERT(pLeftParenInsert); + CONVERTER->insertDocUpdate(pLeftParenInsert); + + LPDocUpdate pRightParenSemicolonInsert = rdo::Factory::create( + @3.m_last_seek, + ");" + ); + ASSERT(pRightParenSemicolonInsert); + CONVERTER->insertDocUpdate(pRightParenSemicolonInsert); + + switch ($2) + { + case 0: + { + LPDocUpdate pAddTrace = rdo::Factory::create( + @3.m_last_seek, + "\n\t" + pResource->name() + ".no_trace();" + ); + ASSERT(pAddTrace); + CONVERTER->insertDocUpdate(pAddTrace); + break; + } + case 1: + { + LPDocUpdate pAddTrace = rdo::Factory::create( + @3.m_last_seek, + "\n\t" + pResource->name() + ".trace();" + ); + ASSERT(pAddTrace); + CONVERTER->insertDocUpdate(pAddTrace); + break; + } + default: + break; + } + } + ; rss_res_type - : RDO_IDENTIF_COLON RDO_IDENTIF - { - LPRDOValue pName = CONVERTER->stack().pop($1); - LPRDOValue pType = CONVERTER->stack().pop($2); - LPRDORTPResType pResType = CONVERTER->findRTPResType(pType->value().getIdentificator()); - if (!pResType) - { - CONVERTER->error().error(@2, rdo::format("Неизвестный тип ресурса: %s", pType->value().getIdentificator().c_str())); - } - LPRDORSSResource pResourceExist = CONVERTER->findRSSResource(pName->value().getIdentificator()); - if (pResourceExist) - { - CONVERTER->error().push_only(pName->src_info(), rdo::format("Ресурс '%s' уже существует", pName->value().getIdentificator().c_str())); - CONVERTER->error().push_only(pResourceExist->src_info(), "См. первое определение"); - CONVERTER->error().push_done(); - } - LPRDORSSResource pResource = rdo::Factory::create(CONVERTER, pName->src_info(), pResType); - - LPDocUpdate pColonReplace = rdo::Factory::create( - @1.m_last_seek - 1, - @1.m_last_seek, - " =" - ); - ASSERT(pColonReplace); - CONVERTER->insertDocUpdate(pColonReplace); - - $$ = CONVERTER->stack().push(pResource); - } - | RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@2, "Ожидается тип ресурса"); - } - | ':' - { - CONVERTER->error().error(@1, "Перед двоеточием ожидается имя ресурса"); - } - | error - { - CONVERTER->error().error(@1, "Ожидается имя ресурса"); - } - ; + : RDO_IDENTIF_COLON RDO_IDENTIF + { + LPRDOValue pName = CONVERTER->stack().pop($1); + LPRDOValue pType = CONVERTER->stack().pop($2); + LPRDORTPResType pResType = CONVERTER->findRTPResType(pType->value().getIdentificator()); + if (!pResType) + { + CONVERTER->error().error(@2, rdo::format("Неизвестный тип ресурса: %s", pType->value().getIdentificator().c_str())); + } + LPRDORSSResource pResourceExist = CONVERTER->findRSSResource(pName->value().getIdentificator()); + if (pResourceExist) + { + CONVERTER->error().push_only(pName->src_info(), rdo::format("Ресурс '%s' уже существует", pName->value().getIdentificator().c_str())); + CONVERTER->error().push_only(pResourceExist->src_info(), "См. первое определение"); + CONVERTER->error().push_done(); + } + LPRDORSSResource pResource = rdo::Factory::create(CONVERTER, pName->src_info(), pResType); + + LPDocUpdate pColonReplace = rdo::Factory::create( + @1.m_last_seek - 1, + @1.m_last_seek, + " =" + ); + ASSERT(pColonReplace); + CONVERTER->insertDocUpdate(pColonReplace); + + $$ = CONVERTER->stack().push(pResource); + } + | RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@2, "Ожидается тип ресурса"); + } + | ':' + { + CONVERTER->error().error(@1, "Перед двоеточием ожидается имя ресурса"); + } + | error + { + CONVERTER->error().error(@1, "Ожидается имя ресурса"); + } + ; rss_trace - : /* empty */ {$$ = 2;} - | RDO_trace {$$ = 1;} - | RDO_no_trace {$$ = 0;} - ; + : /* empty */ {$$ = 2;} + | RDO_trace {$$ = 1;} + | RDO_no_trace {$$ = 0;} + ; rss_values - : /* empty */ - { - $$ = 1; - } - | rss_values rss_value - { - if ($1 != 1) - { - LPDocUpdate pCommaInsert = rdo::Factory::create( - @1.m_last_seek, - "," - ); - ASSERT(pCommaInsert); - CONVERTER->insertDocUpdate(pCommaInsert); - } - $$ = 0; - } - ; + : /* empty */ + { + $$ = 1; + } + | rss_values rss_value + { + if ($1 != 1) + { + LPDocUpdate pCommaInsert = rdo::Factory::create( + @1.m_last_seek, + "," + ); + ASSERT(pCommaInsert); + CONVERTER->insertDocUpdate(pCommaInsert); + } + $$ = 0; + } + ; rss_value - : '*' {CONVERTER->getLastRSSResource()->addParam(rdo::Factory::create(RDOParserSrcInfo(@1, "*")));} - | RDO_INT_CONST {CONVERTER->getLastRSSResource()->addParam(CONVERTER->stack().pop($1));} - | RDO_REAL_CONST {CONVERTER->getLastRSSResource()->addParam(CONVERTER->stack().pop($1));} - | RDO_BOOL_CONST {CONVERTER->getLastRSSResource()->addParam(CONVERTER->stack().pop($1));} - | RDO_STRING_CONST {CONVERTER->getLastRSSResource()->addParam(CONVERTER->stack().pop($1));} - | RDO_IDENTIF {CONVERTER->getLastRSSResource()->addParam(CONVERTER->stack().pop($1));} - | error - { - CONVERTER->error().error(@1, rdo::format("Неправильное значение параметра: %s", LEXER->YYText())); - } - ; + : '*' {CONVERTER->getLastRSSResource()->addParam(rdo::Factory::create(RDOParserSrcInfo(@1, "*")));} + | RDO_INT_CONST {CONVERTER->getLastRSSResource()->addParam(CONVERTER->stack().pop($1));} + | RDO_REAL_CONST {CONVERTER->getLastRSSResource()->addParam(CONVERTER->stack().pop($1));} + | RDO_BOOL_CONST {CONVERTER->getLastRSSResource()->addParam(CONVERTER->stack().pop($1));} + | RDO_STRING_CONST {CONVERTER->getLastRSSResource()->addParam(CONVERTER->stack().pop($1));} + | RDO_IDENTIF {CONVERTER->getLastRSSResource()->addParam(CONVERTER->stack().pop($1));} + | error + { + CONVERTER->error().error(@1, rdo::format("Неправильное значение параметра: %s", LEXER->YYText())); + } + ; %% diff --git a/converter/smr2rdox/grammar/rdortp.y b/converter/smr2rdox/grammar/rdortp.y index d66b2fe12..e392de69c 100644 --- a/converter/smr2rdox/grammar/rdortp.y +++ b/converter/smr2rdox/grammar/rdortp.y @@ -1,13 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdortp.y - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \date - \brief - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -16,175 +6,175 @@ %pure-parser %param {void* lexer} -%token RDO_Resource_type 257 -%token RDO_permanent 258 -%token RDO_Parameters 259 -%token RDO_integer 260 -%token RDO_real 261 -%token RDO_End 262 -%token RDO_temporary 263 -%token RDO_IDENTIF 264 -%token RDO_INT_CONST 265 -%token RDO_REAL_CONST 266 -%token RDO_such_as 267 -%token RDO_dblpoint 268 -%token RDO_Resources 269 -%token RDO_trace 270 -%token RDO_no_trace 271 -%token RDO_IDENTIF_COLON 272 -%token RDO_Constant 273 -%token RDO_Body 274 -%token RDO_Function 275 -%token RDO_Type 276 -%token RDO_algorithmic 277 -%token RDO_table 278 -%token RDO_list 279 -%token RDO_Exist 281 -%token RDO_Not_Exist 282 -%token RDO_For_All 283 -%token RDO_Not_For_All 284 -%token RDO_neq 285 -%token RDO_leq 286 -%token RDO_geq 287 -%token RDO_NoCheck 288 -%token RDO_Calculate_if 289 -%token RDO_or 290 -%token RDO_and 291 -%token RDO_Sequence 292 -%token RDO_uniform 293 -%token RDO_exponential 294 -%token RDO_normal 295 -%token RDO_by_hist 296 -%token RDO_enumerative 297 - -%token RDO_Pattern 298 -%token RDO_operation 299 -%token RDO_irregular_event 300 -%token RDO_rule 301 -%token RDO_keyboard 302 -%token RDO_Relevant_resources 303 -%token RDO_Keep 304 -%token RDO_Create 305 -%token RDO_Erase 306 -%token RDO_NonExist 307 -%token RDO_IDENTIF_NoChange 308 -%token RDO_Time 309 -%token RDO_Choice 310 -%token RDO_from 311 -%token RDO_first 312 -%token RDO_Convert_begin 313 -%token RDO_Convert_end 314 -%token RDO_Convert_rule 315 -%token RDO_Convert_event 316 -%token RDO_with_max 317 -%token RDO_with_min 318 -%token RDO_set 319 -%token RDO_IDENTIF_NoChange_NoChange 320 -%token RDO_Operations 321 - -%token RDO_Results 322 -%token RDO_watch_par 323 -%token RDO_watch_state 324 -%token RDO_watch_quant 325 -%token RDO_watch_value 326 -%token RDO_get_value 327 - -%token RDO_Model_name 328 -%token RDO_Resource_file 329 -%token RDO_OprIev_file 330 -%token RDO_Frame_file 331 -%token RDO_Statistic_file 332 -%token RDO_Results_file 333 -%token RDO_Trace_file 334 -%token RDO_Show_mode 335 -%token RDO_Frame_number 336 -%token RDO_Show_rate 337 -%token RDO_Run_StartTime 338 -%token RDO_Trace_StartTime 339 -%token RDO_Trace_EndTime 340 -%token RDO_Terminate_if 341 -%token RDO_Break_point 342 -%token RDO_Seed 343 -%token RDO_NoShow 344 -%token RDO_Monitor 345 -%token RDO_Animation 346 -%token RDO_NoChange 347 - -%token RDO_Decision_point 348 -%token RDO_search 349 -%token RDO_trace_stat 350 -%token RDO_trace_tops 351 -%token RDO_trace_all 352 -%token RDO_Condition 353 -%token RDO_Term_condition 354 -%token RDO_Evaluate_by 355 -%token RDO_Compare_tops 356 -%token RDO_NO 357 -%token RDO_YES 358 -%token RDO_Activities 359 -%token RDO_value_before 360 -%token RDO_value_after 361 -%token RDO_some 362 -%token RDO_Process 363 -%token RDO_SEIZE 364 -%token RDO_GENERATE 365 -%token RDO_TERMINATE 366 -%token RDO_ADVANCE 367 -%token RDO_RELEASE 368 -%token RDO_if 369 -%token RDO_CF 370 -%token RDO_Priority 371 -%token RDO_prior 372 -%token RDO_Parent 373 - -%token RDO_Frame 400 -%token RDO_Show_if 401 -%token RDO_Back_picture 402 -%token RDO_Show 403 -%token RDO_frm_cell 404 -%token RDO_text 405 -%token RDO_bitmap 406 -%token RDO_s_bmp 407 -%token RDO_rect 408 -%token RDO_r_rect 409 -%token RDO_line 410 -%token RDO_ellipse 411 -%token RDO_triang 412 -%token RDO_active 413 -%token RDO_ruler 414 -%token RDO_space 415 -%token RDO_color_transparent 416 -%token RDO_color_last 417 -%token RDO_color_white 418 -%token RDO_color_black 419 -%token RDO_color_red 420 -%token RDO_color_green 421 -%token RDO_color_blue 422 -%token RDO_color_cyan 423 -%token RDO_color_magenta 424 -%token RDO_color_yellow 425 -%token RDO_color_gray 426 - -%token RDO_IDENTIF_RELRES 427 -%token RDO_typedef 428 -%token RDO_enum 429 - -%token RDO_STRING_CONST 430 -%token RDO_Select 431 -%token RDO_Size 432 -%token RDO_Empty 433 -%token RDO_not 434 -%token RDO_UMINUS 435 -%token RDO_string 436 -%token RDO_bool 437 -%token RDO_BOOL_CONST 438 -%token RDO_Fuzzy 439 -%token RDO_Fuzzy_Term 440 -%token RDO_eq 441 -%token RDO_External_Model 442 -%token RDO_QUEUE 443 -%token RDO_DEPART 444 -%token RDO_ASSIGN 445 +%token RDO_Resource_type 257 +%token RDO_permanent 258 +%token RDO_Parameters 259 +%token RDO_integer 260 +%token RDO_real 261 +%token RDO_End 262 +%token RDO_temporary 263 +%token RDO_IDENTIF 264 +%token RDO_INT_CONST 265 +%token RDO_REAL_CONST 266 +%token RDO_such_as 267 +%token RDO_dblpoint 268 +%token RDO_Resources 269 +%token RDO_trace 270 +%token RDO_no_trace 271 +%token RDO_IDENTIF_COLON 272 +%token RDO_Constant 273 +%token RDO_Body 274 +%token RDO_Function 275 +%token RDO_Type 276 +%token RDO_algorithmic 277 +%token RDO_table 278 +%token RDO_list 279 +%token RDO_Exist 281 +%token RDO_Not_Exist 282 +%token RDO_For_All 283 +%token RDO_Not_For_All 284 +%token RDO_neq 285 +%token RDO_leq 286 +%token RDO_geq 287 +%token RDO_NoCheck 288 +%token RDO_Calculate_if 289 +%token RDO_or 290 +%token RDO_and 291 +%token RDO_Sequence 292 +%token RDO_uniform 293 +%token RDO_exponential 294 +%token RDO_normal 295 +%token RDO_by_hist 296 +%token RDO_enumerative 297 + +%token RDO_Pattern 298 +%token RDO_operation 299 +%token RDO_irregular_event 300 +%token RDO_rule 301 +%token RDO_keyboard 302 +%token RDO_Relevant_resources 303 +%token RDO_Keep 304 +%token RDO_Create 305 +%token RDO_Erase 306 +%token RDO_NonExist 307 +%token RDO_IDENTIF_NoChange 308 +%token RDO_Time 309 +%token RDO_Choice 310 +%token RDO_from 311 +%token RDO_first 312 +%token RDO_Convert_begin 313 +%token RDO_Convert_end 314 +%token RDO_Convert_rule 315 +%token RDO_Convert_event 316 +%token RDO_with_max 317 +%token RDO_with_min 318 +%token RDO_set 319 +%token RDO_IDENTIF_NoChange_NoChange 320 +%token RDO_Operations 321 + +%token RDO_Results 322 +%token RDO_watch_par 323 +%token RDO_watch_state 324 +%token RDO_watch_quant 325 +%token RDO_watch_value 326 +%token RDO_get_value 327 + +%token RDO_Model_name 328 +%token RDO_Resource_file 329 +%token RDO_OprIev_file 330 +%token RDO_Frame_file 331 +%token RDO_Statistic_file 332 +%token RDO_Results_file 333 +%token RDO_Trace_file 334 +%token RDO_Show_mode 335 +%token RDO_Frame_number 336 +%token RDO_Show_rate 337 +%token RDO_Run_StartTime 338 +%token RDO_Trace_StartTime 339 +%token RDO_Trace_EndTime 340 +%token RDO_Terminate_if 341 +%token RDO_Break_point 342 +%token RDO_Seed 343 +%token RDO_NoShow 344 +%token RDO_Monitor 345 +%token RDO_Animation 346 +%token RDO_NoChange 347 + +%token RDO_Decision_point 348 +%token RDO_search 349 +%token RDO_trace_stat 350 +%token RDO_trace_tops 351 +%token RDO_trace_all 352 +%token RDO_Condition 353 +%token RDO_Term_condition 354 +%token RDO_Evaluate_by 355 +%token RDO_Compare_tops 356 +%token RDO_NO 357 +%token RDO_YES 358 +%token RDO_Activities 359 +%token RDO_value_before 360 +%token RDO_value_after 361 +%token RDO_some 362 +%token RDO_Process 363 +%token RDO_SEIZE 364 +%token RDO_GENERATE 365 +%token RDO_TERMINATE 366 +%token RDO_ADVANCE 367 +%token RDO_RELEASE 368 +%token RDO_if 369 +%token RDO_CF 370 +%token RDO_Priority 371 +%token RDO_prior 372 +%token RDO_Parent 373 + +%token RDO_Frame 400 +%token RDO_Show_if 401 +%token RDO_Back_picture 402 +%token RDO_Show 403 +%token RDO_frm_cell 404 +%token RDO_text 405 +%token RDO_bitmap 406 +%token RDO_s_bmp 407 +%token RDO_rect 408 +%token RDO_r_rect 409 +%token RDO_line 410 +%token RDO_ellipse 411 +%token RDO_triang 412 +%token RDO_active 413 +%token RDO_ruler 414 +%token RDO_space 415 +%token RDO_color_transparent 416 +%token RDO_color_last 417 +%token RDO_color_white 418 +%token RDO_color_black 419 +%token RDO_color_red 420 +%token RDO_color_green 421 +%token RDO_color_blue 422 +%token RDO_color_cyan 423 +%token RDO_color_magenta 424 +%token RDO_color_yellow 425 +%token RDO_color_gray 426 + +%token RDO_IDENTIF_RELRES 427 +%token RDO_typedef 428 +%token RDO_enum 429 + +%token RDO_STRING_CONST 430 +%token RDO_Select 431 +%token RDO_Size 432 +%token RDO_Empty 433 +%token RDO_not 434 +%token RDO_UMINUS 435 +%token RDO_string 436 +%token RDO_bool 437 +%token RDO_BOOL_CONST 438 +%token RDO_Fuzzy 439 +%token RDO_Fuzzy_Term 440 +%token RDO_eq 441 +%token RDO_External_Model 442 +%token RDO_QUEUE 443 +%token RDO_DEPART 444 +%token RDO_ASSIGN 445 %{ @@ -212,518 +202,518 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE %% type_list - : /* empty */ - | type_list rtp_res_type - | type_list ext_param_type - | error - { - CONVERTER->error().error(RDOParserSrcInfo(), "Ожидается ключевое слово $Resource_type"); - } - ; + : /* empty */ + | type_list rtp_res_type + | type_list ext_param_type + | error + { + CONVERTER->error().error(RDOParserSrcInfo(), "Ожидается ключевое слово $Resource_type"); + } + ; ext_param_type - : RDO_typedef RDO_enum ext_par_type_enum - ; + : RDO_typedef RDO_enum ext_par_type_enum + ; ext_par_type_enum - : param_type_enum RDO_IDENTIF - { - LPRDOEnumType pType = CONVERTER->stack().pop($1); - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - ; + : param_type_enum RDO_IDENTIF + { + LPRDOEnumType pType = CONVERTER->stack().pop($1); + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + ; rtp_res_type - : rtp_header RDO_Parameters rtp_body RDO_End - { - LPRDORTPResType pResourceType = CONVERTER->stack().pop($1); - ASSERT(pResourceType); - if (pResourceType->getParams().empty()) - { - CONVERTER->error().warning(@2, rdo::format("Тип ресурса '%s' не содежит параметров", pResourceType->name().c_str())); - } - pResourceType->finish(); - $$ = CONVERTER->stack().push(pResourceType); - } - | rtp_header RDO_Parameters rtp_body - { - CONVERTER->error().error(@2, "Не найдено ключевое слово $End"); - } - | rtp_header error - { - CONVERTER->error().error(@2, "Не найдено ключевое слово $Parameters"); - } - ; + : rtp_header RDO_Parameters rtp_body RDO_End + { + LPRDORTPResType pResourceType = CONVERTER->stack().pop($1); + ASSERT(pResourceType); + if (pResourceType->getParams().empty()) + { + CONVERTER->error().warning(@2, rdo::format("Тип ресурса '%s' не содежит параметров", pResourceType->name().c_str())); + } + pResourceType->finish(); + $$ = CONVERTER->stack().push(pResourceType); + } + | rtp_header RDO_Parameters rtp_body + { + CONVERTER->error().error(@2, "Не найдено ключевое слово $End"); + } + | rtp_header error + { + CONVERTER->error().error(@2, "Не найдено ключевое слово $Parameters"); + } + ; rtp_header - : RDO_Resource_type RDO_IDENTIF_COLON rtp_vid_res - { - LEXER->enumReset(); - LPRDOValue pTypeName = CONVERTER->stack().pop($2); - const std::string name = pTypeName->value().getIdentificator(); - LPRDORTPResType _rtp = CONVERTER->findRTPResType(name); - if (_rtp) - { - CONVERTER->error().push_only(pTypeName->src_info(), rdo::format("Тип ресурса уже существует: %s", name.c_str())); - CONVERTER->error().push_only(_rtp->src_info(), "См. первое определение"); - CONVERTER->error().push_done(); - } - LPRDORTPResType pResourceType = rdo::Factory::create(CONVERTER, pTypeName->src_info(), $3 != 0); - ASSERT(pResourceType); - $$ = CONVERTER->stack().push(pResourceType); - } - | RDO_Resource_type RDO_IDENTIF_COLON RDO_IDENTIF_COLON rtp_vid_res - { - LEXER->enumReset(); - LPRDOValue pTypeName = CONVERTER->stack().pop($2); - std::string name = pTypeName->value().getIdentificator(); - LPRDORTPResType _rtp = CONVERTER->findRTPResType(name); - if (_rtp) - { - CONVERTER->error().push_only(pTypeName->src_info(), rdo::format("Тип ресурса уже существует: %s", name.c_str())); - CONVERTER->error().push_only(_rtp->src_info(), "См. первое определение"); - CONVERTER->error().push_done(); - } - LPRDOValue pPrntTypeName = CONVERTER->stack().pop($3); - const std::string prnt_name = pPrntTypeName->value().getIdentificator(); - LPRDORTPResType _rtp_prnt = CONVERTER->findRTPResType(prnt_name); - - if (_rtp_prnt) - { - LPRDORTPResType pResourceType = rdo::Factory::create(CONVERTER, pTypeName->src_info(), $4 != 0); - ASSERT(pResourceType); - std::size_t t_ind = 0; - std::size_t col_par = _rtp_prnt->getParams().size(); - while (t_ind < col_par) - { - pResourceType->addParam(_rtp_prnt->getParams()[t_ind]); - CONVERTER->error().warning(_rtp_prnt->getParams()[t_ind]->src_info(), rdo::format("Параметр %s передан от родителя %s потомку %s", _rtp_prnt->getParams()[t_ind]->src_info().src_text().c_str(), prnt_name.c_str(), name.c_str())); - t_ind++; - } - $$ = CONVERTER->stack().push(pResourceType); - CONVERTER->error().warning(@2, rdo::format("Тип ресурса %s является потомком типа ресурса %s", name.c_str(), prnt_name.c_str())); - } - else - { - CONVERTER->error().push_only(@3, rdo::format("Родительский тип ресурса не существует: %s", prnt_name.c_str())); - CONVERTER->error().push_done(); - } - } - | RDO_Resource_type RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@2, "Не указан вид ресурса"); - } - | RDO_Resource_type RDO_IDENTIF_COLON RDO_IDENTIF_COLON error - { - CONVERTER->error().error(@3, "Не указан вид ресурса"); - } - | RDO_Resource_type error - { - const std::string str(LEXER->YYText()); - CONVERTER->error().error(@2, rdo::format("Ошибка в описании имени типа ресурса: %s", str.c_str())); - } - ; + : RDO_Resource_type RDO_IDENTIF_COLON rtp_vid_res + { + LEXER->enumReset(); + LPRDOValue pTypeName = CONVERTER->stack().pop($2); + const std::string name = pTypeName->value().getIdentificator(); + LPRDORTPResType _rtp = CONVERTER->findRTPResType(name); + if (_rtp) + { + CONVERTER->error().push_only(pTypeName->src_info(), rdo::format("Тип ресурса уже существует: %s", name.c_str())); + CONVERTER->error().push_only(_rtp->src_info(), "См. первое определение"); + CONVERTER->error().push_done(); + } + LPRDORTPResType pResourceType = rdo::Factory::create(CONVERTER, pTypeName->src_info(), $3 != 0); + ASSERT(pResourceType); + $$ = CONVERTER->stack().push(pResourceType); + } + | RDO_Resource_type RDO_IDENTIF_COLON RDO_IDENTIF_COLON rtp_vid_res + { + LEXER->enumReset(); + LPRDOValue pTypeName = CONVERTER->stack().pop($2); + std::string name = pTypeName->value().getIdentificator(); + LPRDORTPResType _rtp = CONVERTER->findRTPResType(name); + if (_rtp) + { + CONVERTER->error().push_only(pTypeName->src_info(), rdo::format("Тип ресурса уже существует: %s", name.c_str())); + CONVERTER->error().push_only(_rtp->src_info(), "См. первое определение"); + CONVERTER->error().push_done(); + } + LPRDOValue pPrntTypeName = CONVERTER->stack().pop($3); + const std::string prnt_name = pPrntTypeName->value().getIdentificator(); + LPRDORTPResType _rtp_prnt = CONVERTER->findRTPResType(prnt_name); + + if (_rtp_prnt) + { + LPRDORTPResType pResourceType = rdo::Factory::create(CONVERTER, pTypeName->src_info(), $4 != 0); + ASSERT(pResourceType); + std::size_t t_ind = 0; + std::size_t col_par = _rtp_prnt->getParams().size(); + while (t_ind < col_par) + { + pResourceType->addParam(_rtp_prnt->getParams()[t_ind]); + CONVERTER->error().warning(_rtp_prnt->getParams()[t_ind]->src_info(), rdo::format("Параметр %s передан от родителя %s потомку %s", _rtp_prnt->getParams()[t_ind]->src_info().src_text().c_str(), prnt_name.c_str(), name.c_str())); + t_ind++; + } + $$ = CONVERTER->stack().push(pResourceType); + CONVERTER->error().warning(@2, rdo::format("Тип ресурса %s является потомком типа ресурса %s", name.c_str(), prnt_name.c_str())); + } + else + { + CONVERTER->error().push_only(@3, rdo::format("Родительский тип ресурса не существует: %s", prnt_name.c_str())); + CONVERTER->error().push_done(); + } + } + | RDO_Resource_type RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@2, "Не указан вид ресурса"); + } + | RDO_Resource_type RDO_IDENTIF_COLON RDO_IDENTIF_COLON error + { + CONVERTER->error().error(@3, "Не указан вид ресурса"); + } + | RDO_Resource_type error + { + const std::string str(LEXER->YYText()); + CONVERTER->error().error(@2, rdo::format("Ошибка в описании имени типа ресурса: %s", str.c_str())); + } + ; rtp_vid_res - : RDO_permanent {$$ = 1;} - | RDO_temporary {$$ = 0;} - ; + : RDO_permanent {$$ = 1;} + | RDO_temporary {$$ = 0;} + ; rtp_body - : /* empty */ - | rtp_body rtp_param - { - LPRDORTPParam pParam = CONVERTER->stack().pop($2); - CONVERTER->getLastRTPResType()->addParam(pParam); - } - ; + : /* empty */ + | rtp_body rtp_param + { + LPRDORTPParam pParam = CONVERTER->stack().pop($2); + CONVERTER->getLastRTPResType()->addParam(pParam); + } + ; rtp_param - : RDO_IDENTIF_COLON param_type param_value_default - { - LPRDOValue pParamName = CONVERTER->stack().pop($1); - LPRDOTypeParam pParamType = CONVERTER->stack().pop($2); - LPRDOValue pDefaultValue = CONVERTER->stack().pop($3); - if (!pDefaultValue->defined()) - { - LPRDOTypeParamSuchAs pTypeSuchAs = pParamType.object_dynamic_cast(); - if (pTypeSuchAs) - { - pDefaultValue = pTypeSuchAs->getParam()->getDefault(); - } - } - - LPRDORTPParam pParam = rdo::Factory::create(pParamType, pDefaultValue, pParamName->src_info()); - - LPDocUpdate pColonDelete = rdo::Factory::create( - @1.m_last_seek - 1, - @1.m_last_seek - ); - ASSERT(pColonDelete); - //CONVERTER->insertDocUpdate(pColonDelete); - - LPDocUpdate pNameTypeSwap = rdo::Factory::create( - @1.m_first_seek, - @1.m_first_seek + pParamName->value().getIdentificator().length(), - @2.m_first_seek, - @2.m_last_seek - ); - ASSERT(pNameTypeSwap); - //CONVERTER->insertDocUpdate(pNameTypeSwap); - - LPDocUpdate pSemicolonInsert = rdo::Factory::create( - @3.m_last_seek, - ";" - ); - ASSERT(pSemicolonInsert); - //CONVERTER->insertDocUpdate(pSemicolonInsert); - - $$ = CONVERTER->stack().push(pParam); - } - | RDO_IDENTIF_COLON error - { - if (CONVERTER->lexer_loc_line() == @1.m_last_line) - { - const std::string str(LEXER->YYText()); - CONVERTER->error().error(@2, rdo::format("Неверный тип параметра: %s", str.c_str())); - } - else - { - CONVERTER->error().error(@1, "Ожидается тип параметра"); - } - } - | error - { - CONVERTER->error().error(@1, "Неправильное описание параметра"); - } - ; + : RDO_IDENTIF_COLON param_type param_value_default + { + LPRDOValue pParamName = CONVERTER->stack().pop($1); + LPRDOTypeParam pParamType = CONVERTER->stack().pop($2); + LPRDOValue pDefaultValue = CONVERTER->stack().pop($3); + if (!pDefaultValue->defined()) + { + LPRDOTypeParamSuchAs pTypeSuchAs = pParamType.object_dynamic_cast(); + if (pTypeSuchAs) + { + pDefaultValue = pTypeSuchAs->getParam()->getDefault(); + } + } + + LPRDORTPParam pParam = rdo::Factory::create(pParamType, pDefaultValue, pParamName->src_info()); + + LPDocUpdate pColonDelete = rdo::Factory::create( + @1.m_last_seek - 1, + @1.m_last_seek + ); + ASSERT(pColonDelete); + //CONVERTER->insertDocUpdate(pColonDelete); + + LPDocUpdate pNameTypeSwap = rdo::Factory::create( + @1.m_first_seek, + @1.m_first_seek + pParamName->value().getIdentificator().length(), + @2.m_first_seek, + @2.m_last_seek + ); + ASSERT(pNameTypeSwap); + //CONVERTER->insertDocUpdate(pNameTypeSwap); + + LPDocUpdate pSemicolonInsert = rdo::Factory::create( + @3.m_last_seek, + ";" + ); + ASSERT(pSemicolonInsert); + //CONVERTER->insertDocUpdate(pSemicolonInsert); + + $$ = CONVERTER->stack().push(pParam); + } + | RDO_IDENTIF_COLON error + { + if (CONVERTER->lexer_loc_line() == @1.m_last_line) + { + const std::string str(LEXER->YYText()); + CONVERTER->error().error(@2, rdo::format("Неверный тип параметра: %s", str.c_str())); + } + else + { + CONVERTER->error().error(@1, "Ожидается тип параметра"); + } + } + | error + { + CONVERTER->error().error(@1, "Неправильное описание параметра"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Описание типа параметра // -------------------------------------------------------------------------------- param_type - : RDO_integer param_type_range - { - LPDocUpdate pReplace = rdo::Factory::create(@1.m_first_seek, @1.m_last_seek, "int"); - ASSERT(pReplace); - //CONVERTER->insertDocUpdate(pReplace); - - LPRDOTypeRangeRange pRange = CONVERTER->stack().pop($2); - LPRDOTypeParam pType; - if (pRange) - { - if (pRange->getMin()->typeID() != rdo::runtime::RDOType::t_int || - pRange->getMax()->typeID() != rdo::runtime::RDOType::t_int) - { - CONVERTER->error().error(@2, "Диапазон целого типа должен быть целочисленным"); - } - LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); - ASSERT(pIntRange); - pType = rdo::Factory::create(pIntRange, RDOParserSrcInfo(@1, @2)); - } - else - { - pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1, @2)); - } - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | RDO_real param_type_range - { - LPRDOTypeRangeRange pRange = CONVERTER->stack().pop($2); - LPRDOTypeParam pType; - if (pRange) - { - LPRDOTypeRealRange pRealRange = rdo::Factory::create(pRange); - ASSERT(pRealRange); - pType = rdo::Factory::create(pRealRange, RDOParserSrcInfo(@1, @2)); - } - else - { - pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1, @2)); - } - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | RDO_string - { - LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1)); - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | RDO_bool - { - LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1)); - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | param_type_enum - { - LEXER->enumReset(); - LPRDOEnumType pEnum = CONVERTER->stack().pop($1); - ASSERT(pEnum); - LPRDOTypeParam pType = rdo::Factory::create(pEnum, RDOParserSrcInfo(@1)); - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - | param_type_such_as - { - LPRDOTypeParamSuchAs pTypeSuchAs = CONVERTER->stack().pop($1); - ASSERT(pTypeSuchAs); - LPRDOTypeParam pType = pTypeSuchAs.object_parent_cast(); - ASSERT(pType); - $$ = CONVERTER->stack().push(pType); - } - ; + : RDO_integer param_type_range + { + LPDocUpdate pReplace = rdo::Factory::create(@1.m_first_seek, @1.m_last_seek, "int"); + ASSERT(pReplace); + //CONVERTER->insertDocUpdate(pReplace); + + LPRDOTypeRangeRange pRange = CONVERTER->stack().pop($2); + LPRDOTypeParam pType; + if (pRange) + { + if (pRange->getMin()->typeID() != rdo::runtime::RDOType::Type::INT || + pRange->getMax()->typeID() != rdo::runtime::RDOType::Type::INT) + { + CONVERTER->error().error(@2, "Диапазон целого типа должен быть целочисленным"); + } + LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); + ASSERT(pIntRange); + pType = rdo::Factory::create(pIntRange, RDOParserSrcInfo(@1, @2)); + } + else + { + pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1, @2)); + } + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | RDO_real param_type_range + { + LPRDOTypeRangeRange pRange = CONVERTER->stack().pop($2); + LPRDOTypeParam pType; + if (pRange) + { + LPRDOTypeRealRange pRealRange = rdo::Factory::create(pRange); + ASSERT(pRealRange); + pType = rdo::Factory::create(pRealRange, RDOParserSrcInfo(@1, @2)); + } + else + { + pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1, @2)); + } + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | RDO_string + { + LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1)); + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | RDO_bool + { + LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo(@1)); + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | param_type_enum + { + LEXER->enumReset(); + LPRDOEnumType pEnum = CONVERTER->stack().pop($1); + ASSERT(pEnum); + LPRDOTypeParam pType = rdo::Factory::create(pEnum, RDOParserSrcInfo(@1)); + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + | param_type_such_as + { + LPRDOTypeParamSuchAs pTypeSuchAs = CONVERTER->stack().pop($1); + ASSERT(pTypeSuchAs); + LPRDOTypeParam pType = pTypeSuchAs.object_parent_cast(); + ASSERT(pType); + $$ = CONVERTER->stack().push(pType); + } + ; param_type_range - : /* empty */ - { - $$ = CONVERTER->stack().push(LPRDOTypeRangeRange()); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = CONVERTER->stack().push(pRange); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = CONVERTER->stack().push(pRange); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = CONVERTER->stack().push(pRange); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = CONVERTER->stack().push(pRange); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_REAL_CONST RDO_dblpoint error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_INT_CONST RDO_dblpoint error - { - CONVERTER->error().error(@4, "Диапазон задан неверно"); - } - | '[' error - { - CONVERTER->error().error(@2, "Диапазон задан неверно"); - } - ; + : /* empty */ + { + $$ = CONVERTER->stack().push(LPRDOTypeRangeRange()); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = CONVERTER->stack().push(pRange); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = CONVERTER->stack().push(pRange); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = CONVERTER->stack().push(pRange); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(CONVERTER->stack().pop($2), CONVERTER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = CONVERTER->stack().push(pRange); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_REAL_CONST RDO_dblpoint error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_INT_CONST RDO_dblpoint error + { + CONVERTER->error().error(@4, "Диапазон задан неверно"); + } + | '[' error + { + CONVERTER->error().error(@2, "Диапазон задан неверно"); + } + ; param_type_enum - : '(' param_type_enum_list ')' - { - LPDocUpdate pEnumInsert = rdo::Factory::create( - @1.m_first_seek, - "enum " - ); - ASSERT(pEnumInsert); - //CONVERTER->insertDocUpdate(pEnumInsert); - - LPDocUpdate pOpenBracketReplace = rdo::Factory::create(@1.m_first_seek, @1.m_last_seek, "{"); - ASSERT(pOpenBracketReplace); - //CONVERTER->insertDocUpdate(pOpenBracketReplace); - - LPDocUpdate pCloseBracketReplace = rdo::Factory::create(@3.m_first_seek, @3.m_last_seek, "}"); - ASSERT(pCloseBracketReplace); - //CONVERTER->insertDocUpdate(pCloseBracketReplace); - - LPRDOEnumType pEnum = CONVERTER->stack().pop($2); - ASSERT(pEnum); - $$ = CONVERTER->stack().push(pEnum); - } - | '(' param_type_enum_list error - { - CONVERTER->error().error(@2, "Перечисление должно заканчиваться скобкой"); - } - ; + : '(' param_type_enum_list ')' + { + LPDocUpdate pEnumInsert = rdo::Factory::create( + @1.m_first_seek, + "enum " + ); + ASSERT(pEnumInsert); + //CONVERTER->insertDocUpdate(pEnumInsert); + + LPDocUpdate pOpenBracketReplace = rdo::Factory::create(@1.m_first_seek, @1.m_last_seek, "{"); + ASSERT(pOpenBracketReplace); + //CONVERTER->insertDocUpdate(pOpenBracketReplace); + + LPDocUpdate pCloseBracketReplace = rdo::Factory::create(@3.m_first_seek, @3.m_last_seek, "}"); + ASSERT(pCloseBracketReplace); + //CONVERTER->insertDocUpdate(pCloseBracketReplace); + + LPRDOEnumType pEnum = CONVERTER->stack().pop($2); + ASSERT(pEnum); + $$ = CONVERTER->stack().push(pEnum); + } + | '(' param_type_enum_list error + { + CONVERTER->error().error(@2, "Перечисление должно заканчиваться скобкой"); + } + ; param_type_enum_list - : RDO_IDENTIF - { - LPRDOEnumType pEnum = rdo::Factory::create(); - ASSERT(pEnum); - pEnum->add(CONVERTER->stack().pop($1)); - LEXER->enumBegin(); - $$ = CONVERTER->stack().push(pEnum); - } - | param_type_enum_list ',' RDO_IDENTIF - { - if (!LEXER->enumEmpty()) - { - LPRDOEnumType pEnum = CONVERTER->stack().pop($1); - ASSERT(pEnum); - pEnum->add(CONVERTER->stack().pop($3)); - $$ = CONVERTER->stack().push(pEnum); - } - else - { - CONVERTER->error().error(@3, "Ошибка в описании значений перечислимого типа"); - } - } - | param_type_enum_list RDO_IDENTIF - { - if (!LEXER->enumEmpty()) - { - LPRDOEnumType pEnum = CONVERTER->stack().pop($1); - ASSERT(pEnum); - pEnum->add(CONVERTER->stack().pop($2)); - $$ = CONVERTER->stack().push(pEnum); - CONVERTER->error().warning(@1, rdo::format("Пропущена запятая перед: %s", CONVERTER->stack().pop($2)->value().getIdentificator().c_str())); - } - else - { - CONVERTER->error().error(@2, "Ошибка в описании значений перечислимого типа"); - } - } - | param_type_enum_list ',' RDO_INT_CONST - { - CONVERTER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); - } - | param_type_enum_list ',' RDO_REAL_CONST - { - CONVERTER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); - } - | param_type_enum_list RDO_INT_CONST - { - CONVERTER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); - } - | param_type_enum_list RDO_REAL_CONST - { - CONVERTER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); - } - | RDO_INT_CONST - { - CONVERTER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); - } - | RDO_REAL_CONST - { - CONVERTER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); - } - ; + : RDO_IDENTIF + { + LPRDOEnumType pEnum = rdo::Factory::create(); + ASSERT(pEnum); + pEnum->add(CONVERTER->stack().pop($1)); + LEXER->enumBegin(); + $$ = CONVERTER->stack().push(pEnum); + } + | param_type_enum_list ',' RDO_IDENTIF + { + if (!LEXER->enumEmpty()) + { + LPRDOEnumType pEnum = CONVERTER->stack().pop($1); + ASSERT(pEnum); + pEnum->add(CONVERTER->stack().pop($3)); + $$ = CONVERTER->stack().push(pEnum); + } + else + { + CONVERTER->error().error(@3, "Ошибка в описании значений перечислимого типа"); + } + } + | param_type_enum_list RDO_IDENTIF + { + if (!LEXER->enumEmpty()) + { + LPRDOEnumType pEnum = CONVERTER->stack().pop($1); + ASSERT(pEnum); + pEnum->add(CONVERTER->stack().pop($2)); + $$ = CONVERTER->stack().push(pEnum); + CONVERTER->error().warning(@1, rdo::format("Пропущена запятая перед: %s", CONVERTER->stack().pop($2)->value().getIdentificator().c_str())); + } + else + { + CONVERTER->error().error(@2, "Ошибка в описании значений перечислимого типа"); + } + } + | param_type_enum_list ',' RDO_INT_CONST + { + CONVERTER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); + } + | param_type_enum_list ',' RDO_REAL_CONST + { + CONVERTER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); + } + | param_type_enum_list RDO_INT_CONST + { + CONVERTER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); + } + | param_type_enum_list RDO_REAL_CONST + { + CONVERTER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); + } + | RDO_INT_CONST + { + CONVERTER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); + } + | RDO_REAL_CONST + { + CONVERTER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); + } + ; param_type_such_as - : RDO_such_as RDO_IDENTIF '.' RDO_IDENTIF - { - const std::string type = CONVERTER->stack().pop($2)->value().getIdentificator(); - const std::string param = CONVERTER->stack().pop($4)->value().getIdentificator(); - LPRDORTPResType pResType = CONVERTER->findRTPResType(type); - if (!pResType) - { - CONVERTER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); - } - LPRDORTPParam pRTPParam = pResType->findRTPParam(param); - if (!pRTPParam) - { - CONVERTER->error().error(@4, rdo::format("Ссылка на неизвестный параметр ресурса: %s.%s", type.c_str(), param.c_str())); - } - LPRDOParam pParam = pRTPParam.object_parent_cast(); - ASSERT(pParam); - LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); - ASSERT(pTypeSuchAs); - $$ = CONVERTER->stack().push(pTypeSuchAs); - } - | RDO_such_as RDO_IDENTIF - { - const std::string constName = CONVERTER->stack().pop($2)->value().getIdentificator(); - LPRDOFUNConstant pConstant = CONVERTER->findFUNConstant(constName); - if (!pConstant) - { - CONVERTER->error().error(@2, rdo::format("Ссылка на несуществующую константу: %s", constName.c_str())); - } - LPRDOParam pParam = pConstant.object_parent_cast(); - ASSERT(pParam); - LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); - ASSERT(pTypeSuchAs); - $$ = CONVERTER->stack().push(pTypeSuchAs); - } - | RDO_such_as RDO_IDENTIF '.' error - { - const std::string type = CONVERTER->stack().pop($2)->value().getIdentificator(); - LPRDORTPResType pResType = CONVERTER->findRTPResType(type); - if (!pResType) - { - CONVERTER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); - } - else - { - CONVERTER->error().error(@4, "Ошибка при указании параметра"); - } - } - | RDO_such_as error - { - CONVERTER->error().error(@2, "После ключевого слова such_as необходимо указать тип и параметер ресурса для ссылки"); - } - ; + : RDO_such_as RDO_IDENTIF '.' RDO_IDENTIF + { + const std::string type = CONVERTER->stack().pop($2)->value().getIdentificator(); + const std::string param = CONVERTER->stack().pop($4)->value().getIdentificator(); + LPRDORTPResType pResType = CONVERTER->findRTPResType(type); + if (!pResType) + { + CONVERTER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); + } + LPRDORTPParam pRTPParam = pResType->findRTPParam(param); + if (!pRTPParam) + { + CONVERTER->error().error(@4, rdo::format("Ссылка на неизвестный параметр ресурса: %s.%s", type.c_str(), param.c_str())); + } + LPRDOParam pParam = pRTPParam.object_parent_cast(); + ASSERT(pParam); + LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); + ASSERT(pTypeSuchAs); + $$ = CONVERTER->stack().push(pTypeSuchAs); + } + | RDO_such_as RDO_IDENTIF + { + const std::string constName = CONVERTER->stack().pop($2)->value().getIdentificator(); + LPRDOFUNConstant pConstant = CONVERTER->findFUNConstant(constName); + if (!pConstant) + { + CONVERTER->error().error(@2, rdo::format("Ссылка на несуществующую константу: %s", constName.c_str())); + } + LPRDOParam pParam = pConstant.object_parent_cast(); + ASSERT(pParam); + LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); + ASSERT(pTypeSuchAs); + $$ = CONVERTER->stack().push(pTypeSuchAs); + } + | RDO_such_as RDO_IDENTIF '.' error + { + const std::string type = CONVERTER->stack().pop($2)->value().getIdentificator(); + LPRDORTPResType pResType = CONVERTER->findRTPResType(type); + if (!pResType) + { + CONVERTER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); + } + else + { + CONVERTER->error().error(@4, "Ошибка при указании параметра"); + } + } + | RDO_such_as error + { + CONVERTER->error().error(@2, "После ключевого слова such_as необходимо указать тип и параметер ресурса для ссылки"); + } + ; param_value_default - : /* empty */ - { - $$ = CONVERTER->stack().push(rdo::Factory::create()); - } - | '=' RDO_INT_CONST - { - $$ = $2; - } - | '=' RDO_REAL_CONST - { - $$ = $2; - } - | '=' RDO_STRING_CONST - { - $$ = $2; - } - | '=' RDO_IDENTIF - { - $$ = $2; - } - | '=' RDO_BOOL_CONST - { - $$ = $2; - } - | '=' error - { - RDOParserSrcInfo src_info(@1, @2, true); - if (src_info.src_pos().point()) - { - CONVERTER->error().error(src_info, "Не указано значение по умолчанию"); - } - else - { - CONVERTER->error().error(src_info, "Неверное значение по умолчанию"); - } - } - ; + : /* empty */ + { + $$ = CONVERTER->stack().push(rdo::Factory::create()); + } + | '=' RDO_INT_CONST + { + $$ = $2; + } + | '=' RDO_REAL_CONST + { + $$ = $2; + } + | '=' RDO_STRING_CONST + { + $$ = $2; + } + | '=' RDO_IDENTIF + { + $$ = $2; + } + | '=' RDO_BOOL_CONST + { + $$ = $2; + } + | '=' error + { + RDOParserSrcInfo src_info(@1, @2, true); + if (src_info.src_pos().point()) + { + CONVERTER->error().error(src_info, "Не указано значение по умолчанию"); + } + else + { + CONVERTER->error().error(src_info, "Неверное значение по умолчанию"); + } + } + ; %% diff --git a/converter/smr2rdox/grammar/rdosmr_file.y b/converter/smr2rdox/grammar/rdosmr_file.y index 32a69c266..c3d683ab3 100644 --- a/converter/smr2rdox/grammar/rdosmr_file.y +++ b/converter/smr2rdox/grammar/rdosmr_file.y @@ -1,13 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdosmr_file.y - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \date - \brief - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -16,175 +6,175 @@ %pure-parser %param {void* lexer} -%token RDO_Resource_type 257 -%token RDO_permanent 258 -%token RDO_Parameters 259 -%token RDO_integer 260 -%token RDO_real 261 -%token RDO_End 262 -%token RDO_temporary 263 -%token RDO_IDENTIF 264 -%token RDO_INT_CONST 265 -%token RDO_REAL_CONST 266 -%token RDO_such_as 267 -%token RDO_dblpoint 268 -%token RDO_Resources 269 -%token RDO_trace 270 -%token RDO_no_trace 271 -%token RDO_IDENTIF_COLON 272 -%token RDO_Constant 273 -%token RDO_Body 274 -%token RDO_Function 275 -%token RDO_Type 276 -%token RDO_algorithmic 277 -%token RDO_table 278 -%token RDO_list 279 -%token RDO_Exist 281 -%token RDO_Not_Exist 282 -%token RDO_For_All 283 -%token RDO_Not_For_All 284 -%token RDO_neq 285 -%token RDO_leq 286 -%token RDO_geq 287 -%token RDO_NoCheck 288 -%token RDO_Calculate_if 289 -%token RDO_or 290 -%token RDO_and 291 -%token RDO_Sequence 292 -%token RDO_uniform 293 -%token RDO_exponential 294 -%token RDO_normal 295 -%token RDO_by_hist 296 -%token RDO_enumerative 297 +%token RDO_Resource_type 257 +%token RDO_permanent 258 +%token RDO_Parameters 259 +%token RDO_integer 260 +%token RDO_real 261 +%token RDO_End 262 +%token RDO_temporary 263 +%token RDO_IDENTIF 264 +%token RDO_INT_CONST 265 +%token RDO_REAL_CONST 266 +%token RDO_such_as 267 +%token RDO_dblpoint 268 +%token RDO_Resources 269 +%token RDO_trace 270 +%token RDO_no_trace 271 +%token RDO_IDENTIF_COLON 272 +%token RDO_Constant 273 +%token RDO_Body 274 +%token RDO_Function 275 +%token RDO_Type 276 +%token RDO_algorithmic 277 +%token RDO_table 278 +%token RDO_list 279 +%token RDO_Exist 281 +%token RDO_Not_Exist 282 +%token RDO_For_All 283 +%token RDO_Not_For_All 284 +%token RDO_neq 285 +%token RDO_leq 286 +%token RDO_geq 287 +%token RDO_NoCheck 288 +%token RDO_Calculate_if 289 +%token RDO_or 290 +%token RDO_and 291 +%token RDO_Sequence 292 +%token RDO_uniform 293 +%token RDO_exponential 294 +%token RDO_normal 295 +%token RDO_by_hist 296 +%token RDO_enumerative 297 -%token RDO_Pattern 298 -%token RDO_operation 299 -%token RDO_irregular_event 300 -%token RDO_rule 301 -%token RDO_keyboard 302 -%token RDO_Relevant_resources 303 -%token RDO_Keep 304 -%token RDO_Create 305 -%token RDO_Erase 306 -%token RDO_NonExist 307 -%token RDO_IDENTIF_NoChange 308 -%token RDO_Time 309 -%token RDO_Choice 310 -%token RDO_from 311 -%token RDO_first 312 -%token RDO_Convert_begin 313 -%token RDO_Convert_end 314 -%token RDO_Convert_rule 315 -%token RDO_Convert_event 316 -%token RDO_with_max 317 -%token RDO_with_min 318 -%token RDO_set 319 -%token RDO_IDENTIF_NoChange_NoChange 320 -%token RDO_Operations 321 +%token RDO_Pattern 298 +%token RDO_operation 299 +%token RDO_irregular_event 300 +%token RDO_rule 301 +%token RDO_keyboard 302 +%token RDO_Relevant_resources 303 +%token RDO_Keep 304 +%token RDO_Create 305 +%token RDO_Erase 306 +%token RDO_NonExist 307 +%token RDO_IDENTIF_NoChange 308 +%token RDO_Time 309 +%token RDO_Choice 310 +%token RDO_from 311 +%token RDO_first 312 +%token RDO_Convert_begin 313 +%token RDO_Convert_end 314 +%token RDO_Convert_rule 315 +%token RDO_Convert_event 316 +%token RDO_with_max 317 +%token RDO_with_min 318 +%token RDO_set 319 +%token RDO_IDENTIF_NoChange_NoChange 320 +%token RDO_Operations 321 -%token RDO_Results 322 -%token RDO_watch_par 323 -%token RDO_watch_state 324 -%token RDO_watch_quant 325 -%token RDO_watch_value 326 -%token RDO_get_value 327 +%token RDO_Results 322 +%token RDO_watch_par 323 +%token RDO_watch_state 324 +%token RDO_watch_quant 325 +%token RDO_watch_value 326 +%token RDO_get_value 327 -%token RDO_Model_name 328 -%token RDO_Resource_file 329 -%token RDO_OprIev_file 330 -%token RDO_Frame_file 331 -%token RDO_Statistic_file 332 -%token RDO_Results_file 333 -%token RDO_Trace_file 334 -%token RDO_Show_mode 335 -%token RDO_Frame_number 336 -%token RDO_Show_rate 337 -%token RDO_Run_StartTime 338 -%token RDO_Trace_StartTime 339 -%token RDO_Trace_EndTime 340 -%token RDO_Terminate_if 341 -%token RDO_Break_point 342 -%token RDO_Seed 343 -%token RDO_NoShow 344 -%token RDO_Monitor 345 -%token RDO_Animation 346 -%token RDO_NoChange 347 +%token RDO_Model_name 328 +%token RDO_Resource_file 329 +%token RDO_OprIev_file 330 +%token RDO_Frame_file 331 +%token RDO_Statistic_file 332 +%token RDO_Results_file 333 +%token RDO_Trace_file 334 +%token RDO_Show_mode 335 +%token RDO_Frame_number 336 +%token RDO_Show_rate 337 +%token RDO_Run_StartTime 338 +%token RDO_Trace_StartTime 339 +%token RDO_Trace_EndTime 340 +%token RDO_Terminate_if 341 +%token RDO_Break_point 342 +%token RDO_Seed 343 +%token RDO_NoShow 344 +%token RDO_Monitor 345 +%token RDO_Animation 346 +%token RDO_NoChange 347 -%token RDO_Decision_point 348 -%token RDO_search 349 -%token RDO_trace_stat 350 -%token RDO_trace_tops 351 -%token RDO_trace_all 352 -%token RDO_Condition 353 -%token RDO_Term_condition 354 -%token RDO_Evaluate_by 355 -%token RDO_Compare_tops 356 -%token RDO_NO 357 -%token RDO_YES 358 -%token RDO_Activities 359 -%token RDO_value_before 360 -%token RDO_value_after 361 -%token RDO_some 362 -%token RDO_Process 363 -%token RDO_SEIZE 364 -%token RDO_GENERATE 365 -%token RDO_TERMINATE 366 -%token RDO_ADVANCE 367 -%token RDO_RELEASE 368 -%token RDO_if 369 -%token RDO_CF 370 -%token RDO_Priority 371 -%token RDO_prior 372 -%token RDO_Parent 373 +%token RDO_Decision_point 348 +%token RDO_search 349 +%token RDO_trace_stat 350 +%token RDO_trace_tops 351 +%token RDO_trace_all 352 +%token RDO_Condition 353 +%token RDO_Term_condition 354 +%token RDO_Evaluate_by 355 +%token RDO_Compare_tops 356 +%token RDO_NO 357 +%token RDO_YES 358 +%token RDO_Activities 359 +%token RDO_value_before 360 +%token RDO_value_after 361 +%token RDO_some 362 +%token RDO_Process 363 +%token RDO_SEIZE 364 +%token RDO_GENERATE 365 +%token RDO_TERMINATE 366 +%token RDO_ADVANCE 367 +%token RDO_RELEASE 368 +%token RDO_if 369 +%token RDO_CF 370 +%token RDO_Priority 371 +%token RDO_prior 372 +%token RDO_Parent 373 -%token RDO_Frame 400 -%token RDO_Show_if 401 -%token RDO_Back_picture 402 -%token RDO_Show 403 -%token RDO_frm_cell 404 -%token RDO_text 405 -%token RDO_bitmap 406 -%token RDO_s_bmp 407 -%token RDO_rect 408 -%token RDO_r_rect 409 -%token RDO_line 410 -%token RDO_ellipse 411 -%token RDO_triang 412 -%token RDO_active 413 -%token RDO_ruler 414 -%token RDO_space 415 -%token RDO_color_transparent 416 -%token RDO_color_last 417 -%token RDO_color_white 418 -%token RDO_color_black 419 -%token RDO_color_red 420 -%token RDO_color_green 421 -%token RDO_color_blue 422 -%token RDO_color_cyan 423 -%token RDO_color_magenta 424 -%token RDO_color_yellow 425 -%token RDO_color_gray 426 +%token RDO_Frame 400 +%token RDO_Show_if 401 +%token RDO_Back_picture 402 +%token RDO_Show 403 +%token RDO_frm_cell 404 +%token RDO_text 405 +%token RDO_bitmap 406 +%token RDO_s_bmp 407 +%token RDO_rect 408 +%token RDO_r_rect 409 +%token RDO_line 410 +%token RDO_ellipse 411 +%token RDO_triang 412 +%token RDO_active 413 +%token RDO_ruler 414 +%token RDO_space 415 +%token RDO_color_transparent 416 +%token RDO_color_last 417 +%token RDO_color_white 418 +%token RDO_color_black 419 +%token RDO_color_red 420 +%token RDO_color_green 421 +%token RDO_color_blue 422 +%token RDO_color_cyan 423 +%token RDO_color_magenta 424 +%token RDO_color_yellow 425 +%token RDO_color_gray 426 -%token RDO_IDENTIF_RELRES 427 -%token RDO_typedef 428 -%token RDO_enum 429 +%token RDO_IDENTIF_RELRES 427 +%token RDO_typedef 428 +%token RDO_enum 429 -%token RDO_STRING_CONST 430 -%token RDO_Select 431 -%token RDO_Size 432 -%token RDO_Empty 433 -%token RDO_not 434 -%token RDO_UMINUS 435 -%token RDO_string 436 -%token RDO_bool 437 -%token RDO_BOOL_CONST 438 -%token RDO_Fuzzy 439 -%token RDO_Fuzzy_Term 440 -%token RDO_eq 441 -%token RDO_External_Model 442 -%token RDO_QUEUE 443 -%token RDO_DEPART 444 -%token RDO_ASSIGN 445 +%token RDO_STRING_CONST 430 +%token RDO_Select 431 +%token RDO_Size 432 +%token RDO_Empty 433 +%token RDO_not 434 +%token RDO_UMINUS 435 +%token RDO_string 436 +%token RDO_bool 437 +%token RDO_BOOL_CONST 438 +%token RDO_Fuzzy 439 +%token RDO_Fuzzy_Term 440 +%token RDO_eq 441 +%token RDO_External_Model 442 +%token RDO_QUEUE 443 +%token RDO_DEPART 444 +%token RDO_ASSIGN 445 %{ @@ -208,150 +198,150 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE %% smr_main - : smr_model smr_descr - ; + : smr_model smr_descr + ; smr_model - : RDO_Model_name '=' RDO_IDENTIF - { - LPRDOSMR pSMR = rdo::Factory::create(CONVERTER->stack().pop($3)->value().getIdentificator()); - ASSERT(pSMR); - $$ = CONVERTER->stack().push(pSMR); - } - | RDO_Model_name '=' error - { - CONVERTER->error().error( @2, @3, "Ожидается имя модели" ); - } - | RDO_Model_name error - { - CONVERTER->error().error( @1, "Ожидается '='" ); - } - ; + : RDO_Model_name '=' RDO_IDENTIF + { + LPRDOSMR pSMR = rdo::Factory::create(CONVERTER->stack().pop($3)->value().getIdentificator()); + ASSERT(pSMR); + $$ = CONVERTER->stack().push(pSMR); + } + | RDO_Model_name '=' error + { + CONVERTER->error().error( @2, @3, "Ожидается имя модели" ); + } + | RDO_Model_name error + { + CONVERTER->error().error( @1, "Ожидается '='" ); + } + ; smr_descr - : /* empty */ - | smr_descr RDO_Resource_file '=' RDO_IDENTIF - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setFile( "Resource_file", CONVERTER->stack().pop($4)->value().getIdentificator() ); - } - | smr_descr RDO_Resource_file '=' error - { - CONVERTER->error().error( @3, @4, "Ожидается имя файла ресурсов" ); - } - | smr_descr RDO_Resource_file error - { - CONVERTER->error().error( @2, "Ожидается '='" ); - } - | smr_descr RDO_OprIev_file '=' RDO_IDENTIF - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setFile( "OprIev_file", CONVERTER->stack().pop($4)->value().getIdentificator() ); - } - | smr_descr RDO_OprIev_file '=' error - { - CONVERTER->error().error( @3, @4, "Ожидается имя файла операций" ); - } - | smr_descr RDO_OprIev_file error - { - CONVERTER->error().error( @2, "Ожидается '='" ); - } - | smr_descr RDO_Frame_file '=' RDO_IDENTIF - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setFile( "Frame_file", CONVERTER->stack().pop($4)->value().getIdentificator() ); - } - | smr_descr RDO_Frame_file '=' error - { - CONVERTER->error().error( @3, @4, "Ожидается имя файла анимации" ); - } - | smr_descr RDO_Frame_file error - { - CONVERTER->error().error( @2, "Ожидается '='" ); - } - | smr_descr RDO_Statistic_file '=' RDO_IDENTIF - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setFile( "Statistic_file", CONVERTER->stack().pop($4)->value().getIdentificator() ); - } - | smr_descr RDO_Statistic_file '=' error - { - CONVERTER->error().error( @3, @4, "Ожидается имя файла собираемых показателей" ); - } - | smr_descr RDO_Statistic_file error - { - CONVERTER->error().error( @2, "Ожидается '='" ); - } - | smr_descr RDO_Results_file '=' RDO_IDENTIF - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setFile( "Results_file", CONVERTER->stack().pop($4)->value().getIdentificator() ); - } - | smr_descr RDO_Results_file '=' error - { - CONVERTER->error().error( @3, @4, "Ожидается имя файла результатов" ); - } - | smr_descr RDO_Results_file error - { - CONVERTER->error().error( @2, "Ожидается '='" ); - } - | smr_descr RDO_Trace_file '=' RDO_IDENTIF - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setFile( "Trace_file", CONVERTER->stack().pop($4)->value().getIdentificator() ); - } - | smr_descr RDO_Trace_file '=' error - { - CONVERTER->error().error( @3, @4, "Ожидается имя файла трассировки" ); - } - | smr_descr RDO_Trace_file error - { - CONVERTER->error().error( @2, "Ожидается '='" ); - } - | smr_descr RDO_External_Model RDO_IDENTIF '=' RDO_IDENTIF - { + : /* empty */ + | smr_descr RDO_Resource_file '=' RDO_IDENTIF + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setFile( "Resource_file", CONVERTER->stack().pop($4)->value().getIdentificator() ); + } + | smr_descr RDO_Resource_file '=' error + { + CONVERTER->error().error( @3, @4, "Ожидается имя файла ресурсов" ); + } + | smr_descr RDO_Resource_file error + { + CONVERTER->error().error( @2, "Ожидается '='" ); + } + | smr_descr RDO_OprIev_file '=' RDO_IDENTIF + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setFile( "OprIev_file", CONVERTER->stack().pop($4)->value().getIdentificator() ); + } + | smr_descr RDO_OprIev_file '=' error + { + CONVERTER->error().error( @3, @4, "Ожидается имя файла операций" ); + } + | smr_descr RDO_OprIev_file error + { + CONVERTER->error().error( @2, "Ожидается '='" ); + } + | smr_descr RDO_Frame_file '=' RDO_IDENTIF + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setFile( "Frame_file", CONVERTER->stack().pop($4)->value().getIdentificator() ); + } + | smr_descr RDO_Frame_file '=' error + { + CONVERTER->error().error( @3, @4, "Ожидается имя файла анимации" ); + } + | smr_descr RDO_Frame_file error + { + CONVERTER->error().error( @2, "Ожидается '='" ); + } + | smr_descr RDO_Statistic_file '=' RDO_IDENTIF + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setFile( "Statistic_file", CONVERTER->stack().pop($4)->value().getIdentificator() ); + } + | smr_descr RDO_Statistic_file '=' error + { + CONVERTER->error().error( @3, @4, "Ожидается имя файла собираемых показателей" ); + } + | smr_descr RDO_Statistic_file error + { + CONVERTER->error().error( @2, "Ожидается '='" ); + } + | smr_descr RDO_Results_file '=' RDO_IDENTIF + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setFile( "Results_file", CONVERTER->stack().pop($4)->value().getIdentificator() ); + } + | smr_descr RDO_Results_file '=' error + { + CONVERTER->error().error( @3, @4, "Ожидается имя файла результатов" ); + } + | smr_descr RDO_Results_file error + { + CONVERTER->error().error( @2, "Ожидается '='" ); + } + | smr_descr RDO_Trace_file '=' RDO_IDENTIF + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setFile( "Trace_file", CONVERTER->stack().pop($4)->value().getIdentificator() ); + } + | smr_descr RDO_Trace_file '=' error + { + CONVERTER->error().error( @3, @4, "Ожидается имя файла трассировки" ); + } + | smr_descr RDO_Trace_file error + { + CONVERTER->error().error( @2, "Ожидается '='" ); + } + | smr_descr RDO_External_Model RDO_IDENTIF '=' RDO_IDENTIF + { #ifdef CORBA_ENABLE - const std::string alias = CONVERTER->stack().pop($3)->value().getIdentificator(); - const std::string model = CONVERTER->stack().pop($5)->value().getIdentificator(); - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setExternalModelName(alias, model); + const std::string alias = CONVERTER->stack().pop($3)->value().getIdentificator(); + const std::string model = CONVERTER->stack().pop($5)->value().getIdentificator(); + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setExternalModelName(alias, model); #else - CONVERTER->error().error(@2, "Данная версия РДО не поддерживает распределенные модели (по технологии CORBA)"); + CONVERTER->error().error(@2, "Данная версия РДО не поддерживает распределенные модели (по технологии CORBA)"); #endif - } - | smr_descr RDO_External_Model RDO_IDENTIF '=' error - { + } + | smr_descr RDO_External_Model RDO_IDENTIF '=' error + { #ifdef CORBA_ENABLE - CONVERTER->error().error( @4, @5, "Ожидается путь и название внешней модели" ); + CONVERTER->error().error( @4, @5, "Ожидается путь и название внешней модели" ); #else - CONVERTER->error().error(@2, "Данная версия РДО не поддерживает распределенные модели (по технологии CORBA)"); + CONVERTER->error().error(@2, "Данная версия РДО не поддерживает распределенные модели (по технологии CORBA)"); #endif - } - | smr_descr RDO_External_Model RDO_IDENTIF error - { + } + | smr_descr RDO_External_Model RDO_IDENTIF error + { #ifdef CORBA_ENABLE - CONVERTER->error().error( @3, "Ожидается '='" ); + CONVERTER->error().error( @3, "Ожидается '='" ); #else - CONVERTER->error().error(@2, "Данная версия РДО не поддерживает распределенные модели (по технологии CORBA)"); + CONVERTER->error().error(@2, "Данная версия РДО не поддерживает распределенные модели (по технологии CORBA)"); #endif - } - | smr_descr RDO_External_Model error - { + } + | smr_descr RDO_External_Model error + { #ifdef CORBA_ENABLE - CONVERTER->error().error( @2, "Ожидается псевдоним внешей модели" ); + CONVERTER->error().error( @2, "Ожидается псевдоним внешей модели" ); #else - CONVERTER->error().error(@2, "Данная версия РДО не поддерживает распределенные модели (по технологии CORBA)"); + CONVERTER->error().error(@2, "Данная версия РДО не поддерживает распределенные модели (по технологии CORBA)"); #endif - } - | smr_descr error - ; + } + | smr_descr error + ; %% diff --git a/converter/smr2rdox/grammar/rdosmr_sim.y b/converter/smr2rdox/grammar/rdosmr_sim.y index 7b640a21c..8384b3f5b 100644 --- a/converter/smr2rdox/grammar/rdosmr_sim.y +++ b/converter/smr2rdox/grammar/rdosmr_sim.y @@ -1,13 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdosmr_sim.y - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \date - \brief Синтаксис описания информации о прогоне (режим анимации, инициализация списка событий, терминальное условие и т.д.) - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -16,175 +6,175 @@ %pure-parser %param {void* lexer} -%token RDO_Resource_type 257 -%token RDO_permanent 258 -%token RDO_Parameters 259 -%token RDO_integer 260 -%token RDO_real 261 -%token RDO_End 262 -%token RDO_temporary 263 -%token RDO_IDENTIF 264 -%token RDO_INT_CONST 265 -%token RDO_REAL_CONST 266 -%token RDO_such_as 267 -%token RDO_dblpoint 268 -%token RDO_Resources 269 -%token RDO_trace 270 -%token RDO_no_trace 271 -%token RDO_IDENTIF_COLON 272 -%token RDO_Constant 273 -%token RDO_Body 274 -%token RDO_Function 275 -%token RDO_Type 276 -%token RDO_algorithmic 277 -%token RDO_table 278 -%token RDO_list 279 -%token RDO_Exist 281 -%token RDO_Not_Exist 282 -%token RDO_For_All 283 -%token RDO_Not_For_All 284 -%token RDO_neq 285 -%token RDO_leq 286 -%token RDO_geq 287 -%token RDO_NoCheck 288 -%token RDO_Calculate_if 289 -%token RDO_or 290 -%token RDO_and 291 -%token RDO_Sequence 292 -%token RDO_uniform 293 -%token RDO_exponential 294 -%token RDO_normal 295 -%token RDO_by_hist 296 -%token RDO_enumerative 297 - -%token RDO_Pattern 298 -%token RDO_operation 299 -%token RDO_irregular_event 300 -%token RDO_rule 301 -%token RDO_keyboard 302 -%token RDO_Relevant_resources 303 -%token RDO_Keep 304 -%token RDO_Create 305 -%token RDO_Erase 306 -%token RDO_NonExist 307 -%token RDO_IDENTIF_NoChange 308 -%token RDO_Time 309 -%token RDO_Choice 310 -%token RDO_from 311 -%token RDO_first 312 -%token RDO_Convert_begin 313 -%token RDO_Convert_end 314 -%token RDO_Convert_rule 315 -%token RDO_Convert_event 316 -%token RDO_with_max 317 -%token RDO_with_min 318 -%token RDO_set 319 -%token RDO_IDENTIF_NoChange_NoChange 320 -%token RDO_Operations 321 - -%token RDO_Results 322 -%token RDO_watch_par 323 -%token RDO_watch_state 324 -%token RDO_watch_quant 325 -%token RDO_watch_value 326 -%token RDO_get_value 327 - -%token RDO_Model_name 328 -%token RDO_Resource_file 329 -%token RDO_OprIev_file 330 -%token RDO_Frame_file 331 -%token RDO_Statistic_file 332 -%token RDO_Results_file 333 -%token RDO_Trace_file 334 -%token RDO_Show_mode 335 -%token RDO_Frame_number 336 -%token RDO_Show_rate 337 -%token RDO_Run_StartTime 338 -%token RDO_Trace_StartTime 339 -%token RDO_Trace_EndTime 340 -%token RDO_Terminate_if 341 -%token RDO_Break_point 342 -%token RDO_Seed 343 -%token RDO_NoShow 344 -%token RDO_Monitor 345 -%token RDO_Animation 346 -%token RDO_NoChange 347 - -%token RDO_Decision_point 348 -%token RDO_search 349 -%token RDO_trace_stat 350 -%token RDO_trace_tops 351 -%token RDO_trace_all 352 -%token RDO_Condition 353 -%token RDO_Term_condition 354 -%token RDO_Evaluate_by 355 -%token RDO_Compare_tops 356 -%token RDO_NO 357 -%token RDO_YES 358 -%token RDO_Activities 359 -%token RDO_value_before 360 -%token RDO_value_after 361 -%token RDO_some 362 -%token RDO_Process 363 -%token RDO_SEIZE 364 -%token RDO_GENERATE 365 -%token RDO_TERMINATE 366 -%token RDO_ADVANCE 367 -%token RDO_RELEASE 368 -%token RDO_if 369 -%token RDO_CF 370 -%token RDO_Priority 371 -%token RDO_prior 372 -%token RDO_Parent 373 - -%token RDO_Frame 400 -%token RDO_Show_if 401 -%token RDO_Back_picture 402 -%token RDO_Show 403 -%token RDO_frm_cell 404 -%token RDO_text 405 -%token RDO_bitmap 406 -%token RDO_s_bmp 407 -%token RDO_rect 408 -%token RDO_r_rect 409 -%token RDO_line 410 -%token RDO_ellipse 411 -%token RDO_triang 412 -%token RDO_active 413 -%token RDO_ruler 414 -%token RDO_space 415 -%token RDO_color_transparent 416 -%token RDO_color_last 417 -%token RDO_color_white 418 -%token RDO_color_black 419 -%token RDO_color_red 420 -%token RDO_color_green 421 -%token RDO_color_blue 422 -%token RDO_color_cyan 423 -%token RDO_color_magenta 424 -%token RDO_color_yellow 425 -%token RDO_color_gray 426 - -%token RDO_IDENTIF_RELRES 427 -%token RDO_typedef 428 -%token RDO_enum 429 - -%token RDO_STRING_CONST 430 -%token RDO_Select 431 -%token RDO_Size 432 -%token RDO_Empty 433 -%token RDO_not 434 -%token RDO_UMINUS 435 -%token RDO_string 436 -%token RDO_bool 437 -%token RDO_BOOL_CONST 438 -%token RDO_Fuzzy 439 -%token RDO_Fuzzy_Term 440 -%token RDO_eq 441 -%token RDO_External_Model 442 -%token RDO_QUEUE 443 -%token RDO_DEPART 444 -%token RDO_ASSIGN 445 +%token RDO_Resource_type 257 +%token RDO_permanent 258 +%token RDO_Parameters 259 +%token RDO_integer 260 +%token RDO_real 261 +%token RDO_End 262 +%token RDO_temporary 263 +%token RDO_IDENTIF 264 +%token RDO_INT_CONST 265 +%token RDO_REAL_CONST 266 +%token RDO_such_as 267 +%token RDO_dblpoint 268 +%token RDO_Resources 269 +%token RDO_trace 270 +%token RDO_no_trace 271 +%token RDO_IDENTIF_COLON 272 +%token RDO_Constant 273 +%token RDO_Body 274 +%token RDO_Function 275 +%token RDO_Type 276 +%token RDO_algorithmic 277 +%token RDO_table 278 +%token RDO_list 279 +%token RDO_Exist 281 +%token RDO_Not_Exist 282 +%token RDO_For_All 283 +%token RDO_Not_For_All 284 +%token RDO_neq 285 +%token RDO_leq 286 +%token RDO_geq 287 +%token RDO_NoCheck 288 +%token RDO_Calculate_if 289 +%token RDO_or 290 +%token RDO_and 291 +%token RDO_Sequence 292 +%token RDO_uniform 293 +%token RDO_exponential 294 +%token RDO_normal 295 +%token RDO_by_hist 296 +%token RDO_enumerative 297 + +%token RDO_Pattern 298 +%token RDO_operation 299 +%token RDO_irregular_event 300 +%token RDO_rule 301 +%token RDO_keyboard 302 +%token RDO_Relevant_resources 303 +%token RDO_Keep 304 +%token RDO_Create 305 +%token RDO_Erase 306 +%token RDO_NonExist 307 +%token RDO_IDENTIF_NoChange 308 +%token RDO_Time 309 +%token RDO_Choice 310 +%token RDO_from 311 +%token RDO_first 312 +%token RDO_Convert_begin 313 +%token RDO_Convert_end 314 +%token RDO_Convert_rule 315 +%token RDO_Convert_event 316 +%token RDO_with_max 317 +%token RDO_with_min 318 +%token RDO_set 319 +%token RDO_IDENTIF_NoChange_NoChange 320 +%token RDO_Operations 321 + +%token RDO_Results 322 +%token RDO_watch_par 323 +%token RDO_watch_state 324 +%token RDO_watch_quant 325 +%token RDO_watch_value 326 +%token RDO_get_value 327 + +%token RDO_Model_name 328 +%token RDO_Resource_file 329 +%token RDO_OprIev_file 330 +%token RDO_Frame_file 331 +%token RDO_Statistic_file 332 +%token RDO_Results_file 333 +%token RDO_Trace_file 334 +%token RDO_Show_mode 335 +%token RDO_Frame_number 336 +%token RDO_Show_rate 337 +%token RDO_Run_StartTime 338 +%token RDO_Trace_StartTime 339 +%token RDO_Trace_EndTime 340 +%token RDO_Terminate_if 341 +%token RDO_Break_point 342 +%token RDO_Seed 343 +%token RDO_NoShow 344 +%token RDO_Monitor 345 +%token RDO_Animation 346 +%token RDO_NoChange 347 + +%token RDO_Decision_point 348 +%token RDO_search 349 +%token RDO_trace_stat 350 +%token RDO_trace_tops 351 +%token RDO_trace_all 352 +%token RDO_Condition 353 +%token RDO_Term_condition 354 +%token RDO_Evaluate_by 355 +%token RDO_Compare_tops 356 +%token RDO_NO 357 +%token RDO_YES 358 +%token RDO_Activities 359 +%token RDO_value_before 360 +%token RDO_value_after 361 +%token RDO_some 362 +%token RDO_Process 363 +%token RDO_SEIZE 364 +%token RDO_GENERATE 365 +%token RDO_TERMINATE 366 +%token RDO_ADVANCE 367 +%token RDO_RELEASE 368 +%token RDO_if 369 +%token RDO_CF 370 +%token RDO_Priority 371 +%token RDO_prior 372 +%token RDO_Parent 373 + +%token RDO_Frame 400 +%token RDO_Show_if 401 +%token RDO_Back_picture 402 +%token RDO_Show 403 +%token RDO_frm_cell 404 +%token RDO_text 405 +%token RDO_bitmap 406 +%token RDO_s_bmp 407 +%token RDO_rect 408 +%token RDO_r_rect 409 +%token RDO_line 410 +%token RDO_ellipse 411 +%token RDO_triang 412 +%token RDO_active 413 +%token RDO_ruler 414 +%token RDO_space 415 +%token RDO_color_transparent 416 +%token RDO_color_last 417 +%token RDO_color_white 418 +%token RDO_color_black 419 +%token RDO_color_red 420 +%token RDO_color_green 421 +%token RDO_color_blue 422 +%token RDO_color_cyan 423 +%token RDO_color_magenta 424 +%token RDO_color_yellow 425 +%token RDO_color_gray 426 + +%token RDO_IDENTIF_RELRES 427 +%token RDO_typedef 428 +%token RDO_enum 429 + +%token RDO_STRING_CONST 430 +%token RDO_Select 431 +%token RDO_Size 432 +%token RDO_Empty 433 +%token RDO_not 434 +%token RDO_UMINUS 435 +%token RDO_string 436 +%token RDO_bool 437 +%token RDO_BOOL_CONST 438 +%token RDO_Fuzzy 439 +%token RDO_Fuzzy_Term 440 +%token RDO_eq 441 +%token RDO_External_Model 442 +%token RDO_QUEUE 443 +%token RDO_DEPART 444 +%token RDO_ASSIGN 445 %{ @@ -223,265 +213,265 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE %% smr_show_mode - : RDO_NoShow - { - $$ = rdo::service::simulation::SM_NoShow; - } - | RDO_Monitor - { - $$ = rdo::service::simulation::SM_Monitor; - } - | RDO_Animation - { - $$ = rdo::service::simulation::SM_Animation; - } - ; + : RDO_NoShow + { + $$ = (int)rdo::service::simulation::ShowMode::NoShow; + } + | RDO_Monitor + { + $$ = (int)rdo::service::simulation::ShowMode::Monitor; + } + | RDO_Animation + { + $$ = (int)rdo::service::simulation::ShowMode::Animation; + } + ; smr_cond - : /* empty */ - | smr_cond RDO_Model_name '=' RDO_IDENTIF - { - LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); - ASSERT(pDelete); - CONVERTER->insertDocUpdate(pDelete); - } - | smr_cond RDO_Resource_file '=' RDO_IDENTIF - { - LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); - ASSERT(pDelete); - CONVERTER->insertDocUpdate(pDelete); - } - | smr_cond RDO_OprIev_file '=' RDO_IDENTIF - { - LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); - ASSERT(pDelete); - CONVERTER->insertDocUpdate(pDelete); - } - | smr_cond RDO_Frame_file '=' RDO_IDENTIF - { - LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); - ASSERT(pDelete); - CONVERTER->insertDocUpdate(pDelete); - } - | smr_cond RDO_Statistic_file '=' RDO_IDENTIF - { - LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); - ASSERT(pDelete); - CONVERTER->insertDocUpdate(pDelete); - } - | smr_cond RDO_Results_file '=' RDO_IDENTIF - { - LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); - ASSERT(pDelete); - CONVERTER->insertDocUpdate(pDelete); - } - | smr_cond RDO_Trace_file '=' RDO_IDENTIF - { - LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); - ASSERT(pDelete); - CONVERTER->insertDocUpdate(pDelete); - } - | smr_cond RDO_External_Model RDO_IDENTIF '=' RDO_IDENTIF - | smr_cond RDO_Show_mode '=' smr_show_mode - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setShowMode((rdo::service::simulation::ShowMode)$4); - } - | smr_cond RDO_Show_mode '=' error - { - CONVERTER->error().error(@3, @4, "Ожидается режим анимации"); - } - | smr_cond RDO_Show_mode error - { - CONVERTER->error().error(@2, "Ожидается '='"); - } - | smr_cond RDO_Frame_number '=' RDO_INT_CONST - { - CONVERTER->stack().pop($4); - } - | smr_cond RDO_Frame_number '=' error - { - CONVERTER->error().error(@3, @4, "Ожидается начальный номер кадра"); - } - | smr_cond RDO_Frame_number error - { - CONVERTER->error().error(@2, "Ожидается '='"); - } - | smr_cond RDO_Show_rate '=' RDO_REAL_CONST - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setShowRate(CONVERTER->stack().pop($4)->value().getDouble(), @4); - } - | smr_cond RDO_Show_rate '=' RDO_INT_CONST - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setShowRate(CONVERTER->stack().pop($4)->value().getInt(), @4); - } - | smr_cond RDO_Show_rate '=' error - { - CONVERTER->error().error(@3, @4, "Ожидается масштабный коэффициент"); - } - | smr_cond RDO_Show_rate error - { - CONVERTER->error().error(@2, "Ожидается '='"); - } - | smr_cond RDO_Run_StartTime '=' RDO_REAL_CONST - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setRunStartTime(CONVERTER->stack().pop($4)->value().getDouble(), @4); - } - | smr_cond RDO_Run_StartTime '=' RDO_INT_CONST - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setRunStartTime(CONVERTER->stack().pop($4)->value().getInt(), @4); - } - | smr_cond RDO_Run_StartTime '=' error - { - CONVERTER->error().error(@3, @4, "Ожидается начальное модельное время"); - } - | smr_cond RDO_Run_StartTime error - { - CONVERTER->error().error(@2, "Ожидается '='"); - } - | smr_cond RDO_Trace_StartTime '=' RDO_REAL_CONST - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setTraceStartTime(CONVERTER->stack().pop($4)->value().getDouble(), @4); - } - | smr_cond RDO_Trace_StartTime '=' RDO_INT_CONST - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setTraceStartTime(CONVERTER->stack().pop($4)->value().getInt(), @4); - } - | smr_cond RDO_Trace_StartTime '=' error - { - CONVERTER->error().error(@3, @4, "Ожидается начальное время трассировки"); - } - | smr_cond RDO_Trace_StartTime error - { - CONVERTER->error().error(@2, "Ожидается '='"); - } - | smr_cond RDO_Trace_EndTime '=' RDO_REAL_CONST - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setTraceEndTime(CONVERTER->stack().pop($4)->value().getDouble(), @4); - } - | smr_cond RDO_Trace_EndTime '=' RDO_INT_CONST - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setTraceEndTime(CONVERTER->stack().pop($4)->value().getInt(), @4); - } - | smr_cond RDO_Trace_EndTime '=' error - { - CONVERTER->error().error(@3, @4, "Ожидается конечное время трассировки"); - } - | smr_cond RDO_Trace_EndTime error - { - CONVERTER->error().error(@2, "Ожидается '='"); - } - | smr_cond RDO_Terminate_if fun_logic - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($3); - ASSERT(pLogic); - CONVERTER->getSMR()->setTerminateIf(pLogic); - } - | smr_cond RDO_Terminate_if error - { - CONVERTER->error().error(@2, @3, "Ошибка логического выражения в терминальном условии"); - } - | smr_cond RDO_Break_point RDO_IDENTIF fun_logic - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($4); - ASSERT(pLogic); - pSMR->insertBreakPoint(CONVERTER->stack().pop($3)->src_info(), pLogic); - } - | smr_cond RDO_Break_point RDO_IDENTIF error - { - CONVERTER->error().error(@4, "Ошибка логического выражения в точке останова"); - } - | smr_cond RDO_Break_point error - { - CONVERTER->error().error(@2, @3, "Ожидается имя точки останова"); - } - | smr_cond RDO_IDENTIF '=' fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($4); - ASSERT(pArithm); - CONVERTER->getSMR()->setConstValue(CONVERTER->stack().pop($2)->src_info(), pArithm); - } - | smr_cond RDO_IDENTIF '=' error - { - CONVERTER->error().error(@3, @4, "Ошибка в арифметическом выражении"); - } - | smr_cond RDO_IDENTIF error - { - CONVERTER->error().error(@2, "Ожидается '='"); - } - | smr_cond RDO_IDENTIF '.' RDO_IDENTIF '=' fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($6); - ASSERT(pArithm); - CONVERTER->getSMR()->setResParValue(CONVERTER->stack().pop($2)->src_info(), CONVERTER->stack().pop($4)->src_info(), pArithm); - } - | smr_cond RDO_IDENTIF '.' RDO_IDENTIF '=' error - { - CONVERTER->error().error(@5, @6, "Ошибка в арифметическом выражении"); - } - | smr_cond RDO_IDENTIF '.' RDO_IDENTIF error - { - CONVERTER->error().error(@4, "Ожидается '='"); - } - | smr_cond RDO_IDENTIF '.' error - { - const std::string name = CONVERTER->stack().pop($2)->value().getIdentificator(); - LPRDORSSResource pResource = CONVERTER->findRSSResource(name); - if (pResource) - { - CONVERTER->error().error(@3, @4, "Ожидается параметр"); - } - else - { - LPRDOFUNSequence pSequence = CONVERTER->findFUNSequence(name); - if (pSequence) - { - CONVERTER->error().error(@3, @4, "Ожидается ключевое слово Seed"); - } - else - { - CONVERTER->error().error(@2, "Неизвестный параметр или последовательность"); - } - } - } - | smr_cond RDO_IDENTIF '.' RDO_Seed '=' RDO_INT_CONST - { - LPRDOSMR pSMR = CONVERTER->getSMR(); - ASSERT(pSMR); - pSMR->setSeed(CONVERTER->stack().pop($2)->src_info(), CONVERTER->stack().pop($6)->value().getInt()); - } - | smr_cond RDO_IDENTIF '.' RDO_Seed '=' error - { - CONVERTER->error().error(@5, @6, "Ожидается база генератора"); - } - | smr_cond RDO_IDENTIF '.' RDO_Seed error - { - CONVERTER->error().error(@4, "Ожидается '='"); - } - | smr_cond error - { - CONVERTER->error().error(@2, "Неизвестная ошибка"); - } - ; + : /* empty */ + | smr_cond RDO_Model_name '=' RDO_IDENTIF + { + LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); + ASSERT(pDelete); + CONVERTER->insertDocUpdate(pDelete); + } + | smr_cond RDO_Resource_file '=' RDO_IDENTIF + { + LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); + ASSERT(pDelete); + CONVERTER->insertDocUpdate(pDelete); + } + | smr_cond RDO_OprIev_file '=' RDO_IDENTIF + { + LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); + ASSERT(pDelete); + CONVERTER->insertDocUpdate(pDelete); + } + | smr_cond RDO_Frame_file '=' RDO_IDENTIF + { + LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); + ASSERT(pDelete); + CONVERTER->insertDocUpdate(pDelete); + } + | smr_cond RDO_Statistic_file '=' RDO_IDENTIF + { + LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); + ASSERT(pDelete); + CONVERTER->insertDocUpdate(pDelete); + } + | smr_cond RDO_Results_file '=' RDO_IDENTIF + { + LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); + ASSERT(pDelete); + CONVERTER->insertDocUpdate(pDelete); + } + | smr_cond RDO_Trace_file '=' RDO_IDENTIF + { + LPDocUpdate pDelete = rdo::Factory::create(@2.m_first_seek, @4.m_last_seek); + ASSERT(pDelete); + CONVERTER->insertDocUpdate(pDelete); + } + | smr_cond RDO_External_Model RDO_IDENTIF '=' RDO_IDENTIF + | smr_cond RDO_Show_mode '=' smr_show_mode + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setShowMode((rdo::service::simulation::ShowMode)$4); + } + | smr_cond RDO_Show_mode '=' error + { + CONVERTER->error().error(@3, @4, "Ожидается режим анимации"); + } + | smr_cond RDO_Show_mode error + { + CONVERTER->error().error(@2, "Ожидается '='"); + } + | smr_cond RDO_Frame_number '=' RDO_INT_CONST + { + CONVERTER->stack().pop($4); + } + | smr_cond RDO_Frame_number '=' error + { + CONVERTER->error().error(@3, @4, "Ожидается начальный номер кадра"); + } + | smr_cond RDO_Frame_number error + { + CONVERTER->error().error(@2, "Ожидается '='"); + } + | smr_cond RDO_Show_rate '=' RDO_REAL_CONST + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setShowRate(CONVERTER->stack().pop($4)->value().getDouble(), @4); + } + | smr_cond RDO_Show_rate '=' RDO_INT_CONST + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setShowRate(CONVERTER->stack().pop($4)->value().getInt(), @4); + } + | smr_cond RDO_Show_rate '=' error + { + CONVERTER->error().error(@3, @4, "Ожидается масштабный коэффициент"); + } + | smr_cond RDO_Show_rate error + { + CONVERTER->error().error(@2, "Ожидается '='"); + } + | smr_cond RDO_Run_StartTime '=' RDO_REAL_CONST + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setRunStartTime(CONVERTER->stack().pop($4)->value().getDouble(), @4); + } + | smr_cond RDO_Run_StartTime '=' RDO_INT_CONST + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setRunStartTime(CONVERTER->stack().pop($4)->value().getInt(), @4); + } + | smr_cond RDO_Run_StartTime '=' error + { + CONVERTER->error().error(@3, @4, "Ожидается начальное модельное время"); + } + | smr_cond RDO_Run_StartTime error + { + CONVERTER->error().error(@2, "Ожидается '='"); + } + | smr_cond RDO_Trace_StartTime '=' RDO_REAL_CONST + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setTraceStartTime(CONVERTER->stack().pop($4)->value().getDouble(), @4); + } + | smr_cond RDO_Trace_StartTime '=' RDO_INT_CONST + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setTraceStartTime(CONVERTER->stack().pop($4)->value().getInt(), @4); + } + | smr_cond RDO_Trace_StartTime '=' error + { + CONVERTER->error().error(@3, @4, "Ожидается начальное время трассировки"); + } + | smr_cond RDO_Trace_StartTime error + { + CONVERTER->error().error(@2, "Ожидается '='"); + } + | smr_cond RDO_Trace_EndTime '=' RDO_REAL_CONST + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setTraceEndTime(CONVERTER->stack().pop($4)->value().getDouble(), @4); + } + | smr_cond RDO_Trace_EndTime '=' RDO_INT_CONST + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setTraceEndTime(CONVERTER->stack().pop($4)->value().getInt(), @4); + } + | smr_cond RDO_Trace_EndTime '=' error + { + CONVERTER->error().error(@3, @4, "Ожидается конечное время трассировки"); + } + | smr_cond RDO_Trace_EndTime error + { + CONVERTER->error().error(@2, "Ожидается '='"); + } + | smr_cond RDO_Terminate_if fun_logic + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($3); + ASSERT(pLogic); + CONVERTER->getSMR()->setTerminateIf(pLogic); + } + | smr_cond RDO_Terminate_if error + { + CONVERTER->error().error(@2, @3, "Ошибка логического выражения в терминальном условии"); + } + | smr_cond RDO_Break_point RDO_IDENTIF fun_logic + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($4); + ASSERT(pLogic); + pSMR->insertBreakPoint(CONVERTER->stack().pop($3)->src_info(), pLogic); + } + | smr_cond RDO_Break_point RDO_IDENTIF error + { + CONVERTER->error().error(@4, "Ошибка логического выражения в точке останова"); + } + | smr_cond RDO_Break_point error + { + CONVERTER->error().error(@2, @3, "Ожидается имя точки останова"); + } + | smr_cond RDO_IDENTIF '=' fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($4); + ASSERT(pArithm); + CONVERTER->getSMR()->setConstValue(CONVERTER->stack().pop($2)->src_info(), pArithm); + } + | smr_cond RDO_IDENTIF '=' error + { + CONVERTER->error().error(@3, @4, "Ошибка в арифметическом выражении"); + } + | smr_cond RDO_IDENTIF error + { + CONVERTER->error().error(@2, "Ожидается '='"); + } + | smr_cond RDO_IDENTIF '.' RDO_IDENTIF '=' fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($6); + ASSERT(pArithm); + CONVERTER->getSMR()->setResParValue(CONVERTER->stack().pop($2)->src_info(), CONVERTER->stack().pop($4)->src_info(), pArithm); + } + | smr_cond RDO_IDENTIF '.' RDO_IDENTIF '=' error + { + CONVERTER->error().error(@5, @6, "Ошибка в арифметическом выражении"); + } + | smr_cond RDO_IDENTIF '.' RDO_IDENTIF error + { + CONVERTER->error().error(@4, "Ожидается '='"); + } + | smr_cond RDO_IDENTIF '.' error + { + const std::string name = CONVERTER->stack().pop($2)->value().getIdentificator(); + LPRDORSSResource pResource = CONVERTER->findRSSResource(name); + if (pResource) + { + CONVERTER->error().error(@3, @4, "Ожидается параметр"); + } + else + { + LPRDOFUNSequence pSequence = CONVERTER->findFUNSequence(name); + if (pSequence) + { + CONVERTER->error().error(@3, @4, "Ожидается ключевое слово Seed"); + } + else + { + CONVERTER->error().error(@2, "Неизвестный параметр или последовательность"); + } + } + } + | smr_cond RDO_IDENTIF '.' RDO_Seed '=' RDO_INT_CONST + { + LPRDOSMR pSMR = CONVERTER->getSMR(); + ASSERT(pSMR); + pSMR->setSeed(CONVERTER->stack().pop($2)->src_info(), CONVERTER->stack().pop($6)->value().getInt()); + } + | smr_cond RDO_IDENTIF '.' RDO_Seed '=' error + { + CONVERTER->error().error(@5, @6, "Ожидается база генератора"); + } + | smr_cond RDO_IDENTIF '.' RDO_Seed error + { + CONVERTER->error().error(@4, "Ожидается '='"); + } + | smr_cond error + { + CONVERTER->error().error(@2, "Неизвестная ошибка"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Общие составные токены для всех объектов РДО @@ -489,488 +479,488 @@ smr_cond // -------------------- Логические выражения // -------------------------------------------------------------------------------- fun_logic_eq - : '=' - { - LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); - ASSERT(pInsert); - CONVERTER->insertDocUpdate(pInsert); - - $$ = RDO_eq; - } - | RDO_eq - { - $$ = RDO_eq; - } - ; + : '=' + { + LPDocUpdate pInsert = rdo::Factory::create(@1.m_last_seek, "="); + ASSERT(pInsert); + CONVERTER->insertDocUpdate(pInsert); + + $$ = RDO_eq; + } + | RDO_eq + { + $$ = RDO_eq; + } + ; fun_logic - : fun_arithm fun_logic_eq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_neq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '<' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '>' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_leq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm RDO_geq fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_and fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_logic RDO_or fun_logic - { - LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pArithm); - LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_group - | fun_select_logic - | '[' fun_logic ']' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("[" + pLogic->src_text() + "]"); - $$ = CONVERTER->stack().push(pLogic); - } - | '(' fun_logic ')' - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("(" + pLogic->src_text() + ")"); - $$ = CONVERTER->stack().push(pLogic); - } - | RDO_not fun_logic - { - LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); - ASSERT(pLogic); - LPRDOFUNLogic pLogicNot = pLogic->operator_not(); - ASSERT(pLogicNot); - pLogicNot->setSrcPos (@1, @2); - pLogicNot->setSrcText("not " + pLogic->src_text()); - $$ = CONVERTER->stack().push(pLogicNot); - } - | '[' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | '(' fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - ; + : fun_arithm fun_logic_eq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_neq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '<' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '>' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_leq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm RDO_geq fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_and fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_logic RDO_or fun_logic + { + LPRDOFUNLogic pLogic1 = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic2 = CONVERTER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pArithm); + LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_group + | fun_select_logic + | '[' fun_logic ']' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("[" + pLogic->src_text() + "]"); + $$ = CONVERTER->stack().push(pLogic); + } + | '(' fun_logic ')' + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("(" + pLogic->src_text() + ")"); + $$ = CONVERTER->stack().push(pLogic); + } + | RDO_not fun_logic + { + LPRDOFUNLogic pLogic = CONVERTER->stack().pop($2); + ASSERT(pLogic); + LPRDOFUNLogic pLogicNot = pLogic->operator_not(); + ASSERT(pLogicNot); + pLogicNot->setSrcPos (@1, @2); + pLogicNot->setSrcText("not " + pLogic->src_text()); + $$ = CONVERTER->stack().push(pLogicNot); + } + | '[' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | '(' fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Арифметические выражения // -------------------------------------------------------------------------------- fun_arithm - : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } - | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } - | fun_arithm '+' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '-' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '*' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm '/' fun_arithm - { - LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); - ASSERT(pResult); - $$ = CONVERTER->stack().push(pResult); - } - | fun_arithm_func_call - | fun_select_arithm - | '(' fun_arithm ')' - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - pArithm->setSrcPos (@1, @3); - pArithm->setSrcText("(" + pArithm->src_text() + ")"); - $$ = CONVERTER->stack().push(pArithm); - } - | '-' fun_arithm %prec RDO_UMINUS - { - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); - ASSERT(pArithm); - RDOParserSrcInfo info; - info.setSrcPos (@1, @2); - info.setSrcText("-" + pArithm->src_text()); - $$ = CONVERTER->stack().push( - rdo::Factory::create( - rdo::Factory::create(pArithm->type(), info), - rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() - ) - ); - } - ; + : RDO_INT_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_REAL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_BOOL_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_STRING_CONST { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1))); } + | RDO_IDENTIF '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | RDO_IDENTIF_RELRES '.' RDO_IDENTIF { $$ = CONVERTER->stack().push(rdo::Factory::create(CONVERTER->stack().pop($1), CONVERTER->stack().pop($3))); } + | fun_arithm '+' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '-' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '*' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm '/' fun_arithm + { + LPRDOFUNArithm pArithm1 = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm2 = CONVERTER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); + ASSERT(pResult); + $$ = CONVERTER->stack().push(pResult); + } + | fun_arithm_func_call + | fun_select_arithm + | '(' fun_arithm ')' + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + pArithm->setSrcPos (@1, @3); + pArithm->setSrcText("(" + pArithm->src_text() + ")"); + $$ = CONVERTER->stack().push(pArithm); + } + | '-' fun_arithm %prec RDO_UMINUS + { + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($2); + ASSERT(pArithm); + RDOParserSrcInfo info; + info.setSrcPos (@1, @2); + info.setSrcText("-" + pArithm->src_text()); + $$ = CONVERTER->stack().push( + rdo::Factory::create( + rdo::Factory::create(pArithm->type(), info), + rdo::Factory::create(info.src_pos(), pArithm->createCalc()).object_parent_cast() + ) + ); + } + ; // -------------------------------------------------------------------------------- // -------------------- Функции и последовательности // -------------------------------------------------------------------------------- fun_arithm_func_call - : RDO_IDENTIF '(' ')' - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @3); - pFunParams->setSrcText(funName + "()"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @4); - pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | RDO_IDENTIF '(' error - { - CONVERTER->error().error(@3, "Ошибка в параметрах функции"); - } - ; + : RDO_IDENTIF '(' ')' + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @3); + pFunParams->setSrcText(funName + "()"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' fun_arithm_func_call_pars ')' + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + const std::string funName = CONVERTER->stack().pop($1)->value().getIdentificator(); + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @4); + pFunParams->setSrcText(funName + "(" + pFunParams->src_text() + ")"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | RDO_IDENTIF '(' error + { + CONVERTER->error().error(@3, "Ошибка в параметрах функции"); + } + ; fun_arithm_func_call_pars - : fun_arithm - { - LPRDOFUNParams pFunParams = rdo::Factory::create(); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars ',' fun_arithm - { - LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); - LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); - ASSERT(pFunParams); - ASSERT(pArithm ); - pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); - pFunParams->addParameter(pArithm); - $$ = CONVERTER->stack().push(pFunParams); - } - | fun_arithm_func_call_pars error - { - CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); - } - | fun_arithm_func_call_pars ',' error - { - CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); - } - ; + : fun_arithm + { + LPRDOFUNParams pFunParams = rdo::Factory::create(); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($1); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars ',' fun_arithm + { + LPRDOFUNParams pFunParams = CONVERTER->stack().pop($1); + LPRDOFUNArithm pArithm = CONVERTER->stack().pop($3); + ASSERT(pFunParams); + ASSERT(pArithm ); + pFunParams->setSrcText (pFunParams->src_text() + ", " + pArithm->src_text()); + pFunParams->addParameter(pArithm); + $$ = CONVERTER->stack().push(pFunParams); + } + | fun_arithm_func_call_pars error + { + CONVERTER->error().error(@2, "Ошибка в арифметическом выражении"); + } + | fun_arithm_func_call_pars ',' error + { + CONVERTER->error().error(@3, "Ошибка в арифметическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Групповые выражения // -------------------------------------------------------------------------------- fun_group_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_group_header - : fun_group_keyword '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - $$ = CONVERTER->stack().push(rdo::Factory::create((RDOFUNGroupLogic::FunGroupType)$1, pValue->src_info())); - } - | fun_group_keyword '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | fun_group_keyword error - { - CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); - } - ; + : fun_group_keyword '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + $$ = CONVERTER->stack().push(rdo::Factory::create(static_cast($1), pValue->src_info())); + } + | fun_group_keyword '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | fun_group_keyword error + { + CONVERTER->error().error(@1, "После имени функции ожидается октрывающаяся скобка"); + } + ; fun_group - : fun_group_header fun_logic ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pGroupFun); - ASSERT(pLogic ); - pGroupFun->setSrcPos(@1, @3); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); - } - | fun_group_header RDO_NoCheck ')' - { - LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); - ASSERT(pGroupFun); - pGroupFun->setSrcPos(@1, @3); - LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); - ASSERT(pTrueLogic); - pTrueLogic->setSrcPos (@2); - pTrueLogic->setSrcText("NoCheck"); - $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); - } - | fun_group_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_group_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_group_header fun_logic ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pGroupFun); + ASSERT(pLogic ); + pGroupFun->setSrcPos(@1, @3); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pLogic)); + } + | fun_group_header RDO_NoCheck ')' + { + LPRDOFUNGroupLogic pGroupFun = CONVERTER->stack().pop($1); + ASSERT(pGroupFun); + pGroupFun->setSrcPos(@1, @3); + LPRDOFUNLogic pTrueLogic = rdo::Factory::create(rdo::Factory::create(1), false); + ASSERT(pTrueLogic); + pTrueLogic->setSrcPos (@2); + pTrueLogic->setSrcText("NoCheck"); + $$ = CONVERTER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); + } + | fun_group_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_group_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Select // -------------------------------------------------------------------------------- fun_select_header - : RDO_Select '(' RDO_IDENTIF_COLON - { - LPRDOValue pValue = CONVERTER->stack().pop($3); - ASSERT(pValue); - LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); - ASSERT(pSelect); - pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); - $$ = CONVERTER->stack().push(pSelect); - } - | RDO_Select '(' error - { - CONVERTER->error().error(@3, "Ожидается имя типа"); - } - | RDO_Select error - { - CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); - } - ; + : RDO_Select '(' RDO_IDENTIF_COLON + { + LPRDOValue pValue = CONVERTER->stack().pop($3); + ASSERT(pValue); + LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); + ASSERT(pSelect); + pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); + $$ = CONVERTER->stack().push(pSelect); + } + | RDO_Select '(' error + { + CONVERTER->error().error(@3, "Ожидается имя типа"); + } + | RDO_Select error + { + CONVERTER->error().error(@1, "Ожидается октрывающаяся скобка"); + } + ; fun_select_body - : fun_select_header fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header RDO_NoCheck ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - RDOParserSrcInfo logicInfo(@2, "NoCheck"); - pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); - rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); - ASSERT(pCalc); - LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); - ASSERT(pLogic); - pLogic->setSrcInfo(logicInfo); - pSelect->initSelect(pLogic); - $$ = CONVERTER->stack().push(pSelect); - } - | fun_select_header fun_logic error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header RDO_NoCheck error - { - CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - | fun_select_header error - { - CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - ; + : fun_select_header fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($2); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header RDO_NoCheck ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + RDOParserSrcInfo logicInfo(@2, "NoCheck"); + pSelect->setSrcText(pSelect->src_text() + logicInfo.src_text() + ")"); + rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(1); + ASSERT(pCalc); + LPRDOFUNLogic pLogic = rdo::Factory::create(pCalc, true); + ASSERT(pLogic); + pLogic->setSrcInfo(logicInfo); + pSelect->initSelect(pLogic); + $$ = CONVERTER->stack().push(pSelect); + } + | fun_select_header fun_logic error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header RDO_NoCheck error + { + CONVERTER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + | fun_select_header error + { + CONVERTER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + ; fun_select_keyword - : RDO_Exist { $$ = RDOFUNGroupLogic::fgt_exist; } - | RDO_Not_Exist { $$ = RDOFUNGroupLogic::fgt_notexist; } - | RDO_For_All { $$ = RDOFUNGroupLogic::fgt_forall; } - | RDO_Not_For_All { $$ = RDOFUNGroupLogic::fgt_notforall; } - ; + : RDO_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::EXIST); } + | RDO_Not_Exist { $$ = static_cast(RDOFUNGroupLogic::Type::NOTEXIST); } + | RDO_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::FORALL); } + | RDO_Not_For_All { $$ = static_cast(RDOFUNGroupLogic::Type::NOTFORALL); } + ; fun_select_logic - : fun_select_body '.' fun_select_keyword '(' fun_logic ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcPos(@1, @6); - LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup((RDOFUNGroupLogic::FunGroupType)$3, pLogic); - ASSERT(pLogicSelect); - $$ = CONVERTER->stack().push(pLogicSelect); - } - | fun_select_body '.' fun_select_keyword '(' error - { - CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); - } - | fun_select_body '.' fun_select_keyword error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); - LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); - ASSERT(pLogic); - $$ = CONVERTER->stack().push(pLogic); - } - | fun_select_body '.' RDO_Empty '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - | fun_select_body '.' RDO_Empty error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' error - { - CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); - } - | fun_select_body error - { - CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); - } - ; + : fun_select_body '.' fun_select_keyword '(' fun_logic ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + LPRDOFUNLogic pLogic = CONVERTER->stack().pop ($5); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcPos(@1, @6); + LPRDOFUNLogic pLogicSelect = pSelect->createFunSelectGroup(static_cast($3), pLogic); + ASSERT(pLogicSelect); + $$ = CONVERTER->stack().push(pLogicSelect); + } + | fun_select_body '.' fun_select_keyword '(' error + { + CONVERTER->error().error(@4, @5, "Ошибка в логическом выражении"); + } + | fun_select_body '.' fun_select_keyword error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo emptyInfo(@3, @5, "Empty()"); + LPRDOFUNLogic pLogic = pSelect->createFunSelectEmpty(emptyInfo); + ASSERT(pLogic); + $$ = CONVERTER->stack().push(pLogic); + } + | fun_select_body '.' RDO_Empty '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + | fun_select_body '.' RDO_Empty error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' error + { + CONVERTER->error().error(@2, @3, "Ожидается метод списка ресурсов"); + } + | fun_select_body error + { + CONVERTER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); + } + ; fun_select_arithm - : fun_select_body '.' RDO_Size '(' ')' - { - LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); - LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); - ASSERT(pArithm); - $$ = CONVERTER->stack().push(pArithm); - } - | fun_select_body '.' RDO_Size error - { - CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); - } - | fun_select_body '.' RDO_Size '(' error - { - CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - ; + : fun_select_body '.' RDO_Size '(' ')' + { + LPRDOFUNSelect pSelect = CONVERTER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo sizeInfo(@3, @5, "Size()"); + LPRDOFUNArithm pArithm = pSelect->createFunSelectSize(sizeInfo); + ASSERT(pArithm); + $$ = CONVERTER->stack().push(pArithm); + } + | fun_select_body '.' RDO_Size error + { + CONVERTER->error().error(@3, "Ожидается октрывающаяся скобка"); + } + | fun_select_body '.' RDO_Size '(' error + { + CONVERTER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + ; %% diff --git a/converter/smr2rdox/namespace.h b/converter/smr2rdox/namespace.h index 962df0e96..319ba5466 100644 --- a/converter/smr2rdox/namespace.h +++ b/converter/smr2rdox/namespace.h @@ -1,13 +1,8 @@ -#ifndef _CONVERTER_SMR2RDOX_NAMESPACE_H_ -#define _CONVERTER_SMR2RDOX_NAMESPACE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS // -------------------------------------------------------------------------------- -//! \namespace rdo::converter::smr2rdox -//! \brief Пространство имен конвертора smr в rdox #define OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE namespace rdo { namespace converter { namespace smr2rdox { #define CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE }}}; - -#endif // _CONVERTER_SMR2RDOX_NAMESPACE_H_ diff --git a/converter/smr2rdox/param.cpp b/converter/smr2rdox/param.cpp index fd762bc81..651246156 100644 --- a/converter/smr2rdox/param.cpp +++ b/converter/smr2rdox/param.cpp @@ -9,19 +9,19 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE RDOParam::RDOParam(const std::string& name, const LPRDOTypeParam& pType, const LPRDOValue& pDefault) - : RDOParserSrcInfo(name ) - , m_pType (pType ) - , m_pDefault (pDefault ) + : RDOParserSrcInfo(name ) + , m_pType (pType ) + , m_pDefault (pDefault ) { - checkDefault(); + checkDefault(); } RDOParam::RDOParam(const RDOParserSrcInfo& src_info, const LPRDOTypeParam& pType, const LPRDOValue& pDefault) - : RDOParserSrcInfo(src_info) - , m_pType (pType ) - , m_pDefault (pDefault) + : RDOParserSrcInfo(src_info) + , m_pType (pType ) + , m_pDefault (pDefault) { - checkDefault(); + checkDefault(); } RDOParam::~RDOParam() @@ -29,11 +29,11 @@ RDOParam::~RDOParam() void RDOParam::checkDefault() { - if (m_pDefault && m_pDefault->defined()) - { - m_pType->type()->type_cast(m_pDefault->type(), m_pDefault->src_info(), this->src_info(), m_pDefault->src_info()); - m_pDefault = m_pType->type()->value_cast(m_pDefault, this->src_info(), m_pDefault->src_info()); - } + if (m_pDefault && m_pDefault->defined()) + { + m_pType->type()->type_cast(m_pDefault->type(), m_pDefault->src_info(), this->src_info(), m_pDefault->src_info()); + m_pDefault = m_pType->type()->value_cast(m_pDefault, this->src_info(), m_pDefault->src_info()); + } } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/param.h b/converter/smr2rdox/param.h index 869776b24..f8cec71c9 100644 --- a/converter/smr2rdox/param.h +++ b/converter/smr2rdox/param.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_PARAM_H_ -#define _CONVERTOR_PARAM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -15,27 +14,25 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOParam); class RDOParam - : public virtual rdo::counter_reference - , public RDOParserSrcInfo + : public virtual rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOParam) public: - const std::string& name() const { return src_info().src_text(); } - LPRDOTypeParam getType() const { return m_pType; } - const LPRDOValue& getDefault() const { return m_pDefault; } + const std::string& name() const { return src_info().src_text(); } + LPRDOTypeParam getType() const { return m_pType; } + const LPRDOValue& getDefault() const { return m_pDefault; } protected: - RDOParam(const std::string& name, const LPRDOTypeParam& pType, const LPRDOValue& pDefault = LPRDOValue(NULL)); - RDOParam(const RDOParserSrcInfo& src_info, const LPRDOTypeParam& pType, const LPRDOValue& pDefault = LPRDOValue(NULL)); - virtual ~RDOParam(); + RDOParam(const std::string& name, const LPRDOTypeParam& pType, const LPRDOValue& pDefault = LPRDOValue(NULL)); + RDOParam(const RDOParserSrcInfo& src_info, const LPRDOTypeParam& pType, const LPRDOValue& pDefault = LPRDOValue(NULL)); + virtual ~RDOParam(); private: - LPRDOTypeParam m_pType; - LPRDOValue m_pDefault; + LPRDOTypeParam m_pType; + LPRDOValue m_pDefault; - void checkDefault(); + void checkDefault(); }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_PARAM_H_ diff --git a/converter/smr2rdox/pch.h b/converter/smr2rdox/pch.h index 7c1d27a46..81b3917d4 100644 --- a/converter/smr2rdox/pch.h +++ b/converter/smr2rdox/pch.h @@ -1,12 +1,11 @@ -#ifndef _CONVERTOR_PCH_H_ -#define _CONVERTOR_PCH_H_ +#pragma once #ifdef COMPILER_VISUAL_STUDIO #pragma warning(disable: 4786) #endif -#ifndef WINVER //! Allow use of features specific to Windows XP or later. -#define WINVER 0x0501 //! Change this to the appropriate value to target other versions of Windows. +#ifndef WINVER // Allow use of features specific to Windows XP or later. +#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. #endif // ----------------------------------------------------------------------- INCLUDES @@ -26,5 +25,3 @@ #include "utils/src/common/rdocommon.h" #include "utils/src/debug/rdodebug.h" // -------------------------------------------------------------------------------- - -#endif // _CONVERTOR_PCH_H_ diff --git a/converter/smr2rdox/rdo_common/model_objects_convertor.h b/converter/smr2rdox/rdo_common/model_objects_convertor.h index f4ae8ab3c..784b2e4fd 100644 --- a/converter/smr2rdox/rdo_common/model_objects_convertor.h +++ b/converter/smr2rdox/rdo_common/model_objects_convertor.h @@ -1,7 +1,6 @@ #include -#ifndef _RDOCOMMON_MODEL_OBJECTS_CONVERTOR_H_ -#define _RDOCOMMON_MODEL_OBJECTS_CONVERTOR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,75 +8,68 @@ // -------------------------------------------------------------------------------- OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE - struct RDOSMRFileInfo - { - std::string m_modelName; - std::string m_resourceFile; - std::string m_frameFile; - std::string m_statisticFile; - std::string m_resultsFile; - std::string m_traceFile; - bool m_error; - RDOSMRFileInfo() - : m_modelName ("") - , m_resourceFile ("") - , m_frameFile ("") - , m_statisticFile("") - , m_resultsFile ("") - , m_traceFile ("") - , m_error (false ) - {} - }; +struct RDOSMRFileInfo +{ + std::string m_modelName; + std::string m_resourceFile; + std::string m_frameFile; + std::string m_statisticFile; + std::string m_resultsFile; + std::string m_traceFile; + bool m_error; - enum RDOFileTypeIn - { - UNDEFINED_IN = 0, - PAT_IN, - RTP_IN, - RSS_IN, - OPR_IN, - FRM_IN, - FUN_IN, - DPT_IN, - SMR_IN, - PMD_IN, - PMV_IN, - TRC_IN - }; - enum RDOFileTypeOut - { - UNDEFINED_OUT = 0, - PAT_OUT, - RTP_OUT, - RSS_OUT, - FRM_OUT, - FUN_OUT, - DPT_OUT, - SMR_OUT, - PMD_OUT, - PMV_OUT, - TRC_OUT, - EVN_OUT, - PRC_OUT - }; + RDOSMRFileInfo() + : m_error(false) + {} +}; - enum RDOParseType - { - obNONE = 0x0000, - obPRE = 0x0001, - obRTP = 0x0002, - obRSS = 0x0004, - obFUN = 0x0008, - obPAT = 0x0010, - obOPR = 0x0020, - obDPT = 0x0040, - obPMD = 0x0080, - obFRM = 0x0100, - obSMR = 0x0200, - obPOST = 0x0400, - obALL = 0x07FF - }; -CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE +enum class FileTypeIn +{ + UNDEFINED = 0, + PAT, + RTP, + RSS, + OPR, + FRM, + FUN, + DPT, + SMR, + PMD, + PMV, + TRC +}; + +enum class FileTypeOut +{ + UNDEFINED = 0, + PAT, + RTP, + RSS, + FRM, + FUN, + DPT, + SMR, + PMD, + PMV, + TRC, + EVN, + PRC +}; -#endif // _RDOCOMMON_MODEL_OBJECTS_CONVERTOR_H_ +enum class ParseType +{ + PRE = 0x0001, + RTP = 0x0002, + RSS = 0x0004, + FUN = 0x0008, + PAT = 0x0010, + OPR = 0x0020, + DPT = 0x0040, + PMD = 0x0080, + FRM = 0x0100, + SMR = 0x0200, + POST = 0x0400 +}; + +CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdo_enum.cpp b/converter/smr2rdox/rdo_enum.cpp index 7239aecbf..18253a6cd 100644 --- a/converter/smr2rdox/rdo_enum.cpp +++ b/converter/smr2rdox/rdo_enum.cpp @@ -13,24 +13,24 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- RDOEnumType // -------------------------------------------------------------------------------- RDOEnumType::RDOEnumType() - : RDOType(rdo::runtime::g_unknow) + : RDOType(rdo::runtime::g_UNKNOW) { - m_pType = rdo::Factory::create(); - ASSERT(m_pType); + m_pType = rdo::Factory::create(); + ASSERT(m_pType); } RDOEnumType::RDOEnumType(const rdo::runtime::LPRDOEnumType& pEnumType) - : RDOType(rdo::runtime::g_unknow) + : RDOType(rdo::runtime::g_UNKNOW) { - rdo::runtime::LPRDOEnumType pType = rdo::Factory::create(); - m_pType = pType; - ASSERT(m_pType); - - rdo::runtime::RDOEnumType::Enums::const_iterator it = pEnumType->begin(); - while (it != pEnumType->end()) - { - pType->add(*it); - } + rdo::runtime::LPRDOEnumType pType = rdo::Factory::create(); + m_pType = pType; + ASSERT(m_pType); + + rdo::runtime::RDOEnumType::Enums::const_iterator it = pEnumType->begin(); + while (it != pEnumType->end()) + { + pType->add(*it); + } } RDOEnumType::~RDOEnumType() @@ -38,141 +38,141 @@ RDOEnumType::~RDOEnumType() std::string RDOEnumType::name() const { - std::string str = "("; - rdo::runtime::RDOEnumType::const_iterator it = getEnums()->begin(); - while (it != getEnums()->end()) - { - str += *it; - ++it; - if (it != getEnums()->end()) - { - str += ", "; - } - } - str += ")"; - return str; + std::string str = "("; + rdo::runtime::RDOEnumType::const_iterator it = getEnums()->begin(); + while (it != getEnums()->end()) + { + str += *it; + ++it; + if (it != getEnums()->end()) + { + str += ", "; + } + } + str += ")"; + return str; } LPRDOType RDOEnumType::type_cast(const LPRDOType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - switch (pFrom->type()->typeID()) - { - case rdo::runtime::RDOType__int::t_enum: - { - LPRDOEnumType pEnum(const_cast(this)); - //! Это один и тот же тип - if (pEnum == pFrom) - return pEnum; - - //! Типы разные, сгенерим ошибку - if (pEnum.compare(pFrom.object_static_cast())) - { - rdo::converter::smr2rdox::g_error().push_only(src_info, "Используются различные перечислимые типы с одинаковыми значениями"); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, to_src_info.src_text()); - rdo::converter::smr2rdox::g_error().push_only(src_info, "и"); - rdo::converter::smr2rdox::g_error().push_only(from_src_info, from_src_info.src_text()); - rdo::converter::smr2rdox::g_error().push_only(src_info, "Возможно, удобнее использовать первый из них как перечислимый, а второй как such_as на него, тогда параметры можно будет сравнивать и присваивать"); - } - else - { - rdo::converter::smr2rdox::g_error().push_only(src_info, "Несоответствие перечислимых типов"); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, to_src_info.src_text()); - rdo::converter::smr2rdox::g_error().push_only(src_info, "и"); - rdo::converter::smr2rdox::g_error().push_only(from_src_info, from_src_info.src_text()); - } - rdo::converter::smr2rdox::g_error().push_done(); - break; - } - case rdo::runtime::RDOType::t_string : - case rdo::runtime::RDOType::t_identificator: - { - if (getEnums()->exist(from_src_info.src_text())) - { - LPRDOEnumType pEnum(const_cast(this)); - return pEnum; - } - rdo::converter::smr2rdox::g_error().error(src_info, rdo::format("Значение '%s' не является элементом перечислимого типа %s", from_src_info.src_text().c_str(), to_src_info.src_text().c_str())); - break; - } - default: - rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Ожидается значение перечислимого типа, найдено: %s", from_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_done(); - break; - } - return NULL; + switch (pFrom->type()->typeID()) + { + case rdo::runtime::RDOType::Type::ENUM: + { + LPRDOEnumType pEnum(const_cast(this)); + // Это один и тот же тип + if (pEnum == pFrom) + return pEnum; + + // Типы разные, сгенерим ошибку + if (pEnum.compare(pFrom.object_static_cast())) + { + rdo::converter::smr2rdox::g_error().push_only(src_info, "Используются различные перечислимые типы с одинаковыми значениями"); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, to_src_info.src_text()); + rdo::converter::smr2rdox::g_error().push_only(src_info, "и"); + rdo::converter::smr2rdox::g_error().push_only(from_src_info, from_src_info.src_text()); + rdo::converter::smr2rdox::g_error().push_only(src_info, "Возможно, удобнее использовать первый из них как перечислимый, а второй как such_as на него, тогда параметры можно будет сравнивать и присваивать"); + } + else + { + rdo::converter::smr2rdox::g_error().push_only(src_info, "Несоответствие перечислимых типов"); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, to_src_info.src_text()); + rdo::converter::smr2rdox::g_error().push_only(src_info, "и"); + rdo::converter::smr2rdox::g_error().push_only(from_src_info, from_src_info.src_text()); + } + rdo::converter::smr2rdox::g_error().push_done(); + break; + } + case rdo::runtime::RDOType::Type::STRING : + case rdo::runtime::RDOType::Type::IDENTIFICATOR: + { + if (getEnums()->exist(from_src_info.src_text())) + { + LPRDOEnumType pEnum(const_cast(this)); + return pEnum; + } + rdo::converter::smr2rdox::g_error().error(src_info, rdo::format("Значение '%s' не является элементом перечислимого типа %s", from_src_info.src_text().c_str(), to_src_info.src_text().c_str())); + break; + } + default: + rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Ожидается значение перечислимого типа, найдено: %s", from_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_done(); + break; + } + return NULL; } LPRDOValue RDOEnumType::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - LPRDOValue pToValue; - LPRDOEnumType pEnum(const_cast(this)); - try - { - switch (pFrom->typeID()) - { - case rdo::runtime::RDOType::t_identificator: - pToValue = (getEnums()->findEnum(pFrom->value().getIdentificator()) != rdo::runtime::RDOEnumType::END) ? - rdo::Factory::create(rdo::runtime::RDOValue(getEnums(), pFrom->value().getIdentificator()), pEnum, pFrom->src_info()) : - rdo::Factory::create(rdo::Factory::create().object_parent_cast(), pFrom->src_info()); - break; - - case rdo::runtime::RDOType::t_string: - pToValue = (getEnums()->findEnum(pFrom->value().getAsString()) != rdo::runtime::RDOEnumType::END) ? - rdo::Factory::create(rdo::runtime::RDOValue(getEnums(), pFrom->value().getAsString()), pEnum, pFrom->src_info()) : - rdo::Factory::create(rdo::Factory::create().object_parent_cast(), pFrom->src_info()); - break; - - case rdo::runtime::RDOType::t_enum: - if (m_pType == pFrom->type()->type()) - pToValue = rdo::Factory::create(pFrom); - break; - - default: - break; - } - } - catch (const rdo::runtime::RDOValueException&) - {} - - if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::t_unknow) - { - rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Неверное значение параметра перечислимого типа: %s", pFrom->src_info().src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("Возможные значения: %s", name().c_str())); - rdo::converter::smr2rdox::g_error().push_done(); - } - return pToValue; + LPRDOValue pToValue; + LPRDOEnumType pEnum(const_cast(this)); + try + { + switch (pFrom->typeID()) + { + case rdo::runtime::RDOType::Type::IDENTIFICATOR: + pToValue = (getEnums()->findEnum(pFrom->value().getIdentificator()) != rdo::runtime::RDOEnumType::END) ? + rdo::Factory::create(rdo::runtime::RDOValue(getEnums(), pFrom->value().getIdentificator()), pEnum, pFrom->src_info()) : + rdo::Factory::create(rdo::Factory::create().object_parent_cast(), pFrom->src_info()); + break; + + case rdo::runtime::RDOType::Type::STRING: + pToValue = (getEnums()->findEnum(pFrom->value().getAsString()) != rdo::runtime::RDOEnumType::END) ? + rdo::Factory::create(rdo::runtime::RDOValue(getEnums(), pFrom->value().getAsString()), pEnum, pFrom->src_info()) : + rdo::Factory::create(rdo::Factory::create().object_parent_cast(), pFrom->src_info()); + break; + + case rdo::runtime::RDOType::Type::ENUM: + if (m_pType == pFrom->type()->type()) + pToValue = rdo::Factory::create(pFrom); + break; + + default: + break; + } + } + catch (const rdo::runtime::RDOValueException&) + {} + + if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Неверное значение параметра перечислимого типа: %s", pFrom->src_info().src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("Возможные значения: %s", name().c_str())); + rdo::converter::smr2rdox::g_error().push_done(); + } + return pToValue; } rdo::runtime::LPRDOCalc RDOEnumType::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const { - return RDOType::calc_cast(pCalc, pType); + return RDOType::calc_cast(pCalc, pType); } LPRDOValue RDOEnumType::get_default() const { - LPRDOEnumType pEnum(const_cast(this)); - return rdo::Factory::create(rdo::runtime::RDOValue(getEnums(), 0), pEnum, RDOParserSrcInfo()); + LPRDOEnumType pEnum(const_cast(this)); + return rdo::Factory::create(rdo::runtime::RDOValue(getEnums(), 0), pEnum, RDOParserSrcInfo()); } void RDOEnumType::writeModelStructure(std::ostream& stream) const { - stream << "E " << getEnums()->getValues().size() << std::endl; - for (std::size_t i = 0; i < getEnums()->getValues().size(); i++) - { - stream << " " << i << " " << getEnums()->getValues().at(i) << std::endl; - } + stream << "E " << getEnums()->getValues().size() << std::endl; + for (std::size_t i = 0; i < getEnums()->getValues().size(); i++) + { + stream << " " << i << " " << getEnums()->getValues().at(i) << std::endl; + } } void RDOEnumType::add(const LPRDOValue& pNext) { - ASSERT(pNext); + ASSERT(pNext); - if (getEnums()->findEnum(pNext->value().getAsString()) != rdo::runtime::RDOEnumType::END) - { - rdo::converter::smr2rdox::g_error().error(pNext->src_info(), rdo::format("Значение перечислимого типа уже существует: %s", pNext->src_text().c_str())); - } - getEnums()->add(pNext->value().getAsString()); + if (getEnums()->findEnum(pNext->value().getAsString()) != rdo::runtime::RDOEnumType::END) + { + rdo::converter::smr2rdox::g_error().error(pNext->src_info(), rdo::format("Значение перечислимого типа уже существует: %s", pNext->src_text().c_str())); + } + getEnums()->add(pNext->value().getAsString()); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdo_enum.h b/converter/smr2rdox/rdo_enum.h index 410e8c9bc..9541cb93d 100644 --- a/converter/smr2rdox/rdo_enum.h +++ b/converter/smr2rdox/rdo_enum.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOCONVERTER_ENUM_H_ -#define _CONVERTOR_RDOCONVERTER_ENUM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -20,31 +19,29 @@ class RDOEnumType: public RDOType { DECLARE_FACTORY(RDOEnumType); public: - void add(const LPRDOValue& pNext); + void add(const LPRDOValue& pNext); - rdo::runtime::LPRDOEnumType getEnums() const - { - return m_pType.object_static_cast(); - } + rdo::runtime::LPRDOEnumType getEnums() const + { + return m_pType.object_static_cast(); + } - bool operator== (const RDOEnumType& pEnumType) const - { - return getEnums()->getValues() == pEnumType.getEnums()->getValues(); - } - bool operator!= (const RDOEnumType& pEnumType) const - { - return !operator==(pEnumType); - } + bool operator== (const RDOEnumType& pEnumType) const + { + return getEnums()->getValues() == pEnumType.getEnums()->getValues(); + } + bool operator!= (const RDOEnumType& pEnumType) const + { + return !operator==(pEnumType); + } - DECLARE_ITypeConverter; - DECLARE_IModelStructure; + DECLARE_ITypeConverter; + DECLARE_IModelStructure; private: - RDOEnumType (); - RDOEnumType (const rdo::runtime::LPRDOEnumType& pEnumType); - virtual ~RDOEnumType(); + RDOEnumType (); + RDOEnumType (const rdo::runtime::LPRDOEnumType& pEnumType); + virtual ~RDOEnumType(); }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOCONVERTER_ENUM_H_ diff --git a/converter/smr2rdox/rdo_logic.h b/converter/smr2rdox/rdo_logic.h index 4c4542c4a..de7f8cd99 100644 --- a/converter/smr2rdox/rdo_logic.h +++ b/converter/smr2rdox/rdo_logic.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOCONVERTER_LOGIC_H_ -#define _CONVERTOR_RDOCONVERTER_LOGIC_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -18,48 +17,46 @@ template class RDOLogicActivity: public RDOParserSrcInfo { public: - typedef rdo::intrusive_ptr LPActivity; - typedef std::vector ActivityList; - - RDOLogicActivity(const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - {} - virtual ~RDOLogicActivity() - {} - - const std::string& name() const { return src_info().src_text(); } - - LPActivity addNewActivity(const RDOParserSrcInfo& activity_src_info, const RDOParserSrcInfo& pattern_src_info) - { - LPActivity pAactivity = rdo::Factory::create(m_pRuntimeLogic.object_dynamic_cast(), activity_src_info, pattern_src_info); - ASSERT(pAactivity); - m_activityList.push_back(pAactivity); - return pAactivity; - } - - LPActivity getLastActivity() const - { - return !m_activityList.empty() ? m_activityList.back() : LPActivity(NULL); - } - const ActivityList& getActivities() const { return m_activityList; } - - bool setPrior(LPRDOFUNArithm& pPrior) - { - LPIPriority pPriority = m_pRuntimeLogic.object_dynamic_cast(); - if (pPriority) - { - return pPriority->setPrior(pPrior->createCalc()); - } - return false; - } + typedef rdo::intrusive_ptr LPActivity; + typedef std::vector ActivityList; + + RDOLogicActivity(const RDOParserSrcInfo& src_info) + : RDOParserSrcInfo(src_info) + {} + virtual ~RDOLogicActivity() + {} + + const std::string& name() const { return src_info().src_text(); } + + LPActivity addNewActivity(const RDOParserSrcInfo& activity_src_info, const RDOParserSrcInfo& pattern_src_info) + { + LPActivity pAactivity = rdo::Factory::create(m_pRuntimeLogic.object_dynamic_cast(), activity_src_info, pattern_src_info); + ASSERT(pAactivity); + m_activityList.push_back(pAactivity); + return pAactivity; + } + + LPActivity getLastActivity() const + { + return !m_activityList.empty() ? m_activityList.back() : LPActivity(NULL); + } + const ActivityList& getActivities() const { return m_activityList; } + + bool setPrior(LPRDOFUNArithm& pPrior) + { + LPIPriority pPriority = m_pRuntimeLogic.object_dynamic_cast(); + if (pPriority) + { + return pPriority->setPrior(pPrior->createCalc()); + } + return false; + } protected: - LPILogic m_pRuntimeLogic; + LPILogic m_pRuntimeLogic; private: - ActivityList m_activityList; + ActivityList m_activityList; }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOCONVERTER_LOGIC_H_ diff --git a/converter/smr2rdox/rdo_object.cpp b/converter/smr2rdox/rdo_object.cpp index 03bf878da..c23296dfb 100644 --- a/converter/smr2rdox/rdo_object.cpp +++ b/converter/smr2rdox/rdo_object.cpp @@ -13,88 +13,88 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- RDOParserSrcInfo // -------------------------------------------------------------------------------- RDOParserSrcInfo::RDOParserSrcInfo() - : RDOSrcInfo() + : RDOSrcInfo() { - init(); + init(); } RDOParserSrcInfo::RDOParserSrcInfo(const YYLTYPE& pos) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - setSrcPos(pos); + init(); + setSrcPos(pos); } RDOParserSrcInfo::RDOParserSrcInfo(const rdo::runtime::RDOSrcInfo& info) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - RDOSrcInfo::setSrcInfo(info); + init(); + RDOSrcInfo::setSrcInfo(info); } RDOParserSrcInfo::RDOParserSrcInfo(const rdo::runtime::RDOSrcInfo::Position& pos) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - RDOSrcInfo::setSrcPos(pos); + init(); + RDOSrcInfo::setSrcPos(pos); } RDOParserSrcInfo::RDOParserSrcInfo(const std::string& text) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - setSrcText(text); + init(); + setSrcText(text); } RDOParserSrcInfo::RDOParserSrcInfo(const YYLTYPE& pos, const std::string& text) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - setSrcPos (pos ); - setSrcText(text); + init(); + setSrcPos (pos ); + setSrcText(text); } RDOParserSrcInfo::RDOParserSrcInfo(const YYLTYPE& pos_begin, const YYLTYPE& pos_end, bool first_align) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - if (!first_align) - { - setSrcPos(pos_begin, pos_end); - } - else - { - if (pos_begin.m_first_line == pos_end.m_last_line) - { - setSrcPos(pos_begin, pos_end); - } - else - { - YYLTYPE pos(pos_begin); - pos.m_first_line = pos.m_last_line; - pos.m_first_pos = pos.m_last_pos; - setSrcPos(pos); - } - } + init(); + if (!first_align) + { + setSrcPos(pos_begin, pos_end); + } + else + { + if (pos_begin.m_first_line == pos_end.m_last_line) + { + setSrcPos(pos_begin, pos_end); + } + else + { + YYLTYPE pos(pos_begin); + pos.m_first_line = pos.m_last_line; + pos.m_first_pos = pos.m_last_pos; + setSrcPos(pos); + } + } } RDOParserSrcInfo::RDOParserSrcInfo(const YYLTYPE& pos_begin, const YYLTYPE& pos_end, const std::string& text) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - setSrcPos (pos_begin, pos_end); - setSrcText(text); + init(); + setSrcPos (pos_begin, pos_end); + setSrcText(text); } void RDOParserSrcInfo::init() { -// setSrcFileType(Converter::getFileToParse()); - rdo::runtime::RDOSrcInfo::Position pos; - pos.m_first_pos = Converter::lexer_loc_pos(); - pos.m_last_pos = pos.m_first_pos; - pos.m_first_line = Converter::lexer_loc_line(); - pos.m_last_line = pos.m_first_line; - RDOSrcInfo::setSrcPos(pos); +// setSrcFileType(Converter::getFileToParse()); + rdo::runtime::RDOSrcInfo::Position pos; + pos.m_first_pos = Converter::lexer_loc_pos(); + pos.m_last_pos = pos.m_first_pos; + pos.m_first_line = Converter::lexer_loc_line(); + pos.m_last_line = pos.m_first_line; + RDOSrcInfo::setSrcPos(pos); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdo_object.h b/converter/smr2rdox/rdo_object.h index 853917f99..742cc9950 100644 --- a/converter/smr2rdox/rdo_object.h +++ b/converter/smr2rdox/rdo_object.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOCONVERTER_OBJECT_H_ -#define _CONVERTOR_RDOCONVERTER_OBJECT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -17,118 +16,116 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE class RDOParserSrcInfo: public rdo::runtime::RDOSrcInfo { public: - RDOParserSrcInfo(); - RDOParserSrcInfo(const YYLTYPE& pos); - RDOParserSrcInfo(const rdo::runtime::RDOSrcInfo& info); - RDOParserSrcInfo(const rdo::runtime::RDOSrcInfo::Position& pos); - explicit RDOParserSrcInfo(const std::string& text); - RDOParserSrcInfo(const YYLTYPE& pos, const std::string& text); - RDOParserSrcInfo(const YYLTYPE& pos_begin, const YYLTYPE& pos_end, bool first_align = false); - RDOParserSrcInfo(const YYLTYPE& pos_begin, const YYLTYPE& pos_end, const std::string& text); + RDOParserSrcInfo(); + RDOParserSrcInfo(const YYLTYPE& pos); + RDOParserSrcInfo(const rdo::runtime::RDOSrcInfo& info); + RDOParserSrcInfo(const rdo::runtime::RDOSrcInfo::Position& pos); + explicit RDOParserSrcInfo(const std::string& text); + RDOParserSrcInfo(const YYLTYPE& pos, const std::string& text); + RDOParserSrcInfo(const YYLTYPE& pos_begin, const YYLTYPE& pos_end, bool first_align = false); + RDOParserSrcInfo(const YYLTYPE& pos_begin, const YYLTYPE& pos_end, const std::string& text); - virtual void setSrcInfo(const RDOParserSrcInfo& info) - { - setSrcPos (info.src_pos() ); - setSrcText (info.src_text() ); - setSrcFileType(info.src_filetype()); - } - void setSrcInfo(const RDOParserSrcInfo& begin, const std::string& delim, const RDOParserSrcInfo& end) - { - RDOParserSrcInfo src_info; - src_info.setSrcPos (begin.src_pos().m_first_line, begin.src_pos().m_first_pos, end.src_pos().m_last_line, end.src_pos().m_last_pos); - src_info.setSrcText (begin.src_text() + delim + end.src_text()); - src_info.setSrcFileType(begin.src_filetype()); - setSrcInfo(src_info); - } - virtual void setSrcPos(const RDOSrcInfo::Position& pos) - { - RDOSrcInfo::setSrcPos(pos); - } - void setSrcPos(const YYLTYPE& pos) - { - setSrcPos(Position(pos.m_first_line, pos.m_first_pos, pos.m_last_line, pos.m_last_pos)); - } - void setSrcPos(const YYLTYPE& pos_begin, const YYLTYPE& pos_end) - { - setSrcPos(Position(pos_begin.m_first_line, pos_begin.m_first_pos, pos_end.m_last_line, pos_end.m_last_pos)); - } - void setSrcPos(std::size_t first_line, std::size_t first_pos, std::size_t last_line, std::size_t last_pos) - { - setSrcPos(Position(first_line, first_pos, last_line, last_pos)); - } - YYLTYPE getPosAsYY() const - { - YYLTYPE pos1; - Position pos2 = src_pos(); - pos1.m_first_line = pos2.m_first_line; - pos1.m_first_pos = pos2.m_first_pos; - pos1.m_last_line = pos2.m_last_line; - pos1.m_last_pos = pos2.m_last_pos; - pos1.m_first_seek = std::size_t(Position::UNDEFINE_POS); - pos1.m_last_seek = std::size_t(Position::UNDEFINE_POS); - return pos1; - } - static std::size_t getPosByLength(std::size_t pos, const std::string& text) - { - return pos + text.length(); - } + virtual void setSrcInfo(const RDOParserSrcInfo& info) + { + setSrcPos (info.src_pos() ); + setSrcText (info.src_text() ); + setSrcFileType(info.src_filetype()); + } + void setSrcInfo(const RDOParserSrcInfo& begin, const std::string& delim, const RDOParserSrcInfo& end) + { + RDOParserSrcInfo src_info; + src_info.setSrcPos (begin.src_pos().m_first_line, begin.src_pos().m_first_pos, end.src_pos().m_last_line, end.src_pos().m_last_pos); + src_info.setSrcText (begin.src_text() + delim + end.src_text()); + src_info.setSrcFileType(begin.src_filetype()); + setSrcInfo(src_info); + } + virtual void setSrcPos(const RDOSrcInfo::Position& pos) + { + RDOSrcInfo::setSrcPos(pos); + } + void setSrcPos(const YYLTYPE& pos) + { + setSrcPos(Position(pos.m_first_line, pos.m_first_pos, pos.m_last_line, pos.m_last_pos)); + } + void setSrcPos(const YYLTYPE& pos_begin, const YYLTYPE& pos_end) + { + setSrcPos(Position(pos_begin.m_first_line, pos_begin.m_first_pos, pos_end.m_last_line, pos_end.m_last_pos)); + } + void setSrcPos(std::size_t first_line, std::size_t first_pos, std::size_t last_line, std::size_t last_pos) + { + setSrcPos(Position(first_line, first_pos, last_line, last_pos)); + } + YYLTYPE getPosAsYY() const + { + YYLTYPE pos1; + Position pos2 = src_pos(); + pos1.m_first_line = pos2.m_first_line; + pos1.m_first_pos = pos2.m_first_pos; + pos1.m_last_line = pos2.m_last_line; + pos1.m_last_pos = pos2.m_last_pos; + pos1.m_first_seek = std::size_t(Position::UNDEFINE_POS); + pos1.m_last_seek = std::size_t(Position::UNDEFINE_POS); + return pos1; + } + static std::size_t getPosByLength(std::size_t pos, const std::string& text) + { + return pos + text.length(); + } private: - void init(); + void init(); }; template class compareName { public: - compareName(const compareName& obj) - : m_name(obj.m_name) - {} - compareName(const std::string& name) - : m_name(name) - {} - compareName& operator= (const compareName& obj) - { - m_name = obj.m_name; - return *this; - } - bool operator()(const T* pObj) - { - return pObj->name() == m_name; - } - bool operator() (const rdo::intrusive_ptr& pObj) - { - return pObj->name() == m_name; - } + compareName(const compareName& obj) + : m_name(obj.m_name) + {} + compareName(const std::string& name) + : m_name(name) + {} + compareName& operator= (const compareName& obj) + { + m_name = obj.m_name; + return *this; + } + bool operator()(const T* pObj) + { + return pObj->name() == m_name; + } + bool operator() (const rdo::intrusive_ptr& pObj) + { + return pObj->name() == m_name; + } private: - const std::string& m_name; + const std::string& m_name; }; template class compareNameRef { public: - compareNameRef(const compareNameRef& obj) - : m_name(obj.m_name) - {} - compareNameRef(const std::string& name) - : m_name(name) - {} - compareNameRef& operator= (const compareNameRef& obj) - { - m_name = obj.m_name; - return *this; - } - bool operator() (const T& obj) - { - return obj.name() == m_name; - } + compareNameRef(const compareNameRef& obj) + : m_name(obj.m_name) + {} + compareNameRef(const std::string& name) + : m_name(name) + {} + compareNameRef& operator= (const compareNameRef& obj) + { + m_name = obj.m_name; + return *this; + } + bool operator() (const T& obj) + { + return obj.name() == m_name; + } private: - const std::string& m_name; + const std::string& m_name; }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOCONVERTER_OBJECT_H_ diff --git a/converter/smr2rdox/rdo_type.cpp b/converter/smr2rdox/rdo_type.cpp index bcbd1c45c..d1896767b 100644 --- a/converter/smr2rdox/rdo_type.cpp +++ b/converter/smr2rdox/rdo_type.cpp @@ -13,287 +13,287 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------------------------------------------------------------------- // -------------------- ATOM_TYPE_CONVERTER // -------------------------------------------------------------------------------- -#define DECLARE_ATOM_TYPE_PARSER(Type, TypeName) \ -std::string RDOType__##Type::name() const \ -{ \ - return TypeName; \ +#define DECLARE_ATOM_TYPE_PARSER(Type, TypeName) \ +std::string RDOType__##Type::name() const \ +{ \ + return TypeName; \ } -DECLARE_ATOM_TYPE_PARSER(unknow, "unknow" ); -DECLARE_ATOM_TYPE_PARSER(identificator, "identificator"); -DECLARE_ATOM_TYPE_PARSER(int, "integer" ); -DECLARE_ATOM_TYPE_PARSER(real, "real" ); -DECLARE_ATOM_TYPE_PARSER(bool, "bool" ); -DECLARE_ATOM_TYPE_PARSER(string, "string" ); +DECLARE_ATOM_TYPE_PARSER(UNKNOW, "unknow" ); +DECLARE_ATOM_TYPE_PARSER(IDENTIFICATOR, "identificator"); +DECLARE_ATOM_TYPE_PARSER(INT, "integer" ); +DECLARE_ATOM_TYPE_PARSER(REAL, "real" ); +DECLARE_ATOM_TYPE_PARSER(BOOL, "bool" ); +DECLARE_ATOM_TYPE_PARSER(STRING, "string" ); // -------------------------------------------------------------------------------- // -------------------- RDOType // -------------------------------------------------------------------------------- -//! RDOType__unknow -LPRDOType RDOType__unknow::type_cast(const LPRDOType& /*pFrom*/, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& /*to_src_info*/, const RDOParserSrcInfo& src_info) const +// RDOType__UNKNOW +LPRDOType RDOType__UNKNOW::type_cast(const LPRDOType& /*pFrom*/, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& /*to_src_info*/, const RDOParserSrcInfo& src_info) const { - rdo::converter::smr2rdox::g_error().error(src_info, rdo::format("Внутренная ошибка парсера. Невозможно преобразовать тип '%s' к неизвестному типу", from_src_info.src_text().c_str())); - return NULL; + rdo::converter::smr2rdox::g_error().error(src_info, rdo::format("Внутренняя ошибка парсера. Невозможно преобразовать тип '%s' к неизвестному типу", from_src_info.src_text().c_str())); + return NULL; } -LPRDOValue RDOType__unknow::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPRDOValue RDOType__UNKNOW::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к неизвестному типу", pFrom->src_info().src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_done(); - return LPRDOValue(NULL); + rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к неизвестному типу", pFrom->src_info().src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_done(); + return LPRDOValue(NULL); } -rdo::runtime::LPRDOCalc RDOType__unknow::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const +rdo::runtime::LPRDOCalc RDOType__UNKNOW::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const { - return parent_type::calc_cast(pCalc, pType); + return parent_type::calc_cast(pCalc, pType); } -LPRDOValue RDOType__unknow::get_default() const +LPRDOValue RDOType__UNKNOW::get_default() const { - return rdo::Factory::create(rdo::runtime::RDOValue(), rdo::Factory::create(), RDOParserSrcInfo()); + return rdo::Factory::create(rdo::runtime::RDOValue(), rdo::Factory::create(), RDOParserSrcInfo()); } -void RDOType__unknow::writeModelStructure(std::ostream& /*stream*/) const +void RDOType__UNKNOW::writeModelStructure(std::ostream& /*stream*/) const { - rdo::converter::smr2rdox::g_error().error(RDOParserSrcInfo(), "Внутренная ошибка парсера. Невозможно записать неизвестный тип в отчет"); - NEVER_REACH_HERE; + rdo::converter::smr2rdox::g_error().error(RDOParserSrcInfo(), "Внутренняя ошибка парсера. Невозможно записать неизвестный тип в отчет"); + NEVER_REACH_HERE; } -//! RDOType__int -LPRDOType RDOType__int::type_cast(const LPRDOType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +// RDOType__INT +LPRDOType RDOType__INT::type_cast(const LPRDOType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - switch (pFrom->type()->typeID()) - { - case rdo::runtime::RDOType::t_int : - return rdo::Factory::create(); - case rdo::runtime::RDOType::t_real: - rdo::converter::smr2rdox::g_error().warning(src_info, rdo::format("Преобразование '%s' в '%s', возможна потеря данных", pFrom->name().c_str(), name().c_str())); - return rdo::Factory::create(); - default: - rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Ожидается целочисленное значение, найдено: %s", from_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_done(); - } - return NULL; + switch (pFrom->type()->typeID()) + { + case rdo::runtime::RDOType::Type::INT : + return rdo::Factory::create(); + case rdo::runtime::RDOType::Type::REAL: + rdo::converter::smr2rdox::g_error().warning(src_info, rdo::format("Преобразование '%s' в '%s', возможна потеря данных", pFrom->name().c_str(), name().c_str())); + return rdo::Factory::create(); + default: + rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Ожидается целочисленное значение, найдено: %s", from_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_done(); + } + return NULL; } -LPRDOValue RDOType__int::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPRDOValue RDOType__INT::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - LPRDOValue pToValue; - try - { - pToValue = rdo::Factory::create(pFrom->value().getInt(), rdo::Factory::create(), pFrom->src_info()); - } - catch (const rdo::runtime::RDOValueException&) - {} - - if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::t_unknow) - { - rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к целому типу", pFrom->src_info().src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_done(); - } - return pToValue; + LPRDOValue pToValue; + try + { + pToValue = rdo::Factory::create(pFrom->value().getInt(), rdo::Factory::create(), pFrom->src_info()); + } + catch (const rdo::runtime::RDOValueException&) + {} + + if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к целому типу", pFrom->src_info().src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_done(); + } + return pToValue; } -rdo::runtime::LPRDOCalc RDOType__int::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const +rdo::runtime::LPRDOCalc RDOType__INT::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const { - if (pType->typeID() == rdo::runtime::RDOType::t_real) - { - return rdo::Factory::create(pCalc->srcInfo().src_pos(), pCalc); - } - return pCalc; + if (pType->typeID() == rdo::runtime::RDOType::Type::REAL) + { + return rdo::Factory::create(pCalc->srcInfo().src_pos(), pCalc); + } + return pCalc; } -LPRDOValue RDOType__int::get_default() const +LPRDOValue RDOType__INT::get_default() const { - return rdo::Factory::create(rdo::runtime::RDOValue(0), rdo::Factory::create(), RDOParserSrcInfo()); + return rdo::Factory::create(rdo::runtime::RDOValue(0), rdo::Factory::create(), RDOParserSrcInfo()); } -void RDOType__int::writeModelStructure(std::ostream& stream) const +void RDOType__INT::writeModelStructure(std::ostream& stream) const { - stream << "I" << std::endl; + stream << "I" << std::endl; } -//! RDOType__real -LPRDOType RDOType__real::type_cast(const LPRDOType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +// RDOType__REAL +LPRDOType RDOType__REAL::type_cast(const LPRDOType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - switch (pFrom->type()->typeID()) - { - case rdo::runtime::RDOType::t_int : - case rdo::runtime::RDOType::t_real: - return rdo::Factory::create(); - default: - rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Ожидается вещественное значение, найдено: %s", from_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_done(); - } - return NULL; + switch (pFrom->type()->typeID()) + { + case rdo::runtime::RDOType::Type::INT : + case rdo::runtime::RDOType::Type::REAL: + return rdo::Factory::create(); + default: + rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Ожидается вещественное значение, найдено: %s", from_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_done(); + } + return NULL; } -LPRDOValue RDOType__real::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPRDOValue RDOType__REAL::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - LPRDOValue pToValue; - try - { - pToValue = rdo::Factory::create(pFrom->value().getDouble(), rdo::Factory::create(), pFrom->src_info()); - } - catch (const rdo::runtime::RDOValueException&) - {} - - if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::t_unknow) - { - rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к вещественному типу", pFrom->src_info().src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_done(); - } - return pToValue; + LPRDOValue pToValue; + try + { + pToValue = rdo::Factory::create(pFrom->value().getDouble(), rdo::Factory::create(), pFrom->src_info()); + } + catch (const rdo::runtime::RDOValueException&) + {} + + if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к вещественному типу", pFrom->src_info().src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_done(); + } + return pToValue; } -rdo::runtime::LPRDOCalc RDOType__real::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const +rdo::runtime::LPRDOCalc RDOType__REAL::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const { - return parent_type::calc_cast(pCalc, pType); + return parent_type::calc_cast(pCalc, pType); } -LPRDOValue RDOType__real::get_default() const +LPRDOValue RDOType__REAL::get_default() const { - return rdo::Factory::create(rdo::runtime::RDOValue(0.0), rdo::Factory::create(), RDOParserSrcInfo()); + return rdo::Factory::create(rdo::runtime::RDOValue(0.0), rdo::Factory::create(), RDOParserSrcInfo()); } -void RDOType__real::writeModelStructure(std::ostream& stream) const +void RDOType__REAL::writeModelStructure(std::ostream& stream) const { - stream << "R" << std::endl; + stream << "R" << std::endl; } -//! RDOType__string -LPRDOType RDOType__string::type_cast(const LPRDOType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +// RDOType__STRING +LPRDOType RDOType__STRING::type_cast(const LPRDOType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - switch (pFrom->type()->typeID()) - { - case rdo::runtime::RDOType::t_string: - return rdo::Factory::create(); - default: - rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Ожидается строковое значение, найдено: %s", from_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_done(); - } - return NULL; + switch (pFrom->type()->typeID()) + { + case rdo::runtime::RDOType::Type::STRING: + return rdo::Factory::create(); + default: + rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Ожидается строковое значение, найдено: %s", from_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_done(); + } + return NULL; } -LPRDOValue RDOType__string::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPRDOValue RDOType__STRING::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - LPRDOValue pToValue; - try - { - pToValue = rdo::Factory::create(pFrom->value().getString(), rdo::Factory::create(), pFrom->src_info()); - } - catch (const rdo::runtime::RDOValueException&) - {} - - if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::t_unknow) - { - rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к строковому типу", pFrom->src_info().src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_done(); - } - return pToValue; + LPRDOValue pToValue; + try + { + pToValue = rdo::Factory::create(pFrom->value().getString(), rdo::Factory::create(), pFrom->src_info()); + } + catch (const rdo::runtime::RDOValueException&) + {} + + if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к строковому типу", pFrom->src_info().src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_done(); + } + return pToValue; } -rdo::runtime::LPRDOCalc RDOType__string::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const +rdo::runtime::LPRDOCalc RDOType__STRING::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const { - return parent_type::calc_cast(pCalc, pType); + return parent_type::calc_cast(pCalc, pType); } -LPRDOValue RDOType__string::get_default() const +LPRDOValue RDOType__STRING::get_default() const { - return rdo::Factory::create(rdo::runtime::RDOValue(""), rdo::Factory::create(), RDOParserSrcInfo()); + return rdo::Factory::create(rdo::runtime::RDOValue(""), rdo::Factory::create(), RDOParserSrcInfo()); } -void RDOType__string::writeModelStructure(std::ostream& stream) const +void RDOType__STRING::writeModelStructure(std::ostream& stream) const { - stream << "S" << std::endl; + stream << "S" << std::endl; } -//! RDOType__identificator -LPRDOType RDOType__identificator::type_cast(const LPRDOType& /*pFrom*/, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& /*to_src_info*/, const RDOParserSrcInfo& src_info) const +// RDOType__IDENTIFICATOR +LPRDOType RDOType__IDENTIFICATOR::type_cast(const LPRDOType& /*pFrom*/, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& /*to_src_info*/, const RDOParserSrcInfo& src_info) const { - rdo::converter::smr2rdox::g_error().error(src_info, rdo::format("Внутренная ошибка парсера. Невозможно преобразовать тип '%s' к идентификатору", from_src_info.src_text().c_str())); - return NULL; + rdo::converter::smr2rdox::g_error().error(src_info, rdo::format("Внутренняя ошибка парсера. Невозможно преобразовать тип '%s' к идентификатору", from_src_info.src_text().c_str())); + return NULL; } -LPRDOValue RDOType__identificator::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPRDOValue RDOType__IDENTIFICATOR::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к типу идентификатор", pFrom->src_info().src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_done(); - return LPRDOValue(NULL); + rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к типу идентификатор", pFrom->src_info().src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_done(); + return LPRDOValue(NULL); } -rdo::runtime::LPRDOCalc RDOType__identificator::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const +rdo::runtime::LPRDOCalc RDOType__IDENTIFICATOR::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const { - return parent_type::calc_cast(pCalc, pType); + return parent_type::calc_cast(pCalc, pType); } -LPRDOValue RDOType__identificator::get_default() const +LPRDOValue RDOType__IDENTIFICATOR::get_default() const { - return rdo::Factory::create(rdo::runtime::RDOValue("", rdo::runtime::g_identificator), rdo::Factory::create(), RDOParserSrcInfo()); + return rdo::Factory::create(rdo::runtime::RDOValue("", rdo::runtime::g_IDENTIFICATOR), rdo::Factory::create(), RDOParserSrcInfo()); } -void RDOType__identificator::writeModelStructure(std::ostream& /*stream*/) const +void RDOType__IDENTIFICATOR::writeModelStructure(std::ostream& /*stream*/) const { - rdo::converter::smr2rdox::g_error().error(RDOParserSrcInfo(), "Внутренная ошибка парсера. Невозможно записать тип идектификатор в отчет"); - NEVER_REACH_HERE; + rdo::converter::smr2rdox::g_error().error(RDOParserSrcInfo(), "Внутренняя ошибка парсера. Невозможно записать тип идектификатор в отчет"); + NEVER_REACH_HERE; } -//! RDOType__bool -LPRDOType RDOType__bool::type_cast(const LPRDOType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +// RDOType__BOOL +LPRDOType RDOType__BOOL::type_cast(const LPRDOType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - switch (pFrom->type()->typeID()) - { - case rdo::runtime::RDOType::t_bool: - return rdo::Factory::create(); - default: - rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Ожидается булевское значение, найдено: %s", from_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_done(); - } - return NULL; + switch (pFrom->type()->typeID()) + { + case rdo::runtime::RDOType::Type::BOOL: + return rdo::Factory::create(); + default: + rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Ожидается булевское значение, найдено: %s", from_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_done(); + } + return NULL; } -LPRDOValue RDOType__bool::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPRDOValue RDOType__BOOL::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - LPRDOValue pToValue; - try - { - pToValue = rdo::Factory::create(pFrom->value().getBool(), rdo::Factory::create(), pFrom->src_info()); - } - catch (const rdo::runtime::RDOValueException&) - {} - - if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::t_unknow) - { - rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к булевскому типу", pFrom->src_info().src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_done(); - } - return pToValue; + LPRDOValue pToValue; + try + { + pToValue = rdo::Factory::create(pFrom->value().getBool(), rdo::Factory::create(), pFrom->src_info()); + } + catch (const rdo::runtime::RDOValueException&) + {} + + if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + rdo::converter::smr2rdox::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к булевскому типу", pFrom->src_info().src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_done(); + } + return pToValue; } -rdo::runtime::LPRDOCalc RDOType__bool::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const +rdo::runtime::LPRDOCalc RDOType__BOOL::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const { - return parent_type::calc_cast(pCalc, pType); + return parent_type::calc_cast(pCalc, pType); } -LPRDOValue RDOType__bool::get_default() const +LPRDOValue RDOType__BOOL::get_default() const { - return rdo::Factory::create(rdo::runtime::RDOValue(false), rdo::Factory::create(), RDOParserSrcInfo()); + return rdo::Factory::create(rdo::runtime::RDOValue(false), rdo::Factory::create(), RDOParserSrcInfo()); } -void RDOType__bool::writeModelStructure(std::ostream& stream) const +void RDOType__BOOL::writeModelStructure(std::ostream& stream) const { - stream << "B" << std::endl; + stream << "B" << std::endl; } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdo_type.h b/converter/smr2rdox/rdo_type.h index 2492f565e..a351e9231 100644 --- a/converter/smr2rdox/rdo_type.h +++ b/converter/smr2rdox/rdo_type.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOCONVERTER_TYPE_H_ -#define _CONVERTOR_RDOCONVERTER_TYPE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -22,63 +21,63 @@ PREDECLARE_POINTER(RDOType ); class IType { public: - virtual std::string name() const = 0; - virtual LPRDOType type_cast( - const LPRDOType& pFrom, - const RDOParserSrcInfo& from_src_info, - const RDOParserSrcInfo& to_src_info, - const RDOParserSrcInfo& src_info - ) const = 0; - virtual LPRDOValue value_cast( - const LPRDOValue& pFrom, - const RDOParserSrcInfo& to_src_info, - const RDOParserSrcInfo& src_info - ) const = 0; - //! calc_cast вызывается строго после type_cast, поэтому никаких RDOParserSrcInfo не передается - virtual rdo::runtime::LPRDOCalc calc_cast( - const rdo::runtime::LPRDOCalc& pCalc, - const LPRDOType& pType - ) const = 0; - virtual LPRDOValue get_default() const = 0; + virtual std::string name() const = 0; + virtual LPRDOType type_cast( + const LPRDOType& pFrom, + const RDOParserSrcInfo& from_src_info, + const RDOParserSrcInfo& to_src_info, + const RDOParserSrcInfo& src_info + ) const = 0; + virtual LPRDOValue value_cast( + const LPRDOValue& pFrom, + const RDOParserSrcInfo& to_src_info, + const RDOParserSrcInfo& src_info + ) const = 0; + // calc_cast вызывается строго после type_cast, поэтому никаких RDOParserSrcInfo не передается + virtual rdo::runtime::LPRDOCalc calc_cast( + const rdo::runtime::LPRDOCalc& pCalc, + const LPRDOType& pType + ) const = 0; + virtual LPRDOValue get_default() const = 0; }; #define DECLARE_ITypeConverter \ - virtual std::string name () const; \ - virtual LPRDOType type_cast (const LPRDOType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const; \ - virtual LPRDOValue value_cast (const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const; \ - virtual rdo::runtime::LPRDOCalc calc_cast (const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const; \ - virtual LPRDOValue get_default() const; + virtual std::string name () const; \ + virtual LPRDOType type_cast (const LPRDOType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const; \ + virtual LPRDOValue value_cast (const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const; \ + virtual rdo::runtime::LPRDOCalc calc_cast (const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const; \ + virtual LPRDOValue get_default() const; // -------------------------------------------------------------------------------- // -------------------- RDOType // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOType); class RDOType - : public virtual rdo::counter_reference - , public IType - , public IModelStructure + : public virtual rdo::counter_reference + , public IType + , public IModelStructure { DECLARE_FACTORY(RDOType) public: - const rdo::runtime::LPRDOType& type() const { return m_pType; } - const rdo::runtime::LPRDOType& operator-> () const { return m_pType; } + const rdo::runtime::LPRDOType& type() const { return m_pType; } + const rdo::runtime::LPRDOType& operator-> () const { return m_pType; } - rdo::runtime::RDOType::TypeID typeID() const { return m_pType->typeID(); } + rdo::runtime::RDOType::Type typeID() const { return m_pType->typeID(); } - virtual rdo::runtime::LPRDOCalc calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& /*pType*/) const - { - return pCalc; - } + virtual rdo::runtime::LPRDOCalc calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& /*pType*/) const + { + return pCalc; + } protected: - RDOType(const rdo::runtime::LPRDOType& pType) - : m_pType(pType) - { - ASSERT(m_pType); - } - virtual ~RDOType() - {} + RDOType(const rdo::runtime::LPRDOType& pType) + : m_pType(pType) + { + ASSERT(m_pType); + } + virtual ~RDOType() + {} - rdo::runtime::LPRDOType m_pType; + rdo::runtime::LPRDOType m_pType; }; // -------------------------------------------------------------------------------- @@ -90,23 +89,21 @@ class RDOType__##Type: public RDOType \ private: \ typedef RDOType parent_type; \ public: \ - RDOType__##Type(): \ - RDOType(rdo::runtime::g_##Type) \ - {} \ - ~RDOType__##Type() \ - {} \ - DECLARE_ITypeConverter; \ - DECLARE_IModelStructure; \ + RDOType__##Type(): \ + RDOType(rdo::runtime::g_##Type) \ + {} \ + ~RDOType__##Type() \ + {} \ + DECLARE_ITypeConverter; \ + DECLARE_IModelStructure; \ }; \ DECLARE_POINTER(RDOType__##Type); -DEFINE_ATOM_TYPE_CONVERTER(unknow ); -DEFINE_ATOM_TYPE_CONVERTER(identificator); -DEFINE_ATOM_TYPE_CONVERTER(int ); -DEFINE_ATOM_TYPE_CONVERTER(real ); -DEFINE_ATOM_TYPE_CONVERTER(bool ); -DEFINE_ATOM_TYPE_CONVERTER(string ); +DEFINE_ATOM_TYPE_CONVERTER(UNKNOW); +DEFINE_ATOM_TYPE_CONVERTER(IDENTIFICATOR); +DEFINE_ATOM_TYPE_CONVERTER(INT); +DEFINE_ATOM_TYPE_CONVERTER(REAL); +DEFINE_ATOM_TYPE_CONVERTER(BOOL); +DEFINE_ATOM_TYPE_CONVERTER(STRING); CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOCONVERTER_TYPE_H_ diff --git a/converter/smr2rdox/rdo_type_param.cpp b/converter/smr2rdox/rdo_type_param.cpp index 914656a07..dfb743327 100644 --- a/converter/smr2rdox/rdo_type_param.cpp +++ b/converter/smr2rdox/rdo_type_param.cpp @@ -13,16 +13,16 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- RDOTypeParam // -------------------------------------------------------------------------------- RDOTypeParam::RDOTypeParam(const LPRDOType& pType, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_pType (pType ) + : RDOParserSrcInfo(src_info) + , m_pType (pType ) { - ASSERT(m_pType); - setSrcText(m_pType->name()); + ASSERT(m_pType); + setSrcText(m_pType->name()); - if (m_pType->type()->typeID() == rdo::runtime::RDOType::t_enum) - { - Converter::s_converter()->insertPreCastType(this); - } + if (m_pType->type()->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + Converter::s_converter()->insertPreCastType(this); + } } RDOTypeParam::~RDOTypeParam() @@ -30,18 +30,18 @@ RDOTypeParam::~RDOTypeParam() LPRDOType RDOTypeParam::type() const { - return m_pType; + return m_pType; } void RDOTypeParam::writeModelStructure(std::ostream& stream) const { - m_pType->writeModelStructure(stream); + m_pType->writeModelStructure(stream); } LPRDOValue RDOTypeParam::value_cast(const LPRDOValue& pValue) const { - ASSERT(pValue); - return m_pType->value_cast(pValue, src_info(), pValue->src_info()); + ASSERT(pValue); + return m_pType->value_cast(pValue, src_info(), pValue->src_info()); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdo_type_param.h b/converter/smr2rdox/rdo_type_param.h index a4df50467..8848ffb1f 100644 --- a/converter/smr2rdox/rdo_type_param.h +++ b/converter/smr2rdox/rdo_type_param.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOCONVERTER_TYPE_PARAM_H_ -#define _CONVERTOR_RDOCONVERTER_TYPE_PARAM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -17,25 +16,23 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOTypeParam); class RDOTypeParam - : public virtual rdo::counter_reference - , public RDOParserSrcInfo - , public IModelStructure + : public virtual rdo::counter_reference + , public RDOParserSrcInfo + , public IModelStructure { DECLARE_FACTORY(RDOTypeParam); public: - LPRDOType type () const; - LPRDOValue value_cast(const LPRDOValue& pValue) const; + LPRDOType type () const; + LPRDOValue value_cast(const LPRDOValue& pValue) const; - DECLARE_IModelStructure; + DECLARE_IModelStructure; protected: - RDOTypeParam(const LPRDOType& pType, const RDOParserSrcInfo& src_info); - virtual ~RDOTypeParam(); + RDOTypeParam(const LPRDOType& pType, const RDOParserSrcInfo& src_info); + virtual ~RDOTypeParam(); private: - LPRDOType m_pType; + LPRDOType m_pType; }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOCONVERTER_TYPE_PARAM_H_ diff --git a/converter/smr2rdox/rdo_type_param_suchas.cpp b/converter/smr2rdox/rdo_type_param_suchas.cpp index 28f5c6c9e..3fca3a4b5 100644 --- a/converter/smr2rdox/rdo_type_param_suchas.cpp +++ b/converter/smr2rdox/rdo_type_param_suchas.cpp @@ -12,8 +12,8 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- RDOTypeParamSuchAs // -------------------------------------------------------------------------------- RDOTypeParamSuchAs::RDOTypeParamSuchAs(const LPRDOParam& pParam) - : RDOTypeParam(pParam->getType()->type(), pParam->getType()->src_info()) - , m_pParam(pParam) + : RDOTypeParam(pParam->getType()->type(), pParam->getType()->src_info()) + , m_pParam(pParam) {} RDOTypeParamSuchAs::~RDOTypeParamSuchAs() @@ -21,7 +21,7 @@ RDOTypeParamSuchAs::~RDOTypeParamSuchAs() const LPRDOParam& RDOTypeParamSuchAs::getParam() const { - return m_pParam; + return m_pParam; } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdo_type_param_suchas.h b/converter/smr2rdox/rdo_type_param_suchas.h index ee8d34e37..a7f684593 100644 --- a/converter/smr2rdox/rdo_type_param_suchas.h +++ b/converter/smr2rdox/rdo_type_param_suchas.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDO_TYPE_PARAM_SUCHAS_H_ -#define _CONVERTOR_RDO_TYPE_PARAM_SUCHAS_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,16 +15,14 @@ class RDOTypeParamSuchAs: public RDOTypeParam { DECLARE_FACTORY(RDOTypeParamSuchAs); public: - const LPRDOParam& getParam() const; + const LPRDOParam& getParam() const; private: - RDOTypeParamSuchAs(const LPRDOParam& pParam); - virtual ~RDOTypeParamSuchAs(); + RDOTypeParamSuchAs(const LPRDOParam& pParam); + virtual ~RDOTypeParamSuchAs(); - LPRDOParam m_pParam; + LPRDOParam m_pParam; }; DECLARE_POINTER(RDOTypeParamSuchAs); CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDO_TYPE_PARAM_SUCHAS_H_ diff --git a/converter/smr2rdox/rdo_type_range-inl.h b/converter/smr2rdox/rdo_type_range-inl.h index 9fb9f85ca..7194b1ef6 100644 --- a/converter/smr2rdox/rdo_type_range-inl.h +++ b/converter/smr2rdox/rdo_type_range-inl.h @@ -10,10 +10,10 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------------------------------------------------------------------- template inline RDOTypeRange::RDOTypeRange(const LPRDOTypeRangeRange& range) - : T ( ) - , m_pRange(range) + : T ( ) + , m_pRange(range) { - ASSERT(m_pRange); + ASSERT(m_pRange); } template @@ -23,45 +23,45 @@ inline RDOTypeRange::~RDOTypeRange() template inline std::string RDOTypeRange::name() const { - return rdo::format("%s %s", T::name().c_str(), m_pRange->src_text().c_str()); + return rdo::format("%s %s", T::name().c_str(), m_pRange->src_text().c_str()); } template inline LPRDOType RDOTypeRange::type_cast(const LPRDOType& from, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - return parent_type::type_cast(from, from_src_info, to_src_info, src_info); + return parent_type::type_cast(from, from_src_info, to_src_info, src_info); } template inline LPRDOValue RDOTypeRange::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - LPRDOValue pToValue = T::value_cast(pFrom, to_src_info, src_info); - m_pRange->checkValue(pToValue); - return pToValue; + LPRDOValue pToValue = T::value_cast(pFrom, to_src_info, src_info); + m_pRange->checkValue(pToValue); + return pToValue; } template inline rdo::runtime::LPRDOCalc RDOTypeRange::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPRDOType& pType) const { - return rdo::Factory::create(range()->getMin()->value(), range()->getMax()->value(), T::calc_cast(pCalc, pType)); + return rdo::Factory::create(range()->getMin()->value(), range()->getMax()->value(), T::calc_cast(pCalc, pType)); } template inline const LPRDOTypeRangeRange& RDOTypeRange::range() const { - return m_pRange; + return m_pRange; } template<> -inline LPRDOValue RDOTypeRange::get_default() const +inline LPRDOValue RDOTypeRange::get_default() const { - return rdo::Factory::create(m_pRange->getMin()->value(), rdo::Factory::create(), RDOParserSrcInfo()); + return rdo::Factory::create(m_pRange->getMin()->value(), rdo::Factory::create(), RDOParserSrcInfo()); } template<> -inline LPRDOValue RDOTypeRange::get_default() const +inline LPRDOValue RDOTypeRange::get_default() const { - return rdo::Factory::create(m_pRange->getMin()->value(), rdo::Factory::create(), RDOParserSrcInfo()); + return rdo::Factory::create(m_pRange->getMin()->value(), rdo::Factory::create(), RDOParserSrcInfo()); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdo_type_range.cpp b/converter/smr2rdox/rdo_type_range.cpp index 491916666..007f75374 100644 --- a/converter/smr2rdox/rdo_type_range.cpp +++ b/converter/smr2rdox/rdo_type_range.cpp @@ -9,13 +9,13 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE RDOTypeRangeRange::RDOTypeRangeRange(const LPRDOValue& pMinValue, const LPRDOValue& pMaxValue, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info ) - , m_pMinValue (pMinValue) - , m_pMaxValue (pMaxValue) + : RDOParserSrcInfo(src_info ) + , m_pMinValue (pMinValue) + , m_pMaxValue (pMaxValue) { - ASSERT(m_pMinValue->defined()); - ASSERT(m_pMaxValue->defined()); - setSrcText(rdo::format("[%s..%s]", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str())); + ASSERT(m_pMinValue->defined()); + ASSERT(m_pMaxValue->defined()); + setSrcText(rdo::format("[%s..%s]", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str())); } RDOTypeRangeRange::~RDOTypeRangeRange() @@ -23,41 +23,41 @@ RDOTypeRangeRange::~RDOTypeRangeRange() void RDOTypeRangeRange::checkRange() const { - if (m_pMinValue->typeID() != m_pMaxValue->typeID()) - { - rdo::converter::smr2rdox::g_error().error(m_pMaxValue->src_info(), rdo::format("Границы диапазона должны быть одного типа, найдено: [%s] .. [%s]", m_pMinValue->type()->name().c_str(), m_pMaxValue->type()->name().c_str())); - } - if (m_pMinValue->value() > m_pMaxValue->value()) - { - rdo::converter::smr2rdox::g_error().error(m_pMaxValue->src_info(), "Левая граница диапазона должна быть меньше правой"); - } + if (m_pMinValue->typeID() != m_pMaxValue->typeID()) + { + rdo::converter::smr2rdox::g_error().error(m_pMaxValue->src_info(), rdo::format("Границы диапазона должны быть одного типа, найдено: [%s] .. [%s]", m_pMinValue->type()->name().c_str(), m_pMaxValue->type()->name().c_str())); + } + if (m_pMinValue->value() > m_pMaxValue->value()) + { + rdo::converter::smr2rdox::g_error().error(m_pMaxValue->src_info(), "Левая граница диапазона должна быть меньше правой"); + } } void RDOTypeRangeRange::checkValue(const LPRDOValue& pValue) const { - if (pValue->value() < m_pMinValue->value() || pValue->value() > m_pMaxValue->value()) - { - if (pValue->src_filetype() == src_filetype() && pValue->src_pos().m_last_line == src_pos().m_last_line) - { - rdo::converter::smr2rdox::g_error().error(pValue->src_info(), rdo::format("Значение выходит за допустимый диапазон [%s..%s]: %s", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str(), pValue->value().getAsString().c_str())); - } - else - { - rdo::converter::smr2rdox::g_error().push_only(pValue->src_info(), rdo::format("Значение выходит за допустимый диапазон [%s..%s]: %s", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str(), pValue->value().getAsString().c_str())); - rdo::converter::smr2rdox::g_error().push_only(src_info(), rdo::format("См. описание диапазона")); - rdo::converter::smr2rdox::g_error().push_done(); - } - } + if (pValue->value() < m_pMinValue->value() || pValue->value() > m_pMaxValue->value()) + { + if (pValue->src_filetype() == src_filetype() && pValue->src_pos().m_last_line == src_pos().m_last_line) + { + rdo::converter::smr2rdox::g_error().error(pValue->src_info(), rdo::format("Значение выходит за допустимый диапазон [%s..%s]: %s", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str(), pValue->value().getAsString().c_str())); + } + else + { + rdo::converter::smr2rdox::g_error().push_only(pValue->src_info(), rdo::format("Значение выходит за допустимый диапазон [%s..%s]: %s", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str(), pValue->value().getAsString().c_str())); + rdo::converter::smr2rdox::g_error().push_only(src_info(), rdo::format("См. описание диапазона")); + rdo::converter::smr2rdox::g_error().push_done(); + } + } } const LPRDOValue& RDOTypeRangeRange::getMin() const { - return m_pMinValue; + return m_pMinValue; } const LPRDOValue& RDOTypeRangeRange::getMax() const { - return m_pMaxValue; + return m_pMaxValue; } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdo_type_range.h b/converter/smr2rdox/rdo_type_range.h index 0efe84859..1d3abc1da 100644 --- a/converter/smr2rdox/rdo_type_range.h +++ b/converter/smr2rdox/rdo_type_range.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDO_TYPE_RANGE_H_ -#define _CONVERTOR_RDO_TYPE_RANGE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -17,22 +16,22 @@ class Converter; // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOTypeRangeRange); class RDOTypeRangeRange - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOTypeRangeRange); public: - void checkRange() const; - void checkValue(const LPRDOValue& pValue) const; - const LPRDOValue& getMin () const; - const LPRDOValue& getMax () const; + void checkRange() const; + void checkValue(const LPRDOValue& pValue) const; + const LPRDOValue& getMin () const; + const LPRDOValue& getMax () const; private: - RDOTypeRangeRange(const LPRDOValue& pMinValue, const LPRDOValue& pMaxValue, const RDOParserSrcInfo& src_info); - virtual ~RDOTypeRangeRange(); + RDOTypeRangeRange(const LPRDOValue& pMinValue, const LPRDOValue& pMaxValue, const RDOParserSrcInfo& src_info); + virtual ~RDOTypeRangeRange(); - LPRDOValue m_pMinValue; - LPRDOValue m_pMaxValue; + LPRDOValue m_pMinValue; + LPRDOValue m_pMaxValue; }; DECLARE_POINTER(RDOTypeRangeRange); @@ -44,25 +43,23 @@ class RDOTypeRange: public T { DECLARE_FACTORY(RDOTypeRange); public: - const LPRDOTypeRangeRange& range() const; + const LPRDOTypeRangeRange& range() const; private: - typedef T parent_type; + typedef T parent_type; - RDOTypeRange(const LPRDOTypeRangeRange& range); - virtual ~RDOTypeRange(); + RDOTypeRange(const LPRDOTypeRangeRange& range); + virtual ~RDOTypeRange(); - LPRDOTypeRangeRange m_pRange; + LPRDOTypeRangeRange m_pRange; - DECLARE_ITypeConverter; + DECLARE_ITypeConverter; }; -typedef RDOTypeRange RDOTypeIntRange; -typedef RDOTypeRange RDOTypeRealRange; +typedef RDOTypeRange RDOTypeIntRange; +typedef RDOTypeRange RDOTypeRealRange; DECLARE_POINTER(RDOTypeIntRange); DECLARE_POINTER(RDOTypeRealRange); CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE #include "converter/smr2rdox/rdo_type_range-inl.h" - -#endif // _CONVERTOR_RDO_TYPE_RANGE_H_ diff --git a/converter/smr2rdox/rdo_value.cpp b/converter/smr2rdox/rdo_value.cpp index 7f2fb2569..81e3b34ba 100644 --- a/converter/smr2rdox/rdo_value.cpp +++ b/converter/smr2rdox/rdo_value.cpp @@ -13,98 +13,98 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- RDOValue // -------------------------------------------------------------------------------- RDOValue::RDOValue(const int& value, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_value(value) - , m_type (rdo::Factory::create()) + : RDOParserSrcInfo(src_info) + , m_value(value) + , m_type(rdo::Factory::create()) {} RDOValue::RDOValue(const std::size_t& value, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_value(value) - , m_type (rdo::Factory::create()) + : RDOParserSrcInfo(src_info) + , m_value(value) + , m_type(rdo::Factory::create()) {} RDOValue::RDOValue(const double& value, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_value(value ) - , m_type (rdo::Factory::create()) + : RDOParserSrcInfo(src_info) + , m_value(value) + , m_type(rdo::Factory::create()) {} RDOValue::RDOValue(const std::string& value, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_value (value ) - , m_type (rdo::Factory::create()) + : RDOParserSrcInfo(src_info) + , m_value(value) + , m_type(rdo::Factory::create()) {} RDOValue::RDOValue(const LPRDOValue& pValue) - : RDOParserSrcInfo(pValue->src_info()) - , m_value (pValue->m_value ) - , m_type (pValue->m_type ) + : RDOParserSrcInfo(pValue->src_info()) + , m_value (pValue->m_value ) + , m_type (pValue->m_type ) {} RDOValue::RDOValue(const rdo::runtime::RDOValue& value, const LPRDOType& type, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_value (value ) - , m_type (type ) + : RDOParserSrcInfo(src_info) + , m_value(value) + , m_type(type) {} RDOValue::RDOValue(const LPRDOType& type, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info ) - , m_value (type->type()) - , m_type (type ) + : RDOParserSrcInfo(src_info) + , m_value(type->type()) + , m_type(type) {} // Для t_identificator известно только имя, но не тип RDOValue::RDOValue(const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_value (rdo::runtime::RDOValue(src_info.src_text(), rdo::runtime::g_identificator)) - , m_type (rdo::Factory::create()) + : RDOParserSrcInfo(src_info) + , m_value(rdo::runtime::RDOValue(src_info.src_text(), rdo::runtime::g_IDENTIFICATOR)) + , m_type(rdo::Factory::create()) {} // Неопределенный тип RDOValue::RDOValue() - : RDOParserSrcInfo() - , m_value (rdo::runtime::RDOValue(rdo::runtime::g_unknow.object_parent_cast())) - , m_type (rdo::Factory::create()) + : RDOParserSrcInfo() + , m_value(rdo::runtime::RDOValue(rdo::runtime::g_UNKNOW.object_parent_cast())) + , m_type(rdo::Factory::create()) {} const LPRDOType& RDOValue::type() const { - return m_type; + return m_type; } -rdo::runtime::RDOType::TypeID RDOValue::typeID() const +rdo::runtime::RDOType::Type RDOValue::typeID() const { - return m_type->type()->typeID(); + return m_type->type()->typeID(); } const rdo::runtime::RDOValue& RDOValue::value() const { - return m_value; + return m_value; } const rdo::runtime::RDOValue* RDOValue::operator->() const { - return &m_value; + return &m_value; } bool RDOValue::defined() const { - return m_value.typeID() != rdo::runtime::RDOType::t_unknow; + return m_value.typeID() != rdo::runtime::RDOType::Type::UNKNOW; } bool RDOValue::constant() const { - return - m_value.typeID() == rdo::runtime::RDOType::t_int || - m_value.typeID() == rdo::runtime::RDOType::t_real || - m_value.typeID() == rdo::runtime::RDOType::t_bool || - m_value.typeID() == rdo::runtime::RDOType::t_string; + return + m_value.typeID() == rdo::runtime::RDOType::Type::INT || + m_value.typeID() == rdo::runtime::RDOType::Type::REAL || + m_value.typeID() == rdo::runtime::RDOType::Type::BOOL || + m_value.typeID() == rdo::runtime::RDOType::Type::STRING; } LPRDOValue RDOValue::getIdentificator(const std::string& identificator) { - return rdo::Factory::create(RDOParserSrcInfo(identificator)); + return rdo::Factory::create(RDOParserSrcInfo(identificator)); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdo_value.h b/converter/smr2rdox/rdo_value.h index 8805c2fda..bfb60b9b8 100644 --- a/converter/smr2rdox/rdo_value.h +++ b/converter/smr2rdox/rdo_value.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOCONVERTER_VALUE_H_ -#define _CONVERTOR_RDOCONVERTER_VALUE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,39 +15,37 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOValue); class RDOValue - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOValue); public: - const LPRDOType& type() const; - rdo::runtime::RDOType::TypeID typeID() const; - const rdo::runtime::RDOValue& value() const; - const rdo::runtime::RDOValue* operator->() const; + const LPRDOType& type() const; + rdo::runtime::RDOType::Type typeID() const; + const rdo::runtime::RDOValue& value() const; + const rdo::runtime::RDOValue* operator->() const; - bool defined() const; - bool constant() const; + bool defined() const; + bool constant() const; - static LPRDOValue getIdentificator(const std::string& identificator); + static LPRDOValue getIdentificator(const std::string& identificator); private: - explicit RDOValue(const int& value, const RDOParserSrcInfo& src_info); - explicit RDOValue(const std::size_t& value, const RDOParserSrcInfo& src_info); - explicit RDOValue(const double& value, const RDOParserSrcInfo& src_info); - explicit RDOValue(const std::string& value, const RDOParserSrcInfo& src_info); - - explicit RDOValue(const rdo::runtime::RDOValue& value, const LPRDOType& type, const RDOParserSrcInfo& src_info); - RDOValue(const LPRDOValue& pValue); - RDOValue(const LPRDOType& type, const RDOParserSrcInfo& src_info = RDOParserSrcInfo()); - // Для t_identificator известно только имя, но не тип - explicit RDOValue(const RDOParserSrcInfo& src_info); - // Неопределенный тип - RDOValue(); - - rdo::runtime::RDOValue m_value; - LPRDOType m_type; + explicit RDOValue(const int& value, const RDOParserSrcInfo& src_info); + explicit RDOValue(const std::size_t& value, const RDOParserSrcInfo& src_info); + explicit RDOValue(const double& value, const RDOParserSrcInfo& src_info); + explicit RDOValue(const std::string& value, const RDOParserSrcInfo& src_info); + + explicit RDOValue(const rdo::runtime::RDOValue& value, const LPRDOType& type, const RDOParserSrcInfo& src_info); + RDOValue(const LPRDOValue& pValue); + RDOValue(const LPRDOType& type, const RDOParserSrcInfo& src_info = RDOParserSrcInfo()); + // Для t_identificator известно только имя, но не тип + explicit RDOValue(const RDOParserSrcInfo& src_info); + // Неопределенный тип + RDOValue(); + + rdo::runtime::RDOValue m_value; + LPRDOType m_type; }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOCONVERTER_VALUE_H_ diff --git a/converter/smr2rdox/rdodpt.cpp b/converter/smr2rdox/rdodpt.cpp index 8404c2268..7ce67d53f 100644 --- a/converter/smr2rdox/rdodpt.cpp +++ b/converter/smr2rdox/rdodpt.cpp @@ -29,9 +29,9 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE int cnv_dptlex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void cnv_dpterror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -39,9 +39,9 @@ void cnv_dpterror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) int cnv_proc_rtp_lex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void cnv_proc_rtp_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -49,9 +49,9 @@ void cnv_proc_rtp_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*messa int cnv_proc_rss_lex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void cnv_proc_rss_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -59,9 +59,9 @@ void cnv_proc_rss_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*messa int cnv_proc_opr_lex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void cnv_proc_opr_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -71,15 +71,15 @@ void cnv_proc_opr_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*messa // -------------------- RDODPTActivity // -------------------------------------------------------------------------------- RDODPTActivity::RDODPTActivity(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info) - : RDOParserSrcInfo(src_info) - , m_currParam (0 ) + : RDOParserSrcInfo(src_info) + , m_currParam (0 ) { - Converter::s_converter()->checkActivityName(src_info); - m_pPattern = Converter::s_converter()->findPATPattern(pattern_src_info.src_text()); - if (!m_pPattern) - { - Converter::s_converter()->error().error(pattern_src_info, rdo::format("Не найден образец: %s", pattern_src_info.src_text().c_str())); - } + Converter::s_converter()->checkActivityName(src_info); + m_pPattern = Converter::s_converter()->findPATPattern(pattern_src_info.src_text()); + if (!m_pPattern) + { + Converter::s_converter()->error().error(pattern_src_info, rdo::format("Не найден образец: %s", pattern_src_info.src_text().c_str())); + } } RDODPTActivity::~RDODPTActivity() @@ -87,351 +87,351 @@ RDODPTActivity::~RDODPTActivity() void RDODPTActivity::addParam(const LPRDOValue& pParam) { - ASSERT(pParam); - - if (m_pPattern->m_paramList.size() <= m_currParam) - { - if (pParam->src_pos().m_first_line == src_pos().m_first_line) - { - if (dynamic_cast(this)) - { - Converter::s_converter()->error().push_only(pParam->src_info(), rdo::format("Слишком много параметров для образца '%s' при описании операции '%s'", m_pPattern->name().c_str(), name().c_str())); - } - else - { - Converter::s_converter()->error().push_only(pParam->src_info(), rdo::format("Слишком много параметров для образца '%s' при описании активности '%s'", m_pPattern->name().c_str(), name().c_str())); - } - Converter::s_converter()->error().push_only(m_pPattern->src_info(), "См. образец"); - Converter::s_converter()->error().push_done(); - } - else - { - if (dynamic_cast(this)) - { - Converter::s_converter()->error().error(pParam->src_info(), "Имя операции должно заканчиваться двоеточием"); - } - else - { - Converter::s_converter()->error().error(pParam->src_info(), "Имя активности должно заканчиваться двоеточием"); - } - } - } - rdo::runtime::RDOValue val; - LPRDOParam pPatternParam = m_pPattern->m_paramList.at(m_currParam); - if (pParam->value().getAsString() == "*") - { - if (!pPatternParam->getDefault()->defined()) - { - Converter::s_converter()->error().push_only(pParam->src_pos(), rdo::format("Нет значения по умолчанию для параметра '%s'", pPatternParam->src_text().c_str())); - Converter::s_converter()->error().push_only(pPatternParam->src_info(), rdo::format("См. параметр '%s', тип '%s'", pPatternParam->src_text().c_str(), pPatternParam->getType()->src_info().src_text().c_str())); - Converter::s_converter()->error().push_done(); - } - val = pPatternParam->getDefault()->value(); - } - else - { - val = pPatternParam->getType()->value_cast(pParam)->value(); - } - - m_paramValuesAsString.push_back(pParam->src_text()); - - m_currParam++; + ASSERT(pParam); + + if (m_pPattern->m_paramList.size() <= m_currParam) + { + if (pParam->src_pos().m_first_line == src_pos().m_first_line) + { + if (dynamic_cast(this)) + { + Converter::s_converter()->error().push_only(pParam->src_info(), rdo::format("Слишком много параметров для образца '%s' при описании операции '%s'", m_pPattern->name().c_str(), name().c_str())); + } + else + { + Converter::s_converter()->error().push_only(pParam->src_info(), rdo::format("Слишком много параметров для образца '%s' при описании активности '%s'", m_pPattern->name().c_str(), name().c_str())); + } + Converter::s_converter()->error().push_only(m_pPattern->src_info(), "См. образец"); + Converter::s_converter()->error().push_done(); + } + else + { + if (dynamic_cast(this)) + { + Converter::s_converter()->error().error(pParam->src_info(), "Имя операции должно заканчиваться двоеточием"); + } + else + { + Converter::s_converter()->error().error(pParam->src_info(), "Имя активности должно заканчиваться двоеточием"); + } + } + } + rdo::runtime::RDOValue val; + LPRDOParam pPatternParam = m_pPattern->m_paramList.at(m_currParam); + if (pParam->value().getAsString() == "*") + { + if (!pPatternParam->getDefault()->defined()) + { + Converter::s_converter()->error().push_only(pParam->src_pos(), rdo::format("Нет значения по умолчанию для параметра '%s'", pPatternParam->src_text().c_str())); + Converter::s_converter()->error().push_only(pPatternParam->src_info(), rdo::format("См. параметр '%s', тип '%s'", pPatternParam->src_text().c_str(), pPatternParam->getType()->src_info().src_text().c_str())); + Converter::s_converter()->error().push_done(); + } + val = pPatternParam->getDefault()->value(); + } + else + { + val = pPatternParam->getType()->value_cast(pParam)->value(); + } + + m_paramValuesAsString.push_back(pParam->src_text()); + + m_currParam++; } void RDODPTActivity::endParam(const YYLTYPE& param_pos) { - if (m_pPattern->m_paramList.size() > m_currParam) - { - LPRDOParam pPatternParam = m_pPattern->m_paramList.at(m_currParam); - Converter::s_converter()->error().push_only(param_pos, rdo::format("Указаны не все параметра образца '%s':", m_pPattern->src_text().c_str())); - for (std::size_t i = m_currParam; i < m_pPattern->m_paramList.size(); i++) - { - pPatternParam = m_pPattern->m_paramList.at(i); - Converter::s_converter()->error().push_only(pPatternParam->src_info(), rdo::format("Ожидаемый параметр '%s' имеет тип '%s'", pPatternParam->name().c_str(), pPatternParam->getType()->src_text().c_str())); - } - Converter::s_converter()->error().push_done(); - } - if (m_pPattern->getType() == RDOPATPattern::PT_Keyboard) - { - if (!static_cast(this)->hasHotKey()) - { - if (dynamic_cast(this)) - { - Converter::s_converter()->error().push_only(param_pos, "Для клавиатурной операции должна быть указана клавиша"); - } - else - { - Converter::s_converter()->error().push_only(param_pos, "Для активности должна быть указана клавиша"); - } - Converter::s_converter()->error().push_only(m_pPattern->src_info(), "См. образец"); - Converter::s_converter()->error().push_done(); - } - } - - planningInsertIntoSMR(); + if (m_pPattern->m_paramList.size() > m_currParam) + { + LPRDOParam pPatternParam = m_pPattern->m_paramList.at(m_currParam); + Converter::s_converter()->error().push_only(param_pos, rdo::format("Указаны не все параметра образца '%s':", m_pPattern->src_text().c_str())); + for (std::size_t i = m_currParam; i < m_pPattern->m_paramList.size(); i++) + { + pPatternParam = m_pPattern->m_paramList.at(i); + Converter::s_converter()->error().push_only(pPatternParam->src_info(), rdo::format("Ожидаемый параметр '%s' имеет тип '%s'", pPatternParam->name().c_str(), pPatternParam->getType()->src_text().c_str())); + } + Converter::s_converter()->error().push_done(); + } + if (m_pPattern->getType() == RDOPATPattern::Type::KEYBOARD) + { + if (!static_cast(this)->hasHotKey()) + { + if (dynamic_cast(this)) + { + Converter::s_converter()->error().push_only(param_pos, "Для клавиатурной операции должна быть указана клавиша"); + } + else + { + Converter::s_converter()->error().push_only(param_pos, "Для активности должна быть указана клавиша"); + } + Converter::s_converter()->error().push_only(m_pPattern->src_info(), "См. образец"); + Converter::s_converter()->error().push_done(); + } + } + + planningInsertIntoSMR(); } void RDODPTActivity::planningInsertIntoSMR() const { - if (pattern()->getType() != RDOPATPattern::PT_IE) - return; + if (pattern()->getType() != RDOPATPattern::Type::IE) + return; - const std::string planning_time = boost::str(boost::format("time_now + %s") - % pattern()->time->calc()->srcInfo().src_text()); + const std::string planning_time = boost::str(boost::format("time_now + %s") + % pattern()->time->calc()->srcInfo().src_text()); - std::vector planning_params; - planning_params.push_back(planning_time); - boost::range::insert(planning_params, planning_params.end(), m_paramValuesAsString); + std::vector planning_params; + planning_params.push_back(planning_time); + boost::range::insert(planning_params, planning_params.end(), m_paramValuesAsString); - const std::string planning = boost::str(boost::format("%s.planning(%s)\r\n") - % pattern()->name() - % boost::algorithm::join(planning_params, ", ")); + const std::string planning = boost::str(boost::format("%s.planning(%s)\r\n") + % pattern()->name() + % boost::algorithm::join(planning_params, ", ")); - LPDocUpdate pPlanningInsertIntoSMR = rdo::Factory::create( - IDocUpdate::Position::POSITION_END, - planning, - IDocument::SMR); - Converter::s_converter()->insertDocUpdate(pPlanningInsertIntoSMR); + LPDocUpdate pPlanningInsertIntoSMR = rdo::Factory::create( + IDocUpdate::Position::Type::POSITION_END, + planning, + IDocument::Type::SMR); + Converter::s_converter()->insertDocUpdate(pPlanningInsertIntoSMR); } bool RDODPTActivity::setPrior(LPRDOFUNArithm& /*pPrior*/) { - return false; + return false; } // -------------------------------------------------------------------------------- // -------------------- RDODPTActivityHotKey // -------------------------------------------------------------------------------- RDODPTActivityHotKey::RDODPTActivityHotKey(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info) - : RDODPTActivity(src_info, pattern_src_info) + : RDODPTActivity(src_info, pattern_src_info) { - switch (pattern()->getType()) - { - case RDOPATPattern::PT_IE : - case RDOPATPattern::PT_Rule : - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - break; + switch (pattern()->getType()) + { + case RDOPATPattern::Type::IE : + case RDOPATPattern::Type::RULE : + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + break; - default: - Converter::s_converter()->error().push_only(this->src_info(), "Неизвестный тип образца"); - Converter::s_converter()->error().push_only(pattern()->src_info(), "См. образец"); - Converter::s_converter()->error().push_done(); - } + default: + Converter::s_converter()->error().push_only(this->src_info(), "Неизвестный тип образца"); + Converter::s_converter()->error().push_only(pattern()->src_info(), "См. образец"); + Converter::s_converter()->error().push_done(); + } } IKeyboard::AddHotKeyResult RDODPTActivityHotKey::addHotKey(const std::string& hotKey) { - rdo::runtime::RDOHotKey::KeyCode scanCode = Converter::s_converter()->runtime()->hotkey().toolkit().codeFromString(hotKey); - if (scanCode == rdo::runtime::RDOHotKey::UNDEFINED_KEY) - { - return IKeyboard::addhk_notfound; - } - if (std::find(m_scanCodeList.begin(), m_scanCodeList.end(), scanCode) != m_scanCodeList.end()) - { - return IKeyboard::addhk_already; - } - m_scanCodeList.push_back(scanCode); - return IKeyboard::addhk_ok; + rdo::runtime::RDOHotKey::KeyCode scanCode = Converter::s_converter()->runtime()->hotkey().toolkit().codeFromString(hotKey); + if (scanCode == rdo::runtime::RDOHotKey::UNDEFINED_KEY) + { + return IKeyboard::AddHotKeyResult::NOTFOUND; + } + if (std::find(m_scanCodeList.begin(), m_scanCodeList.end(), scanCode) != m_scanCodeList.end()) + { + return IKeyboard::AddHotKeyResult::ALREADY; + } + m_scanCodeList.push_back(scanCode); + return IKeyboard::AddHotKeyResult::OK; } bool RDODPTActivityHotKey::hasHotKey() const { - for (const auto key: m_scanCodeList) - { - if (key != VK_SHIFT && key != VK_CONTROL) - return true; - } - return false; + for (const auto key: m_scanCodeList) + { + if (key != VK_SHIFT && key != VK_CONTROL) + return true; + } + return false; } void RDODPTActivityHotKey::addHotKey(const std::string& hotKey, const YYLTYPE& hotkey_pos) { - if (pattern()->getType() != RDOPATPattern::PT_Keyboard) - { - Converter::s_converter()->error().push_only(hotkey_pos, "Горячие клавиши используются только в клавиатурных операциях"); - Converter::s_converter()->error().push_only(pattern()->src_info(), "См. образец"); - Converter::s_converter()->error().push_done(); - } - - switch (addHotKey(hotKey)) - { - case rdo::runtime::RDOKeyboard::addhk_ok: - break; - - case rdo::runtime::RDOKeyboard::addhk_already: - if (dynamic_cast(this)) - { - Converter::s_converter()->error().error(hotkey_pos, rdo::format("Для операции '%s' клавиша уже назначена", src_text().c_str())); - } - else - { - Converter::s_converter()->error().error(hotkey_pos, rdo::format("Для активности '%s' клавиша уже назначена", src_text().c_str())); - } - break; - - case rdo::runtime::RDOKeyboard::addhk_notfound: - Converter::s_converter()->error().error(hotkey_pos, rdo::format("Неизвестная клавиша: %s", hotKey.c_str())); - break; - - case rdo::runtime::RDOKeyboard::addhk_dont: - Converter::s_converter()->error().push_only(src_info(), rdo::format("Операция '%s' не является клавиатурной", src_text().c_str())); - Converter::s_converter()->error().push_only(pattern()->src_info(), "См. образец"); - Converter::s_converter()->error().push_done(); - break; - - default: - Converter::s_converter()->error().error(src_info(), "Внутренная ошибка: RDODPTActivityHotKey::addHotKey"); - } + if (pattern()->getType() != RDOPATPattern::Type::KEYBOARD) + { + Converter::s_converter()->error().push_only(hotkey_pos, "Горячие клавиши используются только в клавиатурных операциях"); + Converter::s_converter()->error().push_only(pattern()->src_info(), "См. образец"); + Converter::s_converter()->error().push_done(); + } + + switch (addHotKey(hotKey)) + { + case rdo::runtime::RDOKeyboard::AddHotKeyResult::OK: + break; + + case rdo::runtime::RDOKeyboard::AddHotKeyResult::ALREADY: + if (dynamic_cast(this)) + { + Converter::s_converter()->error().error(hotkey_pos, rdo::format("Для операции '%s' клавиша уже назначена", src_text().c_str())); + } + else + { + Converter::s_converter()->error().error(hotkey_pos, rdo::format("Для активности '%s' клавиша уже назначена", src_text().c_str())); + } + break; + + case rdo::runtime::RDOKeyboard::AddHotKeyResult::NOTFOUND: + Converter::s_converter()->error().error(hotkey_pos, rdo::format("Неизвестная клавиша: %s", hotKey.c_str())); + break; + + case rdo::runtime::RDOKeyboard::AddHotKeyResult::DONT: + Converter::s_converter()->error().push_only(src_info(), rdo::format("Операция '%s' не является клавиатурной", src_text().c_str())); + Converter::s_converter()->error().push_only(pattern()->src_info(), "См. образец"); + Converter::s_converter()->error().push_done(); + break; + + default: + Converter::s_converter()->error().error(src_info(), "Внутренняя ошибка: RDODPTActivityHotKey::addHotKey"); + } } // -------------------------------------------------------------------------------- // -------------------- RDODPTFreeActivity // -------------------------------------------------------------------------------- RDODPTFreeActivity::RDODPTFreeActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info) - : RDODPTActivityHotKey(pDPT, src_info, pattern_src_info) + : RDODPTActivityHotKey(pDPT, src_info, pattern_src_info) { - Converter::s_converter()->insertDPTFreeActivity(this); + Converter::s_converter()->insertDPTFreeActivity(this); } // -------------------------------------------------------------------------------- // -------------------- RDODPTFree // -------------------------------------------------------------------------------- RDODPTFree::RDODPTFree(const RDOParserSrcInfo& src_info) - : RDOLogicActivity(src_info) + : RDOLogicActivity(src_info) { - Converter::s_converter()->checkDPTName(this->src_info()); - m_pRuntimeLogic = rdo::Factory::create(Converter::s_converter()->runtime()); - ASSERT(m_pRuntimeLogic); - m_pRuntimeLogic->init(Converter::s_converter()->runtime()); - Converter::s_converter()->insertDPTFree(this); + Converter::s_converter()->checkDPTName(this->src_info()); + m_pRuntimeLogic = rdo::Factory::create(Converter::s_converter()->runtime()); + ASSERT(m_pRuntimeLogic); + m_pRuntimeLogic->init(Converter::s_converter()->runtime()); + Converter::s_converter()->insertDPTFree(this); } // -------------------------------------------------------------------------------- // -------------------- RDODPTSomeActivity // -------------------------------------------------------------------------------- RDODPTSomeActivity::RDODPTSomeActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info) - : RDODPTActivityHotKey(pDPT, src_info, pattern_src_info) + : RDODPTActivityHotKey(pDPT, src_info, pattern_src_info) {} // -------------------------------------------------------------------------------- // -------------------- RDODPTPriorActivity // -------------------------------------------------------------------------------- RDODPTPriorActivity::RDODPTPriorActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info) - : RDODPTActivityHotKey(pDPT, src_info, pattern_src_info) + : RDODPTActivityHotKey(pDPT, src_info, pattern_src_info) {} // -------------------------------------------------------------------------------- // -------------------- RDODPTSome // -------------------------------------------------------------------------------- RDODPTSome::RDODPTSome(const RDOParserSrcInfo& src_info, LPILogic pParent) - : RDOLogicActivity(src_info) + : RDOLogicActivity(src_info) { - Converter::s_converter()->checkDPTName(this->src_info()); - m_pRuntimeLogic = rdo::Factory::create(Converter::s_converter()->runtime(), pParent.object_dynamic_cast()).object_dynamic_cast(); - ASSERT(m_pRuntimeLogic); - m_pRuntimeLogic->init(Converter::s_converter()->runtime()); - Converter::s_converter()->insertDPTSome(this); + Converter::s_converter()->checkDPTName(this->src_info()); + m_pRuntimeLogic = rdo::Factory::create(Converter::s_converter()->runtime(), pParent.object_dynamic_cast()).object_dynamic_cast(); + ASSERT(m_pRuntimeLogic); + m_pRuntimeLogic->init(Converter::s_converter()->runtime()); + Converter::s_converter()->insertDPTSome(this); } void RDODPTSome::end() { - if (getConditon()) - { - m_pRuntimeLogic->setCondition(getConditon()->getCalc()); - } + if (getConditon()) + { + m_pRuntimeLogic->setCondition(getConditon()->getCalc()); + } } // -------------------------------------------------------------------------------- // -------------------- RDODPTPrior // -------------------------------------------------------------------------------- RDODPTPrior::RDODPTPrior(const RDOParserSrcInfo& src_info, LPILogic pParent) - : RDOLogicActivity(src_info) + : RDOLogicActivity(src_info) { - Converter::s_converter()->checkDPTName(this->src_info()); - m_pRuntimeLogic = rdo::Factory::create(Converter::s_converter()->runtime(), pParent.object_dynamic_cast()); - ASSERT(m_pRuntimeLogic); - m_pRuntimeLogic->init(Converter::s_converter()->runtime()); - Converter::s_converter()->insertDPTPrior(this); + Converter::s_converter()->checkDPTName(this->src_info()); + m_pRuntimeLogic = rdo::Factory::create(Converter::s_converter()->runtime(), pParent.object_dynamic_cast()); + ASSERT(m_pRuntimeLogic); + m_pRuntimeLogic->init(Converter::s_converter()->runtime()); + Converter::s_converter()->insertDPTPrior(this); } void RDODPTPrior::end() { - if (getConditon()) - { - m_pRuntimeLogic->setCondition(getConditon()->getCalc()); - } + if (getConditon()) + { + m_pRuntimeLogic->setCondition(getConditon()->getCalc()); + } } // -------------------------------------------------------------------------------- // -------------------- RDODPTSearchActivity // -------------------------------------------------------------------------------- RDODPTSearchActivity::RDODPTSearchActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info) - : RDODPTActivity(src_info, pattern_src_info ) - , m_value (IDPTSearchActivity::vt_before) + : RDODPTActivity(src_info, pattern_src_info ) + , m_value (IDPTSearchActivity::CostTime::BEFORE) { - if (pattern()->getType() != RDOPATPattern::PT_Rule) - { - Converter::s_converter()->error().push_only(this->src_info(), "Только продукционные правила могут быть использованы в точке принятия решений типа search"); - Converter::s_converter()->error().push_only(pattern()->src_info(), "См. образец"); - Converter::s_converter()->error().push_done(); - } - for (RDOPATPattern::RelResList::const_iterator it = pattern()->rel_res_begin(); it != pattern()->rel_res_end(); ++it) - { - if (((*it)->m_statusBegin == rdo::runtime::RDOResource::CS_Create) || ((*it)->m_statusBegin == rdo::runtime::RDOResource::CS_Erase)) - { - Converter::s_converter()->error().push_only(this->src_info(), rdo::format("В продукционном правиле '%s' нельзя создавать или удалять ресурсы, т.к. оно используется в точке типа search", src_text().c_str())); - Converter::s_converter()->error().push_only(pattern()->src_info(), "См. образец"); - Converter::s_converter()->error().push_only((*it)->src_info(), "См. релевантный ресурс"); - Converter::s_converter()->error().push_done(); - } - } + if (pattern()->getType() != RDOPATPattern::Type::RULE) + { + Converter::s_converter()->error().push_only(this->src_info(), "Только продукционные правила могут быть использованы в точке принятия решений типа search"); + Converter::s_converter()->error().push_only(pattern()->src_info(), "См. образец"); + Converter::s_converter()->error().push_done(); + } + for (RDOPATPattern::RelResList::const_iterator it = pattern()->rel_res_begin(); it != pattern()->rel_res_end(); ++it) + { + if (((*it)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::CREATE) || ((*it)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE)) + { + Converter::s_converter()->error().push_only(this->src_info(), rdo::format("В продукционном правиле '%s' нельзя создавать или удалять ресурсы, т.к. оно используется в точке типа search", src_text().c_str())); + Converter::s_converter()->error().push_only(pattern()->src_info(), "См. образец"); + Converter::s_converter()->error().push_only((*it)->src_info(), "См. релевантный ресурс"); + Converter::s_converter()->error().push_done(); + } + } } -void RDODPTSearchActivity::setValue(IDPTSearchActivity::ValueTime value, const LPRDOFUNArithm& pRuleCost, const YYLTYPE& param_pos) +void RDODPTSearchActivity::setValue(IDPTSearchActivity::CostTime value, const LPRDOFUNArithm& pRuleCost, const YYLTYPE& param_pos) { - endParam(param_pos); - m_value = value; - m_pRuleCost = pRuleCost; + endParam(param_pos); + m_value = value; + m_pRuleCost = pRuleCost; } // -------------------------------------------------------------------------------- // -------------------- RDODPTSearch // -------------------------------------------------------------------------------- -RDODPTSearch::RDODPTSearch(const RDOParserSrcInfo& src_info, rdo::runtime::RDODPTSearchTrace::DPT_TraceFlag trace, LPILogic pParent) - : RDOLogicActivity(src_info) - , m_pParent(pParent) - , m_closed (false ) - , m_trace (trace ) +RDODPTSearch::RDODPTSearch(const RDOParserSrcInfo& src_info, rdo::runtime::RDODPTSearchTrace::TraceFlag trace, LPILogic pParent) + : RDOLogicActivity(src_info) + , m_pParent(pParent) + , m_closed (false ) + , m_trace (trace ) { - Converter::s_converter()->checkDPTName (this->src_info()); - Converter::s_converter()->insertDPTSearch(this); + Converter::s_converter()->checkDPTName (this->src_info()); + Converter::s_converter()->insertDPTSearch(this); } void RDODPTSearch::end() { - rdo::runtime::LPRDOCalc pCalcCondition = m_pConditon ? m_pConditon->getCalc() : rdo::Factory::create(1).object_parent_cast(); - rdo::runtime::LPRDOCalc pCalcTerminate = m_pTermConditon ? m_pTermConditon->getCalc() : rdo::Factory::create(1).object_parent_cast(); + rdo::runtime::LPRDOCalc pCalcCondition = m_pConditon ? m_pConditon->getCalc() : rdo::Factory::create(1).object_parent_cast(); + rdo::runtime::LPRDOCalc pCalcTerminate = m_pTermConditon ? m_pTermConditon->getCalc() : rdo::Factory::create(1).object_parent_cast(); - m_pRuntimeLogic = rdo::Factory::create(Converter::s_converter()->runtime(), - m_pParent.object_dynamic_cast(), - pCalcCondition, - pCalcTerminate, - m_pEvalBy->createCalc(), - m_compTops, - m_trace); - ASSERT(m_pRuntimeLogic); - m_pRuntimeLogic->init(Converter::s_converter()->runtime()); + m_pRuntimeLogic = rdo::Factory::create(Converter::s_converter()->runtime(), + m_pParent.object_dynamic_cast(), + pCalcCondition, + pCalcTerminate, + m_pEvalBy->createCalc(), + m_compTops, + m_trace); + ASSERT(m_pRuntimeLogic); + m_pRuntimeLogic->init(Converter::s_converter()->runtime()); - int size = getActivities().size(); - for (int i = 0; i < size; i++) - { - LPRDODPTSearchActivity pSearchActivity = getActivities().at(i); - ASSERT(pSearchActivity); - LPIDPTSearchLogic pSearchLogic = m_pRuntimeLogic.object_dynamic_cast(); - ASSERT(pSearchLogic); - } - m_closed = true; + int size = getActivities().size(); + for (int i = 0; i < size; i++) + { + LPRDODPTSearchActivity pSearchActivity = getActivities().at(i); + ASSERT(pSearchActivity); + LPIDPTSearchLogic pSearchLogic = m_pRuntimeLogic.object_dynamic_cast(); + ASSERT(pSearchLogic); + } + m_closed = true; } // -------------------------------------------------------------------------------- @@ -441,57 +441,57 @@ std::string RDOPROCProcess::s_name_prefix = ""; std::string RDOPROCProcess::s_name_sufix = "s"; RDOPROCProcess::RDOPROCProcess(const RDOParserSrcInfo& info) - : RDOParserSrcInfo(info ) - , m_closed (false) + : RDOParserSrcInfo(info ) + , m_closed (false) { - Converter::s_converter()->insertPROCProcess(this); - m_pRuntime = rdo::Factory::create(info.src_text(), Converter::s_converter()->runtime()); - ASSERT(m_pRuntime); - m_pRuntime.object_dynamic_cast()->init(Converter::s_converter()->runtime()); + Converter::s_converter()->insertPROCProcess(this); + m_pRuntime = rdo::Factory::create(info.src_text(), Converter::s_converter()->runtime()); + ASSERT(m_pRuntime); + m_pRuntime.object_dynamic_cast()->init(Converter::s_converter()->runtime()); } bool RDOPROCProcess::setPrior(LPRDOFUNArithm& pPrior) { - LPILogic pRuntimeLogic = getRunTime(); - LPIPriority pPriority = pRuntimeLogic.object_dynamic_cast(); - if (pPriority) - { - return pPriority->setPrior(pPrior->createCalc()); - } - return false; + LPILogic pRuntimeLogic = getRunTime(); + LPIPriority pPriority = pRuntimeLogic.object_dynamic_cast(); + if (pPriority) + { + return pPriority->setPrior(pPrior->createCalc()); + } + return false; } void RDOPROCProcess::end() { - m_closed = true; - if (getConditon()) - { - getRunTime()->setCondition(getConditon()->getCalc()); - } + m_closed = true; + if (getConditon()) + { + getRunTime()->setCondition(getConditon()->getCalc()); + } } void RDOPROCProcess::insertBlock(const LPRDOPROCOperator& pBlock) { - ASSERT(pBlock); - m_blockList.push_back(pBlock); + ASSERT(pBlock); + m_blockList.push_back(pBlock); } void RDOPROCProcess::insertChild(LPRDOPROCProcess& pProcess) { - ASSERT(pProcess); - m_childProcessList.push_back(pProcess); - pProcess->m_pParentProcess = this; + ASSERT(pProcess); + m_childProcessList.push_back(pProcess); + pProcess->m_pParentProcess = this; } // -------------------------------------------------------------------------------- // -------------------- RDOPROCOperator // -------------------------------------------------------------------------------- RDOPROCOperator::RDOPROCOperator(const LPRDOPROCProcess& pProcess, const std::string& name) - : m_name (name ) - , m_pProcess(pProcess) + : m_name (name ) + , m_pProcess(pProcess) { - ASSERT(pProcess); - m_pProcess->insertBlock(this); + ASSERT(pProcess); + m_pProcess->insertBlock(this); } RDOPROCOperator::~RDOPROCOperator() @@ -501,21 +501,21 @@ RDOPROCOperator::~RDOPROCOperator() // -------------------- RDOPROCGenerate // -------------------------------------------------------------------------------- RDOPROCGenerate::RDOPROCGenerate(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& /*pTimeCalc*/) - : RDOPROCOperator(pProcess, name) + : RDOPROCOperator(pProcess, name) {} // -------------------------------------------------------------------------------- // -------------------- RDOPROCBlockForQueue // -------------------------------------------------------------------------------- RDOPROCBlockForQueue::RDOPROCBlockForQueue(const LPRDOPROCProcess& pProcess, const std::string& name) - : RDOPROCOperator(pProcess, name) + : RDOPROCOperator(pProcess, name) {} // -------------------------------------------------------------------------------- // -------------------- RDOPROCQueue // -------------------------------------------------------------------------------- RDOPROCQueue::RDOPROCQueue(const LPRDOPROCProcess& pProcess, const std::string& name) - : RDOPROCBlockForQueue(pProcess, name) + : RDOPROCBlockForQueue(pProcess, name) {} void RDOPROCQueue::createRuntime() @@ -525,17 +525,17 @@ void RDOPROCQueue::createRuntime() void RDOPROCQueue::setResource(const std::string& name) { - ASSERT(!name.empty() ); - ASSERT(m_resourceName.empty()); + ASSERT(!name.empty() ); + ASSERT(m_resourceName.empty()); - m_resourceName = name; + m_resourceName = name; } // -------------------------------------------------------------------------------- // -------------------- RDOPROCDepart // -------------------------------------------------------------------------------- RDOPROCDepart::RDOPROCDepart(const LPRDOPROCProcess& pProcess, const std::string& name) - : RDOPROCBlockForQueue(pProcess, name) + : RDOPROCBlockForQueue(pProcess, name) {} void RDOPROCDepart::createRuntime() @@ -545,24 +545,24 @@ void RDOPROCDepart::createRuntime() void RDOPROCDepart::setResource(const std::string& name) { - ASSERT(!name.empty() ); - ASSERT(m_resourceName.empty()); + ASSERT(!name.empty() ); + ASSERT(m_resourceName.empty()); - m_resourceName = name; + m_resourceName = name; } // -------------------------------------------------------------------------------- // -------------------- RDOPROCBlockForSeize // -------------------------------------------------------------------------------- RDOPROCBlockForSeize::RDOPROCBlockForSeize(const LPRDOPROCProcess& pProcess, const std::string& name) - : RDOPROCOperator(pProcess, name) + : RDOPROCOperator(pProcess, name) {} // -------------------------------------------------------------------------------- // -------------------- RDOPROCSeize // -------------------------------------------------------------------------------- RDOPROCSeize::RDOPROCSeize(const LPRDOPROCProcess& pProcess, const std::string& name) - : RDOPROCBlockForSeize(pProcess, name) + : RDOPROCBlockForSeize(pProcess, name) {} void RDOPROCSeize::createRuntime() @@ -572,15 +572,15 @@ void RDOPROCSeize::createRuntime() void RDOPROCSeize::addResource(const std::string& name) { - ASSERT(!name.empty()); - m_resourceList.push_back(name); + ASSERT(!name.empty()); + m_resourceList.push_back(name); } // -------------------------------------------------------------------------------- // -------------------- RDOPROCRelease // -------------------------------------------------------------------------------- RDOPROCRelease::RDOPROCRelease(const LPRDOPROCProcess& pProcess, const std::string& name) - : RDOPROCBlockForSeize(pProcess, name) + : RDOPROCBlockForSeize(pProcess, name) {} void RDOPROCRelease::createRuntime() @@ -590,38 +590,38 @@ void RDOPROCRelease::createRuntime() void RDOPROCRelease::addResource(const std::string& name) { - ASSERT(!name.empty()); - m_resourceList.push_back(name); + ASSERT(!name.empty()); + m_resourceList.push_back(name); } // -------------------------------------------------------------------------------- // -------------------- RDOPROCAdvance // -------------------------------------------------------------------------------- RDOPROCAdvance::RDOPROCAdvance(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pTimeCalc) - : RDOPROCOperator(pProcess, name) + : RDOPROCOperator(pProcess, name) { - m_pRuntime = rdo::Factory::create(Converter::s_converter()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pTimeCalc).object_dynamic_cast(); - ASSERT(m_pRuntime); + m_pRuntime = rdo::Factory::create(Converter::s_converter()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pTimeCalc).object_dynamic_cast(); + ASSERT(m_pRuntime); } // -------------------------------------------------------------------------------- // -------------------- RDOPROCTerminate // -------------------------------------------------------------------------------- RDOPROCTerminate::RDOPROCTerminate(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pCalc) - : RDOPROCOperator(pProcess, name) + : RDOPROCOperator(pProcess, name) { - m_pRuntime = rdo::Factory::create(Converter::s_converter()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pCalc).object_dynamic_cast(); - ASSERT(m_pRuntime); + m_pRuntime = rdo::Factory::create(Converter::s_converter()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pCalc).object_dynamic_cast(); + ASSERT(m_pRuntime); } // -------------------------------------------------------------------------------- // -------------------- RDOPROCAssign // -------------------------------------------------------------------------------- RDOPROCAssign::RDOPROCAssign(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pValue) - : RDOPROCOperator(pProcess, name) + : RDOPROCOperator(pProcess, name) { - m_pRuntime = rdo::Factory::create(Converter::s_converter()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pValue).object_dynamic_cast(); - ASSERT(m_pRuntime); + m_pRuntime = rdo::Factory::create(Converter::s_converter()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pValue).object_dynamic_cast(); + ASSERT(m_pRuntime); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdodpt.h b/converter/smr2rdox/rdodpt.h index b8e2299e8..8f111614b 100644 --- a/converter/smr2rdox/rdodpt.h +++ b/converter/smr2rdox/rdodpt.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDODPT_H_ -#define _CONVERTOR_RDODPT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -60,29 +59,29 @@ void cnv_proc_opr_error(YYLTYPE* llocp, void* lexer, const char* message); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDODPTActivity); class RDODPTActivity - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDODPTActivity); public: - const std::string& name() const { return src_info().src_text(); } - LPRDOPATPattern pattern() const { return m_pPattern; } + const std::string& name() const { return src_info().src_text(); } + LPRDOPATPattern pattern() const { return m_pPattern; } - void addParam(const LPRDOValue& pParam ); - void endParam(const YYLTYPE& param_pos); + void addParam(const LPRDOValue& pParam ); + void endParam(const YYLTYPE& param_pos); - bool setPrior(LPRDOFUNArithm& pPrior); + bool setPrior(LPRDOFUNArithm& pPrior); protected: - RDODPTActivity(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); - virtual ~RDODPTActivity(); + RDODPTActivity(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); + virtual ~RDODPTActivity(); private: - std::size_t m_currParam; - LPRDOPATPattern m_pPattern; - std::vector m_paramValuesAsString; + std::size_t m_currParam; + LPRDOPATPattern m_pPattern; + std::vector m_paramValuesAsString; - void planningInsertIntoSMR() const; + void planningInsertIntoSMR() const; }; // -------------------------------------------------------------------------------- @@ -91,17 +90,17 @@ DECLARE_FACTORY(RDODPTActivity); class RDODPTActivityHotKey: public RDODPTActivity { public: - void addHotKey(const std::string& hotKey, const YYLTYPE& hotkey_pos); - bool hasHotKey() const; + void addHotKey(const std::string& hotKey, const YYLTYPE& hotkey_pos); + bool hasHotKey() const; protected: - RDODPTActivityHotKey(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); + RDODPTActivityHotKey(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); private: - IKeyboard::AddHotKeyResult addHotKey(const std::string& hotKey); + IKeyboard::AddHotKeyResult addHotKey(const std::string& hotKey); - typedef std::vector ScanCodeList; - ScanCodeList m_scanCodeList; + typedef std::vector ScanCodeList; + ScanCodeList m_scanCodeList; }; DECLARE_POINTER(RDODPTActivityHotKey); @@ -112,7 +111,7 @@ class RDODPTFreeActivity: public RDODPTActivityHotKey { DECLARE_FACTORY(RDODPTFreeActivity); private: - RDODPTFreeActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); + RDODPTFreeActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); }; DECLARE_POINTER(RDODPTFreeActivity); @@ -121,12 +120,12 @@ DECLARE_POINTER(RDODPTFreeActivity); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDODPTFree); class RDODPTFree - : public rdo::counter_reference - , public RDOLogicActivity + : public rdo::counter_reference + , public RDOLogicActivity { DECLARE_FACTORY(RDODPTFree); private: - RDODPTFree(const RDOParserSrcInfo& src_info); + RDODPTFree(const RDOParserSrcInfo& src_info); }; // -------------------------------------------------------------------------------- @@ -136,7 +135,7 @@ class RDODPTSomeActivity: public RDODPTActivityHotKey { DECLARE_FACTORY(RDODPTSomeActivity); private: - RDODPTSomeActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); + RDODPTSomeActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); }; // -------------------------------------------------------------------------------- @@ -146,7 +145,7 @@ class RDODPTPriorActivity: public RDODPTActivityHotKey { DECLARE_FACTORY(RDODPTPriorActivity); private: - RDODPTPriorActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); + RDODPTPriorActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); }; // -------------------------------------------------------------------------------- @@ -154,21 +153,21 @@ DECLARE_FACTORY(RDODPTPriorActivity); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDODPTSome); class RDODPTSome - : public rdo::counter_reference - , public RDOLogicActivity + : public rdo::counter_reference + , public RDOLogicActivity { DECLARE_FACTORY(RDODPTSome); public: - LPILogic getLogic () const { return m_pRuntimeLogic; } - LPRDOFUNLogic getConditon () const { return m_pConditon; } - void setCondition(const LPRDOFUNLogic& pConditon = NULL) { m_pConditon = pConditon; } + LPILogic getLogic () const { return m_pRuntimeLogic; } + LPRDOFUNLogic getConditon () const { return m_pConditon; } + void setCondition(const LPRDOFUNLogic& pConditon = NULL) { m_pConditon = pConditon; } - void end(); + void end(); private: - RDODPTSome(const RDOParserSrcInfo& src_info, LPILogic pParent = NULL); + RDODPTSome(const RDOParserSrcInfo& src_info, LPILogic pParent = NULL); - LPRDOFUNLogic m_pConditon; + LPRDOFUNLogic m_pConditon; }; // -------------------------------------------------------------------------------- @@ -176,21 +175,21 @@ DECLARE_FACTORY(RDODPTSome); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDODPTPrior); class RDODPTPrior - : public rdo::counter_reference - , public RDOLogicActivity + : public rdo::counter_reference + , public RDOLogicActivity { DECLARE_FACTORY(RDODPTPrior); public: - LPILogic getLogic () const { return m_pRuntimeLogic; } - LPRDOFUNLogic getConditon () const { return m_pConditon; } - void setCondition(const LPRDOFUNLogic& pConditon = NULL) { m_pConditon = pConditon; } + LPILogic getLogic () const { return m_pRuntimeLogic; } + LPRDOFUNLogic getConditon () const { return m_pConditon; } + void setCondition(const LPRDOFUNLogic& pConditon = NULL) { m_pConditon = pConditon; } - void end(); + void end(); private: - RDODPTPrior(const RDOParserSrcInfo& src_info, LPILogic pParent = NULL); + RDODPTPrior(const RDOParserSrcInfo& src_info, LPILogic pParent = NULL); - LPRDOFUNLogic m_pConditon; + LPRDOFUNLogic m_pConditon; }; // -------------------------------------------------------------------------------- @@ -200,18 +199,18 @@ class RDODPTSearchActivity: public RDODPTActivity { DECLARE_FACTORY(RDODPTSearchActivity); public: - IDPTSearchActivity::ValueTime getValue() const { return m_value; } - void setValue(IDPTSearchActivity::ValueTime value, - const LPRDOFUNArithm& pRuleCost, - const YYLTYPE& param_pos); + IDPTSearchActivity::CostTime getValue() const { return m_value; } + void setValue(IDPTSearchActivity::CostTime value, + const LPRDOFUNArithm& pRuleCost, + const YYLTYPE& param_pos); - LPRDOFUNArithm getRuleCost() const { return m_pRuleCost; } + LPRDOFUNArithm getRuleCost() const { return m_pRuleCost; } private: - RDODPTSearchActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); + RDODPTSearchActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); - IDPTSearchActivity::ValueTime m_value; - LPRDOFUNArithm m_pRuleCost; + IDPTSearchActivity::CostTime m_value; + LPRDOFUNArithm m_pRuleCost; }; DECLARE_POINTER(RDODPTSearchActivity); @@ -220,29 +219,29 @@ DECLARE_POINTER(RDODPTSearchActivity); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDODPTSearch); class RDODPTSearch - : public rdo::counter_reference - , public RDOLogicActivity + : public rdo::counter_reference + , public RDOLogicActivity { DECLARE_FACTORY(RDODPTSearch); public: - void setCondition(const LPRDOFUNLogic& pConditon = NULL) { m_pConditon = pConditon; } - void setTermCondition(const LPRDOFUNLogic& pTermConditon = NULL) { m_pTermConditon = pTermConditon; } - void setEvaluateBy(const LPRDOFUNArithm& pEvalBy) { m_pEvalBy = pEvalBy; } - void setCompareTops(bool compTops ) { m_compTops = compTops; } + void setCondition(const LPRDOFUNLogic& pConditon = NULL) { m_pConditon = pConditon; } + void setTermCondition(const LPRDOFUNLogic& pTermConditon = NULL) { m_pTermConditon = pTermConditon; } + void setEvaluateBy(const LPRDOFUNArithm& pEvalBy) { m_pEvalBy = pEvalBy; } + void setCompareTops(bool compTops ) { m_compTops = compTops; } - void end(); - bool closed() const { return m_closed; } + void end(); + bool closed() const { return m_closed; } private: - RDODPTSearch(const RDOParserSrcInfo& src_info, rdo::runtime::RDODPTSearchTrace::DPT_TraceFlag trace = rdo::runtime::RDODPTSearchTrace::DPT_no_trace, LPILogic pParent = NULL); - - LPRDOFUNLogic m_pConditon; - LPRDOFUNLogic m_pTermConditon; - LPRDOFUNArithm m_pEvalBy; - LPILogic m_pParent; - bool m_compTops; - bool m_closed; - rdo::runtime::RDODPTSearchTrace::DPT_TraceFlag m_trace; + RDODPTSearch(const RDOParserSrcInfo& src_info, rdo::runtime::RDODPTSearchTrace::TraceFlag trace = rdo::runtime::RDODPTSearchTrace::TraceFlag::NO_TRACE, LPILogic pParent = NULL); + + LPRDOFUNLogic m_pConditon; + LPRDOFUNLogic m_pTermConditon; + LPRDOFUNArithm m_pEvalBy; + LPILogic m_pParent; + bool m_compTops; + bool m_closed; + rdo::runtime::RDODPTSearchTrace::TraceFlag m_trace; }; // -------------------------------------------------------------------------------- @@ -252,40 +251,40 @@ PREDECLARE_POINTER(RDOPROCOperator); PREDECLARE_POINTER(RDOPROCProcess); class RDOPROCProcess - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOPROCProcess); public: - static std::string s_name_prefix; - static std::string s_name_sufix; + static std::string s_name_prefix; + static std::string s_name_sufix; - void end(); - bool closed() const { return m_closed; } + void end(); + bool closed() const { return m_closed; } - void setCondition(const LPRDOFUNLogic& pConditon = NULL) { m_pConditon = pConditon; } - LPRDOFUNLogic getConditon () const { return m_pConditon; } + void setCondition(const LPRDOFUNLogic& pConditon = NULL) { m_pConditon = pConditon; } + LPRDOFUNLogic getConditon () const { return m_pConditon; } - bool setPrior(LPRDOFUNArithm& pPrior); - void insertBlock(const LPRDOPROCOperator& pBlock); - void insertChild(LPRDOPROCProcess& pProcess); + bool setPrior(LPRDOFUNArithm& pPrior); + void insertBlock(const LPRDOPROCOperator& pBlock); + void insertChild(LPRDOPROCProcess& pProcess); - LPILogic getRunTime () const { return m_pRuntime; } + LPILogic getRunTime () const { return m_pRuntime; } protected: - typedef std::list ProcessList; - typedef std::list BlockList; + typedef std::list ProcessList; + typedef std::list BlockList; - bool m_closed; - LPRDOPROCProcess m_pParentProcess; - ProcessList m_childProcessList; - BlockList m_blockList; - LPILogic m_pRuntime; + bool m_closed; + LPRDOPROCProcess m_pParentProcess; + ProcessList m_childProcessList; + BlockList m_blockList; + LPILogic m_pRuntime; private: - RDOPROCProcess(const RDOParserSrcInfo& info); + RDOPROCProcess(const RDOParserSrcInfo& info); - LPRDOFUNLogic m_pConditon; + LPRDOFUNLogic m_pConditon; }; // -------------------------------------------------------------------------------- @@ -296,11 +295,11 @@ class RDOPROCOperator: public rdo::counter_reference { DECLARE_FACTORY(RDOPROCOperator); protected: - std::string m_name; - LPRDOPROCProcess m_pProcess; + std::string m_name; + LPRDOPROCProcess m_pProcess; - RDOPROCOperator(const LPRDOPROCProcess& pProcess, const std::string& name); - virtual ~RDOPROCOperator(); + RDOPROCOperator(const LPRDOPROCProcess& pProcess, const std::string& name); + virtual ~RDOPROCOperator(); }; // -------------------------------------------------------------------------------- @@ -310,10 +309,10 @@ class RDOPROCGenerate: public RDOPROCOperator { DECLARE_FACTORY(RDOPROCGenerate); protected: - LPIPROCBlock m_pRuntime; + LPIPROCBlock m_pRuntime; private: - RDOPROCGenerate(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pTimeCalc); + RDOPROCGenerate(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pTimeCalc); }; // -------------------------------------------------------------------------------- @@ -322,10 +321,10 @@ DECLARE_FACTORY(RDOPROCGenerate); class RDOPROCBlockForQueue: public RDOPROCOperator { protected: - RDOPROCBlockForQueue(const LPRDOPROCProcess& pProcess, const std::string& name); + RDOPROCBlockForQueue(const LPRDOPROCProcess& pProcess, const std::string& name); - //! m_parserForRuntime служит для передачи информации о параметре "Состояние" ресурса - rdo::runtime::parser_for_Queue m_parserForRuntime; + // m_parserForRuntime служит для передачи информации о параметре "Состояние" ресурса + rdo::runtime::parser_for_Queue m_parserForRuntime; }; // -------------------------------------------------------------------------------- @@ -335,15 +334,15 @@ class RDOPROCQueue: public RDOPROCBlockForQueue { DECLARE_FACTORY(RDOPROCQueue); public: - void createRuntime(); - void setResource(const std::string& name); + void createRuntime(); + void setResource(const std::string& name); protected: - std::string m_resourceName; - LPIPROCBlock m_pRuntime; + std::string m_resourceName; + LPIPROCBlock m_pRuntime; private: - RDOPROCQueue(const LPRDOPROCProcess& pProcess, const std::string& name); + RDOPROCQueue(const LPRDOPROCProcess& pProcess, const std::string& name); }; DECLARE_POINTER(RDOPROCQueue); @@ -354,15 +353,15 @@ class RDOPROCDepart: public RDOPROCBlockForQueue { DECLARE_FACTORY(RDOPROCDepart); public: - void createRuntime(); - void setResource(const std::string& name); + void createRuntime(); + void setResource(const std::string& name); protected: - std::string m_resourceName; - LPIPROCBlock m_pRuntime; + std::string m_resourceName; + LPIPROCBlock m_pRuntime; private: - RDOPROCDepart(const LPRDOPROCProcess& pProcess, const std::string& name); + RDOPROCDepart(const LPRDOPROCProcess& pProcess, const std::string& name); }; DECLARE_POINTER(RDOPROCDepart); @@ -372,10 +371,10 @@ DECLARE_POINTER(RDOPROCDepart); class RDOPROCBlockForSeize: public RDOPROCOperator { protected: - RDOPROCBlockForSeize(const LPRDOPROCProcess& pProcess, const std::string& name); + RDOPROCBlockForSeize(const LPRDOPROCProcess& pProcess, const std::string& name); - //! m_parserForRuntime служит для передачи информации о параметре "Состояние" ресурса - rdo::runtime::parser_for_Seize m_parserForRuntime; + // m_parserForRuntime служит для передачи информации о параметре "Состояние" ресурса + rdo::runtime::parser_for_Seize m_parserForRuntime; }; // -------------------------------------------------------------------------------- @@ -385,19 +384,19 @@ class RDOPROCSeize: public RDOPROCBlockForSeize { DECLARE_FACTORY(RDOPROCSeize); public: - void createRuntime(); - void addResource(const std::string& name); + void createRuntime(); + void addResource(const std::string& name); protected: - typedef std::list ResourceList; - typedef std::vector ParserForRuntime; + typedef std::list ResourceList; + typedef std::vector ParserForRuntime; - ResourceList m_resourceList; - ParserForRuntime m_parserForRuntime; - LPIPROCBlock m_pRuntime; + ResourceList m_resourceList; + ParserForRuntime m_parserForRuntime; + LPIPROCBlock m_pRuntime; private: - RDOPROCSeize(const LPRDOPROCProcess& pProcess, const std::string& name); + RDOPROCSeize(const LPRDOPROCProcess& pProcess, const std::string& name); }; DECLARE_POINTER(RDOPROCSeize); @@ -408,19 +407,19 @@ class RDOPROCRelease: public RDOPROCBlockForSeize { DECLARE_FACTORY(RDOPROCRelease); public: - void createRuntime(); - void addResource(const std::string& name); + void createRuntime(); + void addResource(const std::string& name); protected: - typedef std::list ResourceList; - typedef std::vector ParserForRuntime; + typedef std::list ResourceList; + typedef std::vector ParserForRuntime; - ResourceList m_resourceList; - ParserForRuntime m_parserForRuntime; - LPIPROCBlock m_pRuntime; + ResourceList m_resourceList; + ParserForRuntime m_parserForRuntime; + LPIPROCBlock m_pRuntime; private: - RDOPROCRelease(const LPRDOPROCProcess& pProcess, const std::string& name); + RDOPROCRelease(const LPRDOPROCProcess& pProcess, const std::string& name); }; DECLARE_POINTER(RDOPROCRelease); @@ -431,10 +430,10 @@ class RDOPROCAdvance: public RDOPROCOperator { DECLARE_FACTORY(RDOPROCAdvance); protected: - LPIPROCBlock m_pRuntime; + LPIPROCBlock m_pRuntime; private: - RDOPROCAdvance(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pTimeCalc); + RDOPROCAdvance(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pTimeCalc); }; // -------------------------------------------------------------------------------- @@ -445,10 +444,10 @@ class RDOPROCTerminate: public RDOPROCOperator DECLARE_FACTORY(RDOPROCTerminate); protected: - LPIPROCBlock m_pRuntime; + LPIPROCBlock m_pRuntime; private: - RDOPROCTerminate(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pCalc); + RDOPROCTerminate(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pCalc); }; // -------------------------------------------------------------------------------- @@ -458,12 +457,10 @@ class RDOPROCAssign: public RDOPROCOperator { DECLARE_FACTORY(RDOPROCAssign); protected: - LPIPROCBlock m_pRuntime; + LPIPROCBlock m_pRuntime; private: - RDOPROCAssign(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pValue); + RDOPROCAssign(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pValue); }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDODPT_H_ diff --git a/converter/smr2rdox/rdofrm.cpp b/converter/smr2rdox/rdofrm.cpp index 73561d588..6c7c4eaf2 100644 --- a/converter/smr2rdox/rdofrm.cpp +++ b/converter/smr2rdox/rdofrm.cpp @@ -12,9 +12,9 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE int cnv_frmlex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void cnv_frmerror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -24,74 +24,74 @@ void cnv_frmerror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) // -------------------- RDOFRMFrame // -------------------------------------------------------------------------------- RDOFRMFrame::RDOFRMFrame(const RDOParserSrcInfo& srcInfo) - : RDOParserSrcInfo(srcInfo) - , m_itemCount (0) + : RDOParserSrcInfo(srcInfo) + , m_itemCount (0) { - m_pFrame = rdo::Factory::create(srcInfo); - Converter::s_converter()->insertFRMFrame(this); + m_pFrame = rdo::Factory::create(srcInfo); + Converter::s_converter()->insertFRMFrame(this); } void RDOFRMFrame::setShowIfBlock(const Seek& firstSeek) { - if (m_firstSeek.is_initialized() && m_lastSeek.is_initialized() && m_itemCount > 1) - { - LPDocUpdate pOpenBraceInsert = rdo::Factory::create( - *m_firstSeek, - "\r\n{" - ); - ASSERT(pOpenBraceInsert); - Converter::s_converter()->insertDocUpdate(pOpenBraceInsert); + if (m_firstSeek.is_initialized() && m_lastSeek.is_initialized() && m_itemCount > 1) + { + LPDocUpdate pOpenBraceInsert = rdo::Factory::create( + *m_firstSeek, + "\r\n{" + ); + ASSERT(pOpenBraceInsert); + Converter::s_converter()->insertDocUpdate(pOpenBraceInsert); - LPDocUpdate pCloseBraceInsert = rdo::Factory::create( - *m_lastSeek, - "\r\n}" - ); - ASSERT(pCloseBraceInsert); - Converter::s_converter()->insertDocUpdate(pCloseBraceInsert); - } + LPDocUpdate pCloseBraceInsert = rdo::Factory::create( + *m_lastSeek, + "\r\n}" + ); + ASSERT(pCloseBraceInsert); + Converter::s_converter()->insertDocUpdate(pCloseBraceInsert); + } - m_itemCount = 0; - m_firstSeek = firstSeek; - m_lastSeek.reset(); + m_itemCount = 0; + m_firstSeek = firstSeek; + m_lastSeek.reset(); } void RDOFRMFrame::addItem(const rdo::runtime::LPRDOCalc&, std::size_t lastSeek) { - ++m_itemCount; - m_lastSeek = lastSeek; + ++m_itemCount; + m_lastSeek = lastSeek; } void RDOFRMFrame::setFrameConditionPos(std::size_t firstSeek, std::size_t lastSeek) { - m_frameConditionPos = std::make_pair(firstSeek, lastSeek); + m_frameConditionPos = std::make_pair(firstSeek, lastSeek); } void RDOFRMFrame::onAfterBackPicture(std::size_t lastSeek) { - if (!m_frameConditionPos.is_initialized()) - return; + if (!m_frameConditionPos.is_initialized()) + return; - LPDocUpdate pFrameConditionBeginInsert = rdo::Factory::create( - lastSeek, - "\n// Условие показа фрейма\nif (!(" - ); - ASSERT(pFrameConditionBeginInsert); - Converter::s_converter()->insertDocUpdate(pFrameConditionBeginInsert); + LPDocUpdate pFrameConditionBeginInsert = rdo::Factory::create( + lastSeek, + "\n// Условие показа фрейма\nif (!(" + ); + ASSERT(pFrameConditionBeginInsert); + Converter::s_converter()->insertDocUpdate(pFrameConditionBeginInsert); - LPDocUpdate pConditionMove = rdo::Factory::create( - m_frameConditionPos->first, - m_frameConditionPos->second, - lastSeek - ); - ASSERT(pConditionMove); - Converter::s_converter()->insertDocUpdate(pConditionMove); + LPDocUpdate pConditionMove = rdo::Factory::create( + m_frameConditionPos->first, + m_frameConditionPos->second, + lastSeek + ); + ASSERT(pConditionMove); + Converter::s_converter()->insertDocUpdate(pConditionMove); - LPDocUpdate pFrameConditionEndInsert = rdo::Factory::create( - lastSeek, - "))\n return;\n" - ); - ASSERT(pFrameConditionEndInsert); - Converter::s_converter()->insertDocUpdate(pFrameConditionEndInsert); + LPDocUpdate pFrameConditionEndInsert = rdo::Factory::create( + lastSeek, + "))\n return;\n" + ); + ASSERT(pFrameConditionEndInsert); + Converter::s_converter()->insertDocUpdate(pFrameConditionEndInsert); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdofrm.h b/converter/smr2rdox/rdofrm.h index 8aa496c1a..0aa0038d4 100644 --- a/converter/smr2rdox/rdofrm.h +++ b/converter/smr2rdox/rdofrm.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOFRM_H_ -#define _CONVERTOR_RDOFRM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -20,33 +19,31 @@ void cnv_frmerror(YYLTYPE* llocp, void* lexer, const char* message); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOFRMFrame); class RDOFRMFrame - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOFRMFrame); public: - const std::string& name() const { return src_info().src_text(); } - const rdo::runtime::LPRDOFRMFrame& frame() const { return m_pFrame; } + const std::string& name() const { return src_info().src_text(); } + const rdo::runtime::LPRDOFRMFrame& frame() const { return m_pFrame; } - typedef boost::optional Seek; + typedef boost::optional Seek; - void setShowIfBlock(const Seek& firstSeek); - void addItem(const rdo::runtime::LPRDOCalc& pItem, std::size_t lastSeek); - void setFrameConditionPos(std::size_t firstSeek, std::size_t lastSeek); - void onAfterBackPicture(std::size_t lastSeek); + void setShowIfBlock(const Seek& firstSeek); + void addItem(const rdo::runtime::LPRDOCalc& pItem, std::size_t lastSeek); + void setFrameConditionPos(std::size_t firstSeek, std::size_t lastSeek); + void onAfterBackPicture(std::size_t lastSeek); private: - RDOFRMFrame(const RDOParserSrcInfo& src_info); + RDOFRMFrame(const RDOParserSrcInfo& src_info); - typedef boost::optional> PosPair; + typedef boost::optional> PosPair; - rdo::runtime::LPRDOFRMFrame m_pFrame; - Seek m_firstSeek; - Seek m_lastSeek; - std::size_t m_itemCount; - PosPair m_frameConditionPos; + rdo::runtime::LPRDOFRMFrame m_pFrame; + Seek m_firstSeek; + Seek m_lastSeek; + std::size_t m_itemCount; + PosPair m_frameConditionPos; }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOFRM_H_ diff --git a/converter/smr2rdox/rdofun.cpp b/converter/smr2rdox/rdofun.cpp index 4e090e6b6..bc0dc2008 100644 --- a/converter/smr2rdox/rdofun.cpp +++ b/converter/smr2rdox/rdofun.cpp @@ -26,9 +26,9 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE int cnv_funlex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void cnv_funerror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -39,10 +39,10 @@ void cnv_funerror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) // -------------------------------------------------------------------------------- void RDOFUNDoubleToIntByResult::roundCalc() { - for (const auto& calc: m_intOrDouble) - { - calc->needRound(); - } + for (const auto& calc: m_intOrDouble) + { + calc->needRound(); + } } // -------------------------------------------------------------------------------- @@ -54,12 +54,12 @@ rdo::runtime::LPRDOCalcConst pConstCalc2 = pSecond->m_pCalc.object_dynamic_cast< rdo::runtime::LPRDOCalc pNewCalc; \ if (pConstCalc1 && pConstCalc2) \ { \ - pNewCalc = rdo::Factory::create(pConstCalc1->getValue() OPR pConstCalc2->getValue()); \ - pNewCalc->setSrcInfo(rdo::runtime::RDOCalc##CALC::getStaticSrcInfo(pConstCalc1, pConstCalc2)); \ + pNewCalc = rdo::Factory::create(pConstCalc1->getValue() OPR pConstCalc2->getValue()); \ + pNewCalc->setSrcInfo(rdo::runtime::RDOCalc##CALC::getStaticSrcInfo(pConstCalc1, pConstCalc2)); \ } \ else \ { \ - pNewCalc = rdo::Factory::create(m_pCalc, pSecond->m_pCalc); \ + pNewCalc = rdo::Factory::create(m_pCalc, pSecond->m_pCalc); \ } #define RETURN_LOGIC() \ @@ -75,14 +75,14 @@ RETURN_LOGIC(); #define CAST_ARITHM_VALUE(OPR, ERROR) \ try \ { \ - if (beforeCastValue(pSecond) == CR_CONTINUE) \ - { \ - value()->value() OPR pSecond->value()->value(); \ - } \ + if (beforeCastValue(pSecond) == CastResult::CONTINUE) \ + { \ + value()->value() OPR pSecond->value()->value(); \ + } \ } \ catch (const rdo::runtime::RDOValueException&) \ { \ - Converter::s_converter()->error().error(pSecond->src_info(), rdo::format(ERROR, type()->name().c_str(), pSecond->type()->name().c_str())); \ + Converter::s_converter()->error().error(pSecond->src_info(), rdo::format(ERROR, type()->name().c_str(), pSecond->type()->name().c_str())); \ } #define GET_ARITHM_PRE_TYPE() \ @@ -110,136 +110,136 @@ RETURN_LOGIC() // -------------------- RDOFUNLogic // -------------------------------------------------------------------------------- RDOFUNLogic::RDOFUNLogic(const LPRDOFUNArithm& pArithm) - : RDOParserSrcInfo(pArithm->src_info()) + : RDOParserSrcInfo(pArithm->src_info()) { - switch (pArithm->typeID()) - { - case rdo::runtime::RDOType::t_bool: m_pCalc = pArithm->calc(); break; - default : break; - } - if (!m_pCalc) - { - Converter::s_converter()->error().error(src_info(), rdo::format("Ожидается логическое выражение, найдено: %s", src_text().c_str())); - } + switch (pArithm->typeID()) + { + case rdo::runtime::RDOType::Type::BOOL: m_pCalc = pArithm->calc(); break; + default : break; + } + if (!m_pCalc) + { + Converter::s_converter()->error().error(src_info(), rdo::format("Ожидается логическое выражение, найдено: %s", src_text().c_str())); + } } RDOFUNLogic::RDOFUNLogic(const rdo::runtime::LPRDOCalc& pCalc, bool hideWarning) - : RDOParserSrcInfo( ) - , m_pCalc (pCalc) -{ - if (m_pCalc) - { - rdo::runtime::RDOSrcInfo srcInfo(m_pCalc->srcInfo()); - srcInfo.setSrcFileType(src_filetype()); - m_pCalc->setSrcInfo(srcInfo); - } - if (!hideWarning) - { - rdo::runtime::LPRDOCalcConst pConstCalc = m_pCalc.object_dynamic_cast(); - if (pConstCalc) - { - if (pConstCalc->calcValue(Converter::s_converter()->runtime()).getAsBool()) - { - Converter::s_converter()->error().warning(pConstCalc->srcInfo(), rdo::format("Логическое выражение всегда истинно: %s", pConstCalc->srcInfo().src_text().c_str())); - } - else - { - Converter::s_converter()->error().warning(pConstCalc->srcInfo(), rdo::format("Логическое выражение всегда ложно: %s", pConstCalc->srcInfo().src_text().c_str())); - } - } - } + : RDOParserSrcInfo( ) + , m_pCalc (pCalc) +{ + if (m_pCalc) + { + rdo::runtime::RDOSrcInfo srcInfo(m_pCalc->srcInfo()); + srcInfo.setSrcFileType(src_filetype()); + m_pCalc->setSrcInfo(srcInfo); + } + if (!hideWarning) + { + rdo::runtime::LPRDOCalcConst pConstCalc = m_pCalc.object_dynamic_cast(); + if (pConstCalc) + { + if (pConstCalc->calcValue(Converter::s_converter()->runtime()).getAsBool()) + { + Converter::s_converter()->error().warning(pConstCalc->srcInfo(), rdo::format("Логическое выражение всегда истинно: %s", pConstCalc->srcInfo().src_text().c_str())); + } + else + { + Converter::s_converter()->error().warning(pConstCalc->srcInfo(), rdo::format("Логическое выражение всегда ложно: %s", pConstCalc->srcInfo().src_text().c_str())); + } + } + } } RDOFUNLogic::~RDOFUNLogic() {} -rdo::runtime::LPRDOCalc RDOFUNLogic::getCalc(rdo::runtime::RDOType::TypeID id) +rdo::runtime::LPRDOCalc RDOFUNLogic::getCalc(rdo::runtime::RDOType::Type id) { - if (id != rdo::runtime::RDOType::t_real) - { - m_intOrDouble.roundCalc(); - } - return m_pCalc; + if (id != rdo::runtime::RDOType::Type::REAL) + { + m_intOrDouble.roundCalc(); + } + return m_pCalc; } LPRDOFUNLogic RDOFUNLogic::operator&& (const LPRDOFUNLogic& pSecond) { - GENERATE_LOGIC(And, &&); + GENERATE_LOGIC(And, &&); } LPRDOFUNLogic RDOFUNLogic::operator|| (const LPRDOFUNLogic& pSecond) { - GENERATE_LOGIC(Or, ||); + GENERATE_LOGIC(Or, ||); } LPRDOFUNLogic RDOFUNLogic::operator_not() { - rdo::runtime::LPRDOCalc pNewCalc = rdo::Factory::create(m_pCalc->srcInfo().src_pos(), m_pCalc); - LPRDOFUNLogic pLogic = rdo::Factory::create(pNewCalc, false); - pLogic->setSrcInfo(pNewCalc->srcInfo()); - pLogic->m_intOrDouble.insert(m_intOrDouble); - return pLogic; + rdo::runtime::LPRDOCalc pNewCalc = rdo::Factory::create(m_pCalc->srcInfo().src_pos(), m_pCalc); + LPRDOFUNLogic pLogic = rdo::Factory::create(pNewCalc, false); + pLogic->setSrcInfo(pNewCalc->srcInfo()); + pLogic->m_intOrDouble.insert(m_intOrDouble); + return pLogic; } void RDOFUNLogic::setSrcInfo(const RDOParserSrcInfo& src_info) { - RDOParserSrcInfo::setSrcInfo(src_info); - if (m_pCalc) - { - m_pCalc->setSrcInfo(src_info); - } + RDOParserSrcInfo::setSrcInfo(src_info); + if (m_pCalc) + { + m_pCalc->setSrcInfo(src_info); + } } void RDOFUNLogic::setSrcPos(const RDOSrcInfo::Position& position) { - RDOParserSrcInfo::setSrcPos(position); - if (m_pCalc) - { - rdo::runtime::RDOSrcInfo srcInfo(m_pCalc->srcInfo()); - srcInfo.setSrcPos(position); - m_pCalc->setSrcInfo(srcInfo); - } + RDOParserSrcInfo::setSrcPos(position); + if (m_pCalc) + { + rdo::runtime::RDOSrcInfo srcInfo(m_pCalc->srcInfo()); + srcInfo.setSrcPos(position); + m_pCalc->setSrcInfo(srcInfo); + } } void RDOFUNLogic::setSrcText(const std::string& value) { - RDOParserSrcInfo::setSrcText(value); - if (m_pCalc) - { - rdo::runtime::RDOSrcInfo srcInfo(m_pCalc->srcInfo()); - srcInfo.setSrcText(value); - m_pCalc->setSrcInfo(srcInfo); - } + RDOParserSrcInfo::setSrcText(value); + if (m_pCalc) + { + rdo::runtime::RDOSrcInfo srcInfo(m_pCalc->srcInfo()); + srcInfo.setSrcText(value); + m_pCalc->setSrcInfo(srcInfo); + } } void RDOFUNLogic::setSrcPos(const YYLTYPE& error_pos) { - RDOParserSrcInfo::setSrcPos(error_pos); + RDOParserSrcInfo::setSrcPos(error_pos); } void RDOFUNLogic::setSrcPos(const YYLTYPE& pos_begin, const YYLTYPE& pos_end) { - RDOParserSrcInfo::setSrcPos(pos_begin, pos_end); + RDOParserSrcInfo::setSrcPos(pos_begin, pos_end); } // -------------------------------------------------------------------------------- // -------------------- RDOFUNArithm // -------------------------------------------------------------------------------- RDOFUNArithm::RDOFUNArithm(const LPRDOValue& pValue, const rdo::runtime::LPRDOCalc& pCalc) - : m_pValue(pValue) - , m_pCalc (pCalc ) + : m_pValue(pValue) + , m_pCalc (pCalc ) { - setSrcInfo(m_pValue->src_info()); + setSrcInfo(m_pValue->src_info()); } RDOFUNArithm::RDOFUNArithm(const LPRDOValue& pValue) { - init(pValue); + init(pValue); } RDOFUNArithm::RDOFUNArithm(const LPRDOValue& pResName, const LPRDOValue& pParName) { - init(pResName, pParName); + init(pResName, pParName); } RDOFUNArithm::~RDOFUNArithm() @@ -247,574 +247,572 @@ RDOFUNArithm::~RDOFUNArithm() void RDOFUNArithm::init(const LPRDOValue& pValue) { - setSrcInfo(pValue->src_info()); - - if (pValue->constant()) - { - m_pValue = rdo::Factory::create(pValue); - m_pCalc = rdo::Factory::create(m_pValue->value()); - m_pCalc->setSrcInfo(src_info()); - return; - } - - if (pValue->value().getIdentificator() == "Time_now" || pValue->value().getIdentificator() == "time_now" || pValue->value().getIdentificator() == "Системное_время" || pValue->value().getIdentificator() == "системное_время") - { - m_pValue = rdo::Factory::create(rdo::Factory::create().object_parent_cast()); - m_pCalc = rdo::Factory::create(); - m_pCalc->setSrcInfo(src_info()); - return; - } - else if (pValue->value().getIdentificator() == "Terminate_counter" || pValue->value().getIdentificator() == "terminate_counter") - { - m_pValue = rdo::Factory::create(rdo::Factory::create().object_parent_cast()); - m_pCalc = rdo::Factory::create(); - m_pCalc->setSrcInfo(src_info()); - return; - } - else if (pValue->value().getIdentificator() == "Seconds" || pValue->value().getIdentificator() == "seconds") - { - m_pValue = rdo::Factory::create(rdo::Factory::create().object_parent_cast()); - m_pCalc = rdo::Factory::create(); - m_pCalc->setSrcInfo(src_info()); - return; - } - - //! Возможно, что это значение перечислимого типа, только одно и тоже значение может встречаться в разных - //! перечислимых типах, поэтому какой именно из них выбрать - вопрос - {ErrorBlockMonicker errorBlockMonicker; - const Converter::PreCastTypeList& typeList = Converter::s_converter()->getPreCastTypeList(); - for (const auto& type: typeList) - { - LPRDOValue pTryCastValue = type->value_cast(pValue); - if (pTryCastValue->defined()) - { - m_pValue = rdo::Factory::create(pValue); - return; - } - } - } - - //! Ищем параметр релевантного ресурса - if (Converter::s_converter()->getFileToParse() == rdo::converter::smr2rdox::PAT_IN) - { - LPRDOPATPattern pPattern = Converter::s_converter()->getLastPATPattern(); - if (pPattern && pPattern->m_pCurrRelRes) - { - LPRDORTPParam pParam = pPattern->m_pCurrRelRes->getType()->findRTPParam(pValue->value().getIdentificator()); - if (pParam) - { - LPRDOValue pParamName = rdo::Factory::create(pPattern->m_pCurrRelRes->m_bodySrcInfo); - init(pParamName, pValue); - return; - } - } - } - - //! Ищем параметры паттерна или функции по имени - LPRDOParam pFunctionParam; - switch (Converter::s_converter()->getFileToParse()) - { - case rdo::converter::smr2rdox::PAT_IN: pFunctionParam = Converter::s_converter()->getLastPATPattern ()->findPATPatternParam (pValue->value().getIdentificator()); break; - case rdo::converter::smr2rdox::FUN_IN: pFunctionParam = Converter::s_converter()->getLastFUNFunction()->findFUNFunctionParam(pValue->value().getIdentificator()); break; - default : break; - } - - //! Ищем константы по имени - LPRDOFUNConstant pConstant = Converter::s_converter()->findFUNConstant(pValue->value().getIdentificator()); - - if (pConstant && pFunctionParam) - { - Converter::s_converter()->error().error(src_info(), rdo::format("Имя параметра образца совпадает с именем константы: %s", pValue->value().getIdentificator().c_str())); - } - - if (pConstant) - { - m_pValue = rdo::Factory::create(pConstant->getType()->type()); - m_pCalc = rdo::Factory::create(pConstant->getNumber()); - m_pCalc->setSrcInfo(src_info()); - return; - } - - //! Ищем последовательность по имени - LPRDOFUNSequence pSequence = Converter::s_converter()->findFUNSequence(pValue->value().getIdentificator()); - if (pSequence && pFunctionParam) - { - Converter::s_converter()->error().error(src_info(), rdo::format("Имя параметра образца совпадает с именем последовательности: %s", pValue->value().getIdentificator().c_str())); - } - - if (pSequence) - { - LPRDOFUNParams pParams = rdo::Factory::create(); - ASSERT(pParams); - LPRDOFUNArithm pArithm = pParams->createSeqCall(pValue->value().getIdentificator()); - ASSERT(pArithm); - pArithm->setSrcInfo(src_info()); - m_pValue =rdo::Factory::create(pArithm->value()); - m_pCalc = pArithm->m_pCalc; - return; - } - - if (pFunctionParam) - { - //! Это параметр - m_pValue = rdo::Factory::create(pFunctionParam->getType()->type()); - switch (Converter::s_converter()->getFileToParse()) - { - case rdo::converter::smr2rdox::PAT_IN: m_pCalc = rdo::Factory ::create(Converter::s_converter()->getLastPATPattern ()->findPATPatternParamNum (pValue->value().getIdentificator())); break; - case rdo::converter::smr2rdox::FUN_IN: m_pCalc = rdo::Factory::create(Converter::s_converter()->getLastFUNFunction()->findFUNFunctionParamNum(pValue->value().getIdentificator()), pFunctionParam->src_info()); break; - default : break; - } - if (m_pCalc) - { - m_pCalc->setSrcInfo(src_info()); - } - return; - } - - Converter::s_converter()->error().error(pValue->src_info(), rdo::format("Неизвестный идентификатор: %s", pValue->value().getIdentificator().c_str())); + setSrcInfo(pValue->src_info()); + + if (pValue->constant()) + { + m_pValue = rdo::Factory::create(pValue); + m_pCalc = rdo::Factory::create(m_pValue->value()); + m_pCalc->setSrcInfo(src_info()); + return; + } + + if (pValue->value().getIdentificator() == "Time_now" || pValue->value().getIdentificator() == "time_now" || pValue->value().getIdentificator() == "Системное_время" || pValue->value().getIdentificator() == "системное_время") + { + m_pValue = rdo::Factory::create(rdo::Factory::create().object_parent_cast()); + m_pCalc = rdo::Factory::create(); + m_pCalc->setSrcInfo(src_info()); + return; + } + else if (pValue->value().getIdentificator() == "Terminate_counter" || pValue->value().getIdentificator() == "terminate_counter") + { + m_pValue = rdo::Factory::create(rdo::Factory::create().object_parent_cast()); + m_pCalc = rdo::Factory::create(); + m_pCalc->setSrcInfo(src_info()); + return; + } + else if (pValue->value().getIdentificator() == "Seconds" || pValue->value().getIdentificator() == "seconds") + { + m_pValue = rdo::Factory::create(rdo::Factory::create().object_parent_cast()); + m_pCalc = rdo::Factory::create(); + m_pCalc->setSrcInfo(src_info()); + return; + } + + // Возможно, что это значение перечислимого типа, только одно и тоже значение может встречаться в разных + // перечислимых типах, поэтому какой именно из них выбрать - вопрос + {ErrorBlockMonicker errorBlockMonicker; + const Converter::PreCastTypeList& typeList = Converter::s_converter()->getPreCastTypeList(); + for (const auto& type: typeList) + { + LPRDOValue pTryCastValue = type->value_cast(pValue); + if (pTryCastValue->defined()) + { + m_pValue = rdo::Factory::create(pValue); + return; + } + } + } + + // Ищем параметр релевантного ресурса + if (Converter::s_converter()->getFileToParse() == rdo::converter::smr2rdox::FileTypeIn::PAT) + { + LPRDOPATPattern pPattern = Converter::s_converter()->getLastPATPattern(); + if (pPattern && pPattern->m_pCurrRelRes) + { + LPRDORTPParam pParam = pPattern->m_pCurrRelRes->getType()->findRTPParam(pValue->value().getIdentificator()); + if (pParam) + { + LPRDOValue pParamName = rdo::Factory::create(pPattern->m_pCurrRelRes->m_bodySrcInfo); + init(pParamName, pValue); + return; + } + } + } + + // Ищем параметры паттерна или функции по имени + LPRDOParam pFunctionParam; + switch (Converter::s_converter()->getFileToParse()) + { + case rdo::converter::smr2rdox::FileTypeIn::PAT: pFunctionParam = Converter::s_converter()->getLastPATPattern ()->findPATPatternParam (pValue->value().getIdentificator()); break; + case rdo::converter::smr2rdox::FileTypeIn::FUN: pFunctionParam = Converter::s_converter()->getLastFUNFunction()->findFUNFunctionParam(pValue->value().getIdentificator()); break; + default: break; + } + + // Ищем константы по имени + LPRDOFUNConstant pConstant = Converter::s_converter()->findFUNConstant(pValue->value().getIdentificator()); + + if (pConstant && pFunctionParam) + Converter::s_converter()->error().error(src_info(), rdo::format("Имя параметра образца совпадает с именем константы: %s", pValue->value().getIdentificator().c_str())); + + if (pConstant) + { + m_pValue = rdo::Factory::create(pConstant->getType()->type()); + m_pCalc = rdo::Factory::create(pConstant->getNumber()); + m_pCalc->setSrcInfo(src_info()); + return; + } + + // Ищем последовательность по имени + LPRDOFUNSequence pSequence = Converter::s_converter()->findFUNSequence(pValue->value().getIdentificator()); + if (pSequence && pFunctionParam) + { + Converter::s_converter()->error().error(src_info(), rdo::format("Имя параметра образца совпадает с именем последовательности: %s", pValue->value().getIdentificator().c_str())); + } + + if (pSequence) + { + LPRDOFUNParams pParams = rdo::Factory::create(); + ASSERT(pParams); + LPRDOFUNArithm pArithm = pParams->createSeqCall(pValue->value().getIdentificator()); + ASSERT(pArithm); + pArithm->setSrcInfo(src_info()); + m_pValue =rdo::Factory::create(pArithm->value()); + m_pCalc = pArithm->m_pCalc; + return; + } + + if (pFunctionParam) + { + // Это параметр + m_pValue = rdo::Factory::create(pFunctionParam->getType()->type()); + switch (Converter::s_converter()->getFileToParse()) + { + case rdo::converter::smr2rdox::FileTypeIn::PAT: m_pCalc = rdo::Factory ::create(Converter::s_converter()->getLastPATPattern ()->findPATPatternParamNum (pValue->value().getIdentificator())); break; + case rdo::converter::smr2rdox::FileTypeIn::FUN: m_pCalc = rdo::Factory::create(Converter::s_converter()->getLastFUNFunction()->findFUNFunctionParamNum(pValue->value().getIdentificator()), pFunctionParam->src_info()); break; + default: break; + } + + if (m_pCalc) + m_pCalc->setSrcInfo(src_info()); + + return; + } + + Converter::s_converter()->error().error(pValue->src_info(), rdo::format("Неизвестный идентификатор: %s", pValue->value().getIdentificator().c_str())); } void RDOFUNArithm::init(const LPRDOValue& pResName, const LPRDOValue& pParName) { - setSrcInfo(pResName->src_info(), ".", pParName->src_info()); - LPRDORSSResource pResource = Converter::s_converter()->findRSSResource(pResName->value().getIdentificator()); - if (pResource) - { - //! Это ресурс с закладки RSS - const std::size_t parNumb = pResource->getType()->getRTPParamNumber(pParName->value().getIdentificator()); - if (parNumb == RDORTPResType::UNDEFINED_PARAM) - { - Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Неизвестный параметр ресурса: %s", pParName->value().getIdentificator().c_str())); - } - if (pResource->getType()->isPermanent()) - { - m_pCalc = rdo::Factory::create(); - } - else if (pResource->getType()->isTemporary() && Converter::s_converter()->getFileToParse() == rdo::converter::smr2rdox::FRM_IN) - { - m_pCalc = rdo::Factory::create(); - } - else - { - Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Нельзя использовать временный ресурс: %s", pResName->value().getIdentificator().c_str())); - } - m_pCalc->setSrcInfo(src_info()); - m_pValue = rdo::Factory::create(pResource->getType()->findRTPParam(pParName->value().getIdentificator())->getType()->type()); - return; - } - //! Это не ресурс, но возможно, ресурс внутри групповой функции - else if (!Converter::s_converter()->getFUNGroupStack().empty() && Converter::s_converter()->getFUNGroupStack().back()->getResType()->name() == pResName->value().getIdentificator()) - { - //! Это ресурс внутри групповой функции - LPRDOFUNGroup pFUNGroup = Converter::s_converter()->getFUNGroupStack().back(); - const std::size_t parNumb = pFUNGroup->getResType()->getRTPParamNumber(pParName->value().getIdentificator()); - if (parNumb == RDORTPResType::UNDEFINED_PARAM) - { - Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Неизвестный параметр ресурса: %s", pParName->value().getIdentificator().c_str())); - } - m_pCalc = rdo::Factory::create(); - m_pCalc->setSrcInfo(src_info()); - m_pValue = rdo::Factory::create(pFUNGroup->getResType()->findRTPParam(pParName->value().getIdentificator())->getType()->type()); - return; - } - else - { - //! Возможно, это релевантный ресурс - switch (Converter::s_converter()->getFileToParse()) - { - case rdo::converter::smr2rdox::PAT_IN: - if (Converter::s_converter()->getLastPATPattern() && Converter::s_converter()->getLastPATPattern()->findRelevantResource(pResName->value().getIdentificator())) - { - //! Это релевантный ресурс где-то в паттерне (with_min-common-choice, $Time, $Body) - LPRDOPATPattern pPattern = Converter::s_converter()->getLastPATPattern(); - LPRDORelevantResource pRelevantResource = pPattern->findRelevantResource(pResName->value().getIdentificator()); - if (!pPattern->m_pCurrRelRes) - { - //! Внутри with_min-common-choice или $Time - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_NonExist || pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Create) - { - Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс не может быть использован, т.к. он еще не существует: %s", pRelevantResource->name().c_str())); - } - } - else - { - //! Внутри $Body - //! Проверяем использование неинициализированного рел.ресурса (pRelevantResource) в Choice from другом рел.ресурсе (pPattern->m_pCurrRelRes) - if (pPattern->m_pCurrRelRes->isChoiceFromState()) - { - if (!pRelevantResource->m_alreadyHaveConverter && !pRelevantResource->isDirect()) - { - Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс не определен: %s. Его нельзя использовать в условиях выбора других ресурсов до его собственного Choice from", pRelevantResource->name().c_str())); - } - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_NonExist) - { - Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс в начале операции не существует (NonExist): %s", pRelevantResource->name().c_str())); - } - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Create) - { - Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Сразу после создания (Create) релевантный ресурс '%s' можно использовать только в конверторах, но не в условии выбора", pRelevantResource->name().c_str())); - } - } - //! Проверяем использование временного рел.ресурса внутри конвертора другого рел.ресурса - if (pRelevantResource->getType()->isTemporary()) - { - //! В конверторе начала - if (pPattern->m_pCurrRelRes->m_currentState == RDORelevantResource::convertBegin) - { - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Create && !pRelevantResource->m_alreadyHaveConverter) - { - Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс нельзя использовать до его создания (Create): %s", pRelevantResource->name().c_str())); - } - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Erase && pRelevantResource->m_alreadyHaveConverter) - { - Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс нельзя использовать после удаления (Erase): %s", pRelevantResource->name().c_str())); - } - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_NonExist) - { - Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс не существует в этом конверторе (NonExist): %s", pRelevantResource->name().c_str())); - } - } - //! В конверторе конца - if (pPattern->m_pCurrRelRes->m_currentState == RDORelevantResource::convertEnd) - { - if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::CS_Create && !pRelevantResource->m_alreadyHaveConverter) - { - Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс нельзя использовать до его создания (Create): %s", pRelevantResource->name().c_str())); - } - if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::CS_Erase && pRelevantResource->m_alreadyHaveConverter) - { - Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс нельзя использовать после удаления (Erase): %s", pRelevantResource->name().c_str())); - } - if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::CS_NonExist) - { - Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс не существует в этом конверторе (NonExist): %s", pRelevantResource->name().c_str())); - } - } - } - //! Проверяем использование еще не инициализированного (только для Create) параметра рел. ресурса в его же конверторе - LPRDORTPParam pParam = pPattern->m_pCurrRelRes->getType()->findRTPParam(pParName->value().getIdentificator()); - if (pParam && pPattern->m_pCurrRelRes->name() == pResName->value().getIdentificator()) - { - //! В конверторе начала - if (pPattern->m_pCurrRelRes->m_currentState == RDORelevantResource::convertBegin && pPattern->m_pCurrRelRes->m_statusBegin == rdo::runtime::RDOResource::CS_Create) - { - if (!pPattern->m_pCurrRelRes->getParamSetList().find(pParName->value().getIdentificator())) - { - if (!pParam->getDefault()->defined()) - { - Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Параметр '%s' еще не определен, ему необходимо присвоить значение в текущем конверторе или указать значение по умолчанию в типе ресурса", pParName->value().getIdentificator().c_str())); - } - } - } - //! В конверторе конца - if (pPattern->m_pCurrRelRes->m_currentState == RDORelevantResource::convertEnd && pPattern->m_pCurrRelRes->m_statusEnd == rdo::runtime::RDOResource::CS_Create) - { - if (!pPattern->m_pCurrRelRes->getParamSetList().find(pParName->value().getIdentificator())) - { - if (!pPattern->m_pCurrRelRes->getParamSetList().find(pParName->value().getIdentificator())) - { - if (!pParam->getDefault()->defined()) - { - Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Параметр '%s' еще не определен, ему необходимо присвоить значение в текущем конверторе или указать значение по умолчанию в типе ресурса", pParName->value().getIdentificator().c_str())); - } - } - } - } - } - } - const std::size_t parNumb = pRelevantResource->getType()->getRTPParamNumber(pParName->value().getIdentificator()); - if (parNumb == RDORTPResType::UNDEFINED_PARAM) - { - Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Неизвестный параметр ресурса: %s", pParName->value().getIdentificator().c_str())); - } - m_pCalc = rdo::Factory::create(); - m_pCalc->setSrcInfo(src_info()); - m_pValue = rdo::Factory::create(pRelevantResource->getType()->findRTPParam(pParName->value().getIdentificator())->getType()->type()); - return; - } - break; - - case rdo::converter::smr2rdox::DPT_IN: - if (Converter::s_converter()->isCurrentDPTSearch() && Converter::s_converter()->getLastDPTSearch()->getLastActivity()) - { - LPRDOPATPattern pPattern = Converter::s_converter()->getLastDPTSearch()->getLastActivity()->pattern(); - if (pPattern && pPattern->findRelevantResource(pResName->value().getIdentificator())) { - //! Это ресурс, который используется в DPT (condition, term_condition, evaluate_by, value before, value after) - LPRDORelevantResource pRelevantResource = pPattern->findRelevantResource(pResName->value().getIdentificator()); - const std::size_t parNumb = pRelevantResource->getType()->getRTPParamNumber(pParName->value().getIdentificator()); - if (parNumb == RDORTPResType::UNDEFINED_PARAM) - { - Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Неизвестный параметр ресурса: %s", pParName->value().getIdentificator().c_str())); - } - m_pCalc = rdo::Factory::create(); - m_pCalc->setSrcInfo(src_info()); - m_pValue = rdo::Factory::create(pRelevantResource->getType()->findRTPParam(pParName->value().getIdentificator())->getType()->type()); - return; - } - } - if (Converter::s_converter()->isCurrentDPTPrior() && Converter::s_converter()->getLastDPTPrior()->getLastActivity()) - { - LPRDOPATPattern pPattern = Converter::s_converter()->getLastDPTPrior()->getLastActivity()->pattern(); - if (pPattern && pPattern->findRelevantResource(pResName->value().getIdentificator())) { - //! Это ресурс, который используется в выражении приоритета активности DPTPrior - LPRDORelevantResource pRelevantResource = pPattern->findRelevantResource(pResName->value().getIdentificator()); - const std::size_t parNumb = pRelevantResource->getType()->getRTPParamNumber(pParName->value().getIdentificator()); - if (parNumb == RDORTPResType::UNDEFINED_PARAM) - { - Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Неизвестный параметр ресурса: %s", pParName->value().getIdentificator().c_str())); - } - m_pCalc = rdo::Factory::create(); - m_pCalc->setSrcInfo(src_info()); - m_pValue = rdo::Factory::create(pRelevantResource->getType()->findRTPParam(pParName->value().getIdentificator())->getType()->type()); - return; - } - } - break; - - default: - break; - } - } - Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Неизвестный ресурс: %s", pResName->value().getIdentificator().c_str())); + setSrcInfo(pResName->src_info(), ".", pParName->src_info()); + LPRDORSSResource pResource = Converter::s_converter()->findRSSResource(pResName->value().getIdentificator()); + if (pResource) + { + // Это ресурс с закладки RSS + const std::size_t parNumb = pResource->getType()->getRTPParamNumber(pParName->value().getIdentificator()); + if (parNumb == RDORTPResType::UNDEFINED_PARAM) + { + Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Неизвестный параметр ресурса: %s", pParName->value().getIdentificator().c_str())); + } + if (pResource->getType()->isPermanent()) + { + m_pCalc = rdo::Factory::create(); + } + else if (pResource->getType()->isTemporary() && Converter::s_converter()->getFileToParse() == rdo::converter::smr2rdox::FileTypeIn::FRM) + { + m_pCalc = rdo::Factory::create(); + } + else + { + Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Нельзя использовать временный ресурс: %s", pResName->value().getIdentificator().c_str())); + } + m_pCalc->setSrcInfo(src_info()); + m_pValue = rdo::Factory::create(pResource->getType()->findRTPParam(pParName->value().getIdentificator())->getType()->type()); + return; + } + // Это не ресурс, но возможно, ресурс внутри групповой функции + else if (!Converter::s_converter()->getFUNGroupStack().empty() && Converter::s_converter()->getFUNGroupStack().back()->getResType()->name() == pResName->value().getIdentificator()) + { + // Это ресурс внутри групповой функции + LPRDOFUNGroup pFUNGroup = Converter::s_converter()->getFUNGroupStack().back(); + const std::size_t parNumb = pFUNGroup->getResType()->getRTPParamNumber(pParName->value().getIdentificator()); + if (parNumb == RDORTPResType::UNDEFINED_PARAM) + { + Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Неизвестный параметр ресурса: %s", pParName->value().getIdentificator().c_str())); + } + m_pCalc = rdo::Factory::create(); + m_pCalc->setSrcInfo(src_info()); + m_pValue = rdo::Factory::create(pFUNGroup->getResType()->findRTPParam(pParName->value().getIdentificator())->getType()->type()); + return; + } + else + { + // Возможно, это релевантный ресурс + switch (Converter::s_converter()->getFileToParse()) + { + case rdo::converter::smr2rdox::FileTypeIn::PAT: + if (Converter::s_converter()->getLastPATPattern() && Converter::s_converter()->getLastPATPattern()->findRelevantResource(pResName->value().getIdentificator())) + { + // Это релевантный ресурс где-то в паттерне (with_min-common-choice, $Time, $Body) + LPRDOPATPattern pPattern = Converter::s_converter()->getLastPATPattern(); + LPRDORelevantResource pRelevantResource = pPattern->findRelevantResource(pResName->value().getIdentificator()); + if (!pPattern->m_pCurrRelRes) + { + // Внутри with_min-common-choice или $Time + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NONEXIST || pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс не может быть использован, т.к. он еще не существует: %s", pRelevantResource->name().c_str())); + } + } + else + { + // Внутри $Body + // Проверяем использование неинициализированного рел.ресурса (pRelevantResource) в Choice from другом рел.ресурсе (pPattern->m_pCurrRelRes) + if (pPattern->m_pCurrRelRes->isChoiceFromState()) + { + if (!pRelevantResource->m_alreadyHaveConverter && !pRelevantResource->isDirect()) + { + Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс не определен: %s. Его нельзя использовать в условиях выбора других ресурсов до его собственного Choice from", pRelevantResource->name().c_str())); + } + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс в начале операции не существует (NonExist): %s", pRelevantResource->name().c_str())); + } + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Сразу после создания (Create) релевантный ресурс '%s' можно использовать только в конверторах, но не в условии выбора", pRelevantResource->name().c_str())); + } + } + // Проверяем использование временного рел.ресурса внутри конвертора другого рел.ресурса + if (pRelevantResource->getType()->isTemporary()) + { + // В конверторе начала + if (pPattern->m_pCurrRelRes->m_currentState == RDORelevantResource::State::CONVERT_BEGIN) + { + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::CREATE && !pRelevantResource->m_alreadyHaveConverter) + { + Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс нельзя использовать до его создания (Create): %s", pRelevantResource->name().c_str())); + } + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE && pRelevantResource->m_alreadyHaveConverter) + { + Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс нельзя использовать после удаления (Erase): %s", pRelevantResource->name().c_str())); + } + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс не существует в этом конверторе (NonExist): %s", pRelevantResource->name().c_str())); + } + } + // В конверторе конца + if (pPattern->m_pCurrRelRes->m_currentState == RDORelevantResource::State::CONVERT_END) + { + if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::ConvertStatus::CREATE && !pRelevantResource->m_alreadyHaveConverter) + { + Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс нельзя использовать до его создания (Create): %s", pRelevantResource->name().c_str())); + } + if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::ConvertStatus::ERASE && pRelevantResource->m_alreadyHaveConverter) + { + Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс нельзя использовать после удаления (Erase): %s", pRelevantResource->name().c_str())); + } + if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Релевантный ресурс не существует в этом конверторе (NonExist): %s", pRelevantResource->name().c_str())); + } + } + } + // Проверяем использование еще не инициализированного (только для Create) параметра рел. ресурса в его же конверторе + LPRDORTPParam pParam = pPattern->m_pCurrRelRes->getType()->findRTPParam(pParName->value().getIdentificator()); + if (pParam && pPattern->m_pCurrRelRes->name() == pResName->value().getIdentificator()) + { + // В конверторе начала + if (pPattern->m_pCurrRelRes->m_currentState == RDORelevantResource::State::CONVERT_BEGIN && pPattern->m_pCurrRelRes->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + if (!pPattern->m_pCurrRelRes->getParamSetList().find(pParName->value().getIdentificator())) + { + if (!pParam->getDefault()->defined()) + { + Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Параметр '%s' еще не определен, ему необходимо присвоить значение в текущем конверторе или указать значение по умолчанию в типе ресурса", pParName->value().getIdentificator().c_str())); + } + } + } + // В конверторе конца + if (pPattern->m_pCurrRelRes->m_currentState == RDORelevantResource::State::CONVERT_END && pPattern->m_pCurrRelRes->m_statusEnd == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + if (!pPattern->m_pCurrRelRes->getParamSetList().find(pParName->value().getIdentificator())) + { + if (!pPattern->m_pCurrRelRes->getParamSetList().find(pParName->value().getIdentificator())) + { + if (!pParam->getDefault()->defined()) + { + Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Параметр '%s' еще не определен, ему необходимо присвоить значение в текущем конверторе или указать значение по умолчанию в типе ресурса", pParName->value().getIdentificator().c_str())); + } + } + } + } + } + } + const std::size_t parNumb = pRelevantResource->getType()->getRTPParamNumber(pParName->value().getIdentificator()); + if (parNumb == RDORTPResType::UNDEFINED_PARAM) + { + Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Неизвестный параметр ресурса: %s", pParName->value().getIdentificator().c_str())); + } + m_pCalc = rdo::Factory::create(); + m_pCalc->setSrcInfo(src_info()); + m_pValue = rdo::Factory::create(pRelevantResource->getType()->findRTPParam(pParName->value().getIdentificator())->getType()->type()); + return; + } + break; + + case rdo::converter::smr2rdox::FileTypeIn::DPT: + if (Converter::s_converter()->isCurrentDPTSearch() && Converter::s_converter()->getLastDPTSearch()->getLastActivity()) + { + LPRDOPATPattern pPattern = Converter::s_converter()->getLastDPTSearch()->getLastActivity()->pattern(); + if (pPattern && pPattern->findRelevantResource(pResName->value().getIdentificator())) { + // Это ресурс, который используется в DPT (condition, term_condition, evaluate_by, value before, value after) + LPRDORelevantResource pRelevantResource = pPattern->findRelevantResource(pResName->value().getIdentificator()); + const std::size_t parNumb = pRelevantResource->getType()->getRTPParamNumber(pParName->value().getIdentificator()); + if (parNumb == RDORTPResType::UNDEFINED_PARAM) + { + Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Неизвестный параметр ресурса: %s", pParName->value().getIdentificator().c_str())); + } + m_pCalc = rdo::Factory::create(); + m_pCalc->setSrcInfo(src_info()); + m_pValue = rdo::Factory::create(pRelevantResource->getType()->findRTPParam(pParName->value().getIdentificator())->getType()->type()); + return; + } + } + if (Converter::s_converter()->isCurrentDPTPrior() && Converter::s_converter()->getLastDPTPrior()->getLastActivity()) + { + LPRDOPATPattern pPattern = Converter::s_converter()->getLastDPTPrior()->getLastActivity()->pattern(); + if (pPattern && pPattern->findRelevantResource(pResName->value().getIdentificator())) { + // Это ресурс, который используется в выражении приоритета активности DPTPrior + LPRDORelevantResource pRelevantResource = pPattern->findRelevantResource(pResName->value().getIdentificator()); + const std::size_t parNumb = pRelevantResource->getType()->getRTPParamNumber(pParName->value().getIdentificator()); + if (parNumb == RDORTPResType::UNDEFINED_PARAM) + { + Converter::s_converter()->error().error(pParName->src_info(), rdo::format("Неизвестный параметр ресурса: %s", pParName->value().getIdentificator().c_str())); + } + m_pCalc = rdo::Factory::create(); + m_pCalc->setSrcInfo(src_info()); + m_pValue = rdo::Factory::create(pRelevantResource->getType()->findRTPParam(pParName->value().getIdentificator())->getType()->type()); + return; + } + } + break; + + default: + break; + } + } + Converter::s_converter()->error().error(pResName->src_info(), rdo::format("Неизвестный ресурс: %s", pResName->value().getIdentificator().c_str())); } RDOFUNArithm::CastResult RDOFUNArithm::beforeCastValue(LPRDOFUNArithm pSecond) { - if (typeID() == rdo::runtime::RDOType::t_enum && pSecond->typeID() == rdo::runtime::RDOType::t_identificator) - { - pSecond->m_pValue = rdo::Factory::create( - type()->value_cast( - pSecond->value(), - pSecond->src_info(), - src_info() - )->value(), - enumType(), - pSecond->m_pValue->src_info() - ); - pSecond->m_pCalc = rdo::Factory::create(pSecond->m_pValue->value()); - pSecond->m_pCalc->setSrcInfo(pSecond->src_info()); - return CR_DONE; - } - else if (typeID() == rdo::runtime::RDOType::t_identificator && pSecond->typeID() == rdo::runtime::RDOType::t_enum) - { - m_pValue = rdo::Factory::create( - pSecond->type()->value_cast( - value(), - src_info(), - pSecond->src_info() - )->value(), - pSecond->enumType(), - m_pValue->src_info() - ); - m_pCalc = rdo::Factory::create(m_pValue->value()); - m_pCalc->setSrcInfo(src_info()); - return CR_DONE; - } - return CR_CONTINUE; + if (typeID() == rdo::runtime::RDOType::Type::ENUM && pSecond->typeID() == rdo::runtime::RDOType::Type::IDENTIFICATOR) + { + pSecond->m_pValue = rdo::Factory::create( + type()->value_cast( + pSecond->value(), + pSecond->src_info(), + src_info() + )->value(), + enumType(), + pSecond->m_pValue->src_info() + ); + pSecond->m_pCalc = rdo::Factory::create(pSecond->m_pValue->value()); + pSecond->m_pCalc->setSrcInfo(pSecond->src_info()); + return CastResult::DONE; + } + else if (typeID() == rdo::runtime::RDOType::Type::IDENTIFICATOR && pSecond->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + m_pValue = rdo::Factory::create( + pSecond->type()->value_cast( + value(), + src_info(), + pSecond->src_info() + )->value(), + pSecond->enumType(), + m_pValue->src_info() + ); + m_pCalc = rdo::Factory::create(m_pValue->value()); + m_pCalc->setSrcInfo(src_info()); + return CastResult::DONE; + } + return CastResult::CONTINUE; } LPRDOType RDOFUNArithm::getPreType(const LPRDOFUNArithm& pSecond) { - if (typeID() == rdo::runtime::RDOType::t_unknow) - { - Converter::s_converter()->error().error(src_info(), rdo::format("Внутренная ошибка парсера: неопределенное значение арифметического выражения: %s", src_text().c_str())); - } - if (pSecond->typeID() == rdo::runtime::RDOType::t_unknow) - { - Converter::s_converter()->error().error(pSecond->src_info(), rdo::format("Внутренная ошибка парсера: неопределенное значение арифметического выражения: %s", pSecond->src_text().c_str())); - } - if (typeID() == rdo::runtime::RDOType::t_identificator) - { - Converter::s_converter()->error().error(src_info(), rdo::format("Неизвестный идентификатор: %s", value()->value().getIdentificator().c_str())); - } - if (pSecond->typeID() == rdo::runtime::RDOType::t_identificator) - { - Converter::s_converter()->error().error(pSecond->src_info(), rdo::format("Неизвестный идентификатор: %s", pSecond->value()->value().getIdentificator().c_str())); - } - - /// @todo смущают два одинаковых src_info(), проверить и доказать правильность - return type()->type_cast(pSecond->type(), pSecond->src_info(), src_info(), src_info()); + if (typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + Converter::s_converter()->error().error(src_info(), rdo::format("Внутренняя ошибка парсера: неопределенное значение арифметического выражения: %s", src_text().c_str())); + } + if (pSecond->typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + Converter::s_converter()->error().error(pSecond->src_info(), rdo::format("Внутренняя ошибка парсера: неопределенное значение арифметического выражения: %s", pSecond->src_text().c_str())); + } + if (typeID() == rdo::runtime::RDOType::Type::IDENTIFICATOR) + { + Converter::s_converter()->error().error(src_info(), rdo::format("Неизвестный идентификатор: %s", value()->value().getIdentificator().c_str())); + } + if (pSecond->typeID() == rdo::runtime::RDOType::Type::IDENTIFICATOR) + { + Converter::s_converter()->error().error(pSecond->src_info(), rdo::format("Неизвестный идентификатор: %s", pSecond->value()->value().getIdentificator().c_str())); + } + + // TODO смущают два одинаковых src_info(), проверить и доказать правильность + return type()->type_cast(pSecond->type(), pSecond->src_info(), src_info(), src_info()); } LPRDOFUNArithm RDOFUNArithm::operator+ (const LPRDOFUNArithm& pSecond) { - GENERATE_ARITHM(Plus, +, "Ну не могу я сложить %s и %s"); + GENERATE_ARITHM(Plus, +, "Ну не могу я сложить %s и %s"); } LPRDOFUNArithm RDOFUNArithm::operator- (const LPRDOFUNArithm& pSecond) { - GENERATE_ARITHM(Minus, -, "Нельзя из %s вычесть %s"); + GENERATE_ARITHM(Minus, -, "Нельзя из %s вычесть %s"); } LPRDOFUNArithm RDOFUNArithm::operator* (const LPRDOFUNArithm& pSecond) { - GENERATE_ARITHM(Mult, *, "Нельзя %s умножить на %s"); + GENERATE_ARITHM(Mult, *, "Нельзя %s умножить на %s"); } LPRDOFUNArithm RDOFUNArithm::operator/ (const LPRDOFUNArithm& pSecond) { - GENERATE_ARITHM_CALC(Div, /, "Нельзя %s разделить на %s"); - /// @todo перевод вещественного в целое при делении. А что делать с умножением и т.д. ? - //! Ответ: с умножением надо делать тоже самое, только непонятно как - if (pNewType->type()->typeID() == rdo::runtime::RDOType::t_int) - { - rdo::runtime::LPRDOCalc pNewCalcDiv = pNewCalc; - pNewCalc = rdo::Factory::create(pNewCalcDiv); - pNewCalc->setSrcInfo(pNewCalcDiv->srcInfo()); - } - LPRDOFUNArithm pArithm = rdo::Factory::create( - rdo::Factory::create(pNewType, pNewCalc->srcInfo()), - pNewCalc - ); - if (pNewType->type()->typeID() == rdo::runtime::RDOType::t_int) - { - rdo::runtime::LPRDOCalcDoubleToIntByResult pResult = pNewCalc.object_static_cast(); - pArithm->m_intOrDouble.push_back(pResult); - } - pArithm->m_intOrDouble.insert(m_intOrDouble, pSecond->m_intOrDouble); - return pArithm; + GENERATE_ARITHM_CALC(Div, /, "Нельзя %s разделить на %s"); + // TODO перевод вещественного в целое при делении. А что делать с умножением и т.д. ? + // Ответ: с умножением надо делать тоже самое, только непонятно как + if (pNewType->type()->typeID() == rdo::runtime::RDOType::Type::INT) + { + rdo::runtime::LPRDOCalc pNewCalcDiv = pNewCalc; + pNewCalc = rdo::Factory::create(pNewCalcDiv); + pNewCalc->setSrcInfo(pNewCalcDiv->srcInfo()); + } + LPRDOFUNArithm pArithm = rdo::Factory::create( + rdo::Factory::create(pNewType, pNewCalc->srcInfo()), + pNewCalc + ); + if (pNewType->type()->typeID() == rdo::runtime::RDOType::Type::INT) + { + rdo::runtime::LPRDOCalcDoubleToIntByResult pResult = pNewCalc.object_static_cast(); + pArithm->m_intOrDouble.push_back(pResult); + } + pArithm->m_intOrDouble.insert(m_intOrDouble, pSecond->m_intOrDouble); + return pArithm; } LPRDOFUNLogic RDOFUNArithm::operator< (const LPRDOFUNArithm& pSecond) { - GENERATE_LOGIC_FROM_ARITHM(IsLess, <, "Нельзя сравнивать %s и %s"); + GENERATE_LOGIC_FROM_ARITHM(IsLess, <, "Нельзя сравнивать %s и %s"); } LPRDOFUNLogic RDOFUNArithm::operator> (const LPRDOFUNArithm& pSecond) { - GENERATE_LOGIC_FROM_ARITHM(IsGreater, >, "Нельзя сравнивать %s и %s"); + GENERATE_LOGIC_FROM_ARITHM(IsGreater, >, "Нельзя сравнивать %s и %s"); } LPRDOFUNLogic RDOFUNArithm::operator<= (const LPRDOFUNArithm& pSecond) { - GENERATE_LOGIC_FROM_ARITHM(IsLEQ, <=, "Нельзя сравнивать %s и %s"); + GENERATE_LOGIC_FROM_ARITHM(IsLEQ, <=, "Нельзя сравнивать %s и %s"); } LPRDOFUNLogic RDOFUNArithm::operator>= (const LPRDOFUNArithm& pSecond) { - GENERATE_LOGIC_FROM_ARITHM(IsGEQ, >, "Нельзя сравнивать %s и %s"); + GENERATE_LOGIC_FROM_ARITHM(IsGEQ, >, "Нельзя сравнивать %s и %s"); } LPRDOFUNLogic RDOFUNArithm::operator== (const LPRDOFUNArithm& pSecond) { - GENERATE_LOGIC_FROM_ARITHM(IsEqual, ==, "Нельзя сравнивать %s и %s"); + GENERATE_LOGIC_FROM_ARITHM(IsEqual, ==, "Нельзя сравнивать %s и %s"); } LPRDOFUNLogic RDOFUNArithm::operator!= (const LPRDOFUNArithm& pSecond) { - GENERATE_LOGIC_FROM_ARITHM(IsNotEqual, !=, "Нельзя сравнивать %s и %s"); + GENERATE_LOGIC_FROM_ARITHM(IsNotEqual, !=, "Нельзя сравнивать %s и %s"); } void RDOFUNArithm::checkParamType(const LPRDOTypeParam& pType) { - pType->type()->type_cast(type(), src_info(), pType->src_info(), src_info()); - rdo::runtime::LPRDOCalcConst pConstCalc = calc().object_dynamic_cast(); - if (pConstCalc) - { - rdo::runtime::RDOValue value = pConstCalc->getValue(); - pType->value_cast(rdo::Factory::create(value, type(), src_info())); - } + pType->type()->type_cast(type(), src_info(), pType->src_info(), src_info()); + rdo::runtime::LPRDOCalcConst pConstCalc = calc().object_dynamic_cast(); + if (pConstCalc) + { + rdo::runtime::RDOValue value = pConstCalc->getValue(); + pType->value_cast(rdo::Factory::create(value, type(), src_info())); + } } rdo::runtime::LPRDOCalc RDOFUNArithm::createCalc(const LPRDOTypeParam& pForType) { - if (typeID() != rdo::runtime::RDOType::t_identificator) - { - if (!pForType) - { - return m_pCalc; - } - if (pForType->type()->typeID() != rdo::runtime::RDOType::t_int) - { - if (pForType->type()->typeID() == rdo::runtime::RDOType::t_enum) - { - m_intOrDouble.roundCalc(); - } - return m_pCalc; - } - else - { - m_intOrDouble.roundCalc(); - rdo::runtime::LPRDOCalc pNewCalc = rdo::Factory::create(m_pCalc->srcInfo().src_pos(), m_pCalc); - pNewCalc->setSrcInfo(src_info()); - return pNewCalc; - } - } - else if (typeID() == rdo::runtime::RDOType::t_identificator && !pForType) - { - Converter::s_converter()->error().error(src_info(), rdo::format("Неизвестный идентификатор: %s", value()->value().getAsString().c_str())); - } - - if (!pForType) - { - Converter::s_converter()->error().error(src_info(), "Неизвестный тип параметра"); - } - - rdo::runtime::LPRDOCalc pNewCalc = rdo::Factory::create(pForType->value_cast(rdo::Factory::create(src_info()))->value()); - pNewCalc->setSrcInfo(src_info()); - return pNewCalc; + if (typeID() != rdo::runtime::RDOType::Type::IDENTIFICATOR) + { + if (!pForType) + { + return m_pCalc; + } + if (pForType->type()->typeID() != rdo::runtime::RDOType::Type::INT) + { + if (pForType->type()->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + m_intOrDouble.roundCalc(); + } + return m_pCalc; + } + else + { + m_intOrDouble.roundCalc(); + rdo::runtime::LPRDOCalc pNewCalc = rdo::Factory::create(m_pCalc->srcInfo().src_pos(), m_pCalc); + pNewCalc->setSrcInfo(src_info()); + return pNewCalc; + } + } + else if (typeID() == rdo::runtime::RDOType::Type::IDENTIFICATOR && !pForType) + { + Converter::s_converter()->error().error(src_info(), rdo::format("Неизвестный идентификатор: %s", value()->value().getAsString().c_str())); + } + + if (!pForType) + { + Converter::s_converter()->error().error(src_info(), "Неизвестный тип параметра"); + } + + rdo::runtime::LPRDOCalc pNewCalc = rdo::Factory::create(pForType->value_cast(rdo::Factory::create(src_info()))->value()); + pNewCalc->setSrcInfo(src_info()); + return pNewCalc; } void RDOFUNArithm::setSrcInfo(const RDOParserSrcInfo& src_info) { - RDOParserSrcInfo::setSrcInfo(src_info); - if (m_pCalc) - { - m_pCalc->setSrcInfo(src_info); - } + RDOParserSrcInfo::setSrcInfo(src_info); + if (m_pCalc) + { + m_pCalc->setSrcInfo(src_info); + } } void RDOFUNArithm::setSrcPos(const RDOSrcInfo::Position& position) { - RDOParserSrcInfo::setSrcPos(position); - if (m_pCalc) - { - rdo::runtime::RDOSrcInfo srcInfo(m_pCalc->srcInfo()); - srcInfo.setSrcPos(position); - m_pCalc->setSrcInfo(srcInfo); - } + RDOParserSrcInfo::setSrcPos(position); + if (m_pCalc) + { + rdo::runtime::RDOSrcInfo srcInfo(m_pCalc->srcInfo()); + srcInfo.setSrcPos(position); + m_pCalc->setSrcInfo(srcInfo); + } } void RDOFUNArithm::setSrcText(const std::string& value) { - RDOParserSrcInfo::setSrcText(value); - if (m_pCalc) - { - rdo::runtime::RDOSrcInfo srcInfo(m_pCalc->srcInfo()); - srcInfo.setSrcText(src_info().src_text()); - m_pCalc->setSrcInfo(srcInfo); - } + RDOParserSrcInfo::setSrcText(value); + if (m_pCalc) + { + rdo::runtime::RDOSrcInfo srcInfo(m_pCalc->srcInfo()); + srcInfo.setSrcText(src_info().src_text()); + m_pCalc->setSrcInfo(srcInfo); + } } void RDOFUNArithm::setSrcInfo(const RDOParserSrcInfo& begin, const std::string& delim, const RDOParserSrcInfo& end) { - RDOParserSrcInfo::setSrcInfo(begin, delim, end); + RDOParserSrcInfo::setSrcInfo(begin, delim, end); } void RDOFUNArithm::setSrcPos(const YYLTYPE& error_pos) { - RDOParserSrcInfo::setSrcPos(error_pos); + RDOParserSrcInfo::setSrcPos(error_pos); } void RDOFUNArithm::setSrcPos(const YYLTYPE& pos_begin, const YYLTYPE& pos_end) { - RDOParserSrcInfo::setSrcPos(pos_begin, pos_end); + RDOParserSrcInfo::setSrcPos(pos_begin, pos_end); } // -------------------------------------------------------------------------------- // -------------------- RDOFUNConstant // -------------------------------------------------------------------------------- RDOFUNConstant::RDOFUNConstant(const RDOParserSrcInfo& src_info, const LPRDOTypeParam& pType, const LPRDOValue& pDefault) - : RDOParam(src_info, pType, pDefault) + : RDOParam(src_info, pType, pDefault) { - if (!getDefault() || !getDefault()->defined()) - { - ASSERT(pType); - Converter::s_converter()->error().error(pType->src_info(), "Константа должна иметь значение"); - } + if (!getDefault() || !getDefault()->defined()) + { + ASSERT(pType); + Converter::s_converter()->error().error(pType->src_info(), "Константа должна иметь значение"); + } - m_number = Converter::s_converter()->getFUNCONST_id(); - Converter::s_converter()->insertFUNConstant(this); + m_number = Converter::s_converter()->getFUNCONST_id(); + Converter::s_converter()->insertFUNConstant(this); } RDOFUNConstant::~RDOFUNConstant() @@ -826,7 +824,7 @@ RDOFUNConstant::~RDOFUNConstant() // Параметры, с которыми функция вызывается // -------------------------------------------------------------------------------- RDOFUNParams::RDOFUNParams() - : RDOParserSrcInfo() + : RDOParserSrcInfo() {} RDOFUNParams::~RDOFUNParams() @@ -834,66 +832,66 @@ RDOFUNParams::~RDOFUNParams() rdo::runtime::LPRDOCalc RDOFUNParams::getCalc(std::size_t paramID, const LPRDOTypeParam& pType) { - ASSERT(paramID < m_paramList.size()); - rdo::runtime::LPRDOCalc pCalc = m_paramList[paramID]->createCalc(pType); - ASSERT(pCalc); - return pCalc; + ASSERT(paramID < m_paramList.size()); + rdo::runtime::LPRDOCalc pCalc = m_paramList[paramID]->createCalc(pType); + ASSERT(pCalc); + return pCalc; } void RDOFUNParams::addParameter(const LPRDOFUNArithm& pParam) { - ASSERT(pParam); - m_paramList.push_back(pParam); + ASSERT(pParam); + m_paramList.push_back(pParam); } LPRDOFUNArithm RDOFUNParams::createCall(const std::string& funName) { - LPRDOFUNFunction pFunction = Converter::s_converter()->findFUNFunction(funName); - if (!pFunction) - { - return createSeqCall(funName); - } - - const std::size_t nParams = pFunction->getParams().size(); - if (nParams != m_paramList.size()) - { - Converter::s_converter()->error().error(src_info(), rdo::format("Неверное количество параметров функции: %s", funName.c_str())); - } - - rdo::runtime::LPRDOCalcFunctionCaller pFuncCall = rdo::Factory::create(pFunction->getFunctionCalc()); - pFunction->insertPostLinked(pFuncCall); - pFuncCall->setSrcInfo(src_info()); - for (std::size_t i = 0; i < nParams; i++) - { - LPRDOTypeParam pFuncParam = pFunction->getParams()[i]->getType(); - LPRDOFUNArithm pArithm = m_paramList[i]; - ASSERT(pArithm); - pArithm->checkParamType(pFuncParam); - pFuncCall->addParameter(pFuncParam->type()->calc_cast(pArithm->createCalc(pFuncParam), pArithm->type())); - } - - LPRDOFUNArithm pArithm = rdo::Factory::create( - rdo::Factory::create(pFunction->getReturn()->getType()->type(), src_pos()), - pFuncCall.object_parent_cast() - ); - ASSERT(pArithm); - pArithm->setSrcInfo(src_info()); - - return pArithm; + LPRDOFUNFunction pFunction = Converter::s_converter()->findFUNFunction(funName); + if (!pFunction) + { + return createSeqCall(funName); + } + + const std::size_t nParams = pFunction->getParams().size(); + if (nParams != m_paramList.size()) + { + Converter::s_converter()->error().error(src_info(), rdo::format("Неверное количество параметров функции: %s", funName.c_str())); + } + + rdo::runtime::LPRDOCalcFunctionCaller pFuncCall = rdo::Factory::create(pFunction->getFunctionCalc()); + pFunction->insertPostLinked(pFuncCall); + pFuncCall->setSrcInfo(src_info()); + for (std::size_t i = 0; i < nParams; i++) + { + LPRDOTypeParam pFuncParam = pFunction->getParams()[i]->getType(); + LPRDOFUNArithm pArithm = m_paramList[i]; + ASSERT(pArithm); + pArithm->checkParamType(pFuncParam); + pFuncCall->addParameter(pFuncParam->type()->calc_cast(pArithm->createCalc(pFuncParam), pArithm->type())); + } + + LPRDOFUNArithm pArithm = rdo::Factory::create( + rdo::Factory::create(pFunction->getReturn()->getType()->type(), src_pos()), + pFuncCall.object_parent_cast() + ); + ASSERT(pArithm); + pArithm->setSrcInfo(src_info()); + + return pArithm; } LPRDOFUNArithm RDOFUNParams::createSeqCall(const std::string& seqName) { - LPRDOFUNSequence pSequence = Converter::s_converter()->findFUNSequence(seqName); - if (!pSequence) - { - Converter::s_converter()->error().error(m_funseqName, rdo::format("Неопределенная функция или последовательность: %s", seqName.c_str())); - } - LPRDOFUNParams pThis(this); - ASSERT(pThis); - LPRDOFUNArithm pArithm = pSequence->createCallCalc(pThis, src_info()); - ASSERT(pArithm); - return pArithm; + LPRDOFUNSequence pSequence = Converter::s_converter()->findFUNSequence(seqName); + if (!pSequence) + { + Converter::s_converter()->error().error(m_funseqName, rdo::format("Неопределенная функция или последовательность: %s", seqName.c_str())); + } + LPRDOFUNParams pThis(this); + ASSERT(pThis); + LPRDOFUNArithm pArithm = pSequence->createCallCalc(pThis, src_info()); + ASSERT(pArithm); + return pArithm; } // -------------------------------------------------------------------------------- @@ -902,11 +900,11 @@ LPRDOFUNArithm RDOFUNParams::createSeqCall(const std::string& seqName) // -------------------- RDOFUNSequence // -------------------------------------------------------------------------------- RDOFUNSequence::RDOFUNSequence(const LPRDOFUNSequenceHeader& pHeader, int seed) - : RDOParserSrcInfo(pHeader->src_info()) - , m_pHeader (pHeader ) - , m_seed (seed ) + : RDOParserSrcInfo(pHeader->src_info()) + , m_pHeader (pHeader ) + , m_seed (seed ) { - Converter::s_converter()->insertFUNSequence(this); + Converter::s_converter()->insertFUNSequence(this); } RDOFUNSequence::~RDOFUNSequence() @@ -914,43 +912,43 @@ RDOFUNSequence::~RDOFUNSequence() void RDOFUNSequence::initResult() { - initCalcSrcInfo(); - m_pNextCalc->m_res_real = true; - switch (m_pHeader->getType()->type()->typeID()) - { - case rdo::runtime::RDOType::t_int: - { - LPRDOTypeIntRange pRange = m_pHeader->getType()->type().object_dynamic_cast(); - if (pRange) - { - m_pNextCalc->m_range = rdo::runtime::RDOCalcSeqNext::Range(pRange->range()->getMin()->value().getDouble(), pRange->range()->getMax()->value().getDouble()); - } - break; - } - case rdo::runtime::RDOType::t_real: - { - m_pNextCalc->m_res_real = true; - LPRDOTypeRealRange pRange = m_pHeader->getType()->type().object_dynamic_cast(); - if (pRange) - { - m_pNextCalc->m_range = rdo::runtime::RDOCalcSeqNext::Range(pRange->range()->getMin()->value().getDouble(), pRange->range()->getMax()->value().getDouble()); - } - break; - } - default: - break; - } + initCalcSrcInfo(); + m_pNextCalc->m_res_real = true; + switch (m_pHeader->getType()->type()->typeID()) + { + case rdo::runtime::RDOType::Type::INT: + { + LPRDOTypeIntRange pRange = m_pHeader->getType()->type().object_dynamic_cast(); + if (pRange) + { + m_pNextCalc->m_range = rdo::runtime::RDOCalcSeqNext::Range(pRange->range()->getMin()->value().getDouble(), pRange->range()->getMax()->value().getDouble()); + } + break; + } + case rdo::runtime::RDOType::Type::REAL: + { + m_pNextCalc->m_res_real = true; + LPRDOTypeRealRange pRange = m_pHeader->getType()->type().object_dynamic_cast(); + if (pRange) + { + m_pNextCalc->m_range = rdo::runtime::RDOCalcSeqNext::Range(pRange->range()->getMin()->value().getDouble(), pRange->range()->getMax()->value().getDouble()); + } + break; + } + default: + break; + } } void RDOFUNSequence::initCalcSrcInfo() { - if (m_pInitCalc) - { - rdo::runtime::RDOSrcInfo srcInfo(m_pHeader->src_info()); - srcInfo.setSrcText("Установка базы последовательности " + m_pHeader->src_info().src_text()); - m_pInitCalc->setSrcInfo(srcInfo); - } - m_pNextCalc->setSrcInfo(m_pHeader->src_info()); + if (m_pInitCalc) + { + rdo::runtime::RDOSrcInfo srcInfo(m_pHeader->src_info()); + srcInfo.setSrcText("Установка базы последовательности " + m_pHeader->src_info().src_text()); + m_pInitCalc->setSrcInfo(srcInfo); + } + m_pNextCalc->setSrcInfo(m_pHeader->src_info()); } // -------------------------------------------------------------------------------- @@ -959,151 +957,151 @@ void RDOFUNSequence::initCalcSrcInfo() // -------------------- RDOFUNSequenceUniform // -------------------------------------------------------------------------------- RDOFUNSequenceUniform::RDOFUNSequenceUniform(const LPRDOFUNSequenceHeader& pHeader, int seed) - : RDOFUNSequence(pHeader, seed) + : RDOFUNSequence(pHeader, seed) { - if (m_pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::t_enum) - { - Converter::s_converter()->error().error(src_info(), "Последовательность типа uniform не может возвращять значения перечислимого типа"); - } + if (m_pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + Converter::s_converter()->error().error(src_info(), "Последовательность типа uniform не может возвращять значения перечислимого типа"); + } } void RDOFUNSequenceUniform::createCalcs() { - rdo::runtime::RandGeneratorUniform* pGenerator = new rdo::runtime::RandGeneratorUniform(); - m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); - Converter::s_converter()->runtime()->addInitCalc(m_pInitCalc); - m_pNextCalc = rdo::Factory::create(pGenerator); - initResult(); + rdo::runtime::RandGeneratorUniform* pGenerator = new rdo::runtime::RandGeneratorUniform(); + m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); + Converter::s_converter()->runtime()->addInitCalc(m_pInitCalc); + m_pNextCalc = rdo::Factory::create(pGenerator); + initResult(); } LPRDOFUNArithm RDOFUNSequenceUniform::createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seq_src_info) const { - if (pParamList->getParamList().size() != 2) - { - Converter::s_converter()->error().error(seq_src_info, rdo::format("Для равномерного закона распределения '%s' нужно указать два параметра: минимальную и максимальную границы диапазона", name().c_str())); - } + if (pParamList->getParamList().size() != 2) + { + Converter::s_converter()->error().error(seq_src_info, rdo::format("Для равномерного закона распределения '%s' нужно указать два параметра: минимальную и максимальную границы диапазона", name().c_str())); + } - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); - ASSERT(pFuctionCall); + rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); + ASSERT(pFuctionCall); - LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo()); - rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); - rdo::runtime::LPRDOCalc pArg2 = pParamList->getCalc(1, pType); + LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo()); + rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); + rdo::runtime::LPRDOCalc pArg2 = pParamList->getCalc(1, pType); - pFuctionCall->addParameter(pArg1); - pFuctionCall->addParameter(pArg2); + pFuctionCall->addParameter(pArg1); + pFuctionCall->addParameter(pArg2); - LPRDOFUNArithm pArithm = rdo::Factory::create( - rdo::Factory::create(m_pHeader->getType()->type(), pParamList->src_pos()), - pFuctionCall.object_parent_cast() - ); - ASSERT(pArithm); - pArithm->setSrcInfo(seq_src_info); - if (pArithm->typeID() == rdo::runtime::RDOType::t_enum) - { - Converter::s_converter()->error().error(src_info(), "Внутренняя ошибка парсера"); - } - return pArithm; + LPRDOFUNArithm pArithm = rdo::Factory::create( + rdo::Factory::create(m_pHeader->getType()->type(), pParamList->src_pos()), + pFuctionCall.object_parent_cast() + ); + ASSERT(pArithm); + pArithm->setSrcInfo(seq_src_info); + if (pArithm->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + Converter::s_converter()->error().error(src_info(), "Внутренняя ошибка парсера"); + } + return pArithm; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNSequenceExponential // -------------------------------------------------------------------------------- RDOFUNSequenceExponential::RDOFUNSequenceExponential(const LPRDOFUNSequenceHeader& pHeader, int seed) - : RDOFUNSequence(pHeader, seed) + : RDOFUNSequence(pHeader, seed) { - if (m_pHeader->getType()->type()->typeID() != rdo::runtime::RDOType::t_int && m_pHeader->getType()->type()->typeID() != rdo::runtime::RDOType::t_real) - { - Converter::s_converter()->error().error(src_info(), rdo::format("Последовательность '%s' может возвращять значения только целого или вещественного типа", src_text().c_str())); - } + if (m_pHeader->getType()->type()->typeID() != rdo::runtime::RDOType::Type::INT && m_pHeader->getType()->type()->typeID() != rdo::runtime::RDOType::Type::REAL) + { + Converter::s_converter()->error().error(src_info(), rdo::format("Последовательность '%s' может возвращять значения только целого или вещественного типа", src_text().c_str())); + } } void RDOFUNSequenceExponential::createCalcs() { - rdo::runtime::RandGeneratorExponential* pGenerator = new rdo::runtime::RandGeneratorExponential(); - m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); - Converter::s_converter()->runtime()->addInitCalc(m_pInitCalc); - m_pNextCalc = rdo::Factory::create(pGenerator); - initResult(); + rdo::runtime::RandGeneratorExponential* pGenerator = new rdo::runtime::RandGeneratorExponential(); + m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); + Converter::s_converter()->runtime()->addInitCalc(m_pInitCalc); + m_pNextCalc = rdo::Factory::create(pGenerator); + initResult(); } LPRDOFUNArithm RDOFUNSequenceExponential::createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seq_src_info) const { - if (pParamList->getParamList().size() != 1) - { - Converter::s_converter()->error().error(seq_src_info, rdo::format("Для экспоненциального закона распределения '%s' нужно указать один параметр: математическое ожидание", name().c_str())); - } + if (pParamList->getParamList().size() != 1) + { + Converter::s_converter()->error().error(seq_src_info, rdo::format("Для экспоненциального закона распределения '%s' нужно указать один параметр: математическое ожидание", name().c_str())); + } - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); - ASSERT(pFuctionCall); + rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); + ASSERT(pFuctionCall); - LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo()); - rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); + LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo()); + rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); - pFuctionCall->addParameter(pArg1); + pFuctionCall->addParameter(pArg1); - LPRDOFUNArithm pArithm = rdo::Factory::create( - rdo::Factory::create(m_pHeader->getType()->type(), pParamList->src_pos()), - pFuctionCall.object_parent_cast() - ); - ASSERT(pArithm); - pArithm->setSrcInfo(seq_src_info); - if (pArithm->typeID() == rdo::runtime::RDOType::t_enum) - { - Converter::s_converter()->error().error(src_info(), "Внутренняя ошибка парсера"); - } - return pArithm; + LPRDOFUNArithm pArithm = rdo::Factory::create( + rdo::Factory::create(m_pHeader->getType()->type(), pParamList->src_pos()), + pFuctionCall.object_parent_cast() + ); + ASSERT(pArithm); + pArithm->setSrcInfo(seq_src_info); + if (pArithm->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + Converter::s_converter()->error().error(src_info(), "Внутренняя ошибка парсера"); + } + return pArithm; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNSequenceNormal // -------------------------------------------------------------------------------- RDOFUNSequenceNormal::RDOFUNSequenceNormal(const LPRDOFUNSequenceHeader& pHeader, int seed) - : RDOFUNSequence(pHeader, seed) + : RDOFUNSequence(pHeader, seed) { - if (m_pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::t_enum) - { - Converter::s_converter()->error().error(src_info(), "Последовательность типа normal не может возвращять значения перечислимого типа"); - } + if (m_pHeader->getType()->type()->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + Converter::s_converter()->error().error(src_info(), "Последовательность типа normal не может возвращять значения перечислимого типа"); + } } void RDOFUNSequenceNormal::createCalcs() { - rdo::runtime::RandGeneratorNormal* pGenerator = new rdo::runtime::RandGeneratorNormal(); - m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); - Converter::s_converter()->runtime()->addInitCalc(m_pInitCalc); - m_pNextCalc = rdo::Factory::create(pGenerator); - initResult(); + rdo::runtime::RandGeneratorNormal* pGenerator = new rdo::runtime::RandGeneratorNormal(); + m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); + Converter::s_converter()->runtime()->addInitCalc(m_pInitCalc); + m_pNextCalc = rdo::Factory::create(pGenerator); + initResult(); } LPRDOFUNArithm RDOFUNSequenceNormal::createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seq_src_info) const { - if (pParamList->getParamList().size() != 2) - { - Converter::s_converter()->error().error(seq_src_info, rdo::format("Для нормального закона распределения '%s' нужно указать два параметра: математическое ожидание и среднее квадратическое отклонение", name().c_str())); - } + if (pParamList->getParamList().size() != 2) + { + Converter::s_converter()->error().error(seq_src_info, rdo::format("Для нормального закона распределения '%s' нужно указать два параметра: математическое ожидание и среднее квадратическое отклонение", name().c_str())); + } - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); - ASSERT(pFuctionCall); + rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); + ASSERT(pFuctionCall); - LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo()); - rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); - rdo::runtime::LPRDOCalc pArg2 = pParamList->getCalc(1, pType); + LPRDOTypeParam pType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo()); + rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); + rdo::runtime::LPRDOCalc pArg2 = pParamList->getCalc(1, pType); - pFuctionCall->addParameter(pArg1); - pFuctionCall->addParameter(pArg2); + pFuctionCall->addParameter(pArg1); + pFuctionCall->addParameter(pArg2); - LPRDOFUNArithm pArithm = rdo::Factory::create( - rdo::Factory::create(m_pHeader->getType()->type(), pParamList->src_pos()), - pFuctionCall.object_parent_cast() - ); - ASSERT(pArithm); - pArithm->setSrcInfo(seq_src_info); - if (pArithm->typeID() == rdo::runtime::RDOType::t_enum) - { - Converter::s_converter()->error().error(src_info(), "Внутренняя ошибка парсера"); - } - return pArithm; + LPRDOFUNArithm pArithm = rdo::Factory::create( + rdo::Factory::create(m_pHeader->getType()->type(), pParamList->src_pos()), + pFuctionCall.object_parent_cast() + ); + ASSERT(pArithm); + pArithm->setSrcInfo(seq_src_info); + if (pArithm->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + Converter::s_converter()->error().error(src_info(), "Внутренняя ошибка парсера"); + } + return pArithm; } // -------------------------------------------------------------------------------- @@ -1112,125 +1110,125 @@ LPRDOFUNArithm RDOFUNSequenceNormal::createCallCalc(LPRDOFUNParams& pParamList, // -------------------- RDOFUNSequenceByHist // -------------------------------------------------------------------------------- RDOFUNSequenceByHist::RDOFUNSequenceByHist(const LPRDOFUNSequenceByHistHeader& pHeader) - : RDOFUNSequence(pHeader->getHeader(), pHeader->getSeed()) + : RDOFUNSequence(pHeader->getHeader(), pHeader->getSeed()) {} LPRDOFUNArithm RDOFUNSequenceByHist::createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& src_info) const { - if (pParamList->getParamList().size() != 0) - { - Converter::s_converter()->error().error(src_info, rdo::format("Гистограмма '%s' должна вызываться без параметров", name().c_str())); - } + if (pParamList->getParamList().size() != 0) + { + Converter::s_converter()->error().error(src_info, rdo::format("Гистограмма '%s' должна вызываться без параметров", name().c_str())); + } - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); - ASSERT(pFuctionCall); + rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); + ASSERT(pFuctionCall); - LPRDOFUNArithm pArithm = rdo::Factory::create( - rdo::Factory::create(m_pHeader->getType()->type(), pParamList->src_pos()), - pFuctionCall.object_parent_cast() - ); - ASSERT(pArithm); - pArithm->setSrcInfo(src_info); - return pArithm; + LPRDOFUNArithm pArithm = rdo::Factory::create( + rdo::Factory::create(m_pHeader->getType()->type(), pParamList->src_pos()), + pFuctionCall.object_parent_cast() + ); + ASSERT(pArithm); + pArithm->setSrcInfo(src_info); + return pArithm; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNSequenceByHistReal // -------------------------------------------------------------------------------- RDOFUNSequenceByHistReal::RDOFUNSequenceByHistReal(const LPRDOFUNSequenceByHistHeader& pHeader, const LPRDOValue& pFrom, const LPRDOValue& pTo, const LPRDOValue& pFreq) - : RDOFUNSequenceByHist(pHeader) + : RDOFUNSequenceByHist(pHeader) { - addReal(pFrom, pTo, pFreq); + addReal(pFrom, pTo, pFreq); } void RDOFUNSequenceByHistReal::addReal(const LPRDOValue& pFrom, const LPRDOValue& pTo, const LPRDOValue& pFreq) { - ASSERT(pFrom); - ASSERT(pTo ); - ASSERT(pFreq); - - if (!m_to.empty() && pFrom->value() != m_to.back()) - { - Converter::s_converter()->error().error(pFrom->src_info(), "Начало интервала должно совпадать с окончанием предыдущего"); - } - if (pFrom->value() > pTo->value()) - { - Converter::s_converter()->error().error(pTo->src_info(), "Начало интервала должно быть меньше его конца"); - } - if (pFreq->value() == 0) - { - Converter::s_converter()->error().warning(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); - } - else if (pFreq->value() < 0) - { - Converter::s_converter()->error().error(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); - } - m_pHeader->getType()->value_cast(pFrom); - m_pHeader->getType()->value_cast(pTo ); - m_from.push_back(pFrom->value()); - m_to .push_back(pTo ->value()); - m_freq.push_back(pFreq->value()); + ASSERT(pFrom); + ASSERT(pTo ); + ASSERT(pFreq); + + if (!m_to.empty() && pFrom->value() != m_to.back()) + { + Converter::s_converter()->error().error(pFrom->src_info(), "Начало интервала должно совпадать с окончанием предыдущего"); + } + if (pFrom->value() > pTo->value()) + { + Converter::s_converter()->error().error(pTo->src_info(), "Начало интервала должно быть меньше его конца"); + } + if (pFreq->value() == 0) + { + Converter::s_converter()->error().warning(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); + } + else if (pFreq->value() < 0) + { + Converter::s_converter()->error().error(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); + } + m_pHeader->getType()->value_cast(pFrom); + m_pHeader->getType()->value_cast(pTo ); + m_from.push_back(pFrom->value()); + m_to .push_back(pTo ->value()); + m_freq.push_back(pFreq->value()); } void RDOFUNSequenceByHistReal::createCalcs() { - rdo::runtime::RandGeneratorByHistReal* pGenerator = new rdo::runtime::RandGeneratorByHistReal(); - int size = m_from.size(); - for (int i = 0; i < size; i++) - { - pGenerator->addValues(m_from[i].getDouble(), m_to[i].getDouble(), m_freq[i].getDouble()); - } + rdo::runtime::RandGeneratorByHistReal* pGenerator = new rdo::runtime::RandGeneratorByHistReal(); + int size = m_from.size(); + for (int i = 0; i < size; i++) + { + pGenerator->addValues(m_from[i].getDouble(), m_to[i].getDouble(), m_freq[i].getDouble()); + } - m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); - Converter::s_converter()->runtime()->addInitCalc(m_pInitCalc); - m_pNextCalc = rdo::Factory::create(pGenerator); - initResult(); + m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); + Converter::s_converter()->runtime()->addInitCalc(m_pInitCalc); + m_pNextCalc = rdo::Factory::create(pGenerator); + initResult(); } // -------------------------------------------------------------------------------- // -------------------- RDOFUNSequenceByHistEnum // -------------------------------------------------------------------------------- RDOFUNSequenceByHistEnum::RDOFUNSequenceByHistEnum(const LPRDOFUNSequenceByHistHeader& pHeader, const LPRDOValue& pValue, const LPRDOValue& pFreq) - : RDOFUNSequenceByHist(pHeader) + : RDOFUNSequenceByHist(pHeader) { - addEnum(pValue, pFreq); + addEnum(pValue, pFreq); } void RDOFUNSequenceByHistEnum::addEnum(const LPRDOValue& pValue, const LPRDOValue& pFreq) { - ASSERT(pValue); - ASSERT(pFreq ); - - if (pFreq->value() == 0) - { - Converter::s_converter()->error().warning(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); - } - else if (pFreq->value() < 0) - { - Converter::s_converter()->error().error(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); - } - m_pHeader->getType()->value_cast(pValue); - rdo::runtime::RDOValue enum_id = m_pHeader->getType()->value_cast(pValue)->value(); - if (std::find(m_values.begin(), m_values.end(), enum_id) != m_values.end()) - { - Converter::s_converter()->error().error(pValue->src_info(), rdo::format("Перечислимое значение определено дважды: %s", pValue->value().getIdentificator().c_str())); - } - m_values.push_back(enum_id); - m_freq .push_back(pFreq->value()); + ASSERT(pValue); + ASSERT(pFreq ); + + if (pFreq->value() == 0) + { + Converter::s_converter()->error().warning(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); + } + else if (pFreq->value() < 0) + { + Converter::s_converter()->error().error(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); + } + m_pHeader->getType()->value_cast(pValue); + rdo::runtime::RDOValue enum_id = m_pHeader->getType()->value_cast(pValue)->value(); + if (std::find(m_values.begin(), m_values.end(), enum_id) != m_values.end()) + { + Converter::s_converter()->error().error(pValue->src_info(), rdo::format("Перечислимое значение определено дважды: %s", pValue->value().getIdentificator().c_str())); + } + m_values.push_back(enum_id); + m_freq .push_back(pFreq->value()); } void RDOFUNSequenceByHistEnum::createCalcs() { - rdo::runtime::RandGeneratorByHistEnum* pGenerator = new rdo::runtime::RandGeneratorByHistEnum(); - const std::size_t size = m_values.size(); - for (std::size_t i = 0; i < size; i++) - { - pGenerator->addValues(m_values[i], m_freq[i].getDouble()); - } - m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); - Converter::s_converter()->runtime()->addInitCalc(m_pInitCalc); - m_pNextCalc = rdo::Factory::create(pGenerator); - initCalcSrcInfo(); + rdo::runtime::RandGeneratorByHistEnum* pGenerator = new rdo::runtime::RandGeneratorByHistEnum(); + const std::size_t size = m_values.size(); + for (std::size_t i = 0; i < size; i++) + { + pGenerator->addValues(m_values[i], m_freq[i].getDouble()); + } + m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); + Converter::s_converter()->runtime()->addInitCalc(m_pInitCalc); + m_pNextCalc = rdo::Factory::create(pGenerator); + initCalcSrcInfo(); } // -------------------------------------------------------------------------------- @@ -1240,21 +1238,21 @@ void RDOFUNSequenceByHistEnum::createCalcs() // -------------------------------------------------------------------------------- LPRDOFUNArithm RDOFUNSequenceEnumerative::createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& src_info) const { - if (pParamList->getParamList().size() != 0) - { - Converter::s_converter()->error().error(src_info, rdo::format("Перечисление '%s' должно вызываться без параметров", name().c_str())); - } + if (pParamList->getParamList().size() != 0) + { + Converter::s_converter()->error().error(src_info, rdo::format("Перечисление '%s' должно вызываться без параметров", name().c_str())); + } - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); - ASSERT(pFuctionCall); + rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); + ASSERT(pFuctionCall); - LPRDOFUNArithm pArithm = rdo::Factory::create( - rdo::Factory::create(m_pHeader->getType()->type(), pParamList->src_pos()), - pFuctionCall.object_parent_cast() - ); - ASSERT(pArithm); - pArithm->setSrcInfo(src_info); - return pArithm; + LPRDOFUNArithm pArithm = rdo::Factory::create( + rdo::Factory::create(m_pHeader->getType()->type(), pParamList->src_pos()), + pFuctionCall.object_parent_cast() + ); + ASSERT(pArithm); + pArithm->setSrcInfo(src_info); + return pArithm; } // -------------------------------------------------------------------------------- @@ -1262,13 +1260,13 @@ LPRDOFUNArithm RDOFUNSequenceEnumerative::createCallCalc(LPRDOFUNParams& pParamL // -------------------------------------------------------------------------------- void RDOFUNSequenceEnumerative::createCalcs() { - rdo::runtime::RandGeneratorEnumerative* pGenerator = new rdo::runtime::RandGeneratorEnumerative(); - for (std::size_t i = 0; i < m_valueList.size(); i++) - { - pGenerator->addValue(m_valueList[i]->value()); - } - m_pNextCalc = rdo::Factory::create(pGenerator); - initCalcSrcInfo(); + rdo::runtime::RandGeneratorEnumerative* pGenerator = new rdo::runtime::RandGeneratorEnumerative(); + for (std::size_t i = 0; i < m_valueList.size(); i++) + { + pGenerator->addValue(m_valueList[i]->value()); + } + m_pNextCalc = rdo::Factory::create(pGenerator); + initCalcSrcInfo(); } // -------------------------------------------------------------------------------- @@ -1277,7 +1275,7 @@ void RDOFUNSequenceEnumerative::createCalcs() // -------------------- RDOFUNFunctionListElement // -------------------------------------------------------------------------------- RDOFUNFunctionListElement::RDOFUNFunctionListElement(const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) + : RDOParserSrcInfo(src_info) {} RDOFUNFunctionListElement::~RDOFUNFunctionListElement() @@ -1285,85 +1283,85 @@ RDOFUNFunctionListElement::~RDOFUNFunctionListElement() rdo::runtime::LPRDOCalcIsEqual RDOFUNFunctionListElement::createIsEqualCalc(const LPRDOTypeParam& pRetType, const rdo::runtime::LPRDOCalcFuncParam& pFuncParam, const RDOParserSrcInfo& src_pos) const { - rdo::runtime::LPRDOCalcConst pCalcConst = createResultCalc(pRetType, src_pos); - return rdo::Factory::create(pFuncParam, pCalcConst); + rdo::runtime::LPRDOCalcConst pCalcConst = createResultCalc(pRetType, src_pos); + return rdo::Factory::create(pFuncParam, pCalcConst); } // -------------------------------------------------------------------------------- // -------------------- RDOFUNFunctionListElementIdentif // -------------------------------------------------------------------------------- RDOFUNFunctionListElementIdentif::RDOFUNFunctionListElementIdentif(const RDOParserSrcInfo& src_info) - : RDOFUNFunctionListElement(src_info) + : RDOFUNFunctionListElement(src_info) {} rdo::runtime::LPRDOCalcConst RDOFUNFunctionListElementIdentif::createResultCalc(const LPRDOTypeParam& pRetType, const RDOParserSrcInfo& src_pos) const { - rdo::runtime::LPRDOCalcConst pCalcConst = rdo::Factory::create( - pRetType->value_cast( - rdo::Factory::create(RDOParserSrcInfo(src_pos.getPosAsYY(), src_text())) - )->value() - ); - ASSERT(pCalcConst); - pCalcConst->setSrcInfo(src_pos); - return pCalcConst; + rdo::runtime::LPRDOCalcConst pCalcConst = rdo::Factory::create( + pRetType->value_cast( + rdo::Factory::create(RDOParserSrcInfo(src_pos.getPosAsYY(), src_text())) + )->value() + ); + ASSERT(pCalcConst); + pCalcConst->setSrcInfo(src_pos); + return pCalcConst; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNFunctionListElementReal // -------------------------------------------------------------------------------- RDOFUNFunctionListElementReal::RDOFUNFunctionListElementReal(const YYLTYPE& position, double value) - : RDOFUNFunctionListElement(RDOParserSrcInfo(position, rdo::format("%f", value))) - , m_value(value) + : RDOFUNFunctionListElement(RDOParserSrcInfo(position, rdo::format("%f", value))) + , m_value(value) {} rdo::runtime::LPRDOCalcConst RDOFUNFunctionListElementReal::createResultCalc(const LPRDOTypeParam& pRetType, const RDOParserSrcInfo& src_pos) const { - rdo::runtime::LPRDOCalcConst pCalcConst = rdo::Factory::create( - pRetType->value_cast(rdo::Factory::create(m_value, rdo::Factory::create(), src_pos))->value() - ); - pCalcConst->setSrcInfo(src_pos); - return pCalcConst; + rdo::runtime::LPRDOCalcConst pCalcConst = rdo::Factory::create( + pRetType->value_cast(rdo::Factory::create(m_value, rdo::Factory::create(), src_pos))->value() + ); + pCalcConst->setSrcInfo(src_pos); + return pCalcConst; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNFunctionListElementInt // -------------------------------------------------------------------------------- RDOFUNFunctionListElementInt::RDOFUNFunctionListElementInt(const YYLTYPE& position, int value) - : RDOFUNFunctionListElement(RDOParserSrcInfo(position, rdo::format("%d", value))) - , m_value(value) + : RDOFUNFunctionListElement(RDOParserSrcInfo(position, rdo::format("%d", value))) + , m_value(value) {} rdo::runtime::LPRDOCalcConst RDOFUNFunctionListElementInt::createResultCalc(const LPRDOTypeParam& pRetType, const RDOParserSrcInfo& src_pos) const { - rdo::runtime::LPRDOCalcConst pCalcConst = rdo::Factory::create( - pRetType->value_cast(rdo::Factory::create(m_value, rdo::Factory::create().object_parent_cast(), src_pos))->value() - ); - pCalcConst->setSrcInfo(src_pos); - return pCalcConst; + rdo::runtime::LPRDOCalcConst pCalcConst = rdo::Factory::create( + pRetType->value_cast(rdo::Factory::create(m_value, rdo::Factory::create().object_parent_cast(), src_pos))->value() + ); + pCalcConst->setSrcInfo(src_pos); + return pCalcConst; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNFunctionListElementEq // -------------------------------------------------------------------------------- RDOFUNFunctionListElementEq::RDOFUNFunctionListElementEq(const YYLTYPE& position) - : RDOFUNFunctionListElement(RDOParserSrcInfo(position, "=")) + : RDOFUNFunctionListElement(RDOParserSrcInfo(position, "=")) {} rdo::runtime::LPRDOCalcConst RDOFUNFunctionListElementEq::createResultCalc(const LPRDOTypeParam& /*pRetType*/, const RDOParserSrcInfo& src_pos) const { - Converter::s_converter()->error().error(src_pos, "Внутренная ошибка парсера: RDOFUNFunctionListElementEq::createResultCalc"); - NEVER_REACH_HERE; - return NULL; + Converter::s_converter()->error().error(src_pos, "Внутренняя ошибка парсера: RDOFUNFunctionListElementEq::createResultCalc"); + NEVER_REACH_HERE; + return NULL; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNCalculateIf // -------------------------------------------------------------------------------- RDOFUNCalculateIf::RDOFUNCalculateIf(const LPRDOFUNLogic& pCondition, const LPRDOFUNArithm& pAction) - : m_pCondition(pCondition) - , m_pAction (pAction ) + : m_pCondition(pCondition) + , m_pAction (pAction ) { - m_pAction->checkParamType(Converter::s_converter()->getLastFUNFunction()->getReturn()->getType()); + m_pAction->checkParamType(Converter::s_converter()->getLastFUNFunction()->getReturn()->getType()); } RDOFUNCalculateIf::~RDOFUNCalculateIf() @@ -1373,17 +1371,17 @@ RDOFUNCalculateIf::~RDOFUNCalculateIf() // -------------------- RDOFUNFunction // -------------------------------------------------------------------------------- RDOFUNFunction::RDOFUNFunction(const RDOParserSrcInfo& src_info, const LPRDOParam& pReturn) - : RDOParserSrcInfo(src_info) - , m_pReturn (pReturn ) + : RDOParserSrcInfo(src_info) + , m_pReturn (pReturn ) { - Converter::s_converter()->insertFUNFunction(this); + Converter::s_converter()->insertFUNFunction(this); } RDOFUNFunction::RDOFUNFunction(const std::string& name, const LPRDOParam& pReturn) - : RDOParserSrcInfo(name ) - , m_pReturn (pReturn) + : RDOParserSrcInfo(name ) + , m_pReturn (pReturn) { - Converter::s_converter()->insertFUNFunction(this); + Converter::s_converter()->insertFUNFunction(this); } RDOFUNFunction::~RDOFUNFunction() @@ -1391,299 +1389,299 @@ RDOFUNFunction::~RDOFUNFunction() void RDOFUNFunction::setFunctionCalc(const rdo::runtime::LPRDOFunCalc& pCalc) { - m_pFunctionCalc = pCalc; - if (m_pFunctionCalc->srcInfo().src_empty()) - { - m_pFunctionCalc->setSrcInfo(src_info()); - } - for (const auto& calc: m_postLinkedList) - { - calc->setFunctionCalc(getFunctionCalc()); - } + m_pFunctionCalc = pCalc; + if (m_pFunctionCalc->srcInfo().src_empty()) + { + m_pFunctionCalc->setSrcInfo(src_info()); + } + for (const auto& calc: m_postLinkedList) + { + calc->setFunctionCalc(getFunctionCalc()); + } } LPRDOParam RDOFUNFunction::findFUNFunctionParam(const std::string& paramName) const { - ParamList::const_iterator it = std::find_if(m_paramList.begin(), m_paramList.end(), compareName(paramName)); - return it != m_paramList.end() ? *it : LPRDOParam(NULL); + ParamList::const_iterator it = std::find_if(m_paramList.begin(), m_paramList.end(), compareName(paramName)); + return it != m_paramList.end() ? *it : LPRDOParam(NULL); } int RDOFUNFunction::findFUNFunctionParamNum(const std::string& paramName) const { - ParamList::const_iterator it = std::find_if(m_paramList.begin(), m_paramList.end(), compareName(paramName)); - return it != m_paramList.end() ? it - m_paramList.begin() : -1; + ParamList::const_iterator it = std::find_if(m_paramList.begin(), m_paramList.end(), compareName(paramName)); + return it != m_paramList.end() ? it - m_paramList.begin() : -1; } void RDOFUNFunction::add(const LPRDOParam& pParam) { - LPRDOParam pParamPrev = findFUNFunctionParam(pParam->name()); - if (pParamPrev) - { - Converter::s_converter()->error().push_only(pParam->src_info(), rdo::format("Параметр уже существует: %s", pParam->name().c_str())); - Converter::s_converter()->error().push_only(pParamPrev->src_info(), "См. первое определение"); - Converter::s_converter()->error().push_done(); - } - m_paramList.push_back(pParam); + LPRDOParam pParamPrev = findFUNFunctionParam(pParam->name()); + if (pParamPrev) + { + Converter::s_converter()->error().push_only(pParam->src_info(), rdo::format("Параметр уже существует: %s", pParam->name().c_str())); + Converter::s_converter()->error().push_only(pParamPrev->src_info(), "См. первое определение"); + Converter::s_converter()->error().push_done(); + } + m_paramList.push_back(pParam); } void RDOFUNFunction::add(const LPRDOFUNFunctionListElement& pParam) { - m_elementList.push_back(pParam); + m_elementList.push_back(pParam); } void RDOFUNFunction::add(const LPRDOFUNCalculateIf& pCalculateIf) { - m_calculateIfList.push_back(pCalculateIf); + m_calculateIfList.push_back(pCalculateIf); } void RDOFUNFunction::createListCalc() { - if (!m_pReturn->getDefault()->defined()) - { - Converter::s_converter()->error().error(m_pReturn->src_info(), rdo::format("Функция '%s' должна иметь значение по умолчанию", name().c_str())); - } - if (m_paramList.empty()) - { - Converter::s_converter()->error().error(src_info(), rdo::format("Функция '%s' должна иметь параметры, т.к. её тип list", name().c_str())); - } - if (m_elementList.empty()) - { - Converter::s_converter()->error().warning(src_info(), rdo::format("Функция '%s' не содержит списка", name().c_str())); - } - - rdo::runtime::LPRDOCalcConst pCalcDefault = rdo::Factory::create(m_pReturn->getDefault()->value()); - ASSERT(pCalcDefault); - pCalcDefault->setSrcInfo(m_pReturn->getDefault()->src_info()); - rdo::runtime::LPRDOFunListCalc pFunListCalc = rdo::Factory::create(pCalcDefault); - ASSERT(pFunListCalc); - pFunListCalc->setSrcInfo(src_info()); - ElementList::const_iterator elem_it = m_elementList.begin(); - while (elem_it != m_elementList.end()) - { - rdo::runtime::LPRDOCalc pCaseCalc = rdo::Factory::create(true); - ASSERT(pCaseCalc); - pCaseCalc->setSrcInfo((*elem_it)->src_info()); - int currParamNumber = 0; - ParamList::const_iterator param_it = m_paramList.begin(); - while (param_it != m_paramList.end()) - { - LPRDOParam pParam = *param_it; - if (elem_it == m_elementList.end()) - { - --elem_it; - Converter::s_converter()->error().error((*elem_it)->src_info(), rdo::format("Ожидается значение для параметра '%s'", pParam->name().c_str())); - } - LPRDOFUNFunctionListElement pListElement = *elem_it; - ASSERT(pListElement); - if (pListElement->isEquivalence()) - { - if ((param_it + 1) == m_paramList.end()) - { - Converter::s_converter()->error().error(pListElement->src_info(), rdo::format("Перед знаком равенства ожидается значение для параметра: %s",pParam->name().c_str())); - } - else - { - std::string str = (*param_it)->src_text(); - ++param_it; - while (param_it != m_paramList.end()) - { - str += ", "; - str += (*param_it)->src_text(); - ++param_it; - } - Converter::s_converter()->error().error(pListElement->src_info(), rdo::format("Перед знаком равенства ожидаются значения для параметров: %s", str.c_str())); - } - } - rdo::runtime::LPRDOCalcFuncParam pFuncParam = rdo::Factory::create(currParamNumber, pParam->src_info()); - ASSERT(pFuncParam); - rdo::runtime::LPRDOCalcIsEqual pCompareCalc = pListElement->createIsEqualCalc(pParam->getType(), pFuncParam, pListElement->src_info()); - ASSERT(pCompareCalc); - rdo::runtime::LPRDOCalc pAndCalc = rdo::Factory::create(pCaseCalc, pCompareCalc); - ASSERT(pAndCalc); - pCaseCalc = pAndCalc; - ++elem_it; - ++param_it; - ++currParamNumber; - } - if (elem_it == m_elementList.end()) - { - --elem_it; - --param_it; - Converter::s_converter()->error().error((*elem_it)->src_info(), rdo::format("После значения для параметра '%s' ожидается знак равенства", (*param_it)->name().c_str())); - } - if (!(*elem_it)->isEquivalence()) - { - Converter::s_converter()->error().error((*elem_it)->src_info(), rdo::format("Слишком много значений, вместо '%s' ожидается знак равенства", (*elem_it)->src_text().c_str())); - } - ++elem_it; - if (elem_it == m_elementList.end()) - { - --elem_it; - Converter::s_converter()->error().error((*elem_it)->src_info(), rdo::format("После знака равенства ожидается значение функции '%s'", name().c_str())); - } - rdo::runtime::LPRDOCalcConst pResultCalc = (*elem_it)->createResultCalc(m_pReturn->getType(), (*elem_it)->src_info()); - pFunListCalc->addCase(pCaseCalc, pResultCalc); - ++elem_it; - } - setFunctionCalc(pFunListCalc); + if (!m_pReturn->getDefault()->defined()) + { + Converter::s_converter()->error().error(m_pReturn->src_info(), rdo::format("Функция '%s' должна иметь значение по умолчанию", name().c_str())); + } + if (m_paramList.empty()) + { + Converter::s_converter()->error().error(src_info(), rdo::format("Функция '%s' должна иметь параметры, т.к. её тип list", name().c_str())); + } + if (m_elementList.empty()) + { + Converter::s_converter()->error().warning(src_info(), rdo::format("Функция '%s' не содержит списка", name().c_str())); + } + + rdo::runtime::LPRDOCalcConst pCalcDefault = rdo::Factory::create(m_pReturn->getDefault()->value()); + ASSERT(pCalcDefault); + pCalcDefault->setSrcInfo(m_pReturn->getDefault()->src_info()); + rdo::runtime::LPRDOFunListCalc pFunListCalc = rdo::Factory::create(pCalcDefault); + ASSERT(pFunListCalc); + pFunListCalc->setSrcInfo(src_info()); + ElementList::const_iterator elem_it = m_elementList.begin(); + while (elem_it != m_elementList.end()) + { + rdo::runtime::LPRDOCalc pCaseCalc = rdo::Factory::create(true); + ASSERT(pCaseCalc); + pCaseCalc->setSrcInfo((*elem_it)->src_info()); + int currParamNumber = 0; + ParamList::const_iterator param_it = m_paramList.begin(); + while (param_it != m_paramList.end()) + { + LPRDOParam pParam = *param_it; + if (elem_it == m_elementList.end()) + { + --elem_it; + Converter::s_converter()->error().error((*elem_it)->src_info(), rdo::format("Ожидается значение для параметра '%s'", pParam->name().c_str())); + } + LPRDOFUNFunctionListElement pListElement = *elem_it; + ASSERT(pListElement); + if (pListElement->isEquivalence()) + { + if ((param_it + 1) == m_paramList.end()) + { + Converter::s_converter()->error().error(pListElement->src_info(), rdo::format("Перед знаком равенства ожидается значение для параметра: %s",pParam->name().c_str())); + } + else + { + std::string str = (*param_it)->src_text(); + ++param_it; + while (param_it != m_paramList.end()) + { + str += ", "; + str += (*param_it)->src_text(); + ++param_it; + } + Converter::s_converter()->error().error(pListElement->src_info(), rdo::format("Перед знаком равенства ожидаются значения для параметров: %s", str.c_str())); + } + } + rdo::runtime::LPRDOCalcFuncParam pFuncParam = rdo::Factory::create(currParamNumber, pParam->src_info()); + ASSERT(pFuncParam); + rdo::runtime::LPRDOCalcIsEqual pCompareCalc = pListElement->createIsEqualCalc(pParam->getType(), pFuncParam, pListElement->src_info()); + ASSERT(pCompareCalc); + rdo::runtime::LPRDOCalc pAndCalc = rdo::Factory::create(pCaseCalc, pCompareCalc); + ASSERT(pAndCalc); + pCaseCalc = pAndCalc; + ++elem_it; + ++param_it; + ++currParamNumber; + } + if (elem_it == m_elementList.end()) + { + --elem_it; + --param_it; + Converter::s_converter()->error().error((*elem_it)->src_info(), rdo::format("После значения для параметра '%s' ожидается знак равенства", (*param_it)->name().c_str())); + } + if (!(*elem_it)->isEquivalence()) + { + Converter::s_converter()->error().error((*elem_it)->src_info(), rdo::format("Слишком много значений, вместо '%s' ожидается знак равенства", (*elem_it)->src_text().c_str())); + } + ++elem_it; + if (elem_it == m_elementList.end()) + { + --elem_it; + Converter::s_converter()->error().error((*elem_it)->src_info(), rdo::format("После знака равенства ожидается значение функции '%s'", name().c_str())); + } + rdo::runtime::LPRDOCalcConst pResultCalc = (*elem_it)->createResultCalc(m_pReturn->getType(), (*elem_it)->src_info()); + pFunListCalc->addCase(pCaseCalc, pResultCalc); + ++elem_it; + } + setFunctionCalc(pFunListCalc); } void RDOFUNFunction::createTableCalc(const YYLTYPE& elements_pos) { - ElementList::const_iterator it = m_elementList.begin(); - while (it != m_elementList.end()) - { - if ((*it)->isEquivalence()) - { - Converter::s_converter()->error().error((*it)->src_info(), "Символ '=' недопустим в табличной функции"); - } - ++it; - } - const std::size_t param_cnt = m_paramList.size(); - std::size_t range = 1; - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(0); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText("0"); - pCalc->setSrcInfo(srcInfo); - for (std::size_t currParam = 0; currParam < param_cnt; currParam++) - { - LPRDOParam pFunctionParam = m_paramList.at(currParam); - ASSERT(pFunctionParam); - rdo::runtime::LPRDOCalcFuncParam pFuncParam = rdo::Factory::create(currParam, pFunctionParam->src_info()); - ASSERT(pFuncParam); - rdo::runtime::LPRDOCalc pValue2 = pFuncParam; - if (pFunctionParam->getType()->type()->typeID() != rdo::runtime::RDOType::t_enum) - { - rdo::runtime::LPRDOCalcConst pCalcConst1 = rdo::Factory::create(1); - pCalcConst1->setSrcInfo(pFunctionParam->src_info()); - pValue2 = rdo::Factory::create(pValue2, pCalcConst1); - } - rdo::runtime::LPRDOCalcConst pCalcConst2 = rdo::Factory::create(range); - ASSERT(pCalcConst2); - pCalcConst2->setSrcInfo(pFunctionParam->src_info()); - rdo::runtime::LPRDOCalcMult pCalcMult = rdo::Factory::create(pCalcConst2, pValue2); - rdo::runtime::LPRDOCalcPlus pCalcAdd = rdo::Factory::create(pCalcMult, pCalc); - - switch (pFunctionParam->getType()->type()->typeID()) - { - case rdo::runtime::RDOType::t_int: - if (dynamic_cast(pFunctionParam->getType()->type().get())) - { - LPRDOTypeIntRange pRange = pFunctionParam->getType()->type().object_static_cast(); - if (pRange->range()->getMin()->value().getInt() != 1) - { - Converter::s_converter()->error().error(pRange->range()->src_info(), rdo::format("Минимальное значение диапазона должно быть 1, текущий диапазон [%d..%d]", pRange->range()->getMin()->value().getInt(), pRange->range()->getMax()->value().getInt())); - } - range *= pRange->range()->getMax()->value().getInt() - pRange->range()->getMin()->value().getInt() + 1; - } - else - { - Converter::s_converter()->error().error(pFunctionParam->getType()->src_info(), "Для параметра табличной функции должен быть задан допустимый диапазон"); - } - break; - case rdo::runtime::RDOType::t_enum: - range *= pFunctionParam->getType()->type().object_static_cast()->getEnums()->getValues().size(); - break; - default: - Converter::s_converter()->error().error(pFunctionParam->getType()->src_info(), "Параметр табличной функции может быть целого или перечислимого типа"); - } - pCalc = pCalcAdd; - } - - if (m_elementList.size() != range) - { - Converter::s_converter()->error().error(elements_pos, rdo::format("Неверное количество элементов табличной функции '%s': %d, требуется %d", name().c_str(), m_elementList.size(), range)); - } - - rdo::runtime::LPRDOFuncTableCalc pFuncTableCalc = rdo::Factory::create(pCalc); - ASSERT(pFuncTableCalc); - pFuncTableCalc->setSrcInfo(src_info()); - for (std::size_t currElem = 0; currElem < range; currElem++) - { - LPRDOFUNFunctionListElement pListElement = m_elementList.at(currElem); - ASSERT(pListElement); - rdo::runtime::LPRDOCalcConst pResultCalc = pListElement->createResultCalc(m_pReturn->getType(), pListElement->src_info()); - ASSERT(pResultCalc); - pFuncTableCalc->addResultCalc(pResultCalc); - } - setFunctionCalc(pFuncTableCalc); + ElementList::const_iterator it = m_elementList.begin(); + while (it != m_elementList.end()) + { + if ((*it)->isEquivalence()) + { + Converter::s_converter()->error().error((*it)->src_info(), "Символ '=' недопустим в табличной функции"); + } + ++it; + } + const std::size_t param_cnt = m_paramList.size(); + std::size_t range = 1; + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(0); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText("0"); + pCalc->setSrcInfo(srcInfo); + for (std::size_t currParam = 0; currParam < param_cnt; currParam++) + { + LPRDOParam pFunctionParam = m_paramList.at(currParam); + ASSERT(pFunctionParam); + rdo::runtime::LPRDOCalcFuncParam pFuncParam = rdo::Factory::create(currParam, pFunctionParam->src_info()); + ASSERT(pFuncParam); + rdo::runtime::LPRDOCalc pValue2 = pFuncParam; + if (pFunctionParam->getType()->type()->typeID() != rdo::runtime::RDOType::Type::ENUM) + { + rdo::runtime::LPRDOCalcConst pCalcConst1 = rdo::Factory::create(1); + pCalcConst1->setSrcInfo(pFunctionParam->src_info()); + pValue2 = rdo::Factory::create(pValue2, pCalcConst1); + } + rdo::runtime::LPRDOCalcConst pCalcConst2 = rdo::Factory::create(range); + ASSERT(pCalcConst2); + pCalcConst2->setSrcInfo(pFunctionParam->src_info()); + rdo::runtime::LPRDOCalcMult pCalcMult = rdo::Factory::create(pCalcConst2, pValue2); + rdo::runtime::LPRDOCalcPlus pCalcAdd = rdo::Factory::create(pCalcMult, pCalc); + + switch (pFunctionParam->getType()->type()->typeID()) + { + case rdo::runtime::RDOType::Type::INT: + if (dynamic_cast(pFunctionParam->getType()->type().get())) + { + LPRDOTypeIntRange pRange = pFunctionParam->getType()->type().object_static_cast(); + if (pRange->range()->getMin()->value().getInt() != 1) + { + Converter::s_converter()->error().error(pRange->range()->src_info(), rdo::format("Минимальное значение диапазона должно быть 1, текущий диапазон [%d..%d]", pRange->range()->getMin()->value().getInt(), pRange->range()->getMax()->value().getInt())); + } + range *= pRange->range()->getMax()->value().getInt() - pRange->range()->getMin()->value().getInt() + 1; + } + else + { + Converter::s_converter()->error().error(pFunctionParam->getType()->src_info(), "Для параметра табличной функции должен быть задан допустимый диапазон"); + } + break; + case rdo::runtime::RDOType::Type::ENUM: + range *= pFunctionParam->getType()->type().object_static_cast()->getEnums()->getValues().size(); + break; + default: + Converter::s_converter()->error().error(pFunctionParam->getType()->src_info(), "Параметр табличной функции может быть целого или перечислимого типа"); + } + pCalc = pCalcAdd; + } + + if (m_elementList.size() != range) + { + Converter::s_converter()->error().error(elements_pos, rdo::format("Неверное количество элементов табличной функции '%s': %d, требуется %d", name().c_str(), m_elementList.size(), range)); + } + + rdo::runtime::LPRDOFuncTableCalc pFuncTableCalc = rdo::Factory::create(pCalc); + ASSERT(pFuncTableCalc); + pFuncTableCalc->setSrcInfo(src_info()); + for (std::size_t currElem = 0; currElem < range; currElem++) + { + LPRDOFUNFunctionListElement pListElement = m_elementList.at(currElem); + ASSERT(pListElement); + rdo::runtime::LPRDOCalcConst pResultCalc = pListElement->createResultCalc(m_pReturn->getType(), pListElement->src_info()); + ASSERT(pResultCalc); + pFuncTableCalc->addResultCalc(pResultCalc); + } + setFunctionCalc(pFuncTableCalc); } void RDOFUNFunction::createAlgorithmicCalc(const RDOParserSrcInfo& /* body_src_info */) { - rdo::runtime::LPRDOFunAlgorithmicCalc pFunAlgorithmicCalc = rdo::Factory::create(); - ASSERT(pFunAlgorithmicCalc); - - pFunAlgorithmicCalc->setSrcInfo(src_info()); - bool defaultFlag = false; - bool trueConst = false; - rdo::runtime::LPRDOCalcConst pCondition; - int size = m_calculateIfList.size(); - int cnt = 0; - for (int i = 0; i < size; i++) - { - rdo::runtime::LPRDOCalc pLogicCalc = m_calculateIfList[i]->getCondition()->getCalc(m_pReturn->getType()->type()->typeID()); - ASSERT(pLogicCalc); - rdo::runtime::LPRDOCalcConst pConditionLast = pLogicCalc.object_dynamic_cast(); - if (trueConst) - { - Converter::s_converter()->error().warning(m_calculateIfList[i]->getCondition()->src_info(), rdo::format("Условие не используется: %s", m_calculateIfList[i]->getCondition()->src_text().c_str())); - Converter::s_converter()->error().warning(pCondition->srcInfo(), rdo::format("Последнее рабочее условие функции: %s", pCondition->srcInfo().src_text().c_str())); - } - else if (!pConditionLast || pConditionLast->calcValue(Converter::s_converter()->runtime()).getAsBool()) - { - //! Игнорируем чистые false-условия предыдущей проверкой - pFunAlgorithmicCalc->addCalcIf(pLogicCalc, m_calculateIfList[i]->getAction()->createCalc(m_pReturn->getType())); - cnt++; - } - if (!defaultFlag && pConditionLast && pConditionLast->calcValue(Converter::s_converter()->runtime()).getAsBool()) - { - trueConst = true; - defaultFlag = true; - pCondition = pConditionLast; - } - } - if (!cnt) - { - Converter::s_converter()->error().warning(src_info(), rdo::format("Отсутствует тело функции '%s'", name().c_str())); - } - if (!trueConst) - { - if (m_pReturn->getDefault()->defined()) - { - rdo::runtime::LPRDOCalcConst pCalcCondition = rdo::Factory::create(1); - rdo::runtime::LPRDOCalcConst pCalcAction = rdo::Factory::create(m_pReturn->getType()->value_cast(m_pReturn->getDefault())->value()); - ASSERT(pCalcCondition); - ASSERT(pCalcAction ); - pCalcCondition->setSrcInfo(m_pReturn->getType()->src_info()); - pCalcAction->setSrcInfo(m_pReturn->getType()->src_info()); - pFunAlgorithmicCalc->addCalcIf(pCalcCondition, pCalcAction); - defaultFlag = true; - } - } - if (!defaultFlag) - { - //! Присвоить автоматическое значение по умолчанию, если оно не задано в явном виде - rdo::runtime::LPRDOCalcConst pCalcCondition = rdo::Factory::create(1); - rdo::runtime::LPRDOCalcConst pCalcAction = rdo::Factory::create(m_pReturn->getType()->type()->get_default()->value()); - ASSERT(pCalcCondition); - ASSERT(pCalcAction ); - pCalcCondition->setSrcInfo(m_pReturn->getType()->src_info()); - pCalcAction->setSrcInfo(m_pReturn->getType()->src_info()); - pFunAlgorithmicCalc->addCalcIf(pCalcCondition, pCalcAction); - Converter::s_converter()->error().warning(src_info(), rdo::format("Для функции '%s' неопределено значение по умолчанию", name().c_str())); - } - setFunctionCalc(pFunAlgorithmicCalc); + rdo::runtime::LPRDOFunAlgorithmicCalc pFunAlgorithmicCalc = rdo::Factory::create(); + ASSERT(pFunAlgorithmicCalc); + + pFunAlgorithmicCalc->setSrcInfo(src_info()); + bool defaultFlag = false; + bool trueConst = false; + rdo::runtime::LPRDOCalcConst pCondition; + int size = m_calculateIfList.size(); + int cnt = 0; + for (int i = 0; i < size; i++) + { + rdo::runtime::LPRDOCalc pLogicCalc = m_calculateIfList[i]->getCondition()->getCalc(m_pReturn->getType()->type()->typeID()); + ASSERT(pLogicCalc); + rdo::runtime::LPRDOCalcConst pConditionLast = pLogicCalc.object_dynamic_cast(); + if (trueConst) + { + Converter::s_converter()->error().warning(m_calculateIfList[i]->getCondition()->src_info(), rdo::format("Условие не используется: %s", m_calculateIfList[i]->getCondition()->src_text().c_str())); + Converter::s_converter()->error().warning(pCondition->srcInfo(), rdo::format("Последнее рабочее условие функции: %s", pCondition->srcInfo().src_text().c_str())); + } + else if (!pConditionLast || pConditionLast->calcValue(Converter::s_converter()->runtime()).getAsBool()) + { + // Игнорируем чистые false-условия предыдущей проверкой + pFunAlgorithmicCalc->addCalcIf(pLogicCalc, m_calculateIfList[i]->getAction()->createCalc(m_pReturn->getType())); + cnt++; + } + if (!defaultFlag && pConditionLast && pConditionLast->calcValue(Converter::s_converter()->runtime()).getAsBool()) + { + trueConst = true; + defaultFlag = true; + pCondition = pConditionLast; + } + } + if (!cnt) + { + Converter::s_converter()->error().warning(src_info(), rdo::format("Отсутствует тело функции '%s'", name().c_str())); + } + if (!trueConst) + { + if (m_pReturn->getDefault()->defined()) + { + rdo::runtime::LPRDOCalcConst pCalcCondition = rdo::Factory::create(1); + rdo::runtime::LPRDOCalcConst pCalcAction = rdo::Factory::create(m_pReturn->getType()->value_cast(m_pReturn->getDefault())->value()); + ASSERT(pCalcCondition); + ASSERT(pCalcAction ); + pCalcCondition->setSrcInfo(m_pReturn->getType()->src_info()); + pCalcAction->setSrcInfo(m_pReturn->getType()->src_info()); + pFunAlgorithmicCalc->addCalcIf(pCalcCondition, pCalcAction); + defaultFlag = true; + } + } + if (!defaultFlag) + { + // Присвоить автоматическое значение по умолчанию, если оно не задано в явном виде + rdo::runtime::LPRDOCalcConst pCalcCondition = rdo::Factory::create(1); + rdo::runtime::LPRDOCalcConst pCalcAction = rdo::Factory::create(m_pReturn->getType()->type()->get_default()->value()); + ASSERT(pCalcCondition); + ASSERT(pCalcAction ); + pCalcCondition->setSrcInfo(m_pReturn->getType()->src_info()); + pCalcAction->setSrcInfo(m_pReturn->getType()->src_info()); + pFunAlgorithmicCalc->addCalcIf(pCalcCondition, pCalcAction); + Converter::s_converter()->error().warning(src_info(), rdo::format("Для функции '%s' неопределено значение по умолчанию", name().c_str())); + } + setFunctionCalc(pFunAlgorithmicCalc); } // -------------------------------------------------------------------------------- // -------------------- RDOFUNGroup // -------------------------------------------------------------------------------- RDOFUNGroup::RDOFUNGroup(const RDOParserSrcInfo& res_info) - : RDOParserSrcInfo(res_info) + : RDOParserSrcInfo(res_info) { - init(res_info); + init(res_info); } RDOFUNGroup::~RDOFUNGroup() @@ -1691,97 +1689,97 @@ RDOFUNGroup::~RDOFUNGroup() void RDOFUNGroup::init(const RDOParserSrcInfo& res_info) { - m_pResType = Converter::s_converter()->findRTPResType(res_info.src_text()); - if (!m_pResType) - { - Converter::s_converter()->error().error(res_info, rdo::format("Неизвестный тип ресурса: %s", res_info.src_text().c_str())); - } - Converter::s_converter()->insertFUNGroup(this); + m_pResType = Converter::s_converter()->findRTPResType(res_info.src_text()); + if (!m_pResType) + { + Converter::s_converter()->error().error(res_info, rdo::format("Неизвестный тип ресурса: %s", res_info.src_text().c_str())); + } + Converter::s_converter()->insertFUNGroup(this); } // -------------------------------------------------------------------------------- // -------------------- RDOFUNGroupLogic // -------------------------------------------------------------------------------- -RDOFUNGroupLogic::RDOFUNGroupLogic(FunGroupType funType, const RDOParserSrcInfo& res_info) - : RDOFUNGroup(res_info) - , m_funType (funType ) +RDOFUNGroupLogic::RDOFUNGroupLogic(Type type, const RDOParserSrcInfo& res_info) + : RDOFUNGroup(res_info) + , m_funType(type) {} LPRDOFUNLogic RDOFUNGroupLogic::createFunLogic(LPRDOFUNLogic& pCondition) { - rdo::runtime::LPRDOFunCalcGroup calc; - switch (m_funType) - { - case fgt_exist : setSrcText("Exist(" + getResType()->name() + ": " + pCondition->src_text() + ")"); calc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; - case fgt_notexist : setSrcText("NotExist(" + getResType()->name() + ": " + pCondition->src_text() + ")"); calc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; - case fgt_forall : setSrcText("ForAll(" + getResType()->name() + ": " + pCondition->src_text() + ")"); calc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; - case fgt_notforall: setSrcText("NotForAll(" + getResType()->name() + ": " + pCondition->src_text() + ")"); calc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; - default: Converter::s_converter()->error().error(src_info(), "Внутренная ошибка: несуществующий тип функции"); - } - Converter::s_converter()->getFUNGroupStack().pop_back(); - LPRDOFUNLogic pLogic = rdo::Factory::create(calc, false); - pLogic->setSrcInfo(src_info()); - return pLogic; + rdo::runtime::LPRDOFunCalcGroup calc; + switch (m_funType) + { + case Type::EXIST : setSrcText("Exist(" + getResType()->name() + ": " + pCondition->src_text() + ")"); calc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; + case Type::NOTEXIST : setSrcText("NotExist(" + getResType()->name() + ": " + pCondition->src_text() + ")"); calc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; + case Type::FORALL : setSrcText("ForAll(" + getResType()->name() + ": " + pCondition->src_text() + ")"); calc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; + case Type::NOTFORALL: setSrcText("NotForAll(" + getResType()->name() + ": " + pCondition->src_text() + ")"); calc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; + default: Converter::s_converter()->error().error(src_info(), "Внутренняя ошибка: несуществующий тип функции"); + } + Converter::s_converter()->getFUNGroupStack().pop_back(); + LPRDOFUNLogic pLogic = rdo::Factory::create(calc, false); + pLogic->setSrcInfo(src_info()); + return pLogic; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNSelect // -------------------------------------------------------------------------------- RDOFUNSelect::RDOFUNSelect(const RDOParserSrcInfo& res_info) - : RDOFUNGroup(RDOParserSrcInfo(res_info.src_text())) + : RDOFUNGroup(RDOParserSrcInfo(res_info.src_text())) {} -//! Сам Select как выборка по типу и условию +// Сам Select как выборка по типу и условию void RDOFUNSelect::initSelect(LPRDOFUNLogic pCondition) { - //! @warning rdo::runtime::LPRDOFunCalcSelect в рантайме меняет сигнатуру - //! Для конвертора знать про рантайм не обязательно, поэтому не создаём объект m_pCalcSelect - //! Конвертор проверялся на пятнашках, где вместо Exist использовался - //! $Condition Select(Фишка: Фишка.Номер <> Фишка.Местоположение).Exist(1 == 2) - //! Метод createFunSelectGroup отработал с нулевым m_pCalcSelect + // @warning rdo::runtime::LPRDOFunCalcSelect в рантайме меняет сигнатуру + // Для конвертора знать про рантайм не обязательно, поэтому не создаём объект m_pCalcSelect + // Конвертор проверялся на пятнашках, где вместо Exist использовался + // $Condition Select(Фишка: Фишка.Номер <> Фишка.Местоположение).Exist(1 == 2) + // Метод createFunSelectGroup отработал с нулевым m_pCalcSelect - //m_pCalcSelect = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); - //m_pCalcSelect->setSrcInfo(pCondition->src_info()); + //m_pCalcSelect = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); + //m_pCalcSelect->setSrcInfo(pCondition->src_info()); } -//! Групповая функция над выборкой Select'а -LPRDOFUNLogic RDOFUNSelect::createFunSelectGroup(RDOFUNGroupLogic::FunGroupType funType, LPRDOFUNLogic& pCondition) +// Групповая функция над выборкой Select'а +LPRDOFUNLogic RDOFUNSelect::createFunSelectGroup(RDOFUNGroupLogic::Type funType, LPRDOFUNLogic& pCondition) { - ASSERT(pCondition); - rdo::runtime::LPRDOFunCalcSelectBase calc; - switch (funType) - { - case RDOFUNGroupLogic::fgt_exist : setSrcText(src_text() + ".Exist(" + pCondition->src_text() + ")"); calc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); break; - case RDOFUNGroupLogic::fgt_notexist : setSrcText(src_text() + ".NotExist(" + pCondition->src_text() + ")"); calc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); break; - case RDOFUNGroupLogic::fgt_forall : setSrcText(src_text() + ".ForAll(" + pCondition->src_text() + ")"); calc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); break; - case RDOFUNGroupLogic::fgt_notforall: setSrcText(src_text() + ".NotForAll(" + pCondition->src_text() + ")"); calc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); break; - default: Converter::s_converter()->error().error(pCondition->src_info(), "Внутренная ошибка: неизвестный метод для списка ресурсов"); - } - Converter::s_converter()->getFUNGroupStack().pop_back(); - LPRDOFUNLogic pLogic = rdo::Factory::create(calc, false); - pLogic->setSrcInfo(src_info()); - return pLogic; + ASSERT(pCondition); + rdo::runtime::LPRDOFunCalcSelectBase calc; + switch (funType) + { + case RDOFUNGroupLogic::Type::EXIST : setSrcText(src_text() + ".Exist(" + pCondition->src_text() + ")"); calc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); break; + case RDOFUNGroupLogic::Type::NOTEXIST : setSrcText(src_text() + ".NotExist(" + pCondition->src_text() + ")"); calc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); break; + case RDOFUNGroupLogic::Type::FORALL : setSrcText(src_text() + ".ForAll(" + pCondition->src_text() + ")"); calc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); break; + case RDOFUNGroupLogic::Type::NOTFORALL: setSrcText(src_text() + ".NotForAll(" + pCondition->src_text() + ")"); calc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); break; + default: Converter::s_converter()->error().error(pCondition->src_info(), "Внутренняя ошибка: неизвестный метод для списка ресурсов"); + } + Converter::s_converter()->getFUNGroupStack().pop_back(); + LPRDOFUNLogic pLogic = rdo::Factory::create(calc, false); + pLogic->setSrcInfo(src_info()); + return pLogic; } LPRDOFUNLogic RDOFUNSelect::createFunSelectEmpty(const RDOParserSrcInfo& empty_info) { - setSrcText(src_text() + "." + empty_info.src_text()); - Converter::s_converter()->getFUNGroupStack().pop_back(); - LPRDOFUNLogic pLogic = rdo::Factory::create(rdo::Factory::create(m_pCalcSelect), false); - pLogic->setSrcInfo(empty_info); - return pLogic; + setSrcText(src_text() + "." + empty_info.src_text()); + Converter::s_converter()->getFUNGroupStack().pop_back(); + LPRDOFUNLogic pLogic = rdo::Factory::create(rdo::Factory::create(m_pCalcSelect), false); + pLogic->setSrcInfo(empty_info); + return pLogic; } LPRDOFUNArithm RDOFUNSelect::createFunSelectSize(const RDOParserSrcInfo& size_info) { - setSrcText(src_text() + "." + size_info.src_text()); - Converter::s_converter()->getFUNGroupStack().pop_back(); - LPRDOFUNArithm pArithm = rdo::Factory::create( - rdo::Factory::create(rdo::Factory::create().object_parent_cast(), size_info), - rdo::Factory::create(m_pCalcSelect).object_parent_cast() - ); - pArithm->setSrcInfo(size_info); - return pArithm; + setSrcText(src_text() + "." + size_info.src_text()); + Converter::s_converter()->getFUNGroupStack().pop_back(); + LPRDOFUNArithm pArithm = rdo::Factory::create( + rdo::Factory::create(rdo::Factory::create().object_parent_cast(), size_info), + rdo::Factory::create(m_pCalcSelect).object_parent_cast() + ); + pArithm->setSrcInfo(size_info); + return pArithm; } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdofun.h b/converter/smr2rdox/rdofun.h index 99b17603c..bd2710c21 100644 --- a/converter/smr2rdox/rdofun.h +++ b/converter/smr2rdox/rdofun.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOFUN_H_ -#define _CONVERTOR_RDOFUN_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -29,25 +28,25 @@ void cnv_funerror(YYLTYPE* llocp, void* lexer, const char* message); class RDOFUNDoubleToIntByResult { public: - void roundCalc(); - void push_back(const rdo::runtime::LPRDOCalcDoubleToIntByResult& pCalc) - { - m_intOrDouble.push_back(pCalc); - } - void insert(const RDOFUNDoubleToIntByResult& first) - { - m_intOrDouble.insert(m_intOrDouble.end(), first.m_intOrDouble.begin(), first.m_intOrDouble.end()); - } - void insert(const RDOFUNDoubleToIntByResult& first, const RDOFUNDoubleToIntByResult& pSecond) - { - m_intOrDouble.insert(m_intOrDouble.end(), first.m_intOrDouble.begin(), first.m_intOrDouble.end()); - m_intOrDouble.insert(m_intOrDouble.end(), pSecond.m_intOrDouble.begin(), pSecond.m_intOrDouble.end()); - } + void roundCalc(); + void push_back(const rdo::runtime::LPRDOCalcDoubleToIntByResult& pCalc) + { + m_intOrDouble.push_back(pCalc); + } + void insert(const RDOFUNDoubleToIntByResult& first) + { + m_intOrDouble.insert(m_intOrDouble.end(), first.m_intOrDouble.begin(), first.m_intOrDouble.end()); + } + void insert(const RDOFUNDoubleToIntByResult& first, const RDOFUNDoubleToIntByResult& pSecond) + { + m_intOrDouble.insert(m_intOrDouble.end(), first.m_intOrDouble.begin(), first.m_intOrDouble.end()); + m_intOrDouble.insert(m_intOrDouble.end(), pSecond.m_intOrDouble.begin(), pSecond.m_intOrDouble.end()); + } private: - typedef std::vector CalcList; + typedef std::vector CalcList; - CalcList m_intOrDouble; + CalcList m_intOrDouble; }; // -------------------------------------------------------------------------------- @@ -57,31 +56,31 @@ PREDECLARE_POINTER(RDOFUNArithm); PREDECLARE_POINTER(RDOFUNLogic); class RDOFUNLogic - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOFUNLogic); friend class RDOFUNArithm; public: - rdo::runtime::LPRDOCalc getCalc(rdo::runtime::RDOType::TypeID id = rdo::runtime::RDOType::t_real); + rdo::runtime::LPRDOCalc getCalc(rdo::runtime::RDOType::Type id = rdo::runtime::RDOType::Type::REAL); - LPRDOFUNLogic operator && (const LPRDOFUNLogic& pSecond); - LPRDOFUNLogic operator || (const LPRDOFUNLogic& pSecond); - LPRDOFUNLogic operator_not(); + LPRDOFUNLogic operator && (const LPRDOFUNLogic& pSecond); + LPRDOFUNLogic operator || (const LPRDOFUNLogic& pSecond); + LPRDOFUNLogic operator_not(); - virtual void setSrcInfo(const RDOParserSrcInfo& src_info); - virtual void setSrcPos (const RDOSrcInfo::Position& position); - virtual void setSrcText(const std::string& value); - void setSrcPos (const YYLTYPE& error_pos); - void setSrcPos (const YYLTYPE& pos_begin, const YYLTYPE& pos_end); + virtual void setSrcInfo(const RDOParserSrcInfo& src_info); + virtual void setSrcPos (const RDOSrcInfo::Position& position); + virtual void setSrcText(const std::string& value); + void setSrcPos (const YYLTYPE& error_pos); + void setSrcPos (const YYLTYPE& pos_begin, const YYLTYPE& pos_end); private: - RDOFUNLogic(const LPRDOFUNArithm& pArithm); - RDOFUNLogic(const rdo::runtime::LPRDOCalc& pCalc, bool hideWarning); - virtual ~RDOFUNLogic(); + RDOFUNLogic(const LPRDOFUNArithm& pArithm); + RDOFUNLogic(const rdo::runtime::LPRDOCalc& pCalc, bool hideWarning); + virtual ~RDOFUNLogic(); - rdo::runtime::LPRDOCalc m_pCalc; - RDOFUNDoubleToIntByResult m_intOrDouble; + rdo::runtime::LPRDOCalc m_pCalc; + RDOFUNDoubleToIntByResult m_intOrDouble; }; // -------------------------------------------------------------------------------- @@ -89,59 +88,59 @@ friend class RDOFUNArithm; // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOFUNArithm); class RDOFUNArithm - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOFUNArithm); public: - LPRDOFUNArithm operator +(const LPRDOFUNArithm& pSecond); - LPRDOFUNArithm operator -(const LPRDOFUNArithm& pSecond); - LPRDOFUNArithm operator *(const LPRDOFUNArithm& pSecond); - LPRDOFUNArithm operator /(const LPRDOFUNArithm& pSecond); - - LPRDOFUNLogic operator ==(const LPRDOFUNArithm& pSecond); - LPRDOFUNLogic operator !=(const LPRDOFUNArithm& pSecond); - LPRDOFUNLogic operator < (const LPRDOFUNArithm& pSecond); - LPRDOFUNLogic operator > (const LPRDOFUNArithm& pSecond); - LPRDOFUNLogic operator <=(const LPRDOFUNArithm& pSecond); - LPRDOFUNLogic operator >=(const LPRDOFUNArithm& pSecond); - - rdo::runtime::LPRDOCalc createCalc(const LPRDOTypeParam& pForType = NULL); - rdo::runtime::LPRDOCalc calc () const { return m_pCalc; } - const LPRDOValue& value () const { return m_pValue; } - LPRDOType type () const { return m_pValue->type(); } - LPRDOEnumType enumType () const { return type().object_static_cast(); } - rdo::runtime::RDOType::TypeID typeID () const { return type()->type()->typeID(); } - - virtual void setSrcInfo(const RDOParserSrcInfo& src_info); - virtual void setSrcPos (const RDOSrcInfo::Position& position); - virtual void setSrcText(const std::string& value); - void setSrcInfo(const RDOParserSrcInfo& begin, const std::string& delim, const RDOParserSrcInfo& end); - void setSrcPos (const YYLTYPE& error_pos); - void setSrcPos (const YYLTYPE& pos_begin, const YYLTYPE& pos_end); - - void checkParamType(const LPRDOTypeParam& pType); + LPRDOFUNArithm operator +(const LPRDOFUNArithm& pSecond); + LPRDOFUNArithm operator -(const LPRDOFUNArithm& pSecond); + LPRDOFUNArithm operator *(const LPRDOFUNArithm& pSecond); + LPRDOFUNArithm operator /(const LPRDOFUNArithm& pSecond); + + LPRDOFUNLogic operator ==(const LPRDOFUNArithm& pSecond); + LPRDOFUNLogic operator !=(const LPRDOFUNArithm& pSecond); + LPRDOFUNLogic operator < (const LPRDOFUNArithm& pSecond); + LPRDOFUNLogic operator > (const LPRDOFUNArithm& pSecond); + LPRDOFUNLogic operator <=(const LPRDOFUNArithm& pSecond); + LPRDOFUNLogic operator >=(const LPRDOFUNArithm& pSecond); + + rdo::runtime::LPRDOCalc createCalc(const LPRDOTypeParam& pForType = NULL); + rdo::runtime::LPRDOCalc calc () const { return m_pCalc; } + const LPRDOValue& value () const { return m_pValue; } + LPRDOType type () const { return m_pValue->type(); } + LPRDOEnumType enumType () const { return type().object_static_cast(); } + rdo::runtime::RDOType::Type typeID () const { return type()->type()->typeID(); } + + virtual void setSrcInfo(const RDOParserSrcInfo& src_info); + virtual void setSrcPos (const RDOSrcInfo::Position& position); + virtual void setSrcText(const std::string& value); + void setSrcInfo(const RDOParserSrcInfo& begin, const std::string& delim, const RDOParserSrcInfo& end); + void setSrcPos (const YYLTYPE& error_pos); + void setSrcPos (const YYLTYPE& pos_begin, const YYLTYPE& pos_end); + + void checkParamType(const LPRDOTypeParam& pType); private: - RDOFUNArithm(const LPRDOValue& pValue); - RDOFUNArithm(const LPRDOValue& pValue, const rdo::runtime::LPRDOCalc& pCalc); - RDOFUNArithm(const LPRDOValue& pResName, const LPRDOValue& pParName); - virtual ~RDOFUNArithm(); - - LPRDOValue m_pValue; - rdo::runtime::LPRDOCalc m_pCalc; - RDOFUNDoubleToIntByResult m_intOrDouble; - - void init(const LPRDOValue& pValue); - void init(const LPRDOValue& pResName, const LPRDOValue& pParName); - - enum CastResult - { - CR_DONE, - CR_CONTINUE - }; - CastResult beforeCastValue(LPRDOFUNArithm pSecond); - LPRDOType getPreType (const LPRDOFUNArithm& pSecond); + RDOFUNArithm(const LPRDOValue& pValue); + RDOFUNArithm(const LPRDOValue& pValue, const rdo::runtime::LPRDOCalc& pCalc); + RDOFUNArithm(const LPRDOValue& pResName, const LPRDOValue& pParName); + virtual ~RDOFUNArithm(); + + LPRDOValue m_pValue; + rdo::runtime::LPRDOCalc m_pCalc; + RDOFUNDoubleToIntByResult m_intOrDouble; + + void init(const LPRDOValue& pValue); + void init(const LPRDOValue& pResName, const LPRDOValue& pParName); + + enum class CastResult + { + DONE, + CONTINUE + }; + CastResult beforeCastValue(LPRDOFUNArithm pSecond); + LPRDOType getPreType (const LPRDOFUNArithm& pSecond); }; // -------------------------------------------------------------------------------- @@ -151,13 +150,13 @@ class RDOFUNConstant: public RDOParam { DECLARE_FACTORY(RDOFUNConstant); public: - int getNumber() const { return m_number; } + int getNumber() const { return m_number; } private: - RDOFUNConstant(const RDOParserSrcInfo& src_info, const LPRDOTypeParam& pType, const LPRDOValue& pDefault); - virtual ~RDOFUNConstant(); + RDOFUNConstant(const RDOParserSrcInfo& src_info, const LPRDOTypeParam& pType, const LPRDOValue& pDefault); + virtual ~RDOFUNConstant(); - int m_number; + int m_number; }; DECLARE_POINTER(RDOFUNConstant); @@ -168,27 +167,27 @@ DECLARE_POINTER(RDOFUNConstant); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOFUNParams); class RDOFUNParams - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOFUNParams); public: - typedef std::vector ParamList; + typedef std::vector ParamList; - RDOParserSrcInfo& getFunseqName() { return m_funseqName; } - const ParamList& getParamList() const { return m_paramList ; } - rdo::runtime::LPRDOCalc getCalc(std::size_t paramID, const LPRDOTypeParam& pType); + RDOParserSrcInfo& getFunseqName() { return m_funseqName; } + const ParamList& getParamList() const { return m_paramList ; } + rdo::runtime::LPRDOCalc getCalc(std::size_t paramID, const LPRDOTypeParam& pType); - void addParameter(const LPRDOFUNArithm& pParam); - LPRDOFUNArithm createCall(const std::string& funName); - LPRDOFUNArithm createSeqCall(const std::string& seqName); + void addParameter(const LPRDOFUNArithm& pParam); + LPRDOFUNArithm createCall(const std::string& funName); + LPRDOFUNArithm createSeqCall(const std::string& seqName); private: - RDOFUNParams(); - virtual ~RDOFUNParams(); + RDOFUNParams(); + virtual ~RDOFUNParams(); - RDOParserSrcInfo m_funseqName; - ParamList m_paramList; + RDOParserSrcInfo m_funseqName; + ParamList m_paramList; }; // -------------------------------------------------------------------------------- @@ -198,48 +197,48 @@ DECLARE_FACTORY(RDOFUNParams); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOFUNSequence); class RDOFUNSequence - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOFUNSequence); public: - PREDECLARE_POINTER(RDOFUNSequenceHeader); - class RDOFUNSequenceHeader - : public rdo::counter_reference - , public RDOParserSrcInfo - { - DECLARE_FACTORY(RDOFUNSequenceHeader); - public: - const LPRDOTypeParam& getType() const { return m_pType; } - - private: - RDOFUNSequenceHeader(const LPRDOTypeParam& pType, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_pType (pType ) - {} - - LPRDOTypeParam m_pType; - }; - - const std::string& name() const { return m_pHeader->src_text(); } - const LPRDOFUNSequenceHeader& getHeader() const { return m_pHeader; } - rdo::runtime::LPRDOCalcSeqInit& getInitCalc() { return m_pInitCalc; } - rdo::runtime::LPRDOCalcSeqNext& getNextCalc() { return m_pNextCalc; } - - virtual void createCalcs () = 0; - virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& src_info) const = 0; + PREDECLARE_POINTER(RDOFUNSequenceHeader); + class RDOFUNSequenceHeader + : public rdo::counter_reference + , public RDOParserSrcInfo + { + DECLARE_FACTORY(RDOFUNSequenceHeader); + public: + const LPRDOTypeParam& getType() const { return m_pType; } + + private: + RDOFUNSequenceHeader(const LPRDOTypeParam& pType, const RDOParserSrcInfo& src_info) + : RDOParserSrcInfo(src_info) + , m_pType (pType ) + {} + + LPRDOTypeParam m_pType; + }; + + const std::string& name() const { return m_pHeader->src_text(); } + const LPRDOFUNSequenceHeader& getHeader() const { return m_pHeader; } + rdo::runtime::LPRDOCalcSeqInit& getInitCalc() { return m_pInitCalc; } + rdo::runtime::LPRDOCalcSeqNext& getNextCalc() { return m_pNextCalc; } + + virtual void createCalcs () = 0; + virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& src_info) const = 0; protected: - RDOFUNSequence(const LPRDOFUNSequenceHeader& pHeader, int seed); - virtual ~RDOFUNSequence(); + RDOFUNSequence(const LPRDOFUNSequenceHeader& pHeader, int seed); + virtual ~RDOFUNSequence(); - LPRDOFUNSequenceHeader m_pHeader; - int m_seed; - rdo::runtime::LPRDOCalcSeqInit m_pInitCalc; - rdo::runtime::LPRDOCalcSeqNext m_pNextCalc; + LPRDOFUNSequenceHeader m_pHeader; + int m_seed; + rdo::runtime::LPRDOCalcSeqInit m_pInitCalc; + rdo::runtime::LPRDOCalcSeqNext m_pNextCalc; - void initResult (); - void initCalcSrcInfo(); + void initResult (); + void initCalcSrcInfo(); }; // -------------------------------------------------------------------------------- @@ -251,10 +250,10 @@ class RDOFUNSequenceUniform: public RDOFUNSequence { DECLARE_FACTORY(RDOFUNSequenceUniform); private: - RDOFUNSequenceUniform(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); + RDOFUNSequenceUniform(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); - virtual void createCalcs (); - virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seq_src_info) const; + virtual void createCalcs (); + virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seq_src_info) const; }; // -------------------------------------------------------------------------------- @@ -264,10 +263,10 @@ class RDOFUNSequenceExponential: public RDOFUNSequence { DECLARE_FACTORY(RDOFUNSequenceExponential); private: - RDOFUNSequenceExponential(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); + RDOFUNSequenceExponential(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); - virtual void createCalcs (); - virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seq_src_info) const; + virtual void createCalcs (); + virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seq_src_info) const; }; // -------------------------------------------------------------------------------- @@ -277,10 +276,10 @@ class RDOFUNSequenceNormal: public RDOFUNSequence { DECLARE_FACTORY(RDOFUNSequenceNormal); private: - RDOFUNSequenceNormal(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); + RDOFUNSequenceNormal(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); - virtual void createCalcs (); - virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seq_src_info) const; + virtual void createCalcs (); + virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seq_src_info) const; }; // -------------------------------------------------------------------------------- @@ -291,32 +290,32 @@ DECLARE_FACTORY(RDOFUNSequenceNormal); class RDOFUNSequenceByHist: public RDOFUNSequence { public: - PREDECLARE_POINTER(RDOFUNSequenceByHistHeader); - class RDOFUNSequenceByHistHeader - : public rdo::counter_reference - , public RDOParserSrcInfo - { - DECLARE_FACTORY(RDOFUNSequenceByHistHeader); - public: - const RDOFUNSequence::LPRDOFUNSequenceHeader& getHeader() const { return m_pHeader; } - int getSeed () const { return m_seed; } - - private: - RDOFUNSequenceByHistHeader(const RDOFUNSequence::LPRDOFUNSequenceHeader& pHeader, int seed = 123456789) - : RDOParserSrcInfo(pHeader->src_info()) - , m_pHeader (pHeader ) - , m_seed (seed ) - {} - - RDOFUNSequence::LPRDOFUNSequenceHeader m_pHeader; - int m_seed; - }; + PREDECLARE_POINTER(RDOFUNSequenceByHistHeader); + class RDOFUNSequenceByHistHeader + : public rdo::counter_reference + , public RDOParserSrcInfo + { + DECLARE_FACTORY(RDOFUNSequenceByHistHeader); + public: + const RDOFUNSequence::LPRDOFUNSequenceHeader& getHeader() const { return m_pHeader; } + int getSeed () const { return m_seed; } + + private: + RDOFUNSequenceByHistHeader(const RDOFUNSequence::LPRDOFUNSequenceHeader& pHeader, int seed = 123456789) + : RDOParserSrcInfo(pHeader->src_info()) + , m_pHeader (pHeader ) + , m_seed (seed ) + {} + + RDOFUNSequence::LPRDOFUNSequenceHeader m_pHeader; + int m_seed; + }; protected: - RDOFUNSequenceByHist(const LPRDOFUNSequenceByHistHeader& pHeader); + RDOFUNSequenceByHist(const LPRDOFUNSequenceByHistHeader& pHeader); private: - virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& src_info) const; + virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& src_info) const; }; // -------------------------------------------------------------------------------- @@ -326,17 +325,17 @@ class RDOFUNSequenceByHistReal: public RDOFUNSequenceByHist { DECLARE_FACTORY(RDOFUNSequenceByHistReal); public: - typedef std::vector ValueList; + typedef std::vector ValueList; - void addReal(const LPRDOValue& pFrom, const LPRDOValue& pTo, const LPRDOValue& pFreq); + void addReal(const LPRDOValue& pFrom, const LPRDOValue& pTo, const LPRDOValue& pFreq); private: - RDOFUNSequenceByHistReal(const LPRDOFUNSequenceByHistHeader& pHeader, const LPRDOValue& pFrom, const LPRDOValue& pTo, const LPRDOValue& pFreq); - virtual void createCalcs(); + RDOFUNSequenceByHistReal(const LPRDOFUNSequenceByHistHeader& pHeader, const LPRDOValue& pFrom, const LPRDOValue& pTo, const LPRDOValue& pFreq); + virtual void createCalcs(); - ValueList m_from; - ValueList m_to; - ValueList m_freq; + ValueList m_from; + ValueList m_to; + ValueList m_freq; }; DECLARE_POINTER(RDOFUNSequenceByHistReal); @@ -347,16 +346,16 @@ class RDOFUNSequenceByHistEnum: public RDOFUNSequenceByHist { DECLARE_FACTORY(RDOFUNSequenceByHistEnum); public: - typedef std::vector ValueList; + typedef std::vector ValueList; - void addEnum(const LPRDOValue& pValue, const LPRDOValue& pFreq); + void addEnum(const LPRDOValue& pValue, const LPRDOValue& pFreq); private: - RDOFUNSequenceByHistEnum(const LPRDOFUNSequenceByHistHeader& pHeader, const LPRDOValue& pValue, const LPRDOValue& pFreq); - virtual void createCalcs(); + RDOFUNSequenceByHistEnum(const LPRDOFUNSequenceByHistHeader& pHeader, const LPRDOValue& pValue, const LPRDOValue& pFreq); + virtual void createCalcs(); - ValueList m_values; - ValueList m_freq; + ValueList m_values; + ValueList m_freq; }; DECLARE_POINTER(RDOFUNSequenceByHistEnum); @@ -369,25 +368,25 @@ class RDOFUNSequenceEnumerative: public RDOFUNSequence { DECLARE_FACTORY(RDOFUNSequenceEnumerative); public: - void addValue(const LPRDOValue& pValue) - { - m_valueList.push_back(m_pHeader->getType()->value_cast(pValue)); - } + void addValue(const LPRDOValue& pValue) + { + m_valueList.push_back(m_pHeader->getType()->value_cast(pValue)); + } private: - RDOFUNSequenceEnumerative(const LPRDOFUNSequenceHeader& pHeader, const LPRDOValue& pValue) - : RDOFUNSequence(pHeader, 0) - { - addValue(pValue); - } - virtual ~RDOFUNSequenceEnumerative() - {} - - typedef std::vector ValueList; - ValueList m_valueList; - - virtual void createCalcs (); - virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& src_info) const; + RDOFUNSequenceEnumerative(const LPRDOFUNSequenceHeader& pHeader, const LPRDOValue& pValue) + : RDOFUNSequence(pHeader, 0) + { + addValue(pValue); + } + virtual ~RDOFUNSequenceEnumerative() + {} + + typedef std::vector ValueList; + ValueList m_valueList; + + virtual void createCalcs (); + virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& src_info) const; }; DECLARE_POINTER(RDOFUNSequenceEnumerative); @@ -400,18 +399,18 @@ DECLARE_POINTER(RDOFUNSequenceEnumerative); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOFUNFunctionListElement); class RDOFUNFunctionListElement - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOFUNFunctionListElement) public: - virtual rdo::runtime::LPRDOCalcIsEqual createIsEqualCalc(const LPRDOTypeParam& pRetType, const rdo::runtime::LPRDOCalcFuncParam& pFuncParam, const RDOParserSrcInfo& src_pos) const; - virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPRDOTypeParam& pRetType, const RDOParserSrcInfo& src_pos) const = 0; - virtual bool isEquivalence() const { return false; } + virtual rdo::runtime::LPRDOCalcIsEqual createIsEqualCalc(const LPRDOTypeParam& pRetType, const rdo::runtime::LPRDOCalcFuncParam& pFuncParam, const RDOParserSrcInfo& src_pos) const; + virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPRDOTypeParam& pRetType, const RDOParserSrcInfo& src_pos) const = 0; + virtual bool isEquivalence() const { return false; } protected: - RDOFUNFunctionListElement(const RDOParserSrcInfo& src_info); - virtual ~RDOFUNFunctionListElement(); + RDOFUNFunctionListElement(const RDOParserSrcInfo& src_info); + virtual ~RDOFUNFunctionListElement(); }; // -------------------------------------------------------------------------------- @@ -421,9 +420,9 @@ class RDOFUNFunctionListElementIdentif: public RDOFUNFunctionListElement { DECLARE_FACTORY(RDOFUNFunctionListElementIdentif) private: - RDOFUNFunctionListElementIdentif(const RDOParserSrcInfo& src_info); + RDOFUNFunctionListElementIdentif(const RDOParserSrcInfo& src_info); - virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPRDOTypeParam& pRetType, const RDOParserSrcInfo& src_pos) const; + virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPRDOTypeParam& pRetType, const RDOParserSrcInfo& src_pos) const; }; DECLARE_POINTER(RDOFUNFunctionListElementIdentif); @@ -434,13 +433,13 @@ class RDOFUNFunctionListElementReal: public RDOFUNFunctionListElement { DECLARE_FACTORY(RDOFUNFunctionListElementReal) public: - double getValue() const { return m_value; } + double getValue() const { return m_value; } private: - RDOFUNFunctionListElementReal(const YYLTYPE& position, double value); - virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPRDOTypeParam& pRetType, const RDOParserSrcInfo& src_pos) const; + RDOFUNFunctionListElementReal(const YYLTYPE& position, double value); + virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPRDOTypeParam& pRetType, const RDOParserSrcInfo& src_pos) const; - double m_value; + double m_value; }; DECLARE_POINTER(RDOFUNFunctionListElementReal); @@ -451,13 +450,13 @@ class RDOFUNFunctionListElementInt: public RDOFUNFunctionListElement { DECLARE_FACTORY(RDOFUNFunctionListElementInt) public: - int getValue() const { return m_value; } + int getValue() const { return m_value; } private: - RDOFUNFunctionListElementInt(const YYLTYPE& position, int value); - virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPRDOTypeParam& pRetType, const RDOParserSrcInfo& src_pos) const; + RDOFUNFunctionListElementInt(const YYLTYPE& position, int value); + virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPRDOTypeParam& pRetType, const RDOParserSrcInfo& src_pos) const; - int m_value; + int m_value; }; DECLARE_POINTER(RDOFUNFunctionListElementInt); @@ -468,10 +467,10 @@ class RDOFUNFunctionListElementEq: public RDOFUNFunctionListElement { DECLARE_FACTORY(RDOFUNFunctionListElementEq) private: - RDOFUNFunctionListElementEq(const YYLTYPE& position); + RDOFUNFunctionListElementEq(const YYLTYPE& position); - virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPRDOTypeParam& pRetType, const RDOParserSrcInfo& src_pos) const; - virtual bool isEquivalence() const { return true; } + virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPRDOTypeParam& pRetType, const RDOParserSrcInfo& src_pos) const; + virtual bool isEquivalence() const { return true; } }; DECLARE_POINTER(RDOFUNFunctionListElementEq); @@ -480,20 +479,20 @@ DECLARE_POINTER(RDOFUNFunctionListElementEq); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOFUNCalculateIf); class RDOFUNCalculateIf - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOFUNCalculateIf) public: - LPRDOFUNLogic& getCondition() { return m_pCondition; } - LPRDOFUNArithm& getAction () { return m_pAction; } + LPRDOFUNLogic& getCondition() { return m_pCondition; } + LPRDOFUNArithm& getAction () { return m_pAction; } private: - RDOFUNCalculateIf(const LPRDOFUNLogic& pCondition, const LPRDOFUNArithm& pAction); - virtual ~RDOFUNCalculateIf(); + RDOFUNCalculateIf(const LPRDOFUNLogic& pCondition, const LPRDOFUNArithm& pAction); + virtual ~RDOFUNCalculateIf(); - LPRDOFUNLogic m_pCondition; - LPRDOFUNArithm m_pAction; + LPRDOFUNLogic m_pCondition; + LPRDOFUNArithm m_pAction; }; // -------------------------------------------------------------------------------- @@ -501,53 +500,53 @@ DECLARE_FACTORY(RDOFUNCalculateIf) // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOFUNFunction); class RDOFUNFunction - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOFUNFunction) friend class Converter; public: - typedef std::vector ParamList; + typedef std::vector ParamList; - void add(const LPRDOParam& pParam); - void add(const LPRDOFUNFunctionListElement& pListElement); - void add(const LPRDOFUNCalculateIf& pCalculateIf); + void add(const LPRDOParam& pParam); + void add(const LPRDOFUNFunctionListElement& pListElement); + void add(const LPRDOFUNCalculateIf& pCalculateIf); - LPRDOParam findFUNFunctionParam(const std::string& paramName) const; - int findFUNFunctionParamNum(const std::string& paramName) const; + LPRDOParam findFUNFunctionParam(const std::string& paramName) const; + int findFUNFunctionParamNum(const std::string& paramName) const; - void createListCalc(); - void createTableCalc(const YYLTYPE& elements_pos); - void createAlgorithmicCalc(const RDOParserSrcInfo& body_src_info); + void createListCalc(); + void createTableCalc(const YYLTYPE& elements_pos); + void createAlgorithmicCalc(const RDOParserSrcInfo& body_src_info); - const std::string& name() const { return src_info().src_text(); } - const LPRDOParam& getReturn() const { return m_pReturn; } - const ParamList getParams() const { return m_paramList; } + const std::string& name() const { return src_info().src_text(); } + const LPRDOParam& getReturn() const { return m_pReturn; } + const ParamList getParams() const { return m_paramList; } - void setFunctionCalc(const rdo::runtime::LPRDOFunCalc& pCalc); - rdo::runtime::LPRDOFunCalc getFunctionCalc() const { return m_pFunctionCalc; } + void setFunctionCalc(const rdo::runtime::LPRDOFunCalc& pCalc); + rdo::runtime::LPRDOFunCalc getFunctionCalc() const { return m_pFunctionCalc; } - void insertPostLinked(const rdo::runtime::LPRDOCalcFunctionCaller& pCalc) - { - ASSERT(pCalc); - m_postLinkedList.push_back(pCalc); - } + void insertPostLinked(const rdo::runtime::LPRDOCalcFunctionCaller& pCalc) + { + ASSERT(pCalc); + m_postLinkedList.push_back(pCalc); + } private: - RDOFUNFunction(const RDOParserSrcInfo& src_info, const LPRDOParam& pReturn); - RDOFUNFunction(const std::string& name, const LPRDOParam& pReturn); - virtual ~RDOFUNFunction(); - - typedef std::vector ElementList; - typedef std::vector CalculateIfList; - typedef std::vector PostLinkedList; - - LPRDOParam m_pReturn; - ParamList m_paramList; - ElementList m_elementList; //! for list and table - CalculateIfList m_calculateIfList; //! for algorithmic - PostLinkedList m_postLinkedList; //! для рекурсивного вызова - rdo::runtime::LPRDOFunCalc m_pFunctionCalc; + RDOFUNFunction(const RDOParserSrcInfo& src_info, const LPRDOParam& pReturn); + RDOFUNFunction(const std::string& name, const LPRDOParam& pReturn); + virtual ~RDOFUNFunction(); + + typedef std::vector ElementList; + typedef std::vector CalculateIfList; + typedef std::vector PostLinkedList; + + LPRDOParam m_pReturn; + ParamList m_paramList; + ElementList m_elementList; // for list and table + CalculateIfList m_calculateIfList; // for algorithmic + PostLinkedList m_postLinkedList; // для рекурсивного вызова + rdo::runtime::LPRDOFunCalc m_pFunctionCalc; }; // -------------------------------------------------------------------------------- @@ -557,47 +556,47 @@ friend class Converter; // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOFUNGroup); class RDOFUNGroup - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOFUNGroup); public: - const LPRDORTPResType& getResType()const { return m_pResType; } + const LPRDORTPResType& getResType()const { return m_pResType; } protected: - RDOFUNGroup(const RDOParserSrcInfo& res_info); - virtual ~RDOFUNGroup(); + RDOFUNGroup(const RDOParserSrcInfo& res_info); + virtual ~RDOFUNGroup(); private: - void init(const RDOParserSrcInfo& res_info); + void init(const RDOParserSrcInfo& res_info); - LPRDORTPResType m_pResType; + LPRDORTPResType m_pResType; }; // -------------------------------------------------------------------------------- // -------------------- RDOFUNGroupLogic // -------------------------------------------------------------------------------- class RDOFUNGroupLogic - : public RDOFUNGroup - , public boost::noncopyable + : public RDOFUNGroup + , private boost::noncopyable { DECLARE_FACTORY(RDOFUNGroupLogic) public: - enum FunGroupType - { - fgt_unknow = 0, - fgt_exist = 1, - fgt_notexist = 2, - fgt_forall = 3, - fgt_notforall = 4 - }; + enum class Type + { + UNKNOW = 0, + EXIST = 1, + NOTEXIST = 2, + FORALL = 3, + NOTFORALL = 4 + }; - LPRDOFUNLogic createFunLogic(LPRDOFUNLogic& pCondition); + LPRDOFUNLogic createFunLogic(LPRDOFUNLogic& pCondition); private: - RDOFUNGroupLogic(FunGroupType funType, const RDOParserSrcInfo& res_info); + RDOFUNGroupLogic(Type type, const RDOParserSrcInfo& res_info); - const int m_funType; + const Type m_funType; }; DECLARE_POINTER(RDOFUNGroupLogic); @@ -608,18 +607,16 @@ class RDOFUNSelect: public RDOFUNGroup { DECLARE_FACTORY(RDOFUNSelect) public: - void initSelect (LPRDOFUNLogic pCondition = NULL); - LPRDOFUNLogic createFunSelectGroup(RDOFUNGroupLogic::FunGroupType funType, LPRDOFUNLogic& pCondition); - LPRDOFUNLogic createFunSelectEmpty(const RDOParserSrcInfo& empty_info); - LPRDOFUNArithm createFunSelectSize (const RDOParserSrcInfo& size_info ); + void initSelect (LPRDOFUNLogic pCondition = NULL); + LPRDOFUNLogic createFunSelectGroup(RDOFUNGroupLogic::Type funType, LPRDOFUNLogic& pCondition); + LPRDOFUNLogic createFunSelectEmpty(const RDOParserSrcInfo& empty_info); + LPRDOFUNArithm createFunSelectSize (const RDOParserSrcInfo& size_info ); private: - RDOFUNSelect(const RDOParserSrcInfo& res_info); + RDOFUNSelect(const RDOParserSrcInfo& res_info); - rdo::runtime::LPRDOFunCalcSelect m_pCalcSelect; + rdo::runtime::LPRDOFunCalcSelect m_pCalcSelect; }; DECLARE_POINTER(RDOFUNSelect); CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOFUN_H_ diff --git a/converter/smr2rdox/rdoopr.cpp b/converter/smr2rdox/rdoopr.cpp index 17ef4cbef..334fd78d4 100644 --- a/converter/smr2rdox/rdoopr.cpp +++ b/converter/smr2rdox/rdoopr.cpp @@ -12,9 +12,9 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE int cnv_oprlex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void cnv_oprerror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -24,18 +24,18 @@ void cnv_oprerror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) // -------------------- RDOOPROperation // -------------------------------------------------------------------------------- RDOOPROperation::RDOOPROperation(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info) - : RDODPTActivityHotKey(pDPT, src_info, pattern_src_info) + : RDODPTActivityHotKey(pDPT, src_info, pattern_src_info) { - Converter::s_converter()->insertOPROperation(this); + Converter::s_converter()->insertOPROperation(this); } // -------------------------------------------------------------------------------- // -------------------- RDOOperations // -------------------------------------------------------------------------------- RDOOperations::RDOOperations(const RDOParserSrcInfo& src_info) - : RDOLogicActivity(src_info) + : RDOLogicActivity(src_info) { - Converter::s_converter()->insertOperations(this); + Converter::s_converter()->insertOperations(this); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdoopr.h b/converter/smr2rdox/rdoopr.h index 4209a60ee..d13a186a6 100644 --- a/converter/smr2rdox/rdoopr.h +++ b/converter/smr2rdox/rdoopr.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOOPR_H_ -#define _CONVERTOR_RDOOPR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -23,7 +22,7 @@ class RDOOPROperation: public RDODPTActivityHotKey { DECLARE_FACTORY(RDOOPROperation); private: - RDOOPROperation(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); + RDOOPROperation(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); }; DECLARE_POINTER(RDOOPROperation); @@ -32,14 +31,12 @@ DECLARE_POINTER(RDOOPROperation); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOOperations); class RDOOperations - : public rdo::counter_reference - , public RDOLogicActivity + : public rdo::counter_reference + , public RDOLogicActivity { DECLARE_FACTORY(RDOOperations); private: - RDOOperations(const RDOParserSrcInfo& src_info); + RDOOperations(const RDOParserSrcInfo& src_info); }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOOPR_H_ diff --git a/converter/smr2rdox/rdoparser.cpp b/converter/smr2rdox/rdoparser.cpp index 5fe963af0..1f3486e53 100644 --- a/converter/smr2rdox/rdoparser.cpp +++ b/converter/smr2rdox/rdoparser.cpp @@ -30,24 +30,24 @@ Converter::ParserList Converter::s_parserStack; #define DECLARE_PARSER_OBJECT_CONTAINER_NONAME(NAME) \ void Converter::insert##NAME(LPRDO##NAME value) \ { \ - howIsIt(); \ - m_all##NAME.push_back(value); \ + howIsIt(); \ + m_all##NAME.push_back(value); \ } #define DECLARE_PARSER_OBJECT_CONTAINER(NAME) \ DECLARE_PARSER_OBJECT_CONTAINER_NONAME(NAME) \ const LPRDO##NAME Converter::find##NAME(const std::string& name) const \ { \ - NAME##List::const_iterator it = std::find_if(m_all##NAME.begin(), m_all##NAME.end(), compareName(name)); \ - return it != m_all##NAME.end() ? *it : LPRDO##NAME(NULL); \ + NAME##List::const_iterator it = std::find_if(m_all##NAME.begin(), m_all##NAME.end(), compareName(name)); \ + return it != m_all##NAME.end() ? *it : LPRDO##NAME(NULL); \ } \ bool Converter::remove##NAME(const LPRDO##NAME item) \ { \ - NAME##List::iterator it = std::find(m_all##NAME.begin(), m_all##NAME.end(), item); \ - if (it == m_all##NAME.end()) \ - return false; \ - m_all##NAME.erase(it); \ - return true; \ + NAME##List::iterator it = std::find(m_all##NAME.begin(), m_all##NAME.end(), item); \ + if (it == m_all##NAME.end()) \ + return false; \ + m_all##NAME.erase(it); \ + return true; \ } DECLARE_PARSER_OBJECT_CONTAINER(PATPattern ); @@ -69,181 +69,189 @@ DECLARE_PARSER_OBJECT_CONTAINER_NONAME(DPTFree ); DECLARE_PARSER_OBJECT_CONTAINER_NONAME(PROCProcess); DECLARE_PARSER_OBJECT_CONTAINER_NONAME(Operations ); -rdo::converter::smr2rdox::RDOFileTypeIn Converter::getFileToParse() +rdo::converter::smr2rdox::FileTypeIn Converter::getFileToParse() { - return !s_parserStack.empty() && s_parserStack.back()->m_pParserItem ? s_parserStack.back()->m_pParserItem->m_type : rdo::converter::smr2rdox::PAT_IN; + return !s_parserStack.empty() && s_parserStack.back()->m_pParserItem + ? s_parserStack.back()->m_pParserItem->m_type + : rdo::converter::smr2rdox::FileTypeIn::PAT; } std::size_t Converter::lexer_loc_line() { - return !s_parserStack.empty() && s_parserStack.back()->m_pParserItem ? s_parserStack.back()->m_pParserItem->lexer_loc_line() : ~0; + return !s_parserStack.empty() && s_parserStack.back()->m_pParserItem + ? s_parserStack.back()->m_pParserItem->lexer_loc_line() + : ~0; } std::size_t Converter::lexer_loc_pos() { - return !s_parserStack.empty() && s_parserStack.back()->m_pParserItem ? s_parserStack.back()->m_pParserItem->lexer_loc_pos() : 0; + return !s_parserStack.empty() && s_parserStack.back()->m_pParserItem + ? s_parserStack.back()->m_pParserItem->lexer_loc_pos() + : 0; } Converter* Converter::s_converter() { - return !s_parserStack.empty() ? s_parserStack.back() : NULL; + return !s_parserStack.empty() + ? s_parserStack.back() + : NULL; } Converter::Converter() - : m_pParserItem (NULL ) - , m_have_kw_Resources (false) - , m_have_kw_ResourcesEnd(false) - , m_pattern (false) + : m_pParserItem (NULL ) + , m_have_kw_Resources (false) + , m_have_kw_ResourcesEnd(false) + , m_pattern (false) { - s_parserStack.push_back(this); + s_parserStack.push_back(this); - m_pRuntime = rdo::Factory::create(new rdo::runtime::Error()); - ASSERT(m_pRuntime); - m_pRuntime->memory_insert(sizeof(Converter)); - m_pRuntime->init(); + m_pRuntime = rdo::Factory::create(new rdo::runtime::Error()); + ASSERT(m_pRuntime); + m_pRuntime->memory_insert(sizeof(Converter)); + m_pRuntime->init(); - m_pDocument = rdo::Factory::create(); - ASSERT(m_pDocument); + m_pDocument = rdo::Factory::create(); + ASSERT(m_pDocument); } Converter::~Converter() { - m_pRuntime->deinit(); - m_pRuntime = NULL; + m_pRuntime->deinit(); + m_pRuntime = NULL; - m_movementObjectList.clear(); - s_parserStack.remove(this); + m_movementObjectList.clear(); + s_parserStack.remove(this); } void Converter::insertDocUpdate(const LPDocUpdate& pDocUpdate) { - ASSERT(m_pParserItem); - if (m_pParserItem->m_parser_fun != cnv_smr_file_parse) - { - m_pDocument->insertUpdate(pDocUpdate); - } + ASSERT(m_pParserItem); + if (m_pParserItem->m_parser_fun != cnv_smr_file_parse) + { + m_pDocument->insertUpdate(pDocUpdate); + } } bool Converter::isCurrentDPTSearch() { - return getLastDPTSearch() && !getLastDPTSearch()->closed() ? true : false; + return getLastDPTSearch() && !getLastDPTSearch()->closed() ? true : false; } bool Converter::isCurrentDPTPrior() { - return getLastDPTPrior() ? true : false; + return getLastDPTPrior() ? true : false; } void Converter::insertChanges(const std::string& name, const std::string& value) { - m_changes.push_back(ChangesData(name, value)); + m_changes.push_back(ChangesData(name, value)); } std::string Converter::getChanges() const { - std::stringstream stream; - stream << "$Changes" << std::endl; - std::size_t changes_max_length = 0; - for (const auto& change: m_changes) - { - if (change.m_name.length() > changes_max_length) - { - changes_max_length = change.m_name.length(); - } - } - for (const auto& change: m_changes) - { - stream << " " << change.m_name; - for (std::size_t i = change.m_name.length(); i < changes_max_length; i++) - { - stream << " "; - } - stream << " = " << change.m_value << std::endl; - } - return stream.str(); + std::stringstream stream; + stream << "$Changes" << std::endl; + std::size_t changes_max_length = 0; + for (const auto& change: m_changes) + { + if (change.m_name.length() > changes_max_length) + { + changes_max_length = change.m_name.length(); + } + } + for (const auto& change: m_changes) + { + stream << " " << change.m_name; + for (std::size_t i = change.m_name.length(); i < changes_max_length; i++) + { + stream << " "; + } + stream << " = " << change.m_value << std::endl; + } + return stream.str(); } std::string Converter::getModelStructure() { - std::stringstream modelStructure; - - // $Changes - modelStructure << getChanges(); - - // RTP - modelStructure << std::endl << std::endl << "$Resource_type" << std::endl; - for (const auto& rtp: m_allRTPResType) - rtp->writeModelStructure(modelStructure); - - // RSS - modelStructure << std::endl << "$Resources" << std::endl; - for (const auto& rss: m_allRSSResource) - rss->writeModelStructure(modelStructure); - - // PAT - modelStructure << std::endl << "$Pattern" << std::endl; - for (const auto& pat: m_allPATPattern) - pat->writeModelStructure(modelStructure); - - // OPR/DPT - std::size_t counter = 1; - modelStructure << std::endl << "$Activities" << std::endl; - modelStructure << m_pRuntime->writeActivitiesStructure(counter); - - // DPT only - for (std::size_t i = 0; i < m_allDPTSearch.size(); i++) - { - for (std::size_t j = 0; j < m_allDPTSearch.at(i)->getActivities().size(); j++) - { - LPRDODPTSearchActivity pSearchActivity = m_allDPTSearch.at(i)->getActivities().at(j); - ASSERT(pSearchActivity); - modelStructure << counter++ << " " << pSearchActivity->name() << " " << pSearchActivity->pattern()->getPatternId() << std::endl; - } - } - - // PMD - modelStructure << std::endl << "$Watching" << std::endl; - std::size_t watching_max_length = 0; - for (const auto& watching: m_pRuntime->getResult()) - { - LPITrace trace = watching.object_dynamic_cast(); - LPIName name = trace.object_dynamic_cast(); - LPIModelStructure structure = trace.object_dynamic_cast(); - if (trace && name && structure) - { - if (trace->traceable() && name->name().length() > watching_max_length) - { - watching_max_length = name->name().length(); - } - } - } - for (const auto& watching: m_pRuntime->getResult()) - { - LPITrace trace = watching.object_dynamic_cast(); - LPIName name = trace.object_dynamic_cast(); - LPIModelStructure structure = trace.object_dynamic_cast(); - if (trace && name && structure) - { - if (trace->traceable()) - { - modelStructure << " " << name->name(); - for (std::size_t i = name->name().length(); i < watching_max_length + 2; i++) - modelStructure << " "; - - structure->writeModelStructure(modelStructure); - } - } - } - - return modelStructure.str(); + std::stringstream modelStructure; + + // $Changes + modelStructure << getChanges(); + + // RTP + modelStructure << std::endl << std::endl << "$Resource_type" << std::endl; + for (const auto& rtp: m_allRTPResType) + rtp->writeModelStructure(modelStructure); + + // RSS + modelStructure << std::endl << "$Resources" << std::endl; + for (const auto& rss: m_allRSSResource) + rss->writeModelStructure(modelStructure); + + // PAT + modelStructure << std::endl << "$Pattern" << std::endl; + for (const auto& pat: m_allPATPattern) + pat->writeModelStructure(modelStructure); + + // OPR/DPT + std::size_t counter = 1; + modelStructure << std::endl << "$Activities" << std::endl; + modelStructure << m_pRuntime->writeActivitiesStructure(counter); + + // DPT only + for (std::size_t i = 0; i < m_allDPTSearch.size(); i++) + { + for (std::size_t j = 0; j < m_allDPTSearch.at(i)->getActivities().size(); j++) + { + LPRDODPTSearchActivity pSearchActivity = m_allDPTSearch.at(i)->getActivities().at(j); + ASSERT(pSearchActivity); + modelStructure << counter++ << " " << pSearchActivity->name() << " " << pSearchActivity->pattern()->getPatternId() << std::endl; + } + } + + // PMD + modelStructure << std::endl << "$Watching" << std::endl; + std::size_t watching_max_length = 0; + for (const auto& watching: m_pRuntime->getResult()) + { + LPITrace trace = watching.object_dynamic_cast(); + LPIName name = trace.object_dynamic_cast(); + LPIModelStructure structure = trace.object_dynamic_cast(); + if (trace && name && structure) + { + if (trace->traceable() && name->name().length() > watching_max_length) + { + watching_max_length = name->name().length(); + } + } + } + for (const auto& watching: m_pRuntime->getResult()) + { + LPITrace trace = watching.object_dynamic_cast(); + LPIName name = trace.object_dynamic_cast(); + LPIModelStructure structure = trace.object_dynamic_cast(); + if (trace && name && structure) + { + if (trace->traceable()) + { + modelStructure << " " << name->name(); + for (std::size_t i = name->name().length(); i < watching_max_length + 2; i++) + modelStructure << " "; + + structure->writeModelStructure(modelStructure); + } + } + } + + return modelStructure.str(); } const RDOParserSMRInfo::FileList& RDOParserSMRInfo::getFileList() const { - return m_fileList; + return m_fileList; } -void RDOParserSMRInfo::insertFileName(rdo::converter::smr2rdox::RDOFileTypeIn type, +void RDOParserSMRInfo::insertFileName(rdo::converter::smr2rdox::FileTypeIn type, const boost::filesystem::path& modelPath, const boost::filesystem::path& modelName, const boost::filesystem::path& smrFileName, @@ -251,341 +259,337 @@ void RDOParserSMRInfo::insertFileName(rdo::converter::smr2rdox::RDOFileTypeIn ty const boost::filesystem::path& fileExt ) { - const boost::filesystem::path& fileName = !nameFromSMR.empty() ? nameFromSMR : (!modelName.empty() ? modelName : smrFileName); - if (fileName.empty()) - return; + const boost::filesystem::path& fileName = !nameFromSMR.empty() ? nameFromSMR : (!modelName.empty() ? modelName : smrFileName); + if (fileName.empty()) + return; - boost::filesystem::path fullFileName = modelPath / fileName; - fullFileName.replace_extension(fileExt); + boost::filesystem::path fullFileName = modelPath / fileName; + fullFileName.replace_extension(fileExt); - if (rdo::File::exist(fullFileName)) - { - m_fileList[type] = fullFileName; - } + if (rdo::File::exist(fullFileName)) + { + m_fileList[type] = fullFileName; + } } bool RDOParserSMRInfo::parseSMR(const boost::filesystem::path& smrFullFileName, boost::filesystem::path& modelName) { - boost::filesystem::ifstream stream(smrFullFileName); - if (!stream.is_open()) - return false; + boost::filesystem::ifstream stream(smrFullFileName); + if (!stream.is_open()) + return false; - RDOParserContainer::Iterator it = begin(); - ASSERT(it != end()); + RDOParserContainer::Iterator it = begin(); + ASSERT(it != end()); - m_pParserItem = it->second; - it->second->parse(this, stream); - m_pParserItem = NULL; + m_pParserItem = it->second; + it->second->parse(this, stream); + m_pParserItem = NULL; #ifdef _DEBUG - ++it; - ASSERT(it == end()); + ++it; + ASSERT(it == end()); #endif - if (!hasSMR()) - return false; - - boost::filesystem::path smrFilePath, smrFileName, smrFileExt; - if (!rdo::File::splitpath(smrFullFileName, smrFilePath, smrFileName, smrFileExt)) - return false; - - modelName = getSMR()->getFile("Model_name"); - - insertFileName(rdo::converter::smr2rdox::PAT_IN, smrFilePath, modelName, smrFileName, modelName, "pat"); - insertFileName(rdo::converter::smr2rdox::RTP_IN, smrFilePath, modelName, smrFileName, modelName, "rtp"); - insertFileName(rdo::converter::smr2rdox::RSS_IN, smrFilePath, modelName, smrFileName, getSMR()->getFile("Resource_file"), "rss"); - insertFileName(rdo::converter::smr2rdox::FRM_IN, smrFilePath, modelName, smrFileName, getSMR()->getFile("Frame_file" ), "frm"); - insertFileName(rdo::converter::smr2rdox::FUN_IN, smrFilePath, modelName, smrFileName, modelName, "fun"); - insertFileName(rdo::converter::smr2rdox::PMD_IN, smrFilePath, modelName, smrFileName, getSMR()->getFile("Statistic_file"), "pmd"); - insertFileName(rdo::converter::smr2rdox::SMR_IN, smrFilePath, modelName, smrFileName, smrFileName, "smr"); - insertFileName(rdo::converter::smr2rdox::PMV_IN, smrFilePath, modelName, smrFileName, getSMR()->getFile("Results_file" ), "pmv"); - insertFileName(rdo::converter::smr2rdox::TRC_IN, smrFilePath, modelName, smrFileName, getSMR()->getFile("Trace_file" ), "trc"); - - if (!getSMR()->getFile("OprIev_file").empty()) - { - insertFileName(rdo::converter::smr2rdox::OPR_IN, smrFilePath, modelName, smrFileName, getSMR()->getFile("OprIev_file" ), "opr"); - } - else - { - insertFileName(rdo::converter::smr2rdox::DPT_IN, smrFilePath, modelName, smrFileName, modelName, "dpt"); - } - - return true; + if (!hasSMR()) + return false; + + boost::filesystem::path smrFilePath, smrFileName, smrFileExt; + if (!rdo::File::splitpath(smrFullFileName, smrFilePath, smrFileName, smrFileExt)) + return false; + + modelName = getSMR()->getFile("Model_name"); + + insertFileName(rdo::converter::smr2rdox::FileTypeIn::PAT, smrFilePath, modelName, smrFileName, modelName, "pat"); + insertFileName(rdo::converter::smr2rdox::FileTypeIn::RTP, smrFilePath, modelName, smrFileName, modelName, "rtp"); + insertFileName(rdo::converter::smr2rdox::FileTypeIn::RSS, smrFilePath, modelName, smrFileName, getSMR()->getFile("Resource_file"), "rss"); + insertFileName(rdo::converter::smr2rdox::FileTypeIn::FRM, smrFilePath, modelName, smrFileName, getSMR()->getFile("Frame_file" ), "frm"); + insertFileName(rdo::converter::smr2rdox::FileTypeIn::FUN, smrFilePath, modelName, smrFileName, modelName, "fun"); + insertFileName(rdo::converter::smr2rdox::FileTypeIn::PMD, smrFilePath, modelName, smrFileName, getSMR()->getFile("Statistic_file"), "pmd"); + insertFileName(rdo::converter::smr2rdox::FileTypeIn::SMR, smrFilePath, modelName, smrFileName, smrFileName, "smr"); + insertFileName(rdo::converter::smr2rdox::FileTypeIn::PMV, smrFilePath, modelName, smrFileName, getSMR()->getFile("Results_file" ), "pmv"); + insertFileName(rdo::converter::smr2rdox::FileTypeIn::TRC, smrFilePath, modelName, smrFileName, getSMR()->getFile("Trace_file" ), "trc"); + + if (!getSMR()->getFile("OprIev_file").empty()) + insertFileName(rdo::converter::smr2rdox::FileTypeIn::OPR, smrFilePath, modelName, smrFileName, getSMR()->getFile("OprIev_file"), "opr"); + else + insertFileName(rdo::converter::smr2rdox::FileTypeIn::DPT, smrFilePath, modelName, smrFileName, modelName, "dpt"); + + return true; } RDOParserModel::Result RDOParserModel::convert(const boost::filesystem::path& smrFullFileName, rdo::converter::smr2rdox::RDOSMRFileInfo& info) { - info.m_error = true; - - RDOParserSMRInfo::FileList fileList; - boost::filesystem::path modelName; - { - std::auto_ptr pSMRParser(new RDOParserSMRInfo()); - - try - { - if (!pSMRParser->parseSMR(smrFullFileName, modelName)) - return CNV_NONE; - - info.m_modelName = pSMRParser->getSMR()->getFile("Model_name" ); - info.m_resourceFile = pSMRParser->getSMR()->getFile("Resource_file" ); - info.m_frameFile = pSMRParser->getSMR()->getFile("Frame_file" ); - info.m_statisticFile = pSMRParser->getSMR()->getFile("Statistic_file"); - info.m_resultsFile = pSMRParser->getSMR()->getFile("Results_file" ); - info.m_traceFile = pSMRParser->getSMR()->getFile("Trace_file" ); - info.m_error = false; - } - catch (const RDOSyntaxException&) - { - return CNV_NONE; - } - catch (const rdo::runtime::RDORuntimeException&) - { - return CNV_NONE; - } - fileList = pSMRParser->getFileList(); - if (fileList.empty()) - { - return CNV_NONE; - } - } - - try - { - RDOParserContainer::Iterator it = begin(); - while (it != end()) - { - m_pParserItem = it->second; - if (m_pParserItem->needStream()) - { - const auto it = fileList.find(m_pParserItem->m_type); - if (it != fileList.end()) - { - boost::filesystem::ifstream stream(it->second, std::ios::binary); - m_pParserItem->parse(this, stream); - } - } - else - { - m_pParserItem->parse(this); - } - m_pParserItem = NULL; - ++it; - } - } - catch (const rdo::converter::smr2rdox::RDOSyntaxException&) - { - return CNV_NONE; - } - catch (const rdo::runtime::RDORuntimeException&) - { - return CNV_NONE; - } - catch (...) - { - return CNV_NONE; - } - - error().clear(); - - boost::filesystem::path fullPath = boost::filesystem::path(fileList.begin()->second).parent_path(); - - try - { - boost::posix_time::ptime time(boost::posix_time::second_clock::local_time()); - std::stringstream backupDirName; - backupDirName << boost::format("backup %1$04d-%2$02d-%3$02d %4$02d-%5$02d-%6$02d") - % time.date().year () - % time.date().month() - % time.date().day () - % time.time_of_day().hours () - % time.time_of_day().minutes() - % time.time_of_day().seconds(); - - boost::filesystem::path backupPath = fullPath / backupDirName.str(); - - try - { - if (!boost::filesystem::create_directory(backupPath)) - { - YYLTYPE pos; - pos.m_last_line = 0; - pos.m_last_pos = 0; - error().error(RDOParserSrcInfo(pos), rdo::format("Ошибка создания backup-директории '%s': уже существует\n", backupPath.string().c_str())); - } - } - catch (const boost::system::error_code& ex) - { - std::string message = ex.message(); - if (message.find("boost") == 0) - { - const auto pos = message.find(' '); - if (pos != std::string::npos) - { - message = message.substr(pos + 1); - } - } - YYLTYPE pos; - pos.m_last_line = 0; - pos.m_last_pos = 0; - error().error(RDOParserSrcInfo(pos), rdo::format("Ошибка создания backup-директории '%s': %s\n", backupPath.string().c_str(), message.c_str())); - } - - for (auto& path: fileList) - { - boost::filesystem::path from(path.second); - boost::filesystem::path to (backupPath / from.filename()); - boost::filesystem::rename(from, to); - path.second = to; - } - } - catch (const rdo::converter::smr2rdox::RDOSyntaxException&) - { - return CNV_ERROR; - } - catch (const rdo::runtime::RDORuntimeException&) - { - return CNV_ERROR; - } - catch (...) - { - return CNV_ERROR; - } - - m_pDocument->create(fullPath, modelName); - RDOParserContainer::Iterator it = begin(); - while (it != end()) - { - LPRDOParserItem pParserItem = it->second; - ASSERT(pParserItem); - if (pParserItem->needStream()) - { - const auto fileIt = fileList.find(pParserItem->m_type); - if (fileIt != fileList.end()) - { - boost::filesystem::ifstream streamIn(fileIt->second, std::ios::binary); - ASSERT(streamIn.good()); - - m_pDocument->init(pParserItem->m_type, streamIn); - } - } - ++it; - } - m_pDocument->convert(); - m_pDocument->close(); - - boost::filesystem::path rdoxFile(fullPath / modelName); - rdoxFile.replace_extension(".rdox"); - if (!repository::RDOThreadRepository::createRDOX(rdoxFile)) - { - return CNV_ERROR; - } - - if (!rdo::File::trimLeft(m_pDocument->getName(rdo::converter::smr2rdox::SMR_OUT))) - { - return CNV_ERROR; - } - - return CNV_OK; + info.m_error = true; + + RDOParserSMRInfo::FileList fileList; + boost::filesystem::path modelName; + { + std::auto_ptr pSMRParser(new RDOParserSMRInfo()); + + try + { + if (!pSMRParser->parseSMR(smrFullFileName, modelName)) + return Result::NONE; + + info.m_modelName = pSMRParser->getSMR()->getFile("Model_name" ); + info.m_resourceFile = pSMRParser->getSMR()->getFile("Resource_file" ); + info.m_frameFile = pSMRParser->getSMR()->getFile("Frame_file" ); + info.m_statisticFile = pSMRParser->getSMR()->getFile("Statistic_file"); + info.m_resultsFile = pSMRParser->getSMR()->getFile("Results_file" ); + info.m_traceFile = pSMRParser->getSMR()->getFile("Trace_file" ); + info.m_error = false; + } + catch (const RDOSyntaxException&) + { + return Result::NONE; + } + catch (const rdo::runtime::RDORuntimeException&) + { + return Result::NONE; + } + fileList = pSMRParser->getFileList(); + if (fileList.empty()) + { + return Result::NONE; + } + } + + try + { + RDOParserContainer::Iterator it = begin(); + while (it != end()) + { + m_pParserItem = it->second; + if (m_pParserItem->needStream()) + { + const auto it = fileList.find(m_pParserItem->m_type); + if (it != fileList.end()) + { + boost::filesystem::ifstream stream(it->second, std::ios::binary); + m_pParserItem->parse(this, stream); + } + } + else + { + m_pParserItem->parse(this); + } + m_pParserItem = NULL; + ++it; + } + } + catch (const rdo::converter::smr2rdox::RDOSyntaxException&) + { + return Result::NONE; + } + catch (const rdo::runtime::RDORuntimeException&) + { + return Result::NONE; + } + catch (...) + { + return Result::NONE; + } + + error().clear(); + + boost::filesystem::path fullPath = boost::filesystem::path(fileList.begin()->second).parent_path(); + + try + { + boost::posix_time::ptime time(boost::posix_time::second_clock::local_time()); + std::stringstream backupDirName; + backupDirName << boost::format("backup %1$04d-%2$02d-%3$02d %4$02d-%5$02d-%6$02d") + % time.date().year () + % time.date().month() + % time.date().day () + % time.time_of_day().hours () + % time.time_of_day().minutes() + % time.time_of_day().seconds(); + + boost::filesystem::path backupPath = fullPath / backupDirName.str(); + + try + { + if (!boost::filesystem::create_directory(backupPath)) + { + YYLTYPE pos; + pos.m_last_line = 0; + pos.m_last_pos = 0; + error().error(RDOParserSrcInfo(pos), rdo::format("Ошибка создания backup-директории '%s': уже существует\n", backupPath.string().c_str())); + } + } + catch (const boost::system::error_code& ex) + { + std::string message = ex.message(); + if (message.find("boost") == 0) + { + const auto pos = message.find(' '); + if (pos != std::string::npos) + { + message = message.substr(pos + 1); + } + } + YYLTYPE pos; + pos.m_last_line = 0; + pos.m_last_pos = 0; + error().error(RDOParserSrcInfo(pos), rdo::format("Ошибка создания backup-директории '%s': %s\n", backupPath.string().c_str(), message.c_str())); + } + + for (auto& path: fileList) + { + boost::filesystem::path from(path.second); + boost::filesystem::path to (backupPath / from.filename()); + boost::filesystem::rename(from, to); + path.second = to; + } + } + catch (const rdo::converter::smr2rdox::RDOSyntaxException&) + { + return Result::CONVERTER_ERROR; + } + catch (const rdo::runtime::RDORuntimeException&) + { + return Result::CONVERTER_ERROR; + } + catch (...) + { + return Result::CONVERTER_ERROR; + } + + m_pDocument->create(fullPath, modelName); + RDOParserContainer::Iterator it = begin(); + while (it != end()) + { + LPRDOParserItem pParserItem = it->second; + ASSERT(pParserItem); + if (pParserItem->needStream()) + { + const auto fileIt = fileList.find(pParserItem->m_type); + if (fileIt != fileList.end()) + { + boost::filesystem::ifstream streamIn(fileIt->second, std::ios::binary); + ASSERT(streamIn.good()); + + m_pDocument->init(pParserItem->m_type, streamIn); + } + } + ++it; + } + m_pDocument->convert(); + m_pDocument->close(); + + boost::filesystem::path rdoxFile(fullPath / modelName); + rdoxFile.replace_extension(".rdox"); + if (!repository::RDOThreadRepository::createRDOX(rdoxFile)) + { + return Result::CONVERTER_ERROR; + } + + if (!rdo::File::trimLeft(m_pDocument->getName(rdo::converter::smr2rdox::FileTypeOut::SMR))) + { + return Result::CONVERTER_ERROR; + } + + return Result::OK; } void Converter::checkFunctionName(const RDOParserSrcInfo& src_info) { - LPRDOFUNConstant pConstant = findFUNConstant(src_info.src_text()); - if (pConstant) - { - error().push_only(src_info, rdo::format("Константа '%s' уже существует", src_info.src_text().c_str())); -// parser->error("Second appearance of the same constant name: " + *(_cons->getName())); - error().push_only(pConstant->src_info(), "См. первое определение"); - error().push_done(); - } - LPRDOFUNSequence pSequence = findFUNSequence(src_info.src_text()); - if (pSequence) - { - error().push_only(src_info, rdo::format("Последовательность '%s' уже существует", src_info.src_text().c_str())); - error().push_only(pSequence->src_info(), "См. первое определение"); - error().push_done(); - } - LPRDOFUNFunction pFunction = findFUNFunction(src_info.src_text()); - if (pFunction) - { - error().push_only(src_info, rdo::format("Функция '%s' уже существует", src_info.src_text().c_str())); - error().push_only(pFunction->src_info(), "См. первое определение"); - error().push_done(); - } + LPRDOFUNConstant pConstant = findFUNConstant(src_info.src_text()); + if (pConstant) + { + error().push_only(src_info, rdo::format("Константа '%s' уже существует", src_info.src_text().c_str())); +// parser->error("Second appearance of the same constant name: " + *(_cons->getName())); + error().push_only(pConstant->src_info(), "См. первое определение"); + error().push_done(); + } + LPRDOFUNSequence pSequence = findFUNSequence(src_info.src_text()); + if (pSequence) + { + error().push_only(src_info, rdo::format("Последовательность '%s' уже существует", src_info.src_text().c_str())); + error().push_only(pSequence->src_info(), "См. первое определение"); + error().push_done(); + } + LPRDOFUNFunction pFunction = findFUNFunction(src_info.src_text()); + if (pFunction) + { + error().push_only(src_info, rdo::format("Функция '%s' уже существует", src_info.src_text().c_str())); + error().push_only(pFunction->src_info(), "См. первое определение"); + error().push_done(); + } } void Converter::checkActivityName(const RDOParserSrcInfo& src_info) { - for (const auto& search: getDPTSearchs()) - { - RDODPTSearch::ActivityList::const_iterator it_search_act = std::find_if(search->getActivities().begin(), search->getActivities().end(), compareName(src_info.src_text())); - if (it_search_act != search->getActivities().end()) - { - error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); - error().push_only((*it_search_act)->src_info(), "См. первое определение"); - error().push_done(); -// error("Activity name: " + *_name + " already defined"); - } - } - for (const auto& some: getDPTSomes()) - { - RDODPTSome::ActivityList::const_iterator it_some_act = std::find_if(some->getActivities().begin(), some->getActivities().end(), compareName(src_info.src_text())); - if (it_some_act != some->getActivities().end()) - { - error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); - error().push_only((*it_some_act)->src_info(), "См. первое определение"); - error().push_done(); - } - } - for (const auto& prior: getDPTPriors()) - { - RDODPTPrior::ActivityList::const_iterator it_prior_act = std::find_if(prior->getActivities().begin(), prior->getActivities().end(), compareName(src_info.src_text())); - if (it_prior_act != prior->getActivities().end()) - { - error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); - error().push_only((*it_prior_act)->src_info(), "См. первое определение"); - error().push_done(); - } - } - LPRDODPTFreeActivity pFreeActivity = findDPTFreeActivity(src_info.src_text()); - if (pFreeActivity) - { - error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); - error().push_only(pFreeActivity->src_info(), "См. первое определение"); - error().push_done(); - } - LPRDOOPROperation pOperation = findOPROperation(src_info.src_text()); - if (pOperation) - { - error().push_only(src_info, rdo::format("Операция '%s' уже существует", src_info.src_text().c_str())); - error().push_only(pOperation->src_info(), "См. первое определение"); - error().push_done(); - } + for (const auto& search: getDPTSearchs()) + { + RDODPTSearch::ActivityList::const_iterator it_search_act = std::find_if(search->getActivities().begin(), search->getActivities().end(), compareName(src_info.src_text())); + if (it_search_act != search->getActivities().end()) + { + error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); + error().push_only((*it_search_act)->src_info(), "См. первое определение"); + error().push_done(); +// error("Activity name: " + *_name + " already defined"); + } + } + for (const auto& some: getDPTSomes()) + { + RDODPTSome::ActivityList::const_iterator it_some_act = std::find_if(some->getActivities().begin(), some->getActivities().end(), compareName(src_info.src_text())); + if (it_some_act != some->getActivities().end()) + { + error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); + error().push_only((*it_some_act)->src_info(), "См. первое определение"); + error().push_done(); + } + } + for (const auto& prior: getDPTPriors()) + { + RDODPTPrior::ActivityList::const_iterator it_prior_act = std::find_if(prior->getActivities().begin(), prior->getActivities().end(), compareName(src_info.src_text())); + if (it_prior_act != prior->getActivities().end()) + { + error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); + error().push_only((*it_prior_act)->src_info(), "См. первое определение"); + error().push_done(); + } + } + LPRDODPTFreeActivity pFreeActivity = findDPTFreeActivity(src_info.src_text()); + if (pFreeActivity) + { + error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); + error().push_only(pFreeActivity->src_info(), "См. первое определение"); + error().push_done(); + } + LPRDOOPROperation pOperation = findOPROperation(src_info.src_text()); + if (pOperation) + { + error().push_only(src_info, rdo::format("Операция '%s' уже существует", src_info.src_text().c_str())); + error().push_only(pOperation->src_info(), "См. первое определение"); + error().push_done(); + } } void Converter::checkDPTName(const RDOParserSrcInfo& src_info) { - if (src_info.src_text().empty()) - { - // Актуально для операций и свободных блоков активностей - return; - } - DPTSearchList::const_iterator search_it = std::find_if(getDPTSearchs().begin(), getDPTSearchs().end(), compareName(src_info.src_text())); - if (search_it != getDPTSearchs().end()) - { - error().push_only(src_info, rdo::format("Точка '%s' уже существует", src_info.src_text().c_str())); - error().push_only((*search_it)->src_info(), "См. первое определение"); - error().push_done(); -// error(src_info, "DPT name: " + src_info.src_text() + " already defined"); - } - DPTSomeList::const_iterator some_it = std::find_if(getDPTSomes().begin(), getDPTSomes().end(), compareName(src_info.src_text())); - if (some_it != getDPTSomes().end()) - { - error().push_only(src_info, rdo::format("Точка '%s' уже существует", src_info.src_text().c_str())); - error().push_only((*some_it)->src_info(), "См. первое определение"); - error().push_done(); - } + if (src_info.src_text().empty()) + { + // Актуально для операций и свободных блоков активностей + return; + } + DPTSearchList::const_iterator search_it = std::find_if(getDPTSearchs().begin(), getDPTSearchs().end(), compareName(src_info.src_text())); + if (search_it != getDPTSearchs().end()) + { + error().push_only(src_info, rdo::format("Точка '%s' уже существует", src_info.src_text().c_str())); + error().push_only((*search_it)->src_info(), "См. первое определение"); + error().push_done(); +// error(src_info, "DPT name: " + src_info.src_text() + " already defined"); + } + DPTSomeList::const_iterator some_it = std::find_if(getDPTSomes().begin(), getDPTSomes().end(), compareName(src_info.src_text())); + if (some_it != getDPTSomes().end()) + { + error().push_only(src_info, rdo::format("Точка '%s' уже существует", src_info.src_text().c_str())); + error().push_only((*some_it)->src_info(), "См. первое определение"); + error().push_done(); + } } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdoparser.h b/converter/smr2rdox/rdoparser.h index ac9f18390..c940fc69f 100644 --- a/converter/smr2rdox/rdoparser.h +++ b/converter/smr2rdox/rdoparser.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOCONVERTER_H_ -#define _CONVERTOR_RDOCONVERTER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -41,17 +40,17 @@ class RDORTPFuzzyParam; // -------------------------------------------------------------------------------- #define DEFINE_OBJECT_CONTAINER_MINIMUM(TYPE, NAME) \ public: \ - typedef std::vector NAME##List; \ - void insert##NAME (TYPE value); \ - TYPE getLast##NAME() { return !m_all##NAME.empty() ? m_all##NAME.back() : TYPE(NULL); } \ - const NAME##List& get##NAME##s () const { return m_all##NAME; } \ + typedef std::vector NAME##List; \ + void insert##NAME (TYPE value); \ + TYPE getLast##NAME() { return !m_all##NAME.empty() ? m_all##NAME.back() : TYPE(NULL); } \ + const NAME##List& get##NAME##s () const { return m_all##NAME; } \ private: \ - NAME##List m_all##NAME; + NAME##List m_all##NAME; #define DEFINE_OBJECT_CONTAINER_WITHNAME(TYPE, NAME) \ public: \ - const TYPE find##NAME (const std::string& name) const; \ - bool remove##NAME(const TYPE item); + const TYPE find##NAME (const std::string& name) const; \ + bool remove##NAME(const TYPE item); #define DEFINE_OBJECT_CONTAINER_NONAME(NAME) \ DEFINE_OBJECT_CONTAINER_MINIMUM(LPRDO##NAME, NAME) @@ -83,150 +82,150 @@ DEFINE_OBJECT_CONTAINER_NONAME(PROCProcess); DEFINE_OBJECT_CONTAINER_NONAME(Operations ); public: - Converter(); - virtual ~Converter(); - - rdo::runtime::LPRDORuntime runtime() { return m_pRuntime; } - - bool isPattern() const { return m_pattern; } - FUNGroupList& getFUNGroupStack() { return m_allFUNGroup; } - - void checkFunctionName (const RDOParserSrcInfo& src_info); - void checkActivityName (const RDOParserSrcInfo& src_info); - void checkDPTName (const RDOParserSrcInfo& src_info); - - void insertChanges(const std::string& name, const std::string& value); - - bool isHaveKWResources() const { return m_have_kw_Resources; } - void setHaveKWResources(bool value) { m_have_kw_Resources = value; } - bool isHaveKWResourcesEnd() const { return m_have_kw_ResourcesEnd; } - void setHaveKWResourcesEnd(bool value) { m_have_kw_ResourcesEnd = value; } - - bool isCurrentDPTSearch(); - bool isCurrentDPTPrior(); - - std::size_t getRTP_id () const { return m_allRTPResType.size() + 1; } - std::size_t getRSS_id () const { return m_allRSSResource.size() + 0; } - std::size_t getPAT_id () const { return m_allPATPattern.size() + 0; } - std::size_t getPMD_id () const { return m_allPMDResult.size() + 1; } - std::size_t getFUNCONST_id() const { return m_allFUNConstant.size() + 0; } - std::size_t getNumberFrame() const { return m_allFRMFrame.size() + 0; } - - std::string getModelStructure(); - std::string getChanges() const; - - LPRDOSMR getSMR() const { return m_pSMR; } - void setSMR(const LPRDOSMR& pSMR) { m_pSMR = pSMR; } - bool hasSMR() const { return m_pSMR ? true : false; } - - const Error& error() const { return m_error; } - Error& error() { return m_error; } - - class Stack: private rdo::IndexedStack - { - friend class Converter; - public: - typedef rdo::IndexedStack IndexedStack; - - template - IndexedStack::ID push(const rdo::intrusive_ptr& pObject) - { - rdo::LPISmartPtrWrapper pWrapper = new rdo::smart_ptr_wrapper(pObject); - return IndexedStack::push(pWrapper); - } - template - rdo::intrusive_ptr pop(IndexedStack::ID id) - { - rdo::LPISmartPtrWrapper pWrapper = IndexedStack::pop(id); - ASSERT(pWrapper); - rdo::intrusive_ptr pObject = *reinterpret_cast*>(pWrapper->getSmartPtr()); - pWrapper->destroy(); - return pObject; - } - private: - void clear() - { - for (auto& item: m_stack) - { - item.second->destroy(); - } - } - }; - - Stack& stack() - { - return m_movementObjectList; - } - - typedef std::vector PreCastTypeList; - const PreCastTypeList& getPreCastTypeList() const - { - return m_preCastTypeList; - } - void insertPreCastType(const LPRDOTypeParam& type) - { - m_preCastTypeList.push_back(type); - } - - void insertDocUpdate(const LPDocUpdate& pDocUpdate); - - static rdo::converter::smr2rdox::RDOFileTypeIn getFileToParse(); - static std::size_t lexer_loc_line(); - static std::size_t lexer_loc_pos(); - static Converter* s_converter(); + Converter(); + virtual ~Converter(); + + rdo::runtime::LPRDORuntime runtime() { return m_pRuntime; } + + bool isPattern() const { return m_pattern; } + FUNGroupList& getFUNGroupStack() { return m_allFUNGroup; } + + void checkFunctionName (const RDOParserSrcInfo& src_info); + void checkActivityName (const RDOParserSrcInfo& src_info); + void checkDPTName (const RDOParserSrcInfo& src_info); + + void insertChanges(const std::string& name, const std::string& value); + + bool isHaveKWResources() const { return m_have_kw_Resources; } + void setHaveKWResources(bool value) { m_have_kw_Resources = value; } + bool isHaveKWResourcesEnd() const { return m_have_kw_ResourcesEnd; } + void setHaveKWResourcesEnd(bool value) { m_have_kw_ResourcesEnd = value; } + + bool isCurrentDPTSearch(); + bool isCurrentDPTPrior(); + + std::size_t getRTP_id () const { return m_allRTPResType.size() + 1; } + std::size_t getRSS_id () const { return m_allRSSResource.size() + 0; } + std::size_t getPAT_id () const { return m_allPATPattern.size() + 0; } + std::size_t getPMD_id () const { return m_allPMDResult.size() + 1; } + std::size_t getFUNCONST_id() const { return m_allFUNConstant.size() + 0; } + std::size_t getNumberFrame() const { return m_allFRMFrame.size() + 0; } + + std::string getModelStructure(); + std::string getChanges() const; + + LPRDOSMR getSMR() const { return m_pSMR; } + void setSMR(const LPRDOSMR& pSMR) { m_pSMR = pSMR; } + bool hasSMR() const { return m_pSMR ? true : false; } + + const Error& error() const { return m_error; } + Error& error() { return m_error; } + + class Stack: private rdo::IndexedStack + { + friend class Converter; + public: + typedef rdo::IndexedStack IndexedStack; + + template + IndexedStack::ID push(const rdo::intrusive_ptr& pObject) + { + rdo::LPISmartPtrWrapper pWrapper = new rdo::smart_ptr_wrapper(pObject); + return IndexedStack::push(pWrapper); + } + template + rdo::intrusive_ptr pop(IndexedStack::ID id) + { + rdo::LPISmartPtrWrapper pWrapper = IndexedStack::pop(id); + ASSERT(pWrapper); + rdo::intrusive_ptr pObject = *reinterpret_cast*>(pWrapper->getSmartPtr()); + pWrapper->destroy(); + return pObject; + } + private: + void clear() + { + for (auto& item: m_stack) + { + item.second->destroy(); + } + } + }; + + Stack& stack() + { + return m_movementObjectList; + } + + typedef std::vector PreCastTypeList; + const PreCastTypeList& getPreCastTypeList() const + { + return m_preCastTypeList; + } + void insertPreCastType(const LPRDOTypeParam& type) + { + m_preCastTypeList.push_back(type); + } + + void insertDocUpdate(const LPDocUpdate& pDocUpdate); + + static rdo::converter::smr2rdox::FileTypeIn getFileToParse(); + static std::size_t lexer_loc_line(); + static std::size_t lexer_loc_pos(); + static Converter* s_converter(); protected: - LPRDOParserItem m_pParserItem; - LPDocument m_pDocument; - - virtual LPRDOParserContainer& getContainer() = 0; - - RDOParserContainer::Iterator begin() - { - return getContainer()->begin(); - } - RDOParserContainer::Iterator end() - { - return getContainer()->end(); - } - RDOParserContainer::Iterator find(std::size_t index) - { - return getContainer()->find(index); - } - - rdo::runtime::LPRDORuntime m_pRuntime; + LPRDOParserItem m_pParserItem; + LPDocument m_pDocument; + + virtual LPRDOParserContainer& getContainer() = 0; + + RDOParserContainer::Iterator begin() + { + return getContainer()->begin(); + } + RDOParserContainer::Iterator end() + { + return getContainer()->end(); + } + RDOParserContainer::Iterator find(std::size_t index) + { + return getContainer()->find(index); + } + + rdo::runtime::LPRDORuntime m_pRuntime; private: - LPRDOSMR m_pSMR; - bool m_have_kw_Resources; - bool m_have_kw_ResourcesEnd; - Error m_error; - Stack m_movementObjectList; - PreCastTypeList m_preCastTypeList; - bool m_pattern; - - template - void howIsIt() - { - m_pattern = false; - } - - struct ChangesData - { - std::string m_name; - std::string m_value; - - ChangesData(const std::string& name, const std::string& value) - : m_name (name ) - , m_value(value) - {} - }; - - typedef std::vector ChangesList; - ChangesList m_changes; - - typedef std::list ParserList; - static ParserList s_parserStack; + LPRDOSMR m_pSMR; + bool m_have_kw_Resources; + bool m_have_kw_ResourcesEnd; + Error m_error; + Stack m_movementObjectList; + PreCastTypeList m_preCastTypeList; + bool m_pattern; + + template + void howIsIt() + { + m_pattern = false; + } + + struct ChangesData + { + std::string m_name; + std::string m_value; + + ChangesData(const std::string& name, const std::string& value) + : m_name (name ) + , m_value(value) + {} + }; + + typedef std::vector ChangesList; + ChangesList m_changes; + + typedef std::list ParserList; + static ParserList s_parserStack; }; template <> @@ -236,7 +235,7 @@ inline void Converter::howIsIt() template <> inline void Converter::howIsIt() { - m_pattern = true; + m_pattern = true; } // -------------------------------------------------------------------------------- @@ -246,22 +245,22 @@ template class RDOParserTemplate: public Converter { public: - RDOParserTemplate() - : Converter() - {} + RDOParserTemplate() + : Converter() + {} private: - LPRDOParserContainer m_container; - - virtual LPRDOParserContainer& getContainer() - { - if (!m_container) - { - m_container = rdo::Factory::create(); - ASSERT(m_container); - } - return m_container; - } + LPRDOParserContainer m_container; + + virtual LPRDOParserContainer& getContainer() + { + if (!m_container) + { + m_container = rdo::Factory::create(); + ASSERT(m_container); + } + return m_container; + } }; // -------------------------------------------------------------------------------- @@ -270,13 +269,13 @@ class RDOParserTemplate: public Converter class RDOParserModel: public RDOParserTemplate { public: - enum Result - { - CNV_NONE, - CNV_OK, - CNV_ERROR - }; - Result convert(const boost::filesystem::path& smrFullFileName, rdo::converter::smr2rdox::RDOSMRFileInfo& info); + enum class Result + { + NONE, + OK, + CONVERTER_ERROR + }; + Result convert(const boost::filesystem::path& smrFullFileName, rdo::converter::smr2rdox::RDOSMRFileInfo& info); }; // -------------------------------------------------------------------------------- @@ -285,22 +284,20 @@ class RDOParserModel: public RDOParserTemplate class RDOParserSMRInfo: public RDOParserTemplate { public: - typedef std::map FileList; + typedef std::map FileList; - bool parseSMR(const boost::filesystem::path& smrFullFileName, boost::filesystem::path& modelName); - const FileList& getFileList() const; + bool parseSMR(const boost::filesystem::path& smrFullFileName, boost::filesystem::path& modelName); + const FileList& getFileList() const; private: - FileList m_fileList; - - void insertFileName(rdo::converter::smr2rdox::RDOFileTypeIn type, - const boost::filesystem::path& modelPath, - const boost::filesystem::path& modelName, - const boost::filesystem::path& smrFileName, - const boost::filesystem::path& nameFromSMR, - const boost::filesystem::path& fileExt); + FileList m_fileList; + + void insertFileName(rdo::converter::smr2rdox::FileTypeIn type, + const boost::filesystem::path& modelPath, + const boost::filesystem::path& modelName, + const boost::filesystem::path& smrFileName, + const boost::filesystem::path& nameFromSMR, + const boost::filesystem::path& fileExt); }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOCONVERTER_H_ diff --git a/converter/smr2rdox/rdoparser_base.cpp b/converter/smr2rdox/rdoparser_base.cpp index 5298ef06c..de8430f6b 100644 --- a/converter/smr2rdox/rdoparser_base.cpp +++ b/converter/smr2rdox/rdoparser_base.cpp @@ -19,21 +19,21 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- RDOParserItem // -------------------------------------------------------------------------------- RDOParserItem::RDOParserItem() - : m_type (rdo::converter::smr2rdox::PAT_IN) - , m_parser_fun(NULL ) - , m_lexer_fun (NULL ) - , m_needStream(true ) + : m_type(rdo::converter::smr2rdox::FileTypeIn::PAT) + , m_parser_fun(NULL) + , m_lexer_fun (NULL) + , m_needStream(true) { - init(); + init(); } -RDOParserItem::RDOParserItem(rdo::converter::smr2rdox::RDOFileTypeIn type, t_bison_parse_fun parser_fun, t_flex_lexer_fun lexer_fun) - : m_type (type ) - , m_parser_fun(parser_fun) - , m_lexer_fun (lexer_fun ) - , m_needStream(true ) +RDOParserItem::RDOParserItem(rdo::converter::smr2rdox::FileTypeIn type, t_bison_parse_fun parser_fun, t_flex_lexer_fun lexer_fun) + : m_type (type ) + , m_parser_fun(parser_fun) + , m_lexer_fun (lexer_fun ) + , m_needStream(true ) { - init(); + init(); } RDOParserItem::~RDOParserItem() @@ -51,91 +51,91 @@ RDOParserContainer::RDOParserContainer() RDOParserContainer::~RDOParserContainer() {} -std::size_t RDOParserContainer::insert(rdo::converter::smr2rdox::RDOParseType type, const LPRDOParserItem& pParser) +std::size_t RDOParserContainer::insert(rdo::converter::smr2rdox::ParseType type, const LPRDOParserItem& pParser) { - ASSERT(pParser); + ASSERT(pParser); - std::size_t min, max; - RDOParserContainer::getMinMax(type, min, max); - if (min != UNDEFINED_ID && max != UNDEFINED_ID) - { - List::iterator it = m_list.find(min); - if (it == m_list.end()) - { - m_list[min] = pParser; - return min; - } - else - { - std::size_t index = it->first; - while (it != m_list.end() && it->first <= max) - { - index++; - ++it; - } - if (index <= max) - { - m_list[index] = pParser; - return index; - } - else - { - return 0; - } - } - } - return 0; + std::size_t min, max; + RDOParserContainer::getMinMax(type, min, max); + if (min != UNDEFINED_ID && max != UNDEFINED_ID) + { + List::iterator it = m_list.find(min); + if (it == m_list.end()) + { + m_list[min] = pParser; + return min; + } + else + { + std::size_t index = it->first; + while (it != m_list.end() && it->first <= max) + { + index++; + ++it; + } + if (index <= max) + { + m_list[index] = pParser; + return index; + } + else + { + return 0; + } + } + } + return 0; } -void RDOParserContainer::getMinMax(rdo::converter::smr2rdox::RDOParseType type, std::size_t& min, std::size_t& max) +void RDOParserContainer::getMinMax(rdo::converter::smr2rdox::ParseType type, std::size_t& min, std::size_t& max) { - switch (type) - { - case rdo::converter::smr2rdox::obPRE : min = 100; max = 199; break; - case rdo::converter::smr2rdox::obRTP : min = 200; max = 299; break; - case rdo::converter::smr2rdox::obRSS : min = 300; max = 399; break; - case rdo::converter::smr2rdox::obFUN : min = 400; max = 499; break; - case rdo::converter::smr2rdox::obPAT : min = 500; max = 599; break; - case rdo::converter::smr2rdox::obOPR : min = 600; max = 699; break; - case rdo::converter::smr2rdox::obDPT : min = 700; max = 799; break; - case rdo::converter::smr2rdox::obPMD : min = 800; max = 899; break; - case rdo::converter::smr2rdox::obFRM : min = 900; max = 999; break; - case rdo::converter::smr2rdox::obSMR : min = 1000; max = 1099; break; - case rdo::converter::smr2rdox::obPOST: min = 1100; max = 1199; break; - default : min = std::size_t(UNDEFINED_ID); max = std::size_t(UNDEFINED_ID); break; - } + switch (type) + { + case rdo::converter::smr2rdox::ParseType::PRE : min = 100; max = 199; break; + case rdo::converter::smr2rdox::ParseType::RTP : min = 200; max = 299; break; + case rdo::converter::smr2rdox::ParseType::RSS : min = 300; max = 399; break; + case rdo::converter::smr2rdox::ParseType::FUN : min = 400; max = 499; break; + case rdo::converter::smr2rdox::ParseType::PAT : min = 500; max = 599; break; + case rdo::converter::smr2rdox::ParseType::OPR : min = 600; max = 699; break; + case rdo::converter::smr2rdox::ParseType::DPT : min = 700; max = 799; break; + case rdo::converter::smr2rdox::ParseType::PMD : min = 800; max = 899; break; + case rdo::converter::smr2rdox::ParseType::FRM : min = 900; max = 999; break; + case rdo::converter::smr2rdox::ParseType::SMR : min = 1000; max = 1099; break; + case rdo::converter::smr2rdox::ParseType::POST: min = 1100; max = 1199; break; + default: min = std::size_t(UNDEFINED_ID); max = std::size_t(UNDEFINED_ID); break; + } } // -------------------------------------------------------------------------------- // -------------------- RDOParserContainerModel // -------------------------------------------------------------------------------- RDOParserContainerModel::RDOParserContainerModel() - : RDOParserContainer() + : RDOParserContainer() { - insert(rdo::converter::smr2rdox::obPRE, rdo::Factory ::create()); - insert(rdo::converter::smr2rdox::obPRE, rdo::Factory::create(rdo::converter::smr2rdox::SMR_IN, cnv_smr_file_parse, cnv_smr_file_lex)); - insert(rdo::converter::smr2rdox::obRTP, rdo::Factory::create(rdo::converter::smr2rdox::RTP_IN, cnv_rtpparse, cnv_rtplex)); - insert(rdo::converter::smr2rdox::obRTP, rdo::Factory::create(rdo::converter::smr2rdox::DPT_IN, cnv_proc_rtp_parse, cnv_proc_rtp_lex)); - insert(rdo::converter::smr2rdox::obRSS, rdo::Factory ::create()); - insert(rdo::converter::smr2rdox::obRSS, rdo::Factory::create(rdo::converter::smr2rdox::DPT_IN, cnv_proc_rss_parse, cnv_proc_rss_lex)); - insert(rdo::converter::smr2rdox::obFUN, rdo::Factory::create(rdo::converter::smr2rdox::FUN_IN, cnv_funparse, cnv_funlex)); - insert(rdo::converter::smr2rdox::obPAT, rdo::Factory::create(rdo::converter::smr2rdox::PAT_IN, cnv_patparse, cnv_patlex)); - insert(rdo::converter::smr2rdox::obOPR, rdo::Factory::create(rdo::converter::smr2rdox::OPR_IN, cnv_oprparse, cnv_oprlex)); - insert(rdo::converter::smr2rdox::obDPT, rdo::Factory::create(rdo::converter::smr2rdox::DPT_IN, cnv_proc_opr_parse, cnv_proc_opr_lex)); - insert(rdo::converter::smr2rdox::obDPT, rdo::Factory::create(rdo::converter::smr2rdox::DPT_IN, cnv_dptparse, cnv_dptlex)); - insert(rdo::converter::smr2rdox::obPMD, rdo::Factory::create(rdo::converter::smr2rdox::PMD_IN, cnv_pmdparse, cnv_pmdlex)); - insert(rdo::converter::smr2rdox::obFRM, rdo::Factory::create(rdo::converter::smr2rdox::FRM_IN, cnv_frmparse, cnv_frmlex)); - insert(rdo::converter::smr2rdox::obSMR, rdo::Factory::create()); - insert(rdo::converter::smr2rdox::obSMR, rdo::Factory::create(rdo::converter::smr2rdox::SMR_IN, cnv_smr_sim_parse, cnv_smr_sim_lex)); + insert(rdo::converter::smr2rdox::ParseType::PRE, rdo::Factory ::create()); + insert(rdo::converter::smr2rdox::ParseType::PRE, rdo::Factory::create(rdo::converter::smr2rdox::FileTypeIn::SMR, cnv_smr_file_parse, cnv_smr_file_lex)); + insert(rdo::converter::smr2rdox::ParseType::RTP, rdo::Factory::create(rdo::converter::smr2rdox::FileTypeIn::RTP, cnv_rtpparse, cnv_rtplex)); + insert(rdo::converter::smr2rdox::ParseType::RTP, rdo::Factory::create(rdo::converter::smr2rdox::FileTypeIn::DPT, cnv_proc_rtp_parse, cnv_proc_rtp_lex)); + insert(rdo::converter::smr2rdox::ParseType::RSS, rdo::Factory ::create()); + insert(rdo::converter::smr2rdox::ParseType::RSS, rdo::Factory::create(rdo::converter::smr2rdox::FileTypeIn::DPT, cnv_proc_rss_parse, cnv_proc_rss_lex)); + insert(rdo::converter::smr2rdox::ParseType::FUN, rdo::Factory::create(rdo::converter::smr2rdox::FileTypeIn::FUN, cnv_funparse, cnv_funlex)); + insert(rdo::converter::smr2rdox::ParseType::PAT, rdo::Factory::create(rdo::converter::smr2rdox::FileTypeIn::PAT, cnv_patparse, cnv_patlex)); + insert(rdo::converter::smr2rdox::ParseType::OPR, rdo::Factory::create(rdo::converter::smr2rdox::FileTypeIn::OPR, cnv_oprparse, cnv_oprlex)); + insert(rdo::converter::smr2rdox::ParseType::DPT, rdo::Factory::create(rdo::converter::smr2rdox::FileTypeIn::DPT, cnv_proc_opr_parse, cnv_proc_opr_lex)); + insert(rdo::converter::smr2rdox::ParseType::DPT, rdo::Factory::create(rdo::converter::smr2rdox::FileTypeIn::DPT, cnv_dptparse, cnv_dptlex)); + insert(rdo::converter::smr2rdox::ParseType::PMD, rdo::Factory::create(rdo::converter::smr2rdox::FileTypeIn::PMD, cnv_pmdparse, cnv_pmdlex)); + insert(rdo::converter::smr2rdox::ParseType::FRM, rdo::Factory::create(rdo::converter::smr2rdox::FileTypeIn::FRM, cnv_frmparse, cnv_frmlex)); + insert(rdo::converter::smr2rdox::ParseType::SMR, rdo::Factory::create()); + insert(rdo::converter::smr2rdox::ParseType::SMR, rdo::Factory::create(rdo::converter::smr2rdox::FileTypeIn::SMR, cnv_smr_sim_parse, cnv_smr_sim_lex)); } // -------------------------------------------------------------------------------- // -------------------- RDOParserContainerSMRInfo // -------------------------------------------------------------------------------- RDOParserContainerSMRInfo::RDOParserContainerSMRInfo() - : RDOParserContainer() + : RDOParserContainer() { - insert(rdo::converter::smr2rdox::obPRE, rdo::Factory::create(rdo::converter::smr2rdox::SMR_IN, cnv_smr_file_parse, cnv_smr_file_lex)); + insert(rdo::converter::smr2rdox::ParseType::PRE, rdo::Factory::create(rdo::converter::smr2rdox::FileTypeIn::SMR, cnv_smr_file_parse, cnv_smr_file_lex)); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdoparser_base.h b/converter/smr2rdox/rdoparser_base.h index d49f4c76e..1cd9065d9 100644 --- a/converter/smr2rdox/rdoparser_base.h +++ b/converter/smr2rdox/rdoparser_base.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOCONVERTER_BASE_H_ -#define _CONVERTOR_RDOCONVERTER_BASE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -31,33 +30,33 @@ class RDOParserItem: public rdo::counter_reference { DECLARE_FACTORY(RDOParserItem); public: - rdo::converter::smr2rdox::RDOFileTypeIn m_type; + rdo::converter::smr2rdox::FileTypeIn m_type; - t_bison_parse_fun m_parser_fun; - t_flex_lexer_fun m_lexer_fun; + t_bison_parse_fun m_parser_fun; + t_flex_lexer_fun m_lexer_fun; - virtual void parse(Converter* /*pParser*/) - {} - virtual void parse(Converter* /*pParser*/, std::istream& /*streamIn*/) - {} + virtual void parse(Converter* /*pParser*/) + {} + virtual void parse(Converter* /*pParser*/, std::istream& /*streamIn*/) + {} - virtual std::size_t lexer_loc_line() { return std::size_t(rdo::runtime::RDOSrcInfo::Position::UNDEFINE_LINE); }; - virtual std::size_t lexer_loc_pos() { return 0; }; + virtual std::size_t lexer_loc_line() { return std::size_t(rdo::runtime::RDOSrcInfo::Position::UNDEFINE_LINE); }; + virtual std::size_t lexer_loc_pos() { return 0; }; - bool needStream() const - { - return m_needStream; - } + bool needStream() const + { + return m_needStream; + } protected: - RDOParserItem(); - RDOParserItem(rdo::converter::smr2rdox::RDOFileTypeIn type, t_bison_parse_fun parser_fun, t_flex_lexer_fun lexer_fun); - virtual ~RDOParserItem(); + RDOParserItem(); + RDOParserItem(rdo::converter::smr2rdox::FileTypeIn type, t_bison_parse_fun parser_fun, t_flex_lexer_fun lexer_fun); + virtual ~RDOParserItem(); - bool m_needStream; + bool m_needStream; private: - void init(); + void init(); }; // -------------------------------------------------------------------------------- @@ -68,25 +67,25 @@ class RDOParserContainer: public rdo::counter_reference { DECLARE_FACTORY(RDOParserContainer); public: - typedef std::map List; - typedef List::iterator Iterator; + typedef std::map List; + typedef List::iterator Iterator; - static const std::size_t UNDEFINED_ID = std::size_t(~0); + static const std::size_t UNDEFINED_ID = std::size_t(~0); - Iterator begin() { return m_list.begin(); } - Iterator end() { return m_list.end(); } - Iterator find(std::size_t index) { return m_list.find(index); } + Iterator begin() { return m_list.begin(); } + Iterator end() { return m_list.end(); } + Iterator find(std::size_t index) { return m_list.find(index); } - static void getMinMax(rdo::converter::smr2rdox::RDOParseType type, std::size_t& min, std::size_t& max); + static void getMinMax(rdo::converter::smr2rdox::ParseType type, std::size_t& min, std::size_t& max); protected: - RDOParserContainer(); - virtual ~RDOParserContainer(); + RDOParserContainer(); + virtual ~RDOParserContainer(); - std::size_t insert(rdo::converter::smr2rdox::RDOParseType type, const LPRDOParserItem& pParser); + std::size_t insert(rdo::converter::smr2rdox::ParseType type, const LPRDOParserItem& pParser); private: - List m_list; + List m_list; }; // -------------------------------------------------------------------------------- @@ -96,7 +95,7 @@ class RDOParserContainerModel: public RDOParserContainer { DECLARE_FACTORY(RDOParserContainerModel); private: - RDOParserContainerModel(); + RDOParserContainerModel(); }; // -------------------------------------------------------------------------------- @@ -106,9 +105,7 @@ class RDOParserContainerSMRInfo: public RDOParserContainer { DECLARE_FACTORY(RDOParserContainerSMRInfo); private: - RDOParserContainerSMRInfo(); + RDOParserContainerSMRInfo(); }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOCONVERTER_BASE_H_ diff --git a/converter/smr2rdox/rdoparser_error.cpp b/converter/smr2rdox/rdoparser_error.cpp index 970436161..52f4b26d3 100644 --- a/converter/smr2rdox/rdoparser_error.cpp +++ b/converter/smr2rdox/rdoparser_error.cpp @@ -14,104 +14,104 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- Error // -------------------------------------------------------------------------------- Error::Error() - : m_blocked(false) + : m_blocked(false) {} -//! 1 +// 1 void Error::error(const RDOParserSrcInfo& src_info, const std::string& message) { - if (blocked()) - return; + if (blocked()) + return; - push_only(src_info, message); - throw RDOSyntaxException(m_errors.back().getText()); + push_only(src_info, message); + throw RDOSyntaxException(m_errors.back().getText()); } void Error::warning(const RDOParserSrcInfo& src_info, const std::string& message) { - if (blocked()) - return; + if (blocked()) + return; - m_errors.push_back(rdo::simulation::report::FileMessage(message, src_info.src_filetype(), src_info.src_pos().m_last_line, src_info.src_pos().m_last_pos, FileMessage::MT_WARNING)); + m_errors.push_back(rdo::simulation::report::FileMessage(message, src_info.src_filetype(), src_info.src_pos().m_last_line, src_info.src_pos().m_last_pos, FileMessage::Type::MESSAGE_WARNING)); } void Error::push_only(const RDOParserSrcInfo& src_info, const std::string& message) { - if (blocked()) - return; + if (blocked()) + return; - if (src_info.src_pos().m_last_line != rdo::runtime::RDOSrcInfo::Position::UNDEFINE_LINE && src_info.src_pos().m_last_pos != rdo::runtime::RDOSrcInfo::Position::UNDEFINE_POS) - { - m_errors.push_back(rdo::simulation::report::FileMessage(message, src_info.src_filetype(), src_info.src_pos().m_last_line, src_info.src_pos().m_last_pos)); - } + if (src_info.src_pos().m_last_line != rdo::runtime::RDOSrcInfo::Position::UNDEFINE_LINE && src_info.src_pos().m_last_pos != rdo::runtime::RDOSrcInfo::Position::UNDEFINE_POS) + { + m_errors.push_back(rdo::simulation::report::FileMessage(message, src_info.src_filetype(), src_info.src_pos().m_last_line, src_info.src_pos().m_last_pos)); + } } -//! 2 +// 2 void Error::error(const RDOParserSrcInfo& src_info1, const RDOParserSrcInfo& src_info2, const std::string& message) { - if (blocked()) - return; + if (blocked()) + return; - push_only(src_info1.src_pos().m_last_line != src_info2.src_pos().m_last_line ? src_info1 : src_info2, message); - throw RDOSyntaxException(m_errors.back().getText()); + push_only(src_info1.src_pos().m_last_line != src_info2.src_pos().m_last_line ? src_info1 : src_info2, message); + throw RDOSyntaxException(m_errors.back().getText()); } -//! misc +// misc void Error::push_done() { - if (blocked()) - return; + if (blocked()) + return; - if (!m_errors.empty()) - { - throw rdo::converter::smr2rdox::RDOSyntaxException(m_errors.back().getText()); - } + if (!m_errors.empty()) + { + throw rdo::converter::smr2rdox::RDOSyntaxException(m_errors.back().getText()); + } } void Error::modify(const std::string& message) { - if (blocked()) - return; - - if (!m_errors.empty()) - { - std::string new_text = message + m_errors.front().getText(); - m_errors.front().setText(new_text); - throw rdo::converter::smr2rdox::RDOSyntaxException(""); - } + if (blocked()) + return; + + if (!m_errors.empty()) + { + std::string new_text = message + m_errors.front().getText(); + m_errors.front().setText(new_text); + throw rdo::converter::smr2rdox::RDOSyntaxException(""); + } } void Error::clear() { - if (blocked()) - return; + if (blocked()) + return; - m_errors.clear(); + m_errors.clear(); } const Error::ErrorList& Error::getList() const { - return m_errors; + return m_errors; } void Error::block() { - m_blocked = true; + m_blocked = true; } void Error::unblock() { - m_blocked = false; + m_blocked = false; } bool Error::blocked() const { - return m_blocked; + return m_blocked; } Error& g_error() { - return Converter::s_converter()->error(); + return Converter::s_converter()->error(); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdoparser_error.h b/converter/smr2rdox/rdoparser_error.h index 285fb2a86..465c1ba1a 100644 --- a/converter/smr2rdox/rdoparser_error.h +++ b/converter/smr2rdox/rdoparser_error.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOCONVERTER_ERROR_H_ -#define _CONVERTOR_RDOCONVERTER_ERROR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -19,7 +18,7 @@ class RDOSyntaxException: public rdo::runtime::RDOException { public: RDOSyntaxException(const std::string& message) - : RDOException(message) + : RDOException(message) {} virtual std::string getType() const { return "RDO Syntax Error"; } }; @@ -30,30 +29,30 @@ class RDOSyntaxException: public rdo::runtime::RDOException class Error { public: - typedef std::vector ErrorList; + typedef std::vector ErrorList; - Error(); + Error(); - //! 1 - void error(const RDOParserSrcInfo& src_info, const std::string& message); - void warning(const RDOParserSrcInfo& src_info, const std::string& message); - void push_only(const RDOParserSrcInfo& src_info, const std::string& message); + // 1 + void error(const RDOParserSrcInfo& src_info, const std::string& message); + void warning(const RDOParserSrcInfo& src_info, const std::string& message); + void push_only(const RDOParserSrcInfo& src_info, const std::string& message); - //! 2 - void error (const RDOParserSrcInfo& src_info1, const RDOParserSrcInfo& src_info2, const std::string& message); + // 2 + void error (const RDOParserSrcInfo& src_info1, const RDOParserSrcInfo& src_info2, const std::string& message); - //! misc - void push_done(); - void modify(const std::string& message); - void clear(); - const ErrorList& getList() const; - void block(); - void unblock(); - bool blocked() const; + // misc + void push_done(); + void modify(const std::string& message); + void clear(); + const ErrorList& getList() const; + void block(); + void unblock(); + bool blocked() const; private: - ErrorList m_errors; - bool m_blocked; + ErrorList m_errors; + bool m_blocked; }; Error& g_error(); @@ -61,16 +60,14 @@ Error& g_error(); class ErrorBlockMonicker { public: - ErrorBlockMonicker() - { - g_error().block(); - } - ~ErrorBlockMonicker() - { - g_error().unblock(); - } + ErrorBlockMonicker() + { + g_error().block(); + } + ~ErrorBlockMonicker() + { + g_error().unblock(); + } }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOCONVERTER_ERROR_H_ diff --git a/converter/smr2rdox/rdoparser_lexer.cpp b/converter/smr2rdox/rdoparser_lexer.cpp index d36ec9bdc..c1fdbeb52 100644 --- a/converter/smr2rdox/rdoparser_lexer.cpp +++ b/converter/smr2rdox/rdoparser_lexer.cpp @@ -11,91 +11,91 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- RDOLexer // -------------------------------------------------------------------------------- RDOLexer::RDOLexer(Converter* pParser, std::istream* yyin, std::ostream* yyout) - : yyFlexLexer(yyin, yyout) - , m_lpval (NULL ) - , m_lploc (NULL ) - , m_yyin (yyin ) - , m_yyout (yyout ) - , m_pParser (pParser ) - , m_enumEmpty(true ) - , m_array_param_cnt(0 ) + : yyFlexLexer(yyin, yyout) + , m_lpval (NULL ) + , m_lploc (NULL ) + , m_yyin (yyin ) + , m_yyout (yyout ) + , m_pParser (pParser ) + , m_enumEmpty(true ) + , m_array_param_cnt(0 ) {} void RDOLexer::loc_init() { - if (m_lploc) - { - m_lploc->m_first_line = 0; - m_lploc->m_first_pos = 0; - m_lploc->m_last_line = 0; - m_lploc->m_last_pos = 0; - m_lploc->m_first_seek = 0; - m_lploc->m_last_seek = 0; - } + if (m_lploc) + { + m_lploc->m_first_line = 0; + m_lploc->m_first_pos = 0; + m_lploc->m_last_line = 0; + m_lploc->m_last_pos = 0; + m_lploc->m_first_seek = 0; + m_lploc->m_last_seek = 0; + } } void RDOLexer::loc_action() { - if (m_lploc) - { - m_lploc->m_first_line = m_lploc->m_last_line; - m_lploc->m_first_pos = m_lploc->m_last_pos; - m_lploc->m_first_seek = m_lploc->m_last_seek; - for (int i = 0; i < YYLeng(); i++) - { - switch (YYText()[i]) - { - case '\n': - m_lploc->m_last_line++; - m_lploc->m_last_pos = 0; - break; - case '\r': - m_lploc->m_last_pos = 0; - break; - default: - m_lploc->m_last_pos++; - break; - } - - m_lploc->m_last_seek++; - } - } + if (m_lploc) + { + m_lploc->m_first_line = m_lploc->m_last_line; + m_lploc->m_first_pos = m_lploc->m_last_pos; + m_lploc->m_first_seek = m_lploc->m_last_seek; + for (int i = 0; i < YYLeng(); i++) + { + switch (YYText()[i]) + { + case '\n': + m_lploc->m_last_line++; + m_lploc->m_last_pos = 0; + break; + case '\r': + m_lploc->m_last_pos = 0; + break; + default: + m_lploc->m_last_pos++; + break; + } + + m_lploc->m_last_seek++; + } + } } void RDOLexer::loc_delta_pos(int value) { - if (m_lploc) - { - m_lploc->m_first_pos += value; - m_lploc->m_last_pos += value; - m_lploc->m_first_seek += value; - m_lploc->m_last_seek += value; - } + if (m_lploc) + { + m_lploc->m_first_pos += value; + m_lploc->m_last_pos += value; + m_lploc->m_first_seek += value; + m_lploc->m_last_seek += value; + } } void RDOLexer::setvalue(int value) { - *m_lpval = value; + *m_lpval = value; } Converter* RDOLexer::converter() { - return m_pParser; + return m_pParser; } void RDOLexer::enumBegin() { - m_enumEmpty = false; + m_enumEmpty = false; } void RDOLexer::enumReset() { - m_enumEmpty = true; + m_enumEmpty = true; } bool RDOLexer::enumEmpty() { - return m_enumEmpty; + return m_enumEmpty; } #ifdef YY_INTERACTIVE @@ -104,36 +104,36 @@ int RDOLexer::LexerInput(char* buf, int /* max_size */) int RDOLexer::LexerInput(char* buf, int max_size) #endif { - if (m_yyin->eof() || m_yyin->fail()) - return 0; + if (m_yyin->eof() || m_yyin->fail()) + return 0; #ifdef YY_INTERACTIVE - m_yyin->get(buf[0]); + m_yyin->get(buf[0]); - if (m_yyin->eof()) - return 0; + if (m_yyin->eof()) + return 0; - if (m_yyin->bad()) - return -1; + if (m_yyin->bad()) + return -1; - return 1; + return 1; #else - (void) m_yyin->read(buf, max_size); - - if (m_yyin->bad()) - { - return -1; - } - else - { - return static_cast(m_yyin->gcount()); - } + (void) m_yyin->read(buf, max_size); + + if (m_yyin->bad()) + { + return -1; + } + else + { + return static_cast(m_yyin->gcount()); + } #endif } void RDOLexer::LexerOutput(const char* buf, int size) { - (void) m_yyout->write(buf, size); + (void) m_yyout->write(buf, size); } #ifndef YY_EXIT_FAILURE @@ -142,16 +142,16 @@ void RDOLexer::LexerOutput(const char* buf, int size) void RDOLexer::LexerError(const char msg[]) { - std::cerr << msg << '\n'; - exit(YY_EXIT_FAILURE); + std::cerr << msg << '\n'; + exit(YY_EXIT_FAILURE); } extern "C" { - int cnvwrap(void) - { - return 1; - } + int cnvwrap(void) + { + return 1; + } } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdoparser_lexer.h b/converter/smr2rdox/rdoparser_lexer.h index fb593da7a..783f38164 100644 --- a/converter/smr2rdox/rdoparser_lexer.h +++ b/converter/smr2rdox/rdoparser_lexer.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOCONVERTER_LEXER_H_ -#define _CONVERTOR_RDOCONVERTER_LEXER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -23,38 +22,36 @@ class Converter; class RDOLexer: public yyFlexLexer { public: - RDOLexer(Converter* pParser, std::istream* yyin, std::ostream* yyout); + RDOLexer(Converter* pParser, std::istream* yyin, std::ostream* yyout); - void loc_init(); - void loc_action(); - void loc_delta_pos(int value); - void setvalue(int value); + void loc_init(); + void loc_action(); + void loc_delta_pos(int value); + void setvalue(int value); - Converter* converter(); + Converter* converter(); - void enumBegin(); - void enumReset(); - bool enumEmpty(); + void enumBegin(); + void enumReset(); + bool enumEmpty(); - int* m_lpval; - YYLTYPE* m_lploc; + int* m_lpval; + YYLTYPE* m_lploc; protected: - virtual int LexerInput(char* buf, int max_size); - virtual void LexerOutput(const char* buf, int size); - virtual void LexerError(const char* msg); + virtual int LexerInput(char* buf, int max_size); + virtual void LexerOutput(const char* buf, int size); + virtual void LexerError(const char* msg); private: - std::istream* m_yyin; - std::ostream* m_yyout; - Converter* m_pParser; - bool m_enumEmpty; - int m_array_param_cnt; + std::istream* m_yyin; + std::ostream* m_yyout; + Converter* m_pParser; + bool m_enumEmpty; + int m_array_param_cnt; }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE #define LEXER reinterpret_cast(lexer) #define LEXER_POS (*LEXER->m_lploc) - -#endif // _CONVERTOR_RDOCONVERTER_LEXER_H_ diff --git a/converter/smr2rdox/rdoparser_rdo.cpp b/converter/smr2rdox/rdoparser_rdo.cpp index 562a896c0..69ab0b829 100644 --- a/converter/smr2rdox/rdoparser_rdo.cpp +++ b/converter/smr2rdox/rdoparser_rdo.cpp @@ -22,107 +22,107 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------------------------------------------------------------------- // -------------------- RDOParserRDOItem // -------------------------------------------------------------------------------- -RDOParserRDOItem::RDOParserRDOItem(rdo::converter::smr2rdox::RDOFileTypeIn type, t_bison_parse_fun parser_fun, t_flex_lexer_fun lexer_fun) - : RDOParserItem(type, parser_fun, lexer_fun) - , m_pLexer(NULL) +RDOParserRDOItem::RDOParserRDOItem(rdo::converter::smr2rdox::FileTypeIn type, t_bison_parse_fun parser_fun, t_flex_lexer_fun lexer_fun) + : RDOParserItem(type, parser_fun, lexer_fun) + , m_pLexer(NULL) {} RDOParserRDOItem::~RDOParserRDOItem() { - if (m_pLexer) - { - delete m_pLexer; - m_pLexer = NULL; - } + if (m_pLexer) + { + delete m_pLexer; + m_pLexer = NULL; + } } void RDOParserRDOItem::parse(Converter* pParser, std::istream& streamIn) { - ASSERT(pParser); + ASSERT(pParser); - if (!streamIn.good()) - return; + if (!streamIn.good()) + return; - if (m_pLexer) - delete m_pLexer; + if (m_pLexer) + delete m_pLexer; - std::ostringstream streamOut; - m_pLexer = getLexer(pParser, &streamIn, &streamOut); + std::ostringstream streamOut; + m_pLexer = getLexer(pParser, &streamIn, &streamOut); - if (m_pLexer && m_parser_fun) - m_parser_fun(m_pLexer); + if (m_pLexer && m_parser_fun) + m_parser_fun(m_pLexer); } RDOLexer* RDOParserRDOItem::getLexer(Converter* pParser, std::istream* streamIn, std::ostream* streamOut) { - ASSERT(pParser); - return new RDOLexer(pParser, streamIn, streamOut); + ASSERT(pParser); + return new RDOLexer(pParser, streamIn, streamOut); } std::size_t RDOParserRDOItem::lexer_loc_line() { - if (m_pLexer) - { - return m_pLexer->m_lploc ? m_pLexer->m_lploc->m_first_line : m_pLexer->lineno(); - } - else - { - return std::size_t(rdo::runtime::RDOSrcInfo::Position::UNDEFINE_LINE); - } + if (m_pLexer) + { + return m_pLexer->m_lploc ? m_pLexer->m_lploc->m_first_line : m_pLexer->lineno(); + } + else + { + return std::size_t(rdo::runtime::RDOSrcInfo::Position::UNDEFINE_LINE); + } } std::size_t RDOParserRDOItem::lexer_loc_pos() { - return m_pLexer && m_pLexer->m_lploc ? m_pLexer->m_lploc->m_first_pos : 0; + return m_pLexer && m_pLexer->m_lploc ? m_pLexer->m_lploc->m_first_pos : 0; } // -------------------------------------------------------------------------------- // -------------------- RDOParserRSS // -------------------------------------------------------------------------------- RDOParserRSS::RDOParserRSS() - : RDOParserRDOItem(rdo::converter::smr2rdox::RSS_IN, cnv_rssparse, cnv_rsslex) + : RDOParserRDOItem(rdo::converter::smr2rdox::FileTypeIn::RSS, cnv_rssparse, cnv_rsslex) {} void RDOParserRSS::parse(Converter* pParser, std::istream& streamIn) { - ASSERT(pParser); - pParser->setHaveKWResources (false); - pParser->setHaveKWResourcesEnd(false); - RDOParserRDOItem::parse(pParser, streamIn); + ASSERT(pParser); + pParser->setHaveKWResources (false); + pParser->setHaveKWResourcesEnd(false); + RDOParserRDOItem::parse(pParser, streamIn); } // -------------------------------------------------------------------------------- // -------------------- RDOParserRSSPost // -------------------------------------------------------------------------------- RDOParserRSSPost::RDOParserRSSPost() - : RDOParserItem(rdo::converter::smr2rdox::RSS_IN, NULL, NULL) + : RDOParserItem(rdo::converter::smr2rdox::FileTypeIn::RSS, NULL, NULL) { - m_needStream = false; + m_needStream = false; } void RDOParserRSSPost::parse(Converter* pParser) { - ASSERT(pParser); + ASSERT(pParser); - //! В режиме совместимости со старым РДО создаем ресурсы по номерам их типов, а не по номерам самих ресурсов из RSS + // В режиме совместимости со старым РДО создаем ресурсы по номерам их типов, а не по номерам самих ресурсов из RSS #ifdef RDOSIM_COMPATIBLE - for (const auto& rtp: pParser->getRTPResTypes()) - { + for (const auto& rtp: pParser->getRTPResTypes()) + { #endif - for (const auto& rss: pParser->getRSSResources()) - { + for (const auto& rss: pParser->getRSSResources()) + { #ifdef RDOSIM_COMPATIBLE - if (rss->getType() == rtp) - { + if (rss->getType() == rtp) + { #endif - rdo::runtime::LPRDOCalc calc = rss->createCalc(); - pParser->runtime()->addInitCalc(calc); + rdo::runtime::LPRDOCalc calc = rss->createCalc(); + pParser->runtime()->addInitCalc(calc); #ifdef RDOSIM_COMPATIBLE - } + } #endif - } + } #ifdef RDOSIM_COMPATIBLE - } + } #endif } @@ -130,355 +130,355 @@ void RDOParserRSSPost::parse(Converter* pParser) // -------------------- RDOParserSTDFUN // -------------------------------------------------------------------------------- RDOParserSTDFUN::RDOParserSTDFUN() - : RDOParserItem(rdo::converter::smr2rdox::FUN_IN, NULL, NULL) + : RDOParserItem(rdo::converter::smr2rdox::FileTypeIn::FUN, NULL, NULL) { - m_needStream = false; + m_needStream = false; } double cotan(double value) { - return 1.0 / tan(value); + return 1.0 / tan(value); } int intLocal(int value) { - return value; + return value; } double log2Local(double value) { - return log(value) / log(2.0); + return log(value) / log(2.0); } double logNLocal(double value1, double value2) { - return log(value1) / log(value2); + return log(value1) / log(value2); } template T maxLocal(T value1, T value2) { - return value1 > value2 ? value1 : value2; + return value1 > value2 ? value1 : value2; } template T minLocal(T value1, T value2) { - return value1 < value2 ? value1 : value2; + return value1 < value2 ? value1 : value2; } double modf(double value) { - double tmp; - return ::modf(value, &tmp); + double tmp; + return ::modf(value, &tmp); } int roundLocal(double value) { - return (int)floor(value + 0.5); + return (int)floor(value + 0.5); } void RDOParserSTDFUN::parse(Converter* /*pParser*/) { - typedef rdo::runtime::std_fun1 StdFun_D_D; - typedef rdo::runtime::std_fun2 StdFun_D_DD; - typedef rdo::runtime::std_fun2 StdFun_D_DI; - typedef rdo::runtime::std_fun1 StdFun_I_I; - typedef rdo::runtime::std_fun2 StdFun_I_II; - typedef rdo::runtime::std_fun1 StdFun_I_D; - - typedef rdo::runtime::RDOFunCalcStd Function_D_D; - typedef rdo::runtime::RDOFunCalcStd Function_D_DD; - typedef rdo::runtime::RDOFunCalcStd Function_D_DI; - typedef rdo::runtime::RDOFunCalcStd Function_I_I; - typedef rdo::runtime::RDOFunCalcStd Function_I_II; - typedef rdo::runtime::RDOFunCalcStd Function_I_D; - - LPRDOTypeParam intType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo()); - LPRDOTypeParam realType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo()); - LPRDOParam pIntReturn = rdo::Factory::create(RDOParserSrcInfo(), intType ); - LPRDOParam pRealReturn = rdo::Factory::create(RDOParserSrcInfo(), realType); - - LPRDOFUNFunction fun = rdo::Factory::create("Abs", pRealReturn); - LPRDOParam param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(fabs)); - - fun = rdo::Factory::create("ArcCos", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(acos)); - - fun = rdo::Factory::create("ArcSin", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(asin)); - - fun = rdo::Factory::create("ArcTan", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(atan)); - - fun = rdo::Factory::create("Cos", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(cos)); - - fun = rdo::Factory::create("Cotan", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(cotan)); - - fun = rdo::Factory::create("Exp", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(exp)); - - fun = rdo::Factory::create("Floor", pIntReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(floor)); - - fun = rdo::Factory::create("Frac", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(modf)); - - fun = rdo::Factory::create("IAbs", pIntReturn); - param = rdo::Factory::create("p1", intType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(static_cast(abs))); - - fun = rdo::Factory::create("IMax", pIntReturn); - param = rdo::Factory::create("p1", intType); - fun->add(param); - param = rdo::Factory::create("p2", intType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(maxLocal)); - - fun = rdo::Factory::create("IMin", pIntReturn); - param = rdo::Factory::create("p1", intType); - fun->add(param); - param = rdo::Factory::create("p2", intType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(minLocal)); - - fun = rdo::Factory::create("Int", pIntReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(intLocal)); - - fun = rdo::Factory::create("IntPower", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - param = rdo::Factory::create("p2", intType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(static_cast(std::pow))); - - fun = rdo::Factory::create("Ln", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(log)); - - fun = rdo::Factory::create("Log10", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(log10)); - - fun = rdo::Factory::create("Log2", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(log2Local)); - - fun = rdo::Factory::create("LogN", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - param = rdo::Factory::create("p2", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(logNLocal)); - - fun = rdo::Factory::create("Max", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - param = rdo::Factory::create("p2", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(maxLocal)); - - fun = rdo::Factory::create("Min", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - param = rdo::Factory::create("p2", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(minLocal)); - - fun = rdo::Factory::create("Power", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - param = rdo::Factory::create("p2", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(static_cast(pow))); - - fun = rdo::Factory::create("Round", pIntReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(roundLocal)); - - fun = rdo::Factory::create("Sin", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(sin)); - - fun = rdo::Factory::create("Sqrt", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(sqrt)); - - fun = rdo::Factory::create("Tan", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(tan)); - - // ----------------------------------------- - // И для маленьких букв - // ----------------------------------------- - fun = rdo::Factory::create("abs", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(fabs)); - - fun = rdo::Factory::create("arccos", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(acos)); - - fun = rdo::Factory::create("arcsin", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(asin)); - - fun = rdo::Factory::create("arctan", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(atan)); - - fun = rdo::Factory::create("cos", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(cos)); - - fun = rdo::Factory::create("cotan", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(cotan)); - - fun = rdo::Factory::create("exp", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(exp)); - - fun = rdo::Factory::create("floor", pIntReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(floor)); - - fun = rdo::Factory::create("frac", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(modf)); - - fun = rdo::Factory::create("iabs", pIntReturn); - param = rdo::Factory::create("p1", intType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(static_cast(abs))); - - fun = rdo::Factory::create("imax", pIntReturn); - param = rdo::Factory::create("p1", intType); - fun->add(param); - param = rdo::Factory::create("p2", intType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(maxLocal)); - - fun = rdo::Factory::create("imin", pIntReturn); - param = rdo::Factory::create("p1", intType); - fun->add(param); - param = rdo::Factory::create("p2", intType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(minLocal)); - - fun = rdo::Factory::create("int", pIntReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(intLocal)); - - fun = rdo::Factory::create("intpower", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - param = rdo::Factory::create("p2", intType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(static_cast(std::pow))); - - fun = rdo::Factory::create("ln", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(log)); - - fun = rdo::Factory::create("log10", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(log10)); - - fun = rdo::Factory::create("log2", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(log2Local)); - - fun = rdo::Factory::create("logn", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - param = rdo::Factory::create("p2", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(logNLocal)); - - fun = rdo::Factory::create("max", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - param = rdo::Factory::create("p2", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(maxLocal)); - - fun = rdo::Factory::create("min", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - param = rdo::Factory::create("p2", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(minLocal)); - - fun = rdo::Factory::create("power", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - param = rdo::Factory::create("p2", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(static_cast(pow))); - - fun = rdo::Factory::create("round", pIntReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(roundLocal)); - - fun = rdo::Factory::create("sin", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(sin)); - - fun = rdo::Factory::create("sqrt", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(sqrt)); - - fun = rdo::Factory::create("tan", pRealReturn); - param = rdo::Factory::create("p1", realType); - fun->add(param); - fun->setFunctionCalc(rdo::Factory::create(tan)); + typedef rdo::runtime::std_fun1 StdFun_D_D; + typedef rdo::runtime::std_fun2 StdFun_D_DD; + typedef rdo::runtime::std_fun2 StdFun_D_DI; + typedef rdo::runtime::std_fun1 StdFun_I_I; + typedef rdo::runtime::std_fun2 StdFun_I_II; + typedef rdo::runtime::std_fun1 StdFun_I_D; + + typedef rdo::runtime::RDOFunCalcStd Function_D_D; + typedef rdo::runtime::RDOFunCalcStd Function_D_DD; + typedef rdo::runtime::RDOFunCalcStd Function_D_DI; + typedef rdo::runtime::RDOFunCalcStd Function_I_I; + typedef rdo::runtime::RDOFunCalcStd Function_I_II; + typedef rdo::runtime::RDOFunCalcStd Function_I_D; + + LPRDOTypeParam intType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo()); + LPRDOTypeParam realType = rdo::Factory::create(rdo::Factory::create(), RDOParserSrcInfo()); + LPRDOParam pIntReturn = rdo::Factory::create(RDOParserSrcInfo(), intType ); + LPRDOParam pRealReturn = rdo::Factory::create(RDOParserSrcInfo(), realType); + + LPRDOFUNFunction fun = rdo::Factory::create("Abs", pRealReturn); + LPRDOParam param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(fabs)); + + fun = rdo::Factory::create("ArcCos", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(acos)); + + fun = rdo::Factory::create("ArcSin", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(asin)); + + fun = rdo::Factory::create("ArcTan", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(atan)); + + fun = rdo::Factory::create("Cos", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(cos)); + + fun = rdo::Factory::create("Cotan", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(cotan)); + + fun = rdo::Factory::create("Exp", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(exp)); + + fun = rdo::Factory::create("Floor", pIntReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(floor)); + + fun = rdo::Factory::create("Frac", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(modf)); + + fun = rdo::Factory::create("IAbs", pIntReturn); + param = rdo::Factory::create("p1", intType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(static_cast(abs))); + + fun = rdo::Factory::create("IMax", pIntReturn); + param = rdo::Factory::create("p1", intType); + fun->add(param); + param = rdo::Factory::create("p2", intType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(maxLocal)); + + fun = rdo::Factory::create("IMin", pIntReturn); + param = rdo::Factory::create("p1", intType); + fun->add(param); + param = rdo::Factory::create("p2", intType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(minLocal)); + + fun = rdo::Factory::create("Int", pIntReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(intLocal)); + + fun = rdo::Factory::create("IntPower", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + param = rdo::Factory::create("p2", intType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(static_cast(std::pow))); + + fun = rdo::Factory::create("Ln", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(log)); + + fun = rdo::Factory::create("Log10", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(log10)); + + fun = rdo::Factory::create("Log2", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(log2Local)); + + fun = rdo::Factory::create("LogN", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + param = rdo::Factory::create("p2", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(logNLocal)); + + fun = rdo::Factory::create("Max", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + param = rdo::Factory::create("p2", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(maxLocal)); + + fun = rdo::Factory::create("Min", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + param = rdo::Factory::create("p2", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(minLocal)); + + fun = rdo::Factory::create("Power", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + param = rdo::Factory::create("p2", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(static_cast(pow))); + + fun = rdo::Factory::create("Round", pIntReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(roundLocal)); + + fun = rdo::Factory::create("Sin", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(sin)); + + fun = rdo::Factory::create("Sqrt", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(sqrt)); + + fun = rdo::Factory::create("Tan", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(tan)); + + // ----------------------------------------- + // И для маленьких букв + // ----------------------------------------- + fun = rdo::Factory::create("abs", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(fabs)); + + fun = rdo::Factory::create("arccos", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(acos)); + + fun = rdo::Factory::create("arcsin", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(asin)); + + fun = rdo::Factory::create("arctan", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(atan)); + + fun = rdo::Factory::create("cos", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(cos)); + + fun = rdo::Factory::create("cotan", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(cotan)); + + fun = rdo::Factory::create("exp", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(exp)); + + fun = rdo::Factory::create("floor", pIntReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(floor)); + + fun = rdo::Factory::create("frac", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(modf)); + + fun = rdo::Factory::create("iabs", pIntReturn); + param = rdo::Factory::create("p1", intType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(static_cast(abs))); + + fun = rdo::Factory::create("imax", pIntReturn); + param = rdo::Factory::create("p1", intType); + fun->add(param); + param = rdo::Factory::create("p2", intType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(maxLocal)); + + fun = rdo::Factory::create("imin", pIntReturn); + param = rdo::Factory::create("p1", intType); + fun->add(param); + param = rdo::Factory::create("p2", intType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(minLocal)); + + fun = rdo::Factory::create("int", pIntReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(intLocal)); + + fun = rdo::Factory::create("intpower", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + param = rdo::Factory::create("p2", intType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(static_cast(std::pow))); + + fun = rdo::Factory::create("ln", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(log)); + + fun = rdo::Factory::create("log10", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(log10)); + + fun = rdo::Factory::create("log2", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(log2Local)); + + fun = rdo::Factory::create("logn", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + param = rdo::Factory::create("p2", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(logNLocal)); + + fun = rdo::Factory::create("max", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + param = rdo::Factory::create("p2", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(maxLocal)); + + fun = rdo::Factory::create("min", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + param = rdo::Factory::create("p2", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(minLocal)); + + fun = rdo::Factory::create("power", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + param = rdo::Factory::create("p2", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(static_cast(pow))); + + fun = rdo::Factory::create("round", pIntReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(roundLocal)); + + fun = rdo::Factory::create("sin", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(sin)); + + fun = rdo::Factory::create("sqrt", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(sqrt)); + + fun = rdo::Factory::create("tan", pRealReturn); + param = rdo::Factory::create("p1", realType); + fun->add(param); + fun->setFunctionCalc(rdo::Factory::create(tan)); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdoparser_rdo.h b/converter/smr2rdox/rdoparser_rdo.h index 408d76a3d..81c8aa4da 100644 --- a/converter/smr2rdox/rdoparser_rdo.h +++ b/converter/smr2rdox/rdoparser_rdo.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOCONVERTER_CONVERTOR_RDO_H_ -#define _CONVERTOR_RDOCONVERTER_CONVERTOR_RDO_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -21,19 +20,19 @@ class RDOParserRDOItem: public RDOParserItem { DECLARE_FACTORY(RDOParserRDOItem); public: - virtual void parse(Converter* pParser, std::istream& streamIn); - virtual std::size_t lexer_loc_line(); - virtual std::size_t lexer_loc_pos(); + virtual void parse(Converter* pParser, std::istream& streamIn); + virtual std::size_t lexer_loc_line(); + virtual std::size_t lexer_loc_pos(); protected: - RDOParserRDOItem(rdo::converter::smr2rdox::RDOFileTypeIn type, t_bison_parse_fun parser_fun, t_flex_lexer_fun lexer_fun); - virtual ~RDOParserRDOItem(); + RDOParserRDOItem(rdo::converter::smr2rdox::FileTypeIn type, t_bison_parse_fun parser_fun, t_flex_lexer_fun lexer_fun); + virtual ~RDOParserRDOItem(); - RDOLexer* m_pLexer; - YYLTYPE m_loc; + RDOLexer* m_pLexer; + YYLTYPE m_loc; private: - RDOLexer* getLexer(Converter* pParser, std::istream* streamIn, std::ostream* streamOut); + RDOLexer* getLexer(Converter* pParser, std::istream* streamIn, std::ostream* streamOut); }; // -------------------------------------------------------------------------------- @@ -43,8 +42,8 @@ class RDOParserRSS: public RDOParserRDOItem { DECLARE_FACTORY(RDOParserRSS); private: - RDOParserRSS(); - virtual void parse(Converter* pParser, std::istream& streamIn); + RDOParserRSS(); + virtual void parse(Converter* pParser, std::istream& streamIn); }; // -------------------------------------------------------------------------------- @@ -54,8 +53,8 @@ class RDOParserRSSPost: public RDOParserItem { DECLARE_FACTORY(RDOParserRSSPost); private: - RDOParserRSSPost(); - virtual void parse(Converter* pParser); + RDOParserRSSPost(); + virtual void parse(Converter* pParser); }; // -------------------------------------------------------------------------------- @@ -65,10 +64,8 @@ class RDOParserSTDFUN: public RDOParserItem { DECLARE_FACTORY(RDOParserSTDFUN); private: - RDOParserSTDFUN(); - virtual void parse(Converter* pParser); + RDOParserSTDFUN(); + virtual void parse(Converter* pParser); }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOCONVERTER_CONVERTOR_RDO_H_ diff --git a/converter/smr2rdox/rdopat.cpp b/converter/smr2rdox/rdopat.cpp index 672a7a2c3..2f98e8af3 100644 --- a/converter/smr2rdox/rdopat.cpp +++ b/converter/smr2rdox/rdopat.cpp @@ -15,9 +15,9 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE int cnv_patlex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void cnv_paterror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -25,9 +25,9 @@ void cnv_paterror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) int pat_preparse_lex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void pat_preparse_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -37,733 +37,733 @@ void pat_preparse_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*messa // -------------------- RDOPATPattern // -------------------------------------------------------------------------------- RDOPATPattern::RDOPATPattern(const RDOParserSrcInfo& name_src_info) - : RDOParserSrcInfo (name_src_info) - , m_useCommonChoice (false ) - , m_currentRelResIndex(0 ) + : RDOParserSrcInfo (name_src_info) + , m_useCommonChoice (false ) + , m_currentRelResIndex(0 ) { - LPRDOPATPattern pPatternExist = Converter::s_converter()->findPATPattern(src_info().src_text()); - if (pPatternExist) - { - rdo::converter::smr2rdox::g_error().push_only(src_info(), rdo::format("Паттерн '%s' уже существует", name().c_str())); - rdo::converter::smr2rdox::g_error().push_only(pPatternExist->src_info(), "См. первое определение"); - rdo::converter::smr2rdox::g_error().push_done(); - } - Converter::s_converter()->insertPATPattern(this); + LPRDOPATPattern pPatternExist = Converter::s_converter()->findPATPattern(src_info().src_text()); + if (pPatternExist) + { + rdo::converter::smr2rdox::g_error().push_only(src_info(), rdo::format("Паттерн '%s' уже существует", name().c_str())); + rdo::converter::smr2rdox::g_error().push_only(pPatternExist->src_info(), "См. первое определение"); + rdo::converter::smr2rdox::g_error().push_done(); + } + Converter::s_converter()->insertPATPattern(this); } std::string RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus value) { - switch (value) - { - case rdo::runtime::RDOResource::CS_Keep : return "Keep"; - case rdo::runtime::RDOResource::CS_Create : return "Create"; - case rdo::runtime::RDOResource::CS_Erase : return "Erase"; - case rdo::runtime::RDOResource::CS_NonExist: return "NonExist"; - case rdo::runtime::RDOResource::CS_NoChange: return "NoChange"; - default : NEVER_REACH_HERE; - } - return std::string(); + switch (value) + { + case rdo::runtime::RDOResource::ConvertStatus::KEEP : return "Keep"; + case rdo::runtime::RDOResource::ConvertStatus::CREATE : return "Create"; + case rdo::runtime::RDOResource::ConvertStatus::ERASE : return "Erase"; + case rdo::runtime::RDOResource::ConvertStatus::NONEXIST: return "NonExist"; + case rdo::runtime::RDOResource::ConvertStatus::NOCHANGE: return "NoChange"; + default : NEVER_REACH_HERE; + } + return std::string(); } rdo::runtime::RDOResource::ConvertStatus RDOPATPattern::StrToStatus(const std::string& value, const YYLTYPE& convertor_pos) { - if (value == "Keep" || value == "keep") - { - return rdo::runtime::RDOResource::CS_Keep; - } - else if (value == "Create" || value == "create") - { - return rdo::runtime::RDOResource::CS_Create; - } - else if (value == "Erase" || value == "erase") - { - return rdo::runtime::RDOResource::CS_Erase; - } - else if (value == "NonExist" || value == "nonexist") - { - return rdo::runtime::RDOResource::CS_NonExist; - } - else if (value == "NoChange" || value == "nochange") - { - return rdo::runtime::RDOResource::CS_NoChange; - } - rdo::converter::smr2rdox::g_error().error(convertor_pos, rdo::format("Неверный статус конвертора: %s", value.c_str())); - return rdo::runtime::RDOResource::CS_Keep; + if (value == "Keep" || value == "keep") + { + return rdo::runtime::RDOResource::ConvertStatus::KEEP; + } + else if (value == "Create" || value == "create") + { + return rdo::runtime::RDOResource::ConvertStatus::CREATE; + } + else if (value == "Erase" || value == "erase") + { + return rdo::runtime::RDOResource::ConvertStatus::ERASE; + } + else if (value == "NonExist" || value == "nonexist") + { + return rdo::runtime::RDOResource::ConvertStatus::NONEXIST; + } + else if (value == "NoChange" || value == "nochange") + { + return rdo::runtime::RDOResource::ConvertStatus::NOCHANGE; + } + rdo::converter::smr2rdox::g_error().error(convertor_pos, rdo::format("Неверный статус конвертора: %s", value.c_str())); + return rdo::runtime::RDOResource::ConvertStatus::KEEP; } void RDOPATPattern::beforeRelRensert(const RDOParserSrcInfo& rel_info) { - if (findRelevantResource(rel_info.src_text())) - { - rdo::converter::smr2rdox::g_error().error(rel_info, rdo::format("Релевантный ресурс '%s' уже определен", rel_info.src_text().c_str())); - } + if (findRelevantResource(rel_info.src_text())) + { + rdo::converter::smr2rdox::g_error().error(rel_info, rdo::format("Релевантный ресурс '%s' уже определен", rel_info.src_text().c_str())); + } } void RDOPATPattern::rel_res_insert(const LPRDORelevantResource& pRelevantResource) { - ASSERT(pRelevantResource); - switch (getType()) - { - case PT_IE : getPatRuntime()->addConvertorStatus (pRelevantResource->m_statusBegin); break; - case PT_Rule : getPatRuntime()->addConvertorStatus (pRelevantResource->m_statusBegin); break; - case PT_Operation: getPatRuntime()->addConvertorBeginStatus(pRelevantResource->m_statusBegin); break; - case PT_Keyboard : getPatRuntime()->addConvertorBeginStatus(pRelevantResource->m_statusBegin); break; - default : rdo::converter::smr2rdox::g_error().error(src_info(), "Неизвестный тип образца"); - } - m_relResList.push_back(pRelevantResource); + ASSERT(pRelevantResource); + switch (getType()) + { + case Type::IE : getPatRuntime()->addConvertorStatus (pRelevantResource->m_statusBegin); break; + case Type::RULE : getPatRuntime()->addConvertorStatus (pRelevantResource->m_statusBegin); break; + case Type::OPERATION: getPatRuntime()->addConvertorBeginStatus(pRelevantResource->m_statusBegin); break; + case Type::KEYBOARD : getPatRuntime()->addConvertorBeginStatus(pRelevantResource->m_statusBegin); break; + default : rdo::converter::smr2rdox::g_error().error(src_info(), "Неизвестный тип образца"); + } + m_relResList.push_back(pRelevantResource); } void RDOPATPattern::addRelResConvert(bool trace, const LPConvertCmdList& commands, const YYLTYPE& convertor_pos, const YYLTYPE& trace_pos, rdo::runtime::RDOResource::ConvertStatus status) { - if (status == rdo::runtime::RDOResource::CS_NoChange || status == rdo::runtime::RDOResource::CS_NonExist) - { - rdo::converter::smr2rdox::g_error().error(convertor_pos, getErrorMessage_NotNeedConvertor(m_pCurrRelRes->name(), status)); - } + if (status == rdo::runtime::RDOResource::ConvertStatus::NOCHANGE || status == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + rdo::converter::smr2rdox::g_error().error(convertor_pos, getErrorMessage_NotNeedConvertor(m_pCurrRelRes->name(), status)); + } - if (status == rdo::runtime::RDOResource::CS_Create) - { - addParamSetCalc(createRelRes(trace)); - } - else - { - if (trace) - { - rdo::converter::smr2rdox::g_error().error(trace_pos, "Признак трассировки в данном месте возможен только для создаваемого ресурса"); - } - } + if (status == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + addParamSetCalc(createRelRes(trace)); + } + else + { + if (trace) + { + rdo::converter::smr2rdox::g_error().error(trace_pos, "Признак трассировки в данном месте возможен только для создаваемого ресурса"); + } + } - if (commands->commands().empty() && status == rdo::runtime::RDOResource::CS_Keep) - { - rdo::converter::smr2rdox::g_error().warning(convertor_pos, getWarningMessage_EmptyConvertor(m_pCurrRelRes->name(), status)); - } + if (commands->commands().empty() && status == rdo::runtime::RDOResource::ConvertStatus::KEEP) + { + rdo::converter::smr2rdox::g_error().warning(convertor_pos, getWarningMessage_EmptyConvertor(m_pCurrRelRes->name(), status)); + } - for (const auto& command: commands->commands()) - addParamSetCalc(command); + for (const auto& command: commands->commands()) + addParamSetCalc(command); - ASSERT(m_pCurrRelRes); - m_pCurrRelRes->getParamSetList().reset(); + ASSERT(m_pCurrRelRes); + m_pCurrRelRes->getParamSetList().reset(); } void RDOPATPattern::addParamSetCalc(const rdo::runtime::LPRDOCalc& pCalc) { - switch (getType()) - { - case PT_IE : getPatRuntime()->addConvertorCalc(pCalc); break; - case PT_Rule : getPatRuntime()->addConvertorCalc(pCalc); break; - case PT_Operation: NEVER_REACH_HERE; - case PT_Keyboard : NEVER_REACH_HERE; - default : rdo::converter::smr2rdox::g_error().error(src_info(), "Неизвестный тип образца"); - } + switch (getType()) + { + case Type::IE : getPatRuntime()->addConvertorCalc(pCalc); break; + case Type::RULE : getPatRuntime()->addConvertorCalc(pCalc); break; + case Type::OPERATION: NEVER_REACH_HERE; + case Type::KEYBOARD : NEVER_REACH_HERE; + default : rdo::converter::smr2rdox::g_error().error(src_info(), "Неизвестный тип образца"); + } } std::string RDOPATPattern::getPatternId() const -{ - return m_pPatRuntime->traceId(); +{ + return m_pPatRuntime->traceId(); } void RDOPATPattern::writeModelStructure(std::ostream& stream) const { - stream << getPatternId() << " " << name() << " " << getModelStructureLetter() << " " << m_relResList.size(); - for (const auto& resource: m_relResList) - stream << " " << resource->getType()->getNumber(); + stream << getPatternId() << " " << name() << " " << getModelStructureLetter() << " " << m_relResList.size(); + for (const auto& resource: m_relResList) + stream << " " << resource->getType()->getNumber(); - stream << std::endl; + stream << std::endl; } LPRDOParam RDOPATPattern::findPATPatternParam(const std::string& paramName) const { - ParamList::const_iterator it = std::find_if(m_paramList.begin(), m_paramList.end(), compareName(paramName)); - return it != m_paramList.end() ? (*it) : LPRDOParam(NULL); + ParamList::const_iterator it = std::find_if(m_paramList.begin(), m_paramList.end(), compareName(paramName)); + return it != m_paramList.end() ? (*it) : LPRDOParam(NULL); } LPRDORelevantResource RDOPATPattern::findRelevantResource(const std::string& resName) const { - RelResList::const_iterator it = std::find_if(m_relResList.begin(), m_relResList.end(), compareName(resName)); - return it != m_relResList.end() ? (*it) : LPRDORelevantResource(NULL); + RelResList::const_iterator it = std::find_if(m_relResList.begin(), m_relResList.end(), compareName(resName)); + return it != m_relResList.end() ? (*it) : LPRDORelevantResource(NULL); } int RDOPATPattern::findPATPatternParamNum(const std::string& paramName) const { - ParamList::const_iterator it = std::find_if(m_paramList.begin(), m_paramList.end(), compareName(paramName)); - return it != m_paramList.end() ? it - m_paramList.begin() : -1; + ParamList::const_iterator it = std::find_if(m_paramList.begin(), m_paramList.end(), compareName(paramName)); + return it != m_paramList.end() ? it - m_paramList.begin() : -1; } std::size_t RDOPATPattern::findRelevantResourceNum(const std::string& resName) const { - RelResList::const_iterator it = std::find_if(m_relResList.begin(), m_relResList.end(), compareName(resName)); - return it != m_relResList.end() ? it - m_relResList.begin() : std::size_t(~0); + RelResList::const_iterator it = std::find_if(m_relResList.begin(), m_relResList.end(), compareName(resName)); + return it != m_relResList.end() ? it - m_relResList.begin() : std::size_t(~0); } void RDOPATPattern::add(const LPRDOParam& pParam) { - ASSERT(pParam); + ASSERT(pParam); - LPRDOParam pParamExist = findPATPatternParam(pParam->name()); - if (pParamExist) - { - rdo::converter::smr2rdox::g_error().push_only(pParam->src_info(), rdo::format("Параметр '%s' уже определен", pParam->src_text().c_str())); - rdo::converter::smr2rdox::g_error().push_only(pParamExist->src_info(), "См. первое определение"); - rdo::converter::smr2rdox::g_error().push_done(); - } - m_paramList.push_back(pParam); + LPRDOParam pParamExist = findPATPatternParam(pParam->name()); + if (pParamExist) + { + rdo::converter::smr2rdox::g_error().push_only(pParam->src_info(), rdo::format("Параметр '%s' уже определен", pParam->src_text().c_str())); + rdo::converter::smr2rdox::g_error().push_only(pParamExist->src_info(), "См. первое определение"); + rdo::converter::smr2rdox::g_error().push_done(); + } + m_paramList.push_back(pParam); } const RDOPATPattern::ParamList& RDOPATPattern::getParamList() const { - return m_paramList; + return m_paramList; } void RDOPATPattern::setCommonChoiceFirst() { - m_useCommonChoice = true; - m_pCommonChoice = NULL; -// rdo::converter::smr2rdox::g_error().error("Вызывать нельзя, т.к. в сообщениях об ошибках используется m_pCommonChoice"); + m_useCommonChoice = true; + m_pCommonChoice = NULL; +// rdo::converter::smr2rdox::g_error().error("Вызывать нельзя, т.к. в сообщениях об ошибках используется m_pCommonChoice"); } void RDOPATPattern::setCommonChoiceWithMin(const LPRDOFUNArithm& arithm) { - m_useCommonChoice = true; - m_useCommonWithMax = false; - m_pCommonChoice = arithm; + m_useCommonChoice = true; + m_useCommonWithMax = false; + m_pCommonChoice = arithm; } void RDOPATPattern::setCommonChoiceWithMax(const LPRDOFUNArithm& arithm) { - m_useCommonChoice = true; - m_useCommonWithMax = true; - m_pCommonChoice = arithm; + m_useCommonChoice = true; + m_useCommonWithMax = true; + m_pCommonChoice = arithm; } void RDOPATPattern::setTime(LPRDOFUNArithm& arithm) -{ - switch (getType()) - { - case PT_IE : getPatRuntime()->setTime(arithm->createCalc(NULL)); time = arithm; break; - case PT_Operation: getPatRuntime()->setTime(arithm->createCalc(NULL)); break; - case PT_Keyboard : getPatRuntime()->setTime(arithm->createCalc(NULL)); break; - default : rdo::converter::smr2rdox::g_error().error(src_info(), rdo::format("Для образца типа %s недопустимо использование выражения времени", typeToString(getType()).c_str())); - } +{ + switch (getType()) + { + case Type::IE : getPatRuntime()->setTime(arithm->createCalc(NULL)); time = arithm; break; + case Type::OPERATION: getPatRuntime()->setTime(arithm->createCalc(NULL)); break; + case Type::KEYBOARD : getPatRuntime()->setTime(arithm->createCalc(NULL)); break; + default : rdo::converter::smr2rdox::g_error().error(src_info(), rdo::format("Для образца типа %s недопустимо использование выражения времени", typeToString(getType()).c_str())); + } } void RDOPATPattern::addChoiceFromCalc(const rdo::runtime::LPRDOCalc& pCalc) { - switch (getType()) - { - case PT_IE : getPatRuntime()->addPreSelectRelRes(pCalc); break; - case PT_Rule : getPatRuntime()->addChoiceFromCalc (pCalc); break; - case PT_Operation: getPatRuntime()->addChoiceFromCalc (pCalc); break; - case PT_Keyboard : getPatRuntime()->addChoiceFromCalc (pCalc); break; - default : rdo::converter::smr2rdox::g_error().error(src_info(), rdo::format("Для образца типа %s недопустимо использование условния выбора", typeToString(getType()).c_str())); - } + switch (getType()) + { + case Type::IE : getPatRuntime()->addPreSelectRelRes(pCalc); break; + case Type::RULE : getPatRuntime()->addChoiceFromCalc (pCalc); break; + case Type::OPERATION: getPatRuntime()->addChoiceFromCalc (pCalc); break; + case Type::KEYBOARD : getPatRuntime()->addChoiceFromCalc (pCalc); break; + default : rdo::converter::smr2rdox::g_error().error(src_info(), rdo::format("Для образца типа %s недопустимо использование условния выбора", typeToString(getType()).c_str())); + } } void RDOPATPattern::addRelResBody(const RDOParserSrcInfo& body_name) -{ - RelResList::const_iterator it = std::find_if(m_relResList.begin(), m_relResList.end(), compareName(body_name.src_text())); - if (it == m_relResList.end()) - { - rdo::converter::smr2rdox::g_error().error(body_name.src_info(), rdo::format("Неизвестный релевантный ресурс: %s", body_name.src_text().c_str())); - } - if (findRelevantResourceNum(body_name.src_text()) != m_currentRelResIndex) - { - std::string rel_res_waiting = m_currentRelResIndex < m_relResList.size() ? m_relResList[m_currentRelResIndex]->name().c_str() : ""; - rdo::converter::smr2rdox::g_error().error(body_name.src_info(), rdo::format("Ожидается описание релевантного ресурса '%s', вместо него найдено: %s", rel_res_waiting.c_str(), body_name.src_text().c_str())); - } - if ((*it)->m_alreadyHaveConverter) - { - rdo::converter::smr2rdox::g_error().error(body_name.src_info(), rdo::format("Релевантный ресурс уже используется: %s", body_name.src_text().c_str())); - } - m_pCurrRelRes = (*it); - m_pCurrRelRes->m_bodySrcInfo = body_name; - m_pCurrRelRes->m_alreadyHaveConverter = true; - m_currentRelResIndex++; +{ + RelResList::const_iterator it = std::find_if(m_relResList.begin(), m_relResList.end(), compareName(body_name.src_text())); + if (it == m_relResList.end()) + { + rdo::converter::smr2rdox::g_error().error(body_name.src_info(), rdo::format("Неизвестный релевантный ресурс: %s", body_name.src_text().c_str())); + } + if (findRelevantResourceNum(body_name.src_text()) != m_currentRelResIndex) + { + std::string rel_res_waiting = m_currentRelResIndex < m_relResList.size() ? m_relResList[m_currentRelResIndex]->name().c_str() : ""; + rdo::converter::smr2rdox::g_error().error(body_name.src_info(), rdo::format("Ожидается описание релевантного ресурса '%s', вместо него найдено: %s", rel_res_waiting.c_str(), body_name.src_text().c_str())); + } + if ((*it)->m_alreadyHaveConverter) + { + rdo::converter::smr2rdox::g_error().error(body_name.src_info(), rdo::format("Релевантный ресурс уже используется: %s", body_name.src_text().c_str())); + } + m_pCurrRelRes = (*it); + m_pCurrRelRes->m_bodySrcInfo = body_name; + m_pCurrRelRes->m_alreadyHaveConverter = true; + m_currentRelResIndex++; } void RDOPATPattern::addRelResUsage(const LPRDOPATChoiceFrom& pChoiceFrom, const LPRDOPATChoiceOrder& pChoiceOrder) { - if (!m_useCommonChoice) - { - if (pChoiceOrder->m_type == rdo::runtime::RDOSelectResourceCalc::order_empty) - { - if ((m_pCurrRelRes->m_statusBegin != rdo::runtime::RDOResource::CS_Create) && (m_pCurrRelRes->m_statusEnd != rdo::runtime::RDOResource::CS_Create)) - { -// pChoiceOrder->m_type = rdo::runtime::RDOSelectResourceCalc::order_first; - } - } - else if (m_pCurrRelRes->isDirect()) - { - rdo::converter::smr2rdox::g_error().warning(pChoiceOrder->src_info(), rdo::format("Правило выбора '%s' релевантного ресурса '%s' не имеет смысла, т.к. релевантный ресурс определен через имя, а не тип, и не может быть связан с каким-либо другим ресурсом", pChoiceOrder->src_text().c_str(), m_pCurrRelRes->name().c_str())); - } - } - else - { - if (pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::order_empty) - { - rdo::converter::smr2rdox::g_error().push_only(pChoiceOrder->src_info(), "Нельзя указать способ выбора релевантного ресурса, т.к. используется единый для всех релевантных ресурсов способ, указанный до ключевого слова $Body"); - if (m_pCommonChoice) - { - rdo::converter::smr2rdox::g_error().push_only(m_pCommonChoice->src_info(), rdo::format("См. '%s'", m_pCommonChoice->src_text().c_str())); - } - rdo::converter::smr2rdox::g_error().push_done(); - } - } - - if ((m_pCurrRelRes->m_statusBegin == rdo::runtime::RDOResource::CS_Create) || (m_pCurrRelRes->m_statusEnd == rdo::runtime::RDOResource::CS_Create)) - { - if (pChoiceFrom->m_type != RDOPATChoiceFrom::ch_empty) - { - rdo::converter::smr2rdox::g_error().error(pChoiceFrom->src_info(), "Релевантный ресурс создается, для него нельзя использовать Choice from или Choice NoCheck"); - } - if (pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::order_empty) - { - rdo::converter::smr2rdox::g_error().error(pChoiceOrder->src_info(), rdo::format("Релевантный ресурс создается, для него нельзя использовать правило выбора '%s'", pChoiceOrder->asString().c_str())); - } - } - - m_pCurrRelRes->m_pChoiceFrom = pChoiceFrom; - m_pCurrRelRes->m_pChoiceOrder = pChoiceOrder; + if (!m_useCommonChoice) + { + if (pChoiceOrder->m_type == rdo::runtime::RDOSelectResourceCalc::Type::EMPTY) + { + if ((m_pCurrRelRes->m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::CREATE) && (m_pCurrRelRes->m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::CREATE)) + { +// pChoiceOrder->m_type = rdo::runtime::RDOSelectResourceCalc::Type::FIRST; + } + } + else if (m_pCurrRelRes->isDirect()) + { + rdo::converter::smr2rdox::g_error().warning(pChoiceOrder->src_info(), rdo::format("Правило выбора '%s' релевантного ресурса '%s' не имеет смысла, т.к. релевантный ресурс определен через имя, а не тип, и не может быть связан с каким-либо другим ресурсом", pChoiceOrder->src_text().c_str(), m_pCurrRelRes->name().c_str())); + } + } + else + { + if (pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::Type::EMPTY) + { + rdo::converter::smr2rdox::g_error().push_only(pChoiceOrder->src_info(), "Нельзя указать способ выбора релевантного ресурса, т.к. используется единый для всех релевантных ресурсов способ, указанный до ключевого слова $Body"); + if (m_pCommonChoice) + { + rdo::converter::smr2rdox::g_error().push_only(m_pCommonChoice->src_info(), rdo::format("См. '%s'", m_pCommonChoice->src_text().c_str())); + } + rdo::converter::smr2rdox::g_error().push_done(); + } + } + + if ((m_pCurrRelRes->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::CREATE) || (m_pCurrRelRes->m_statusEnd == rdo::runtime::RDOResource::ConvertStatus::CREATE)) + { + if (pChoiceFrom->m_type != RDOPATChoiceFrom::Type::EMPTY) + { + rdo::converter::smr2rdox::g_error().error(pChoiceFrom->src_info(), "Релевантный ресурс создается, для него нельзя использовать Choice from или Choice NoCheck"); + } + if (pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::Type::EMPTY) + { + rdo::converter::smr2rdox::g_error().error(pChoiceOrder->src_info(), rdo::format("Релевантный ресурс создается, для него нельзя использовать правило выбора '%s'", pChoiceOrder->asString().c_str())); + } + } + + m_pCurrRelRes->m_pChoiceFrom = pChoiceFrom; + m_pCurrRelRes->m_pChoiceOrder = pChoiceOrder; } void RDOPATPattern::end() { - int size = m_relResList.size(); - for (int i = 0; i < size; i++) - { - LPRDORelevantResource pCurrRelRes = m_relResList.at(i); - if (!pCurrRelRes->m_alreadyHaveConverter) - { - /// @todo А почему нельзя сделать warning ? Возможно, есть жесткое требование недопустить пустого рел. ресурса. - rdo::converter::smr2rdox::g_error().error(pCurrRelRes->src_info(), rdo::format("Релевантный ресурс '%s' не используется в образце '%s'", pCurrRelRes->name().c_str(), name().c_str())); - } - m_pPatRuntime->addPreSelectRelRes(pCurrRelRes->createPreSelectRelResCalc()); - } - - if (m_useCommonChoice) - { - //! first - //! Работает неправильно, а как обыкновенный first - if (!m_pCommonChoice) - { - //! first - std::vector resSelectors; - for (int i = 0; i < size; i++) - { - if (m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::CS_Keep || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::CS_Erase || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::CS_NoChange) - { - resSelectors.push_back(m_relResList.at(i)->createSelectResourceCommonChoiceCalc()); - } - } - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(resSelectors, m_useCommonWithMax, rdo::runtime::LPRDOCalc(NULL)); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText("first"); - pCalc->setSrcInfo(srcInfo); - addChoiceFromCalc(pCalc); - } - else - { - //! with_min/with_max - std::vector resSelectors; - for (int i = 0; i < size; i++) - { - if (m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::CS_Keep || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::CS_Erase || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::CS_NoChange) - { - resSelectors.push_back(m_relResList.at(i)->createSelectResourceCommonChoiceCalc()); - } - } - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(resSelectors, m_useCommonWithMax, m_pCommonChoice->createCalc()); - pCalc->setSrcInfo(m_pCommonChoice->src_info()); - addChoiceFromCalc(pCalc); - } - } - else - { - for (int i = 0; i < size; i++) - { - rdo::runtime::LPRDOCalc pCalc = m_relResList.at(i)->createSelectResourceChoiceCalc(); - addChoiceFromCalc(pCalc); - } - } + int size = m_relResList.size(); + for (int i = 0; i < size; i++) + { + LPRDORelevantResource pCurrRelRes = m_relResList.at(i); + if (!pCurrRelRes->m_alreadyHaveConverter) + { + // TODO А почему нельзя сделать warning ? Возможно, есть жесткое требование недопустить пустого рел. ресурса. + rdo::converter::smr2rdox::g_error().error(pCurrRelRes->src_info(), rdo::format("Релевантный ресурс '%s' не используется в образце '%s'", pCurrRelRes->name().c_str(), name().c_str())); + } + m_pPatRuntime->addPreSelectRelRes(pCurrRelRes->createPreSelectRelResCalc()); + } + + if (m_useCommonChoice) + { + // first + // Работает неправильно, а как обыкновенный first + if (!m_pCommonChoice) + { + // first + std::vector resSelectors; + for (int i = 0; i < size; i++) + { + if (m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::KEEP || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + { + resSelectors.push_back(m_relResList.at(i)->createSelectResourceCommonChoiceCalc()); + } + } + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(resSelectors, m_useCommonWithMax, rdo::runtime::LPRDOCalc(NULL)); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText("first"); + pCalc->setSrcInfo(srcInfo); + addChoiceFromCalc(pCalc); + } + else + { + // with_min/with_max + std::vector resSelectors; + for (int i = 0; i < size; i++) + { + if (m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::KEEP || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + { + resSelectors.push_back(m_relResList.at(i)->createSelectResourceCommonChoiceCalc()); + } + } + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(resSelectors, m_useCommonWithMax, m_pCommonChoice->createCalc()); + pCalc->setSrcInfo(m_pCommonChoice->src_info()); + addChoiceFromCalc(pCalc); + } + } + else + { + for (int i = 0; i < size; i++) + { + rdo::runtime::LPRDOCalc pCalc = m_relResList.at(i)->createSelectResourceChoiceCalc(); + addChoiceFromCalc(pCalc); + } + } } // -------------------------------------------------------------------------------- // -------------------- RDOPatternIrregEvent // -------------------------------------------------------------------------------- RDOPatternIrregEvent::RDOPatternIrregEvent(const RDOParserSrcInfo& name_src_info, bool trace) - : RDOPATPattern(name_src_info) + : RDOPATPattern(name_src_info) { - m_pPatRuntime = rdo::Factory::create(trace); - ASSERT(m_pPatRuntime); - m_pPatRuntime->setTraceID(Converter::s_converter()->getPAT_id()); + m_pPatRuntime = rdo::Factory::create(trace); + ASSERT(m_pPatRuntime); + m_pPatRuntime->setTraceID(Converter::s_converter()->getPAT_id()); } void RDOPatternIrregEvent::addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos) { - beforeRelRensert(rel_info); - if (beg == rdo::runtime::RDOResource::CS_NonExist || beg == rdo::runtime::RDOResource::CS_NoChange) - { - rdo::converter::smr2rdox::g_error().error(convertor_pos, "Статусы конверторов NonExist и NoChange не могут быть использованы в нерегулярном событии"); - } - - LPRDORelevantResource pRelevantResource; - LPRDORSSResource res = Converter::s_converter()->findRSSResource(type_info.src_text()); - if (res) - { - switch (beg) - { - case rdo::runtime::RDOResource::CS_Create: rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); break; - case rdo::runtime::RDOResource::CS_Erase : rdo::converter::smr2rdox::g_error().error(convertor_pos, "Удалять ресурсы в нерегулярном событии нельзя"); break; - default : break; - } - pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), res, beg); - ASSERT(pRelevantResource); - rel_res_insert(pRelevantResource); - } - else - { - LPRDORTPResType pResType = Converter::s_converter()->findRTPResType(type_info.src_text()); - if (!pResType) - { - rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("Неизвестный тип ресурса: %s", type_info.src_text().c_str())); - } - switch (beg) - { - case rdo::runtime::RDOResource::CS_Create: if (!pResType->isTemporary()) rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("Тип ресурса '%s' постоянный. Динамически создавать от него ресурсы нельзя", type_info.src_text().c_str())); break; - case rdo::runtime::RDOResource::CS_Keep : - case rdo::runtime::RDOResource::CS_Erase : rdo::converter::smr2rdox::g_error().error(convertor_pos, "Статусы конверторов Keep и Erase могут быть использованы в нерегулярном событии с описателем в виде ресурса, но не типа ресурса"); break; - default : break; - } - pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), pResType, beg); - ASSERT(pRelevantResource); - rel_res_insert(pRelevantResource); - } - - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Erase) - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(rel_info); - srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - getPatRuntime()->addEraseCalc(pCalc); - } + beforeRelRensert(rel_info); + if (beg == rdo::runtime::RDOResource::ConvertStatus::NONEXIST || beg == rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + { + rdo::converter::smr2rdox::g_error().error(convertor_pos, "Статусы конверторов NonExist и NoChange не могут быть использованы в нерегулярном событии"); + } + + LPRDORelevantResource pRelevantResource; + LPRDORSSResource res = Converter::s_converter()->findRSSResource(type_info.src_text()); + if (res) + { + switch (beg) + { + case rdo::runtime::RDOResource::ConvertStatus::CREATE: rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); break; + case rdo::runtime::RDOResource::ConvertStatus::ERASE : rdo::converter::smr2rdox::g_error().error(convertor_pos, "Удалять ресурсы в нерегулярном событии нельзя"); break; + default : break; + } + pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), res, beg); + ASSERT(pRelevantResource); + rel_res_insert(pRelevantResource); + } + else + { + LPRDORTPResType pResType = Converter::s_converter()->findRTPResType(type_info.src_text()); + if (!pResType) + { + rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("Неизвестный тип ресурса: %s", type_info.src_text().c_str())); + } + switch (beg) + { + case rdo::runtime::RDOResource::ConvertStatus::CREATE: if (!pResType->isTemporary()) rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("Тип ресурса '%s' постоянный. Динамически создавать от него ресурсы нельзя", type_info.src_text().c_str())); break; + case rdo::runtime::RDOResource::ConvertStatus::KEEP : + case rdo::runtime::RDOResource::ConvertStatus::ERASE : rdo::converter::smr2rdox::g_error().error(convertor_pos, "Статусы конверторов Keep и Erase могут быть использованы в нерегулярном событии с описателем в виде ресурса, но не типа ресурса"); break; + default : break; + } + pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), pResType, beg); + ASSERT(pRelevantResource); + rel_res_insert(pRelevantResource); + } + + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE) + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(rel_info); + srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + getPatRuntime()->addEraseCalc(pCalc); + } } void RDOPatternIrregEvent::addRelResUsage(const LPRDOPATChoiceFrom& pChoiceFrom, const LPRDOPATChoiceOrder& pChoiceOrder) { - if (pChoiceFrom->m_type != RDOPATChoiceFrom::ch_empty) - { - rdo::converter::smr2rdox::g_error().error(pChoiceFrom->src_info(), "Релевантные ресурсы нерегулярного события нельзя выбирать с помощью Choice from или Choice NoCheck"); - } - if (pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::order_empty) - { - rdo::converter::smr2rdox::g_error().error(pChoiceFrom->src_info(), rdo::format("Для релевантных ресурсов нерегулярного события нельзя использовать правило выбора '%s'", pChoiceOrder->asString().c_str())); - } - m_pCurrRelRes->m_pChoiceFrom = pChoiceFrom; - m_pCurrRelRes->m_pChoiceOrder = pChoiceOrder; + if (pChoiceFrom->m_type != RDOPATChoiceFrom::Type::EMPTY) + { + rdo::converter::smr2rdox::g_error().error(pChoiceFrom->src_info(), "Релевантные ресурсы нерегулярного события нельзя выбирать с помощью Choice from или Choice NoCheck"); + } + if (pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::Type::EMPTY) + { + rdo::converter::smr2rdox::g_error().error(pChoiceFrom->src_info(), rdo::format("Для релевантных ресурсов нерегулярного события нельзя использовать правило выбора '%s'", pChoiceOrder->asString().c_str())); + } + m_pCurrRelRes->m_pChoiceFrom = pChoiceFrom; + m_pCurrRelRes->m_pChoiceOrder = pChoiceOrder; } rdo::runtime::LPRDOCalc RDOPATPattern::createRelRes(bool /*trace*/) const { - std::vector params_default; - for (const auto& param: m_pCurrRelRes->getType()->getParams()) - { - if (!param->getDefault()->defined()) - { - params_default.push_back(rdo::runtime::RDOValue(0)); - if (!m_pCurrRelRes->getParamSetList().find(param->name())) - { - rdo::converter::smr2rdox::g_error().error(m_pCurrRelRes->src_info(), rdo::format("При создании ресурса необходимо определить все его параметры. Не найдено определение параметра: %s", param->name().c_str())); - } - } - else - { - params_default.push_back(param->getDefault()->value()); - } - } - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(m_pCurrRelRes->src_info()); - srcInfo.setSrcText(rdo::format("Создание временного ресурса %s", m_pCurrRelRes->name().c_str())); - pCalc->setSrcInfo(srcInfo); - return pCalc; + std::vector params_default; + for (const auto& param: m_pCurrRelRes->getType()->getParams()) + { + if (!param->getDefault()->defined()) + { + params_default.push_back(rdo::runtime::RDOValue(0)); + if (!m_pCurrRelRes->getParamSetList().find(param->name())) + { + rdo::converter::smr2rdox::g_error().error(m_pCurrRelRes->src_info(), rdo::format("При создании ресурса необходимо определить все его параметры. Не найдено определение параметра: %s", param->name().c_str())); + } + } + else + { + params_default.push_back(param->getDefault()->value()); + } + } + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(m_pCurrRelRes->src_info()); + srcInfo.setSrcText(rdo::format("Создание временного ресурса %s", m_pCurrRelRes->name().c_str())); + pCalc->setSrcInfo(srcInfo); + return pCalc; } std::string RDOPatternIrregEvent::getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) { - return rdo::format("Для релевантного ресурса '%s' не требуется конвертор (Convert_event), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); + return rdo::format("Для релевантного ресурса '%s' не требуется конвертор (Convert_event), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); } std::string RDOPatternIrregEvent::getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) { - return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор (Convert_event), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); + return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор (Convert_event), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); } // -------------------------------------------------------------------------------- // -------------------- RDOPatternRule // -------------------------------------------------------------------------------- RDOPatternRule::RDOPatternRule(const RDOParserSrcInfo& name_src_info, bool trace) - : RDOPATPattern(name_src_info) + : RDOPATPattern(name_src_info) { -// Converter::s_converter()->runtime()->addRuntimeRule((RDOPatternRule *)(m_pPatRuntime = new RDOPatternRule(Converter::s_converter()->runtime(), _trace))); - m_pPatRuntime = rdo::Factory::create(trace); - ASSERT(m_pPatRuntime); - m_pPatRuntime->setTraceID(Converter::s_converter()->getPAT_id()); +// Converter::s_converter()->runtime()->addRuntimeRule((RDOPatternRule *)(m_pPatRuntime = new RDOPatternRule(Converter::s_converter()->runtime(), _trace))); + m_pPatRuntime = rdo::Factory::create(trace); + ASSERT(m_pPatRuntime); + m_pPatRuntime->setTraceID(Converter::s_converter()->getPAT_id()); } void RDOPatternRule::addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos) { - beforeRelRensert(rel_info); - if (beg == rdo::runtime::RDOResource::CS_NonExist) - { - rdo::converter::smr2rdox::g_error().error(convertor_pos, rdo::format("Нельзя использовать статус конвертора '%s' в продукционном правиле", RDOPATPattern::StatusToStr(beg).c_str())); - } - - LPRDORelevantResource pRelevantResource; - LPRDORSSResource res = Converter::s_converter()->findRSSResource(type_info.src_text()); - if (res) - { - if (beg == rdo::runtime::RDOResource::CS_Create) - { - rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); - } - if (beg == rdo::runtime::RDOResource::CS_Erase) - { - rdo::converter::smr2rdox::g_error().error(convertor_pos, rdo::format("Недопустимый статус конвертора для ресурса: %s", RDOPATPattern::StatusToStr(beg).c_str())); - } - pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), res, beg); - ASSERT(pRelevantResource); - rel_res_insert(pRelevantResource); - } - else - { - LPRDORTPResType pResType = Converter::s_converter()->findRTPResType(type_info.src_text()); - if (!pResType) - { - rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("Неизвестный тип ресурса: %s", type_info.src_text().c_str())); - } - if (!pResType->isTemporary() && (beg == rdo::runtime::RDOResource::CS_Create || beg == rdo::runtime::RDOResource::CS_Erase)) - { - rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("Для создании или удалении ресурса его тип должен быть временным (temporary), а не постоянным (permanent), как у '%s'", type_info.src_text().c_str())); - } - pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), pResType, beg); - ASSERT(pRelevantResource); - rel_res_insert(pRelevantResource); - } - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Erase) - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(rel_info); - srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - getPatRuntime()->addEraseCalc(pCalc); - } + beforeRelRensert(rel_info); + if (beg == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + rdo::converter::smr2rdox::g_error().error(convertor_pos, rdo::format("Нельзя использовать статус конвертора '%s' в продукционном правиле", RDOPATPattern::StatusToStr(beg).c_str())); + } + + LPRDORelevantResource pRelevantResource; + LPRDORSSResource res = Converter::s_converter()->findRSSResource(type_info.src_text()); + if (res) + { + if (beg == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); + } + if (beg == rdo::runtime::RDOResource::ConvertStatus::ERASE) + { + rdo::converter::smr2rdox::g_error().error(convertor_pos, rdo::format("Недопустимый статус конвертора для ресурса: %s", RDOPATPattern::StatusToStr(beg).c_str())); + } + pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), res, beg); + ASSERT(pRelevantResource); + rel_res_insert(pRelevantResource); + } + else + { + LPRDORTPResType pResType = Converter::s_converter()->findRTPResType(type_info.src_text()); + if (!pResType) + { + rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("Неизвестный тип ресурса: %s", type_info.src_text().c_str())); + } + if (!pResType->isTemporary() && (beg == rdo::runtime::RDOResource::ConvertStatus::CREATE || beg == rdo::runtime::RDOResource::ConvertStatus::ERASE)) + { + rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("Для создании или удалении ресурса его тип должен быть временным (temporary), а не постоянным (permanent), как у '%s'", type_info.src_text().c_str())); + } + pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), pResType, beg); + ASSERT(pRelevantResource); + rel_res_insert(pRelevantResource); + } + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE) + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(rel_info); + srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + getPatRuntime()->addEraseCalc(pCalc); + } } std::string RDOPatternRule::getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) { - return rdo::format("Для релевантного ресурса '%s' не требуется конвертор (Convert_rule), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); + return rdo::format("Для релевантного ресурса '%s' не требуется конвертор (Convert_rule), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); } std::string RDOPatternRule::getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) { - return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор (Convert_rule), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); + return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор (Convert_rule), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); } // -------------------------------------------------------------------------------- // -------------------- RDOPatternOperation // -------------------------------------------------------------------------------- RDOPatternOperation::RDOPatternOperation(const RDOParserSrcInfo& name_src_info, bool trace) - : RDOPATPattern (name_src_info ) - , m_convertorType(convert_unknow) + : RDOPATPattern (name_src_info ) + , m_convertorType(ConvertorType::UNKNOWN) { - m_pPatRuntime = rdo::Factory::create(trace); - ASSERT(m_pPatRuntime); - m_pPatRuntime->setTraceID(Converter::s_converter()->getPAT_id()); + m_pPatRuntime = rdo::Factory::create(trace); + ASSERT(m_pPatRuntime); + m_pPatRuntime->setTraceID(Converter::s_converter()->getPAT_id()); } RDOPatternOperation::RDOPatternOperation(bool /*trace*/, const RDOParserSrcInfo& name_src_info) - : RDOPATPattern (name_src_info ) - , m_convertorType(convert_unknow) + : RDOPATPattern (name_src_info ) + , m_convertorType(ConvertorType::UNKNOWN) {} void RDOPatternOperation::rel_res_insert(const LPRDORelevantResource& pRelevantResource) { - ASSERT(pRelevantResource); - RDOPATPattern::rel_res_insert(pRelevantResource); - getPatRuntime()->addConvertorEndStatus(pRelevantResource->m_statusEnd); + ASSERT(pRelevantResource); + RDOPATPattern::rel_res_insert(pRelevantResource); + getPatRuntime()->addConvertorEndStatus(pRelevantResource->m_statusEnd); } void RDOPatternOperation::addRelRes(const RDOParserSrcInfo& /*rel_info*/, const RDOParserSrcInfo& /*type_info*/, rdo::runtime::RDOResource::ConvertStatus /*beg*/, const YYLTYPE& convertor_pos) { - rdo::converter::smr2rdox::g_error().error(convertor_pos, "Внутренняя ошибка парсера"); + rdo::converter::smr2rdox::g_error().error(convertor_pos, "Внутренняя ошибка парсера"); } void RDOPatternOperation::addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, rdo::runtime::RDOResource::ConvertStatus end, const YYLTYPE& convertor_begin_pos, const YYLTYPE& convertor_end_pos) { - beforeRelRensert(rel_info); - switch (beg) - { - case rdo::runtime::RDOResource::CS_Keep: - if (end != rdo::runtime::RDOResource::CS_Keep && end != rdo::runtime::RDOResource::CS_Erase && end != rdo::runtime::RDOResource::CS_NoChange) - { - rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); - } - break; - case rdo::runtime::RDOResource::CS_Create: - if (end != rdo::runtime::RDOResource::CS_Keep && end != rdo::runtime::RDOResource::CS_Erase && end != rdo::runtime::RDOResource::CS_NoChange) - { - rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); - } - break; - case rdo::runtime::RDOResource::CS_Erase: - if (end != rdo::runtime::RDOResource::CS_NonExist) - { - rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); - } - break; - case rdo::runtime::RDOResource::CS_NonExist: - if (end != rdo::runtime::RDOResource::CS_Create) - { - rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); - } - break; - case rdo::runtime::RDOResource::CS_NoChange: - if (end != rdo::runtime::RDOResource::CS_Keep && end != rdo::runtime::RDOResource::CS_Erase && end != rdo::runtime::RDOResource::CS_NoChange) - { - rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); - } - break; - default: - break; - }; - - LPRDORelevantResource pRelevantResource; - LPRDORSSResource res = Converter::s_converter()->findRSSResource(type_info.src_text()); - if (res) - { - if (beg == rdo::runtime::RDOResource::CS_Create) - { - rdo::converter::smr2rdox::g_error().error(convertor_begin_pos, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); - } - if (end == rdo::runtime::RDOResource::CS_Create) - { - rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); - } - if (beg == rdo::runtime::RDOResource::CS_Erase || beg == rdo::runtime::RDOResource::CS_NonExist) - { - rdo::converter::smr2rdox::g_error().error(convertor_begin_pos, rdo::format("Недопустимый статус конвертора начала для ресурса: %s", RDOPATPattern::StatusToStr(beg).c_str())); - } - if (end == rdo::runtime::RDOResource::CS_Erase || end == rdo::runtime::RDOResource::CS_NonExist) - { - rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Недопустимый статус конвертора конца для ресурса: %s", RDOPATPattern::StatusToStr(end).c_str())); - } - pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), res, beg, end); - ASSERT(pRelevantResource); - rel_res_insert(pRelevantResource); - } - else - { - LPRDORTPResType pResType = Converter::s_converter()->findRTPResType(type_info.src_text()); - if (!pResType) - { - rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("Неизвестный тип ресурса: %s", type_info.src_text().c_str())); - } - if (pResType->isPermanent()) - { - if (beg == rdo::runtime::RDOResource::CS_Create || beg == rdo::runtime::RDOResource::CS_Erase || beg == rdo::runtime::RDOResource::CS_NonExist) - { - rdo::converter::smr2rdox::g_error().error(convertor_begin_pos, rdo::format("Недопустимый статус конвертора начала для постоянного типа: %s", RDOPATPattern::StatusToStr(beg).c_str())); - } - if (end == rdo::runtime::RDOResource::CS_Create || end == rdo::runtime::RDOResource::CS_Erase || end == rdo::runtime::RDOResource::CS_NonExist) - { - rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Недопустимый статус конвертора конца для постоянного типа: %s", RDOPATPattern::StatusToStr(end).c_str())); - } - } - pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), pResType, beg, end); - ASSERT(pRelevantResource); - rel_res_insert(pRelevantResource); - } - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Erase) - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(rel_info); - srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - getPatRuntime()->addEraseBeginCalc(pCalc); - } - if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::CS_Erase) - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(rel_info); - srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - getPatRuntime()->addEraseEndCalc(pCalc); - } + beforeRelRensert(rel_info); + switch (beg) + { + case rdo::runtime::RDOResource::ConvertStatus::KEEP: + if (end != rdo::runtime::RDOResource::ConvertStatus::KEEP && end != rdo::runtime::RDOResource::ConvertStatus::ERASE && end != rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + { + rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); + } + break; + case rdo::runtime::RDOResource::ConvertStatus::CREATE: + if (end != rdo::runtime::RDOResource::ConvertStatus::KEEP && end != rdo::runtime::RDOResource::ConvertStatus::ERASE && end != rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + { + rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); + } + break; + case rdo::runtime::RDOResource::ConvertStatus::ERASE: + if (end != rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); + } + break; + case rdo::runtime::RDOResource::ConvertStatus::NONEXIST: + if (end != rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); + } + break; + case rdo::runtime::RDOResource::ConvertStatus::NOCHANGE: + if (end != rdo::runtime::RDOResource::ConvertStatus::KEEP && end != rdo::runtime::RDOResource::ConvertStatus::ERASE && end != rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + { + rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); + } + break; + default: + break; + }; + + LPRDORelevantResource pRelevantResource; + LPRDORSSResource res = Converter::s_converter()->findRSSResource(type_info.src_text()); + if (res) + { + if (beg == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + rdo::converter::smr2rdox::g_error().error(convertor_begin_pos, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); + } + if (end == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); + } + if (beg == rdo::runtime::RDOResource::ConvertStatus::ERASE || beg == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + rdo::converter::smr2rdox::g_error().error(convertor_begin_pos, rdo::format("Недопустимый статус конвертора начала для ресурса: %s", RDOPATPattern::StatusToStr(beg).c_str())); + } + if (end == rdo::runtime::RDOResource::ConvertStatus::ERASE || end == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Недопустимый статус конвертора конца для ресурса: %s", RDOPATPattern::StatusToStr(end).c_str())); + } + pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), res, beg, end); + ASSERT(pRelevantResource); + rel_res_insert(pRelevantResource); + } + else + { + LPRDORTPResType pResType = Converter::s_converter()->findRTPResType(type_info.src_text()); + if (!pResType) + { + rdo::converter::smr2rdox::g_error().error(type_info, rdo::format("Неизвестный тип ресурса: %s", type_info.src_text().c_str())); + } + if (pResType->isPermanent()) + { + if (beg == rdo::runtime::RDOResource::ConvertStatus::CREATE || beg == rdo::runtime::RDOResource::ConvertStatus::ERASE || beg == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + rdo::converter::smr2rdox::g_error().error(convertor_begin_pos, rdo::format("Недопустимый статус конвертора начала для постоянного типа: %s", RDOPATPattern::StatusToStr(beg).c_str())); + } + if (end == rdo::runtime::RDOResource::ConvertStatus::CREATE || end == rdo::runtime::RDOResource::ConvertStatus::ERASE || end == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + rdo::converter::smr2rdox::g_error().error(convertor_end_pos, rdo::format("Недопустимый статус конвертора конца для постоянного типа: %s", RDOPATPattern::StatusToStr(end).c_str())); + } + } + pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), pResType, beg, end); + ASSERT(pRelevantResource); + rel_res_insert(pRelevantResource); + } + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE) + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(rel_info); + srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + getPatRuntime()->addEraseBeginCalc(pCalc); + } + if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::ConvertStatus::ERASE) + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(rel_info); + srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + getPatRuntime()->addEraseEndCalc(pCalc); + } } void RDOPatternOperation::addRelResConvertBeginEnd(bool trace_begin, const LPConvertCmdList& cmd_begin, bool trace_end, const LPConvertCmdList& cmd_end, const YYLTYPE& convertor_begin_pos, const YYLTYPE& convertor_end_pos, const YYLTYPE& trace_begin_pos, const YYLTYPE& trace_end_pos) { - if (cmd_begin) - { - m_convertorType = convert_begin; - ASSERT(m_pCurrRelRes); - addRelResConvert(trace_begin, cmd_begin, convertor_begin_pos, trace_begin_pos, m_pCurrRelRes->m_statusBegin); - m_convertorType = convert_unknow; - } - if (cmd_end) - { - m_convertorType = convert_end; - ASSERT(m_pCurrRelRes); - addRelResConvert(trace_end, cmd_end, convertor_end_pos, trace_end_pos, m_pCurrRelRes->m_statusEnd); - m_convertorType = convert_unknow; - } + if (cmd_begin) + { + m_convertorType = ConvertorType::CONVERT_BEGIN; + ASSERT(m_pCurrRelRes); + addRelResConvert(trace_begin, cmd_begin, convertor_begin_pos, trace_begin_pos, m_pCurrRelRes->m_statusBegin); + m_convertorType = ConvertorType::UNKNOWN; + } + if (cmd_end) + { + m_convertorType = ConvertorType::CONVERT_END; + ASSERT(m_pCurrRelRes); + addRelResConvert(trace_end, cmd_end, convertor_end_pos, trace_end_pos, m_pCurrRelRes->m_statusEnd); + m_convertorType = ConvertorType::UNKNOWN; + } } void RDOPatternOperation::addParamSetCalc(const rdo::runtime::LPRDOCalc& pCalc) { - switch (m_convertorType) - { - case convert_begin: getPatRuntime()->addConvertorBeginCalc(pCalc); break; - case convert_end : getPatRuntime()->addConvertorEndCalc (pCalc); break; - default : NEVER_REACH_HERE; - } + switch (m_convertorType) + { + case ConvertorType::CONVERT_BEGIN: getPatRuntime()->addConvertorBeginCalc(pCalc); break; + case ConvertorType::CONVERT_END : getPatRuntime()->addConvertorEndCalc (pCalc); break; + default: NEVER_REACH_HERE; + } } std::string RDOPatternOperation::getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) { - switch (m_convertorType) - { - case convert_begin: return rdo::format("Для релевантного ресурса '%s' не требуется конвертор начала (Convert_begin), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; - case convert_end : return rdo::format("Для релевантного ресурса '%s' не требуется конвертор конца (Convert_end), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; - default : NEVER_REACH_HERE; - } - return std::string(); + switch (m_convertorType) + { + case ConvertorType::CONVERT_BEGIN: return rdo::format("Для релевантного ресурса '%s' не требуется конвертор начала (Convert_begin), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; + case ConvertorType::CONVERT_END : return rdo::format("Для релевантного ресурса '%s' не требуется конвертор конца (Convert_end), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; + default: NEVER_REACH_HERE; + } + return std::string(); } std::string RDOPatternOperation::getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) { - switch (m_convertorType) - { - case convert_begin: return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор начала (Convert_begin), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; - case convert_end : return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор конца (Convert_end), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; - default : NEVER_REACH_HERE; - } - return std::string(); + switch (m_convertorType) + { + case ConvertorType::CONVERT_BEGIN: return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор начала (Convert_begin), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; + case ConvertorType::CONVERT_END : return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор конца (Convert_end), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; + default: NEVER_REACH_HERE; + } + return std::string(); } // -------------------------------------------------------------------------------- // -------------------- RDOPatternKeyboard // -------------------------------------------------------------------------------- RDOPatternKeyboard::RDOPatternKeyboard(const RDOParserSrcInfo& name_src_info, bool trace) - : RDOPatternOperation(trace, name_src_info) + : RDOPatternOperation(trace, name_src_info) { - m_pPatRuntime = rdo::Factory::create(trace); - ASSERT(m_pPatRuntime); - m_pPatRuntime->setTraceID(Converter::s_converter()->getPAT_id()); + m_pPatRuntime = rdo::Factory::create(trace); + ASSERT(m_pPatRuntime); + m_pPatRuntime->setTraceID(Converter::s_converter()->getPAT_id()); } // -------------------------------------------------------------------------------- @@ -771,25 +771,25 @@ RDOPatternKeyboard::RDOPatternKeyboard(const RDOParserSrcInfo& name_src_info, bo // -------------------------------------------------------------------------------- rdo::runtime::LPRDOCalc RDORelevantResource::getChoiceCalc() { - if (m_pChoiceFrom && m_pChoiceFrom->m_type == RDOPATChoiceFrom::ch_from) - { - return m_pChoiceFrom->m_pLogic->getCalc(rdo::runtime::RDOType::t_int); - } - return NULL; + if (m_pChoiceFrom && m_pChoiceFrom->m_type == RDOPATChoiceFrom::Type::FROM) + { + return m_pChoiceFrom->m_pLogic->getCalc(rdo::runtime::RDOType::Type::INT); + } + return NULL; } rdo::runtime::LPRDOCalc RDORelevantResource::getSelectCalc() { - if (m_pChoiceOrder && m_pChoiceOrder->m_pArithm) - { - return m_pChoiceOrder->m_pArithm->createCalc(NULL); - } - return NULL; + if (m_pChoiceOrder && m_pChoiceOrder->m_pArithm) + { + return m_pChoiceOrder->m_pArithm->createCalc(NULL); + } + return NULL; } rdo::runtime::RDOSelectResourceCalc::Type RDORelevantResource::getSelectType() const { - return m_pChoiceOrder ? m_pChoiceOrder->m_type : rdo::runtime::RDOSelectResourceCalc::order_empty; + return m_pChoiceOrder ? m_pChoiceOrder->m_type : rdo::runtime::RDOSelectResourceCalc::Type::EMPTY; } // -------------------------------------------------------------------------------- @@ -797,37 +797,37 @@ rdo::runtime::RDOSelectResourceCalc::Type RDORelevantResource::getSelectType() c // -------------------------------------------------------------------------------- rdo::runtime::LPRDOCalc RDORelevantResourceDirect::createPreSelectRelResCalc() { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResource->getID()); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText(rdo::format("Предварительный выбор рел. ресурса %s", src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - return pCalc; + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResource->getID()); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText(rdo::format("Предварительный выбор рел. ресурса %s", src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + return pCalc; } rdo::runtime::LPRDOCalc RDORelevantResourceDirect::createSelectResourceChoiceCalc() { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResource->getID(), getChoiceCalc(), getSelectCalc(), getSelectType()); - pCalc->setSrcInfo(m_pChoiceFrom->src_info()); - return pCalc; + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResource->getID(), getChoiceCalc(), getSelectCalc(), getSelectType()); + pCalc->setSrcInfo(m_pChoiceFrom->src_info()); + return pCalc; } rdo::runtime::LPRDOCalc RDORelevantResourceDirect::createSelectFirstResourceChoiceCalc() { - return rdo::Factory::create(m_relResID, m_pResource->getID(), getChoiceCalc()); + return rdo::Factory::create(m_relResID, m_pResource->getID(), getChoiceCalc()); } rdo::runtime::LPIRDOSelectResourceCommon RDORelevantResourceDirect::createSelectResourceCommonChoiceCalc() { - rdo::runtime::LPRDOSelectResourceDirectCommonCalc pDirectCommonCalc = rdo::Factory::create(m_relResID, m_pResource->getID(), getChoiceCalc()); - rdo::runtime::LPIRDOSelectResourceCommon pSelectResourceCommon = pDirectCommonCalc.interface_cast(); - ASSERT(pSelectResourceCommon); - return pSelectResourceCommon; + rdo::runtime::LPRDOSelectResourceDirectCommonCalc pDirectCommonCalc = rdo::Factory::create(m_relResID, m_pResource->getID(), getChoiceCalc()); + rdo::runtime::LPIRDOSelectResourceCommon pSelectResourceCommon = pDirectCommonCalc.interface_cast(); + ASSERT(pSelectResourceCommon); + return pSelectResourceCommon; } -LPRDORTPResType RDORelevantResourceDirect::getType() const -{ - return m_pResource->getType(); +LPRDORTPResType RDORelevantResourceDirect::getType() const +{ + return m_pResource->getType(); } // -------------------------------------------------------------------------------- @@ -835,84 +835,84 @@ LPRDORTPResType RDORelevantResourceDirect::getType() const // -------------------------------------------------------------------------------- rdo::runtime::LPRDOCalc RDORelevantResourceByType::createPreSelectRelResCalc() { - if ((m_statusBegin != rdo::runtime::RDOResource::CS_Create) && (m_statusEnd != rdo::runtime::RDOResource::CS_Create)) - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResType->getNumber()); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText(rdo::format("Предварительный выбор рел. ресурса %s", src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - return pCalc; - } - else - { - if (m_statusBegin == rdo::runtime::RDOResource::CS_NonExist) - { - return rdo::Factory::create(m_relResID); - } - else - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(1); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText(rdo::format("Предварительный выбор рел. ресурса перед созданием %s", src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - return pCalc; - } - } + if ((m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::CREATE) && (m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::CREATE)) + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResType->getNumber()); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText(rdo::format("Предварительный выбор рел. ресурса %s", src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + return pCalc; + } + else + { + if (m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + return rdo::Factory::create(m_relResID); + } + else + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(1); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText(rdo::format("Предварительный выбор рел. ресурса перед созданием %s", src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + return pCalc; + } + } } rdo::runtime::LPRDOCalc RDORelevantResourceByType::createSelectResourceChoiceCalc() { - if ((m_statusBegin != rdo::runtime::RDOResource::CS_Create) && (m_statusEnd != rdo::runtime::RDOResource::CS_Create)) - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResType->getNumber(), getChoiceCalc(), getSelectCalc(), getSelectType()); - pCalc->setSrcInfo(m_pChoiceFrom->src_info()); - return pCalc; - } - else - { - if (m_statusBegin == rdo::runtime::RDOResource::CS_NonExist) - { - return rdo::Factory::create(m_relResID); - } - else - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(1); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText(rdo::format("Перед созданием рел. ресурса %s", src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - return pCalc; - } - } + if ((m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::CREATE) && (m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::CREATE)) + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResType->getNumber(), getChoiceCalc(), getSelectCalc(), getSelectType()); + pCalc->setSrcInfo(m_pChoiceFrom->src_info()); + return pCalc; + } + else + { + if (m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + return rdo::Factory::create(m_relResID); + } + else + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(1); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText(rdo::format("Перед созданием рел. ресурса %s", src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + return pCalc; + } + } } rdo::runtime::LPRDOCalc RDORelevantResourceByType::createSelectFirstResourceChoiceCalc() { - if ((m_statusBegin != rdo::runtime::RDOResource::CS_Create) && (m_statusEnd != rdo::runtime::RDOResource::CS_Create)) - { - return rdo::Factory::create(m_relResID, m_pResType->getNumber(), getChoiceCalc()); - } - else - { - if (m_statusBegin == rdo::runtime::RDOResource::CS_NonExist) - { - return rdo::Factory::create(m_relResID); - } - else - { - return rdo::Factory::create(1); - } - } + if ((m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::CREATE) && (m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::CREATE)) + { + return rdo::Factory::create(m_relResID, m_pResType->getNumber(), getChoiceCalc()); + } + else + { + if (m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + return rdo::Factory::create(m_relResID); + } + else + { + return rdo::Factory::create(1); + } + } } rdo::runtime::LPIRDOSelectResourceCommon RDORelevantResourceByType::createSelectResourceCommonChoiceCalc() { - rdo::runtime::LPRDOSelectResourceByTypeCommonCalc pByTypeCommonCalc = rdo::Factory::create(m_relResID, m_pResType->getNumber(), getChoiceCalc()); - rdo::runtime::LPIRDOSelectResourceCommon pSelectResourceCommon = pByTypeCommonCalc.interface_cast(); - ASSERT(pSelectResourceCommon); - return pSelectResourceCommon; + rdo::runtime::LPRDOSelectResourceByTypeCommonCalc pByTypeCommonCalc = rdo::Factory::create(m_relResID, m_pResType->getNumber(), getChoiceCalc()); + rdo::runtime::LPIRDOSelectResourceCommon pSelectResourceCommon = pByTypeCommonCalc.interface_cast(); + ASSERT(pSelectResourceCommon); + return pSelectResourceCommon; } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdopat.h b/converter/smr2rdox/rdopat.h index 4875d1b1b..7069a8400 100644 --- a/converter/smr2rdox/rdopat.h +++ b/converter/smr2rdox/rdopat.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOPAT_H_ -#define _CONVERTOR_RDOPAT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -32,19 +31,19 @@ class ConvertCmdList: public rdo::counter_reference { DECLARE_FACTORY(ConvertCmdList) public: - typedef std::vector CalcList; + typedef std::vector CalcList; - void insertCommand(const rdo::runtime::LPRDOCalc& pCalc) - { - m_calcList.push_back(pCalc); - } - const CalcList& commands() const - { - return m_calcList; - } + void insertCommand(const rdo::runtime::LPRDOCalc& pCalc) + { + m_calcList.push_back(pCalc); + } + const CalcList& commands() const + { + return m_calcList; + } private: - CalcList m_calcList; + CalcList m_calcList; }; // -------------------------------------------------------------------------------- @@ -56,109 +55,109 @@ PREDECLARE_POINTER(RDORelevantResource); PREDECLARE_POINTER(RDOPATPattern); class RDOPATPattern - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOPATPattern) friend class RDOOPROperation; friend class RDODPTActivity; public: - enum PatType - { - PT_IE, - PT_Rule, - PT_Operation, - PT_Keyboard - }; - virtual PatType getType() const = 0; - - typedef std::vector RelResList; - - bool isHaveConvertEnd() const { return getType() == PT_Operation || getType() == PT_Keyboard; } - - const rdo::runtime::LPRDOPattern& getPatRuntime() const { return m_pPatRuntime; } - template - rdo::intrusive_ptr getPatRuntime() const - { - rdo::intrusive_ptr pPatRuntime = m_pPatRuntime.object_static_cast(); - ASSERT(pPatRuntime); - return pPatRuntime; - } - - static std::string StatusToStr(rdo::runtime::RDOResource::ConvertStatus value); - rdo::runtime::RDOResource::ConvertStatus StrToStatus(const std::string& value, const YYLTYPE& convertor_pos); - - RelResList::const_iterator rel_res_begin () const { return m_relResList.begin(); } - RelResList::const_iterator rel_res_end () const { return m_relResList.end(); } - int rel_res_count () const { return m_relResList.size(); } - virtual void rel_res_insert(const LPRDORelevantResource& pRelevantResource); - - void beforeRelRensert(const RDOParserSrcInfo& rel_info); - - LPRDORelevantResource m_pCurrRelRes; - - LPRDOFUNArithm time; - - void add(const LPRDOParam& pParam); - LPRDOParam findPATPatternParam(const std::string& paramName) const; - int findPATPatternParamNum(const std::string& paramName) const; - LPRDORelevantResource findRelevantResource(const std::string& resName) const; - std::size_t findRelevantResourceNum(const std::string& resName) const; - virtual void addRelRes (const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos) = 0; - - const std::string& name() const { return src_text(); } - - typedef std::vector ParamList; - const ParamList& getParamList() const; - - void setCommonChoiceFirst(); - void setCommonChoiceWithMin(const LPRDOFUNArithm& arithm); - void setCommonChoiceWithMax(const LPRDOFUNArithm& arithm); - void setTime (LPRDOFUNArithm& arithm); - void addRelResBody (const RDOParserSrcInfo& body_name); - virtual void addRelResUsage(const LPRDOPATChoiceFrom& pChoiceFrom, const LPRDOPATChoiceOrder& pChoiceOrder); - void addRelResConvert(bool trace, const LPConvertCmdList& commands, const YYLTYPE& convertor_pos, const YYLTYPE& trace_pos, rdo::runtime::RDOResource::ConvertStatus status); - void end (); - - void writeModelStructure(std::ostream& stream) const; - virtual char getModelStructureLetter() const = 0; - std::string getPatternId() const; + enum class Type + { + IE, + RULE, + OPERATION, + KEYBOARD + }; + virtual Type getType() const = 0; + + typedef std::vector RelResList; + + bool isHaveConvertEnd() const { return getType() == Type::OPERATION || getType() == Type::KEYBOARD; } + + const rdo::runtime::LPRDOPattern& getPatRuntime() const { return m_pPatRuntime; } + template + rdo::intrusive_ptr getPatRuntime() const + { + rdo::intrusive_ptr pPatRuntime = m_pPatRuntime.object_static_cast(); + ASSERT(pPatRuntime); + return pPatRuntime; + } + + static std::string StatusToStr(rdo::runtime::RDOResource::ConvertStatus value); + rdo::runtime::RDOResource::ConvertStatus StrToStatus(const std::string& value, const YYLTYPE& convertor_pos); + + RelResList::const_iterator rel_res_begin () const { return m_relResList.begin(); } + RelResList::const_iterator rel_res_end () const { return m_relResList.end(); } + int rel_res_count () const { return m_relResList.size(); } + virtual void rel_res_insert(const LPRDORelevantResource& pRelevantResource); + + void beforeRelRensert(const RDOParserSrcInfo& rel_info); + + LPRDORelevantResource m_pCurrRelRes; + + LPRDOFUNArithm time; + + void add(const LPRDOParam& pParam); + LPRDOParam findPATPatternParam(const std::string& paramName) const; + int findPATPatternParamNum(const std::string& paramName) const; + LPRDORelevantResource findRelevantResource(const std::string& resName) const; + std::size_t findRelevantResourceNum(const std::string& resName) const; + virtual void addRelRes (const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos) = 0; + + const std::string& name() const { return src_text(); } + + typedef std::vector ParamList; + const ParamList& getParamList() const; + + void setCommonChoiceFirst(); + void setCommonChoiceWithMin(const LPRDOFUNArithm& arithm); + void setCommonChoiceWithMax(const LPRDOFUNArithm& arithm); + void setTime (LPRDOFUNArithm& arithm); + void addRelResBody (const RDOParserSrcInfo& body_name); + virtual void addRelResUsage(const LPRDOPATChoiceFrom& pChoiceFrom, const LPRDOPATChoiceOrder& pChoiceOrder); + void addRelResConvert(bool trace, const LPConvertCmdList& commands, const YYLTYPE& convertor_pos, const YYLTYPE& trace_pos, rdo::runtime::RDOResource::ConvertStatus status); + void end (); + + void writeModelStructure(std::ostream& stream) const; + virtual char getModelStructureLetter() const = 0; + std::string getPatternId() const; protected: - RDOPATPattern(const RDOParserSrcInfo& name_src_info); - virtual ~RDOPATPattern() - {} + RDOPATPattern(const RDOParserSrcInfo& name_src_info); + virtual ~RDOPATPattern() + {} - rdo::runtime::LPRDOPattern m_pPatRuntime; + rdo::runtime::LPRDOPattern m_pPatRuntime; - rdo::runtime::LPRDOCalc createRelRes (bool trace) const; - virtual void addParamSetCalc(const rdo::runtime::LPRDOCalc& pCalc); + rdo::runtime::LPRDOCalc createRelRes (bool trace) const; + virtual void addParamSetCalc(const rdo::runtime::LPRDOCalc& pCalc); - virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) = 0; - virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) = 0; + virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) = 0; + virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) = 0; private: - ParamList m_paramList; - RelResList m_relResList; - bool m_useCommonChoice; - bool m_useCommonWithMax; - LPRDOFUNArithm m_pCommonChoice; - std::size_t m_currentRelResIndex; - - std::string typeToString(PatType type) - { - switch (type) - { - case PT_IE : return "нерегулярное событие"; - case PT_Rule : return "продукционное правило"; - case PT_Operation: return "операция"; - case PT_Keyboard : return "клавиатурная операция"; - default : return "неизвестный"; - } - } - - void addChoiceFromCalc(const rdo::runtime::LPRDOCalc& pCalc); + ParamList m_paramList; + RelResList m_relResList; + bool m_useCommonChoice; + bool m_useCommonWithMax; + LPRDOFUNArithm m_pCommonChoice; + std::size_t m_currentRelResIndex; + + std::string typeToString(Type type) + { + switch (type) + { + case Type::IE : return "нерегулярное событие"; + case Type::RULE : return "продукционное правило"; + case Type::OPERATION: return "операция"; + case Type::KEYBOARD : return "клавиатурная операция"; + default : return "неизвестный"; + } + } + + void addChoiceFromCalc(const rdo::runtime::LPRDOCalc& pCalc); }; // -------------------------------------------------------------------------------- @@ -168,24 +167,24 @@ class RDOPatternIrregEvent: public RDOPATPattern { DECLARE_FACTORY(RDOPatternIrregEvent) public: - virtual void addRelRes (const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos); - virtual void addRelResUsage(const LPRDOPATChoiceFrom& pChoiceFrom, const LPRDOPATChoiceOrder& pChoiceOrder); - - virtual char getModelStructureLetter() const - { - return 'I'; - }; - virtual PatType getType() const - { - return PT_IE; - } + virtual void addRelRes (const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos); + virtual void addRelResUsage(const LPRDOPATChoiceFrom& pChoiceFrom, const LPRDOPATChoiceOrder& pChoiceOrder); + + virtual char getModelStructureLetter() const + { + return 'I'; + } + virtual Type getType() const + { + return Type::IE; + } protected: - virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); - virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); + virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); + virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); private: - RDOPatternIrregEvent(const RDOParserSrcInfo& name_src_info, bool trace); + RDOPatternIrregEvent(const RDOParserSrcInfo& name_src_info, bool trace); }; // -------------------------------------------------------------------------------- @@ -195,23 +194,23 @@ class RDOPatternRule: public RDOPATPattern { DECLARE_FACTORY(RDOPatternRule) public: - virtual void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos); + virtual void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos); - virtual char getModelStructureLetter() const - { - return 'R'; - }; - virtual PatType getType() const - { - return PT_Rule; - } + virtual char getModelStructureLetter() const + { + return 'R'; + } + virtual Type getType() const + { + return Type::RULE; + } protected: - virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); - virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); + virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); + virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); private: - RDOPatternRule(const RDOParserSrcInfo& name_src_info, bool trace); + RDOPatternRule(const RDOParserSrcInfo& name_src_info, bool trace); }; // -------------------------------------------------------------------------------- @@ -221,39 +220,39 @@ class RDOPatternOperation: public RDOPATPattern { DECLARE_FACTORY(RDOPatternOperation) public: - virtual void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos); - void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, rdo::runtime::RDOResource::ConvertStatus end, const YYLTYPE& convertor_begin_pos, const YYLTYPE& convertor_end_pos); - void addRelResConvertBeginEnd(bool trace_begin, const LPConvertCmdList& cmd_begin, bool trace_end, const LPConvertCmdList& cmd_end, const YYLTYPE& convertor_begin_pos, const YYLTYPE& convertor_end_pos, const YYLTYPE& trace_begin_pos, const YYLTYPE& trace_end_pos); - - virtual char getModelStructureLetter() const - { - return 'A'; - }; - virtual PatType getType() const - { - return PT_Operation; - } + virtual void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos); + void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, rdo::runtime::RDOResource::ConvertStatus end, const YYLTYPE& convertor_begin_pos, const YYLTYPE& convertor_end_pos); + void addRelResConvertBeginEnd(bool trace_begin, const LPConvertCmdList& cmd_begin, bool trace_end, const LPConvertCmdList& cmd_end, const YYLTYPE& convertor_begin_pos, const YYLTYPE& convertor_end_pos, const YYLTYPE& trace_begin_pos, const YYLTYPE& trace_end_pos); + + virtual char getModelStructureLetter() const + { + return 'A'; + } + virtual Type getType() const + { + return Type::OPERATION; + } protected: - //! Конструктор вызывается из RDOPatternKeyboard - RDOPatternOperation(bool trace, const RDOParserSrcInfo& name_src_info); + // Конструктор вызывается из RDOPatternKeyboard + RDOPatternOperation(bool trace, const RDOParserSrcInfo& name_src_info); - virtual void rel_res_insert (const LPRDORelevantResource& pRelevantResource); - virtual void addParamSetCalc(const rdo::runtime::LPRDOCalc& pCalc ); + virtual void rel_res_insert (const LPRDORelevantResource& pRelevantResource); + virtual void addParamSetCalc(const rdo::runtime::LPRDOCalc& pCalc ); - virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); - virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); + virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); + virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); private: - RDOPatternOperation(const RDOParserSrcInfo& name_src_info, bool trace); - - enum ConvertorType - { - convert_unknow, - convert_begin, - convert_end - }; - ConvertorType m_convertorType; + RDOPatternOperation(const RDOParserSrcInfo& name_src_info, bool trace); + + enum class ConvertorType + { + UNKNOWN, + CONVERT_BEGIN, + CONVERT_END + }; + ConvertorType m_convertorType; }; // -------------------------------------------------------------------------------- @@ -263,17 +262,17 @@ class RDOPatternKeyboard: public RDOPatternOperation { DECLARE_FACTORY(RDOPatternKeyboard) public: - virtual char getModelStructureLetter() const - { - return 'K'; - }; - virtual PatType getType() const - { - return PT_Keyboard; - } + virtual char getModelStructureLetter() const + { + return 'K'; + } + virtual Type getType() const + { + return Type::KEYBOARD; + } private: - RDOPatternKeyboard(const RDOParserSrcInfo& name_src_info, bool trace); + RDOPatternKeyboard(const RDOParserSrcInfo& name_src_info, bool trace); }; // -------------------------------------------------------------------------------- @@ -281,100 +280,105 @@ DECLARE_FACTORY(RDOPatternKeyboard) // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDORelevantResource); class RDORelevantResource - : public rdo::counter_reference - , public RDOParserSrcInfo - , public boost::noncopyable + : public rdo::counter_reference + , public RDOParserSrcInfo + , private boost::noncopyable { DECLARE_FACTORY(RDORelevantResource) public: - int m_relResID; - bool m_alreadyHaveConverter; - LPRDOPATChoiceFrom m_pChoiceFrom; - LPRDOPATChoiceOrder m_pChoiceOrder; - RDOParserSrcInfo m_bodySrcInfo; - - const rdo::runtime::RDOResource::ConvertStatus m_statusBegin; - const rdo::runtime::RDOResource::ConvertStatus m_statusEnd; - - enum - { - stateNone = 0, - choiceEmpty, - choiceNoCheck, - choiceFrom, - choiceOrderEmpty, - choiceOrderFirst, - choiceOrderWithMin, - choiceOrderWithMax, - convertBegin, - convertEnd - } m_currentState; - bool isChoiceFromState() const { return m_currentState == choiceEmpty || m_currentState == choiceNoCheck || m_currentState == choiceFrom; } - - const std::string& name() const { return src_text(); }; - virtual LPRDORTPResType getType() const = 0; - - virtual rdo::runtime::LPRDOCalc createPreSelectRelResCalc () = 0; //! Предварительный выбор ресурсов в самом списке рел. ресурсов - virtual rdo::runtime::LPRDOCalc createSelectResourceChoiceCalc () = 0; //! Самый обыкновенный choice from + first/with_min/with_max - virtual rdo::runtime::LPRDOCalc createSelectFirstResourceChoiceCalc () = 0; //! common first, который не пашет - virtual rdo::runtime::LPIRDOSelectResourceCommon createSelectResourceCommonChoiceCalc() = 0; //! common with_min/with_max - - virtual bool isDirect() const = 0; - - class ParamSetList - { - public: - void reset() - { - m_list.clear(); - } - void insert(const LPRDORTPParam& param) - { - m_list.push_back(param); - } - bool find(const std::string& name) const - { - for (const auto& param: m_list) - { - if (param->name() == name) - return true; - } - return false; - } - bool empty() const - { - return m_list.empty(); - } - private: - typedef std::vector List; - - List m_list; - }; - const ParamSetList& getParamSetList() const - { - return m_paramSetList; - } - ParamSetList& getParamSetList() - { - return m_paramSetList; - } + int m_relResID; + bool m_alreadyHaveConverter; + LPRDOPATChoiceFrom m_pChoiceFrom; + LPRDOPATChoiceOrder m_pChoiceOrder; + RDOParserSrcInfo m_bodySrcInfo; + + const rdo::runtime::RDOResource::ConvertStatus m_statusBegin; + const rdo::runtime::RDOResource::ConvertStatus m_statusEnd; + + enum class State + { + NONE = 0, + EMPTY, + CHOICE_NOCHECK, + CHOICE_FROM, + CHOICE_ORDER_EMPTY, + CHOICE_ORDER_FIRST, + CHOICE_ORDER_WITH_MIN, + CHOICE_ORDER_WITH_MAX, + CONVERT_BEGIN, + CONVERT_END + }; + State m_currentState; + + bool isChoiceFromState() const + { + return m_currentState == State::EMPTY || m_currentState == State::CHOICE_NOCHECK || m_currentState == State::CHOICE_FROM; + } + + const std::string& name() const { return src_text(); } + virtual LPRDORTPResType getType() const = 0; + + virtual rdo::runtime::LPRDOCalc createPreSelectRelResCalc () = 0; // Предварительный выбор ресурсов в самом списке рел. ресурсов + virtual rdo::runtime::LPRDOCalc createSelectResourceChoiceCalc () = 0; // Самый обыкновенный choice from + first/with_min/with_max + virtual rdo::runtime::LPRDOCalc createSelectFirstResourceChoiceCalc () = 0; // common first, который не пашет + virtual rdo::runtime::LPIRDOSelectResourceCommon createSelectResourceCommonChoiceCalc() = 0; // common with_min/with_max + + virtual bool isDirect() const = 0; + + class ParamSetList + { + public: + void reset() + { + m_list.clear(); + } + void insert(const LPRDORTPParam& param) + { + m_list.push_back(param); + } + bool find(const std::string& name) const + { + for (const auto& param: m_list) + { + if (param->name() == name) + return true; + } + return false; + } + bool empty() const + { + return m_list.empty(); + } + private: + typedef std::vector List; + + List m_list; + }; + const ParamSetList& getParamSetList() const + { + return m_paramSetList; + } + ParamSetList& getParamSetList() + { + return m_paramSetList; + } protected: - RDORelevantResource(const RDOParserSrcInfo& src_info, const int relResID, const rdo::runtime::RDOResource::ConvertStatus statusBegin, const rdo::runtime::RDOResource::ConvertStatus statusEnd) - : RDOParserSrcInfo (src_info ) - , m_relResID (relResID ) - , m_alreadyHaveConverter(false ) - , m_statusBegin (statusBegin) - , m_statusEnd (statusEnd ) - , m_currentState (stateNone ) - {} - - rdo::runtime::LPRDOCalc getChoiceCalc(); - rdo::runtime::LPRDOCalc getSelectCalc(); - rdo::runtime::RDOSelectResourceCalc::Type getSelectType() const; + RDORelevantResource(const RDOParserSrcInfo& src_info, const int relResID, const rdo::runtime::RDOResource::ConvertStatus statusBegin, const rdo::runtime::RDOResource::ConvertStatus statusEnd) + : RDOParserSrcInfo (src_info) + , m_relResID (relResID) + , m_alreadyHaveConverter(false) + , m_statusBegin (statusBegin) + , m_statusEnd (statusEnd) + , m_currentState (State::NONE) + {} + + rdo::runtime::LPRDOCalc getChoiceCalc(); + rdo::runtime::LPRDOCalc getSelectCalc(); + rdo::runtime::RDOSelectResourceCalc::Type getSelectType() const; private: - ParamSetList m_paramSetList; + ParamSetList m_paramSetList; }; // -------------------------------------------------------------------------------- @@ -382,26 +386,27 @@ DECLARE_FACTORY(RDORelevantResource) // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOPATChoiceFrom); class RDOPATChoiceFrom - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOPATChoiceFrom) public: - enum Type - { - ch_empty = 0, - ch_nocheck, - ch_from - } m_type; + enum class Type + { + EMPTY = 0, + NOCHECK, + FROM + }; + Type m_type; - LPRDOFUNLogic m_pLogic; + LPRDOFUNLogic m_pLogic; private: - RDOPATChoiceFrom(const RDOParserSrcInfo& src_info, Type type, const LPRDOFUNLogic& pLogic = NULL) - : RDOParserSrcInfo(src_info) - , m_type (type ) - , m_pLogic (pLogic ) - {} + RDOPATChoiceFrom(const RDOParserSrcInfo& src_info, Type type, const LPRDOFUNLogic& pLogic = NULL) + : RDOParserSrcInfo(src_info) + , m_type (type ) + , m_pLogic (pLogic ) + {} }; // -------------------------------------------------------------------------------- @@ -409,34 +414,34 @@ DECLARE_FACTORY(RDOPATChoiceFrom) // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOPATChoiceOrder); class RDOPATChoiceOrder - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOPATChoiceOrder) public: - rdo::runtime::RDOSelectResourceCalc::Type m_type; - - LPRDOFUNArithm m_pArithm; - - std::string asString() const - { - switch (m_type) - { - case rdo::runtime::RDOSelectResourceCalc::order_empty : return "<правило_выбора_не_указано>"; - case rdo::runtime::RDOSelectResourceCalc::order_first : return "first"; - case rdo::runtime::RDOSelectResourceCalc::order_with_min: return "with_min"; - case rdo::runtime::RDOSelectResourceCalc::order_with_max: return "with_max"; - default : NEVER_REACH_HERE; - } - return std::string(); - } + rdo::runtime::RDOSelectResourceCalc::Type m_type; + + LPRDOFUNArithm m_pArithm; + + std::string asString() const + { + switch (m_type) + { + case rdo::runtime::RDOSelectResourceCalc::Type::EMPTY : return "<правило_выбора_не_указано>"; + case rdo::runtime::RDOSelectResourceCalc::Type::FIRST : return "first"; + case rdo::runtime::RDOSelectResourceCalc::Type::WITH_MIN: return "with_min"; + case rdo::runtime::RDOSelectResourceCalc::Type::WITH_MAX: return "with_max"; + default : NEVER_REACH_HERE; + } + return std::string(); + } private: - RDOPATChoiceOrder(const RDOParserSrcInfo& src_info, rdo::runtime::RDOSelectResourceCalc::Type type, const LPRDOFUNArithm& pArithm = NULL) - : RDOParserSrcInfo(src_info) - , m_type (type ) - , m_pArithm (pArithm ) - {} + RDOPATChoiceOrder(const RDOParserSrcInfo& src_info, rdo::runtime::RDOSelectResourceCalc::Type type, const LPRDOFUNArithm& pArithm = NULL) + : RDOParserSrcInfo(src_info) + , m_type (type ) + , m_pArithm (pArithm ) + {} }; // -------------------------------------------------------------------------------- @@ -446,22 +451,22 @@ class RDORelevantResourceDirect: public RDORelevantResource { DECLARE_FACTORY(RDORelevantResourceDirect) public: - LPRDORSSResource getResource() const { return m_pResource; } + LPRDORSSResource getResource() const { return m_pResource; } - virtual LPRDORTPResType getType () const; - virtual rdo::runtime::LPRDOCalc createPreSelectRelResCalc (); - virtual rdo::runtime::LPRDOCalc createSelectFirstResourceChoiceCalc (); - virtual rdo::runtime::LPRDOCalc createSelectResourceChoiceCalc (); - virtual rdo::runtime::LPIRDOSelectResourceCommon createSelectResourceCommonChoiceCalc(); - virtual bool isDirect() const { return true; } + virtual LPRDORTPResType getType () const; + virtual rdo::runtime::LPRDOCalc createPreSelectRelResCalc (); + virtual rdo::runtime::LPRDOCalc createSelectFirstResourceChoiceCalc (); + virtual rdo::runtime::LPRDOCalc createSelectResourceChoiceCalc (); + virtual rdo::runtime::LPIRDOSelectResourceCommon createSelectResourceCommonChoiceCalc(); + virtual bool isDirect() const { return true; } private: - RDORelevantResourceDirect(const RDOParserSrcInfo& src_info, const int relResID, const LPRDORSSResource& pResource, const rdo::runtime::RDOResource::ConvertStatus statusBegin, const rdo::runtime::RDOResource::ConvertStatus statusEnd = rdo::runtime::RDOResource::CS_NoChange) - : RDORelevantResource(src_info, relResID, statusBegin, statusEnd) - , m_pResource (pResource) - {} + RDORelevantResourceDirect(const RDOParserSrcInfo& src_info, const int relResID, const LPRDORSSResource& pResource, const rdo::runtime::RDOResource::ConvertStatus statusBegin, const rdo::runtime::RDOResource::ConvertStatus statusEnd = rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + : RDORelevantResource(src_info, relResID, statusBegin, statusEnd) + , m_pResource (pResource) + {} - LPRDORSSResource m_pResource; + LPRDORSSResource m_pResource; }; // -------------------------------------------------------------------------------- @@ -471,25 +476,23 @@ class RDORelevantResourceByType: public RDORelevantResource { DECLARE_FACTORY(RDORelevantResourceByType) public: - virtual LPRDORTPResType getType() const - { - return m_pResType; - } - virtual rdo::runtime::LPRDOCalc createPreSelectRelResCalc (); - virtual rdo::runtime::LPRDOCalc createSelectFirstResourceChoiceCalc (); - virtual rdo::runtime::LPRDOCalc createSelectResourceChoiceCalc (); - virtual rdo::runtime::LPIRDOSelectResourceCommon createSelectResourceCommonChoiceCalc(); - virtual bool isDirect() const { return false; } + virtual LPRDORTPResType getType() const + { + return m_pResType; + } + virtual rdo::runtime::LPRDOCalc createPreSelectRelResCalc (); + virtual rdo::runtime::LPRDOCalc createSelectFirstResourceChoiceCalc (); + virtual rdo::runtime::LPRDOCalc createSelectResourceChoiceCalc (); + virtual rdo::runtime::LPIRDOSelectResourceCommon createSelectResourceCommonChoiceCalc(); + virtual bool isDirect() const { return false; } private: - RDORelevantResourceByType(const RDOParserSrcInfo& src_info, const int relResID, LPRDORTPResType pResType, const rdo::runtime::RDOResource::ConvertStatus statusBegin, const rdo::runtime::RDOResource::ConvertStatus statusEnd = rdo::runtime::RDOResource::CS_NoChange) - : RDORelevantResource(src_info, relResID, statusBegin, statusEnd) - , m_pResType (pResType) - {} + RDORelevantResourceByType(const RDOParserSrcInfo& src_info, const int relResID, LPRDORTPResType pResType, const rdo::runtime::RDOResource::ConvertStatus statusBegin, const rdo::runtime::RDOResource::ConvertStatus statusEnd = rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + : RDORelevantResource(src_info, relResID, statusBegin, statusEnd) + , m_pResType (pResType) + {} - LPRDORTPResType m_pResType; + LPRDORTPResType m_pResType; }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOPAT_H_ diff --git a/converter/smr2rdox/rdopmd.cpp b/converter/smr2rdox/rdopmd.cpp index 9202fdbf5..4ab0c170a 100644 --- a/converter/smr2rdox/rdopmd.cpp +++ b/converter/smr2rdox/rdopmd.cpp @@ -15,9 +15,9 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE int cnv_pmdlex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void cnv_pmderror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -27,15 +27,15 @@ void cnv_pmderror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) // -------------------- RDOPMDResult // -------------------------------------------------------------------------------- RDOPMDResult::RDOPMDResult(const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) + : RDOParserSrcInfo(src_info) { - LPRDOPMDResult pResult = Converter::s_converter()->findPMDResult(src_text()); - if (pResult) - { - Converter::s_converter()->error().push_only(this->src_info(), rdo::format("Показатель '%s' уже существует", src_text().c_str())); - Converter::s_converter()->error().push_only(pResult->src_info(), "См. первое определение"); - Converter::s_converter()->error().push_done(); - } + LPRDOPMDResult pResult = Converter::s_converter()->findPMDResult(src_text()); + if (pResult) + { + Converter::s_converter()->error().push_only(this->src_info(), rdo::format("Показатель '%s' уже существует", src_text().c_str())); + Converter::s_converter()->error().push_only(pResult->src_info(), "См. первое определение"); + Converter::s_converter()->error().push_done(); + } } RDOPMDResult::~RDOPMDResult() @@ -43,147 +43,147 @@ RDOPMDResult::~RDOPMDResult() void RDOPMDResult::endOfCreation(const LPIResult& pResult) { - m_pResult = pResult; - LPITrace trace = m_pResult.object_dynamic_cast(); - if (trace) - { - trace->setTraceID(Converter::s_converter()->getPMD_id()); - } - Converter::s_converter()->insertPMDResult(this); - /// @todo перенести в конструктор rdo::runtime::RDOPMDResult - Converter::s_converter()->runtime()->addRuntimeResult(m_pResult); + m_pResult = pResult; + LPITrace trace = m_pResult.object_dynamic_cast(); + if (trace) + { + trace->setTraceID(Converter::s_converter()->getPMD_id()); + } + Converter::s_converter()->insertPMDResult(this); + // TODO перенести в конструктор rdo::runtime::RDOPMDResult + Converter::s_converter()->runtime()->addRuntimeResult(m_pResult); } // -------------------------------------------------------------------------------- // -------------------- RDOPMDWatchPar // -------------------------------------------------------------------------------- RDOPMDWatchPar::RDOPMDWatchPar(const RDOParserSrcInfo& src_info, bool trace, const RDOParserSrcInfo& res_src_info, const RDOParserSrcInfo& par_src_info) - : RDOPMDResult(src_info) + : RDOPMDResult(src_info) { - LPRDORSSResource pResource = Converter::s_converter()->findRSSResource(res_src_info.src_text()); - if (!pResource) - { - Converter::s_converter()->error().error(res_src_info, rdo::format("Ресурс '%s' не найден", res_src_info.src_text().c_str())); - } + LPRDORSSResource pResource = Converter::s_converter()->findRSSResource(res_src_info.src_text()); + if (!pResource) + { + Converter::s_converter()->error().error(res_src_info, rdo::format("Ресурс '%s' не найден", res_src_info.src_text().c_str())); + } /* - if (!pResource->getType()->isPermanent()) - { - Converter::s_converter()->error().push_only(res_src_info, "Наблюдать (watch_par) можно только за параметром постоянного ресурса"); - Converter::s_converter()->error().push_only(pResource->getType()->src_info(), "См. тип ресурса"); - Converter::s_converter()->error().push_done(); - } + if (!pResource->getType()->isPermanent()) + { + Converter::s_converter()->error().push_only(res_src_info, "Наблюдать (watch_par) можно только за параметром постоянного ресурса"); + Converter::s_converter()->error().push_only(pResource->getType()->src_info(), "См. тип ресурса"); + Converter::s_converter()->error().push_done(); + } */ - LPRDORTPParam pParam = pResource->getType()->findRTPParam(par_src_info.src_text()); - if (!pParam) - { - Converter::s_converter()->error().push_only(par_src_info, rdo::format("Параметр '%s' не найден", par_src_info.src_text().c_str())); - Converter::s_converter()->error().push_only(pResource->src_info(), "См. ресурс"); - Converter::s_converter()->error().push_only(pResource->getType()->src_info(), "См. тип ресурса"); - Converter::s_converter()->error().push_done(); - } - rdo::runtime::RDOType::TypeID typeID = pParam->getType()->type()->typeID(); - if (typeID != rdo::runtime::RDOType::t_int && typeID != rdo::runtime::RDOType::t_real) - { - Converter::s_converter()->error().push_only(par_src_info, "Наблюдать можно только за параметром целого или вещественного типа"); - Converter::s_converter()->error().push_only(pParam->getType()->src_info(), "См. тип параметра"); - Converter::s_converter()->error().push_done(); - } - - rdo::runtime::LPRDOCalcConst pResID = rdo::Factory::create(rdo::runtime::RDOValue(pResource->getID())); - endOfCreation(rdo::Factory::create(Converter::s_converter()->runtime(), src_text(), trace, res_src_info.src_text(), par_src_info.src_text(), pResID, pResource->getType()->getRTPParamNumber(par_src_info.src_text()))); + LPRDORTPParam pParam = pResource->getType()->findRTPParam(par_src_info.src_text()); + if (!pParam) + { + Converter::s_converter()->error().push_only(par_src_info, rdo::format("Параметр '%s' не найден", par_src_info.src_text().c_str())); + Converter::s_converter()->error().push_only(pResource->src_info(), "См. ресурс"); + Converter::s_converter()->error().push_only(pResource->getType()->src_info(), "См. тип ресурса"); + Converter::s_converter()->error().push_done(); + } + rdo::runtime::RDOType::Type typeID = pParam->getType()->type()->typeID(); + if (typeID != rdo::runtime::RDOType::Type::INT && typeID != rdo::runtime::RDOType::Type::REAL) + { + Converter::s_converter()->error().push_only(par_src_info, "Наблюдать можно только за параметром целого или вещественного типа"); + Converter::s_converter()->error().push_only(pParam->getType()->src_info(), "См. тип параметра"); + Converter::s_converter()->error().push_done(); + } + + rdo::runtime::LPRDOCalcConst pResID = rdo::Factory::create(rdo::runtime::RDOValue(pResource->getID())); + endOfCreation(rdo::Factory::create(Converter::s_converter()->runtime(), src_text(), trace, res_src_info.src_text(), par_src_info.src_text(), pResID, pResource->getType()->getRTPParamNumber(par_src_info.src_text()))); } // -------------------------------------------------------------------------------- // -------------------- RDOPMDWatchState // -------------------------------------------------------------------------------- RDOPMDWatchState::RDOPMDWatchState(const RDOParserSrcInfo& src_info, bool trace, LPRDOFUNLogic pLogic) - : RDOPMDResult(src_info) + : RDOPMDResult(src_info) { - endOfCreation(rdo::Factory::create(Converter::s_converter()->runtime(), src_text(), trace, pLogic->getCalc())); + endOfCreation(rdo::Factory::create(Converter::s_converter()->runtime(), src_text(), trace, pLogic->getCalc())); } // -------------------------------------------------------------------------------- // -------------------- RDOPMDWatchTemp // -------------------------------------------------------------------------------- RDOPMDWatchTemp::RDOPMDWatchTemp(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& res_type_src_info) - : RDOPMDResult(src_info) + : RDOPMDResult(src_info) { - LPRDORTPResType pResType = Converter::s_converter()->findRTPResType(res_type_src_info.src_text()); - if (!pResType) - { - Converter::s_converter()->error().error(res_type_src_info, rdo::format("Тип ресурса '%s' не найден", res_type_src_info.src_text().c_str())); - } - if (!pResType->isTemporary()) - { - Converter::s_converter()->error().push_only(res_type_src_info, "Показатель собирает информацию по временным ресурсам (temporary)"); - Converter::s_converter()->error().push_only(pResType->src_info(), "См. тип ресурса"); - Converter::s_converter()->error().push_done(); - } + LPRDORTPResType pResType = Converter::s_converter()->findRTPResType(res_type_src_info.src_text()); + if (!pResType) + { + Converter::s_converter()->error().error(res_type_src_info, rdo::format("Тип ресурса '%s' не найден", res_type_src_info.src_text().c_str())); + } + if (!pResType->isTemporary()) + { + Converter::s_converter()->error().push_only(res_type_src_info, "Показатель собирает информацию по временным ресурсам (temporary)"); + Converter::s_converter()->error().push_only(pResType->src_info(), "См. тип ресурса"); + Converter::s_converter()->error().push_done(); + } } // -------------------------------------------------------------------------------- // -------------------- RDOPMDWatchQuant // -------------------------------------------------------------------------------- RDOPMDWatchQuant::RDOPMDWatchQuant(const RDOParserSrcInfo& src_info, bool trace, const RDOParserSrcInfo& res_type_src_info) - : RDOPMDWatchTemp(src_info, res_type_src_info) + : RDOPMDWatchTemp(src_info, res_type_src_info) { - LPRDOFUNGroupLogic pGroupLogic = rdo::Factory::create(RDOFUNGroupLogic::fgt_unknow, RDOParserSrcInfo(res_type_src_info.src_text())); - ASSERT(pGroupLogic); - endOfCreation(rdo::Factory::create(Converter::s_converter()->runtime(), src_text(), trace, res_type_src_info.src_text(), pGroupLogic->getResType()->getNumber())); + LPRDOFUNGroupLogic pGroupLogic = rdo::Factory::create(RDOFUNGroupLogic::Type::UNKNOW, RDOParserSrcInfo(res_type_src_info.src_text())); + ASSERT(pGroupLogic); + endOfCreation(rdo::Factory::create(Converter::s_converter()->runtime(), src_text(), trace, res_type_src_info.src_text(), pGroupLogic->getResType()->getNumber())); } void RDOPMDWatchQuant::setLogic(LPRDOFUNLogic& pLogic) { - LPIResultWatchQuant pQuant = m_pResult.object_dynamic_cast(); - ASSERT(pQuant); - pQuant->setLogicCalc(pLogic->getCalc()); - Converter::s_converter()->getFUNGroupStack().pop_back(); + LPIResultWatchQuant pQuant = m_pResult.object_dynamic_cast(); + ASSERT(pQuant); + pQuant->setLogicCalc(pLogic->getCalc()); + Converter::s_converter()->getFUNGroupStack().pop_back(); } void RDOPMDWatchQuant::setLogicNoCheck() { - LPIResultWatchQuant pQuant = m_pResult.object_dynamic_cast(); - ASSERT(pQuant); - pQuant->setLogicCalc(rdo::Factory::create(1)); - Converter::s_converter()->getFUNGroupStack().pop_back(); + LPIResultWatchQuant pQuant = m_pResult.object_dynamic_cast(); + ASSERT(pQuant); + pQuant->setLogicCalc(rdo::Factory::create(1)); + Converter::s_converter()->getFUNGroupStack().pop_back(); } // -------------------------------------------------------------------------------- // -------------------- RDOPMDWatchValue // -------------------------------------------------------------------------------- RDOPMDWatchValue::RDOPMDWatchValue(const RDOParserSrcInfo& src_info, bool trace, const RDOParserSrcInfo& res_type_src_info) - : RDOPMDWatchTemp(src_info, res_type_src_info) + : RDOPMDWatchTemp(src_info, res_type_src_info) { - LPRDOFUNGroupLogic pGroupLogic = rdo::Factory::create(RDOFUNGroupLogic::fgt_unknow, RDOParserSrcInfo(res_type_src_info.src_text())); - ASSERT(pGroupLogic); - endOfCreation(rdo::Factory::create(Converter::s_converter()->runtime(), src_text(), trace, res_type_src_info.src_text(), pGroupLogic->getResType()->getNumber())); + LPRDOFUNGroupLogic pGroupLogic = rdo::Factory::create(RDOFUNGroupLogic::Type::UNKNOW, RDOParserSrcInfo(res_type_src_info.src_text())); + ASSERT(pGroupLogic); + endOfCreation(rdo::Factory::create(Converter::s_converter()->runtime(), src_text(), trace, res_type_src_info.src_text(), pGroupLogic->getResType()->getNumber())); } void RDOPMDWatchValue::setLogic(LPRDOFUNLogic& pLogic, LPRDOFUNArithm& pArithm) { - LPIResultWatchValue pWatch = m_pResult.object_dynamic_cast(); - ASSERT(pWatch); - pWatch->setLogicCalc (pLogic->getCalc() ); - pWatch->setArithmCalc(pArithm->createCalc()); - Converter::s_converter()->getFUNGroupStack().pop_back(); + LPIResultWatchValue pWatch = m_pResult.object_dynamic_cast(); + ASSERT(pWatch); + pWatch->setLogicCalc (pLogic->getCalc() ); + pWatch->setArithmCalc(pArithm->createCalc()); + Converter::s_converter()->getFUNGroupStack().pop_back(); } void RDOPMDWatchValue::setLogicNoCheck(LPRDOFUNArithm& pArithm) { - LPIResultWatchValue pWatch = m_pResult.object_dynamic_cast(); - ASSERT(pWatch); - pWatch->setLogicCalc (rdo::Factory::create(1)); - pWatch->setArithmCalc(pArithm->createCalc()); - Converter::s_converter()->getFUNGroupStack().pop_back(); + LPIResultWatchValue pWatch = m_pResult.object_dynamic_cast(); + ASSERT(pWatch); + pWatch->setLogicCalc (rdo::Factory::create(1)); + pWatch->setArithmCalc(pArithm->createCalc()); + Converter::s_converter()->getFUNGroupStack().pop_back(); } // -------------------------------------------------------------------------------- // -------------------- RDOPMDGetValue // -------------------------------------------------------------------------------- RDOPMDGetValue::RDOPMDGetValue(const RDOParserSrcInfo& src_info, LPRDOFUNArithm pArithm) - : RDOPMDResult(src_info) + : RDOPMDResult(src_info) { - endOfCreation(rdo::Factory::create(Converter::s_converter()->runtime(), src_text(), pArithm->createCalc())); + endOfCreation(rdo::Factory::create(Converter::s_converter()->runtime(), src_text(), pArithm->createCalc())); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdopmd.h b/converter/smr2rdox/rdopmd.h index ba5032375..94a6f31d4 100644 --- a/converter/smr2rdox/rdopmd.h +++ b/converter/smr2rdox/rdopmd.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOPMD_PMD_H_ -#define _CONVERTOR_RDOPMD_PMD_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -19,20 +18,20 @@ void cnv_pmderror(YYLTYPE* llocp, void* lexer, const char* message); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOPMDResult); class RDOPMDResult - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOPMDResult); public: - const std::string& name() const { return src_text(); } + const std::string& name() const { return src_text(); } protected: - RDOPMDResult(const RDOParserSrcInfo& src_info); - virtual ~RDOPMDResult(); + RDOPMDResult(const RDOParserSrcInfo& src_info); + virtual ~RDOPMDResult(); - void endOfCreation(const LPIResult& pResult); + void endOfCreation(const LPIResult& pResult); - LPIResult m_pResult; + LPIResult m_pResult; }; // -------------------------------------------------------------------------------- @@ -42,7 +41,7 @@ class RDOPMDWatchPar: public RDOPMDResult { DECLARE_FACTORY(RDOPMDWatchPar); private: - RDOPMDWatchPar(const RDOParserSrcInfo& src_info, bool trace, const RDOParserSrcInfo& res_src_info, const RDOParserSrcInfo& par_src_info); + RDOPMDWatchPar(const RDOParserSrcInfo& src_info, bool trace, const RDOParserSrcInfo& res_src_info, const RDOParserSrcInfo& par_src_info); }; // -------------------------------------------------------------------------------- @@ -52,7 +51,7 @@ class RDOPMDWatchState: public RDOPMDResult { DECLARE_FACTORY(RDOPMDWatchState); private: - RDOPMDWatchState(const RDOParserSrcInfo& src_info, bool trace, LPRDOFUNLogic pLogic); + RDOPMDWatchState(const RDOParserSrcInfo& src_info, bool trace, LPRDOFUNLogic pLogic); }; // -------------------------------------------------------------------------------- @@ -61,7 +60,7 @@ DECLARE_FACTORY(RDOPMDWatchState); class RDOPMDWatchTemp: public RDOPMDResult { protected: - RDOPMDWatchTemp(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& res_type_src_info); + RDOPMDWatchTemp(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& res_type_src_info); }; // -------------------------------------------------------------------------------- @@ -71,11 +70,11 @@ class RDOPMDWatchQuant: public RDOPMDWatchTemp { DECLARE_FACTORY(RDOPMDWatchQuant); public: - void setLogic (LPRDOFUNLogic& pLogic); - void setLogicNoCheck(); + void setLogic (LPRDOFUNLogic& pLogic); + void setLogicNoCheck(); private: - RDOPMDWatchQuant(const RDOParserSrcInfo& src_info, bool trace, const RDOParserSrcInfo& res_type_src_info); + RDOPMDWatchQuant(const RDOParserSrcInfo& src_info, bool trace, const RDOParserSrcInfo& res_type_src_info); }; DECLARE_POINTER(RDOPMDWatchQuant); @@ -86,11 +85,11 @@ class RDOPMDWatchValue: public RDOPMDWatchTemp { DECLARE_FACTORY(RDOPMDWatchValue); public: - void setLogic (LPRDOFUNLogic& pLogic, LPRDOFUNArithm& pArithm); - void setLogicNoCheck(LPRDOFUNArithm& pArithm); + void setLogic (LPRDOFUNLogic& pLogic, LPRDOFUNArithm& pArithm); + void setLogicNoCheck(LPRDOFUNArithm& pArithm); private: - RDOPMDWatchValue(const RDOParserSrcInfo& src_info, bool trace, const RDOParserSrcInfo& res_type_src_info); + RDOPMDWatchValue(const RDOParserSrcInfo& src_info, bool trace, const RDOParserSrcInfo& res_type_src_info); }; DECLARE_POINTER(RDOPMDWatchValue); @@ -101,9 +100,7 @@ class RDOPMDGetValue: public RDOPMDResult { DECLARE_FACTORY(RDOPMDGetValue); private: - RDOPMDGetValue(const RDOParserSrcInfo& src_info, LPRDOFUNArithm pArithm); + RDOPMDGetValue(const RDOParserSrcInfo& src_info, LPRDOFUNArithm pArithm); }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOPMD_PMD_H_ diff --git a/converter/smr2rdox/rdorss.cpp b/converter/smr2rdox/rdorss.cpp index b4352b0a2..207874868 100644 --- a/converter/smr2rdox/rdorss.cpp +++ b/converter/smr2rdox/rdorss.cpp @@ -13,9 +13,9 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE int cnv_rsslex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void cnv_rsserror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -24,97 +24,97 @@ void cnv_rsserror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) // -------------------------------------------------------------------------------- // -------------------- RDORSSResource // -------------------------------------------------------------------------------- -RDORSSResource::RDORSSResource(Converter* pParser, const RDOParserSrcInfo& src_info, const LPRDORTPResType& pResType, int id) - : RDOParserSrcInfo(src_info ) - , m_pResType (pResType ) - , m_id (id == UNDEFINED_ID ? pParser->getRSS_id() : id) - , trace (false ) +RDORSSResource::RDORSSResource(Converter* pParser, const RDOParserSrcInfo& src_info, const LPRDORTPResType& pResType, std::size_t id) + : RDOParserSrcInfo(src_info ) + , m_pResType (pResType ) + , m_id (id == UNDEFINED_ID ? pParser->getRSS_id() : id) + , trace (false ) { - ASSERT(m_pResType); - pParser->insertRSSResource(LPRDORSSResource(this)); - m_currParam = m_pResType->getParams().begin(); + ASSERT(m_pResType); + pParser->insertRSSResource(LPRDORSSResource(this)); + m_currParam = m_pResType->getParams().begin(); } void RDORSSResource::writeModelStructure(std::ostream& stream) const { - stream << (getID() + 1) << " " << name() << " " << getType()->getNumber() << std::endl; + stream << (getID() + 1) << " " << name() << " " << getType()->getNumber() << std::endl; } void RDORSSResource::addParam(const LPRDOValue& pParam) { - ASSERT(pParam); + ASSERT(pParam); - if (m_currParam == getType()->getParams().end()) - { - Converter::s_converter()->error().push_only(pParam->src_info(), "Слишком много параметров"); - Converter::s_converter()->error().push_only(getType()->src_info(), "См. тип ресурса"); - Converter::s_converter()->error().push_done(); - } - try - { - if (pParam->value().getAsString() == "*") - { - if (!(*m_currParam)->getDefault()->defined()) - { - Converter::s_converter()->error().push_only(pParam->src_info(), "Невозможно использовать '*', к.т. отсутствует значение по умолчанию"); - Converter::s_converter()->error().push_only((*m_currParam)->getType()->src_info(), "См. описание параметра"); - Converter::s_converter()->error().push_done(); - } - m_paramList.push_back(Param((*m_currParam)->getDefault())); - m_currParam++; - } - else - { - m_paramList.push_back(Param((*m_currParam)->getType()->value_cast(pParam))); - m_currParam++; - } - } - catch(const RDOSyntaxException&) - { - Converter::s_converter()->error().modify(rdo::format("Для параметра '%s': ", (*m_currParam)->name().c_str())); - } + if (m_currParam == getType()->getParams().end()) + { + Converter::s_converter()->error().push_only(pParam->src_info(), "Слишком много параметров"); + Converter::s_converter()->error().push_only(getType()->src_info(), "См. тип ресурса"); + Converter::s_converter()->error().push_done(); + } + try + { + if (pParam->value().getAsString() == "*") + { + if (!(*m_currParam)->getDefault()->defined()) + { + Converter::s_converter()->error().push_only(pParam->src_info(), "Невозможно использовать '*', к.т. отсутствует значение по умолчанию"); + Converter::s_converter()->error().push_only((*m_currParam)->getType()->src_info(), "См. описание параметра"); + Converter::s_converter()->error().push_done(); + } + m_paramList.push_back(Param((*m_currParam)->getDefault())); + m_currParam++; + } + else + { + m_paramList.push_back(Param((*m_currParam)->getType()->value_cast(pParam))); + m_currParam++; + } + } + catch(const RDOSyntaxException&) + { + Converter::s_converter()->error().modify(rdo::format("Для параметра '%s': ", (*m_currParam)->name().c_str())); + } } bool RDORSSResource::defined() const { - return m_currParam == getType()->getParams().end(); + return m_currParam == getType()->getParams().end(); } rdo::runtime::LPRDOCalc RDORSSResource::createCalc() const { - std::vector paramList; - for (const auto& param: params()) - { - paramList.push_back(param.param()->value()); - } + std::vector paramList; + for (const auto& param: params()) + { + paramList.push_back(param.param()->value()); + } - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText("Создание ресурса " + src_text()); - pCalc->setSrcInfo(srcInfo); - return pCalc; + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText("Создание ресурса " + src_text()); + pCalc->setSrcInfo(srcInfo); + return pCalc; } // -------------------------------------------------------------------------------- // -------------------- RDOPROCResource // -------------------------------------------------------------------------------- RDOPROCResource::RDOPROCResource(Converter* pParser, const RDOParserSrcInfo& src_info, const LPRDORTPResType& pResType, int id) - : RDORSSResource(pParser, src_info, pResType, id) + : RDORSSResource(pParser, src_info, pResType, id) {} rdo::runtime::LPRDOCalc RDOPROCResource::createCalc() const { - std::vector paramList; - for (const auto& param: params()) - paramList.push_back(param.param()->value()); + std::vector paramList; + for (const auto& param: params()) + paramList.push_back(param.param()->value()); - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText("Создание ресурса " + src_text()); - pCalc->setSrcInfo(srcInfo); - return pCalc; + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText("Создание ресурса " + src_text()); + pCalc->setSrcInfo(srcInfo); + return pCalc; } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdorss.h b/converter/smr2rdox/rdorss.h index 55685f2f8..39def1074 100644 --- a/converter/smr2rdox/rdorss.h +++ b/converter/smr2rdox/rdorss.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDORSS_RSS_H_ -#define _CONVERTOR_RDORSS_RSS_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -25,56 +24,56 @@ void cnv_rsserror(YYLTYPE* llocp, void* lexer, const char* message); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDORSSResource); class RDORSSResource - : public rdo::counter_reference - , public RDOParserSrcInfo - , public boost::noncopyable + : public rdo::counter_reference + , public RDOParserSrcInfo + , private boost::noncopyable { DECLARE_FACTORY(RDORSSResource); public: - class Param - { - public: - explicit Param(const LPRDOValue& pValue) - : m_pValue(pValue) - {} + class Param + { + public: + explicit Param(const LPRDOValue& pValue) + : m_pValue(pValue) + {} - const LPRDOValue& param() const - { - return m_pValue; - } + const LPRDOValue& param() const + { + return m_pValue; + } - private: - LPRDOValue m_pValue; - }; - typedef std::vector ParamList; - enum { UNDEFINED_ID = ~0 }; + private: + LPRDOValue m_pValue; + }; + typedef std::vector ParamList; + static const std::size_t UNDEFINED_ID = std::size_t(~0); - virtual rdo::runtime::LPRDOCalc createCalc() const; + virtual rdo::runtime::LPRDOCalc createCalc() const; - const std::string& name() const { return src_info().src_text(); } - LPRDORTPResType getType() const { return m_pResType; } + const std::string& name() const { return src_info().src_text(); } + LPRDORTPResType getType() const { return m_pResType; } - int getID() const { return m_id; } + int getID() const { return m_id; } - const ParamList& params() const { return m_paramList; } + const ParamList& params() const { return m_paramList; } - void addParam(const LPRDOValue& pParam); - bool getTrace() const { return trace; } - void setTrace(bool value) { trace = value; } - bool defined () const; + void addParam(const LPRDOValue& pParam); + bool getTrace() const { return trace; } + void setTrace(bool value) { trace = value; } + bool defined () const; - void writeModelStructure(std::ostream& stream) const; + void writeModelStructure(std::ostream& stream) const; protected: - RDORSSResource(Converter* pParser, const RDOParserSrcInfo& src_info, const LPRDORTPResType& pResType, int id = UNDEFINED_ID); + RDORSSResource(Converter* pParser, const RDOParserSrcInfo& src_info, const LPRDORTPResType& pResType, std::size_t id = UNDEFINED_ID); - LPRDORTPResType m_pResType; - const int m_id; //! in system - ParamList m_paramList; - bool trace; + LPRDORTPResType m_pResType; + const int m_id; // in system + ParamList m_paramList; + bool trace; private: - RDORTPResType::ParamList::const_iterator m_currParam; + RDORTPResType::ParamList::const_iterator m_currParam; }; // -------------------------------------------------------------------------------- @@ -84,11 +83,9 @@ class RDOPROCResource: public RDORSSResource { DECLARE_FACTORY(RDOPROCResource); private: - RDOPROCResource(Converter* pParser, const RDOParserSrcInfo& src_info, const LPRDORTPResType& pResType, int id = UNDEFINED_ID); - virtual rdo::runtime::LPRDOCalc createCalc() const; + RDOPROCResource(Converter* pParser, const RDOParserSrcInfo& src_info, const LPRDORTPResType& pResType, int id = UNDEFINED_ID); + virtual rdo::runtime::LPRDOCalc createCalc() const; }; DECLARE_POINTER(RDOPROCResource); CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDORSS_RSS_H_ diff --git a/converter/smr2rdox/rdortp.cpp b/converter/smr2rdox/rdortp.cpp index cfe263f1c..d530c2873 100644 --- a/converter/smr2rdox/rdortp.cpp +++ b/converter/smr2rdox/rdortp.cpp @@ -13,9 +13,9 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE int cnv_rtplex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void cnv_rtperror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -25,11 +25,11 @@ void cnv_rtperror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) // -------------------- RDORTPResType // -------------------------------------------------------------------------------- RDORTPResType::RDORTPResType(Converter* pParser, const RDOParserSrcInfo& src_info, bool permanent) - : RDOParserSrcInfo(src_info ) - , m_number (pParser->getRTP_id()) - , m_permanent (permanent ) + : RDOParserSrcInfo(src_info ) + , m_number (pParser->getRTP_id()) + , m_permanent (permanent ) { - pParser->insertRTPResType(LPRDORTPResType(this)); + pParser->insertRTPResType(LPRDORTPResType(this)); } RDORTPResType::~RDORTPResType() @@ -37,22 +37,22 @@ RDORTPResType::~RDORTPResType() void RDORTPResType::addParam(const LPRDORTPParam& param) { - if (findRTPParam(param->name())) - { - Converter::s_converter()->error().error(param->src_info(), rdo::format("Параметр уже существует: %s", param->name().c_str())); - } - m_params.push_back(param); + if (findRTPParam(param->name())) + { + Converter::s_converter()->error().error(param->src_info(), rdo::format("Параметр уже существует: %s", param->name().c_str())); + } + m_params.push_back(param); } -void RDORTPResType::addParam(const std::string& /*param_name*/, rdo::runtime::RDOType::TypeID /*param_typeID*/) +void RDORTPResType::addParam(const std::string& /*param_name*/, rdo::runtime::RDOType::Type /*param_typeID*/) { - NEVER_REACH_HERE; + NEVER_REACH_HERE; } LPRDORTPParam RDORTPResType::findRTPParam(const std::string& paramName) const { - ParamList::const_iterator it = std::find_if(m_params.begin(), m_params.end(), compareName(paramName)); - return it != m_params.end() ? *it : LPRDORTPParam(); + ParamList::const_iterator it = std::find_if(m_params.begin(), m_params.end(), compareName(paramName)); + return it != m_params.end() ? *it : LPRDORTPParam(); } void RDORTPResType::finish() @@ -60,18 +60,18 @@ void RDORTPResType::finish() std::size_t RDORTPResType::getRTPParamNumber(const std::string& paramName) const { - ParamList::const_iterator it = std::find_if(m_params.begin(), m_params.end(), compareName(paramName)); - return it != m_params.end() ? it - m_params.begin() : UNDEFINED_PARAM; + ParamList::const_iterator it = std::find_if(m_params.begin(), m_params.end(), compareName(paramName)); + return it != m_params.end() ? it - m_params.begin() : UNDEFINED_PARAM; } void RDORTPResType::writeModelStructure(std::ostream& stream) const { - stream << getNumber() << " " << name() << " " << getParams().size() << std::endl; - for (std::size_t i = 0; i < getParams().size(); i++) - { - stream << " " << (i+1) << " "; - getParams().at(i)->writeModelStructure(stream); - } + stream << getNumber() << " " << name() << " " << getParams().size() << std::endl; + for (std::size_t i = 0; i < getParams().size(); i++) + { + stream << " " << (i+1) << " "; + getParams().at(i)->writeModelStructure(stream); + } } /* @@ -79,25 +79,25 @@ void RDORTPResType::writeModelStructure(std::ostream& stream) const // -------------------- RDORTPFuzzyMembershiftFun - ф-ия принадлежности нечеткого терма // -------------------------------------------------------------------------------- RDORTPFuzzyMembershiftFun::RDORTPFuzzyMembershiftFun(Converter* pParser): - RDOParserObject(pParser) + RDOParserObject(pParser) { - for (std::size_t i = 0; i < m_points.size(); i++) - { -// double x = m_points[i]->getX(); - } + for (std::size_t i = 0; i < m_points.size(); i++) + { +// double x = m_points[i]->getX(); + } - Items::iterator it = m_points.begin(); - while (it != m_points.end()) - { - double x = (*it)->getX(); - it++; - } + Items::iterator it = m_points.begin(); + while (it != m_points.end()) + { + double x = (*it)->getX(); + it++; + } } // -------------------------------------------------------------------------------- // -------------------- RDORTPFuzzyTerm - нечеткий термин // -------------------------------------------------------------------------------- RDORTPFuzzyTerm::RDORTPFuzzyTerm(Converter* pParser, const RDOParserSrcInfo& src_info, RDORTPFuzzyMembershiftFun* pMembersfift_fun): - RDOParserObject(pParser) + RDOParserObject(pParser) { }*/ diff --git a/converter/smr2rdox/rdortp.h b/converter/smr2rdox/rdortp.h index c83504593..dddabfb86 100644 --- a/converter/smr2rdox/rdortp.h +++ b/converter/smr2rdox/rdortp.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDORTP_H_ -#define _CONVERTOR_RDORTP_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -27,38 +26,38 @@ class Converter; PREDECLARE_POINTER(RDORTPResType); class RDORTPResType - : public rdo::counter_reference - , public RDOParserSrcInfo - , public boost::noncopyable + : public rdo::counter_reference + , public RDOParserSrcInfo + , private boost::noncopyable { DECLARE_FACTORY(RDORTPResType); public: - typedef std::vector ParamList; + typedef std::vector ParamList; - static const std::size_t UNDEFINED_PARAM = std::size_t(~0); + static const std::size_t UNDEFINED_PARAM = std::size_t(~0); - const std::string& name() const { return src_text(); }; - int getNumber() const { return m_number; }; - bool isPermanent() const { return m_permanent; }; - bool isTemporary() const { return !m_permanent; }; + const std::string& name() const { return src_text(); }; + int getNumber() const { return m_number; }; + bool isPermanent() const { return m_permanent; }; + bool isTemporary() const { return !m_permanent; }; - void addParam(const LPRDORTPParam& param); - void addParam(const std::string& param_name, rdo::runtime::RDOType::TypeID param_typeID); - LPRDORTPParam findRTPParam(const std::string& paramName) const; - void finish(); + void addParam(const LPRDORTPParam& param); + void addParam(const std::string& param_name, rdo::runtime::RDOType::Type param_typeID); + LPRDORTPParam findRTPParam(const std::string& paramName) const; + void finish(); - std::size_t getRTPParamNumber(const std::string& paramName) const; - const ParamList& getParams() const { return m_params; } + std::size_t getRTPParamNumber(const std::string& paramName) const; + const ParamList& getParams() const { return m_params; } - void writeModelStructure(std::ostream& stream) const; + void writeModelStructure(std::ostream& stream) const; private: - RDORTPResType(Converter* pParser, const RDOParserSrcInfo& src_info, bool permanent); - virtual ~RDORTPResType(); + RDORTPResType(Converter* pParser, const RDOParserSrcInfo& src_info, bool permanent); + virtual ~RDORTPResType(); - const int m_number; - const bool m_permanent; - ParamList m_params; + const int m_number; + const bool m_permanent; + ParamList m_params; }; DECLARE_POINTER(RDORTPResType); @@ -72,21 +71,21 @@ DECLARE_POINTER(RDORTPResType); //class RDORTPFuzzyMembershiftPoint: public RDOParserObject, public RDOParserSrcInfo //{ //public: -// RDORTPFuzzyMembershiftPoint(Converter* pParser, const RDOParserSrcInfo& src_info, double x_value, double y_value): -// RDOParserObject(pParser), -// RDOParserSrcInfo(src_info), -// m_x_value(x_value), -// m_y_value(y_value) -// { -// } -// virtual ~RDORTPFuzzyMembershiftPoint() {} +// RDORTPFuzzyMembershiftPoint(Converter* pParser, const RDOParserSrcInfo& src_info, double x_value, double y_value): +// RDOParserObject(pParser), +// RDOParserSrcInfo(src_info), +// m_x_value(x_value), +// m_y_value(y_value) +// { +// } +// virtual ~RDORTPFuzzyMembershiftPoint() {} // -// double getX() const { return m_x_value; } -// double getY() const { return m_y_value; } +// double getX() const { return m_x_value; } +// double getY() const { return m_y_value; } // //private: -// double m_x_value; -// double m_y_value; +// double m_x_value; +// double m_y_value; //}; // //// -------------------------------------------------------------------------------- @@ -95,27 +94,27 @@ DECLARE_POINTER(RDORTPResType); //class RDORTPFuzzyMembershiftFun: public RDOParserObject, public RDOParserSrcInfo //{ //public: -// RDORTPFuzzyMembershiftFun(Converter* pParser): -// RDOParserObject(pParser) -// { -// } -// virtual ~RDORTPFuzzyMembershiftFun() {} +// RDORTPFuzzyMembershiftFun(Converter* pParser): +// RDOParserObject(pParser) +// { +// } +// virtual ~RDORTPFuzzyMembershiftFun() {} // -// typedef RDORTPFuzzyMembershiftPoint* Item; -// typedef std::vector Items; +// typedef RDORTPFuzzyMembershiftPoint* Item; +// typedef std::vector Items; // -// void add(Item point) -// { -// m_points.push_back(point); -// } -// double getVal() const -// { -// return m_value; -// } +// void add(Item point) +// { +// m_points.push_back(point); +// } +// double getVal() const +// { +// return m_value; +// } // //private: -// Items m_points; // точки, определяющие ф-ию принадлежности -// double m_value; // значение ф-ии принадлежности для конкретного четкого значения +// Items m_points; // точки, определяющие ф-ию принадлежности +// double m_value; // значение ф-ии принадлежности для конкретного четкого значения //}; //// -------------------------------------------------------------------------------- //// -------------------- RDORTPFuzzyTerm - нечеткий термин @@ -123,19 +122,19 @@ DECLARE_POINTER(RDORTPResType); //class RDORTPFuzzyTerm: public RDOParserObject, public RDOParserSrcInfo //{ //public: -// RDORTPFuzzyTerm(Converter* pParser, const RDOParserSrcInfo& src_info, RDORTPFuzzyMembershiftFun* pMembersfift_fun): -// RDOParserObject(pParser), -// RDOParserSrcInfo(src_info), -// m_fun (pMembersfift_fun) -// { -// } -// virtual ~RDORTPFuzzyTerm() {} +// RDORTPFuzzyTerm(Converter* pParser, const RDOParserSrcInfo& src_info, RDORTPFuzzyMembershiftFun* pMembersfift_fun): +// RDOParserObject(pParser), +// RDOParserSrcInfo(src_info), +// m_fun (pMembersfift_fun) +// { +// } +// virtual ~RDORTPFuzzyTerm() {} // -// const std::string& name() const { return src_info().src_text(); } -// double MemberShift() const { return m_fun->getVal(); } +// const std::string& name() const { return src_info().src_text(); } +// double MemberShift() const { return m_fun->getVal(); } // //private: -// RDORTPFuzzyMembershiftFun* m_fun; +// RDORTPFuzzyMembershiftFun* m_fun; //}; //// -------------------------------------------------------------------------------- //// -------------------- RDORTPFuzzyTermsSet - набор терминов одного параметра @@ -143,26 +142,26 @@ DECLARE_POINTER(RDORTPResType); //class RDORTPFuzzyTermsSet: public RDOParserObject, public RDOParserSrcInfo //{ //public: -// RDORTPFuzzyTermsSet(Converter* pParser) -// : RDOParserObject(pParser) -// { -// } -// virtual ~RDORTPFuzzyTermsSet() {} +// RDORTPFuzzyTermsSet(Converter* pParser) +// : RDOParserObject(pParser) +// { +// } +// virtual ~RDORTPFuzzyTermsSet() {} // -// typedef RDORTPFuzzyTerm* Item; -// typedef std::vector Items; +// typedef RDORTPFuzzyTerm* Item; +// typedef std::vector Items; // -// void add(Item term) -// { -// m_terms.push_back(term); -// } -// bool empty() const -// { -// return m_terms.empty(); -// } +// void add(Item term) +// { +// m_terms.push_back(term); +// } +// bool empty() const +// { +// return m_terms.empty(); +// } // //private: -// Items m_terms; // набор терминов одного параметра +// Items m_terms; // набор терминов одного параметра //}; // //// -------------------------------------------------------------------------------- @@ -171,20 +170,18 @@ DECLARE_POINTER(RDORTPResType); //class RDORTPFuzzyParam : public RDOParserObject, public RDOParserSrcInfo //{ //public: -// RDORTPFuzzyParam(Converter* pParser, const RDOParserSrcInfo& src_info, RDORTPFuzzyTermsSet* terms_set): -// RDOParserObject(pParser), -// RDOParserSrcInfo(src_info), -// m_set (terms_set) -// { -// } -// virtual ~RDORTPFuzzyParam() {} +// RDORTPFuzzyParam(Converter* pParser, const RDOParserSrcInfo& src_info, RDORTPFuzzyTermsSet* terms_set): +// RDOParserObject(pParser), +// RDOParserSrcInfo(src_info), +// m_set (terms_set) +// { +// } +// virtual ~RDORTPFuzzyParam() {} // -// const std::string& name() const { return src_info().src_text(); } +// const std::string& name() const { return src_info().src_text(); } // //private: -// RDORTPFuzzyTermsSet* m_set; // набор терминов параметра +// RDORTPFuzzyTermsSet* m_set; // набор терминов параметра //}; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDORTP_H_ diff --git a/converter/smr2rdox/rdortp_param.cpp b/converter/smr2rdox/rdortp_param.cpp index a5dc9f05f..b99297614 100644 --- a/converter/smr2rdox/rdortp_param.cpp +++ b/converter/smr2rdox/rdortp_param.cpp @@ -12,7 +12,7 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- RDORTPParam // -------------------------------------------------------------------------------- RDORTPParam::RDORTPParam(const LPRDOTypeParam& pParamType, const LPRDOValue& pDefault, const RDOParserSrcInfo& src_info) - : RDOParam(src_info, pParamType, pDefault) + : RDOParam(src_info, pParamType, pDefault) {} RDORTPParam::~RDORTPParam() @@ -20,13 +20,13 @@ RDORTPParam::~RDORTPParam() const std::string& RDORTPParam::name() const { - return RDOParam::name(); + return RDOParam::name(); } void RDORTPParam::writeModelStructure(std::ostream& stream) const { - stream << name() << " "; - getType()->writeModelStructure(stream); + stream << name() << " "; + getType()->writeModelStructure(stream); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdortp_param.h b/converter/smr2rdox/rdortp_param.h index 7658140d1..44dd9904d 100644 --- a/converter/smr2rdox/rdortp_param.h +++ b/converter/smr2rdox/rdortp_param.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDORTP_PARAM_H_ -#define _CONVERTOR_RDORTP_PARAM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,22 +15,20 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE PREDECLARE_POINTER(RDORTPResType); class RDORTPParam - : public RDOParam - , public IModelStructure - , public IName - , public virtual rdo::counter_reference + : public RDOParam + , public IModelStructure + , public IName + , public virtual rdo::counter_reference { DECLARE_FACTORY(RDORTPParam); public: - DECLARE_IModelStructure; - DECLARE_IName; + DECLARE_IModelStructure; + DECLARE_IName; private: - RDORTPParam(const LPRDOTypeParam& pParamType, const LPRDOValue& pDefault, const RDOParserSrcInfo& src_info); - virtual ~RDORTPParam(); + RDORTPParam(const LPRDOTypeParam& pParamType, const LPRDOValue& pDefault, const RDOParserSrcInfo& src_info); + virtual ~RDORTPParam(); }; DECLARE_POINTER(RDORTPParam); CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDORTP_PARAM_H_ diff --git a/converter/smr2rdox/rdosmr.cpp b/converter/smr2rdox/rdosmr.cpp index 162318931..e8ce70fd6 100644 --- a/converter/smr2rdox/rdosmr.cpp +++ b/converter/smr2rdox/rdosmr.cpp @@ -14,9 +14,9 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE int cnv_smr_file_lex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void cnv_smr_file_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -24,9 +24,9 @@ void cnv_smr_file_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*messa int cnv_smr_sim_lex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void cnv_smr_sim_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -36,166 +36,166 @@ void cnv_smr_sim_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*messag // -------------------- RDOSMR // -------------------------------------------------------------------------------- RDOSMR::RDOSMR(const std::string& modelName) - : m_showMode (rdo::service::simulation::SM_NoShow) - , m_frameNumber (1 ) - , m_showRate (60) - , m_runStartTime (0 ) - , m_traceStartTime(rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME) - , m_traceEndTime (rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME) + : m_showMode (rdo::service::simulation::ShowMode::NoShow) + , m_frameNumber (1) + , m_showRate (60) + , m_runStartTime (0) + , m_traceStartTime(rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME) + , m_traceEndTime (rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME) { - setFile("Model_name", modelName); - Converter::s_converter()->setSMR(this); + setFile("Model_name", modelName); + Converter::s_converter()->setSMR(this); } void RDOSMR::setShowMode(rdo::service::simulation::ShowMode showMode) { - m_showMode = showMode; + m_showMode = showMode; } void RDOSMR::setFrameNumber(int value, const YYLTYPE& pos) { - if (value <= 0) - { - Converter::s_converter()->error().error(pos, "Номер кадра должен быть больше нуля"); - } - if (Converter::s_converter()->getNumberFrame() < (std::size_t)value) - { - Converter::s_converter()->error().error(pos, rdo::format("Несуществующий кадр: %d", value)); - } - m_frameNumber = value; + if (value <= 0) + { + Converter::s_converter()->error().error(pos, "Номер кадра должен быть больше нуля"); + } + if (Converter::s_converter()->getNumberFrame() < (std::size_t)value) + { + Converter::s_converter()->error().error(pos, rdo::format("Несуществующий кадр: %d", value)); + } + m_frameNumber = value; } void RDOSMR::setShowRate(double value, const YYLTYPE& pos) { - if (value < 0) - { - Converter::s_converter()->error().error(pos, "Масштаб должен быть больше нуля"); - } - m_showRate = value; + if (value < 0) + { + Converter::s_converter()->error().error(pos, "Масштаб должен быть больше нуля"); + } + m_showRate = value; } void RDOSMR::setRunStartTime(double value, const YYLTYPE& pos) { - if (value < 0) - { - Converter::s_converter()->error().error(pos, "Начальное модельное время должно быть больше нуля"); - } - m_runStartTime = value; + if (value < 0) + { + Converter::s_converter()->error().error(pos, "Начальное модельное время должно быть больше нуля"); + } + m_runStartTime = value; } void RDOSMR::setTraceStartTime(double value, const YYLTYPE& pos) { - if (value < 0) - { - Converter::s_converter()->error().error(pos, "Начальное время трассировки должно быть больше нуля"); - } - if (getTraceEndTime() != rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME && getTraceEndTime() <= value) - { - Converter::s_converter()->error().push_only(pos, "Начальное время трассировки должно быть меньше конечного"); - Converter::s_converter()->error().push_only(m_traceEndTime_pos, "См. конечное время трассировки"); - Converter::s_converter()->error().push_done(); - } - m_traceStartTime = value; - m_traceStartTime_pos = pos; + if (value < 0) + { + Converter::s_converter()->error().error(pos, "Начальное время трассировки должно быть больше нуля"); + } + if (getTraceEndTime() != rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME && getTraceEndTime() <= value) + { + Converter::s_converter()->error().push_only(pos, "Начальное время трассировки должно быть меньше конечного"); + Converter::s_converter()->error().push_only(m_traceEndTime_pos, "См. конечное время трассировки"); + Converter::s_converter()->error().push_done(); + } + m_traceStartTime = value; + m_traceStartTime_pos = pos; } void RDOSMR::setTraceEndTime(double value, const YYLTYPE& pos) { - if (value < 0) - { - Converter::s_converter()->error().error(pos, "Конечное время трассировки должно быть больше нуля"); - } - if (getTraceStartTime() != rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME && getTraceStartTime() >= value) - { - Converter::s_converter()->error().push_only(pos, "Конечное время трассировки должно быть больше начального"); - Converter::s_converter()->error().push_only(m_traceStartTime_pos, "См. начальное время трассировки"); - Converter::s_converter()->error().push_done(); - } - m_traceEndTime = value; - m_traceEndTime_pos = pos; + if (value < 0) + { + Converter::s_converter()->error().error(pos, "Конечное время трассировки должно быть больше нуля"); + } + if (getTraceStartTime() != rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME && getTraceStartTime() >= value) + { + Converter::s_converter()->error().push_only(pos, "Конечное время трассировки должно быть больше начального"); + Converter::s_converter()->error().push_only(m_traceStartTime_pos, "См. начальное время трассировки"); + Converter::s_converter()->error().push_done(); + } + m_traceEndTime = value; + m_traceEndTime_pos = pos; } void RDOSMR::setTerminateIf(LPRDOFUNLogic& pLogic) { - if (m_pTerminateIf) - { - Converter::s_converter()->error().push_only(pLogic->src_info(), "Terminate_if уже определен"); - Converter::s_converter()->error().push_only(m_pTerminateIf->src_info(), "См. первое определение"); - Converter::s_converter()->error().push_done(); - } - m_pTerminateIf = pLogic; - Converter::s_converter()->runtime()->setTerminateIf(pLogic->getCalc()); + if (m_pTerminateIf) + { + Converter::s_converter()->error().push_only(pLogic->src_info(), "Terminate_if уже определен"); + Converter::s_converter()->error().push_only(m_pTerminateIf->src_info(), "См. первое определение"); + Converter::s_converter()->error().push_done(); + } + m_pTerminateIf = pLogic; + Converter::s_converter()->runtime()->setTerminateIf(pLogic->getCalc()); } void RDOSMR::setConstValue(const RDOParserSrcInfo& const_info, LPRDOFUNArithm& pArithm) { - LPRDOFUNConstant pConstant = Converter::s_converter()->findFUNConstant(const_info.src_text()); - if (!pConstant) - { - Converter::s_converter()->error().error(const_info, rdo::format("Константа '%s' не найдена", const_info.src_text().c_str())); - } - ASSERT(pArithm); - pArithm->checkParamType(pConstant->getType()); - rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(pConstant->getType()); - Converter::s_converter()->runtime()->addInitCalc(rdo::Factory::create(pConstant->getNumber(), pCalc)); - Converter::s_converter()->insertChanges(pConstant->src_text(), pArithm->src_text()); + LPRDOFUNConstant pConstant = Converter::s_converter()->findFUNConstant(const_info.src_text()); + if (!pConstant) + { + Converter::s_converter()->error().error(const_info, rdo::format("Константа '%s' не найдена", const_info.src_text().c_str())); + } + ASSERT(pArithm); + pArithm->checkParamType(pConstant->getType()); + rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(pConstant->getType()); + Converter::s_converter()->runtime()->addInitCalc(rdo::Factory::create(pConstant->getNumber(), pCalc)); + Converter::s_converter()->insertChanges(pConstant->src_text(), pArithm->src_text()); } void RDOSMR::setResParValue(const RDOParserSrcInfo& res_info, const RDOParserSrcInfo& par_info, LPRDOFUNArithm& pArithm) { - LPRDORSSResource pResource = Converter::s_converter()->findRSSResource(res_info.src_text()); - if (!pResource) - { - Converter::s_converter()->error().error(res_info.src_info(), rdo::format("Ресурс '%s' не найден", res_info.src_text().c_str())); - } - LPRDORTPParam pParam = pResource->getType()->findRTPParam(par_info.src_text()); - if (!pParam) - { - Converter::s_converter()->error().push_only(par_info.src_info(), rdo::format("Параметр '%s' не найден", par_info.src_text().c_str())); - Converter::s_converter()->error().push_only(pResource->src_info(), "См. ресурс"); - Converter::s_converter()->error().push_only(pResource->getType()->src_info(), "См. тип ресурса"); - Converter::s_converter()->error().push_done(); - } - ASSERT(pArithm); - pArithm->checkParamType(pParam->getType()); - const std::size_t parNumb = pResource->getType()->getRTPParamNumber(par_info.src_text()); - rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(pParam->getType()); - Converter::s_converter()->runtime()->addInitCalc(rdo::Factory::create(pResource->getID(), parNumb, pCalc)); - Converter::s_converter()->insertChanges(res_info.src_text() + "." + par_info.src_text(), pArithm->src_text()); + LPRDORSSResource pResource = Converter::s_converter()->findRSSResource(res_info.src_text()); + if (!pResource) + { + Converter::s_converter()->error().error(res_info.src_info(), rdo::format("Ресурс '%s' не найден", res_info.src_text().c_str())); + } + LPRDORTPParam pParam = pResource->getType()->findRTPParam(par_info.src_text()); + if (!pParam) + { + Converter::s_converter()->error().push_only(par_info.src_info(), rdo::format("Параметр '%s' не найден", par_info.src_text().c_str())); + Converter::s_converter()->error().push_only(pResource->src_info(), "См. ресурс"); + Converter::s_converter()->error().push_only(pResource->getType()->src_info(), "См. тип ресурса"); + Converter::s_converter()->error().push_done(); + } + ASSERT(pArithm); + pArithm->checkParamType(pParam->getType()); + const std::size_t parNumb = pResource->getType()->getRTPParamNumber(par_info.src_text()); + rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(pParam->getType()); + Converter::s_converter()->runtime()->addInitCalc(rdo::Factory::create(pResource->getID(), parNumb, pCalc)); + Converter::s_converter()->insertChanges(res_info.src_text() + "." + par_info.src_text(), pArithm->src_text()); } void RDOSMR::setSeed(const RDOParserSrcInfo& seq_info, int base) { - LPRDOFUNSequence pSequence = Converter::s_converter()->findFUNSequence(seq_info.src_text()); - if (!pSequence) - { - Converter::s_converter()->error().error(seq_info, rdo::format("Последовательность '%s' не найдена", seq_info.src_text().c_str())); - } - pSequence->getInitCalc()->setBase(base); - Converter::s_converter()->insertChanges(pSequence->src_text() + ".Seed", rdo::format("%d", base)); + LPRDOFUNSequence pSequence = Converter::s_converter()->findFUNSequence(seq_info.src_text()); + if (!pSequence) + { + Converter::s_converter()->error().error(seq_info, rdo::format("Последовательность '%s' не найдена", seq_info.src_text().c_str())); + } + pSequence->getInitCalc()->setBase(base); + Converter::s_converter()->insertChanges(pSequence->src_text() + ".Seed", rdo::format("%d", base)); } void RDOSMR::insertBreakPoint(const RDOParserSrcInfo& src_info, LPRDOFUNLogic& pLogic) { - for (const auto& breakPoint: m_breakPointList) - { - if (breakPoint->src_text() == src_info.src_text()) - { - Converter::s_converter()->error().push_only(src_info, rdo::format("Точка останова с именем '%s' уже существует", src_info.src_text().c_str())); - Converter::s_converter()->error().push_only(breakPoint->src_info(), "См. первое определение"); - Converter::s_converter()->error().push_done(); - } - } - LPBreakPoint pBreakPoint = rdo::Factory::create(src_info, pLogic); - ASSERT(pBreakPoint); - m_breakPointList.push_back(pBreakPoint); + for (const auto& breakPoint: m_breakPointList) + { + if (breakPoint->src_text() == src_info.src_text()) + { + Converter::s_converter()->error().push_only(src_info, rdo::format("Точка останова с именем '%s' уже существует", src_info.src_text().c_str())); + Converter::s_converter()->error().push_only(breakPoint->src_info(), "См. первое определение"); + Converter::s_converter()->error().push_done(); + } + } + LPBreakPoint pBreakPoint = rdo::Factory::create(src_info, pLogic); + ASSERT(pBreakPoint); + m_breakPointList.push_back(pBreakPoint); } RDOSMR::BreakPoint::BreakPoint(const RDOParserSrcInfo& src_info, LPRDOFUNLogic pLogic) - : RDOParserSrcInfo(src_info) + : RDOParserSrcInfo(src_info) { - ASSERT(pLogic); - Converter::s_converter()->runtime()->insertBreakPoint(src_text(), pLogic->getCalc()); + ASSERT(pLogic); + Converter::s_converter()->runtime()->insertBreakPoint(src_text(), pLogic->getCalc()); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/rdosmr.h b/converter/smr2rdox/rdosmr.h index ef2c79463..53608ef64 100644 --- a/converter/smr2rdox/rdosmr.h +++ b/converter/smr2rdox/rdosmr.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_RDOSMR_H_ -#define _CONVERTOR_RDOSMR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -33,89 +32,87 @@ class RDOSMR: public rdo::counter_reference { DECLARE_FACTORY(RDOSMR); public: - typedef std::map StringTable; + typedef std::map StringTable; - void setFile(const std::string& file_type, const std::string& file_name) - { - m_files[file_type] = file_name; - } - bool hasFile(const std::string& file_type) const - { - return m_files.find(file_type) != m_files.end(); - } - std::string getFile(const std::string& file_type) const - { - StringTable::const_iterator it = m_files.find(file_type); - return it != m_files.end() ? it->second : ""; - } - std::string modelName() const - { - return getFile("Model_name"); - } + void setFile(const std::string& file_type, const std::string& file_name) + { + m_files[file_type] = file_name; + } + bool hasFile(const std::string& file_type) const + { + return m_files.find(file_type) != m_files.end(); + } + std::string getFile(const std::string& file_type) const + { + StringTable::const_iterator it = m_files.find(file_type); + return it != m_files.end() ? it->second : ""; + } + std::string modelName() const + { + return getFile("Model_name"); + } #ifdef CORBA_ENABLE - void setExternalModelName(const std::string& alias, const std::string& modelID) - { - m_extModelList[alias] = modelID; - } - std::string getExternalModelName(const std::string& alias) const - { - StringTable::const_iterator it = m_extModelList.find(alias); - return it != m_extModelList.end() ? it->second : ""; - } - const StringTable& getExternalModelList() const - { - return m_extModelList; - } + void setExternalModelName(const std::string& alias, const std::string& modelID) + { + m_extModelList[alias] = modelID; + } + std::string getExternalModelName(const std::string& alias) const + { + StringTable::const_iterator it = m_extModelList.find(alias); + return it != m_extModelList.end() ? it->second : ""; + } + const StringTable& getExternalModelList() const + { + return m_extModelList; + } #endif - rdo::service::simulation::ShowMode getShowMode () const { return m_showMode; } - int getFrameNumber () const { return m_frameNumber; } - double getShowRate () const { return m_showRate; } - double getRunStartTime () const { return m_runStartTime; } - double getTraceStartTime() const { return m_traceStartTime; } - double getTraceEndTime () const { return m_traceEndTime; } + rdo::service::simulation::ShowMode getShowMode () const { return m_showMode; } + int getFrameNumber () const { return m_frameNumber; } + double getShowRate () const { return m_showRate; } + double getRunStartTime () const { return m_runStartTime; } + double getTraceStartTime() const { return m_traceStartTime; } + double getTraceEndTime () const { return m_traceEndTime; } - void setShowMode (rdo::service::simulation::ShowMode showMode); - void setFrameNumber (int value, const YYLTYPE& pos); - void setShowRate (double value, const YYLTYPE& pos); - void setRunStartTime (double value, const YYLTYPE& pos); - void setTraceStartTime(double value, const YYLTYPE& pos); - void setTraceEndTime (double value, const YYLTYPE& pos); + void setShowMode (rdo::service::simulation::ShowMode showMode); + void setFrameNumber (int value, const YYLTYPE& pos); + void setShowRate (double value, const YYLTYPE& pos); + void setRunStartTime (double value, const YYLTYPE& pos); + void setTraceStartTime(double value, const YYLTYPE& pos); + void setTraceEndTime (double value, const YYLTYPE& pos); - void setTerminateIf (LPRDOFUNLogic& pLogic); - void setConstValue (const RDOParserSrcInfo& const_info, LPRDOFUNArithm& pArithm); - void setResParValue (const RDOParserSrcInfo& res_info, const RDOParserSrcInfo& par_info, LPRDOFUNArithm& pArithm); - void setSeed (const RDOParserSrcInfo& seq_info, int base); - void insertBreakPoint(const RDOParserSrcInfo& src_info, LPRDOFUNLogic& pLogic); + void setTerminateIf (LPRDOFUNLogic& pLogic); + void setConstValue (const RDOParserSrcInfo& const_info, LPRDOFUNArithm& pArithm); + void setResParValue (const RDOParserSrcInfo& res_info, const RDOParserSrcInfo& par_info, LPRDOFUNArithm& pArithm); + void setSeed (const RDOParserSrcInfo& seq_info, int base); + void insertBreakPoint(const RDOParserSrcInfo& src_info, LPRDOFUNLogic& pLogic); private: - RDOSMR(const std::string& modelName); + RDOSMR(const std::string& modelName); - PREDECLARE_POINTER(BreakPoint); - class BreakPoint - : public rdo::counter_reference - , public RDOParserSrcInfo - { - DECLARE_FACTORY(BreakPoint); - private: - BreakPoint(const RDOParserSrcInfo& src_info, LPRDOFUNLogic pLogic); - }; - typedef std::vector BreakPointList; + PREDECLARE_POINTER(BreakPoint); + class BreakPoint + : public rdo::counter_reference + , public RDOParserSrcInfo + { + DECLARE_FACTORY(BreakPoint); + private: + BreakPoint(const RDOParserSrcInfo& src_info, LPRDOFUNLogic pLogic); + }; + typedef std::vector BreakPointList; - StringTable m_files; - StringTable m_extModelList; - rdo::service::simulation::ShowMode m_showMode; - int m_frameNumber; - double m_showRate; - double m_runStartTime; - double m_traceStartTime; - double m_traceEndTime; - YYLTYPE m_traceStartTime_pos; - YYLTYPE m_traceEndTime_pos; - LPRDOFUNLogic m_pTerminateIf; - BreakPointList m_breakPointList; + StringTable m_files; + StringTable m_extModelList; + rdo::service::simulation::ShowMode m_showMode; + int m_frameNumber; + double m_showRate; + double m_runStartTime; + double m_traceStartTime; + double m_traceEndTime; + YYLTYPE m_traceStartTime_pos; + YYLTYPE m_traceEndTime_pos; + LPRDOFUNLogic m_pTerminateIf; + BreakPointList m_breakPointList; }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_RDOSMR_H_ diff --git a/converter/smr2rdox/runtime/rdo_ie.cpp b/converter/smr2rdox/runtime/rdo_ie.cpp index a40f9ab7a..b3482bca4 100644 --- a/converter/smr2rdox/runtime/rdo_ie.cpp +++ b/converter/smr2rdox/runtime/rdo_ie.cpp @@ -13,75 +13,75 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOPatternIrregEvent // -------------------------------------------------------------------------------- RDOPatternIrregEvent::RDOPatternIrregEvent(bool trace) - : RDOPattern(trace) - , m_timeCalc(NULL ) + : RDOPattern(trace) + , m_timeCalc(NULL ) {} double RDOPatternIrregEvent::getNextTimeInterval(const LPRDORuntime& pRuntime) { - double time_next = m_timeCalc->calcValue(pRuntime).getDouble(); - if (time_next >= 0) - { - return time_next; - } - pRuntime->error().push(rdo::format("Попытка запланировать событие в прошлом. Выражение времени для $Time имеет отрицательное значение: %f", time_next), m_timeCalc->srcInfo()); - return 0; + double time_next = m_timeCalc->calcValue(pRuntime).getDouble(); + if (time_next >= 0) + { + return time_next; + } + pRuntime->error().push(rdo::format("Попытка запланировать событие в прошлом. Выражение времени для $Time имеет отрицательное значение: %f", time_next), m_timeCalc->srcInfo()); + return 0; } // -------------------------------------------------------------------------------- // -------------------- RDOIrregEvent // -------------------------------------------------------------------------------- RDOIrregEvent::RDOIrregEvent(RDOPatternIrregEvent* pPattern, bool trace, const std::string& name) - : RDOActivityPattern(pPattern, trace, name) + : RDOActivityPattern(pPattern, trace, name) { - setTrace(trace); - setTraceID(std::size_t(~0)); + setTrace(trace); + setTraceID(std::size_t(~0)); } void RDOIrregEvent::onStart(const LPRDORuntime& pRuntime) { - onBeforeIrregularEvent(pRuntime); + onBeforeIrregularEvent(pRuntime); } void RDOIrregEvent::onStop(const LPRDORuntime& pRuntime) { - pRuntime->removeTimePoint(this); + pRuntime->removeTimePoint(this); } bool RDOIrregEvent::onCheckCondition(const LPRDORuntime& /*pRuntime*/) { - return false; + return false; } -IBaseOperation::BOResult RDOIrregEvent::onDoOperation(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOIrregEvent::onDoOperation(const LPRDORuntime& /*pRuntime*/) { - return IBaseOperation::BOR_cant_run; + return IBaseOperation::ResultCode::CANNOT_RUN; } void RDOIrregEvent::convertEvent(const LPRDORuntime& /*pRuntime*/) { - NEVER_REACH_HERE; + NEVER_REACH_HERE; } void RDOIrregEvent::onBeforeIrregularEvent(const LPRDORuntime& /*pRuntime*/) { - NEVER_REACH_HERE; + NEVER_REACH_HERE; } void RDOIrregEvent::onAfterIrregularEvent(const LPRDORuntime& /*pRuntime*/) { - NEVER_REACH_HERE; + NEVER_REACH_HERE; } double RDOIrregEvent::getNextTimeInterval(const LPRDORuntime& pRuntime) { - pRuntime->setCurrentActivity(this); - return m_pPattern->getNextTimeInterval(pRuntime); + pRuntime->setCurrentActivity(this); + return m_pPattern->getNextTimeInterval(pRuntime); } -IBaseOperation::BOResult RDOIrregEvent::onContinue(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOIrregEvent::onContinue(const LPRDORuntime& /*pRuntime*/) { - return IBaseOperation::BOR_cant_run; + return IBaseOperation::ResultCode::CANNOT_RUN; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/converter/smr2rdox/runtime/rdo_ie.h b/converter/smr2rdox/runtime/rdo_ie.h index 0a9f917df..c46614212 100644 --- a/converter/smr2rdox/runtime/rdo_ie.h +++ b/converter/smr2rdox/runtime/rdo_ie.h @@ -1,5 +1,4 @@ -#ifndef _RDO_IE_H_ -#define _RDO_IE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -19,30 +18,30 @@ class RDOPatternIrregEvent: public RDOPattern friend class RDOIrregEvent; public: - RDOPatternIrregEvent(bool trace); + RDOPatternIrregEvent(bool trace); - void addConvertorCalc (const LPRDOCalc& pCalc ) { m_convertor.push_back(pCalc); } - void addConvertorStatus(RDOResource::ConvertStatus status) { m_convertorStatus.push_back(status); } - void addEraseCalc (const LPRDOCalc& pCalc ) { m_erase.push_back(pCalc); } - void setTime (const LPRDOCalc& timeCalc ) { m_timeCalc = timeCalc; } + void addConvertorCalc (const LPRDOCalc& pCalc ) { m_convertor.push_back(pCalc); } + void addConvertorStatus(RDOResource::ConvertStatus status) { m_convertorStatus.push_back(status); } + void addEraseCalc (const LPRDOCalc& pCalc ) { m_erase.push_back(pCalc); } + void setTime (const LPRDOCalc& timeCalc ) { m_timeCalc = timeCalc; } - void convertEvent(const LPRDORuntime& pRuntime) - { - preSelectRelRes(pRuntime); - runCalcs(m_convertor, pRuntime); - } - void convertErase(const LPRDORuntime& pRuntime) - { - runCalcs(m_erase, pRuntime); - } + void convertEvent(const LPRDORuntime& pRuntime) + { + preSelectRelRes(pRuntime); + runCalcs(m_convertor, pRuntime); + } + void convertErase(const LPRDORuntime& pRuntime) + { + runCalcs(m_erase, pRuntime); + } - double getNextTimeInterval(const LPRDORuntime& pRuntime); + double getNextTimeInterval(const LPRDORuntime& pRuntime); private: - LPRDOCalc m_timeCalc; - CalcList m_convertor; - ConvertStatusList m_convertorStatus; - CalcList m_erase; + LPRDOCalc m_timeCalc; + CalcList m_convertor; + ConvertStatusList m_convertorStatus; + CalcList m_erase; }; // -------------------------------------------------------------------------------- @@ -55,19 +54,17 @@ typedef RDOActivityPattern pattern_type; friend class RDOTrace; private: - RDOIrregEvent(RDOPatternIrregEvent* pPattern, bool trace, const std::string& name); + RDOIrregEvent(RDOPatternIrregEvent* pPattern, bool trace, const std::string& name); - double m_time; + double m_time; - void convertEvent (const LPRDORuntime& pRuntime); - double getNextTimeInterval(const LPRDORuntime& pRuntime); + void convertEvent (const LPRDORuntime& pRuntime); + double getNextTimeInterval(const LPRDORuntime& pRuntime); - virtual void onBeforeIrregularEvent(const LPRDORuntime& pRuntime); - virtual void onAfterIrregularEvent (const LPRDORuntime& pRuntime); + virtual void onBeforeIrregularEvent(const LPRDORuntime& pRuntime); + virtual void onAfterIrregularEvent (const LPRDORuntime& pRuntime); - DECLARE_IBaseOperation; + DECLARE_IBaseOperation; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _RDO_IE_H_ diff --git a/converter/smr2rdox/runtime/rdo_logic_dptfree.cpp b/converter/smr2rdox/runtime/rdo_logic_dptfree.cpp index 900523c8f..cdecb8b9b 100644 --- a/converter/smr2rdox/runtime/rdo_logic_dptfree.cpp +++ b/converter/smr2rdox/runtime/rdo_logic_dptfree.cpp @@ -11,7 +11,7 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDODPTFree // -------------------------------------------------------------------------------- RDODPTFree::RDODPTFree(const LPRDORuntime& pRuntime) - : RDOLogicSimple(pRuntime, NULL) + : RDOLogicSimple(pRuntime, NULL) {} RDODPTFree::~RDODPTFree() diff --git a/converter/smr2rdox/runtime/rdo_logic_dptfree.h b/converter/smr2rdox/runtime/rdo_logic_dptfree.h index 1fb93789e..77ea8ce1d 100644 --- a/converter/smr2rdox/runtime/rdo_logic_dptfree.h +++ b/converter/smr2rdox/runtime/rdo_logic_dptfree.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_LOGIC_DPTFREE_H_ -#define _LIB_RUNTIME_LOGIC_DPTFREE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,10 +12,8 @@ class RDODPTFree: public RDOLogicSimple, public RDOPatternPrior { DECLARE_FACTORY(RDODPTFree); private: - RDODPTFree(const LPRDORuntime& pRuntime); - virtual ~RDODPTFree(); + RDODPTFree(const LPRDORuntime& pRuntime); + virtual ~RDODPTFree(); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_LOGIC_DPTFREE_H_ diff --git a/converter/smr2rdox/update/document.cpp b/converter/smr2rdox/update/document.cpp index b912de0e3..d0d6f8d33 100644 --- a/converter/smr2rdox/update/document.cpp +++ b/converter/smr2rdox/update/document.cpp @@ -19,206 +19,206 @@ Document::Document() Document::~Document() { - close(); + close(); } void Document::create(const boost::filesystem::path& filePath, const boost::filesystem::path& modelName) { - m_filePath = filePath; - m_modelName = modelName; + m_filePath = filePath; + m_modelName = modelName; } -void Document::init(rdo::converter::smr2rdox::RDOFileTypeIn type, std::ifstream& stream) +void Document::init(rdo::converter::smr2rdox::FileTypeIn type, std::ifstream& stream) { - Type typeOut; - switch (type) - { - case rdo::converter::smr2rdox::PAT_IN: typeOut = PAT; break; - case rdo::converter::smr2rdox::RTP_IN: typeOut = RTP; break; - case rdo::converter::smr2rdox::RSS_IN: typeOut = RSS; break; - case rdo::converter::smr2rdox::OPR_IN: typeOut = OPR; break; - case rdo::converter::smr2rdox::FRM_IN: typeOut = FRM; break; - case rdo::converter::smr2rdox::FUN_IN: typeOut = FUN; break; - case rdo::converter::smr2rdox::DPT_IN: typeOut = DPT; break; - case rdo::converter::smr2rdox::SMR_IN: typeOut = SMR; break; - case rdo::converter::smr2rdox::PMD_IN: typeOut = PMD; break; - case rdo::converter::smr2rdox::PMV_IN: typeOut = PMV; break; - default : typeOut = UNDEFINED; NEVER_REACH_HERE; break; - } - LPMemoryStream streamOut = getMemoryStream(typeOut); - streamOut->init(stream); + Type typeOut; + switch (type) + { + case rdo::converter::smr2rdox::FileTypeIn::PAT: typeOut = Type::PAT; break; + case rdo::converter::smr2rdox::FileTypeIn::RTP: typeOut = Type::RTP; break; + case rdo::converter::smr2rdox::FileTypeIn::RSS: typeOut = Type::RSS; break; + case rdo::converter::smr2rdox::FileTypeIn::OPR: typeOut = Type::OPR; break; + case rdo::converter::smr2rdox::FileTypeIn::FRM: typeOut = Type::FRM; break; + case rdo::converter::smr2rdox::FileTypeIn::FUN: typeOut = Type::FUN; break; + case rdo::converter::smr2rdox::FileTypeIn::DPT: typeOut = Type::DPT; break; + case rdo::converter::smr2rdox::FileTypeIn::SMR: typeOut = Type::SMR; break; + case rdo::converter::smr2rdox::FileTypeIn::PMD: typeOut = Type::PMD; break; + case rdo::converter::smr2rdox::FileTypeIn::PMV: typeOut = Type::PMV; break; + default: typeOut = Type::UNDEFINED; NEVER_REACH_HERE; break; + } + LPMemoryStream streamOut = getMemoryStream(typeOut); + streamOut->init(stream); } void Document::insertUpdate(const LPDocUpdate& pUpdate) { - ASSERT(pUpdate); + ASSERT(pUpdate); - m_updateContainer.push_back(Update(pUpdate, false)); + m_updateContainer.push_back(Update(pUpdate, false)); } void Document::convert() { - LPIDocument pDocument = LPDocument(this).interface_cast(); + LPIDocument pDocument = LPDocument(this).interface_cast(); #ifdef DUMP_DOCUMENT - { - for (const Update& update: m_updateContainer) - { - const LPDocUpdate pUpdate = update.first; - ASSERT(pUpdate); - pUpdate->dump(pDocument); - } - } + { + for (const Update& update: m_updateContainer) + { + const LPDocUpdate pUpdate = update.first; + ASSERT(pUpdate); + pUpdate->dump(pDocument); + } + } #endif - for (Update& update: m_updateContainer) - { - update.second = true; - const LPDocUpdate pUpdate = update.first; - ASSERT(pUpdate); - pUpdate->apply(pDocument); + for (Update& update: m_updateContainer) + { + update.second = true; + const LPDocUpdate pUpdate = update.first; + ASSERT(pUpdate); + pUpdate->apply(pDocument); #ifdef DUMP_DOCUMENT - { - TRACE("=================\n"); - for (const Update& update: m_updateContainer) - { - if (!update.second) - { - const LPDocUpdate pUpdate = update.first; - ASSERT(pUpdate); - pUpdate->dump(pDocument); - } - } - } + { + TRACE("=================\n"); + for (const Update& update: m_updateContainer) + { + if (!update.second) + { + const LPDocUpdate pUpdate = update.first; + ASSERT(pUpdate); + pUpdate->dump(pDocument); + } + } + } #endif - } + } } Document::TypeOut Document::typeToOut(const Type& typeIn) const { - switch (typeIn) - { - case PAT: return rdo::converter::smr2rdox::PAT_OUT; - case RTP: return rdo::converter::smr2rdox::RTP_OUT; - case RSS: return rdo::converter::smr2rdox::RSS_OUT; - case FRM: return rdo::converter::smr2rdox::FRM_OUT; - case FUN: return rdo::converter::smr2rdox::FUN_OUT; - case DPT: return rdo::converter::smr2rdox::DPT_OUT; - case SMR: return rdo::converter::smr2rdox::SMR_OUT; - case PMD: return rdo::converter::smr2rdox::PMD_OUT; - case PMV: return rdo::converter::smr2rdox::PMV_OUT; - case TRC: return rdo::converter::smr2rdox::TRC_OUT; - case EVN: return rdo::converter::smr2rdox::EVN_OUT; - case PRC: return rdo::converter::smr2rdox::PRC_OUT; - default : break; - } - return rdo::converter::smr2rdox::UNDEFINED_OUT; + switch (typeIn) + { + case Type::PAT: return rdo::converter::smr2rdox::FileTypeOut::PAT; + case Type::RTP: return rdo::converter::smr2rdox::FileTypeOut::RTP; + case Type::RSS: return rdo::converter::smr2rdox::FileTypeOut::RSS; + case Type::FRM: return rdo::converter::smr2rdox::FileTypeOut::FRM; + case Type::FUN: return rdo::converter::smr2rdox::FileTypeOut::FUN; + case Type::DPT: return rdo::converter::smr2rdox::FileTypeOut::DPT; + case Type::SMR: return rdo::converter::smr2rdox::FileTypeOut::SMR; + case Type::PMD: return rdo::converter::smr2rdox::FileTypeOut::PMD; + case Type::PMV: return rdo::converter::smr2rdox::FileTypeOut::PMV; + case Type::TRC: return rdo::converter::smr2rdox::FileTypeOut::TRC; + case Type::EVN: return rdo::converter::smr2rdox::FileTypeOut::EVN; + case Type::PRC: return rdo::converter::smr2rdox::FileTypeOut::PRC; + default: break; + } + return rdo::converter::smr2rdox::FileTypeOut::UNDEFINED; } void Document::close() { - for (const auto& memory: m_memoryFileList) - { - TypeOut typeOut = typeToOut(memory.first); - if (typeOut != rdo::converter::smr2rdox::UNDEFINED_OUT) - { - LPFileStream pFileStream = getFileStream(typeOut); - ASSERT(pFileStream); - memory.second->get(*pFileStream.get()); - } - } - m_memoryFileList.clear(); - - for (const auto& file: m_streamFileList) - file.second->close(); - m_streamFileList.clear(); + for (const auto& memory: m_memoryFileList) + { + TypeOut typeOut = typeToOut(memory.first); + if (typeOut != rdo::converter::smr2rdox::FileTypeOut::UNDEFINED) + { + LPFileStream pFileStream = getFileStream(typeOut); + ASSERT(pFileStream); + memory.second->get(*pFileStream.get()); + } + } + m_memoryFileList.clear(); + + for (const auto& file: m_streamFileList) + file.second->close(); + m_streamFileList.clear(); } boost::filesystem::path Document::getName(TypeOut typeOut) const { - boost::filesystem::path extension; - switch (typeOut) - { - case rdo::converter::smr2rdox::PAT_OUT: extension = "pat"; break; - case rdo::converter::smr2rdox::RTP_OUT: extension = "rtp"; break; - case rdo::converter::smr2rdox::RSS_OUT: extension = "rss"; break; - case rdo::converter::smr2rdox::FRM_OUT: extension = "frm"; break; - case rdo::converter::smr2rdox::FUN_OUT: extension = "fun"; break; - case rdo::converter::smr2rdox::DPT_OUT: extension = "dpt"; break; - case rdo::converter::smr2rdox::SMR_OUT: extension = "smr"; break; - case rdo::converter::smr2rdox::PMD_OUT: extension = "pmd"; break; - case rdo::converter::smr2rdox::PMV_OUT: extension = "pmv"; break; - case rdo::converter::smr2rdox::TRC_OUT: extension = "trc"; break; - case rdo::converter::smr2rdox::EVN_OUT: extension = "evn"; break; - case rdo::converter::smr2rdox::PRC_OUT: extension = "prc"; break; - default: NEVER_REACH_HERE; - } - - return (m_filePath / m_modelName).replace_extension(extension); + boost::filesystem::path extension; + switch (typeOut) + { + case rdo::converter::smr2rdox::FileTypeOut::PAT: extension = "pat"; break; + case rdo::converter::smr2rdox::FileTypeOut::RTP: extension = "rtp"; break; + case rdo::converter::smr2rdox::FileTypeOut::RSS: extension = "rss"; break; + case rdo::converter::smr2rdox::FileTypeOut::FRM: extension = "frm"; break; + case rdo::converter::smr2rdox::FileTypeOut::FUN: extension = "fun"; break; + case rdo::converter::smr2rdox::FileTypeOut::DPT: extension = "dpt"; break; + case rdo::converter::smr2rdox::FileTypeOut::SMR: extension = "smr"; break; + case rdo::converter::smr2rdox::FileTypeOut::PMD: extension = "pmd"; break; + case rdo::converter::smr2rdox::FileTypeOut::PMV: extension = "pmv"; break; + case rdo::converter::smr2rdox::FileTypeOut::TRC: extension = "trc"; break; + case rdo::converter::smr2rdox::FileTypeOut::EVN: extension = "evn"; break; + case rdo::converter::smr2rdox::FileTypeOut::PRC: extension = "prc"; break; + default: NEVER_REACH_HERE; + } + + return (m_filePath / m_modelName).replace_extension(extension); } Document::LPMemoryStream Document::getMemoryStream(Type type) { - auto it = m_memoryFileList.find(type); - if (it == m_memoryFileList.end()) - { - LPMemoryStream pMemoryStream = LPMemoryStream(new MemoryStream()); - std::pair result = m_memoryFileList.insert(MemoryFileList::value_type(type, pMemoryStream)); - ASSERT(result.second); - it = result.first; - } - return it->second; + auto it = m_memoryFileList.find(type); + if (it == m_memoryFileList.end()) + { + LPMemoryStream pMemoryStream = LPMemoryStream(new MemoryStream()); + std::pair result = m_memoryFileList.insert(MemoryFileList::value_type(type, pMemoryStream)); + ASSERT(result.second); + it = result.first; + } + return it->second; } Document::LPFileStream Document::getFileStream(TypeOut type) { - auto it = m_streamFileList.find(type); - if (it == m_streamFileList.end()) - { - LPFileStream pFileStream = LPFileStream(new boost::filesystem::ofstream(getName(type), std::ios::trunc | std::ios::binary)); - std::pair result = m_streamFileList.insert(StreamFileList::value_type(type, pFileStream)); - ASSERT(result.second); - it = result.first; - } - return it->second; + auto it = m_streamFileList.find(type); + if (it == m_streamFileList.end()) + { + LPFileStream pFileStream = LPFileStream(new boost::filesystem::ofstream(getName(type), std::ios::trunc | std::ios::binary)); + std::pair result = m_streamFileList.insert(StreamFileList::value_type(type, pFileStream)); + ASSERT(result.second); + it = result.first; + } + return it->second; } void Document::insert(Type type, std::size_t to, const std::string& value) { - LPMemoryStream streamOut = getMemoryStream(type); - streamOut->insert(to, value); - - for (const auto& update: m_updateContainer) - { - if (!update.second) - { - LPDocUpdate pUpdate = update.first; - ASSERT(pUpdate); - pUpdate->insert(type, to, value.length()); - } - } + LPMemoryStream streamOut = getMemoryStream(type); + streamOut->insert(to, value); + + for (const auto& update: m_updateContainer) + { + if (!update.second) + { + LPDocUpdate pUpdate = update.first; + ASSERT(pUpdate); + pUpdate->insert(type, to, value.length()); + } + } } void Document::remove(Type type, std::size_t from, std::size_t to) { - LPMemoryStream streamOut = getMemoryStream(type); - streamOut->remove(from, to); - - for (const auto& update: m_updateContainer) - { - if (!update.second) - { - LPDocUpdate pUpdate = update.first; - ASSERT(pUpdate); - pUpdate->remove(type, from, to); - } - } + LPMemoryStream streamOut = getMemoryStream(type); + streamOut->remove(from, to); + + for (const auto& update: m_updateContainer) + { + if (!update.second) + { + LPDocUpdate pUpdate = update.first; + ASSERT(pUpdate); + pUpdate->remove(type, from, to); + } + } } std::string Document::get(Type type, std::size_t from, std::size_t to) { - return getMemoryStream(type)->get(from, to); + return getMemoryStream(type)->get(from, to); } // -------------------------------------------------------------------------------- @@ -226,87 +226,84 @@ std::string Document::get(Type type, std::size_t from, std::size_t to) // -------------------------------------------------------------------------------- void Document::MemoryStream::init(std::ifstream& stream) { - if (!m_buffer.empty()) - { - return; - } - - for (;;) - { - char byte; - stream.get(byte); - if (stream.eof()) - { - break; - } - m_buffer.push_back(byte); - } + if (!m_buffer.empty()) + return; + + for (;;) + { + char byte; + stream.get(byte); + if (stream.eof()) + break; + + m_buffer.push_back(byte); + } } void Document::MemoryStream::get(std::ofstream& stream) const { - std::string result = rdo::locale::convertFromCLocale(std::string(&m_buffer[0], m_buffer.size())); - stream << result; + std::string result = rdo::locale::convertFromCLocale(std::string(&m_buffer[0], m_buffer.size())); + stream << result; } void Document::MemoryStream::insert(std::size_t to, const std::string& value) { - Buffer::iterator itTo; - switch (to) - { - case IDocUpdate::Position::POSITION_BEGIN: itTo = m_buffer.begin(); break; - case IDocUpdate::Position::POSITION_END : itTo = m_buffer.end(); break; - default : itTo = m_buffer.begin() + to; break; - } - - for (std::size_t i = 0; i < value.length(); ++i) - { - itTo = m_buffer.insert(itTo, value[i]); - ++itTo; - } + Buffer::iterator itTo; + switch (to) + { + case std::size_t(IDocUpdate::Position::Type::POSITION_BEGIN): itTo = m_buffer.begin(); break; + case std::size_t(IDocUpdate::Position::Type::POSITION_END): itTo = m_buffer.end(); break; + default: itTo = m_buffer.begin() + to; break; + } + + for (std::size_t i = 0; i < value.length(); ++i) + { + itTo = m_buffer.insert(itTo, value[i]); + ++itTo; + } } void Document::MemoryStream::remove(std::size_t from, std::size_t to) { - Buffer::iterator itFrom; - switch (from) - { - case IDocUpdate::Position::POSITION_BEGIN: itFrom = m_buffer.begin(); break; - case IDocUpdate::Position::POSITION_END : itFrom = m_buffer.end(); break; - default : itFrom = m_buffer.begin() + from; break; - } - - Buffer::iterator itTo; - switch (to) - { - case IDocUpdate::Position::POSITION_BEGIN: itTo = m_buffer.begin(); break; - case IDocUpdate::Position::POSITION_END : itTo = m_buffer.end(); break; - default : itTo = m_buffer.begin() + to; break; - } - - m_buffer.erase(itFrom, itTo); + Buffer::iterator itFrom; + switch (from) + { + case std::size_t(IDocUpdate::Position::Type::POSITION_BEGIN): itFrom = m_buffer.begin(); break; + case std::size_t(IDocUpdate::Position::Type::POSITION_END): itFrom = m_buffer.end(); break; + default: itFrom = m_buffer.begin() + from; break; + } + + Buffer::iterator itTo; + switch (to) + { + case std::size_t(IDocUpdate::Position::Type::POSITION_BEGIN): itTo = m_buffer.begin(); break; + case std::size_t(IDocUpdate::Position::Type::POSITION_END): itTo = m_buffer.end(); break; + default: itTo = m_buffer.begin() + to; break; + } + + m_buffer.erase(itFrom, itTo); } std::string Document::MemoryStream::get(std::size_t from, std::size_t to) { - switch (from) - { - case IDocUpdate::Position::POSITION_BEGIN: from = 0; break; - case IDocUpdate::Position::POSITION_END : from = m_buffer.size(); break; - } - - switch (to) - { - case IDocUpdate::Position::POSITION_BEGIN: to = 0; break; - case IDocUpdate::Position::POSITION_END : to = m_buffer.size(); break; - } - - Buffer::iterator itFrom = m_buffer.begin() + from; - Buffer::iterator itTo = m_buffer.begin() + to; - std::string result; - result.resize(to - from); - std::copy(itFrom, itTo, result.begin()); - return result; + switch (from) + { + case std::size_t(IDocUpdate::Position::Type::POSITION_BEGIN): from = 0; break; + case std::size_t(IDocUpdate::Position::Type::POSITION_END): from = m_buffer.size(); break; + } + + switch (to) + { + case std::size_t(IDocUpdate::Position::Type::POSITION_BEGIN): to = 0; break; + case std::size_t(IDocUpdate::Position::Type::POSITION_END): to = m_buffer.size(); break; + } + + Buffer::iterator itFrom = m_buffer.begin() + from; + Buffer::iterator itTo = m_buffer.begin() + to; + std::string result; + result.resize(to - from); + std::copy(itFrom, itTo, result.begin()); + return result; } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/update/document.h b/converter/smr2rdox/update/document.h index a507280fb..9d438cb2f 100644 --- a/converter/smr2rdox/update/document.h +++ b/converter/smr2rdox/update/document.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_DOCUMENT_H_ -#define _CONVERTOR_DOCUMENT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -23,63 +22,61 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------------------------------------------------------------------- PREDECLARE_POINTER(Document); class Document - : public rdo::counter_reference - , public IDocument + : public rdo::counter_reference + , public IDocument { DECLARE_FACTORY(Document) public: - typedef rdo::converter::smr2rdox::RDOFileTypeOut TypeOut; + typedef rdo::converter::smr2rdox::FileTypeOut TypeOut; - void create (const boost::filesystem::path& filePath, const boost::filesystem::path& modelName); - void init (rdo::converter::smr2rdox::RDOFileTypeIn type, std::ifstream& stream); - void insertUpdate(const LPDocUpdate& pUpdate); - void convert (); - void close (); - boost::filesystem::path getName(TypeOut typeOut) const; + void create (const boost::filesystem::path& filePath, const boost::filesystem::path& modelName); + void init (rdo::converter::smr2rdox::FileTypeIn type, std::ifstream& stream); + void insertUpdate(const LPDocUpdate& pUpdate); + void convert (); + void close (); + boost::filesystem::path getName(TypeOut typeOut) const; private: - Document(); - ~Document(); + Document(); + ~Document(); - class MemoryStream - { - public: - typedef std::vector Buffer; + class MemoryStream + { + public: + typedef std::vector Buffer; - void init(std::ifstream& stream); - void get(std::ofstream& stream) const; + void init(std::ifstream& stream); + void get(std::ofstream& stream) const; - void insert(std::size_t to, const std::string& value); - void remove(std::size_t from, std::size_t to); + void insert(std::size_t to, const std::string& value); + void remove(std::size_t from, std::size_t to); - std::string get(std::size_t from, std::size_t to); + std::string get(std::size_t from, std::size_t to); - private: - Buffer m_buffer; - }; + private: + Buffer m_buffer; + }; - typedef boost::shared_ptr LPMemoryStream; - typedef boost::shared_ptr LPFileStream; - typedef std::map MemoryFileList; - typedef std::map StreamFileList; + typedef boost::shared_ptr LPMemoryStream; + typedef boost::shared_ptr LPFileStream; + typedef std::map MemoryFileList; + typedef std::map StreamFileList; - typedef std::pair Update; - typedef std::list UpdateContainer; + typedef std::pair Update; + typedef std::list UpdateContainer; - boost::filesystem::path m_filePath; - boost::filesystem::path m_modelName; - MemoryFileList m_memoryFileList; - StreamFileList m_streamFileList; - UpdateContainer m_updateContainer; + boost::filesystem::path m_filePath; + boost::filesystem::path m_modelName; + MemoryFileList m_memoryFileList; + StreamFileList m_streamFileList; + UpdateContainer m_updateContainer; - LPMemoryStream getMemoryStream(Type type); - LPFileStream getFileStream (TypeOut type); + LPMemoryStream getMemoryStream(Type type); + LPFileStream getFileStream (TypeOut type); - TypeOut typeToOut(const Type& typeIn) const; + TypeOut typeToOut(const Type& typeIn) const; - DECLARE_IDocument; + DECLARE_IDocument; }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_DOCUMENT_H_ diff --git a/converter/smr2rdox/update/document_i.h b/converter/smr2rdox/update/document_i.h index e48f25aa8..0ee37c6af 100644 --- a/converter/smr2rdox/update/document_i.h +++ b/converter/smr2rdox/update/document_i.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_DOCUMENT_I_H_ -#define _CONVERTOR_DOCUMENT_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -18,29 +17,27 @@ struct IDocument: public rdo::RefCounter { DECLARE_FACTORY(IDocument) public: - enum Type - { - UNDEFINED = 0, - PAT, RTP, RSS, OPR, FRM, - FUN, DPT, SMR, PMD, PMV, - TRC, EVN, PRC - }; - - virtual void insert(Type type, std::size_t to, const std::string& value) = 0; - virtual void remove(Type type, std::size_t from, std::size_t to) = 0; - virtual std::string get(Type type, std::size_t from, std::size_t to) = 0; + enum class Type + { + UNDEFINED = 0, + PAT, RTP, RSS, OPR, FRM, + FUN, DPT, SMR, PMD, PMV, + TRC, EVN, PRC + }; + + virtual void insert(Type type, std::size_t to, const std::string& value) = 0; + virtual void remove(Type type, std::size_t from, std::size_t to) = 0; + virtual std::string get(Type type, std::size_t from, std::size_t to) = 0; protected: - IDocument() - {} - virtual ~IDocument() - {} + IDocument() + {} + virtual ~IDocument() + {} }; #define DECLARE_IDocument \ - void insert(Type type, std::size_t to, const std::string& value); \ - void remove(Type type, std::size_t from, std::size_t to); \ - std::string get(Type type, std::size_t from, std::size_t to); + void insert(Type type, std::size_t to, const std::string& value); \ + void remove(Type type, std::size_t from, std::size_t to); \ + std::string get(Type type, std::size_t from, std::size_t to); CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_DOCUMENT_I_H_ diff --git a/converter/smr2rdox/update/update.cpp b/converter/smr2rdox/update/update.cpp index 68f9d92e3..8fec5def3 100644 --- a/converter/smr2rdox/update/update.cpp +++ b/converter/smr2rdox/update/update.cpp @@ -12,429 +12,427 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- DocUpdate // -------------------------------------------------------------------------------- DocUpdate::DocUpdate(IDocument::Type file) - : m_file(file) + : m_file(file) { - if (m_file == IDocument::UNDEFINED) - { - m_file = getCurrentType(); - } + if (m_file == IDocument::Type::UNDEFINED) + m_file = getCurrentType(); } IDocument::Type DocUpdate::getCurrentType() const { - switch (Converter::getFileToParse()) - { - case rdo::converter::smr2rdox::PAT_IN: return IDocument::PAT; - case rdo::converter::smr2rdox::RTP_IN: return IDocument::RTP; - case rdo::converter::smr2rdox::RSS_IN: return IDocument::RSS; - case rdo::converter::smr2rdox::OPR_IN: return IDocument::OPR; - case rdo::converter::smr2rdox::FRM_IN: return IDocument::FRM; - case rdo::converter::smr2rdox::FUN_IN: return IDocument::FUN; - case rdo::converter::smr2rdox::DPT_IN: return IDocument::DPT; - case rdo::converter::smr2rdox::SMR_IN: return IDocument::SMR; - case rdo::converter::smr2rdox::PMD_IN: return IDocument::PMD; - case rdo::converter::smr2rdox::PMV_IN: return IDocument::PMV; - case rdo::converter::smr2rdox::TRC_IN: return IDocument::TRC; - default: NEVER_REACH_HERE; - } - NEVER_REACH_HERE; - return IDocument::TRC; + switch (Converter::getFileToParse()) + { + case rdo::converter::smr2rdox::FileTypeIn::PAT: return IDocument::Type::PAT; + case rdo::converter::smr2rdox::FileTypeIn::RTP: return IDocument::Type::RTP; + case rdo::converter::smr2rdox::FileTypeIn::RSS: return IDocument::Type::RSS; + case rdo::converter::smr2rdox::FileTypeIn::OPR: return IDocument::Type::OPR; + case rdo::converter::smr2rdox::FileTypeIn::FRM: return IDocument::Type::FRM; + case rdo::converter::smr2rdox::FileTypeIn::FUN: return IDocument::Type::FUN; + case rdo::converter::smr2rdox::FileTypeIn::DPT: return IDocument::Type::DPT; + case rdo::converter::smr2rdox::FileTypeIn::SMR: return IDocument::Type::SMR; + case rdo::converter::smr2rdox::FileTypeIn::PMD: return IDocument::Type::PMD; + case rdo::converter::smr2rdox::FileTypeIn::PMV: return IDocument::Type::PMV; + case rdo::converter::smr2rdox::FileTypeIn::TRC: return IDocument::Type::TRC; + default: NEVER_REACH_HERE; + } + NEVER_REACH_HERE; + return IDocument::Type::TRC; } // -------------------------------------------------------------------------------- // -------------------- UpdateInsert // -------------------------------------------------------------------------------- UpdateInsert::UpdateInsert(const Position& pos, const std::string& value, IDocument::Type file) - : DocUpdate(file ) - , m_pos (pos ) - , m_value (value) + : DocUpdate(file ) + , m_pos (pos ) + , m_value (value) {} void UpdateInsert::dump(LPIDocument& pDocument) const { - const std::string log = rdo::format("update insert <%d>, %d, '%s', dump: '%s'\n" - , m_file - , m_pos.get() - , m_value.c_str() - , pDocument->get(m_file, m_pos.get(), m_pos.get()).c_str() - ); - TRACE(log.c_str()); + const std::string log = rdo::format("update insert <%d>, %d, '%s', dump: '%s'\n" + , m_file + , m_pos.get() + , m_value.c_str() + , pDocument->get(m_file, m_pos.get(), m_pos.get()).c_str() + ); + TRACE(log.c_str()); } void UpdateInsert::apply(LPIDocument& pDocument) const { - pDocument->insert(m_file, m_pos.get(), m_value); + pDocument->insert(m_file, m_pos.get(), m_value); } void UpdateInsert::insert(IDocument::Type type, const Position& to, std::size_t size) { - if (m_file != type) - return; + if (m_file != type) + return; - ASSERT(to <= m_pos || to >= m_pos + m_value.length()); + ASSERT(to <= m_pos || to >= m_pos + m_value.length()); - if (to <= m_pos) - { - m_pos += size; - } + if (to <= m_pos) + { + m_pos += size; + } } void UpdateInsert::remove(IDocument::Type type, const Position& from, const Position& to) { - if (m_file != type) - return; + if (m_file != type) + return; - ASSERT(to <= m_pos || (from >= m_pos + m_value.length() && to > m_pos + m_value.length())); + ASSERT(to <= m_pos || (from >= m_pos + m_value.length() && to > m_pos + m_value.length())); - if (to <= m_pos) - { - m_pos -= to - from; - } + if (to <= m_pos) + { + m_pos -= to - from; + } } // -------------------------------------------------------------------------------- // -------------------- UpdateDelete // -------------------------------------------------------------------------------- UpdateDelete::UpdateDelete(const Position& posFrom, const Position& posTo) - : m_posFrom(posFrom) - , m_posTo (posTo ) + : m_posFrom(posFrom) + , m_posTo (posTo ) { - ASSERT(m_posFrom < m_posTo); + ASSERT(m_posFrom < m_posTo); } void UpdateDelete::dump(LPIDocument& pDocument) const { - const std::string log = rdo::format("update delete <%d>, [%d - %d), dump: '%s'\n" - , m_file - , m_posFrom.get() - , m_posTo.get() - , pDocument->get(m_file, m_posFrom.get(), m_posTo.get()).c_str() - ); - TRACE(log.c_str()); + const std::string log = rdo::format("update delete <%d>, [%d - %d), dump: '%s'\n" + , m_file + , m_posFrom.get() + , m_posTo.get() + , pDocument->get(m_file, m_posFrom.get(), m_posTo.get()).c_str() + ); + TRACE(log.c_str()); } void UpdateDelete::apply(LPIDocument& pDocument) const { - pDocument->remove(m_file, m_posFrom.get(), m_posTo.get()); + pDocument->remove(m_file, m_posFrom.get(), m_posTo.get()); } void UpdateDelete::insert(IDocument::Type type, const Position& to, std::size_t size) { - if (m_file != type) - return; - - ASSERT(to <= m_posFrom || to > m_posTo); - - if (to <= m_posFrom) - { - m_posFrom += size; - m_posTo += size; - } + if (m_file != type) + return; + + if (to <= m_posFrom) + { + m_posFrom += size; + m_posTo += size; + } + else if (to <= m_posTo) + { + m_posTo += size; + } } void UpdateDelete::remove(IDocument::Type type, const Position& from, const Position& to) { - if (m_file != type) - return; + if (m_file != type) + return; - ASSERT(to <= m_posFrom || (from >= m_posTo && to >= m_posTo)); + ASSERT(to <= m_posFrom || (from >= m_posTo && to >= m_posTo)); - if (to <= m_posFrom) - { - m_posFrom -= to - from; - m_posTo -= to - from; - } + if (to <= m_posFrom) + { + m_posFrom -= to - from; + m_posTo -= to - from; + } } // -------------------------------------------------------------------------------- // -------------------- UpdateReplace // -------------------------------------------------------------------------------- UpdateReplace::UpdateReplace(const Position& posFrom, const Position& posTo, const std::string& value, IDocument::Type file) - : DocUpdate(file) + : DocUpdate(file) { - pDelete = rdo::Factory::create(posFrom, posTo); - ASSERT(pDelete); + pDelete = rdo::Factory::create(posFrom, posTo); + ASSERT(pDelete); - pInsert = rdo::Factory::create(posFrom, value, file); - ASSERT(pInsert); + pInsert = rdo::Factory::create(posFrom, value, file); + ASSERT(pInsert); } void UpdateReplace::dump(LPIDocument& pDocument) const { - TRACE("update replace...\n"); - pDelete->dump(pDocument); - pInsert->dump(pDocument); - TRACE("update replace... ok\n"); + TRACE("update replace...\n"); + pDelete->dump(pDocument); + pInsert->dump(pDocument); + TRACE("update replace... ok\n"); } void UpdateReplace::apply(LPIDocument& pDocument) const { - pDelete->apply(pDocument); - pInsert->apply(pDocument); + pDelete->apply(pDocument); + pInsert->apply(pDocument); } void UpdateReplace::insert(IDocument::Type type, const Position& to, std::size_t size) { - pDelete->insert(type, to, size); - pInsert->insert(type, to, size); + pDelete->insert(type, to, size); + pInsert->insert(type, to, size); } void UpdateReplace::remove(IDocument::Type type, const Position& from, const Position& to) { - pDelete->remove(type, from, to); - pInsert->remove(type, from, to); + pDelete->remove(type, from, to); + pInsert->remove(type, from, to); } // -------------------------------------------------------------------------------- // -------------------- UpdateMove // -------------------------------------------------------------------------------- UpdateMove::UpdateMove(const Position& posFromBegin, const Position& posFromEnd, const Position& posTo, IDocument::Type fileTo, IDocument::Type fileFrom) - : DocUpdate (fileTo ) - , m_posFromBegin(posFromBegin) - , m_posFromEnd (posFromEnd ) - , m_posTo (posTo ) - , m_fileFrom (fileFrom ) + : DocUpdate (fileTo ) + , m_posFromBegin(posFromBegin) + , m_posFromEnd (posFromEnd ) + , m_posTo (posTo ) + , m_fileFrom (fileFrom ) { - if (static_cast(m_fileFrom) == static_cast(rdo::converter::smr2rdox::UNDEFINED_OUT)) - { - m_fileFrom = getCurrentType(); - } + if (static_cast(m_fileFrom) == static_cast(rdo::converter::smr2rdox::FileTypeOut::UNDEFINED)) + m_fileFrom = getCurrentType(); } void UpdateMove::dump(LPIDocument& pDocument) const { - const std::string log = rdo::format("update move <%d->%d>, [%d - %d) '%s', %d\n" - , m_fileFrom - , m_file - , m_posFromBegin.get() - , m_posFromEnd.get() - , pDocument->get(m_fileFrom, m_posFromBegin.get(), m_posFromEnd.get()).c_str() - , m_posTo.get() - ); - TRACE(log.c_str()); + const std::string log = rdo::format("update move <%d->%d>, [%d - %d) '%s', %d\n" + , m_fileFrom + , m_file + , m_posFromBegin.get() + , m_posFromEnd.get() + , pDocument->get(m_fileFrom, m_posFromBegin.get(), m_posFromEnd.get()).c_str() + , m_posTo.get() + ); + TRACE(log.c_str()); } void UpdateMove::apply(LPIDocument& pDocument) const { - const std::string cut = pDocument->get(m_fileFrom, m_posFromBegin.get(), m_posFromEnd.get()); - pDocument->remove(m_fileFrom, m_posFromBegin.get(), m_posFromEnd.get()); - - Position pos = m_posTo; - if (pos.real()) - { - if (m_posFromEnd < pos) - { - //! Удалили перед собой, сдвинемся к началу - pos -= m_posFromEnd - m_posFromBegin; - } - } - pDocument->insert(m_file, pos.get(), cut); + const std::string cut = pDocument->get(m_fileFrom, m_posFromBegin.get(), m_posFromEnd.get()); + pDocument->remove(m_fileFrom, m_posFromBegin.get(), m_posFromEnd.get()); + + Position pos = m_posTo; + if (pos.real()) + { + if (m_posFromEnd < pos) + { + // Удалили перед собой, сдвинемся к началу + pos -= m_posFromEnd - m_posFromBegin; + } + } + pDocument->insert(m_file, pos.get(), cut); } void UpdateMove::insert(IDocument::Type type, const Position& to, std::size_t size) { - if (to.end()) - return; - - if (m_fileFrom == type) - { - if (to.begin()) - { - //! Вставка до, сдвинемся к концу - m_posFromBegin += size; - m_posFromEnd += size; - } - else - { - if (to < m_posFromBegin && m_posFromBegin != m_posFromEnd) - { - //! Вставка до, сдвинемся к концу - m_posFromBegin += size; - m_posFromEnd += size; - } - else if (to == m_posFromBegin && to + size <= m_posFromEnd && m_posFromBegin != m_posFromEnd) - { - //! Вставка внутри, расширим конец - m_posFromEnd += size; - } - else if (to == m_posFromBegin && m_posFromBegin == m_posFromEnd) - { - //! Вставка в пустой интервал, расширим конец - m_posFromEnd += size; - } - else if (to > m_posFromBegin && to <= m_posFromEnd) - { - //! Вставка внутрь, расширим конец - m_posFromEnd += size; - } - } - } - - if (m_file == type) - { - if (m_posTo.real()) - { - if (to.begin() || to <= m_posTo) - { - //! Вставка до, сдвинемся к концу - m_posTo += size; - } - } - } + if (to.end()) + return; + + if (m_fileFrom == type) + { + if (to.begin()) + { + // Вставка до, сдвинемся к концу + m_posFromBegin += size; + m_posFromEnd += size; + } + else + { + if (to < m_posFromBegin && m_posFromBegin != m_posFromEnd) + { + // Вставка до, сдвинемся к концу + m_posFromBegin += size; + m_posFromEnd += size; + } + else if (to == m_posFromBegin && to + size <= m_posFromEnd && m_posFromBegin != m_posFromEnd) + { + // Вставка внутри, расширим конец + m_posFromEnd += size; + } + else if (to == m_posFromBegin && m_posFromBegin == m_posFromEnd) + { + // Вставка в пустой интервал, расширим конец + m_posFromEnd += size; + } + else if (to > m_posFromBegin && to <= m_posFromEnd) + { + // Вставка внутрь, расширим конец + m_posFromEnd += size; + } + } + } + + if (m_file == type) + { + if (m_posTo.real()) + { + if (to.begin() || to <= m_posTo) + { + // Вставка до, сдвинемся к концу + m_posTo += size; + } + } + } } void UpdateMove::remove(IDocument::Type type, const Position& from, const Position& to) { - if (m_fileFrom == type) - { - if (to < m_posFromBegin) - { - //! Удаление до, сдвинемся к началу - m_posFromBegin -= to - from; - m_posFromEnd -= to - from; - } - else if (m_posFromBegin <= from && to <= m_posFromEnd) - { - //! Удаление внутри, подрежем конец - m_posFromEnd -= to - from; - } - } - - if (m_file == type) - { - if (m_posTo.real()) - { - if (to < m_posTo) - { - //! Удаление до, сдвинемся к началу - m_posTo -= to - from; - } - } - } + if (m_fileFrom == type) + { + if (to < m_posFromBegin) + { + // Удаление до, сдвинемся к началу + m_posFromBegin -= to - from; + m_posFromEnd -= to - from; + } + else if (m_posFromBegin <= from && to <= m_posFromEnd) + { + // Удаление внутри, подрежем конец + m_posFromEnd -= to - from; + } + } + + if (m_file == type) + { + if (m_posTo.real()) + { + if (to < m_posTo) + { + // Удаление до, сдвинемся к началу + m_posTo -= to - from; + } + } + } } // -------------------------------------------------------------------------------- // -------------------- UpdateSwap // -------------------------------------------------------------------------------- UpdateSwap::UpdateSwap(const Position& pos1Begin, const Position& pos1End, const Position& pos2Begin, const Position& pos2End, IDocument::Type file) - : DocUpdate (file ) - , m_pos1Begin(pos1Begin) - , m_pos1End (pos1End ) - , m_pos2Begin(pos2Begin) - , m_pos2End (pos2End ) + : DocUpdate (file ) + , m_pos1Begin(pos1Begin) + , m_pos1End (pos1End ) + , m_pos2Begin(pos2Begin) + , m_pos2End (pos2End ) {} void UpdateSwap::dump(LPIDocument& pDocument) const { - const std::string log = rdo::format("update swap <%d>: [%d, %d) <-> [%d - %d), '%s' <-> '%s'\n" - , m_file - , m_pos1Begin.get() - , m_pos1End.get() - , m_pos2Begin.get() - , m_pos2End.get() - , pDocument->get(m_file, m_pos1Begin.get(), m_pos1End.get()).c_str() - , pDocument->get(m_file, m_pos2Begin.get(), m_pos2End.get()).c_str() - ); - TRACE(log.c_str()); + const std::string log = rdo::format("update swap <%d>: [%d, %d) <-> [%d - %d), '%s' <-> '%s'\n" + , m_file + , m_pos1Begin.get() + , m_pos1End.get() + , m_pos2Begin.get() + , m_pos2End.get() + , pDocument->get(m_file, m_pos1Begin.get(), m_pos1End.get()).c_str() + , pDocument->get(m_file, m_pos2Begin.get(), m_pos2End.get()).c_str() + ); + TRACE(log.c_str()); } void UpdateSwap::apply(LPIDocument& pDocument) const { - //! Запомним значения - const std::string cut1 = pDocument->get(m_file, m_pos1Begin.get(), m_pos1End.get()); - const std::string cut2 = pDocument->get(m_file, m_pos2Begin.get(), m_pos2End.get()); - - //! Удалим первый интервал - pDocument->remove(m_file, m_pos1Begin.get(), m_pos1End.get()); - - Position pos2Begin = m_pos2Begin; - Position pos2End = m_pos2End; - if (m_pos1End <= pos2Begin) - { - //! Удаление перед вторым интервалом, сдвинемся к началу - pos2Begin -= m_pos1End - m_pos1Begin; - pos2End -= m_pos1End - m_pos1Begin; - } - - //! Удалим второй интервал - pDocument->remove(m_file, pos2Begin.get(), pos2End.get()); - - Position pos1Begin = m_pos1Begin; - Position pos1End = m_pos1End; - if (pos2End <= pos1Begin) - { - //! Удаление перед первым интервалом, сдвинемся к началу - pos1Begin -= pos2End - pos2Begin; - pos1End -= pos2End - pos2Begin; - } - - //! Вставка первого буффера на место второго - pDocument->insert(m_file, pos2Begin.get(), cut1); - - if (pos2Begin <= pos1Begin) - { - //! Вставка перед первым интервалом, сдвинемся к концу - pos1Begin += cut1.length(); - pos1End += cut1.length(); - } - - //! Вставка второго буффера на место первого - pDocument->insert(m_file, pos1Begin.get(), cut2); + // Запомним значения + const std::string cut1 = pDocument->get(m_file, m_pos1Begin.get(), m_pos1End.get()); + const std::string cut2 = pDocument->get(m_file, m_pos2Begin.get(), m_pos2End.get()); + + // Удалим первый интервал + pDocument->remove(m_file, m_pos1Begin.get(), m_pos1End.get()); + + Position pos2Begin = m_pos2Begin; + Position pos2End = m_pos2End; + if (m_pos1End <= pos2Begin) + { + // Удаление перед вторым интервалом, сдвинемся к началу + pos2Begin -= m_pos1End - m_pos1Begin; + pos2End -= m_pos1End - m_pos1Begin; + } + + // Удалим второй интервал + pDocument->remove(m_file, pos2Begin.get(), pos2End.get()); + + Position pos1Begin = m_pos1Begin; + Position pos1End = m_pos1End; + if (pos2End <= pos1Begin) + { + // Удаление перед первым интервалом, сдвинемся к началу + pos1Begin -= pos2End - pos2Begin; + pos1End -= pos2End - pos2Begin; + } + + // Вставка первого буффера на место второго + pDocument->insert(m_file, pos2Begin.get(), cut1); + + if (pos2Begin <= pos1Begin) + { + // Вставка перед первым интервалом, сдвинемся к концу + pos1Begin += cut1.length(); + pos1End += cut1.length(); + } + + // Вставка второго буффера на место первого + pDocument->insert(m_file, pos1Begin.get(), cut2); } void UpdateSwap::insert(IDocument::Type type, const Position& to, std::size_t size) { - if (m_file != type) - return; + if (m_file != type) + return; - insert(to, size, m_pos1Begin, m_pos1End); - insert(to, size, m_pos2Begin, m_pos2End); + insert(to, size, m_pos1Begin, m_pos1End); + insert(to, size, m_pos2Begin, m_pos2End); } void UpdateSwap::remove(IDocument::Type type, const Position& from, const Position& to) { - if (m_file != type) - return; + if (m_file != type) + return; - remove(from, to, m_pos1Begin, m_pos1End); - remove(from, to, m_pos2Begin, m_pos2End); + remove(from, to, m_pos1Begin, m_pos1End); + remove(from, to, m_pos2Begin, m_pos2End); } void UpdateSwap::insert(const Position& from, const std::size_t& size, Position& posBegin, Position& posEnd) { - if (from < posBegin) - { - posBegin += size; - posEnd += size; - } - - if (posBegin <= from && from + size <= posEnd) - { - posEnd += size; - } - - if (from <= posEnd && posEnd < from + size) - { - ASSERT(posBegin <= from); - posEnd += from + size - posEnd; - } + if (from < posBegin) + { + posBegin += size; + posEnd += size; + } + + if (posBegin <= from && from + size <= posEnd) + { + posEnd += size; + } + + if (from <= posEnd && posEnd < from + size) + { + ASSERT(posBegin <= from); + posEnd += from + size - posEnd; + } } void UpdateSwap::remove(const Position& from, const Position& to, Position& posBegin, Position& posEnd) { - if (to <= posBegin) - { - posBegin -= to - from; - posEnd -= to - from; - } - else if (posBegin <= from && to <= posEnd) - { - posEnd -= to - from; - } - else if (from < posEnd && posEnd < to) - { - posEnd = from; - } + if (to <= posBegin) + { + posBegin -= to - from; + posEnd -= to - from; + } + else if (posBegin <= from && to <= posEnd) + { + posEnd -= to - from; + } + else if (from < posEnd && posEnd < to) + { + posEnd = from; + } } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/update/update.h b/converter/smr2rdox/update/update.h index 9fa44f09a..aede1da94 100644 --- a/converter/smr2rdox/update/update.h +++ b/converter/smr2rdox/update/update.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_UPDATE_H_ -#define _CONVERTOR_UPDATE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -17,12 +16,12 @@ class UpdateInsert: public DocUpdate { DECLARE_FACTORY(UpdateInsert) private: - UpdateInsert(const Position& pos, const std::string& value, IDocument::Type file = IDocument::UNDEFINED); + UpdateInsert(const Position& pos, const std::string& value, IDocument::Type file = IDocument::Type::UNDEFINED); - Position m_pos; - std::string m_value; + Position m_pos; + std::string m_value; - DECLARE_IDocUpdate; + DECLARE_IDocUpdate; }; // -------------------------------------------------------------------------------- @@ -32,12 +31,12 @@ class UpdateDelete: public DocUpdate { DECLARE_FACTORY(UpdateDelete) private: - UpdateDelete(const Position& posFrom, const Position& posTo); + UpdateDelete(const Position& posFrom, const Position& posTo); - Position m_posFrom; - Position m_posTo; + Position m_posFrom; + Position m_posTo; - DECLARE_IDocUpdate; + DECLARE_IDocUpdate; }; // -------------------------------------------------------------------------------- @@ -47,12 +46,12 @@ class UpdateReplace: public DocUpdate { DECLARE_FACTORY(UpdateReplace) private: - UpdateReplace(const Position& posFrom, const Position& posTo, const std::string& value, IDocument::Type file = IDocument::UNDEFINED); + UpdateReplace(const Position& posFrom, const Position& posTo, const std::string& value, IDocument::Type file = IDocument::Type::UNDEFINED); - LPDocUpdate pDelete; - LPDocUpdate pInsert; + LPDocUpdate pDelete; + LPDocUpdate pInsert; - DECLARE_IDocUpdate; + DECLARE_IDocUpdate; }; // -------------------------------------------------------------------------------- @@ -62,18 +61,18 @@ class UpdateMove: public DocUpdate { DECLARE_FACTORY(UpdateMove) private: - UpdateMove(const Position& posFromBegin, - const Position& posFromEnd, - const Position& posTo, - IDocument::Type fileTo = IDocument::UNDEFINED, - IDocument::Type fileFrom = IDocument::UNDEFINED); - - Position m_posFromBegin; - Position m_posFromEnd; - Position m_posTo; - IDocument::Type m_fileFrom; - - DECLARE_IDocUpdate; + UpdateMove(const Position& posFromBegin, + const Position& posFromEnd, + const Position& posTo, + IDocument::Type fileTo = IDocument::Type::UNDEFINED, + IDocument::Type fileFrom = IDocument::Type::UNDEFINED); + + Position m_posFromBegin; + Position m_posFromEnd; + Position m_posTo; + IDocument::Type m_fileFrom; + + DECLARE_IDocUpdate; }; // -------------------------------------------------------------------------------- @@ -83,23 +82,21 @@ class UpdateSwap: public DocUpdate { DECLARE_FACTORY(UpdateSwap) private: - UpdateSwap(const Position& pos1Begin, - const Position& pos1End, - const Position& pos2Begin, - const Position& pos2End, - IDocument::Type file = IDocument::UNDEFINED); + UpdateSwap(const Position& pos1Begin, + const Position& pos1End, + const Position& pos2Begin, + const Position& pos2End, + IDocument::Type file = IDocument::Type::UNDEFINED); - Position m_pos1Begin; - Position m_pos1End; - Position m_pos2Begin; - Position m_pos2End; + Position m_pos1Begin; + Position m_pos1End; + Position m_pos2Begin; + Position m_pos2End; - void insert(const Position& from, const std::size_t& size, Position& posBegin, Position& posEnd); - void remove(const Position& from, const Position& to, Position& posBegin, Position& posEnd); + void insert(const Position& from, const std::size_t& size, Position& posBegin, Position& posEnd); + void remove(const Position& from, const Position& to, Position& posBegin, Position& posEnd); - DECLARE_IDocUpdate; + DECLARE_IDocUpdate; }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_UPDATE_H_ diff --git a/converter/smr2rdox/update/update_i.cpp b/converter/smr2rdox/update/update_i.cpp index 4087792fa..9577e8bfb 100644 --- a/converter/smr2rdox/update/update_i.cpp +++ b/converter/smr2rdox/update/update_i.cpp @@ -11,169 +11,193 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE // -------------------- IDocUpdate::Position // -------------------------------------------------------------------------------- IDocUpdate::Position::Position(std::size_t pos) - : m_position(pos) + : m_position(pos) +{} + +IDocUpdate::Position::Position(Type type) + : m_position(static_cast(type)) {} IDocUpdate::Position::Position(const Position& pos) - : m_position(pos.m_position) + : m_position(pos.m_position) {} std::size_t IDocUpdate::Position::get() const { - return m_position; + return m_position; } bool IDocUpdate::Position::begin() const { - return m_position == std::size_t(POSITION_BEGIN); + return m_position == std::size_t(Type::POSITION_BEGIN); } bool IDocUpdate::Position::end() const { - return m_position == std::size_t(POSITION_END); + return m_position == std::size_t(Type::POSITION_END); } bool IDocUpdate::Position::real() const { - return m_position != std::size_t(POSITION_BEGIN) && m_position != std::size_t(POSITION_END); + return m_position != std::size_t(Type::POSITION_BEGIN) && m_position != std::size_t(Type::POSITION_END); } void IDocUpdate::Position::operator+= (const Position& pos) { - if (real() && pos.real()) - { - m_position += pos.m_position; - } + if (real() && pos.real()) + { + m_position += pos.m_position; + } } void IDocUpdate::Position::operator-= (const Position& pos) { - if (real() && pos.real()) - { - m_position -= pos.m_position; - } + if (real() && pos.real()) + { + m_position -= pos.m_position; + } } IDocUpdate::Position IDocUpdate::Position::operator+ (const Position& pos) const { - if (real() && pos.real()) - { - return Position(m_position + pos.m_position); - } + if (real() && pos.real()) + { + return Position(m_position + pos.m_position); + } - NEVER_REACH_HERE; - return Position(0); + NEVER_REACH_HERE; + return Position(0); } IDocUpdate::Position IDocUpdate::Position::operator- (const Position& pos) const { - if (real() && pos.real()) - { - return Position(m_position - pos.m_position); - } + if (real() && pos.real()) + { + return Position(m_position - pos.m_position); + } - NEVER_REACH_HERE; - return Position(0); + NEVER_REACH_HERE; + return Position(0); } bool IDocUpdate::Position::operator<= (const Position& pos) const { - switch(get()) - { - case POSITION_BEGIN: return true; - case POSITION_END : switch (pos.get()) - { - case POSITION_BEGIN: return false; - case POSITION_END : return true; - default : return false; - } - default : switch (pos.get()) - { - case POSITION_BEGIN: return false; - case POSITION_END : return true; - default : return m_position <= pos.m_position; - } - } + switch(get()) + { + case std::size_t(Type::POSITION_BEGIN): + return true; + + case std::size_t(Type::POSITION_END): + switch (pos.get()) + { + case std::size_t(Type::POSITION_BEGIN): return false; + case std::size_t(Type::POSITION_END): return true; + default: return false; + } + + default: + switch (pos.get()) + { + case std::size_t(Type::POSITION_BEGIN): return false; + case std::size_t(Type::POSITION_END): return true; + default: return m_position <= pos.m_position; + } + } } bool IDocUpdate::Position::operator>= (const Position& pos) const { - switch(get()) - { - case POSITION_BEGIN: switch (pos.get()) - { - case POSITION_BEGIN: return true; - case POSITION_END : return false; - default : return false; - } - case POSITION_END : return true; - default : switch (pos.get()) - { - case POSITION_BEGIN: return true; - case POSITION_END : return false; - default : return m_position >= pos.m_position; - } - } + switch(get()) + { + case std::size_t(Type::POSITION_BEGIN): + switch (pos.get()) + { + case std::size_t(Type::POSITION_BEGIN): return true; + case std::size_t(Type::POSITION_END): return false; + default: return false; + } + + case std::size_t(Type::POSITION_END): + return true; + + default: + switch (pos.get()) + { + case std::size_t(Type::POSITION_BEGIN): return true; + case std::size_t(Type::POSITION_END): return false; + default: return m_position >= pos.m_position; + } + } } bool IDocUpdate::Position::operator< (const Position& pos) const { - switch(get()) - { - case POSITION_BEGIN: switch (pos.get()) - { - case POSITION_BEGIN: NEVER_REACH_HERE; return false; - case POSITION_END : return true; - default : return true; - } - case POSITION_END : switch (pos.get()) - { - case POSITION_BEGIN: return false; - case POSITION_END : NEVER_REACH_HERE; return false; - default : return false; - } - default : switch (pos.get()) - { - case POSITION_BEGIN: return false; - case POSITION_END : return true; - default : return m_position < pos.m_position; - } - } + switch(get()) + { + case std::size_t(Type::POSITION_BEGIN): + switch (pos.get()) + { + case std::size_t(Type::POSITION_BEGIN): NEVER_REACH_HERE; return false; + case std::size_t(Type::POSITION_END): return true; + default: return true; + } + + case std::size_t(Type::POSITION_END): + switch (pos.get()) + { + case std::size_t(Type::POSITION_BEGIN): return false; + case std::size_t(Type::POSITION_END): NEVER_REACH_HERE; return false; + default: return false; + } + + default: + switch (pos.get()) + { + case std::size_t(Type::POSITION_BEGIN): return false; + case std::size_t(Type::POSITION_END): return true; + default: return m_position < pos.m_position; + } + } } bool IDocUpdate::Position::operator> (const Position& pos) const { - switch(get()) - { - case POSITION_BEGIN: switch (pos.get()) - { - case POSITION_BEGIN: NEVER_REACH_HERE; return false; - case POSITION_END : return false; - default : return false; - } - case POSITION_END : switch (pos.get()) - { - case POSITION_BEGIN: return true; - case POSITION_END : NEVER_REACH_HERE; return false; - default : return true; - } - default : switch (pos.get()) - { - case POSITION_BEGIN: return true; - case POSITION_END : return false; - default : return m_position > pos.m_position; - } - } + switch(get()) + { + case std::size_t(Type::POSITION_BEGIN): + switch (pos.get()) + { + case std::size_t(Type::POSITION_BEGIN): NEVER_REACH_HERE; return false; + case std::size_t(Type::POSITION_END): return false; + default: return false; + } + + case std::size_t(Type::POSITION_END): + switch (pos.get()) + { + case std::size_t(Type::POSITION_BEGIN): return true; + case std::size_t(Type::POSITION_END): NEVER_REACH_HERE; return false; + default: return true; + } + + default: + switch (pos.get()) + { + case std::size_t(Type::POSITION_BEGIN): return true; + case std::size_t(Type::POSITION_END): return false; + default: return m_position > pos.m_position; + } + } } bool IDocUpdate::Position::operator== (const Position& pos) const { - return m_position == pos.m_position; + return m_position == pos.m_position; } bool IDocUpdate::Position::operator!= (const Position& pos) const { - return !operator==(pos); + return !operator==(pos); } CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE diff --git a/converter/smr2rdox/update/update_i.h b/converter/smr2rdox/update/update_i.h index 1c819ebfe..a21c2fc96 100644 --- a/converter/smr2rdox/update/update_i.h +++ b/converter/smr2rdox/update/update_i.h @@ -1,5 +1,4 @@ -#ifndef _CONVERTOR_UPDATE_I_H_ -#define _CONVERTOR_UPDATE_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -17,63 +16,62 @@ OPEN_RDO_CONVERTER_SMR2RDOX_NAMESPACE struct IDocUpdate { public: - class Position - { - public: - enum - { - POSITION_BEGIN = static_cast(~0), - POSITION_END = static_cast(~1) - }; + class Position + { + public: + enum class Type: std::size_t + { + POSITION_BEGIN = std::size_t(~0), + POSITION_END = std::size_t(~1) + }; - Position(std::size_t pos); - Position(const Position& pos); + Position(std::size_t pos); + Position(Type type); + Position(const Position& pos); - std::size_t get() const; + std::size_t get() const; - bool begin() const; - bool end() const; - bool real() const; + bool begin() const; + bool end() const; + bool real() const; - void operator+=(const Position& pos); - void operator-=(const Position& pos); - Position operator+(const Position& pos) const; - Position operator-(const Position& pos) const; - bool operator<=(const Position& pos) const; - bool operator>=(const Position& pos) const; - bool operator<(const Position& pos) const; - bool operator>(const Position& pos) const; - bool operator==(const Position& pos) const; - bool operator!=(const Position& pos) const; + void operator+=(const Position& pos); + void operator-=(const Position& pos); + Position operator+(const Position& pos) const; + Position operator-(const Position& pos) const; + bool operator<=(const Position& pos) const; + bool operator>=(const Position& pos) const; + bool operator<(const Position& pos) const; + bool operator>(const Position& pos) const; + bool operator==(const Position& pos) const; + bool operator!=(const Position& pos) const; - private: - std::size_t m_position; - }; + private: + std::size_t m_position; + }; - virtual void apply(LPIDocument& pDocument) const = 0; - virtual void insert(IDocument::Type type, const Position& to, std::size_t size) = 0; - virtual void remove(IDocument::Type type, const Position& from, const Position& to) = 0; - virtual void dump(LPIDocument& pDocument) const = 0; + virtual void apply(LPIDocument& pDocument) const = 0; + virtual void insert(IDocument::Type type, const Position& to, std::size_t size) = 0; + virtual void remove(IDocument::Type type, const Position& from, const Position& to) = 0; + virtual void dump(LPIDocument& pDocument) const = 0; }; #define DECLARE_IDocUpdate \ - void apply(LPIDocument& pDocument) const; \ - void insert(IDocument::Type type, const Position& to, std::size_t size); \ - void remove(IDocument::Type type, const Position& from, const Position& to); \ - void dump(LPIDocument& pDocument) const; + void apply(LPIDocument& pDocument) const; \ + void insert(IDocument::Type type, const Position& to, std::size_t size); \ + void remove(IDocument::Type type, const Position& from, const Position& to); \ + void dump(LPIDocument& pDocument) const; PREDECLARE_POINTER(DocUpdate); class DocUpdate - : public rdo::counter_reference - , public IDocUpdate + : public rdo::counter_reference + , public IDocUpdate { protected: - DocUpdate(IDocument::Type file = IDocument::UNDEFINED); + DocUpdate(IDocument::Type file = IDocument::Type::UNDEFINED); - IDocument::Type m_file; + IDocument::Type m_file; - IDocument::Type getCurrentType() const; + IDocument::Type getCurrentType() const; }; CLOSE_RDO_CONVERTER_SMR2RDOX_NAMESPACE - -#endif // _CONVERTOR_UPDATE_I_H_ diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 8f4fd6b72..9c5aed7f3 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -6,7 +6,7 @@ MESSAGE(STATUS "CREATE RDO_KERNEL LIBRARY") IF(PROJECT_OS_LINUX) - FIND_LIBRARY(PTHREAD pthread $ENV{LD_LIBRARY_PATH}) + FIND_LIBRARY(PTHREAD pthread $ENV{LD_LIBRARY_PATH}) ENDIF(PROJECT_OS_LINUX) FIND_PACKAGE(Boost COMPONENTS system filesystem thread REQUIRED) @@ -15,7 +15,7 @@ INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) -FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) +FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp *.h) ADD_LIBRARY(rdo_kernel STATIC ${SOURCE_FILES}) SET_TARGET_PROPERTIES(rdo_kernel PROPERTIES FOLDER .kernel) @@ -28,5 +28,5 @@ TARGET_LINK_LIBRARIES(rdo_kernel rdo_utils) INSTALL(TARGETS rdo_kernel DESTINATION lib) IF(PROJECT_OS_LINUX OR CYGWIN) - TARGET_LINK_LIBRARIES(rdo_kernel ${PTHREAD}) + TARGET_LINK_LIBRARIES(rdo_kernel ${PTHREAD}) ENDIF(PROJECT_OS_LINUX OR CYGWIN) diff --git a/kernel/rdokernel.cpp b/kernel/rdokernel.cpp index a964da390..3a02f5dcf 100644 --- a/kernel/rdokernel.cpp +++ b/kernel/rdokernel.cpp @@ -15,367 +15,140 @@ RDOKernel* kernel = NULL; // -------------------------------------------------------------------------------- // -------------------- RDOKernel // -------------------------------------------------------------------------------- -RDOKernel::RDOKernel(): - RDOThreadMT( "RDOKernel" ), - thread_studio( NULL ), - thread_runtime( NULL ), - thread_simulator( NULL ), - thread_codecomp( NULL ), +RDOKernel::RDOKernel() + : RDOThreadMT("RDOKernel") + , thread_studio(NULL) + , thread_runtime(NULL) + , thread_simulator(NULL) + , thread_codecomp(NULL) #ifdef CORBA_ENABLE - thread_corba( NULL ), + , thread_corba(NULL) #endif - thread_repository( NULL ) - + , thread_repository(NULL) { - notifies.push_back( RT_THREAD_CONNECTION ); - notifies.push_back( RT_THREAD_DISCONNECTION ); - after_constructor(); - kernel = this; + notifies.push_back(Message::THREAD_CONNECTION); + notifies.push_back(Message::THREAD_DISCONNECTION); + after_constructor(); + kernel = this; } RDOKernel::~RDOKernel() { - kernel = NULL; + kernel = NULL; } void RDOKernel::init() { #ifdef COMPILER_VISUAL_STUDIO - _set_output_format(_TWO_DIGIT_EXPONENT); + _set_output_format(_TWO_DIGIT_EXPONENT); #endif - new RDOKernel(); + new RDOKernel(); } -#ifdef RDO_MT -void RDOKernel::close() -{ -#ifdef RDO_MT - CEvent* thread_destroy = kernel->thread_destroy; - - // Дожидаетмся окончания обработки RT_THREAD_CLOSE - CEvent* event = kernel->manualMessageFrom( RDOThread::RT_THREAD_CLOSE ); - while ( ::WaitForSingleObject( event->m_hObject, 0 ) == WAIT_TIMEOUT ) { - kernel->processMessages(); - } - delete event; - - // Дожидаемся диструктора - thread_destroy->Lock(); - delete thread_destroy; -#endif -} -#else void RDOKernel::close() { - kernel->sendMessage( kernel, RDOThread::RT_THREAD_CLOSE ); + kernel->sendMessage(kernel, RDOThread::Message::THREAD_CLOSE); } -#endif void RDOKernel::start() { - RDOThread::start(); -#ifdef TR_TRACE - trace( "kernel ready !!!" ); -#endif + RDOThread::start(); } void RDOKernel::proc( RDOMessageInfo& msg ) { - switch ( msg.message ) { - // Закрыть все треды - case RT_THREAD_CLOSE: { -#ifdef TR_TRACE - trace( thread_name + " stop begin" ); -#endif -#ifdef RDO_MT - threads_mutex.Lock(); -#endif - std::list< RDOThread* >::iterator it = threads.begin(); - while ( it != threads.end() ) { - RDOThread* thread = *it; -#ifdef RDO_MT - if ( !thread->isGUI() ) { - CEvent* thread_destroy = thread->getDestroyEvent(); - threads_mutex.Unlock(); - sendMessage( thread, RDOThread::RT_THREAD_CLOSE ); - thread_destroy->Lock(); - threads_mutex.Lock(); - delete thread_destroy; - it = threads.begin(); - } else { - ++it; - } -#else - sendMessage( thread, RDOThread::RT_THREAD_CLOSE ); - it = threads.begin(); -#endif - } -#ifdef RDO_MT - threads_mutex.Unlock(); -#endif -#ifdef TR_TRACE - trace ( thread_name + " stop end" ); -#endif - break; - } - case RT_THREAD_CONNECTION: { - if ( msg.from != this ) { - registration( msg.from ); - } - break; - } - case RT_THREAD_DISCONNECTION: { - if ( msg.from != this ) { - unregistered( msg.from ); - } - break; - } - default: break; - } + switch (msg.message) + { + // Закрыть все треды + case Message::THREAD_CLOSE: + { + std::list< RDOThread* >::iterator it = threads.begin(); + while (it != threads.end()) + { + RDOThread* thread = *it; + sendMessage(thread, RDOThread::Message::THREAD_CLOSE); + it = threads.begin(); + } + break; + } + case Message::THREAD_CONNECTION: + { + if (msg.from != this) + registration(msg.from); + + break; + } + case Message::THREAD_DISCONNECTION: + { + if (msg.from != this) + unregistered(msg.from); + + break; + } + default: + break; + } } -#ifdef RDO_ST void RDOKernel::idle() { - std::list< RDOThread* >::iterator it = threads.begin(); - while ( it != threads.end() ) { - // it_next используется из-за того, что в RDOThreadRunTime->idle() м.б. удален RDOThreadRunTime и убран из threads - std::list< RDOThread* >::iterator it_next = it; - ++it_next; - (*it)->idle(); - it = it_next; - } + std::list::const_iterator it = threads.begin(); + while (it != threads.end()) + { + // it_next используется из-за того, что в RDOThreadRunTime->idle() м.б. удален RDOThreadRunTime и убран из threads + std::list::const_iterator it_next = it; + ++it_next; + (*it)->idle(); + it = it_next; + } } -#endif + // -autorun -autoexit "C:\rdo\rdo_cdrom_1\RAO-cd-rom-1\bin\RAO-explorer\Data\Russian\Models\Barber\Source\Barber.rdox" // -autorun -autoexit "C:\rdo\rdo_cdrom_1\RAO-cd-rom-1\bin\RAO-explorer\Data\Russian\Models\Heidel\Source\Heidel.rdox" -#ifdef RDO_MT -class CheckThreadID +void RDOKernel::registration(RDOThread* thread) { -protected: - std::size_t thread_id; -public: - CheckThreadID( std::size_t _thread_id ) - : thread_id(_thread_id) - {} - bool operator() ( RDOThread* thread ) { return thread->getID() == thread_id; } -}; -#endif + if (thread && std::find(threads.begin(), threads.end(), thread) == threads.end()) + threads.push_back(thread); -void RDOKernel::registration( RDOThread* thread ) -{ -#ifdef RDO_MT - threads_mutex.Lock(); -#endif - if ( thread && std::find( threads.begin(), threads.end(), thread ) == threads.end() ) { -#ifdef RDO_MT - if ( thread->isGUI() ) { - if ( std::find_if( threads.begin(), threads.end(), CheckThreadID(thread->getID()) ) == threads.end() ) { - threads.push_back( thread ); - } else { - threads_mutex.Unlock(); - // Не будем регистрировать треду, если она GUI, для tread_id которой уже есть другая треда. - // Эта 'другая' треда должна быть RDOKernelGUI, чтобы самой поймать регистрицаию текущей - // и раздавать ей сообщения. - return; - } - } else -#endif - { - threads.push_back( thread ); - } - } - if ( !thread_runtime && thread->getName() == "RDOThreadRunTime" ) thread_runtime = static_cast(thread); - if ( !thread_simulator && thread->getName() == "RDOThreadSimulator" ) thread_simulator = static_cast(thread); - if ( !thread_codecomp && thread->getName() == "RDOThreadCodeComp" ) thread_codecomp = static_cast(thread); - if ( !thread_repository && thread->getName() == "RDOThreadRepository" ) thread_repository = static_cast(thread); + if (!thread_runtime && thread->getName() == "RDOThreadRunTime") + thread_runtime = static_cast(thread); + if (!thread_simulator && thread->getName() == "RDOThreadSimulator") + thread_simulator = static_cast(thread); + if (!thread_codecomp && thread->getName() == "RDOThreadCodeComp") + thread_codecomp = static_cast(thread); + if (!thread_repository && thread->getName() == "RDOThreadRepository") + thread_repository = static_cast(thread); #ifdef CORBA_ENABLE - if ( !thread_corba && thread->getName() == "RDOThreadCorba" ) thread_corba = static_cast(thread); + if (!thread_corba && thread->getName() == "RDOThreadCorba") + thread_corba = static_cast(thread); #endif -#ifdef RDO_MT - threads_mutex.Unlock(); -#endif - -#ifdef TR_TRACE - trace( getName() + " INFO: " + thread->getName() + " REGISTERED" ); -#endif - broadcastMessage( RT_THREAD_REGISTERED, thread ); + broadcastMessage(Message::THREAD_REGISTERED, thread); } -void RDOKernel::unregistered( RDOThread* thread ) +void RDOKernel::unregistered(RDOThread* thread) { -#ifdef RDO_MT - threads_mutex.Lock(); -#endif - if ( thread && std::find( threads.begin(), threads.end(), thread ) != threads.end() ) { - threads.remove( thread ); - } else { -#ifdef RDO_MT - threads_mutex.Unlock(); -#endif - return; - } - if ( thread_runtime && thread->getName() == "RDOThreadRunTime" ) thread_runtime = NULL; - if ( thread_simulator && thread->getName() == "RDOThreadSimulator" ) thread_simulator = NULL; - if ( thread_codecomp && thread->getName() == "RDOThreadCodeComp" ) thread_codecomp = NULL; - if ( thread_repository && thread->getName() == "RDOThreadRepository" ) thread_repository = NULL; + if (thread && std::find( threads.begin(), threads.end(), thread ) != threads.end()) + threads.remove(thread); + else + return; -#ifdef CORBA_ENABLE - if ( thread_corba && thread->getName() == "RDOThreadCorba" ) thread_corba = NULL; -#endif + if (thread_runtime && thread->getName() == "RDOThreadRunTime") + thread_runtime = NULL; + if (thread_simulator && thread->getName() == "RDOThreadSimulator") + thread_simulator = NULL; + if (thread_codecomp && thread->getName() == "RDOThreadCodeComp") + thread_codecomp = NULL; + if (thread_repository && thread->getName() == "RDOThreadRepository") + thread_repository = NULL; -#ifdef RDO_MT - threads_mutex.Unlock(); -#endif - -#ifdef TR_TRACE - trace( getName() + " INFO: " + thread->getName() + " UNREGISTERED" ); -#endif - broadcastMessage( RT_THREAD_UNREGISTERED, thread ); -} - -/* -void RDOKernel::method_registration( RDOTreadMethod& msg ) -{ - methods_mutex.Lock(); - msg.index = 0; - bool insert = true; - std::list< RDOTreadMethod >::iterator it = methods.begin(); - while ( it != methods.end() ) { - if ( it->thread == msg.thread && it->name == msg.name ) { - msg.index = it->index; - insert = false; - break; - } else if ( it->index >= msg.index ) { - msg.index = it->index + 1; - } - it++; - } - if ( insert ) methods.push_back( msg ); - methods_mutex.Unlock(); -#ifdef TR_TRACE - trace( rdo::format("Kernel INFO: methods: %s = %d", msg.name.c_str(), msg.index) ); -#endif -} -*/ - -#ifdef RDO_MT -// -------------------------------------------------------------------------------- -// -------------------- RDOKernelGUI -// -------------------------------------------------------------------------------- -RDOKernelGUI::RDOKernelGUI(const std::string& _thread_name) - : RDOThread(_thread_name) -{ - notifies.push_back( RT_THREAD_CONNECTION ); - notifies.push_back( RT_THREAD_DISCONNECTION ); -} - -RDOKernelGUI::~RDOKernelGUI() -{ -} - -void RDOKernelGUI::proc( RDOMessageInfo& msg ) -{ - switch ( msg.message ) { - // Удалить прикрепленные треды - case RT_THREAD_CLOSE: { -#ifdef TR_TRACE - trace( thread_name + " stop begin" ); -#endif - std::list< RDOThread* >::iterator it = threads.begin(); - while ( it != threads.end() ) { - RDOThread* thread = *it; - threads.erase( it ); - thread->stop(); - delete thread; - it = threads.begin(); - } -#ifdef TR_TRACE - trace ( thread_name + " stop end" ); -#endif - return; - } - case RT_THREAD_CONNECTION: { - if ( msg.from != this ) { - registration( msg.from ); - return; - } - break; - } - case RT_THREAD_DISCONNECTION: { - if ( msg.from != this ) { - unregistered( msg.from ); - return; - } - break; - } - default: break; - } - std::list< RDOThread* >::iterator it = threads.begin(); - while ( it != threads.end() ) { - // it_next используется из-за того, что в RDOThreadRunTime->idle() м.б. удален RDOThreadRunTime и убран из threads - std::list< RDOThread* >::iterator it_next = it; - ++it_next; - if ( *it != msg.from ) { - (*it)->proc( msg ); - } - it = it_next; - } -} - -void RDOKernelGUI::idle() -{ - std::list< RDOThread* >::iterator it = threads.begin(); - while ( it != threads.end() ) { - // it_next используется из-за того, что в RDOThreadRunTime->idle() м.б. удален RDOThreadRunTime и убран из threads - std::list< RDOThread* >::iterator it_next = it; - ++it_next; - (*it)->idle(); - it = it_next; - } -} - -void RDOKernelGUI::registration( RDOThread* thread ) -{ - if ( thread && thread->thread_id == thread_id && std::find( threads.begin(), threads.end(), thread ) == threads.end() ) { - threads.push_back( thread ); - update_notifies(); -#ifdef TR_TRACE - trace( getName() + " INFO: " + thread->getName() + " REGISTERED" ); -#endif - broadcastMessage( RT_THREAD_REGISTERED, thread ); - } -} - -void RDOKernelGUI::unregistered( RDOThread* thread ) -{ - if ( thread && std::find( threads.begin(), threads.end(), thread ) != threads.end() ) { - threads.remove( thread ); - update_notifies(); -#ifdef TR_TRACE - trace( getName() + " INFO: " + thread->getName() + " UNREGISTERED" ); +#ifdef CORBA_ENABLE + if (thread_corba && thread->getName() == "RDOThreadCorba") + thread_corba = NULL; #endif - broadcastMessage( RT_THREAD_UNREGISTERED, thread ); - } -} -void RDOKernelGUI::update_notifies() -{ - notifies.clear(); - std::list< RDOThread* >::const_iterator thread_it = threads.begin(); - while ( thread_it != threads.end() ) { - std::vector< RDOTreadMessage >::const_iterator notify_it = (*thread_it)->notifies.begin(); - while ( notify_it != (*thread_it)->notifies.end() ) { - if ( std::find( notifies.begin(), notifies.end(), *notify_it ) == notifies.end() ) { - notifies.push_back( *notify_it ); - } - ++notify_it; - } - ++thread_it; - } + broadcastMessage(Message::THREAD_UNREGISTERED, thread); } -#endif diff --git a/kernel/rdokernel.h b/kernel/rdokernel.h index 9f261f8a7..eba7ef46f 100644 --- a/kernel/rdokernel.h +++ b/kernel/rdokernel.h @@ -1,5 +1,4 @@ -#ifndef RDO_KERNEL_H -#define RDO_KERNEL_H +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -38,93 +37,52 @@ class RDOThreadRepository; class RDOKernel: public RDOThreadMT { -friend void RDOThread::broadcastMessage( RDOTreadMessage message, void* param, bool lock ); +friend void RDOThread::broadcastMessage( Message message, void* param, bool lock ); friend class Application; protected: - RDOKernel(); // Создание и удаление через статические методы - virtual ~RDOKernel(); + RDOKernel(); // Создание и удаление через статические методы + virtual ~RDOKernel(); - virtual void proc( RDOMessageInfo& msg ); - virtual void start(); + virtual void proc( RDOMessageInfo& msg ); + virtual void start(); - typedef std::list RDOThreadList; - RDOThreadList threads; -#ifdef RDO_MT - mutable CMutex threads_mutex; -#endif -// std::list< RDOTreadMethod > methods; -// CMutex methods_mutex; -// void method_registration( RDOTreadMethod& msg ); // thread-safety + typedef std::list RDOThreadList; + RDOThreadList threads; - RDOThread* thread_studio; - rdo::runtime::RDOThreadRunTime* thread_runtime; - rdo::service::simulation::RDOThreadSimulator* thread_simulator; - rdo::service::simulation::RDOThreadCodeComp* thread_codecomp; - rdo::repository::RDOThreadRepository* thread_repository; + RDOThread* thread_studio; + rdo::runtime::RDOThreadRunTime* thread_runtime; + rdo::service::simulation::RDOThreadSimulator* thread_simulator; + rdo::service::simulation::RDOThreadCodeComp* thread_codecomp; + rdo::repository::RDOThreadRepository* thread_repository; #ifdef CORBA_ENABLE - rdoCorba::RDOThreadCorba* thread_corba; + rdoCorba::RDOThreadCorba* thread_corba; #endif - void registration( RDOThread* thread ); - void unregistered( RDOThread* thread ); + void registration( RDOThread* thread ); + void unregistered( RDOThread* thread ); public: - static void init(); - static void close(); + static void init(); + static void close(); -#ifdef RDO_ST - virtual void idle(); -#endif + virtual void idle(); - RDOThread* studio () const { return thread_studio; } - rdo::runtime::RDOThreadRunTime* runtime () const { return thread_runtime; } - rdo::service::simulation::RDOThreadSimulator* simulator () const { return thread_simulator; } - rdo::service::simulation::RDOThreadCodeComp* codecomp () const { return thread_codecomp; } - rdo::repository::RDOThreadRepository* repository() const { return thread_repository; } + RDOThread* studio () const { return thread_studio; } + rdo::runtime::RDOThreadRunTime* runtime () const { return thread_runtime; } + rdo::service::simulation::RDOThreadSimulator* simulator () const { return thread_simulator; } + rdo::service::simulation::RDOThreadCodeComp* codecomp () const { return thread_codecomp; } + rdo::repository::RDOThreadRepository* repository() const { return thread_repository; } #ifdef CORBA_ENABLE - rdoCorba::RDOThreadCorba* corba () const { return thread_corba; } + rdoCorba::RDOThreadCorba* corba () const { return thread_corba; } #endif }; -#ifdef RDO_MT -// -------------------------------------------------------------------------------- -// -------------------- RDOKernelGUI -// -------------------------------------------------------------------------------- -// Является фиктивной тредой без своей процедуры. -// Раздает сообщения прикрепленным к ней тредам (RDOThreadGUI). -// Можно представить её в виде корня дерева, к которому прикреплены RDOThreadGUI. -// Обработчик сообщений RDOKernelGUI::processMessages() вызывается из цикла обработки -// сообщений самого win32-gui приложения, точнее из OnIdle() приложения, т.е. процедуру -// треды выполняет запущенный екзешник (логически). При этом, именно от имени RDOKernelGUI, -// приложение посылает сообщения остальным настоящим тредам. -// -class RDOKernelGUI: public RDOThread -{ -friend virtual bool RDOThreadGUI::processMessages(); - -protected: - RDOKernelGUI(const std::string& _thread_name); // Создание и удаление через потомков - virtual ~RDOKernelGUI(); - - virtual void proc( RDOMessageInfo& msg ); - virtual void idle(); - - std::list< RDOThread* > threads; - - void registration( RDOThread* thread ); - void unregistered( RDOThread* thread ); - void update_notifies(); -}; -#else typedef RDOKernel RDOKernelGUI; -#endif // -------------------------------------------------------------------------------- extern RDOKernel* kernel; - -#endif // RDO_KERNEL_H diff --git a/kernel/rdothread.cpp b/kernel/rdothread.cpp index d3510a46c..f8cfa9dee 100644 --- a/kernel/rdothread.cpp +++ b/kernel/rdothread.cpp @@ -6,13 +6,9 @@ #include #ifdef OST_WINDOWS - #ifdef RDO_MT - #include - #else - #include - #endif + #include #else - #include + #include #endif // OST_WINDOWS // ----------------------------------------------------------------------- SYNOPSIS #include "kernel/rdothread.h" @@ -20,325 +16,148 @@ #include "utils/src/common/rdocommon.h" // -------------------------------------------------------------------------------- -#ifdef TR_TRACE -#ifdef RDO_MT -std::fstream file("C:\\rdo_kernel_mt.log", std::ios_base::in | std::ios_base::out | std::ios_base::trunc); -#else -std::fstream file("C:\\rdo_kernel_st.log", std::ios_base::in | std::ios_base::out | std::ios_base::trunc); -#endif - -void RDOThread::trace(const std::string& str) -{ - file << str << std::endl; - file.flush(); -} -#endif // TR_TRACE - // -------------------------------------------------------------------------------- // -------------------- RDOThread // -------------------------------------------------------------------------------- -#ifdef RDO_MT -RDOThread::RDOThread(const std::string& _thread_name, RDOThreadFun _thread_fun) - : thread_name (_thread_name) - , thread_id (0 ) - , broadcast_cnt (-1 ) - , idle_cnt (0 ) - , thread_fun (_thread_fun ) - , thread_win (NULL ) - , thread_destroy (new CEvent()) // thread_destroy удаляется после деструктора объекта - , broadcast_waiting(false ) - , was_start (false ) - , was_close (false ) -#if defined(COMPILER_VISUAL_STUDIO) || defined(COMPILER_MINGW) - , thread_id(::GetCurrentThreadId()) -#elif defined(COMPILER_GCC) - , thread_id(pthread_self()) -#else - #error Unknown compiler -#endif // COMPILER_VISUAL_STUDIO - , idle_cnt(0) -#else // not RDO_MT RDOThread::RDOThread(const std::string& _thread_name) - : thread_name(_thread_name ) -#endif // RDO_MT + : thread_name(_thread_name) { -#ifdef TR_TRACE - trace(thread_name + "::" + thread_name); -#endif - // Чтобы треда не получала ниодного сообщения. RT_THREAD_CLOSE обрабатывается автоматически - notifies.push_back(RT_THREAD_CLOSE); -#ifdef RDO_MT - for (std::size_t i = 0; i < 10; i++) - broadcast_data.push_back(BroadcastData(10)); - - if (!isGUI()) { - // THREAD_PRIORITY_NORMAL - // THREAD_PRIORITY_HIGHEST - // THREAD_PRIORITY_TIME_CRITICAL - thread_win = AfxBeginThread(thread_fun, this, THREAD_PRIORITY_NORMAL); - } -#endif + // Чтобы треда не получала ниодного сообщения. Message::THREAD_CLOSE обрабатывается автоматически + notifies.push_back(Message::THREAD_CLOSE); } RDOThread::~RDOThread() -{ -#ifdef TR_TRACE - trace(rdo::format("%s (%d)::~%s", thread_name.c_str(), thread_id, thread_name.c_str())); -// trace(thread_name + "::~" + thread_name); -#endif - -#ifdef RDO_MT - for (BroadcastDataList::iterator it = broadcast_data.begin(); it != broadcast_data.end(); ++it) - it->clear(); +{} - if (!isGUI()) - { - if (thread_destroy) - { - thread_destroy->SetEvent(); - } - } - else - { - if (thread_destroy) - { - delete thread_destroy; - thread_destroy = NULL; - } - } -#endif +std::string RDOThread::messageToString(Message message) +{ + switch (message) + { + case Message::THREAD_CLOSE : return "THREAD_CLOSE"; + case Message::THREAD_CONNECTION : return "THREAD_CONNECTION"; + case Message::THREAD_DISCONNECTION : return "THREAD_DISCONNECTION"; + case Message::THREAD_REGISTERED : return "THREAD_REGISTERED"; + case Message::THREAD_UNREGISTERED : return "THREAD_UNREGISTERED"; + case Message::THREAD_STOP_AFTER : return "THREAD_STOP_AFTER"; + case Message::STUDIO_MODEL_NEW : return "STUDIO_MODEL_NEW"; + case Message::STUDIO_MODEL_OPEN : return "STUDIO_MODEL_OPEN"; + case Message::STUDIO_MODEL_SAVE : return "STUDIO_MODEL_SAVE"; + case Message::STUDIO_MODEL_CLOSE : return "STUDIO_MODEL_CLOSE"; + case Message::STUDIO_MODEL_BUILD : return "STUDIO_MODEL_BUILD"; + case Message::STUDIO_MODEL_RUN : return "STUDIO_MODEL_RUN"; + case Message::STUDIO_MODEL_STOP : return "STUDIO_MODEL_STOP"; + case Message::STUDIO_MODEL_GET_TEXT : return "STUDIO_MODEL_GET_TEXT"; + case Message::REPOSITORY_MODEL_NEW : return "REPOSITORY_MODEL_NEW"; + case Message::REPOSITORY_MODEL_OPEN : return "REPOSITORY_MODEL_OPEN"; + case Message::REPOSITORY_MODEL_OPEN_ERROR : return "REPOSITORY_MODEL_OPEN_ERROR"; + case Message::REPOSITORY_MODEL_SAVE : return "REPOSITORY_MODEL_SAVE"; + case Message::REPOSITORY_MODEL_OPEN_GET_NAME : return "REPOSITORY_MODEL_OPEN_GET_NAME"; + case Message::REPOSITORY_MODEL_CLOSE : return "REPOSITORY_MODEL_CLOSE"; + case Message::REPOSITORY_MODEL_CLOSE_CAN_CLOSE : return "REPOSITORY_MODEL_CLOSE_CAN_CLOSE"; + case Message::REPOSITORY_MODEL_CLOSE_ERROR : return "REPOSITORY_MODEL_CLOSE_ERROR"; + case Message::REPOSITORY_MODEL_GET_FILEINFO : return "REPOSITORY_MODEL_GET_FILEINFO"; + case Message::REPOSITORY_LOAD : return "REPOSITORY_LOAD"; + case Message::REPOSITORY_SAVE : return "REPOSITORY_SAVE"; + case Message::REPOSITORY_LOAD_BINARY : return "REPOSITORY_LOAD_BINARY"; + case Message::REPOSITORY_CREATE_FILE : return "REPOSITORY_CREATE_FILE"; + case Message::SIMULATOR_PARSE_OK : return "SIMULATOR_PARSE_OK"; + case Message::SIMULATOR_PARSE_ERROR : return "SIMULATOR_PARSE_ERROR"; + case Message::SIMULATOR_PARSE_ERROR_SMR : return "SIMULATOR_PARSE_ERROR_SMR"; + case Message::SIMULATOR_PARSE_ERROR_SMR_EMPTY : return "SIMULATOR_PARSE_ERROR_SMR_EMPTY"; + case Message::SIMULATOR_PARSE_STRING : return "SIMULATOR_PARSE_STRING"; + case Message::SIMULATOR_MODEL_STOP_OK : return "SIMULATOR_MODEL_STOP_OK"; + case Message::SIMULATOR_MODEL_STOP_BY_USER : return "SIMULATOR_MODEL_STOP_BY_USER"; + case Message::SIMULATOR_MODEL_STOP_RUNTIME_ERROR: return "SIMULATOR_MODEL_STOP_RUNTIME_ERROR"; + case Message::SIMULATOR_MODEL_STOP_RUNTIME_DELAY: return "SIMULATOR_MODEL_STOP_RUNTIME_DELAY"; + case Message::SIMULATOR_GET_MODEL_STRUCTURE : return "SIMULATOR_GET_MODEL_STRUCTURE"; + case Message::SIMULATOR_GET_MODEL_RESULTS : return "SIMULATOR_GET_MODEL_RESULTS"; + case Message::SIMULATOR_GET_MODEL_RESULTS_INFO : return "SIMULATOR_GET_MODEL_RESULTS_INFO"; + case Message::SIMULATOR_GET_MODEL_EXITCODE : return "SIMULATOR_GET_MODEL_EXITCODE"; + case Message::SIMULATOR_GET_LIST : return "SIMULATOR_GET_LIST"; + case Message::SIMULATOR_GET_ERRORS : return "SIMULATOR_GET_ERRORS"; + case Message::RUNTIME_MODEL_START_BEFORE : return "RUNTIME_MODEL_START_BEFORE"; + case Message::RUNTIME_MODEL_START_AFTER : return "RUNTIME_MODEL_START_AFTER"; + case Message::RUNTIME_MODEL_STOP_BEFORE : return "RUNTIME_MODEL_STOP_BEFORE"; + case Message::RUNTIME_MODEL_STOP_AFTER : return "RUNTIME_MODEL_STOP_AFTER"; + case Message::RUNTIME_TRACE_STRING : return "RUNTIME_TRACE_STRING"; + case Message::RUNTIME_GET_MODE : return "RUNTIME_GET_MODE"; + case Message::RUNTIME_SET_MODE : return "RUNTIME_SET_MODE"; + case Message::RUNTIME_GET_SPEED : return "RUNTIME_GET_SPEED"; + case Message::RUNTIME_SET_SPEED : return "RUNTIME_SET_SPEED"; + case Message::RUNTIME_GET_SHOWRATE : return "RUNTIME_GET_SHOWRATE"; + case Message::RUNTIME_SET_SHOWRATE : return "RUNTIME_SET_SHOWRATE"; + case Message::RUNTIME_GET_TIMENOW : return "RUNTIME_GET_TIMENOW"; + case Message::RUNTIME_GET_FRAME : return "RUNTIME_GET_FRAME"; + case Message::RUNTIME_GET_LAST_BREAKPOINT : return "RUNTIME_GET_LAST_BREAKPOINT"; + case Message::RUNTIME_KEY_DOWN : return "RUNTIME_KEY_DOWN"; + case Message::RUNTIME_KEY_UP : return "RUNTIME_KEY_UP"; + case Message::RUNTIME_FRAME_AREA_DOWN : return "RUNTIME_FRAME_AREA_DOWN"; + case Message::CONVERTOR_NONE : return "CONVERTOR_NONE"; + case Message::CONVERTOR_OK : return "CONVERTOR_OK"; + case Message::CONVERTOR_ERROR : return "CONVERTOR_ERROR"; + case Message::CODECOMP_GET_DATA : return "CODECOMP_GET_DATA"; + case Message::DEBUG_STRING : return "DEBUG_STRING"; + case Message::RESULT_STRING : return "RESULT_STRING"; + case Message::CORBA_PARSER_GET_RTP : return "CORBA_PARSER_GET_RTP"; + case Message::CORBA_PARSER_GET_RSS : return "CORBA_PARSER_GET_RSS"; + case Message::CORBA_PARSER_GET_RTP_COUNT : return "CORBA_PARSER_GET_RTP_COUNT"; + case Message::CORBA_PARSER_GET_RTP_PAR_COUNT : return "CORBA_PARSER_GET_RTP_PAR_COUNT"; + default : return "UNKNOWN"; + } } RDOThread* RDOThread::getKernel() { - return kernel; + return kernel; } void RDOThread::after_constructor() { - notifies.push_back(RT_THREAD_REGISTERED); -#ifdef RDO_MT - if (!isGUI()) - { - proc_create.Lock(); - thread_create.SetEvent(); - } - else - { - if (getKernel() && getKernel() != this) - sendMessage(getKernel(), RT_THREAD_CONNECTION); - start(); - } -#else - if (getKernel() && getKernel() != this) - sendMessage(getKernel(), RT_THREAD_CONNECTION); - start(); -#endif + notifies.push_back(Message::THREAD_REGISTERED); + if (getKernel() && getKernel() != this) + sendMessage(getKernel(), Message::THREAD_CONNECTION); + start(); } -#ifdef RDO_MT -std::size_t RDOThread::threadFun(void* pParam) +void RDOThread::broadcastMessage(Message message, void* pParam, bool /*lock*/) { - RDOThread* thread = static_cast(pParam); - thread->thread_id = ::GetCurrentThreadId(); - thread->proc_create.SetEvent(); - thread->thread_create.Lock(); - if (kernel && kernel != thread) - thread->sendMessage(kernel, RT_THREAD_CONNECTION); - thread->start(); - thread->was_start = true; - - while (thread->processMessages()) {}; - - thread->stop(); - delete thread; - return 0; -} -#endif - -#ifdef RDO_MT -bool RDOThread::processMessages() -{ - messages_mutex.Lock(); - if (was_close) - { - messages_mutex.Unlock(); - return false; - } - if (!messages.empty()) - { - RDOMessageInfo msg = messages.front(); - messages.erase(messages.begin()); - messages_mutex.Unlock(); -#ifdef TR_TRACE - RDOThread::trace((msg.type == RDOThread::RDOMessageInfo::post ? "-------(post)--- " : "---------------- ") + messageToString(msg.message) + ": " + (msg.from ? msg.from->thread_name : "NULL") + " -> " + thread_name); -#endif - proc(msg); - if (msg.message == RT_THREAD_CLOSE) - { - messages_mutex.Lock(); - was_close = true; - messages_mutex.Unlock(); - if (this != getKernel()) - sendMessage(getKernel(), RT_THREAD_DISCONNECTION); - // Отпускаем вызывающие треды - messages_mutex.Lock(); - if (msg.type == RDOThread::RDOMessageInfo::send || msg.type == RDOThread::RDOMessageInfo::manual) - msg.send_event->SetEvent(); - - for (MessageList::iterator it = messages.begin(); it != messages.end(); ++it) - if (it->type == RDOThread::RDOMessageInfo::send || it->type == RDOThread::RDOMessageInfo::manual) - it->send_event->SetEvent(); - - messages.clear(); - messages_mutex.Unlock(); - return false; - } - if (msg.type == RDOThread::RDOMessageInfo::send || msg.type == RDOThread::RDOMessageInfo::manual) - msg.send_event->SetEvent(); - - } - else - { - messages_mutex.Unlock(); - idle(); - } - return true; -} -#endif -/* -void RDOThread::sendMessage(RDOThread* to, RDOTreadMessage message, void* pParam) -{ -#ifdef RDO_MT - RDOMessageInfo msg(this, message, pParam, RDOThread::RDOMessageInfo::send); - CEvent event; - msg.send_event = &event; - - to->messages_mutex.Lock(); - to->messages.push_back(msg); - to->messages_mutex.Unlock(); - - while (::WaitForSingleObject( event.m_hObject, 0 ) == WAIT_TIMEOUT) - processMessages(); -#else - to->processMessages(RDOMessageInfo(this, message, pParam)); -#endif -} -*/ -#ifdef RDO_MT -CEvent* RDOThread::manualMessageFrom(RDOTreadMessage message, void* pParam) -{ - RDOMessageInfo msg(this, message, pParam, RDOThread::RDOMessageInfo::manual); - msg.send_event = new CEvent(); - - messages_mutex.Lock(); - messages.push_back(msg); - messages_mutex.Unlock(); - - return msg.send_event; -} -#endif - -void RDOThread::broadcastMessage(RDOTreadMessage message, void* pParam, bool lock) -{ -#ifdef RDO_MT - if (pParam) lock = true; - broadcast_cnt++; - if (broadcast_data.size() < broadcast_cnt + 1) - broadcast_data.push_back(BroadcastData(10)); - - kernel->threads_mutex.Lock(); - std::size_t cnt = 0; - CMutex* param_lock = NULL; - for (RDOKernel::RDOThreadList::iterator it = kernel->threads.begin(); it != kernel->threads.end(); ++it) - { - RDOThread* thread = *it; - thread->notifies_mutex.Lock(); - if (thread != this && (thread->notifies.empty() || std::find(thread->notifies.begin(), thread->notifies.end(), message) != thread->notifies.end())) - { - if (broadcast_data[broadcast_cnt].cnt < cnt + 1) - broadcast_data[broadcast_cnt].resize(); - RDOMessageInfo msg(this, message, pParam, RDOThread::RDOMessageInfo::send); - if (lock) - { - if (!param_lock) - param_lock = new CMutex(); - msg.param_lock = param_lock; - } - msg.send_event = broadcast_data[broadcast_cnt].events[cnt]; - cnt++; - thread->messages_mutex.Lock(); - thread->messages.push_back(msg); - thread->messages_mutex.Unlock(); - } - thread->notifies_mutex.Unlock(); - } - kernel->threads_mutex.Unlock(); - if (cnt) - { - for (std::size_t i = 0; i < cnt; i++) - broadcast_data[broadcast_cnt].handles[i] = broadcast_data[broadcast_cnt].events[i]->m_hObject; - - broadcast_waiting = true; - while (::WaitForMultipleObjects(cnt, broadcast_data[broadcast_cnt].handles, true, 0) == WAIT_TIMEOUT) - processMessages(); - - broadcast_waiting = false; - } - broadcast_cnt--; - if (lock && param_lock) - delete param_lock; -#else - (void)lock; - RDOMessageInfo msg(this, message, pParam); - std::list< RDOThread* >::iterator it = kernel->threads.begin(); - while ( it != kernel->threads.end() ) { - RDOThread* thread = *it; - if ( thread != this && (thread->notifies.empty() || std::find( thread->notifies.begin(), thread->notifies.end(), message ) != thread->notifies.end()) ) { - thread->processMessages( msg ); - } - ++it; - } -#endif + RDOMessageInfo msg(this, message, pParam); + std::list::const_iterator it = kernel->threads.begin(); + while (it != kernel->threads.end()) + { + RDOThread* thread = *it; + if (thread != this && (thread->notifies.empty() || std::find(thread->notifies.begin(), thread->notifies.end(), message) != thread->notifies.end())) + thread->processMessages(msg); + ++it; + } } void RDOThread::idle() -{ -#ifdef RDO_MT - ::Sleep( 0 ); -// if ( idle_cnt++ > 1000 ) { -// idle_cnt = 0; -// ::Sleep( 1 ); -// } -#endif -} +{} void RDOThread::start() -{ -#ifdef TR_TRACE - trace( thread_name + " start" ); -#endif -} +{} void RDOThread::stop() { -#ifdef TR_TRACE - trace( thread_name + " stop" ); -#endif - broadcastMessage( RT_THREAD_STOP_AFTER ); + broadcastMessage(Message::THREAD_STOP_AFTER); } -#ifdef RDO_MT -// -------------------------------------------------------------------------------- -// -------------------- RDOThreadGUI -// -------------------------------------------------------------------------------- -RDOThread* RDOThreadGUI::getKernel() +void RDOThread::destroy() { - return kernel_gui; + delete this; } -bool RDOThreadGUI::processMessages() +void RDOThread::processMessages(RDOMessageInfo& msg) { - return kernel_gui->processMessages(); + proc(msg); + if (msg.message == Message::THREAD_CLOSE) + { + if (this != getKernel()) + sendMessage(getKernel(), Message::THREAD_DISCONNECTION); + + stop(); + destroy(); + return; + } } -#endif diff --git a/kernel/rdothread.h b/kernel/rdothread.h index 06bd5ab99..3964033d4 100644 --- a/kernel/rdothread.h +++ b/kernel/rdothread.h @@ -1,5 +1,4 @@ -#ifndef RDO_THREAD_H -#define RDO_THREAD_H +#pragma once // ----------------------------------------------------------------------- PLATFORM #include "utils/src/common/platform.h" @@ -10,7 +9,7 @@ #include #ifdef COMPILER_VISUAL_STUDIO - #pragma warning( disable : 4786 ) + #pragma warning( disable : 4786 ) #endif // COMPILER_VISUAL_STUDIO // ----------------------------------------------------------------------- SYNOPSIS #include "utils/src/common/rdocommon.h" @@ -27,460 +26,150 @@ // 3. трассировку события выводит после измененного этим события ресурса // 4. выводит в трассировку вещественные значения с двумя знаками после экспоненты, а не тремя -// -------------------------------------------------------------------------------- -// Используется для компиляции (одно/много)-тредовой версии РДО -// Если определена в дефайнах проекта -#if defined(RDO_ST) - #undef RDO_MT -// Если определена в дефайнах проекта -#elif defined(RDO_MT) - #undef RDO_ST -// Если НЕ определена в дефайнах проекта -#else - #define RDO_MT - #undef RDO_MT // Скомпилить однотредувую версию РДО. Если закомментировать, то получится многотредовая - - // RDO_ST автоматически выставляется для однотредовой версии РДО - #ifndef RDO_MT - #define RDO_ST - #endif -#endif - -// Используется для трассировки сообщений в файл C:\rdo_kernel_mt.log -// Может быть использовано и в однотредовой версии -// Если НЕ определена в дефайнах проекта -#ifndef TR_TRACE - #define TR_TRACE - #undef TR_TRACE // Закомментировать для вывода трассировка -#endif - -#ifdef RDO_MT -#include -#endif - // -------------------------------------------------------------------------------- // -------------------- RDOThread // -------------------------------------------------------------------------------- -#ifdef RDO_MT -typedef std::size_t (*RDOThreadFun)(void* pParam); -#endif - -class RDOThread: public boost::noncopyable +class RDOThread: private boost::noncopyable { -#ifdef RDO_MT -friend class RDOKernelGUI; -friend class RDOThreadGUI; -#else friend class RDOKernel; -#endif public: - enum RDOTreadMessage { - RT_THREAD_CLOSE = 1, - RT_THREAD_CONNECTION, - RT_THREAD_DISCONNECTION, - RT_THREAD_REGISTERED, // param = thread:RDOThread* - RT_THREAD_UNREGISTERED, // param = thread:RDOThread* - RT_THREAD_STOP_AFTER, - RT_STUDIO_MODEL_NEW, // param = rdo::repository::RDOThreadRepository::NewModel* - RT_STUDIO_MODEL_OPEN, // param = rdo::repository::RDOThreadRepository::OpenFile* - RT_STUDIO_MODEL_SAVE, - RT_STUDIO_MODEL_CLOSE, - RT_STUDIO_MODEL_BUILD, - RT_STUDIO_MODEL_RUN, - RT_STUDIO_MODEL_STOP, - RT_STUDIO_MODEL_GET_TEXT, // param = rdo::repository::RDOThreadRepository::FileData* - RT_REPOSITORY_MODEL_NEW, // param = rdo::repository::RDOThreadRepository::NewModel* - RT_REPOSITORY_MODEL_OPEN, - RT_REPOSITORY_MODEL_OPEN_ERROR, // param = model_name:boost::filesystem::path* - RT_REPOSITORY_MODEL_SAVE, - RT_REPOSITORY_MODEL_OPEN_GET_NAME, // param = rdo::repository::RDOThreadRepository::OpenFile* - RT_REPOSITORY_MODEL_CLOSE, - RT_REPOSITORY_MODEL_CLOSE_CAN_CLOSE, // param = result:bool*, работает как И - RT_REPOSITORY_MODEL_CLOSE_ERROR, - RT_REPOSITORY_MODEL_GET_FILEINFO, // param = rdo::repository::RDOThreadRepository::FileInfo* - RT_REPOSITORY_LOAD, // param = rdo::repository::RDOThreadRepository::FileData* - RT_REPOSITORY_SAVE, // param = rdo::repository::RDOThreadRepository::FileData* - RT_REPOSITORY_LOAD_BINARY, // param = rdo::repository::RDOThreadRepository::BinaryFile* - RT_REPOSITORY_CREATE_FILE, // param = rdo::repository::RDOThreadRepository::CreateFile* - RT_SIMULATOR_PARSE_OK, - RT_SIMULATOR_PARSE_ERROR, - RT_SIMULATOR_PARSE_ERROR_SMR, - RT_SIMULATOR_PARSE_ERROR_SMR_EMPTY, - RT_SIMULATOR_PARSE_STRING, // param = std::string* - RT_SIMULATOR_MODEL_STOP_OK, - RT_SIMULATOR_MODEL_STOP_BY_USER, - RT_SIMULATOR_MODEL_STOP_RUNTIME_ERROR, - RT_SIMULATOR_MODEL_STOP_RUNTIME_DELAY, - RT_SIMULATOR_GET_MODEL_STRUCTURE, // param = result:std::stringstream* - RT_SIMULATOR_GET_MODEL_RESULTS, // param = result:std::stringstream* - RT_SIMULATOR_GET_MODEL_RESULTS_INFO, // param = result:std::stringstream* - RT_SIMULATOR_GET_MODEL_EXITCODE, // param = result:rdo::simulation::report::RDOExitCode* - RT_SIMULATOR_GET_LIST, // param = rdo::service::simulation::RDOThreadSimulator::GetList* - RT_SIMULATOR_GET_ERRORS, // param = result:std::vector< RDOSyntaxError >* - RT_RUNTIME_MODEL_START_BEFORE, - RT_RUNTIME_MODEL_START_AFTER, - RT_RUNTIME_MODEL_STOP_BEFORE, - RT_RUNTIME_MODEL_STOP_AFTER, - RT_RUNTIME_TRACE_STRING, // param = std::string* - RT_RUNTIME_GET_MODE, // param = result:rdo::runtime::RunTimeMode* - RT_RUNTIME_SET_MODE, // param = mode:rdo::runtime::RunTimeMode* - RT_RUNTIME_GET_SPEED, // param = result:double[0..1]%* - RT_RUNTIME_SET_SPEED, // param = speed:double[0..1]%* - RT_RUNTIME_GET_SHOWRATE, // param = result:double[0..+max_double]* - RT_RUNTIME_SET_SHOWRATE, // param = show_rate:double[0..+max_double]* - RT_RUNTIME_GET_TIMENOW, // param = result:double* - RT_RUNTIME_GET_FRAME, // param = { result:rdo::animation::Frame*, frame_number:int }* - RT_RUNTIME_GET_LAST_BREAKPOINT, // param = std::string* - RT_RUNTIME_KEY_DOWN, // param = scanCode:uint* - RT_RUNTIME_KEY_UP, // param = scanCode:uint* - RT_RUNTIME_FRAME_AREA_DOWN, // param = area_name:std::string* - RT_CONVERTOR_NONE, - RT_CONVERTOR_OK, - RT_CONVERTOR_ERROR, - RT_CODECOMP_GET_DATA, // param = rdo::service::simulation::RDOThreadCodeComp::GetCodeComp* - RT_DEBUG_STRING, // param = std::string* - RT_RESULT_STRING, // param = std::string* - RT_CORBA_PARSER_GET_RTP, - RT_CORBA_PARSER_GET_RSS, - RT_CORBA_PARSER_GET_RTP_COUNT, - RT_CORBA_PARSER_GET_RTP_PAR_COUNT, - RT_PROCGUI_BLOCK_CREATE, - RT_PROCGUI_BLOCK_PROCESS, - RT_PROCGUI_BLOCK_TERMINATE - }; - std::string messageToString(RDOTreadMessage message) { - switch ( message ) { - case RT_THREAD_CLOSE : return "RT_THREAD_CLOSE"; - case RT_THREAD_CONNECTION : return "RT_THREAD_CONNECTION"; - case RT_THREAD_DISCONNECTION : return "RT_THREAD_DISCONNECTION"; - case RT_THREAD_REGISTERED : return "RT_THREAD_REGISTERED"; - case RT_THREAD_UNREGISTERED : return "RT_THREAD_UNREGISTERED"; - case RT_THREAD_STOP_AFTER : return "RT_THREAD_STOP_AFTER"; - case RT_STUDIO_MODEL_NEW : return "RT_STUDIO_MODEL_NEW"; - case RT_STUDIO_MODEL_OPEN : return "RT_STUDIO_MODEL_OPEN"; - case RT_STUDIO_MODEL_SAVE : return "RT_STUDIO_MODEL_SAVE"; - case RT_STUDIO_MODEL_CLOSE : return "RT_STUDIO_MODEL_CLOSE"; - case RT_STUDIO_MODEL_BUILD : return "RT_STUDIO_MODEL_BUILD"; - case RT_STUDIO_MODEL_RUN : return "RT_STUDIO_MODEL_RUN"; - case RT_STUDIO_MODEL_STOP : return "RT_STUDIO_MODEL_STOP"; - case RT_STUDIO_MODEL_GET_TEXT : return "RT_STUDIO_MODEL_GET_TEXT"; - case RT_REPOSITORY_MODEL_NEW : return "RT_REPOSITORY_MODEL_NEW"; - case RT_REPOSITORY_MODEL_OPEN : return "RT_REPOSITORY_MODEL_OPEN"; - case RT_REPOSITORY_MODEL_OPEN_ERROR : return "RT_REPOSITORY_MODEL_OPEN_ERROR"; - case RT_REPOSITORY_MODEL_SAVE : return "RT_REPOSITORY_MODEL_SAVE"; - case RT_REPOSITORY_MODEL_OPEN_GET_NAME : return "RT_REPOSITORY_MODEL_OPEN_GET_NAME"; - case RT_REPOSITORY_MODEL_CLOSE : return "RT_REPOSITORY_MODEL_CLOSE"; - case RT_REPOSITORY_MODEL_CLOSE_CAN_CLOSE : return "RT_REPOSITORY_MODEL_CLOSE_CAN_CLOSE"; - case RT_REPOSITORY_MODEL_CLOSE_ERROR : return "RT_REPOSITORY_MODEL_CLOSE_ERROR"; - case RT_REPOSITORY_MODEL_GET_FILEINFO : return "RT_REPOSITORY_MODEL_GET_FILEINFO"; - case RT_REPOSITORY_LOAD : return "RT_REPOSITORY_LOAD"; - case RT_REPOSITORY_SAVE : return "RT_REPOSITORY_SAVE"; - case RT_REPOSITORY_LOAD_BINARY : return "RT_REPOSITORY_LOAD_BINARY"; - case RT_REPOSITORY_CREATE_FILE : return "RT_REPOSITORY_CREATE_FILE"; - case RT_SIMULATOR_PARSE_OK : return "RT_SIMULATOR_PARSE_OK"; - case RT_SIMULATOR_PARSE_ERROR : return "RT_SIMULATOR_PARSE_ERROR"; - case RT_SIMULATOR_PARSE_ERROR_SMR : return "RT_SIMULATOR_PARSE_ERROR_SMR"; - case RT_SIMULATOR_PARSE_ERROR_SMR_EMPTY : return "RT_SIMULATOR_PARSE_ERROR_SMR_EMPTY"; - case RT_SIMULATOR_PARSE_STRING : return "RT_SIMULATOR_PARSE_STRING"; - case RT_SIMULATOR_MODEL_STOP_OK : return "RT_SIMULATOR_MODEL_STOP_OK"; - case RT_SIMULATOR_MODEL_STOP_BY_USER : return "RT_SIMULATOR_MODEL_STOP_BY_USER"; - case RT_SIMULATOR_MODEL_STOP_RUNTIME_ERROR: return "RT_SIMULATOR_MODEL_STOP_RUNTIME_ERROR"; - case RT_SIMULATOR_MODEL_STOP_RUNTIME_DELAY: return "RT_SIMULATOR_MODEL_STOP_RUNTIME_DELAY"; - case RT_SIMULATOR_GET_MODEL_STRUCTURE : return "RT_SIMULATOR_GET_MODEL_STRUCTURE"; - case RT_SIMULATOR_GET_MODEL_RESULTS : return "RT_SIMULATOR_GET_MODEL_RESULTS"; - case RT_SIMULATOR_GET_MODEL_RESULTS_INFO : return "RT_SIMULATOR_GET_MODEL_RESULTS_INFO"; - case RT_SIMULATOR_GET_MODEL_EXITCODE : return "RT_SIMULATOR_GET_MODEL_EXITCODE"; - case RT_SIMULATOR_GET_LIST : return "RT_SIMULATOR_GET_LIST"; - case RT_SIMULATOR_GET_ERRORS : return "RT_SIMULATOR_GET_ERRORS"; - case RT_RUNTIME_MODEL_START_BEFORE : return "RT_RUNTIME_MODEL_START_BEFORE"; - case RT_RUNTIME_MODEL_START_AFTER : return "RT_RUNTIME_MODEL_START_AFTER"; - case RT_RUNTIME_MODEL_STOP_BEFORE : return "RT_RUNTIME_MODEL_STOP_BEFORE"; - case RT_RUNTIME_MODEL_STOP_AFTER : return "RT_RUNTIME_MODEL_STOP_AFTER"; - case RT_RUNTIME_TRACE_STRING : return "RT_RUNTIME_TRACE_STRING"; - case RT_RUNTIME_GET_MODE : return "RT_RUNTIME_GET_MODE"; - case RT_RUNTIME_SET_MODE : return "RT_RUNTIME_SET_MODE"; - case RT_RUNTIME_GET_SPEED : return "RT_RUNTIME_GET_SPEED"; - case RT_RUNTIME_SET_SPEED : return "RT_RUNTIME_SET_SPEED"; - case RT_RUNTIME_GET_SHOWRATE : return "RT_RUNTIME_GET_SHOWRATE"; - case RT_RUNTIME_SET_SHOWRATE : return "RT_RUNTIME_SET_SHOWRATE"; - case RT_RUNTIME_GET_TIMENOW : return "RT_RUNTIME_GET_TIMENOW"; - case RT_RUNTIME_GET_FRAME : return "RT_RUNTIME_GET_FRAME"; - case RT_RUNTIME_GET_LAST_BREAKPOINT : return "RT_RUNTIME_GET_LAST_BREAKPOINT"; - case RT_RUNTIME_KEY_DOWN : return "RT_RUNTIME_KEY_DOWN"; - case RT_RUNTIME_KEY_UP : return "RT_RUNTIME_KEY_UP"; - case RT_RUNTIME_FRAME_AREA_DOWN : return "RT_RUNTIME_FRAME_AREA_DOWN"; - case RT_CONVERTOR_NONE : return "RT_CONVERTOR_NONE"; - case RT_CONVERTOR_OK : return "RT_CONVERTOR_OK"; - case RT_CONVERTOR_ERROR : return "RT_CONVERTOR_ERROR"; - case RT_CODECOMP_GET_DATA : return "RT_CODECOMP_GET_DATA"; - case RT_DEBUG_STRING : return "RT_DEBUG_STRING"; - case RT_RESULT_STRING : return "RT_RESULT_STRING"; - case RT_CORBA_PARSER_GET_RTP : return "RT_CORBA_PARSER_GET_RTP"; - case RT_CORBA_PARSER_GET_RSS : return "RT_CORBA_PARSER_GET_RSS"; - case RT_CORBA_PARSER_GET_RTP_COUNT : return "RT_CORBA_PARSER_GET_RTP_COUNT"; - case RT_CORBA_PARSER_GET_RTP_PAR_COUNT : return "RT_CORBA_PARSER_GET_RTP_PAR_COUNT"; - case RT_PROCGUI_BLOCK_CREATE : return "RT_PROCGUI_BLOCK_CREATE"; - case RT_PROCGUI_BLOCK_PROCESS : return "RT_PROCGUI_BLOCK_PROCESS"; - case RT_PROCGUI_BLOCK_TERMINATE : return "RT_PROCGUI_BLOCK_TERMINATE"; - default : return "RT_UNKNOWN"; - } - } - - class RDOMessageInfo { - friend class RDOThread; - friend class RDOKernel; -#ifdef RDO_MT - private: - enum Type { post = 0, send, manual } type; - CEvent* send_event; - CMutex* param_lock; -#endif - public: - RDOThread* from; - RDOTreadMessage message; - void* param; -#ifdef RDO_MT - RDOMessageInfo(RDOThread* _from, RDOTreadMessage _message, void* _param, Type _type ) - : from (_from ) - , message (_message) - , param (_param ) - , type (_type ) - , send_event(NULL ) - , param_lock(NULL ) - {} - RDOMessageInfo(const RDOMessageInfo& copy) - : type (copy.type ) - , send_event(copy.send_event) - , from (copy.from ) - , message (copy.message ) - , param (copy.param ) - , param_lock(copy.param_lock) - {} - void lock() { if ( param_lock ) param_lock->Lock(); } - void unlock() { if ( param_lock ) param_lock->Unlock(); } -#else - RDOMessageInfo(RDOThread* _from, RDOTreadMessage _message, void* _param) - : from (_from ) - , message(_message) - , param (_param ) - {} - RDOMessageInfo(const RDOMessageInfo& copy) - : from (copy.from ) - , message(copy.message) - , param (copy.param ) - {} - void lock() {} - void unlock() {} -#endif - }; - - std::string getName() const { return thread_name; } -#ifdef RDO_MT - std::size_t getID() const { return thread_id; } - bool isGUI() const { return thread_fun ? false : true; } - CEvent* getDestroyEvent() const { return thread_destroy; } -#endif - -/* - class RDOTreadMethod { - public: - RDOThread* thread; - std::string name; - std::size_t index; - }; - - // POST: отправка сообщений без ожидания выполнения - void postMessage( RDOTreadMessage message, void* pParam = NULL ) { - postMessageFrom( NULL, message, pParam ); - } - void postMessageFrom( RDOThread* from, RDOTreadMessage message, void* pParam = NULL ) { - messages_mutex.Lock(); - messages.push_back( RDOMessageInfo( from, message, pParam, RDOThread::RDOMessageInfo::post ) ); - messages_mutex.Unlock(); - } -*/ - // SEND: отправка сообщений с ожиданием выполнения - void sendMessage(RDOThread* to, RDOTreadMessage message, void* pParam = NULL) - { -#ifdef RDO_MT - RDOMessageInfo msg(this, message, pParam, RDOThread::RDOMessageInfo::send); - CEvent event; - msg.send_event = &event; - - to->messages_mutex.Lock(); - if (!to->was_close) - to->messages.push_back(msg); - - to->messages_mutex.Unlock(); - - while (::WaitForSingleObject(event.m_hObject, 0) == WAIT_TIMEOUT) - processMessages(); -#else - RDOMessageInfo messageInfo(this, message, pParam); - to->processMessages(messageInfo); -#endif - } - -#ifdef RDO_MT - // MANUAL: отправка сообщений с 'ручным' ожиданием выполнения для this - CEvent* manualMessageFrom(RDOTreadMessage message, void* pParam = NULL); -#endif - - // Рассылка уведомлений всем тредам с учетом их notifies - // Важно: должна вызываться только для this (в собственной треде) - void broadcastMessage(RDOTreadMessage message, void* pParam = NULL, bool lock = false); - -#ifdef TR_TRACE - static void trace(const std::string& str); -#endif + enum class Message + { + THREAD_CLOSE = 1, + THREAD_CONNECTION, + THREAD_DISCONNECTION, + THREAD_REGISTERED, // param = thread:RDOThread* + THREAD_UNREGISTERED, // param = thread:RDOThread* + THREAD_STOP_AFTER, + STUDIO_MODEL_NEW, // param = rdo::repository::RDOThreadRepository::NewModel* + STUDIO_MODEL_OPEN, // param = rdo::repository::RDOThreadRepository::OpenFile* + STUDIO_MODEL_SAVE, + STUDIO_MODEL_CLOSE, + STUDIO_MODEL_BUILD, + STUDIO_MODEL_RUN, + STUDIO_MODEL_STOP, + STUDIO_MODEL_GET_TEXT, // param = rdo::repository::RDOThreadRepository::FileData* + REPOSITORY_MODEL_NEW, // param = rdo::repository::RDOThreadRepository::NewModel* + REPOSITORY_MODEL_OPEN, + REPOSITORY_MODEL_OPEN_ERROR, // param = model_name:boost::filesystem::path* + REPOSITORY_MODEL_SAVE, + REPOSITORY_MODEL_OPEN_GET_NAME, // param = rdo::repository::RDOThreadRepository::OpenFile* + REPOSITORY_MODEL_CLOSE, + REPOSITORY_MODEL_CLOSE_CAN_CLOSE, // param = result:bool*, работает как И + REPOSITORY_MODEL_CLOSE_ERROR, + REPOSITORY_MODEL_GET_FILEINFO, // param = rdo::repository::RDOThreadRepository::FileInfo* + REPOSITORY_LOAD, // param = rdo::repository::RDOThreadRepository::FileData* + REPOSITORY_SAVE, // param = rdo::repository::RDOThreadRepository::FileData* + REPOSITORY_LOAD_BINARY, // param = rdo::repository::RDOThreadRepository::BinaryFile* + REPOSITORY_CREATE_FILE, // param = rdo::repository::RDOThreadRepository::CreateFile* + SIMULATOR_PARSE_OK, + SIMULATOR_PARSE_ERROR, + SIMULATOR_PARSE_ERROR_SMR, + SIMULATOR_PARSE_ERROR_SMR_EMPTY, + SIMULATOR_PARSE_STRING, // param = std::string* + SIMULATOR_MODEL_STOP_OK, + SIMULATOR_MODEL_STOP_BY_USER, + SIMULATOR_MODEL_STOP_RUNTIME_ERROR, + SIMULATOR_MODEL_STOP_RUNTIME_DELAY, + SIMULATOR_GET_MODEL_STRUCTURE, // param = result:std::stringstream* + SIMULATOR_GET_MODEL_RESULTS, // param = result:std::stringstream* + SIMULATOR_GET_MODEL_RESULTS_INFO, // param = result:std::stringstream* + SIMULATOR_GET_MODEL_EXITCODE, // param = result:rdo::simulation::report::ExitCode* + SIMULATOR_GET_LIST, // param = rdo::service::simulation::RDOThreadSimulator::GetList* + SIMULATOR_GET_ERRORS, // param = result:std::vector< RDOSyntaxError >* + RUNTIME_MODEL_START_BEFORE, + RUNTIME_MODEL_START_AFTER, + RUNTIME_MODEL_STOP_BEFORE, + RUNTIME_MODEL_STOP_AFTER, + RUNTIME_TRACE_STRING, // param = std::string* + RUNTIME_GET_MODE, // param = result:rdo::runtime::RunTimeMode* + RUNTIME_SET_MODE, // param = mode:rdo::runtime::RunTimeMode* + RUNTIME_GET_SPEED, // param = result:double[0..1]%* + RUNTIME_SET_SPEED, // param = speed:double[0..1]%* + RUNTIME_GET_SHOWRATE, // param = result:double[0..+max_double]* + RUNTIME_SET_SHOWRATE, // param = show_rate:double[0..+max_double]* + RUNTIME_GET_TIMENOW, // param = result:double* + RUNTIME_GET_FRAME, // param = { result:rdo::animation::Frame*, frame_number:int }* + RUNTIME_GET_LAST_BREAKPOINT, // param = std::string* + RUNTIME_KEY_DOWN, // param = scanCode:uint* + RUNTIME_KEY_UP, // param = scanCode:uint* + RUNTIME_FRAME_AREA_DOWN, // param = area_name:std::string* + CONVERTOR_NONE, + CONVERTOR_OK, + CONVERTOR_ERROR, + CODECOMP_GET_DATA, // param = rdo::service::simulation::RDOThreadCodeComp::GetCodeComp* + DEBUG_STRING, // param = std::string* + RESULT_STRING, // param = std::string* + CORBA_PARSER_GET_RTP, + CORBA_PARSER_GET_RSS, + CORBA_PARSER_GET_RTP_COUNT, + CORBA_PARSER_GET_RTP_PAR_COUNT, + }; + + static std::string messageToString(Message message); + + class RDOMessageInfo { + friend class RDOThread; + friend class RDOKernel; + public: + RDOThread* from; + Message message; + void* param; + RDOMessageInfo(RDOThread* _from, Message _message, void* _param) + : from (_from ) + , message(_message) + , param (_param ) + {} + RDOMessageInfo(const RDOMessageInfo& copy) + : from (copy.from ) + , message(copy.message) + , param (copy.param ) + {} + void lock() {} + void unlock() {} + }; + + std::string getName() const { return thread_name; } + + // SEND: отправка сообщений с ожиданием выполнения + void sendMessage(RDOThread* to, Message message, void* pParam = NULL) + { + RDOMessageInfo messageInfo(this, message, pParam); + to->processMessages(messageInfo); + } + + // Рассылка уведомлений всем тредам с учетом их notifies + // Важно: должна вызываться только для this (в собственной треде) + void broadcastMessage(Message message, void* pParam = NULL, bool lock = false); protected: -#ifdef RDO_MT - // Есть два ограничения на использование тред в RDO_MT (с thread-safety всё в порядке, imho): - // 1. Каждая треда имеет доступ к стеку сообщений (messages) любой другой треды, чтобы положить туда новое сообщение. - // 2. Каждая треда имеет доступ к списку уведомлений (notifies), чтобы понять, а надо ли посылать сообщение треде. - // Второе еще можно сделать через дублирование: map< key = thread*, value = notifies > в каджой треде, - // а вот как добавить сообщение - не совсем понрятно. - static std::size_t threadFun(void* pParam); - const RDOThreadFun thread_fun; - CWinThread* thread_win; - CEvent proc_create; // Вызывается из процедуры треды, конструктор должен его дождаться - CEvent thread_create; // Вызывается из конструктора объекта, процедура должна его дождаться - CEvent* thread_destroy; // Вызывается из деструктора объекта - bool broadcast_waiting; // Без мутекса, т.к. меняется только в одной треде - bool was_start; // Без мутекса, т.к. меняется только в одной треде - bool was_close; - int thread_id; - int idle_cnt; -#endif - const std::string thread_name; - - typedef std::vector NotifieList; - - NotifieList notifies; // Список сообщений, на которые реагирует треда - // Если он пуст, то обрабатываются все сообщения. - // RT_THREAD_CLOSE обрабатывается в RDOThread::processMessages() - // Если сообщение посылается не из kernel'а, а напрямую, то - // то оно не будет проходить через этот фильтр, а сразу попадет в очередь. - -#ifdef RDO_MT - CMutex notifies_mutex; - - // Очередь сообщений - typedef std::list MessageList; - MessageList messages; - CMutex messages_mutex; - - class BroadcastData { - public: - typedef std::vector EventList; - EventList events; - std::size_t cnt; - HANDLE* handles; + const std::string thread_name; - BroadcastData() - : cnt (0 ) - , handles(NULL) - {} - BroadcastData(std::size_t _cnt) - : cnt(_cnt) - { - for (std::size_t i = 0; i < cnt; i++ ) - events.push_back(new CEvent()); - handles = new HANDLE[cnt]; - } - BroadcastData(const BroadcastData& copy) - : cnt (copy.cnt ) - , handles(copy.handles) - { - events.assign(copy.events.begin(), copy.events.end()); - } - ~BroadcastData() - {} + typedef std::vector NotifieList; - void clear() - { - for (std::size_t i = 0; i < cnt; i++) - delete events[i]; - delete[] handles; - } - void resize() - { - if (cnt) - { - events.resize(cnt * 2); - HANDLE* handles_backup = handles; - handles = new HANDLE[cnt * 2]; - for (std::size_t i = 0; i < cnt; i++) - { - events.push_back(new CEvent()); - handles[i] = handles_backup[i]; - handles[cnt+i] = new HANDLE; - } - delete[] handles_backup; - cnt *= 2; - } - else - { - cnt = 10; - for (std::size_t i = 0; i < cnt; i++) - events.push_back(new CEvent()); - handles = new HANDLE[cnt]; - } - } - }; - typedef std::vector BroadcastDataList; - BroadcastDataList broadcast_data; - std::size_t broadcast_cnt; + NotifieList notifies; // Список сообщений, на которые реагирует треда + // Если он пуст, то обрабатываются все сообщения. + // Message::THREAD_CLOSE обрабатывается в RDOThread::processMessages() + // Если сообщение посылается не из kernel'а, а напрямую, то + // то оно не будет проходить через этот фильтр, а сразу попадет в очередь. -#endif + RDOThread* getKernel(); -#ifdef RDO_MT - virtual RDOThread* getKernel(); -#else - RDOThread* getKernel(); -#endif + // Создавать можно только через потомков + RDOThread(const std::string& _thread_name); + // Удаляет объкты функция треды. kernel удаляется через статический метод + virtual ~RDOThread(); - // Создавать можно только через потомков -#ifdef RDO_MT - RDOThread(const std::string& _thread_name, RDOThreadFun _thread_fun = NULL); -#else - RDOThread(const std::string& _thread_name); -#endif - // Удаляет объкты функция треды. kernel удаляется через статический метод - virtual ~RDOThread(); + // Надо обязательно вызвать из конструктора объекта, чтобы настроить правильно this для виртуальных функций, + void after_constructor(); - // Надо обязательно вызвать из конструктора объекта, чтобы настроить правильно this для виртуальных функций, - void after_constructor(); + virtual void proc(RDOMessageInfo& msg) = 0; + virtual void idle(); + virtual void start(); + virtual void stop(); + virtual void destroy(); - virtual void proc (RDOMessageInfo& msg) = 0; - virtual void idle (); - virtual void start(); - virtual void stop (); -#ifdef RDO_MT - virtual bool processMessages(); -#else - void processMessages(RDOMessageInfo& msg) - { -#ifdef TR_TRACE - RDOThread::trace("---------------- " + messageToString(msg.message) + ": " + (msg.from ? msg.from->thread_name : "NULL") + " -> " + thread_name); -#endif - proc(msg); - if (msg.message == RT_THREAD_CLOSE) - { - if (this != getKernel()) - sendMessage(getKernel(), RT_THREAD_DISCONNECTION); - stop(); - destroy(); - return; - } - } -#endif - - virtual void destroy() - { - delete this; - } + void processMessages(RDOMessageInfo& msg); }; // -------------------------------------------------------------------------------- @@ -491,15 +180,9 @@ friend class RDOKernel; class RDOThreadMT: public RDOThread { protected: -#ifdef RDO_MT - RDOThreadMT(const std::string& _thread_name, RDOThreadFun _thread_fun = RDOThread::threadFun) - : RDOThread(_thread_name, _thread_fun) - {} -#else - RDOThreadMT(const std::string& _thread_name) - : RDOThread(_thread_name) - {} -#endif + RDOThreadMT(const std::string& _thread_name) + : RDOThread(_thread_name) + {} }; // -------------------------------------------------------------------------------- @@ -508,29 +191,10 @@ class RDOThreadMT: public RDOThread // Базовый класс для треды, которая получает сообщения от kernel_gui, а не от kernel. // Используется как логическая вложенная треда в настоящую треду kernel_gui // -#ifdef RDO_MT class RDOThreadGUI: public RDOThread { -friend class RDOKernelGUI; -private: - RDOThread* kernel_gui; - protected: - RDOThreadGUI(const std::string& _thread_name, RDOThread* _kernel_gui) - : RDOThread (_thread_name) - , kernel_gui(_kernel_gui ) - {} - virtual RDOThread* getKernel(); - virtual bool processMessages(); + RDOThreadGUI(const std::string& _thread_name, RDOThread*) + : RDOThread(_thread_name) + {} }; -#else -class RDOThreadGUI: public RDOThread -{ -protected: - RDOThreadGUI(const std::string& _thread_name, RDOThread*) - : RDOThread(_thread_name) - {} -}; -#endif - -#endif // RDO_THREAD_H diff --git a/repository/rdorepository.cpp b/repository/rdorepository.cpp index 1b21f0393..49301b232 100644 --- a/repository/rdorepository.cpp +++ b/repository/rdorepository.cpp @@ -18,607 +18,606 @@ namespace rdo { namespace repository { // -------------------- RDOThreadRepository // -------------------------------------------------------------------------------- RDOThreadRepository::RDOThreadRepository() - : RDOThreadMT ("RDOThreadRepository") - , m_hasModel (false ) - , m_realOnlyInDlg(false ) -{ - notifies.push_back(RT_STUDIO_MODEL_NEW ); - notifies.push_back(RT_STUDIO_MODEL_OPEN ); - notifies.push_back(RT_STUDIO_MODEL_CLOSE ); - notifies.push_back(RT_STUDIO_MODEL_SAVE ); - notifies.push_back(RT_REPOSITORY_MODEL_GET_FILEINFO ); - notifies.push_back(RT_REPOSITORY_LOAD ); - notifies.push_back(RT_REPOSITORY_SAVE ); - notifies.push_back(RT_REPOSITORY_LOAD_BINARY ); - notifies.push_back(RT_REPOSITORY_CREATE_FILE ); - notifies.push_back(RT_SIMULATOR_MODEL_STOP_OK ); - notifies.push_back(RT_SIMULATOR_MODEL_STOP_BY_USER ); - notifies.push_back(RT_SIMULATOR_MODEL_STOP_RUNTIME_ERROR); - notifies.push_back(RT_RUNTIME_MODEL_START_BEFORE ); - notifies.push_back(RT_RUNTIME_TRACE_STRING ); - - m_files[rdo::model::RDOX].m_extension = "rdox"; - m_files[rdo::model::RTP ].m_extension = "rtp"; - m_files[rdo::model::RSS ].m_extension = "rss"; - m_files[rdo::model::EVN ].m_extension = "evn"; - m_files[rdo::model::PAT ].m_extension = "pat"; - m_files[rdo::model::DPT ].m_extension = "dpt"; - m_files[rdo::model::PRC ].m_extension = "prc"; - m_files[rdo::model::PRCX].m_extension = "prcx"; - m_files[rdo::model::FRM ].m_extension = "frm"; - m_files[rdo::model::FUN ].m_extension = "fun"; - m_files[rdo::model::SMR ].m_extension = "smr"; - m_files[rdo::model::PMD ].m_extension = "pmd"; - m_files[rdo::model::PMV ].m_extension = "pmv"; - m_files[rdo::model::TRC ].m_extension = "trc"; - -// m_files[rdo::model::OPR].deleteifempty = true; -// m_files[rdo::model::DPT].deleteifempty = true; - - resetModelNames(); - - after_constructor(); + : RDOThreadMT ("RDOThreadRepository") + , m_hasModel (false ) + , m_realOnlyInDlg(false ) +{ + notifies.push_back(Message::STUDIO_MODEL_NEW ); + notifies.push_back(Message::STUDIO_MODEL_OPEN ); + notifies.push_back(Message::STUDIO_MODEL_CLOSE ); + notifies.push_back(Message::STUDIO_MODEL_SAVE ); + notifies.push_back(Message::REPOSITORY_MODEL_GET_FILEINFO ); + notifies.push_back(Message::REPOSITORY_LOAD ); + notifies.push_back(Message::REPOSITORY_SAVE ); + notifies.push_back(Message::REPOSITORY_LOAD_BINARY ); + notifies.push_back(Message::REPOSITORY_CREATE_FILE ); + notifies.push_back(Message::SIMULATOR_MODEL_STOP_OK ); + notifies.push_back(Message::SIMULATOR_MODEL_STOP_BY_USER ); + notifies.push_back(Message::SIMULATOR_MODEL_STOP_RUNTIME_ERROR); + notifies.push_back(Message::RUNTIME_MODEL_START_BEFORE ); + notifies.push_back(Message::RUNTIME_TRACE_STRING ); + + m_files[rdo::FileType::RDOX].m_extension = "rdox"; + m_files[rdo::FileType::RTP ].m_extension = "rtp"; + m_files[rdo::FileType::RSS ].m_extension = "rss"; + m_files[rdo::FileType::EVN ].m_extension = "evn"; + m_files[rdo::FileType::PAT ].m_extension = "pat"; + m_files[rdo::FileType::DPT ].m_extension = "dpt"; + m_files[rdo::FileType::PRC ].m_extension = "prc"; + m_files[rdo::FileType::PRCX].m_extension = "prcx"; + m_files[rdo::FileType::FRM ].m_extension = "frm"; + m_files[rdo::FileType::FUN ].m_extension = "fun"; + m_files[rdo::FileType::SMR ].m_extension = "smr"; + m_files[rdo::FileType::PMD ].m_extension = "pmd"; + m_files[rdo::FileType::PMV ].m_extension = "pmv"; + m_files[rdo::FileType::TRC ].m_extension = "trc"; + +// m_files[rdo::OPR].deleteifempty = true; +// m_files[rdo::DPT].deleteifempty = true; + + resetModelNames(); + + after_constructor(); } RDOThreadRepository::~RDOThreadRepository() { - m_traceFile.close(); + m_traceFile.close(); } void RDOThreadRepository::proc(RDOMessageInfo& msg) { - switch (msg.message) - { - case RT_STUDIO_MODEL_NEW: - { - msg.lock(); - NewModel* data = static_cast(msg.param); - newModel(data); - msg.unlock(); - break; - } - case RT_STUDIO_MODEL_OPEN: - { - msg.lock(); - OpenFile* data = static_cast(msg.param); - data->m_result = openModel(data->m_name); - msg.unlock(); - break; - } - case RT_STUDIO_MODEL_CLOSE: - { - closeModel(); - break; - } - case RT_STUDIO_MODEL_SAVE: - { - bool res = saveModel(); - msg.lock(); - if (msg.param) *static_cast(msg.param) = res; - msg.unlock(); - break; - } - case RT_RUNTIME_MODEL_START_BEFORE: - { - beforeModelStart(); - break; - } - case RT_SIMULATOR_MODEL_STOP_OK : - case RT_SIMULATOR_MODEL_STOP_BY_USER : - case RT_SIMULATOR_MODEL_STOP_RUNTIME_ERROR: - { - stopModel(); - break; - } - case RT_RUNTIME_TRACE_STRING: - { - msg.lock(); - trace(*static_cast(msg.param)); - msg.unlock(); - break; - } - case RT_REPOSITORY_MODEL_GET_FILEINFO: - { - msg.lock(); - FileInfo* data = static_cast(msg.param); - data->m_name = getFileName (data->m_type); - data->m_fullName = getFullFileName(data->m_type); - data->m_extension = getExtension (data->m_type); - data->m_readOnly = isReadOnly (data->m_type); - msg.unlock(); - break; - } - case RT_REPOSITORY_LOAD: - { - msg.lock(); - FileData* fdata = static_cast(msg.param); - load(fdata->m_type, fdata->m_stream); - msg.unlock(); - break; - } - case RT_REPOSITORY_SAVE: - { - msg.lock(); - FileData* fdata = static_cast(msg.param); - save(fdata->m_type, fdata->m_stream); - msg.unlock(); - break; - } - case RT_REPOSITORY_LOAD_BINARY: - { - msg.lock(); - BinaryFile* data = static_cast(msg.param); - loadBMP(data->m_name, data->m_stream); - msg.unlock(); - break; - } - case RT_REPOSITORY_CREATE_FILE: - { - msg.lock(); - CreateFileInfo* data = static_cast(msg.param); - createFile(data->m_name, data->m_stream); - msg.unlock(); - break; - } - default: break; - } + switch (msg.message) + { + case Message::STUDIO_MODEL_NEW: + { + msg.lock(); + NewModel* data = static_cast(msg.param); + newModel(data); + msg.unlock(); + break; + } + case Message::STUDIO_MODEL_OPEN: + { + msg.lock(); + OpenFile* data = static_cast(msg.param); + data->m_result = openModel(data->m_name); + msg.unlock(); + break; + } + case Message::STUDIO_MODEL_CLOSE: + { + closeModel(); + break; + } + case Message::STUDIO_MODEL_SAVE: + { + bool res = saveModel(); + msg.lock(); + if (msg.param) *static_cast(msg.param) = res; + msg.unlock(); + break; + } + case Message::RUNTIME_MODEL_START_BEFORE: + { + beforeModelStart(); + break; + } + case Message::SIMULATOR_MODEL_STOP_OK : + case Message::SIMULATOR_MODEL_STOP_BY_USER : + case Message::SIMULATOR_MODEL_STOP_RUNTIME_ERROR: + { + stopModel(); + break; + } + case Message::RUNTIME_TRACE_STRING: + { + msg.lock(); + trace(*static_cast(msg.param)); + msg.unlock(); + break; + } + case Message::REPOSITORY_MODEL_GET_FILEINFO: + { + msg.lock(); + FileInfo* data = static_cast(msg.param); + data->m_name = getFileName (data->m_type); + data->m_fullName = getFullFileName(data->m_type); + data->m_extension = getExtension (data->m_type); + data->m_readOnly = isReadOnly (data->m_type); + msg.unlock(); + break; + } + case Message::REPOSITORY_LOAD: + { + msg.lock(); + FileData* fdata = static_cast(msg.param); + load(fdata->m_type, fdata->m_stream); + msg.unlock(); + break; + } + case Message::REPOSITORY_SAVE: + { + msg.lock(); + FileData* fdata = static_cast(msg.param); + save(fdata->m_type, fdata->m_stream); + msg.unlock(); + break; + } + case Message::REPOSITORY_LOAD_BINARY: + { + msg.lock(); + BinaryFile* data = static_cast(msg.param); + loadBMP(data->m_name, data->m_stream); + msg.unlock(); + break; + } + case Message::REPOSITORY_CREATE_FILE: + { + msg.lock(); + CreateFileInfo* data = static_cast(msg.param); + createFile(data->m_name, data->m_stream); + msg.unlock(); + break; + } + default: break; + } } void RDOThreadRepository::resetModelNames() { - for (auto& file: m_files) - file.second.resetname(); + for (auto& file: m_files) + file.second.resetname(); } RDOThreadRepository::FindModel RDOThreadRepository::updateModelNames() { - if (!m_projectName.m_rdox) - { - rdo::converter::smr2rdox::RDOSMRFileInfo fileInfo; - kernel->simulator()->parseSMRFileInfo(fileInfo); - if (fileInfo.m_error) - { - if (fileInfo.m_modelName.empty()) - { - return fm_smr_empty; - } - return fm_smr_error; - } - } - - for (auto& file: m_files) - { - file.second.m_fileName = m_modelName; - file.second.m_mustExist = false; - file.second.m_deleteIfEmpty = true; - } - return fm_ok; + if (!m_projectName.m_rdox) + { + rdo::converter::smr2rdox::RDOSMRFileInfo fileInfo; + kernel->simulator()->parseSMRFileInfo(fileInfo); + if (fileInfo.m_error) + { + if (fileInfo.m_modelName.empty()) + { + return FindModel::SMR_EMPTY; + } + return FindModel::SMR_ERROR; + } + } + + for (auto& file: m_files) + { + file.second.m_fileName = m_modelName; + file.second.m_mustExist = false; + file.second.m_deleteIfEmpty = true; + } + return FindModel::OK; } void RDOThreadRepository::newModel(const NewModel* const data) { - if (canCloseModel()) - { - realCloseModel(); - if (data) - { - boost::filesystem::path path = data->m_path; - extractName((path / data->m_name).replace_extension(m_files[rdo::model::RDOX].m_extension)); - if (!rdo::File::exist(path)) - { - boost::filesystem::create_directory(path); - } - createRDOX(); - } - else - { - m_modelName = "noname"; - m_modelPath = boost::filesystem::path(); - } - for (auto& file: m_files) - { - file.second.m_fileName = m_modelName; - } - m_hasModel = true; - broadcastMessage(RT_REPOSITORY_MODEL_NEW); - } - else - { - broadcastMessage(RT_REPOSITORY_MODEL_CLOSE_ERROR); - } + if (canCloseModel()) + { + realCloseModel(); + if (data) + { + boost::filesystem::path path = data->m_path; + extractName((path / data->m_name).replace_extension(m_files[rdo::FileType::RDOX].m_extension)); + if (!rdo::File::exist(path)) + boost::filesystem::create_directory(path); + + createRDOX(); + } + else + { + m_modelName = "noname"; + m_modelPath = boost::filesystem::path(); + } + for (auto& file: m_files) + { + file.second.m_fileName = m_modelName; + } + m_hasModel = true; + broadcastMessage(Message::REPOSITORY_MODEL_NEW); + } + else + { + broadcastMessage(Message::REPOSITORY_MODEL_CLOSE_ERROR); + } } bool RDOThreadRepository::openModel(const boost::filesystem::path& modelFileName) { - if (canCloseModel()) - { - realCloseModel(); - - bool canOpen = true; - m_realOnlyInDlg = false; - if (modelFileName.empty()) - { - OpenFile data; - broadcastMessage(RT_REPOSITORY_MODEL_OPEN_GET_NAME, &data, true); - if (data.m_result) - { - m_realOnlyInDlg = data.m_readOnly; - extractName(data.m_name); - } - else - { - canOpen = false; - } - } - else - { - extractName(modelFileName); - canOpen = !m_modelName.empty(); - } - - if (canOpen) - { - for (auto& file: m_files) - file.second.m_readOnly = m_realOnlyInDlg; - - boost::filesystem::path rdoxFileName = (m_modelPath / m_modelName).replace_extension(m_files[rdo::model::RDOX].m_extension); - boost::filesystem::path smrFileName = (m_modelPath / m_modelName).replace_extension(m_files[rdo::model::SMR ].m_extension); - - if (rdo::File::exist(rdoxFileName)) - { - m_projectName.m_fullFileName = rdoxFileName; - m_projectName.m_rdox = true; - m_hasModel = true; - } - else if (rdo::File::exist(smrFileName)) - { - m_projectName.m_fullFileName = smrFileName; - m_projectName.m_rdox = false; - m_files[rdo::model::SMR].m_fileName = m_modelName; - m_hasModel = true; - } - - if (m_hasModel) - { - switch (updateModelNames()) - { - case fm_ok : broadcastMessage(RT_REPOSITORY_MODEL_OPEN); return true; - case fm_smr_error: broadcastMessage(RT_REPOSITORY_MODEL_OPEN); return false; - case fm_smr_empty: return false; - } - } - else - { - setName(boost::filesystem::path()); - broadcastMessage(RT_REPOSITORY_MODEL_OPEN_ERROR, const_cast(&modelFileName)); - } - } - } - else - { - broadcastMessage(RT_REPOSITORY_MODEL_CLOSE_ERROR); - } - - return false; + if (canCloseModel()) + { + realCloseModel(); + + bool canOpen = true; + m_realOnlyInDlg = false; + if (modelFileName.empty()) + { + OpenFile data; + broadcastMessage(Message::REPOSITORY_MODEL_OPEN_GET_NAME, &data, true); + if (data.m_result) + { + m_realOnlyInDlg = data.m_readOnly; + extractName(data.m_name); + } + else + { + canOpen = false; + } + } + else + { + extractName(modelFileName); + canOpen = !m_modelName.empty(); + } + + if (canOpen) + { + for (auto& file: m_files) + file.second.m_readOnly = m_realOnlyInDlg; + + boost::filesystem::path rdoxFileName = (m_modelPath / m_modelName).replace_extension(m_files[rdo::FileType::RDOX].m_extension); + boost::filesystem::path smrFileName = (m_modelPath / m_modelName).replace_extension(m_files[rdo::FileType::SMR ].m_extension); + + if (rdo::File::exist(rdoxFileName)) + { + m_projectName.m_fullFileName = rdoxFileName; + m_projectName.m_rdox = true; + m_hasModel = true; + } + else if (rdo::File::exist(smrFileName)) + { + m_projectName.m_fullFileName = smrFileName; + m_projectName.m_rdox = false; + m_files[rdo::FileType::SMR].m_fileName = m_modelName; + m_hasModel = true; + } + + if (m_hasModel) + { + switch (updateModelNames()) + { + case FindModel::OK : broadcastMessage(Message::REPOSITORY_MODEL_OPEN); return true; + case FindModel::SMR_ERROR: broadcastMessage(Message::REPOSITORY_MODEL_OPEN); return false; + case FindModel::SMR_EMPTY: return false; + } + } + else + { + setName(boost::filesystem::path()); + broadcastMessage(Message::REPOSITORY_MODEL_OPEN_ERROR, const_cast(&modelFileName)); + } + } + } + else + { + broadcastMessage(Message::REPOSITORY_MODEL_CLOSE_ERROR); + } + + return false; } bool RDOThreadRepository::saveModel() { - ASSERT(!m_modelPath.empty()); - broadcastMessage(RT_REPOSITORY_MODEL_SAVE); - return true; + ASSERT(!m_modelPath.empty()); + broadcastMessage(Message::REPOSITORY_MODEL_SAVE); + return true; } bool RDOThreadRepository::canCloseModel() { - if (m_hasModel) - { - bool res = true; - broadcastMessage(RT_REPOSITORY_MODEL_CLOSE_CAN_CLOSE, &res, true); - return res; - } - else - { - return true; - } + if (m_hasModel) + { + bool res = true; + broadcastMessage(Message::REPOSITORY_MODEL_CLOSE_CAN_CLOSE, &res, true); + return res; + } + else + { + return true; + } } void RDOThreadRepository::realCloseModel() { - if (m_hasModel) - { - m_hasModel = false; - broadcastMessage(RT_REPOSITORY_MODEL_CLOSE); - m_modelName = boost::filesystem::path(); - m_modelPath = boost::filesystem::path(); - resetModelNames(); - } + if (m_hasModel) + { + m_hasModel = false; + broadcastMessage(Message::REPOSITORY_MODEL_CLOSE); + m_modelName = boost::filesystem::path(); + m_modelPath = boost::filesystem::path(); + resetModelNames(); + } } void RDOThreadRepository::closeModel() { - if (canCloseModel()) - { - realCloseModel(); - } - else - { - broadcastMessage(RT_REPOSITORY_MODEL_CLOSE_ERROR); - } + if (canCloseModel()) + { + realCloseModel(); + } + else + { + broadcastMessage(Message::REPOSITORY_MODEL_CLOSE_ERROR); + } } void RDOThreadRepository::extractName(const boost::filesystem::path& fullName) { - m_modelPath = rdo::File::extractFilePath(fullName); + m_modelPath = rdo::File::extractFilePath(fullName); - boost::filesystem::path path(fullName); - setName(path.filename().stem()); + boost::filesystem::path path(fullName); + setName(path.filename().stem()); } void RDOThreadRepository::setName(const boost::filesystem::path& name) { - m_modelName = name; - if (m_modelName.empty()) - { - m_modelPath = boost::filesystem::path(); - resetModelNames(); - } + m_modelName = name; + if (m_modelName.empty()) + { + m_modelPath = boost::filesystem::path(); + resetModelNames(); + } } void RDOThreadRepository::loadFile(const boost::filesystem::path& fileName, std::ostream& stream, bool mustExist, bool& reanOnly) const { - if (rdo::File::exist(fileName)) - { - if (!m_realOnlyInDlg) - { - reanOnly = rdo::File::read_only(fileName); - } - else - { - reanOnly = true; - } - boost::filesystem::ifstream file(fileName, std::ios::in | std::ios::binary); - stream << file.rdbuf(); - file.close(); - } - else - { - stream.setstate(std::ios_base::badbit); - if (mustExist) - { - stream.setstate(stream.rdstate() | std::ios_base::failbit); - } - } + if (rdo::File::exist(fileName)) + { + if (!m_realOnlyInDlg) + { + reanOnly = rdo::File::read_only(fileName); + } + else + { + reanOnly = true; + } + boost::filesystem::ifstream file(fileName, std::ios::in | std::ios::binary); + stream << file.rdbuf(); + file.close(); + } + else + { + stream.setstate(std::ios_base::badbit); + if (mustExist) + { + stream.setstate(stream.rdstate() | std::ios_base::failbit); + } + } } void RDOThreadRepository::saveFile(const boost::filesystem::path& fileName, const std::stringstream& stream, bool deleteIfEmpty) const { - if (!fileName.empty()) - { - const bool file_exist = rdo::File::exist(fileName); - if (!stream.str().empty() || (file_exist && !deleteIfEmpty)) - { - boost::filesystem::ofstream file(fileName, std::ios::out | std::ios::binary); - file << stream.rdbuf(); - file.close(); - } - else - { - if (file_exist && deleteIfEmpty) - { - rdo::File::unlink(fileName); - } - } - } + if (!fileName.empty()) + { + const bool file_exist = rdo::File::exist(fileName); + if (!stream.str().empty() || (file_exist && !deleteIfEmpty)) + { + boost::filesystem::ofstream file(fileName, std::ios::out | std::ios::binary); + file << stream.rdbuf(); + file.close(); + } + else + { + if (file_exist && deleteIfEmpty) + { + rdo::File::unlink(fileName); + } + } + } } bool RDOThreadRepository::createRDOX(const boost::filesystem::path& fileName) { - boost::property_tree::ptree pt; - boost::property_tree::ptree& version = pt.add("Settings.Version", ""); - version.put(".ProjectVersion", "2"); - version.put(".SMRVersion", "2"); + boost::property_tree::ptree pt; + boost::property_tree::ptree& version = pt.add("Settings.Version", ""); + version.put(".ProjectVersion", "2"); + version.put(".SMRVersion", "2"); - boost::filesystem::ofstream ofs(fileName); - if (!ofs.good()) - return false; + boost::filesystem::ofstream ofs(fileName); + if (!ofs.good()) + return false; - boost::property_tree::xml_writer_settings settings('\t', 1); - boost::property_tree::write_xml(ofs, pt, settings); - return true; + boost::property_tree::xml_writer_settings settings('\t', 1); + boost::property_tree::write_xml(ofs, pt, settings); + return true; } void RDOThreadRepository::createRDOX() { - const auto it = m_files.find(rdo::model::RDOX); - ASSERT(it != m_files.end()); - boost::filesystem::path rdoxFileName = (m_modelPath / m_modelName).replace_extension(it->second.m_extension); - if (!rdo::File::exist(rdoxFileName)) - { - if (createRDOX(rdoxFileName)) - { - m_projectName.m_fullFileName = rdoxFileName; - m_projectName.m_rdox = true; - } - } + const auto it = m_files.find(rdo::FileType::RDOX); + ASSERT(it != m_files.end()); + boost::filesystem::path rdoxFileName = (m_modelPath / m_modelName).replace_extension(it->second.m_extension); + if (!rdo::File::exist(rdoxFileName)) + { + if (createRDOX(rdoxFileName)) + { + m_projectName.m_fullFileName = rdoxFileName; + m_projectName.m_rdox = true; + } + } } -void RDOThreadRepository::load(rdo::model::FileType type, std::ostream& stream) +void RDOThreadRepository::load(rdo::FileType type, std::ostream& stream) { - loadFile(getFullFileName(type), stream, m_files[type].m_mustExist, m_files[type].m_readOnly); + loadFile(getFullFileName(type), stream, m_files[type].m_mustExist, m_files[type].m_readOnly); } -void RDOThreadRepository::save(rdo::model::FileType type, const std::stringstream& stream) const +void RDOThreadRepository::save(rdo::FileType type, const std::stringstream& stream) const { - saveFile(getFullFileName(type), stream, isDeleteIfEmpty(type)); - if (type == rdo::model::SMR) - { - const_cast(this)->updateModelNames(); - } + saveFile(getFullFileName(type), stream, isDeleteIfEmpty(type)); + if (type == rdo::FileType::SMR) + { + const_cast(this)->updateModelNames(); + } } void RDOThreadRepository::loadBMP(boost::filesystem::path& name, std::ostream& stream) const { - boost::filesystem::path fileName = (m_modelPath / name).replace_extension("bmp"); - if (rdo::File::exist(fileName)) - { - boost::filesystem::ifstream file(fileName, std::ios::in | std::ios::binary); - stream << file.rdbuf(); - file.close(); - name = fileName; - } - else - { - stream.setstate(std::ios_base::badbit); - } + boost::filesystem::path fileName = (m_modelPath / name).replace_extension("bmp"); + if (rdo::File::exist(fileName)) + { + boost::filesystem::ifstream file(fileName, std::ios::in | std::ios::binary); + stream << file.rdbuf(); + file.close(); + name = fileName; + } + else + { + stream.setstate(std::ios_base::badbit); + } } void RDOThreadRepository::writeModelFilesInfo(boost::filesystem::ofstream& stream) const { - stream << "Results_file = " << rdo::locale::convertFromWStr(getFileExtName(rdo::model::PMV).wstring()) << " " << rdo::Time::local().asString() << std::endl; - stream << "Run_file = " << rdo::locale::convertFromWStr(getFileExtName(rdo::model::SMR).wstring()) << std::endl; - stream << "Model_name = " << rdo::locale::convertFromWStr(getFileName(rdo::model::SMR).wstring()) << std::endl; - stream << "Resource_file = " << rdo::locale::convertFromWStr(getFileName(rdo::model::RSS).replace_extension(getExtension(rdo::model::RSS)).wstring()) << std::endl; + stream << "Results_file = " << rdo::locale::convertFromWStr(getFileExtName(rdo::FileType::PMV).wstring()) << " " << rdo::Time::local().asString() << std::endl; + stream << "Run_file = " << rdo::locale::convertFromWStr(getFileExtName(rdo::FileType::SMR).wstring()) << std::endl; + stream << "Model_name = " << rdo::locale::convertFromWStr(getFileName(rdo::FileType::SMR).wstring()) << std::endl; + stream << "Resource_file = " << rdo::locale::convertFromWStr(getFileName(rdo::FileType::RSS).replace_extension(getExtension(rdo::FileType::RSS)).wstring()) << std::endl; } bool RDOThreadRepository::createFile(const boost::filesystem::path& name, boost::filesystem::ofstream& stream) const { - //! TODO: проверить name с русскими буквами - std::stringstream backupDirName; - backupDirName << m_modelPath - << boost::format("%1$04d-%2$02d-%3$02d %4$02d-%5$02d-%6$02d %7$s.%8$s") - % m_systemTime.date().year () - % m_systemTime.date().month() - % m_systemTime.date().day () - % m_systemTime.time_of_day().hours () - % m_systemTime.time_of_day().minutes() - % m_systemTime.time_of_day().seconds() - % name.filename() - % name.extension() - ; - - const std::string fullFileName = backupDirName.str(); - stream.open(rdo::locale::convertToWStr(fullFileName), std::ios::out | std::ios::binary); - return stream.is_open(); + // TODO: проверить name с русскими буквами + std::stringstream backupDirName; + backupDirName << m_modelPath + << boost::format("%1$04d-%2$02d-%3$02d %4$02d-%5$02d-%6$02d %7$s.%8$s") + % m_systemTime.date().year () + % m_systemTime.date().month() + % m_systemTime.date().day () + % m_systemTime.time_of_day().hours () + % m_systemTime.time_of_day().minutes() + % m_systemTime.time_of_day().seconds() + % name.filename() + % name.extension() + ; + + const std::string fullFileName = backupDirName.str(); + stream.open(rdo::locale::convertToWStr(fullFileName), std::ios::out | std::ios::binary); + return stream.is_open(); } void RDOThreadRepository::beforeModelStart() { - m_systemTime = boost::posix_time::second_clock::local_time(); + m_systemTime = boost::posix_time::second_clock::local_time(); - if (m_traceFile.is_open()) - m_traceFile.close(); + if (m_traceFile.is_open()) + m_traceFile.close(); - m_traceFile.open(getFullFileName(rdo::model::TRC), std::ios::out | std::ios::binary); - if (m_traceFile.is_open()) - { - writeModelFilesInfo(m_traceFile); - std::stringstream model_structure; - sendMessage(kernel->simulator(), RT_SIMULATOR_GET_MODEL_STRUCTURE, &model_structure); - m_traceFile << std::endl << model_structure.str() << std::endl; - m_traceFile << "$Tracing" << std::endl; - } + m_traceFile.open(getFullFileName(rdo::FileType::TRC), std::ios::out | std::ios::binary); + if (m_traceFile.is_open()) + { + writeModelFilesInfo(m_traceFile); + std::stringstream model_structure; + sendMessage(kernel->simulator(), Message::SIMULATOR_GET_MODEL_STRUCTURE, &model_structure); + m_traceFile << std::endl << model_structure.str() << std::endl; + m_traceFile << "$Tracing" << std::endl; + } } void RDOThreadRepository::stopModel() { - if (m_traceFile.is_open()) - m_traceFile.close(); + if (m_traceFile.is_open()) + m_traceFile.close(); - boost::filesystem::ofstream results_file; - results_file.open(getFullFileName(rdo::model::PMV), std::ios::out | std::ios::binary); - if (results_file.is_open()) - { - writeModelFilesInfo(results_file); - std::stringstream stream; - sendMessage(kernel->simulator(), RT_SIMULATOR_GET_MODEL_RESULTS_INFO, &stream); - results_file << std::endl << stream.str() << std::endl; - stream.str(""); - stream.clear(); - sendMessage(kernel->simulator(), RT_SIMULATOR_GET_MODEL_RESULTS, &stream); - results_file << std::endl << stream.str() << std::endl; - } + boost::filesystem::ofstream results_file; + results_file.open(getFullFileName(rdo::FileType::PMV), std::ios::out | std::ios::binary); + if (results_file.is_open()) + { + writeModelFilesInfo(results_file); + std::stringstream stream; + sendMessage(kernel->simulator(), Message::SIMULATOR_GET_MODEL_RESULTS_INFO, &stream); + results_file << std::endl << stream.str() << std::endl; + stream.str(""); + stream.clear(); + sendMessage(kernel->simulator(), Message::SIMULATOR_GET_MODEL_RESULTS, &stream); + results_file << std::endl << stream.str() << std::endl; + } } void RDOThreadRepository::trace(const std::string& message) { - if (m_traceFile.is_open()) - { - m_traceFile.write(message.c_str(), message.length()); - m_traceFile.write("\n", 1); - m_traceFile.flush(); - } + if (m_traceFile.is_open()) + { + m_traceFile.write(message.c_str(), message.length()); + m_traceFile.write("\n", 1); + m_traceFile.flush(); + } } -boost::filesystem::path RDOThreadRepository::getFileName(rdo::model::FileType type) const +boost::filesystem::path RDOThreadRepository::getFileName(rdo::FileType type) const { - const auto it = m_files.find(type); - if (it == m_files.end()) - { - NEVER_REACH_HERE; - } + const auto it = m_files.find(type); + if (it == m_files.end()) + { + NEVER_REACH_HERE; + } - return it->second.m_fileName; + return it->second.m_fileName; } -boost::filesystem::path RDOThreadRepository::getExtension(rdo::model::FileType type) const +boost::filesystem::path RDOThreadRepository::getExtension(rdo::FileType type) const { - const auto it = m_files.find(type); - if (it == m_files.end()) - { - NEVER_REACH_HERE; - } + const auto it = m_files.find(type); + if (it == m_files.end()) + { + NEVER_REACH_HERE; + } - return it->second.m_extension; + return it->second.m_extension; } -boost::filesystem::path RDOThreadRepository::getFileExtName(rdo::model::FileType type) const +boost::filesystem::path RDOThreadRepository::getFileExtName(rdo::FileType type) const { - const auto it = m_files.find(type); - if (it == m_files.end()) - { - NEVER_REACH_HERE; - } + const auto it = m_files.find(type); + if (it == m_files.end()) + { + NEVER_REACH_HERE; + } - return boost::filesystem::path(it->second.m_fileName).replace_extension(it->second.m_extension); + return boost::filesystem::path(it->second.m_fileName).replace_extension(it->second.m_extension); } -boost::filesystem::path RDOThreadRepository::getFullFileName(rdo::model::FileType type) const +boost::filesystem::path RDOThreadRepository::getFullFileName(rdo::FileType type) const { - return m_modelPath / getFileExtName(type); + return m_modelPath / getFileExtName(type); } -bool RDOThreadRepository::isReadOnly(rdo::model::FileType type) const +bool RDOThreadRepository::isReadOnly(rdo::FileType type) const { - const auto it = m_files.find(type); - if (it == m_files.end()) - { - NEVER_REACH_HERE; - } + const auto it = m_files.find(type); + if (it == m_files.end()) + { + NEVER_REACH_HERE; + } - return it->second.m_readOnly; + return it->second.m_readOnly; } -bool RDOThreadRepository::isMustExist(rdo::model::FileType type) const +bool RDOThreadRepository::isMustExist(rdo::FileType type) const { - const auto it = m_files.find(type); - if (it == m_files.end()) - { - NEVER_REACH_HERE; - } + const auto it = m_files.find(type); + if (it == m_files.end()) + { + NEVER_REACH_HERE; + } - return it->second.m_mustExist; + return it->second.m_mustExist; } -bool RDOThreadRepository::isDeleteIfEmpty(rdo::model::FileType type) const +bool RDOThreadRepository::isDeleteIfEmpty(rdo::FileType type) const { - const auto it = m_files.find(type); - if (it == m_files.end()) - { - NEVER_REACH_HERE; - } + const auto it = m_files.find(type); + if (it == m_files.end()) + { + NEVER_REACH_HERE; + } - return it->second.m_deleteIfEmpty; + return it->second.m_deleteIfEmpty; } }} // namespace rdo::repository diff --git a/repository/rdorepository.h b/repository/rdorepository.h index 9a03260bb..5539c81f6 100644 --- a/repository/rdorepository.h +++ b/repository/rdorepository.h @@ -1,5 +1,4 @@ -#ifndef _RDOREPOSITORY_H_ -#define _RDOREPOSITORY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -21,180 +20,177 @@ namespace rdo { namespace repository { class RDOThreadRepository: public RDOThreadMT { public: - RDOThreadRepository(); - - struct FileData: public boost::noncopyable - { - rdo::model::FileType m_type; - std::stringstream& m_stream; - - FileData(rdo::model::FileType type, std::stringstream& stream) - : m_type (type ) - , m_stream(stream) - {} - }; - struct BinaryFile: public boost::noncopyable - { - boost::filesystem::path m_name; - std::stringstream& m_stream; - - BinaryFile(const boost::filesystem::path& name, std::stringstream& stream) - : m_name (name ) - , m_stream(stream) - {} - }; - struct CreateFileInfo: public boost::noncopyable - { - boost::filesystem::path m_name; - boost::filesystem::ofstream& m_stream; - - CreateFileInfo(const boost::filesystem::path& name, boost::filesystem::ofstream& stream) - : m_name (name ) - , m_stream(stream) - {} - }; - struct OpenFile - { - boost::filesystem::path m_name; - bool m_readOnly; - bool m_result; - - OpenFile(const boost::filesystem::path& name = boost::filesystem::path(), bool readOnly = false) - : m_name (name ) - , m_readOnly(readOnly) - , m_result (false ) - {} - }; - struct NewModel - { - boost::filesystem::path m_name; - boost::filesystem::path m_path; - - NewModel(const boost::filesystem::path& name = boost::filesystem::path(), const boost::filesystem::path& path = boost::filesystem::path()) - : m_name(name) - , m_path(path) - {} - }; - struct FileInfo - { - rdo::model::FileType m_type; - boost::filesystem::path m_name; - boost::filesystem::path m_fullName; - boost::filesystem::path m_extension; - bool m_readOnly; - bool m_described; - - FileInfo(rdo::model::FileType type = rdo::model::SMR - , const boost::filesystem::path& name = boost::filesystem::path() - , const boost::filesystem::path& fullName = boost::filesystem::path() - , const boost::filesystem::path& extension = "smr" - , bool readOnly = false - , bool described = false - ) - : m_type (type ) - , m_name (name ) - , m_fullName (fullName ) - , m_extension(extension) - , m_readOnly (readOnly ) - , m_described(described) - {} - }; - - static bool createRDOX(const boost::filesystem::path& fileName); + RDOThreadRepository(); + + struct FileData: private boost::noncopyable + { + rdo::FileType m_type; + std::stringstream& m_stream; + + FileData(rdo::FileType type, std::stringstream& stream) + : m_type (type ) + , m_stream(stream) + {} + }; + struct BinaryFile: private boost::noncopyable + { + boost::filesystem::path m_name; + std::stringstream& m_stream; + + BinaryFile(const boost::filesystem::path& name, std::stringstream& stream) + : m_name (name ) + , m_stream(stream) + {} + }; + struct CreateFileInfo: private boost::noncopyable + { + boost::filesystem::path m_name; + boost::filesystem::ofstream& m_stream; + + CreateFileInfo(const boost::filesystem::path& name, boost::filesystem::ofstream& stream) + : m_name (name ) + , m_stream(stream) + {} + }; + struct OpenFile + { + boost::filesystem::path m_name; + bool m_readOnly; + bool m_result; + + OpenFile(const boost::filesystem::path& name = boost::filesystem::path(), bool readOnly = false) + : m_name (name ) + , m_readOnly(readOnly) + , m_result (false ) + {} + }; + struct NewModel + { + boost::filesystem::path m_name; + boost::filesystem::path m_path; + + NewModel(const boost::filesystem::path& name = boost::filesystem::path(), const boost::filesystem::path& path = boost::filesystem::path()) + : m_name(name) + , m_path(path) + {} + }; + struct FileInfo + { + rdo::FileType m_type; + boost::filesystem::path m_name; + boost::filesystem::path m_fullName; + boost::filesystem::path m_extension; + bool m_readOnly; + bool m_described; + + FileInfo(rdo::FileType type = rdo::FileType::SMR, + const boost::filesystem::path& name = boost::filesystem::path(), + const boost::filesystem::path& fullName = boost::filesystem::path(), + const boost::filesystem::path& extension = "smr", + bool readOnly = false, + bool described = false) + : m_type (type ) + , m_name (name ) + , m_fullName (fullName ) + , m_extension(extension) + , m_readOnly (readOnly ) + , m_described(described) + {} + }; + + static bool createRDOX(const boost::filesystem::path& fileName); private: - struct fileInfo - { - boost::filesystem::path m_fileName; - boost::filesystem::path m_extension; - bool m_mustExist; - bool m_deleteIfEmpty; - bool m_readOnly; - - fileInfo() - : m_deleteIfEmpty(false) - , m_readOnly (false) - { - resetname(); - } - - void resetname() - { - m_fileName = boost::filesystem::path(); - m_mustExist = true; - } - }; - typedef std::map FileList; - - enum FindModel - { - fm_ok, - fm_smr_error, - fm_smr_empty - }; - - struct ProjectName - { - boost::filesystem::path m_fullFileName; - bool m_rdox; - - ProjectName() - : m_rdox(true) - {} - }; - - typedef boost::posix_time::ptime SystemTime; - - boost::filesystem::path m_modelName; - boost::filesystem::path m_modelPath; - bool m_hasModel; - boost::filesystem::ofstream m_traceFile; - FileList m_files; - bool m_realOnlyInDlg; - ProjectName m_projectName; - SystemTime m_systemTime; - - void resetModelNames(); - FindModel updateModelNames(); - bool canCloseModel(); - void realCloseModel(); - void extractName(const boost::filesystem::path& fullName); - void setName(const boost::filesystem::path& name); - void createRDOX(); - - void loadFile(const boost::filesystem::path& fileName, std::ostream& stream, bool mustExist, bool& reanOnly) const; - void saveFile(const boost::filesystem::path& fileName, const std::stringstream& stream, bool deleteIfEmpty = false) const; - - bool createFile(const boost::filesystem::path& name, boost::filesystem::ofstream& stream) const; - - void beforeModelStart(); - void stopModel(); - void trace(const std::string& message); - void writeModelFilesInfo(boost::filesystem::ofstream& stream) const; + struct fileInfo + { + boost::filesystem::path m_fileName; + boost::filesystem::path m_extension; + bool m_mustExist; + bool m_deleteIfEmpty; + bool m_readOnly; + + fileInfo() + : m_deleteIfEmpty(false) + , m_readOnly (false) + { + resetname(); + } + + void resetname() + { + m_fileName = boost::filesystem::path(); + m_mustExist = true; + } + }; + typedef std::map FileList; + + enum class FindModel + { + OK, + SMR_ERROR, + SMR_EMPTY + }; + + struct ProjectName + { + boost::filesystem::path m_fullFileName; + bool m_rdox; + + ProjectName() + : m_rdox(true) + {} + }; + + typedef boost::posix_time::ptime SystemTime; + + boost::filesystem::path m_modelName; + boost::filesystem::path m_modelPath; + bool m_hasModel; + boost::filesystem::ofstream m_traceFile; + FileList m_files; + bool m_realOnlyInDlg; + ProjectName m_projectName; + SystemTime m_systemTime; + + void resetModelNames(); + FindModel updateModelNames(); + bool canCloseModel(); + void realCloseModel(); + void extractName(const boost::filesystem::path& fullName); + void setName(const boost::filesystem::path& name); + void createRDOX(); + + void loadFile(const boost::filesystem::path& fileName, std::ostream& stream, bool mustExist, bool& reanOnly) const; + void saveFile(const boost::filesystem::path& fileName, const std::stringstream& stream, bool deleteIfEmpty = false) const; + + bool createFile(const boost::filesystem::path& name, boost::filesystem::ofstream& stream) const; + + void beforeModelStart(); + void stopModel(); + void trace(const std::string& message); + void writeModelFilesInfo(boost::filesystem::ofstream& stream) const; protected: - virtual ~RDOThreadRepository(); // Чтобы нельзя было удалить через delete - virtual void proc(RDOMessageInfo& msg); - - void newModel(const NewModel* const data); - bool openModel(const boost::filesystem::path& modelFileName); - void closeModel(); - bool saveModel(); - - void load(rdo::model::FileType type, std::ostream& stream); - void save(rdo::model::FileType type, const std::stringstream& stream) const; - - boost::filesystem::path getFileName(rdo::model::FileType type) const; - boost::filesystem::path getExtension(rdo::model::FileType type) const; - boost::filesystem::path getFileExtName(rdo::model::FileType type) const; - boost::filesystem::path getFullFileName(rdo::model::FileType type) const; - bool isReadOnly(rdo::model::FileType type) const; - bool isMustExist(rdo::model::FileType type) const; - bool isDeleteIfEmpty(rdo::model::FileType type) const; - - void loadBMP(boost::filesystem::path& name, std::ostream& stream) const; + virtual ~RDOThreadRepository(); // Чтобы нельзя было удалить через delete + virtual void proc(RDOMessageInfo& msg); + + void newModel(const NewModel* const data); + bool openModel(const boost::filesystem::path& modelFileName); + void closeModel(); + bool saveModel(); + + void load(rdo::FileType type, std::ostream& stream); + void save(rdo::FileType type, const std::stringstream& stream) const; + + boost::filesystem::path getFileName(rdo::FileType type) const; + boost::filesystem::path getExtension(rdo::FileType type) const; + boost::filesystem::path getFileExtName(rdo::FileType type) const; + boost::filesystem::path getFullFileName(rdo::FileType type) const; + bool isReadOnly(rdo::FileType type) const; + bool isMustExist(rdo::FileType type) const; + bool isDeleteIfEmpty(rdo::FileType type) const; + + void loadBMP(boost::filesystem::path& name, std::ostream& stream) const; }; }} // namespace rdo::repository - -#endif // _RDOREPOSITORY_H_ diff --git a/scripts/python/executor_of_system_tests.py b/scripts/python/executor_of_system_tests.py index 25892630a..4ee18b7e4 100755 --- a/scripts/python/executor_of_system_tests.py +++ b/scripts/python/executor_of_system_tests.py @@ -146,11 +146,11 @@ def test_console(dirname, model): # run rdo_console app on test model model_file = '' + dirname + model['name'] exit_code = int(model['exit_code']) - command = (rdo_ex + ' -i ' + utils.wrap_the_string_in_quotes(model_file)) + command = (rdo_ex + ' -i ' + utils.wrap_the_string_in_quotes(model_file) + ' >' + os.devnull) if model['script'] and len(model['script']) > 0: command += ' -s ' + utils.wrap_the_string_in_quotes(dirname + model['script']) utils.enc_print('Run:', command, '\n') - simulation_code = subprocess.call(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + simulation_code = subprocess.call(command, shell=True) utils.enc_print ('SIMULATION EXIT CODE :', simulation_code) # check simulation exit code @@ -200,9 +200,9 @@ def test_convertor(dirname, model): shutil.copytree(dirname, temp_directory_name, ignore=shutil.ignore_patterns(*IGNORE_PATTERNS)) model_file = '' + temp_directory_name + model['name'] exit_code = int(model['exit_code']) - command = (rdo_ex + ' -i ' + utils.wrap_the_string_in_quotes(model_file) + ' -c') + command = (rdo_ex + ' -i ' + utils.wrap_the_string_in_quotes(model_file) + ' >' + os.devnull + ' -c') utils.enc_print ('Run:', command, '\n') - convertor_exit_code = subprocess.call(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + convertor_exit_code = subprocess.call(command, shell=True) utils.enc_print ('CONVERT EXIT CODE :', convertor_exit_code, '\n') if convertor_exit_code == exit_code: cycle_exit_code = compare_etalons(model['etalons'], temp_directory_name) diff --git a/scripts/python/replace.py b/scripts/python/replace.py index 045b125b1..cdafa06e4 100644 --- a/scripts/python/replace.py +++ b/scripts/python/replace.py @@ -3,23 +3,40 @@ def __get_filepaths(directory): file_paths = [] + extensions = ['.cpp', '.h', '.l', '.y', '.yx'] for root, directories, files in os.walk(directory): for filename in files: + if 'thirdparty' in root: + continue extension = os.path.splitext(filename)[1] - if extension == '.cpp' or extension == '.h': + if extension in extensions: filepath = os.path.join(root, filename) file_paths.append(filepath) return file_paths +def __remove_headers(pattern, text): + return pattern.sub(r'', text) + +def __remove_doxygen(text): + text = re.sub(r'(.*)\/\/\!(\s)?<(.*)', r'\1//\3', text) + return text + +def __use_pragma_once(text): + text = re.sub(r'#ifndef\s(.*)\n#define\s\1\n+((?:[^\n]*(\n+))+(.*))(\n+)#endif // \1(\n+)?', r'#pragma once\n\n\2', text, re.M) + return text + full_file_paths = __get_filepaths(os.path.abspath('../../')) -pattern = re.compile(r'\/\*\!(?:[^\n]*(\n+))+?(\s*)?(.*)\*\/(\n+)', re.VERBOSE | re.MULTILINE) +remove_headers_pattern = re.compile(r'\/\*\!(?:[^\n]*(\n+))+?(\s*)?(.*)\*\/(\n+)', re.VERBOSE | re.MULTILINE) + for file in full_file_paths: print (file) ifile = open(file, 'r') text = ifile.read() ifile.close() - text = pattern.sub(r'', text) + text = __remove_headers(remove_headers_pattern, text) + text = __remove_doxygen(text) + text = __use_pragma_once(text) ofile = open(file, 'w') ofile.write(text) diff --git a/scripts/python/tests/split-bison/pass1_reference.y b/scripts/python/tests/split-bison/pass1_reference.y index 39270db13..bfb42852d 100644 --- a/scripts/python/tests/split-bison/pass1_reference.y +++ b/scripts/python/tests/split-bison/pass1_reference.y @@ -1,12 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2013 - \file split-test.yx - \author Александровский Кирилл (k.alexandrovsky@gmail.com) - \date 03.10.2013 - \brief Тест для проверки правильности генерации файлов .y для двухпроходной компиляции - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -39,106 +30,106 @@ OPEN_RDO_PARSER_NAMESPACE %% test_empty - : /* empty */ - | test_brackets - | test_for_one_pass_only - | test_for_multiple_passes - { - // some useful comment - some_code(); - } - ; + : /* empty */ + | test_brackets + | test_for_one_pass_only + | test_for_multiple_passes + { + // some useful comment + some_code(); + } + ; test_brackets - : Token1 Token2 - { - some_code(); - } - | Token2 Token3 { - some_code(); - } - | Token3 Token4 { some_code(); } - | Token4 Token5 - { - - } - | Token5 Token6 { - - } - | Token6 Token7 {} - ; + : Token1 Token2 + { + some_code(); + } + | Token2 Token3 { + some_code(); + } + | Token3 Token4 { some_code(); } + | Token4 Token5 + { + + } + | Token5 Token6 { + + } + | Token6 Token7 {} + ; test_for_one_pass_only - : Token1 Token2 - { - /* ---------- COMPILER 1st PASS ---------- */ - - some_code(); - { - some_code(); - } - /* -------------- END PASS 1 ------------- */ - } - | Token2 Token3 { - /* ---------- COMPILER 1st PASS ---------- */ for(int i=0; i<10; ++i){ some_code(); } /* -------------- END PASS 1 ------------- */ - } - | Token3 Token4 { /* ---------- COMPILER 1st PASS ---------- */ some_code(); /* -------------- END PASS 1 ------------- */ } - | Token4 Token5 - { - + : Token1 Token2 + { + /* ---------- COMPILER 1st PASS ---------- */ + + some_code(); + { + some_code(); + } + /* -------------- END PASS 1 ------------- */ + } + | Token2 Token3 { + /* ---------- COMPILER 1st PASS ---------- */ for(int i=0; i<10; ++i){ some_code(); } /* -------------- END PASS 1 ------------- */ + } + | Token3 Token4 { /* ---------- COMPILER 1st PASS ---------- */ some_code(); /* -------------- END PASS 1 ------------- */ } + | Token4 Token5 + { + - - } - | Token5 Token6 - { - + + } + | Token5 Token6 + { + - // comment - + // comment + - } - ; - + } + ; + test_for_multiple_passes - : Token1 Token2 - { - /* ---------- COMPILER 1st PASS ---------- */ - - pass_1_code(); - /* -------------- END PASS 1 ------------- */ - - - - - - - /* ---------- COMPILER 1st PASS ---------- */ - - another_pass_1_code(); - /* -------------- END PASS 1 ------------- */ - - } - | Token2 Token3 - { - common_code(); - { - common_code(); - /* ---------- COMPILER 1st PASS ---------- */ - - pass_1_code(); - /* -------------- END PASS 1 ------------- */ - - - - - } - } - ; + : Token1 Token2 + { + /* ---------- COMPILER 1st PASS ---------- */ + + pass_1_code(); + /* -------------- END PASS 1 ------------- */ + + + + + + + /* ---------- COMPILER 1st PASS ---------- */ + + another_pass_1_code(); + /* -------------- END PASS 1 ------------- */ + + } + | Token2 Token3 + { + common_code(); + { + common_code(); + /* ---------- COMPILER 1st PASS ---------- */ + + pass_1_code(); + /* -------------- END PASS 1 ------------- */ + + + + + } + } + ; %% diff --git a/scripts/python/tests/split-bison/pass2_reference.y b/scripts/python/tests/split-bison/pass2_reference.y index abb4e6c27..4cb4726a3 100644 --- a/scripts/python/tests/split-bison/pass2_reference.y +++ b/scripts/python/tests/split-bison/pass2_reference.y @@ -1,12 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2013 - \file split-test.yx - \author Александровский Кирилл (k.alexandrovsky@gmail.com) - \date 03.10.2013 - \brief Тест для проверки правильности генерации файлов .y для двухпроходной компиляции - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -39,106 +30,106 @@ OPEN_RDO_PARSER_NAMESPACE %% test_empty - : /* empty */ - | test_brackets - | test_for_one_pass_only - | test_for_multiple_passes - { - // some useful comment - some_code(); - } - ; + : /* empty */ + | test_brackets + | test_for_one_pass_only + | test_for_multiple_passes + { + // some useful comment + some_code(); + } + ; test_brackets - : Token1 Token2 - { - some_code(); - } - | Token2 Token3 { - some_code(); - } - | Token3 Token4 { some_code(); } - | Token4 Token5 - { - - } - | Token5 Token6 { - - } - | Token6 Token7 {} - ; + : Token1 Token2 + { + some_code(); + } + | Token2 Token3 { + some_code(); + } + | Token3 Token4 { some_code(); } + | Token4 Token5 + { + + } + | Token5 Token6 { + + } + | Token6 Token7 {} + ; test_for_one_pass_only - : Token1 Token2 - { - - - - - - - - } - | Token2 Token3 { - - } - | Token3 Token4 { } - | Token4 Token5 - { - /* ---------- COMPILER 2st PASS ---------- */ - some_code(); - /* -------------- END PASS 2 ------------- */ - /* ---------- COMPILER 2st PASS ---------- */ some_code(); /* -------------- END PASS 2 ------------- */ - } - | Token5 Token6 - { - /* ---------- COMPILER 2st PASS ---------- */ - - some_code(); - /* -------------- END PASS 2 ------------- */ - // comment - /* ---------- COMPILER 2st PASS ---------- */ - - some_code(); - /* -------------- END PASS 2 ------------- */ - } - ; - + : Token1 Token2 + { + + + + + + + + } + | Token2 Token3 { + + } + | Token3 Token4 { } + | Token4 Token5 + { + /* ---------- COMPILER 2st PASS ---------- */ + some_code(); + /* -------------- END PASS 2 ------------- */ + /* ---------- COMPILER 2st PASS ---------- */ some_code(); /* -------------- END PASS 2 ------------- */ + } + | Token5 Token6 + { + /* ---------- COMPILER 2st PASS ---------- */ + + some_code(); + /* -------------- END PASS 2 ------------- */ + // comment + /* ---------- COMPILER 2st PASS ---------- */ + + some_code(); + /* -------------- END PASS 2 ------------- */ + } + ; + test_for_multiple_passes - : Token1 Token2 - { - + : Token1 Token2 + { + - - /* ---------- COMPILER 2st PASS ---------- */ - - pass_2_code(); - /* -------------- END PASS 2 ------------- */ - - + + /* ---------- COMPILER 2st PASS ---------- */ + + pass_2_code(); + /* -------------- END PASS 2 ------------- */ + + - } - | Token2 Token3 - { - common_code(); - { - common_code(); - + } + | Token2 Token3 + { + common_code(); + { + common_code(); + - /* ---------- COMPILER 2st PASS ---------- */ - - pass_2_code(); - /* -------------- END PASS 2 ------------- */ - } - } - ; + /* ---------- COMPILER 2st PASS ---------- */ + + pass_2_code(); + /* -------------- END PASS 2 ------------- */ + } + } + ; %% diff --git a/scripts/python/tests/split-bison/split-test.yx b/scripts/python/tests/split-bison/split-test.yx index b47c14a35..36fcc239f 100644 --- a/scripts/python/tests/split-bison/split-test.yx +++ b/scripts/python/tests/split-bison/split-test.yx @@ -1,12 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2013 - \file split-test.yx - \author Александровский Кирилл (k.alexandrovsky@gmail.com) - \date 03.10.2013 - \brief Тест для проверки правильности генерации файлов .y для двухпроходной компиляции - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -39,106 +30,106 @@ OPEN_RDO_PARSER_NAMESPACE %% test_empty - : /* empty */ - | test_brackets - | test_for_one_pass_only - | test_for_multiple_passes - { - // some useful comment - some_code(); - } - ; + : /* empty */ + | test_brackets + | test_for_one_pass_only + | test_for_multiple_passes + { + // some useful comment + some_code(); + } + ; test_brackets - : Token1 Token2 - { - some_code(); - } - | Token2 Token3 { - some_code(); - } - | Token3 Token4 { some_code(); } - | Token4 Token5 - { - - } - | Token5 Token6 { - - } - | Token6 Token7 {} - ; + : Token1 Token2 + { + some_code(); + } + | Token2 Token3 { + some_code(); + } + | Token3 Token4 { some_code(); } + | Token4 Token5 + { + + } + | Token5 Token6 { + + } + | Token6 Token7 {} + ; test_for_one_pass_only - : Token1 Token2 - { - #PASS1 - { - some_code(); - { - some_code(); - } - } - } - | Token2 Token3 { - #PASS1 { for(int i=0; i<10; ++i){ some_code(); } } - } - | Token3 Token4 { #PASS1{ some_code(); } } - | Token4 Token5 - { - #PASS2 { - some_code(); - } - #PASS2 { some_code(); } - } - | Token5 Token6 - { - #PASS2 - { - some_code(); - } - // comment - #PASS2 - { - some_code(); - } - } - ; - + : Token1 Token2 + { + #PASS1 + { + some_code(); + { + some_code(); + } + } + } + | Token2 Token3 { + #PASS1 { for(int i=0; i<10; ++i){ some_code(); } } + } + | Token3 Token4 { #PASS1{ some_code(); } } + | Token4 Token5 + { + #PASS2 { + some_code(); + } + #PASS2 { some_code(); } + } + | Token5 Token6 + { + #PASS2 + { + some_code(); + } + // comment + #PASS2 + { + some_code(); + } + } + ; + test_for_multiple_passes - : Token1 Token2 - { - #PASS1 - { - pass_1_code(); - } - - #PASS2 - { - pass_2_code(); - } - - #PASS1 - { - another_pass_1_code(); - } + : Token1 Token2 + { + #PASS1 + { + pass_1_code(); + } + + #PASS2 + { + pass_2_code(); + } + + #PASS1 + { + another_pass_1_code(); + } - } - | Token2 Token3 - { - common_code(); - { - common_code(); - #PASS1 - { - pass_1_code(); - } - #PASS2 - { - pass_2_code(); - } - } - } - ; + } + | Token2 Token3 + { + common_code(); + { + common_code(); + #PASS1 + { + pass_1_code(); + } + #PASS2 + { + pass_2_code(); + } + } + } + ; %% diff --git a/simulator/compiler/CMakeLists.txt b/simulator/compiler/CMakeLists.txt index 3a12f52c3..18cdf2aab 100644 --- a/simulator/compiler/CMakeLists.txt +++ b/simulator/compiler/CMakeLists.txt @@ -4,4 +4,3 @@ ADD_SUBDIRECTORY(parser) ADD_SUBDIRECTORY(mbuilder) -ADD_SUBDIRECTORY(procgui) diff --git a/simulator/compiler/mbuilder/CMakeLists.txt b/simulator/compiler/mbuilder/CMakeLists.txt index e75ba60d0..c03bebdc9 100644 --- a/simulator/compiler/mbuilder/CMakeLists.txt +++ b/simulator/compiler/mbuilder/CMakeLists.txt @@ -11,7 +11,7 @@ INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) -FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) +FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp *.h) ADD_LIBRARY(rdo_mbuilder STATIC ${SOURCE_FILES}) INCLUDE(${PROJECT_SOURCE_DIR}/simulator/compiler/compiler.cmake) @@ -26,10 +26,10 @@ TARGET_LINK_LIBRARIES(rdo_mbuilder rdo_parser) INSTALL(TARGETS rdo_mbuilder DESTINATION lib) IF(MSVC_IDE) - SET(PCH_FILES - pch.h - pch.cpp - ) - INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) - ADD_PCH("${SOURCE_FILES}" "${PCH_FILES}" simulator/compiler/mbuilder ./ pch) + SET(PCH_FILES + pch.h + pch.cpp + ) + INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) + ADD_PCH("${SOURCE_FILES}" "${PCH_FILES}" simulator/compiler/mbuilder ./ pch) ENDIF() diff --git a/simulator/compiler/mbuilder/namespace.h b/simulator/compiler/mbuilder/namespace.h index 22e09c94c..5767649f3 100644 --- a/simulator/compiler/mbuilder/namespace.h +++ b/simulator/compiler/mbuilder/namespace.h @@ -1,13 +1,8 @@ -#ifndef _SIMULATOR_COMPILER_MBUILDER_NAMESPACE_H_ -#define _SIMULATOR_COMPILER_MBUILDER_NAMESPACE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS // -------------------------------------------------------------------------------- -//! \namespace rdo::compiler::mbuilder -//! \brief Пространство имен rdo::compiler::mbuilder #define OPEN_COMPILER_MBUILDER_NAMESPACE namespace rdo { namespace compiler { namespace mbuilder { #define CLOSE_COMPILER_MBUILDER_NAMESPACE }}}; - -#endif // _SIMULATOR_COMPILER_MBUILDER_NAMESPACE_H_ diff --git a/simulator/compiler/mbuilder/pch.h b/simulator/compiler/mbuilder/pch.h index ad567dac7..369bde318 100644 --- a/simulator/compiler/mbuilder/pch.h +++ b/simulator/compiler/mbuilder/pch.h @@ -3,11 +3,11 @@ // -------------------------------------------------------------------------------- #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable : 4786) + #pragma warning(disable : 4786) - #ifndef WINVER // Allow use of features specific to Windows XP or later. - #define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. - #endif + #ifndef WINVER // Allow use of features specific to Windows XP or later. + #define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. + #endif #endif // COMPILER_VISUAL_STUDIO #include diff --git a/simulator/compiler/mbuilder/process.cpp b/simulator/compiler/mbuilder/process.cpp index d52b4e58f..72b1d8649 100644 --- a/simulator/compiler/mbuilder/process.cpp +++ b/simulator/compiler/mbuilder/process.cpp @@ -13,62 +13,62 @@ OPEN_COMPILER_MBUILDER_NAMESPACE // -------------------------------------------------------------------------------- void BlockForQueue::createRes(RDOResType rtp, const std::string& res_name) { - // Получили список всех ресурсов - RDOResourceList rssList(parser::RDOParser::s_parser()); - // Создадим ресурс - RDOResource rss(rtp, res_name); - // Добавим его в систему - rssList.append(rss); + // Получили список всех ресурсов + RDOResourceList rssList(parser::RDOParser::s_parser()); + // Создадим ресурс + RDOResource rss(rtp, res_name); + // Добавим его в систему + rssList.append(rss); } bool BlockForQueue::checkType(RDOResType rtp, const parser::RDOParserSrcInfo& /*info*/) { - // "длина_очереди" - const std::string rtp_param_name = rdo::runtime::RDOPROCQueue::getQueueParamName(); - // Тип найден, проверим его на наличие параметра "длина_очереди" - if (!rtp.m_params[rtp_param_name].exist()) - parser::RDOParser::s_parser()->error().error(rtp.src_info(), rdo::format("У типа ресурса '%s' нет параметра integer '%s'", rtp.name().c_str(), rtp_param_name.c_str())); + // "длина_очереди" + const std::string rtp_param_name = rdo::runtime::RDOPROCQueue::getQueueParamName(); + // Тип найден, проверим его на наличие параметра "длина_очереди" + if (!rtp.m_params[rtp_param_name].exist()) + parser::RDOParser::s_parser()->error().error(rtp.src_info(), rdo::format("У типа ресурса '%s' нет параметра integer '%s'", rtp.name().c_str(), rtp_param_name.c_str())); - const RDOResType::Param& param = rtp.m_params[rtp_param_name]; - if (param.typeID() != rdo::runtime::RDOType::t_int) - parser::RDOParser::s_parser()->error().error(param.src_info(), rdo::format("У типа ресурса '%s' параметр '%s' не является параметром int", rtp.name().c_str(), rtp_param_name.c_str())); + const RDOResType::Param& param = rtp.m_params[rtp_param_name]; + if (param.typeID() != rdo::runtime::RDOType::Type::INT) + parser::RDOParser::s_parser()->error().error(param.src_info(), rdo::format("У типа ресурса '%s' параметр '%s' не является параметром int", rtp.name().c_str(), rtp_param_name.c_str())); - parser::LPRDORTPResType pResType = parser::RDOParser::s_parser()->findRTPResType(rtp.name()); - ASSERT(pResType); - pResType->setSubtype(parser::RDORTPResType::RT_PROCESS_RESOURCE); + parser::LPRDORTPResType pResType = parser::RDOParser::s_parser()->findRTPResType(rtp.name()); + ASSERT(pResType); + pResType->setSubtype(parser::RDORTPResType::Subtype::PROCESS_RESOURCE); - return true; + return true; } RDOResType BlockForQueue::createType(const std::string& rtp_name, const parser::RDOParserSrcInfo& info) { - // "длина_очереди" - const std::string rtp_param_name = rdo::runtime::RDOPROCQueue::getQueueParamName(); - // значение длины очереди по умолчанию - parser::LPRDOValue pDefaultValue = rdo::Factory::create( - rdo::explicit_value(rdo::runtime::RDOPROCQueue::getDefaultValue()), - info - ); - ASSERT(pDefaultValue); - // Получили список всех типов ресурсов - RDOResTypeList rtpList(parser::RDOParser::s_parser()); - // Создадим тип ресурса - RDOResType rtp(rtp_name); - // Создадим параметр типа integer - RDOResType::Param param(rtp_param_name, rdo::Factory::create(), pDefaultValue); - rtp.m_params.append(param); - // Добавим тип ресурса - if (!rtpList.append(rtp)) - { - parser::RDOParser::s_parser()->error().error(info, rdo::format("Ошибка создания типа ресурса: %s", rtp_name.c_str())); - } - else - { - parser::LPRDORTPResType pResType = parser::RDOParser::s_parser()->findRTPResType(rtp_name); - ASSERT(pResType); - pResType->setSubtype(parser::RDORTPResType::RT_PROCESS_RESOURCE); - } - return rtp; + // "длина_очереди" + const std::string rtp_param_name = rdo::runtime::RDOPROCQueue::getQueueParamName(); + // значение длины очереди по умолчанию + parser::LPRDOValue pDefaultValue = rdo::Factory::create( + rdo::explicit_value(rdo::runtime::RDOPROCQueue::getDefaultValue()), + info + ); + ASSERT(pDefaultValue); + // Получили список всех типов ресурсов + RDOResTypeList rtpList(parser::RDOParser::s_parser()); + // Создадим тип ресурса + RDOResType rtp(rtp_name); + // Создадим параметр типа integer + RDOResType::Param param(rtp_param_name, rdo::Factory::create(), pDefaultValue); + rtp.m_params.append(param); + // Добавим тип ресурса + if (!rtpList.append(rtp)) + { + parser::RDOParser::s_parser()->error().error(info, rdo::format("Ошибка создания типа ресурса: %s", rtp_name.c_str())); + } + else + { + parser::LPRDORTPResType pResType = parser::RDOParser::s_parser()->findRTPResType(rtp_name); + ASSERT(pResType); + pResType->setSubtype(parser::RDORTPResType::Subtype::PROCESS_RESOURCE); + } + return rtp; } // -------------------------------------------------------------------------------- @@ -76,91 +76,91 @@ RDOResType BlockForQueue::createType(const std::string& rtp_name, const parser:: // -------------------------------------------------------------------------------- bool BlockForSeize::checkType(RDOResType rtp, const parser::RDOParserSrcInfo& info) { - // "Состояние" - const std::string rtp_param_name = rdo::runtime::RDOPROCBlockForSeize::getStateParamName(); - // "Свободен" - const std::string rtp_state_free = rdo::runtime::RDOPROCBlockForSeize::getStateEnumFree(); - // "Занят" - const std::string rtp_state_buzy = rdo::runtime::RDOPROCBlockForSeize::getStateEnumBuzy(); - // Тип найден, проверим его на наличие перечислимого параметра - if (!rtp.m_params[rtp_param_name].exist()) - parser::RDOParser::s_parser()->error().error(info, rdo::format("У типа ресурса '%s' нет параметра перечислимого типа '%s'", rtp.name().c_str(), rtp_param_name.c_str())); - - const RDOResType::Param& param = rtp.m_params[rtp_param_name]; - // Параметр Состояние есть, надо проверить, чтобы в нем были значения Свободен и Занят - // Для начала проверим тип параметра - if (param.typeID() != rdo::runtime::RDOType::t_enum) - parser::RDOParser::s_parser()->error().error(param.src_info(), rdo::format("У типа ресурса '%s' параметр '%s' не является параметром перечислимого типа", rtp.name().c_str(), rtp_param_name.c_str())); - - // Теперь проверим сами значения - if (!param.getEnum()->exist(rtp_state_free) || !param.getEnum()->exist(rtp_state_buzy)) - parser::RDOParser::s_parser()->error().error(param.src_info(), rdo::format("У типа ресурса '%s' перечислимый параметр '%s' должен иметь как минимум два обязательных значения: %s и %s", rtp.name().c_str(), param.name().c_str(), rtp_state_free.c_str(), rtp_state_buzy.c_str())); - - parser::LPRDORTPResType pResType = parser::RDOParser::s_parser()->findRTPResType(rtp.name()); - ASSERT(pResType); - pResType->setSubtype(parser::RDORTPResType::RT_PROCESS_RESOURCE); - - return true; + // "Состояние" + const std::string rtp_param_name = rdo::runtime::RDOPROCBlockForSeize::getStateParamName(); + // "Свободен" + const std::string rtp_state_free = rdo::runtime::RDOPROCBlockForSeize::getStateEnumFree(); + // "Занят" + const std::string rtp_state_buzy = rdo::runtime::RDOPROCBlockForSeize::getStateEnumBuzy(); + // Тип найден, проверим его на наличие перечислимого параметра + if (!rtp.m_params[rtp_param_name].exist()) + parser::RDOParser::s_parser()->error().error(info, rdo::format("У типа ресурса '%s' нет параметра перечислимого типа '%s'", rtp.name().c_str(), rtp_param_name.c_str())); + + const RDOResType::Param& param = rtp.m_params[rtp_param_name]; + // Параметр Состояние есть, надо проверить, чтобы в нем были значения Свободен и Занят + // Для начала проверим тип параметра + if (param.typeID() != rdo::runtime::RDOType::Type::ENUM) + parser::RDOParser::s_parser()->error().error(param.src_info(), rdo::format("У типа ресурса '%s' параметр '%s' не является параметром перечислимого типа", rtp.name().c_str(), rtp_param_name.c_str())); + + // Теперь проверим сами значения + if (!param.getEnum()->exist(rtp_state_free) || !param.getEnum()->exist(rtp_state_buzy)) + parser::RDOParser::s_parser()->error().error(param.src_info(), rdo::format("У типа ресурса '%s' перечислимый параметр '%s' должен иметь как минимум два обязательных значения: %s и %s", rtp.name().c_str(), param.name().c_str(), rtp_state_free.c_str(), rtp_state_buzy.c_str())); + + parser::LPRDORTPResType pResType = parser::RDOParser::s_parser()->findRTPResType(rtp.name()); + ASSERT(pResType); + pResType->setSubtype(parser::RDORTPResType::Subtype::PROCESS_RESOURCE); + + return true; } void BlockForSeize::createRes(RDOResType rtp, const std::string& res_name) { - // Получили список всех ресурсов - RDOResourceList rssList(parser::RDOParser::s_parser()); - // Создадим ресурс - RDOResource rss(rtp, res_name); - // Добавим его в систему - rssList.append(rss); + // Получили список всех ресурсов + RDOResourceList rssList(parser::RDOParser::s_parser()); + // Создадим ресурс + RDOResource rss(rtp, res_name); + // Добавим его в систему + rssList.append(rss); } void BlockForSeize::reobjectRes(RDOResType rtp, const std::string& res_name) { - // Получили список всех ресурсов - RDOResourceList rssList(parser::RDOParser::s_parser()); - // Создадим ресурс - RDOResource rssNew(rtp, res_name); - // Добавим его в систему - rssList.replace(rssNew); + // Получили список всех ресурсов + RDOResourceList rssList(parser::RDOParser::s_parser()); + // Создадим ресурс + RDOResource rssNew(rtp, res_name); + // Добавим его в систему + rssList.replace(rssNew); } RDOResType BlockForSeize::createType(const std::string& rtp_name, const parser::RDOParserSrcInfo& info) { - // "Состояние" - const std::string rtp_param_name = rdo::runtime::RDOPROCBlockForSeize::getStateParamName(); - // "Свободен" - const std::string rtp_state_free = rdo::runtime::RDOPROCBlockForSeize::getStateEnumFree(); - parser::LPRDOValue pDefaultValue = rdo::Factory::create( - rdo::explicit_value(rtp_state_free), - info - ); - ASSERT(pDefaultValue); - pDefaultValue->setSrcText(rtp_state_free); - // "Занят" - const std::string rtp_state_buzy = rdo::runtime::RDOPROCBlockForSeize::getStateEnumBuzy(); - - // Получили список всех типов ресурсов - RDOResTypeList rtpList(parser::RDOParser::s_parser()); - // Создадим тип ресурса - RDOResType rtp(rtp_name); - // Создадим параметр перечислимого типа - "Состояние" - RDOResType::Param param( - rtp_param_name, - rdo::runtime::RDOEnumType::Enums(rtp_state_free)(rtp_state_buzy), - pDefaultValue - ); - rtp.m_params.append(param); - // Добавим тип ресурса - if (!rtpList.append(rtp)) - { - parser::RDOParser::s_parser()->error().error(info, rdo::format("Ошибка создания типа ресурса: %s", rtp_name.c_str())); - } - else - { - parser::LPRDORTPResType pResType = parser::RDOParser::s_parser()->findRTPResType(rtp_name); - ASSERT(pResType); - pResType->setSubtype(parser::RDORTPResType::RT_PROCESS_RESOURCE); - } - return rtp; + // "Состояние" + const std::string rtp_param_name = rdo::runtime::RDOPROCBlockForSeize::getStateParamName(); + // "Свободен" + const std::string rtp_state_free = rdo::runtime::RDOPROCBlockForSeize::getStateEnumFree(); + parser::LPRDOValue pDefaultValue = rdo::Factory::create( + rdo::explicit_value(rtp_state_free), + info + ); + ASSERT(pDefaultValue); + pDefaultValue->setSrcText(rtp_state_free); + // "Занят" + const std::string rtp_state_buzy = rdo::runtime::RDOPROCBlockForSeize::getStateEnumBuzy(); + + // Получили список всех типов ресурсов + RDOResTypeList rtpList(parser::RDOParser::s_parser()); + // Создадим тип ресурса + RDOResType rtp(rtp_name); + // Создадим параметр перечислимого типа - "Состояние" + RDOResType::Param param( + rtp_param_name, + rdo::runtime::RDOEnumType::Enums({rtp_state_free, rtp_state_buzy}), + pDefaultValue + ); + rtp.m_params.append(param); + // Добавим тип ресурса + if (!rtpList.append(rtp)) + { + parser::RDOParser::s_parser()->error().error(info, rdo::format("Ошибка создания типа ресурса: %s", rtp_name.c_str())); + } + else + { + parser::LPRDORTPResType pResType = parser::RDOParser::s_parser()->findRTPResType(rtp_name); + ASSERT(pResType); + pResType->setSubtype(parser::RDORTPResType::Subtype::PROCESS_RESOURCE); + } + return rtp; } CLOSE_COMPILER_MBUILDER_NAMESPACE diff --git a/simulator/compiler/mbuilder/process.h b/simulator/compiler/mbuilder/process.h index f2cb83e0a..668c4a67c 100644 --- a/simulator/compiler/mbuilder/process.h +++ b/simulator/compiler/mbuilder/process.h @@ -1,5 +1,4 @@ -#ifndef _MBUILDER_PROCESS_H_ -#define _MBUILDER_PROCESS_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -15,9 +14,9 @@ OPEN_COMPILER_MBUILDER_NAMESPACE class BlockForQueue { public: - static bool checkType(RDOResType rtp, const parser::RDOParserSrcInfo& info); - static void createRes(RDOResType rtp, const std::string& res_name); - static RDOResType createType(const std::string& rtp_name, const parser::RDOParserSrcInfo& info); + static bool checkType(RDOResType rtp, const parser::RDOParserSrcInfo& info); + static void createRes(RDOResType rtp, const std::string& res_name); + static RDOResType createType(const std::string& rtp_name, const parser::RDOParserSrcInfo& info); }; // -------------------------------------------------------------------------------- @@ -26,12 +25,10 @@ class BlockForQueue class BlockForSeize { public: - static bool checkType(RDOResType rtp, const parser::RDOParserSrcInfo& info); - static void createRes(RDOResType rtp, const std::string& res_name); - static void reobjectRes(RDOResType rtp, const std::string& res_name); - static RDOResType createType (const std::string& rtp_name, const parser::RDOParserSrcInfo& info); + static bool checkType(RDOResType rtp, const parser::RDOParserSrcInfo& info); + static void createRes(RDOResType rtp, const std::string& res_name); + static void reobjectRes(RDOResType rtp, const std::string& res_name); + static RDOResType createType (const std::string& rtp_name, const parser::RDOParserSrcInfo& info); }; CLOSE_COMPILER_MBUILDER_NAMESPACE - -#endif // _MBUILDER_PROCESS_H_ diff --git a/simulator/compiler/mbuilder/rdo_resources.cpp b/simulator/compiler/mbuilder/rdo_resources.cpp index 8039d9b42..c575fb1b7 100644 --- a/simulator/compiler/mbuilder/rdo_resources.cpp +++ b/simulator/compiler/mbuilder/rdo_resources.cpp @@ -17,136 +17,136 @@ OPEN_COMPILER_MBUILDER_NAMESPACE // ---- Собирает все параметры существующего в памяти типа ресурса // -------------------------------------------------------------------------------- RDOResType::RDOResType(const parser::LPRDORTPResType& rtp) - : parser::RDOParserSrcInfo(rtp->src_info() ) - , m_name (rtp->name() ) - , m_exist(true ) - , m_type (rtp->isPermanent() ? rt_permanent : rt_temporary) - , m_id (rtp->getNumber() ) + : parser::RDOParserSrcInfo(rtp->src_info()) + , m_name (rtp->name()) + , m_exist(true) + , m_kind (rtp->isPermanent() ? Kind::PERMANENT : Kind::TEMPORARY) + , m_id (rtp->getNumber()) { - for (const auto& parser_param: rtp->getParams()) - { - Param param(parser_param); - param.m_id = m_params.size(); - m_params.append(param); - } + for (const auto& parser_param: rtp->getParams()) + { + Param param(parser_param); + param.m_id = m_params.size(); + m_params.append(param); + } } RDOResType::Param::Param(const parser::LPRDORTPParam& param) - : parser::RDOParserSrcInfo(param->src_info()) - , m_name (param->name() ) - , m_exist (true ) - , m_pType (param->getTypeInfo() ) - , m_pDefault(param->getDefault() ) - , m_id (-1 ) + : parser::RDOParserSrcInfo(param->src_info()) + , m_name (param->name()) + , m_exist (true) + , m_pType (param->getTypeInfo()) + , m_pDefault(param->getDefault()) + , m_id (-1) { - switch (typeID()) - { - case rdo::runtime::RDOType::t_int: - { - parser::LPRDOTypeIntRange pRange = param->getTypeInfo()->itype().object_dynamic_cast(); - if (pRange) - { - m_pMin = pRange->range()->getMin(); - m_pMax = pRange->range()->getMax(); - } - break; - } - case rdo::runtime::RDOType::t_real: - { - parser::LPRDOTypeRealRange pRange = param->getTypeInfo()->itype().object_dynamic_cast(); - if (pRange) - { - m_pMin = pRange->range()->getMin(); - m_pMax = pRange->range()->getMax(); - } - break; - } - default: - break; - } + switch (typeID()) + { + case rdo::runtime::RDOType::Type::INT: + { + parser::LPRDOTypeIntRange pRange = param->getTypeInfo()->itype().object_dynamic_cast(); + if (pRange) + { + m_pMin = pRange->range()->getMin(); + m_pMax = pRange->range()->getMax(); + } + break; + } + case rdo::runtime::RDOType::Type::REAL: + { + parser::LPRDOTypeRealRange pRange = param->getTypeInfo()->itype().object_dynamic_cast(); + if (pRange) + { + m_pMin = pRange->range()->getMin(); + m_pMax = pRange->range()->getMax(); + } + break; + } + default: + break; + } } // -------------------------------------------------------------------------------- // ---- Инициализация *нового* типа ресурса // -------------------------------------------------------------------------------- -RDOResType::RDOResType(const std::string& name, Type type) - : m_name (name ) - , m_exist(false ) - , m_type (type ) - , m_id (std::size_t(~0)) +RDOResType::RDOResType(const std::string& name, Kind kind) + : m_name (name) + , m_exist(false) + , m_kind (kind) + , m_id (std::size_t(~0)) {} bool RDOResType::ParamList::append(Param& param) { - if (std::find_if(begin(), end(), parser::compareNameRef(param.name())) != end()) - { - return false; - } + if (std::find_if(begin(), end(), parser::compareNameRef(param.name())) != end()) + { + return false; + } - m_list.push_back(param); - return true; + m_list.push_back(param); + return true; } RDOResType::Param::Param(const std::string& name, const parser::LPTypeInfo& pType, const parser::LPRDOValue& pDefault) - : m_name (name ) - , m_exist (true ) - , m_pType (pType ) - , m_pDefault(pDefault) - , m_id (-1 ) + : m_name (name) + , m_exist (true) + , m_pType (pType) + , m_pDefault(pDefault) + , m_id (-1) {} -RDOResType::Param::Param(const std::string& name, const rdo::intrusive_ptr& pType, const parser::LPRDOValue& pDefault) - : m_name (name ) - , m_exist (true ) - , m_pDefault(pDefault) - , m_id (-1 ) +RDOResType::Param::Param(const std::string& name, const rdo::intrusive_ptr& pType, const parser::LPRDOValue& pDefault) + : m_name (name) + , m_exist (true) + , m_pDefault(pDefault) + , m_id (-1) { - initType(pType); + initType(pType); } -RDOResType::Param::Param(const std::string& name, const rdo::intrusive_ptr& pType, const parser::LPRDOValue& pDefault) - : m_name (name ) - , m_exist (true ) - , m_pDefault(pDefault) - , m_id (-1 ) +RDOResType::Param::Param(const std::string& name, const rdo::intrusive_ptr& pType, const parser::LPRDOValue& pDefault) + : m_name (name) + , m_exist (true) + , m_pDefault(pDefault) + , m_id (-1) { - initType(pType); + initType(pType); } RDOResType::Param::Param(const std::string& name, const rdo::runtime::RDOEnumType::Enums& enums, const parser::LPRDOValue& pDefault) - : m_name (name ) - , m_exist (true ) - , m_pDefault(pDefault) - , m_id (-1 ) + : m_name (name) + , m_exist (true) + , m_pDefault(pDefault) + , m_id (-1) { - initType(enums); + initType(enums); } void RDOResType::Param::setRange(const parser::LPRDOValue& pMin, const parser::LPRDOValue& pMax) { - ASSERT(pMin); - ASSERT(pMax); + ASSERT(pMin); + ASSERT(pMax); - m_pMin = pMin; - m_pMax = pMax; + m_pMin = pMin; + m_pMax = pMax; } void RDOResType::Param::setDefault(const parser::LPRDOValue& pDefault) { - ASSERT(pDefault); + ASSERT(pDefault); - m_pDefault = pDefault; + m_pDefault = pDefault; } bool RDOResType::Param::operator== (const Param& /*param*/) const { - NEVER_REACH_HERE; - return true; + NEVER_REACH_HERE; + return true; } std::string RDOResType::Param::typeStr() const { - return m_pType->itype().object_dynamic_cast()->name(); + return m_pType->itype().object_dynamic_cast()->name(); } // -------------------------------------------------------------------------------- @@ -155,13 +155,13 @@ std::string RDOResType::Param::typeStr() const // ---- Собирает все типы ресурсов, которые есть у парсера // -------------------------------------------------------------------------------- RDOResTypeList::RDOResTypeList(const parser::LPRDOParser& pParser) - : RDOList(pParser) + : RDOList(pParser) { - for (const auto& parser_rtp: m_pParser->getRTPResTypes()) - { - const RDOResType rtp(parser_rtp); - m_list.push_back(rtp); - } + for (const auto& parser_rtp: m_pParser->getRTPResTypes()) + { + const RDOResType rtp(parser_rtp); + m_list.push_back(rtp); + } } // -------------------------------------------------------------------------------- @@ -169,74 +169,74 @@ RDOResTypeList::RDOResTypeList(const parser::LPRDOParser& pParser) // -------------------------------------------------------------------------------- parser::LPRDORTPResType RDOResTypeList::appendBefore(RDOResType& rtp) { - if (std::find_if(begin(), end(), parser::compareNameRef(rtp.name())) != end()) - { - return parser::LPRDORTPResType(NULL); - } - - parser::LPRDORTPResType pResourceType = rdo::Factory::create(m_pParser, parser::RDOParserSrcInfo(rtp.name()), rtp.isPermanent()); - ASSERT(pResourceType); - return pResourceType; + if (std::find_if(begin(), end(), parser::compareNameRef(rtp.name())) != end()) + { + return parser::LPRDORTPResType(NULL); + } + + parser::LPRDORTPResType pResourceType = rdo::Factory::create(m_pParser, parser::RDOParserSrcInfo(rtp.name()), rtp.isPermanent()); + ASSERT(pResourceType); + return pResourceType; } bool RDOResTypeList::appendAfter(RDOResType& rtp, const parser::LPRDORTPResType& pResourceType) { - ASSERT(pResourceType); - - for (const auto& param: rtp.m_params) - { - parser::LPTypeInfo pParamType; - parser::LPRDOValue pDefault = param.hasDefault() ? param.getDefault() : rdo::Factory::create(); - ASSERT(pDefault); - switch (param.typeID()) - { - case rdo::runtime::RDOType::t_int: - { - if (param.hasRange()) - { - parser::LPRDOTypeRangeRange pRange = rdo::Factory::create(param.getMin(), param.getMax(), parser::RDOParserSrcInfo()); - parser::LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); - pParamType = rdo::Factory::create(pIntRange, parser::RDOParserSrcInfo()); - } - else - { - pParamType = param.type(); - } - break; - } - case rdo::runtime::RDOType::t_real: - { - if (param.hasRange()) - { - parser::LPRDOTypeRangeRange pRange = rdo::Factory::create(param.getMin(), param.getMax(), parser::RDOParserSrcInfo()); - parser::LPRDOTypeRealRange pRealRange = rdo::Factory::create(pRange); - pParamType = rdo::Factory::create(pRealRange, parser::RDOParserSrcInfo()); - } - else - { - pParamType = param.type(); - } - break; - } - case rdo::runtime::RDOType::t_enum: - { - pParamType = param.type(); - break; - } - default: - { - m_pParser->removeRTPResType(pResourceType); - return false; - } - } - parser::LPRDORTPParam pParam = rdo::Factory::create(pParamType, pDefault, parser::RDOParserSrcInfo(param.name())); - ASSERT(pParam); - pResourceType->addParam(pParam); - } - rtp.m_exist = true; - rtp.m_id = pResourceType->getNumber(); - m_list.push_back(rtp); - return true; + ASSERT(pResourceType); + + for (const auto& param: rtp.m_params) + { + parser::LPTypeInfo pParamType; + parser::LPRDOValue pDefault = param.hasDefault() ? param.getDefault() : rdo::Factory::create(); + ASSERT(pDefault); + switch (param.typeID()) + { + case rdo::runtime::RDOType::Type::INT: + { + if (param.hasRange()) + { + parser::LPRDOTypeRangeRange pRange = rdo::Factory::create(param.getMin(), param.getMax(), parser::RDOParserSrcInfo()); + parser::LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); + pParamType = rdo::Factory::create(pIntRange, parser::RDOParserSrcInfo()); + } + else + { + pParamType = param.type(); + } + break; + } + case rdo::runtime::RDOType::Type::REAL: + { + if (param.hasRange()) + { + parser::LPRDOTypeRangeRange pRange = rdo::Factory::create(param.getMin(), param.getMax(), parser::RDOParserSrcInfo()); + parser::LPRDOTypeRealRange pRealRange = rdo::Factory::create(pRange); + pParamType = rdo::Factory::create(pRealRange, parser::RDOParserSrcInfo()); + } + else + { + pParamType = param.type(); + } + break; + } + case rdo::runtime::RDOType::Type::ENUM: + { + pParamType = param.type(); + break; + } + default: + { + m_pParser->removeRTPResType(pResourceType); + return false; + } + } + parser::LPRDORTPParam pParam = rdo::Factory::create(pParamType, pDefault, parser::RDOParserSrcInfo(param.name())); + ASSERT(pParam); + pResourceType->addParam(pParam); + } + rtp.m_exist = true; + rtp.m_id = pResourceType->getNumber(); + m_list.push_back(rtp); + return true; } // -------------------------------------------------------------------------------- @@ -246,95 +246,95 @@ bool RDOResTypeList::appendAfter(RDOResType& rtp, const parser::LPRDORTPResType& // ---- Собирает все параметры существующего в памяти ресурса // -------------------------------------------------------------------------------- RDOResource::RDOResource(const parser::LPRDORSSResource& rss) - : parser::RDOParserSrcInfo(rss->src_info()) - , m_name (rss->name() ) - , m_exist(true ) - , m_rtp (rss->getType() ) - , m_id (rss->getID() ) + : parser::RDOParserSrcInfo(rss->src_info()) + , m_name (rss->name()) + , m_exist(true) + , m_rtp (rss->getType()) + , m_id (rss->getID()) { - if (m_rtp.m_params.size() == rss->params().size()) - { - std::size_t index = 0; - for (const auto& param: m_rtp.m_params) - { - m_params[param.name()] = rss->params()[index].param(); - index++; - } - } + if (m_rtp.m_params.size() == rss->params().size()) + { + std::size_t index = 0; + for (const auto& param: m_rtp.m_params) + { + m_params[param.name()] = rss->params()[index].param(); + index++; + } + } } RDOResource::Params::const_iterator RDOResource::operator[](const std::string& param) const { - return m_params.find(param); + return m_params.find(param); } RDOResource::Params::mapped_type& RDOResource::operator[](const std::string& param) { - RDOResource::Params::iterator param_it = m_params.find(param); - if (param_it != m_params.end()) - { - return param_it->second; - } - else - { - static Params::mapped_type tmpValue; - return tmpValue; - } + RDOResource::Params::iterator param_it = m_params.find(param); + if (param_it != m_params.end()) + { + return param_it->second; + } + else + { + static Params::mapped_type tmpValue; + return tmpValue; + } } parser::LPRDORSSResource RDOResource::getParserResource(const parser::LPRDOParser& pParser) const { - if (!exist()) - { - return parser::LPRDORSSResource(NULL); - } + if (!exist()) + { + return parser::LPRDORSSResource(NULL); + } - return pParser->findRSSResource(name()); + return pParser->findRSSResource(name()); } bool RDOResource::fillParserResourceParams(parser::LPRDORSSResource& pToParserRSS) const { - for (const auto& param: getType().m_params) - { - RDOResource::Params::const_iterator value_it = operator[](param.name()); - if (value_it == end()) - return false; - - runtime::RDOValue value = value_it->second->calc().object_dynamic_cast()->getValue(); - parser::LPRDOValue pValue = Factory::create(value, pToParserRSS->src_info(), value_it->second->typeInfo()); - ASSERT(pValue); - pValue = param.type()->value_cast(pValue); - /// @todo а почему тут toParserRSS->src_info(), а не value_it->src_info() ? - pValue->setSrcInfo(pToParserRSS->src_info()); - pToParserRSS->addParam(pValue); - } - return true; + for (const auto& param: getType().m_params) + { + RDOResource::Params::const_iterator value_it = operator[](param.name()); + if (value_it == end()) + return false; + + runtime::RDOValue value = value_it->second->calc().object_dynamic_cast()->getValue(); + parser::LPRDOValue pValue = Factory::create(value, pToParserRSS->src_info(), value_it->second->typeInfo()); + ASSERT(pValue); + pValue = param.type()->value_cast(pValue); + // TODO а почему тут toParserRSS->src_info(), а не value_it->src_info() ? + pValue->setSrcInfo(pToParserRSS->src_info()); + pToParserRSS->addParam(pValue); + } + return true; } // -------------------------------------------------------------------------------- // ---- Инициализация *нового* ресурса // -------------------------------------------------------------------------------- RDOResource::RDOResource(const RDOResType& rtp, const std::string& name) - : m_name (name ) - , m_exist(false ) - , m_rtp (rtp ) - , m_id (parser::RDORSSResource::UNDEFINED_ID) + : m_name (name) + , m_exist(false) + , m_rtp (rtp) + , m_id (parser::RDORSSResource::UNDEFINED_ID) { - for (const auto& param: m_rtp.m_params) - { - parser::LPRDOValue pValue = rdo::Factory::create(param.type(), param.src_info()); - ASSERT(pValue); - if (param.hasDefault()) - { - pValue = param.getDefault(); - } - else if (param.hasRange()) - { - pValue = param.getMin(); - } - parser::LPExpression pValueExpression = rdo::Factory::create(pValue); - m_params[param.name()] = pValueExpression; - } + for (const auto& param: m_rtp.m_params) + { + parser::LPRDOValue pValue = rdo::Factory::create(param.type(), param.src_info()); + ASSERT(pValue); + if (param.hasDefault()) + { + pValue = param.getDefault(); + } + else if (param.hasRange()) + { + pValue = param.getMin(); + } + parser::LPExpression pValueExpression = rdo::Factory::create(pValue); + m_params[param.name()] = pValueExpression; + } } // -------------------------------------------------------------------------------- @@ -343,13 +343,13 @@ RDOResource::RDOResource(const RDOResType& rtp, const std::string& name) // ---- Собирает все ресурсы, которые есть у парсера // -------------------------------------------------------------------------------- RDOResourceList::RDOResourceList(const parser::LPRDOParser& pParser) - : RDOList(pParser) + : RDOList(pParser) { - for (const auto& parser_rss: m_pParser->getRSSResources()) - { - const RDOResource rss(parser_rss); - m_list.push_back(rss); - } + for (const auto& parser_rss: m_pParser->getRSSResources()) + { + const RDOResource rss(parser_rss); + m_list.push_back(rss); + } } CLOSE_COMPILER_MBUILDER_NAMESPACE diff --git a/simulator/compiler/mbuilder/rdo_resources.h b/simulator/compiler/mbuilder/rdo_resources.h index 1b55e6738..74c81bb51 100644 --- a/simulator/compiler/mbuilder/rdo_resources.h +++ b/simulator/compiler/mbuilder/rdo_resources.h @@ -1,5 +1,4 @@ -#ifndef _MBUILDER_RESOURCES_H_ -#define _MBUILDER_RESOURCES_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -31,61 +30,61 @@ template class RDOList { public: - typedef std::list< T > List; - typedef typename List::iterator Iterator; - typedef typename List::const_iterator CIterator; - typedef typename List::const_iterator const_iterator; - - RDOList() - : m_pParser(NULL) - {} - - RDOList(const parser::LPRDOParser& pParser) - : m_pParser(pParser) - {} - - void operator= (const RDOList& obj) - { - m_pParser = obj.m_pParser; - m_list.clear(); - for (CIterator it = obj.begin(); it != obj.end(); ++it) - m_list.push_back(*it); - } - - Iterator begin() { return m_list.begin(); } - Iterator end() { return m_list.end(); } - CIterator begin() const { return m_list.begin(); } - CIterator end() const { return m_list.end(); } - std::size_t size () const { return m_list.size(); } - CIterator found(const std::string& name) const - { - return std::find_if(begin(), end(), parser::compareNameRef(name)); - } - Iterator found(const std::string& name) - { - return std::find_if(begin(), end(), parser::compareNameRef(name)); - } - bool exist(const std::string& name) const - { - return found( name ) != end(); - } - const T& operator[] (const std::string& name) const - { - typename List::const_iterator it = found(name); - if (it != end()) - { - return *it; - } - else - { - static T __t; - return __t; - } - } + typedef std::list< T > List; + typedef typename List::iterator Iterator; + typedef typename List::const_iterator CIterator; + typedef typename List::const_iterator const_iterator; + + RDOList() + : m_pParser(NULL) + {} + + RDOList(const parser::LPRDOParser& pParser) + : m_pParser(pParser) + {} + + void operator= (const RDOList& obj) + { + m_pParser = obj.m_pParser; + m_list.clear(); + for (CIterator it = obj.begin(); it != obj.end(); ++it) + m_list.push_back(*it); + } + + Iterator begin() { return m_list.begin(); } + Iterator end() { return m_list.end(); } + CIterator begin() const { return m_list.begin(); } + CIterator end() const { return m_list.end(); } + std::size_t size () const { return m_list.size(); } + CIterator found(const std::string& name) const + { + return std::find_if(begin(), end(), parser::compareNameRef(name)); + } + Iterator found(const std::string& name) + { + return std::find_if(begin(), end(), parser::compareNameRef(name)); + } + bool exist(const std::string& name) const + { + return found( name ) != end(); + } + const T& operator[] (const std::string& name) const + { + typename List::const_iterator it = found(name); + if (it != end()) + { + return *it; + } + else + { + static T __t; + return __t; + } + } protected: - List m_list; - parser::LPRDOParser m_pParser; + List m_list; + parser::LPRDOParser m_pParser; }; // -------------------------------------------------------------------------------- @@ -96,105 +95,105 @@ class Class: public parser::RDOParserSrcInfo \ { \ friend class Class##List; \ public: \ - Class(): m_name(""), m_exist( false ) {} \ - \ - const std::string& name () const { return m_name; } \ - bool exist() const { return m_exist; } \ - \ + Class(): m_name(""), m_exist( false ) {} \ + \ + const std::string& name () const { return m_name; } \ + bool exist() const { return m_exist; } \ + \ private: \ - std::string m_name; \ - bool m_exist; + std::string m_name; \ + bool m_exist; // -------------------------------------------------------------------------------- // -------------------- RDOResType // -------------------------------------------------------------------------------- MBUILDER_OBJECT(RDOResType) public: - enum Type - { - rt_permanent, - rt_temporary - }; - // Проинициализировать по существующему типу - RDOResType(const parser::LPRDORTPResType& rtp); - // Создать новый тип - RDOResType(const std::string& name, Type type = rt_permanent); - - MBUILDER_OBJECT(Param) - friend class RDOResType; - public: - explicit Param(const parser::LPRDORTPParam& param); - explicit Param(const std::string& name, const parser::LPTypeInfo& pType, const parser::LPRDOValue& pDefault); - explicit Param(const std::string& name, const rdo::intrusive_ptr& pType, const parser::LPRDOValue& pDefault = parser::LPRDOValue(NULL)); - explicit Param(const std::string& name, const rdo::intrusive_ptr& pType, const parser::LPRDOValue& pDefault = parser::LPRDOValue(NULL)); - explicit Param(const std::string& name, const rdo::runtime::RDOEnumType::Enums& enums, const parser::LPRDOValue& pDefault = parser::LPRDOValue(NULL)); - - const parser::LPTypeInfo& type() const { return m_pType; } - const rdo::runtime::RDOType::TypeID typeID () const { return m_pType->typeID(); } - std::string typeStr() const; - - int id() const { return m_id; } - - bool hasRange() const { return (m_pMin && m_pMax) ? m_pMin->typeID() != rdo::runtime::RDOType::t_unknow && m_pMax->typeID() != rdo::runtime::RDOType::t_unknow : false; } - const parser::LPRDOValue& getMin() const { return m_pMin; } - const parser::LPRDOValue& getMax() const { return m_pMax; } - void setRange(const parser::LPRDOValue& pMin, const parser::LPRDOValue& pMax); - - bool hasDefault() const { return m_pDefault ? m_pDefault->defined() : false; } - const parser::LPRDOValue& getDefault() const { return m_pDefault; } - void setDefault(const parser::LPRDOValue& pDefault); - - parser::LPRDOEnumType getEnum() const - { - ASSERT(typeID() == rdo::runtime::RDOType::t_enum); - return type()->itype().object_static_cast(); - } - - bool operator== (const Param& param) const; - - private: - parser::LPTypeInfo m_pType; - parser::LPRDOValue m_pMin; - parser::LPRDOValue m_pMax; - parser::LPRDOValue m_pDefault; - int m_id; - - template - void initType(const T& pType) - { - m_pType = rdo::Factory::create(pType, parser::RDOParserSrcInfo()); - ASSERT(m_pType); - } + enum class Kind + { + PERMANENT, + TEMPORARY + }; + // Проинициализировать по существующему типу + RDOResType(const parser::LPRDORTPResType& rtp); + // Создать новый тип + RDOResType(const std::string& name, Kind kind = Kind::PERMANENT); + + MBUILDER_OBJECT(Param) + friend class RDOResType; + public: + explicit Param(const parser::LPRDORTPParam& param); + explicit Param(const std::string& name, const parser::LPTypeInfo& pType, const parser::LPRDOValue& pDefault); + explicit Param(const std::string& name, const rdo::intrusive_ptr& pType, const parser::LPRDOValue& pDefault = parser::LPRDOValue(NULL)); + explicit Param(const std::string& name, const rdo::intrusive_ptr& pType, const parser::LPRDOValue& pDefault = parser::LPRDOValue(NULL)); + explicit Param(const std::string& name, const rdo::runtime::RDOEnumType::Enums& enums, const parser::LPRDOValue& pDefault = parser::LPRDOValue(NULL)); + + const parser::LPTypeInfo& type() const { return m_pType; } + const rdo::runtime::RDOType::Type typeID () const { return m_pType->typeID(); } + std::string typeStr() const; + + int id() const { return m_id; } + + bool hasRange() const { return (m_pMin && m_pMax) ? m_pMin->typeID() != rdo::runtime::RDOType::Type::UNKNOW && m_pMax->typeID() != rdo::runtime::RDOType::Type::UNKNOW : false; } + const parser::LPRDOValue& getMin() const { return m_pMin; } + const parser::LPRDOValue& getMax() const { return m_pMax; } + void setRange(const parser::LPRDOValue& pMin, const parser::LPRDOValue& pMax); + + bool hasDefault() const { return m_pDefault ? m_pDefault->defined() : false; } + const parser::LPRDOValue& getDefault() const { return m_pDefault; } + void setDefault(const parser::LPRDOValue& pDefault); + + parser::LPRDOEnumType getEnum() const + { + ASSERT(typeID() == rdo::runtime::RDOType::Type::ENUM); + return type()->itype().object_static_cast(); + } + + bool operator== (const Param& param) const; + + private: + parser::LPTypeInfo m_pType; + parser::LPRDOValue m_pMin; + parser::LPRDOValue m_pMax; + parser::LPRDOValue m_pDefault; + int m_id; + + template + void initType(const T& pType) + { + m_pType = rdo::Factory::create(pType, parser::RDOParserSrcInfo()); + ASSERT(m_pType); + } #ifdef COMPILER_VISUAL_STUDIO - template <> + template <> #endif - void initType(const rdo::runtime::RDOEnumType::Enums& pType) - { - parser::LPRDOEnumType pEnum = rdo::Factory::create(); - ASSERT(pEnum) - for (const auto& type: pType) - { - pEnum->add(parser::RDOValue::getIdentificator(type)); - } - // m_default = parser::RDOValue(parser::RDOValue::getIdentificator(m_pDefault->value().getAsString()).value(), pEnum, parser::RDOParserSrcInfo(m_default)); - m_pType = rdo::Factory::create(pEnum, parser::RDOParserSrcInfo()); - ASSERT(m_pType); - } - }; - class ParamList: public RDOList - { - public: - bool append(Param& param); - }; - ParamList m_params; - - Type getType() const { return m_type; } - bool isPermanent() const { return m_type == rt_permanent; } - std::size_t id() const { return m_id; } + void initType(const rdo::runtime::RDOEnumType::Enums& pType) + { + parser::LPRDOEnumType pEnum = rdo::Factory::create(); + ASSERT(pEnum) + for (const auto& type: pType) + { + pEnum->add(parser::RDOValue::getIdentificator(type)); + } + // m_default = parser::RDOValue(parser::RDOValue::getIdentificator(m_pDefault->value().getAsString()).value(), pEnum, parser::RDOParserSrcInfo(m_default)); + m_pType = rdo::Factory::create(pEnum, parser::RDOParserSrcInfo()); + ASSERT(m_pType); + } + }; + class ParamList: public RDOList + { + public: + bool append(Param& param); + }; + ParamList m_params; + + Kind getKind() const { return m_kind; } + bool isPermanent() const { return m_kind == Kind::PERMANENT; } + std::size_t id() const { return m_id; } private: - Type m_type; - std::size_t m_id; + Kind m_kind; + std::size_t m_id; }; // -------------------------------------------------------------------------------- @@ -202,48 +201,48 @@ MBUILDER_OBJECT(RDOResType) // -------------------------------------------------------------------------------- MBUILDER_OBJECT(RDOResource) public: - // Проинициализировать по существующему ресурсу - RDOResource(const parser::LPRDORSSResource& rss); - // Создать новый ресурс - RDOResource(const RDOResType& rtp, const std::string& name); + // Проинициализировать по существующему ресурсу + RDOResource(const parser::LPRDORSSResource& rss); + // Создать новый ресурс + RDOResource(const RDOResType& rtp, const std::string& name); - const RDOResType& getType() const { return m_rtp; } - int getID() const { return m_id; } + const RDOResType& getType() const { return m_rtp; } + int getID() const { return m_id; } - typedef std::map Params; + typedef std::map Params; - Params::const_iterator begin() const { return m_params.begin(); } - Params::const_iterator end() const { return m_params.end(); } - std::size_t size() const { return m_params.size(); } + Params::const_iterator begin() const { return m_params.begin(); } + Params::const_iterator end() const { return m_params.end(); } + std::size_t size() const { return m_params.size(); } - Params::mapped_type& operator[](const std::string& param); - Params::const_iterator operator[](const std::string& param) const; + Params::mapped_type& operator[](const std::string& param); + Params::const_iterator operator[](const std::string& param) const; - parser::LPRDORSSResource getParserResource(const parser::LPRDOParser& pParser) const; + parser::LPRDORSSResource getParserResource(const parser::LPRDOParser& pParser) const; - template - bool checkParserResourceType(const parser::LPRDOParser& pParser) const - { - parser::LPRDORSSResource pResource = getParserResource(pParser); - return pResource.object_dynamic_cast(); - } + template + bool checkParserResourceType(const parser::LPRDOParser& pParser) const + { + parser::LPRDORSSResource pResource = getParserResource(pParser); + return pResource.object_dynamic_cast(); + } - template - parser::LPRDORSSResource createParserResource(const parser::LPRDOParser& pParser, std::size_t id = parser::RDORSSResource::UNDEFINED_ID) const - { - parser::LPRDORTPResType pRTP = pParser->findRTPResType(getType().name()); - if (!pRTP) - return NULL; + template + parser::LPRDORSSResource createParserResource(const parser::LPRDOParser& pParser, std::size_t id = parser::RDORSSResource::UNDEFINED_ID) const + { + parser::LPRDORTPResType pRTP = pParser->findRTPResType(getType().name()); + if (!pRTP) + return NULL; - return rdo::Factory::create(pParser, RDOParserSrcInfo(name()), pRTP, id == parser::RDORSSResource::UNDEFINED_ID ? getID() : id); - } + return rdo::Factory::create(pParser, RDOParserSrcInfo(name()), pRTP, id == parser::RDORSSResource::UNDEFINED_ID ? getID() : id); + } - bool fillParserResourceParams(parser::LPRDORSSResource& pToParserRSS) const; + bool fillParserResourceParams(parser::LPRDORSSResource& pToParserRSS) const; private: - RDOResType m_rtp; - Params m_params; - std::size_t m_id; + RDOResType m_rtp; + Params m_params; + std::size_t m_id; }; // -------------------------------------------------------------------------------- @@ -252,22 +251,22 @@ MBUILDER_OBJECT(RDOResource) class RDOResTypeList: public RDOList { public: - RDOResTypeList(const parser::LPRDOParser& pParser); + RDOResTypeList(const parser::LPRDOParser& pParser); - bool append(RDOResType& rtp) - { - parser::LPRDORTPResType pResourceType = appendBefore(rtp); - if (!pResourceType) - { - return false; - } + bool append(RDOResType& rtp) + { + parser::LPRDORTPResType pResourceType = appendBefore(rtp); + if (!pResourceType) + { + return false; + } - return appendAfter(rtp, pResourceType); - } + return appendAfter(rtp, pResourceType); + } private: - parser::LPRDORTPResType appendBefore(RDOResType& rtp); - bool appendAfter(RDOResType& rtp, const parser::LPRDORTPResType& pResourceType); + parser::LPRDORTPResType appendBefore(RDOResType& rtp); + bool appendAfter(RDOResType& rtp, const parser::LPRDORTPResType& pResourceType); }; // -------------------------------------------------------------------------------- @@ -276,60 +275,57 @@ class RDOResTypeList: public RDOList class RDOResourceList: public RDOList { public: - RDOResourceList(const parser::LPRDOParser& pParser); - - // -------------------------------------------------------------------------------- - // ---- Добавление *нового* ресурса - // -------------------------------------------------------------------------------- - template bool append(RDOResource& mbuilderRSS) - { - if (exist(mbuilderRSS.name())) - return false; - - parser::LPRDORSSResource parserRSS(mbuilderRSS.createParserResource(m_pParser)); - if (!parserRSS) - return false; - if (!mbuilderRSS.fillParserResourceParams(parserRSS)) - return false; - parser::RDOParser::s_parser()->insertRSSResource(parser::LPRDORSSResource(parserRSS)); - parserRSS->setTrace(true); - parserRSS->end(); - - mbuilderRSS.m_exist = true; - m_list.push_back(mbuilderRSS); - - return true; - } - // -------------------------------------------------------------------------------- - // ---- Замена существующего ресурса новым - // -------------------------------------------------------------------------------- - template bool replace(RDOResource& mbuilderRSSNew) - { - Iterator mbuilderRSSPrevIt = found(mbuilderRSSNew.name()); - if (mbuilderRSSPrevIt == end()) - return false; - - parser::LPRDORSSResource parserRSSPrev = mbuilderRSSPrevIt->getParserResource(m_pParser); - ASSERT(parserRSSPrev); - - parser::LPRDORSSResource parserRSSNew(mbuilderRSSNew.createParserResource(m_pParser, mbuilderRSSPrevIt->getID())); - if (!parserRSSNew) - return false; - if (!mbuilderRSSPrevIt->fillParserResourceParams(parserRSSNew)) - return false; - parser::RDOParser::s_parser()->insertRSSResource(parser::LPRDORSSResource(parserRSSNew)); - parserRSSNew->setTrace(parserRSSPrev->getTrace()); - mbuilderRSSNew.m_exist = true; - m_list.push_back(mbuilderRSSNew); - - //! Удалим старый - m_pParser->removeRSSResource(parserRSSPrev); - m_list.erase(mbuilderRSSPrevIt); - - return true; - } + RDOResourceList(const parser::LPRDOParser& pParser); + + // -------------------------------------------------------------------------------- + // ---- Добавление *нового* ресурса + // -------------------------------------------------------------------------------- + template bool append(RDOResource& mbuilderRSS) + { + if (exist(mbuilderRSS.name())) + return false; + + parser::LPRDORSSResource parserRSS(mbuilderRSS.createParserResource(m_pParser)); + if (!parserRSS) + return false; + if (!mbuilderRSS.fillParserResourceParams(parserRSS)) + return false; + parser::RDOParser::s_parser()->insertRSSResource(parser::LPRDORSSResource(parserRSS)); + parserRSS->setTrace(true); + parserRSS->end(); + + mbuilderRSS.m_exist = true; + m_list.push_back(mbuilderRSS); + + return true; + } + // -------------------------------------------------------------------------------- + // ---- Замена существующего ресурса новым + // -------------------------------------------------------------------------------- + template bool replace(RDOResource& mbuilderRSSNew) + { + Iterator mbuilderRSSPrevIt = found(mbuilderRSSNew.name()); + if (mbuilderRSSPrevIt == end()) + return false; + + parser::LPRDORSSResource parserRSSPrev = mbuilderRSSPrevIt->getParserResource(m_pParser); + ASSERT(parserRSSPrev); + + parser::LPRDORSSResource parserRSSNew(mbuilderRSSNew.createParserResource(m_pParser, mbuilderRSSPrevIt->getID())); + if (!parserRSSNew) + return false; + if (!mbuilderRSSPrevIt->fillParserResourceParams(parserRSSNew)) + return false; + parser::RDOParser::s_parser()->insertRSSResource(parser::LPRDORSSResource(parserRSSNew)); + parserRSSNew->setTrace(parserRSSPrev->getTrace()); + mbuilderRSSNew.m_exist = true; + m_list.push_back(mbuilderRSSNew); + + m_pParser->removeRSSResource(parserRSSPrev); + m_list.erase(mbuilderRSSPrevIt); + + return true; + } }; CLOSE_COMPILER_MBUILDER_NAMESPACE - -#endif // _MBUILDER_RESOURCES_H_ diff --git a/simulator/compiler/parser/CMakeLists.txt b/simulator/compiler/parser/CMakeLists.txt index de6f2dcd6..23c8cdbb0 100644 --- a/simulator/compiler/parser/CMakeLists.txt +++ b/simulator/compiler/parser/CMakeLists.txt @@ -13,16 +13,16 @@ FIND_PACKAGE(BISON 3.0) FIND_PACKAGE(FLEX) IF(NOT BISON_FOUND) - MESSAGE(FATAL_ERROR "Bison can not be found") + MESSAGE(FATAL_ERROR "Bison can not be found") ENDIF() IF(NOT FLEX_FOUND) - MESSAGE(FATAL_ERROR "Flex can not be found") + MESSAGE(FATAL_ERROR "Flex can not be found") ENDIF() IF(WIN32) - GET_FILENAME_COMPONENT(BISON_INCLUDE ${BISON_EXECUTABLE} PATH) - INCLUDE_DIRECTORIES(${BISON_INCLUDE}) + GET_FILENAME_COMPONENT(BISON_INCLUDE ${BISON_EXECUTABLE} PATH) + INCLUDE_DIRECTORIES(${BISON_INCLUDE}) ENDIF() SET(GRAMMA_INPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/grammar) @@ -41,238 +41,238 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/context) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/type) SET(ANIMATION_FILES - src/animation/animation_base.cpp - src/animation/animation_base.h - src/animation/animation_frame.cpp - src/animation/animation_frame.h - src/animation/animation_sprite.cpp - src/animation/animation_sprite.h + src/animation/animation_base.cpp + src/animation/animation_base.h + src/animation/animation_frame.cpp + src/animation/animation_frame.h + src/animation/animation_sprite.cpp + src/animation/animation_sprite.h ) SET(COMMON_FILES - bison_value_pair.h - bison_value_pair-inl.h - namespace.h - rdo_object.cpp - rdo_object.h + bison_value_pair.h + bison_value_pair-inl.h + namespace.h + rdo_object.cpp + rdo_object.h ) SET(CONTEXT_FILES - context/context.cpp - context/context.h - context/context-inl.h - context/context_find.cpp - context/context_find_i.h - context/context_type.cpp - context/context_type.h - context/memory.cpp - context/memory.h - context/stack.cpp - context/stack.h - context/statement.cpp - context/statement.h + context/context.cpp + context/context.h + context/context-inl.h + context/context_find.cpp + context/context_find_i.h + context/context_type.cpp + context/context_type.h + context/memory.cpp + context/memory.h + context/stack.cpp + context/stack.h + context/statement.cpp + context/statement.h ) SET(CONTEXT_FUNCTION_FILES - context/function/context_function_body.cpp - context/function/context_function_body.h - context/function/context_function_param_definition.cpp - context/function/context_function_param_definition.h + context/function/context_function_body.cpp + context/function/context_function_body.h + context/function/context_function_param_definition.cpp + context/function/context_function_param_definition.h ) SET(DPT_FILES - rdo_logic.cpp - rdo_logic.h - rdo_logic-inl.h - rdo_logic_base.h - rdo_logic_base.cpp - rdodpt.cpp - rdodpt.h - rdoprocess.h - rdoprocess.cpp + rdo_logic.cpp + rdo_logic.h + rdo_logic-inl.h + rdo_logic_base.h + rdo_logic_base.cpp + rdodpt.cpp + rdodpt.h + rdoprocess.h + rdoprocess.cpp ) SET(FUNCTION_FILES - rdofun.cpp - rdofun.h - src/function/function.cpp - src/function/function.h + rdofun.cpp + rdofun.h + src/function/function.cpp + src/function/function.h ) SET(FUNCTION_EXPRESSION_FILES - expression.h - expression.cpp + expression.h + expression.cpp ) SET(FUNCTION_LOCAL_VARIABLE_FILES - src/function/local_variable/local_variable.cpp - src/function/local_variable/local_variable.h - src/function/local_variable/local_variable_context.cpp - src/function/local_variable/local_variable_context.h + src/function/local_variable/local_variable.cpp + src/function/local_variable/local_variable.h + src/function/local_variable/local_variable_context.cpp + src/function/local_variable/local_variable_context.h ) SET(GRAMMAR_FILES - ${GRAMMA_INPUT_PATH}/rdobison.h - ${GRAMMA_INPUT_PATH}/rdo_lexer.l - ${GRAMMA_INPUT_PATH}/rdoevn.yx + ${GRAMMA_INPUT_PATH}/rdobison.h + ${GRAMMA_INPUT_PATH}/rdo_lexer.l + ${GRAMMA_INPUT_PATH}/rdoevn.yx ) SET(GRAMMAR_GENERATED_NO_PCH - ${FLEX_lexer_scaner_OUTPUTS} - ${BISON_evn_preparse_OUTPUTS} - ${BISON_evn_OUTPUTS_1} - ${BISON_evn_OUTPUTS_2} + ${FLEX_lexer_scaner_OUTPUTS} + ${BISON_evn_preparse_OUTPUTS} + ${BISON_evn_OUTPUTS_1} + ${BISON_evn_OUTPUTS_2} ) SET(GRAMMAR_GENERATED_FILES - ${GRAMMA_H} - ${GRAMMAR_GENERATED_NO_PCH} + ${GRAMMA_H} + ${GRAMMAR_GENERATED_NO_PCH} ) SET(PARSER_FILES - rdoparser.cpp - rdoparser.h - rdoparser_base.cpp - rdoparser_base.h - rdoparser_corba.cpp - rdoparser_corba.h - rdoparser_rdo.cpp - rdoparser_rdo.h - parser/std_fun.cpp - parser/std_fun.h + rdoparser.cpp + rdoparser.h + rdoparser_base.cpp + rdoparser_base.h + rdoparser_corba.cpp + rdoparser_corba.h + rdoparser_rdo.cpp + rdoparser_rdo.h + parser/std_fun.cpp + parser/std_fun.h ) SET(PARSER_ERROR_FILES - rdoparser_error.cpp - rdoparser_error.h + rdoparser_error.cpp + rdoparser_error.h ) SET(PARSER_LEXER_FILES - rdoparser_lexer.cpp - rdoparser_lexer.h + rdoparser_lexer.cpp + rdoparser_lexer.h ) SET(PATTERN_FILES - rdopat.cpp - rdopat.h + rdopat.cpp + rdopat.h ) SET(PCH_FILES - pch.cpp - pch.h + pch.cpp + pch.h ) SET(PROJECT_FILES - rdosmr.cpp - rdosmr.h + rdosmr.cpp + rdosmr.h ) SET(RESORCES_FILES - rdorss.cpp - rdorss.h - rdortp.cpp - rdortp.h - rdortp_param.cpp - rdortp_param.h + rdorss.cpp + rdorss.h + rdortp.cpp + rdortp.h + rdortp_param.cpp + rdortp_param.h ) SET(RESORCES_PARAM_FILES - param.h - param.cpp + param.h + param.cpp ) SET(TYPE_FILES - type/type_i.h + type/type_i.h ) SET(TYPE_FUNCTION_FILES - type/function_type.cpp - type/function_type.h + type/function_type.cpp + type/function_type.h ) SET(TYPE_INFO_FILES - type/info.cpp - type/info.h - type/info-inl.h + type/info.cpp + type/info.h + type/info-inl.h ) SET(TYPE_ARRAY_FILES - type/array.cpp - type/array.h + type/array.cpp + type/array.h ) SET(TYPE_ATOM_FILES - type/atom.cpp - type/atom.h + type/atom.cpp + type/atom.h ) SET(TYPE_ENUM_FILES - type/enum.cpp - type/enum.h + type/enum.cpp + type/enum.h ) SET(TYPE_RANGE_FILES - type/range.cpp - type/range.h - type/range-inl.h + type/range.cpp + type/range.h + type/range-inl.h ) SET(TYPE_SUCHAS_FILES - type/such_as.cpp - type/such_as.h + type/such_as.cpp + type/such_as.h ) SET(VALUE_FILES - rdo_value.cpp - rdo_value.h - rdo_value-inl.h + rdo_value.cpp + rdo_value.h + rdo_value-inl.h ) SET(VALUE_ARRAY_FILES - rdo_array.cpp - rdo_array.h + rdo_array.cpp + rdo_array.h ) SET(WATCH_FILES - rdopmd.cpp - rdopmd.h + rdopmd.cpp + rdopmd.h ) SET(SOURCE_FILES - ${PCH_FILES} - ${ANIMATION_FILES} - ${COMMON_FILES} - ${CONTEXT_FILES} - ${CONTEXT_FUNCTION_FILES} - ${DPT_FILES} - ${FUNCTION_FILES} - ${FUNCTION_EXPRESSION_FILES} - ${FUNCTION_LOCAL_VARIABLE_FILES} - ${GRAMMAR_FILES} - ${GRAMMAR_GENERATED_FILES} - ${PARSER_FILES} - ${PARSER_ERROR_FILES} - ${PARSER_LEXER_FILES} - ${PATTERN_FILES} - ${PROJECT_FILES} - ${RESORCES_FILES} - ${RESORCES_PARAM_FILES} - ${TYPE_FILES} - ${TYPE_FUNCTION_FILES} - ${TYPE_INFO_FILES} - ${TYPE_ARRAY_FILES} - ${TYPE_ATOM_FILES} - ${TYPE_ENUM_FILES} - ${TYPE_RANGE_FILES} - ${TYPE_SUCHAS_FILES} - ${VALUE_FILES} - ${VALUE_ARRAY_FILES} - ${WATCH_FILES} + ${PCH_FILES} + ${ANIMATION_FILES} + ${COMMON_FILES} + ${CONTEXT_FILES} + ${CONTEXT_FUNCTION_FILES} + ${DPT_FILES} + ${FUNCTION_FILES} + ${FUNCTION_EXPRESSION_FILES} + ${FUNCTION_LOCAL_VARIABLE_FILES} + ${GRAMMAR_FILES} + ${GRAMMAR_GENERATED_FILES} + ${PARSER_FILES} + ${PARSER_ERROR_FILES} + ${PARSER_LEXER_FILES} + ${PATTERN_FILES} + ${PROJECT_FILES} + ${RESORCES_FILES} + ${RESORCES_PARAM_FILES} + ${TYPE_FILES} + ${TYPE_FUNCTION_FILES} + ${TYPE_INFO_FILES} + ${TYPE_ARRAY_FILES} + ${TYPE_ATOM_FILES} + ${TYPE_ENUM_FILES} + ${TYPE_RANGE_FILES} + ${TYPE_SUCHAS_FILES} + ${VALUE_FILES} + ${VALUE_ARRAY_FILES} + ${WATCH_FILES} ) SET(NO_PCH_FILES - ${GRAMMAR_GENERATED_NO_PCH} - ${PCH_FILES} + ${GRAMMAR_GENERATED_NO_PCH} + ${PCH_FILES} ) ADD_LIBRARY(rdo_parser STATIC ${SOURCE_FILES}) @@ -289,7 +289,7 @@ TARGET_LINK_LIBRARIES(rdo_parser rdo_runtime) TARGET_LINK_LIBRARIES(rdo_parser rdo_mbuilder) IF(MSVC) - SET_TARGET_PROPERTIES(rdo_parser PROPERTIES COMPILE_FLAGS "-D_UNISTD_H_") + SET_TARGET_PROPERTIES(rdo_parser PROPERTIES COMPILE_FLAGS "-D_UNISTD_H_") ENDIF() INSTALL(TARGETS rdo_parser DESTINATION lib) @@ -298,123 +298,123 @@ ADD_SUBDIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/test) IF(MSVC_IDE) # options for windows # - INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) - ADD_PCH("${SOURCE_FILES}" "${NO_PCH_FILES}" simulator/compiler/parser ./ pch) + INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) + ADD_PCH("${SOURCE_FILES}" "${NO_PCH_FILES}" simulator/compiler/parser ./ pch) - SOURCE_GROUP(".animation" FILES - ${ANIMATION_FILES} - ) + SOURCE_GROUP(".animation" FILES + ${ANIMATION_FILES} + ) - SOURCE_GROUP(".common" FILES - ${COMMON_FILES} - ) + SOURCE_GROUP(".common" FILES + ${COMMON_FILES} + ) - SOURCE_GROUP(".context" FILES - ${CONTEXT_FILES} - ) + SOURCE_GROUP(".context" FILES + ${CONTEXT_FILES} + ) - SOURCE_GROUP(".context\\.function" FILES - ${CONTEXT_FUNCTION_FILES} - ) + SOURCE_GROUP(".context\\.function" FILES + ${CONTEXT_FUNCTION_FILES} + ) - SOURCE_GROUP(".dpt" FILES - ${DPT_FILES} - ) + SOURCE_GROUP(".dpt" FILES + ${DPT_FILES} + ) - SOURCE_GROUP(".function" FILES - ${FUNCTION_FILES} - ) + SOURCE_GROUP(".function" FILES + ${FUNCTION_FILES} + ) - SOURCE_GROUP(".function\\.expression" FILES - ${FUNCTION_EXPRESSION_FILES} - ) + SOURCE_GROUP(".function\\.expression" FILES + ${FUNCTION_EXPRESSION_FILES} + ) - SOURCE_GROUP(".function\\.local_variable" FILES - ${FUNCTION_LOCAL_VARIABLE_FILES} - ) + SOURCE_GROUP(".function\\.local_variable" FILES + ${FUNCTION_LOCAL_VARIABLE_FILES} + ) - SOURCE_GROUP(".grammar" FILES - ${GRAMMAR_FILES} - ) + SOURCE_GROUP(".grammar" FILES + ${GRAMMAR_FILES} + ) - SOURCE_GROUP(".grammar\\generated" FILES - ${GRAMMAR_GENERATED_FILES} - ) + SOURCE_GROUP(".grammar\\generated" FILES + ${GRAMMAR_GENERATED_FILES} + ) - SOURCE_GROUP(".parser" FILES - ${PARSER_FILES} - ) + SOURCE_GROUP(".parser" FILES + ${PARSER_FILES} + ) - SOURCE_GROUP(".parser\\.error" FILES - ${PARSER_ERROR_FILES} - ) + SOURCE_GROUP(".parser\\.error" FILES + ${PARSER_ERROR_FILES} + ) - SOURCE_GROUP(".parser\\.lexer" FILES - ${PARSER_LEXER_FILES} - ) + SOURCE_GROUP(".parser\\.lexer" FILES + ${PARSER_LEXER_FILES} + ) - SOURCE_GROUP(".pattern" FILES - ${PATTERN_FILES} - ) + SOURCE_GROUP(".pattern" FILES + ${PATTERN_FILES} + ) - SOURCE_GROUP(".pch" FILES - ${PCH_FILES} - ) + SOURCE_GROUP(".pch" FILES + ${PCH_FILES} + ) - SOURCE_GROUP(".project" FILES - ${PROJECT_FILES} - ) + SOURCE_GROUP(".project" FILES + ${PROJECT_FILES} + ) - SOURCE_GROUP(".resorces" FILES - ${RESORCES_FILES} - ) + SOURCE_GROUP(".resorces" FILES + ${RESORCES_FILES} + ) - SOURCE_GROUP(".resorces\\.param" FILES - ${RESORCES_PARAM_FILES} - ) + SOURCE_GROUP(".resorces\\.param" FILES + ${RESORCES_PARAM_FILES} + ) - SOURCE_GROUP(".type" FILES - ${TYPE_FILES} - ) + SOURCE_GROUP(".type" FILES + ${TYPE_FILES} + ) - SOURCE_GROUP(".type\\.function" FILES - ${TYPE_FUNCTION_FILES} - ) + SOURCE_GROUP(".type\\.function" FILES + ${TYPE_FUNCTION_FILES} + ) - SOURCE_GROUP(".type\\.info" FILES - ${TYPE_INFO_FILES} - ) + SOURCE_GROUP(".type\\.info" FILES + ${TYPE_INFO_FILES} + ) - SOURCE_GROUP(".type\\.array" FILES - ${TYPE_ARRAY_FILES} - ) + SOURCE_GROUP(".type\\.array" FILES + ${TYPE_ARRAY_FILES} + ) - SOURCE_GROUP(".type\\.atom" FILES - ${TYPE_ATOM_FILES} - ) + SOURCE_GROUP(".type\\.atom" FILES + ${TYPE_ATOM_FILES} + ) - SOURCE_GROUP(".type\\.enum" FILES - ${TYPE_ENUM_FILES} - ) + SOURCE_GROUP(".type\\.enum" FILES + ${TYPE_ENUM_FILES} + ) - SOURCE_GROUP(".type\\.range" FILES - ${TYPE_RANGE_FILES} - ) + SOURCE_GROUP(".type\\.range" FILES + ${TYPE_RANGE_FILES} + ) - SOURCE_GROUP(".type\\.such_as" FILES - ${TYPE_SUCHAS_FILES} - ) + SOURCE_GROUP(".type\\.such_as" FILES + ${TYPE_SUCHAS_FILES} + ) - SOURCE_GROUP(".value" FILES - ${VALUE_FILES} - ) + SOURCE_GROUP(".value" FILES + ${VALUE_FILES} + ) - SOURCE_GROUP(".value\\.array" FILES - ${VALUE_ARRAY_FILES} - ) + SOURCE_GROUP(".value\\.array" FILES + ${VALUE_ARRAY_FILES} + ) - SOURCE_GROUP(".watch" FILES - ${WATCH_FILES} - ) + SOURCE_GROUP(".watch" FILES + ${WATCH_FILES} + ) ENDIF() diff --git a/simulator/compiler/parser/bison_value_pair-inl.h b/simulator/compiler/parser/bison_value_pair-inl.h index a0e5fae4e..1f7de8833 100644 --- a/simulator/compiler/parser/bison_value_pair-inl.h +++ b/simulator/compiler/parser/bison_value_pair-inl.h @@ -9,7 +9,7 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------------------------------------------------------------------- template inline BisonValuePair::BisonValuePair(const T1& first, const T2& second) - : m_value(std::make_pair(first, second)) + : m_value(std::make_pair(first, second)) {} template @@ -19,13 +19,13 @@ inline BisonValuePair::~BisonValuePair() template inline const T1& BisonValuePair::getFirst() const { - return m_value.first; + return m_value.first; } template inline const T2& BisonValuePair::getSecond() const { - return m_value.second; + return m_value.second; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/bison_value_pair.h b/simulator/compiler/parser/bison_value_pair.h index 08da5a60e..32a1e56da 100644 --- a/simulator/compiler/parser/bison_value_pair.h +++ b/simulator/compiler/parser/bison_value_pair.h @@ -1,5 +1,4 @@ -#ifndef _SIMULATOR_COMPILER_PARSER_BISON_VALUE_PAIR_H_ -#define _SIMULATOR_COMPILER_PARSER_BISON_VALUE_PAIR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -17,23 +16,21 @@ template class BisonValuePair: public rdo::counter_reference { public: - const T1& getFirst () const; - const T2& getSecond() const; + const T1& getFirst () const; + const T2& getSecond() const; private: - typedef BisonValuePair this_type; - DECLARE_FACTORY(this_type); + typedef BisonValuePair this_type; + DECLARE_FACTORY(this_type); - BisonValuePair(const T1& first, const T2& second); - virtual ~BisonValuePair(); + BisonValuePair(const T1& first, const T2& second); + virtual ~BisonValuePair(); - typedef std::pair Value; + typedef std::pair Value; - Value m_value; + Value m_value; }; CLOSE_RDO_PARSER_NAMESPACE #include "simulator/compiler/parser/bison_value_pair-inl.h" - -#endif // _SIMULATOR_COMPILER_PARSER_BISON_VALUE_PAIR_H_ diff --git a/simulator/compiler/parser/context/context-inl.h b/simulator/compiler/parser/context/context-inl.h index 9eb8fb9f0..11acd3e7b 100644 --- a/simulator/compiler/parser/context/context-inl.h +++ b/simulator/compiler/parser/context/context-inl.h @@ -12,7 +12,7 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------------------------------------------------------------------- template Context::FunctionWrapper::FunctionWrapper(const Function& function) - : function(function) + : function(function) {} // -------------------------------------------------------------------------------- @@ -21,9 +21,9 @@ Context::FunctionWrapper::FunctionWrapper(const Function& function) template T Context::Params::get(const std::string& name) const { - std::map::const_iterator it = find(name); - ASSERT(it != end()); - return boost::any_cast(it->second); + std::map::const_iterator it = find(name); + ASSERT(it != end()); + return boost::any_cast(it->second); } // -------------------------------------------------------------------------------- @@ -32,27 +32,27 @@ T Context::Params::get(const std::string& name) const template inline rdo::intrusive_ptr Context::cast() { - LPContext pThis = this; - rdo::intrusive_ptr pThisResult = pThis.object_dynamic_cast(); - if (pThisResult) - { - return pThisResult; - } - LPContext pPrev = m_pContextStack->prev(pThis); - return pPrev ? pPrev->cast() : rdo::intrusive_ptr(); + LPContext pThis = this; + rdo::intrusive_ptr pThisResult = pThis.object_dynamic_cast(); + if (pThisResult) + { + return pThisResult; + } + LPContext pPrev = m_pContextStack->prev(pThis); + return pPrev ? pPrev->cast() : rdo::intrusive_ptr(); } template inline rdo::interface_ptr Context::interface_cast() { - LPContext pThis = this; - rdo::interface_ptr pThisResult = pThis.interface_dynamic_cast(); - if (pThisResult) - { - return pThisResult; - } - LPContext pPrev = m_pContextStack->prev(pThis); - return pPrev ? pPrev->interface_cast() : rdo::interface_ptr(); + LPContext pThis = this; + rdo::interface_ptr pThisResult = pThis.interface_dynamic_cast(); + if (pThisResult) + { + return pThisResult; + } + LPContext pPrev = m_pContextStack->prev(pThis); + return pPrev ? pPrev->interface_cast() : rdo::interface_ptr(); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/context/context.cpp b/simulator/compiler/parser/context/context.cpp index 7348fb31b..e0c309f63 100644 --- a/simulator/compiler/parser/context/context.cpp +++ b/simulator/compiler/parser/context/context.cpp @@ -16,17 +16,17 @@ const std::string Context::Params::IDENTIFIER = "identifier"; std::string Context::Params::get(const std::string& name) const { - return get(name); + return get(name); } std::string Context::Params::identifier() const { - return get(IDENTIFIER); + return get(IDENTIFIER); } bool Context::Params::exists(const std::string& name) const { - return find(name) != end(); + return find(name) != end(); } // -------------------------------------------------------------------------------- @@ -36,17 +36,17 @@ Context::SwitchContext::SwitchContext() {} Context::SwitchContext::SwitchContext(const LPContext& context) - : context(context) + : context(context) {} Context::SwitchContext::SwitchContext(const LPContext& context, const Context::Params& params) - : context(context) - , params(params) + : context(context) + , params(params) {} Context::SwitchContext::operator bool() const { - return context; + return context; } // -------------------------------------------------------------------------------- @@ -56,26 +56,26 @@ Context::FindResult::FindResult() {} Context::FindResult::FindResult(const CreateExpression& createExpression) - : createExpression(createExpression.function) + : createExpression(createExpression.function) {} Context::FindResult::FindResult(const SwitchContext& switchContext) - : switchContext(switchContext) + : switchContext(switchContext) {} Context::FindResult::operator bool() const { - return createExpression || switchContext; + return createExpression || switchContext; } const Context::CreateExpressionFunction& Context::FindResult::getCreateExpression() const { - return createExpression; + return createExpression; } const Context::SwitchContext& Context::FindResult::getSwitchContext() const { - return switchContext; + return switchContext; } // -------------------------------------------------------------------------------- @@ -95,47 +95,47 @@ Context::~Context() void Context::setContextStack(const LPContextStack& pContextStack) { - ASSERT(pContextStack ); - ASSERT(!m_pContextStack); - m_pContextStack = pContextStack; + ASSERT(pContextStack ); + ASSERT(!m_pContextStack); + m_pContextStack = pContextStack; } void Context::resetContextStack() { - ASSERT(m_pContextStack); - m_pContextStack = NULL; + ASSERT(m_pContextStack); + m_pContextStack = NULL; } Context::LPFindResult Context::find(const std::string& method, const Params& params, const RDOParserSrcInfo& srcInfo) const { - Context::LPFindResult result; - LPContext pThis(const_cast(this)); - LPIContextFind pThisContextFind = pThis.interface_dynamic_cast(); - if (pThisContextFind) - { - result = pThisContextFind->onFindContext(method, params, srcInfo); - if (result->getCreateExpression() || result->getSwitchContext()) - { - return result; - } - } - - LPContext pPrev; - - if (m_pContextStack) - { - pPrev = m_pContextStack->prev(pThis); - } - - if (!pPrev) - { - const std::string error = params.exists(Params::IDENTIFIER) - ? boost::str(boost::format("Неизвестный идентификатор: %s") % params.identifier()) - : "Неизвестная ошибка"; - RDOParser::s_parser()->error().error(srcInfo, error); - } - - return pPrev->find(method, params, srcInfo); + Context::LPFindResult result; + LPContext pThis(const_cast(this)); + LPIContextFind pThisContextFind = pThis.interface_dynamic_cast(); + if (pThisContextFind) + { + result = pThisContextFind->onFindContext(method, params, srcInfo); + if (result->getCreateExpression() || result->getSwitchContext()) + { + return result; + } + } + + LPContext pPrev; + + if (m_pContextStack) + { + pPrev = m_pContextStack->prev(pThis); + } + + if (!pPrev) + { + const std::string error = params.exists(Params::IDENTIFIER) + ? boost::str(boost::format("Неизвестный идентификатор: %s") % params.identifier()) + : "Неизвестная ошибка"; + RDOParser::s_parser()->error().error(srcInfo, error); + } + + return pPrev->find(method, params, srcInfo); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/context/context.h b/simulator/compiler/parser/context/context.h index 6eebebe53..88b1f1bec 100644 --- a/simulator/compiler/parser/context/context.h +++ b/simulator/compiler/parser/context/context.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_CONTEXT_H_ -#define _RDOPARSER_CONTEXT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -25,93 +24,91 @@ friend void ContextStack::push(LPContext pContext); friend void ContextStack::pop_not_safed(); public: - static const std::string METHOD_GET; - static const std::string METHOD_TYPE_OF; - static const std::string METHOD_SET; - static const std::string METHOD_OPERATOR_BRACKETS; - static const std::string METHOD_OPERATOR_DOT; + static const std::string METHOD_GET; + static const std::string METHOD_TYPE_OF; + static const std::string METHOD_SET; + static const std::string METHOD_OPERATOR_BRACKETS; + static const std::string METHOD_OPERATOR_DOT; - typedef boost::function CreateExpressionFunction; + typedef boost::function CreateExpressionFunction; - template - struct FunctionWrapper - { - FunctionWrapper(const Function& function); - Function function; - }; - typedef FunctionWrapper CreateExpression; + template + struct FunctionWrapper + { + FunctionWrapper(const Function& function); + Function function; + }; + typedef FunctionWrapper CreateExpression; - struct Params: public std::map - { - static const std::string IDENTIFIER; + struct Params: public std::map + { + static const std::string IDENTIFIER; - template - T get(const std::string& name) const; + template + T get(const std::string& name) const; - std::string get(const std::string& name) const; - std::string identifier() const; + std::string get(const std::string& name) const; + std::string identifier() const; - bool exists(const std::string& name) const; - }; + bool exists(const std::string& name) const; + }; - class FindResult; - struct SwitchContext - { - friend class FindResult; + class FindResult; + struct SwitchContext + { + friend class FindResult; - LPContext context; - Params params; + LPContext context; + Params params; - SwitchContext(const LPContext& context); - SwitchContext(const LPContext& context, const Params& params); + SwitchContext(const LPContext& context); + SwitchContext(const LPContext& context, const Params& params); - operator bool() const; + operator bool() const; - private: - SwitchContext(); - }; + private: + SwitchContext(); + }; - class FindResult: public virtual rdo::counter_reference - { - DECLARE_FACTORY(FindResult); + class FindResult: public virtual rdo::counter_reference + { + DECLARE_FACTORY(FindResult); - public: - FindResult(); - explicit FindResult(const CreateExpression& createExpression); - explicit FindResult(const SwitchContext& switchContext); + public: + FindResult(); + explicit FindResult(const CreateExpression& createExpression); + explicit FindResult(const SwitchContext& switchContext); - operator bool() const; + operator bool() const; - const CreateExpressionFunction& getCreateExpression() const; - const SwitchContext& getSwitchContext() const; + const CreateExpressionFunction& getCreateExpression() const; + const SwitchContext& getSwitchContext() const; - private: - CreateExpressionFunction createExpression; - SwitchContext switchContext; - }; - DECLARE_POINTER(FindResult); + private: + CreateExpressionFunction createExpression; + SwitchContext switchContext; + }; + DECLARE_POINTER(FindResult); - template - rdo::intrusive_ptr cast(); + template + rdo::intrusive_ptr cast(); - template - rdo::interface_ptr interface_cast(); + template + rdo::interface_ptr interface_cast(); - LPFindResult find(const std::string& method, const Params& params, const RDOParserSrcInfo& srcInfo) const; + LPFindResult find(const std::string& method, const Params& params, const RDOParserSrcInfo& srcInfo) const; protected: - Context(); - virtual ~Context(); + Context(); + virtual ~Context(); private: - LPContextStack m_pContextStack; + LPContextStack m_pContextStack; - void setContextStack (const LPContextStack& pContextStack); - void resetContextStack(); + void setContextStack (const LPContextStack& pContextStack); + void resetContextStack(); }; CLOSE_RDO_PARSER_NAMESPACE #include "simulator/compiler/parser/context/context-inl.h" - -#endif // _RDOPARSER_CONTEXT_H_ diff --git a/simulator/compiler/parser/context/context_find_i.h b/simulator/compiler/parser/context/context_find_i.h index 06022a95d..f58d9f327 100644 --- a/simulator/compiler/parser/context/context_find_i.h +++ b/simulator/compiler/parser/context/context_find_i.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_CONTEXT_FIND_I_H_ -#define _RDOPARSER_CONTEXT_FIND_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,15 +15,13 @@ struct IContextFind: public rdo::RefCounter { DECLARE_FACTORY(IContextFind) public: - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const = 0; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const = 0; protected: - IContextFind(); - virtual ~IContextFind(); + IContextFind(); + virtual ~IContextFind(); }; #define DECLARE_IContextFind \ - Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_CONTEXT_FIND_I_H_ diff --git a/simulator/compiler/parser/context/context_type.cpp b/simulator/compiler/parser/context/context_type.cpp index 9c18ceeeb..5ac63b9d9 100644 --- a/simulator/compiler/parser/context/context_type.cpp +++ b/simulator/compiler/parser/context/context_type.cpp @@ -12,12 +12,12 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- TypeContext // -------------------------------------------------------------------------------- TypeContext::TypeContext(const LPTypeInfo& pType) - : m_pType(pType) + : m_pType(pType) {} const LPTypeInfo& TypeContext::getTypeInfo() const { - return m_pType; + return m_pType; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/context/context_type.h b/simulator/compiler/parser/context/context_type.h index 3954c467f..56be08ece 100644 --- a/simulator/compiler/parser/context/context_type.h +++ b/simulator/compiler/parser/context/context_type.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_CONTEXT_TYPE_H_ -#define _RDOPARSER_CONTEXT_TYPE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -14,29 +13,27 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------------------------------------------------------------------- struct ITypeContext { - virtual const LPTypeInfo& getTypeInfo() const = 0; + virtual const LPTypeInfo& getTypeInfo() const = 0; }; #define DECLARE_ITypeContext \ public: \ - const LPTypeInfo& getTypeInfo() const; + const LPTypeInfo& getTypeInfo() const; // -------------------------------------------------------------------------------- // -------------------- TypeContext // -------------------------------------------------------------------------------- class TypeContext - : public Context - , public ITypeContext + : public Context + , public ITypeContext { DECLARE_FACTORY(TypeContext); private: - TypeContext(const LPTypeInfo& pType); + TypeContext(const LPTypeInfo& pType); - LPTypeInfo m_pType; + LPTypeInfo m_pType; - DECLARE_ITypeContext; + DECLARE_ITypeContext; }; DECLARE_POINTER(TypeContext); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_CONTEXT_TYPE_H_ diff --git a/simulator/compiler/parser/context/function/context_function_body.cpp b/simulator/compiler/parser/context/function/context_function_body.cpp index e65a19154..736dcaa65 100644 --- a/simulator/compiler/parser/context/function/context_function_body.cpp +++ b/simulator/compiler/parser/context/function/context_function_body.cpp @@ -13,7 +13,7 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- ContextFunctionBody // -------------------------------------------------------------------------------- ContextFunctionBody::ContextFunctionBody(const OnBody& onBody) - : m_onBody(onBody) + : m_onBody(onBody) {} ContextFunctionBody::~ContextFunctionBody() @@ -21,22 +21,22 @@ ContextFunctionBody::~ContextFunctionBody() void ContextFunctionBody::pushContext() { - LPContextMemory pContextMemory = rdo::Factory::create(); - ASSERT(pContextMemory); - RDOParser::s_parser()->contextStack()->push(pContextMemory); + LPContextMemory pContextMemory = rdo::Factory::create(); + ASSERT(pContextMemory); + RDOParser::s_parser()->contextStack()->push(pContextMemory); - ContextMemory::push(); + ContextMemory::push(); } void ContextFunctionBody::popContext() { - ContextMemory::pop(); - RDOParser::s_parser()->contextStack()->pop(); + ContextMemory::pop(); + RDOParser::s_parser()->contextStack()->pop(); } void ContextFunctionBody::setBody(const rdo::runtime::LPRDOCalc& pBody) { - m_onBody(pBody); + m_onBody(pBody); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/context/function/context_function_body.h b/simulator/compiler/parser/context/function/context_function_body.h index c3d2683ef..0beb64296 100644 --- a/simulator/compiler/parser/context/function/context_function_body.h +++ b/simulator/compiler/parser/context/function/context_function_body.h @@ -1,5 +1,4 @@ -#ifndef _SIMULATOR_COMPILER_PARSER_CONTEXT_FUNCTION_BODY_H_ -#define _SIMULATOR_COMPILER_PARSER_CONTEXT_FUNCTION_BODY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -21,19 +20,19 @@ struct IContextFunctionBodyManager: public rdo::RefCounter OnBody; + typedef boost::function OnBody; - ContextFunctionBody(const OnBody& onBody); - virtual ~ContextFunctionBody(); + ContextFunctionBody(const OnBody& onBody); + virtual ~ContextFunctionBody(); - OnBody m_onBody; + OnBody m_onBody; }; DECLARE_POINTER(ContextFunctionBody); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _SIMULATOR_COMPILER_PARSER_CONTEXT_FUNCTION_BODY_H_ diff --git a/simulator/compiler/parser/context/function/context_function_param_definition.cpp b/simulator/compiler/parser/context/function/context_function_param_definition.cpp index 3b7f5c787..87c0696c2 100644 --- a/simulator/compiler/parser/context/function/context_function_param_definition.cpp +++ b/simulator/compiler/parser/context/function/context_function_param_definition.cpp @@ -13,7 +13,7 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- ContextParamDefinition // -------------------------------------------------------------------------------- ContextParamDefinition::ContextParamDefinition(const OnPushParam& onPushParam) - : m_onPushParam(onPushParam) + : m_onPushParam(onPushParam) {} ContextParamDefinition::~ContextParamDefinition() @@ -21,7 +21,7 @@ ContextParamDefinition::~ContextParamDefinition() void ContextParamDefinition::pushParam(const LPRDOParam& pParam) { - m_onPushParam(pParam); + m_onPushParam(pParam); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/context/function/context_function_param_definition.h b/simulator/compiler/parser/context/function/context_function_param_definition.h index a72816823..c2590d51f 100644 --- a/simulator/compiler/parser/context/function/context_function_param_definition.h +++ b/simulator/compiler/parser/context/function/context_function_param_definition.h @@ -1,5 +1,4 @@ -#ifndef _SIMULATOR_COMPILER_PARSER_CONTEXT_FUNCTION_PARAM_DEFINITION_H_ -#define _SIMULATOR_COMPILER_PARSER_CONTEXT_FUNCTION_PARAM_DEFINITION_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -18,19 +17,19 @@ struct IContextParamDefinitionManager: public rdo::RefCounter OnPushParam; + typedef boost::function OnPushParam; - ContextParamDefinition(const OnPushParam& onPushParam); - virtual ~ContextParamDefinition(); + ContextParamDefinition(const OnPushParam& onPushParam); + virtual ~ContextParamDefinition(); - OnPushParam m_onPushParam; + OnPushParam m_onPushParam; }; DECLARE_POINTER(ContextParamDefinition); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _SIMULATOR_COMPILER_PARSER_CONTEXT_FUNCTION_PARAM_DEFINITION_H_ diff --git a/simulator/compiler/parser/context/memory.cpp b/simulator/compiler/parser/context/memory.cpp index 26bb7bbc0..ebeb1d3ef 100644 --- a/simulator/compiler/parser/context/memory.cpp +++ b/simulator/compiler/parser/context/memory.cpp @@ -13,67 +13,67 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------------------------------------------------------------------- ContextMemory::ContextMemory() { - m_pLocalVariableListStack = rdo::Factory::create(); - ASSERT(m_pLocalVariableListStack); + m_pLocalVariableListStack = rdo::Factory::create(); + ASSERT(m_pLocalVariableListStack); } LPLocalVariableListStack ContextMemory::getLocalMemory() { - return m_pLocalVariableListStack; + return m_pLocalVariableListStack; } Context::LPFindResult ContextMemory::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const { - if (method == Context::METHOD_OPERATOR_DOT) - { - LPLocalVariable pLocalVariable = m_pLocalVariableListStack->findLocalVariable(params.identifier()); - if (pLocalVariable) - return rdo::Factory::create(SwitchContext(pLocalVariable, params)); - } + if (method == Context::METHOD_OPERATOR_DOT) + { + LPLocalVariable pLocalVariable = m_pLocalVariableListStack->findLocalVariable(params.identifier()); + if (pLocalVariable) + return rdo::Factory::create(SwitchContext(pLocalVariable, params)); + } - if (method == Context::METHOD_GET) - { - LPLocalVariable pLocalVariable = m_pLocalVariableListStack->findLocalVariable(params.identifier()); - if (pLocalVariable) - return pLocalVariable->find(Context::METHOD_GET, params, srcInfo); - } + if (method == Context::METHOD_GET) + { + LPLocalVariable pLocalVariable = m_pLocalVariableListStack->findLocalVariable(params.identifier()); + if (pLocalVariable) + return pLocalVariable->find(Context::METHOD_GET, params, srcInfo); + } - if (method == Context::METHOD_SET) - { - LPLocalVariable pLocalVariable = m_pLocalVariableListStack->findLocalVariable(params.identifier()); - if (pLocalVariable) - return pLocalVariable->find(Context::METHOD_SET, params, srcInfo); - } + if (method == Context::METHOD_SET) + { + LPLocalVariable pLocalVariable = m_pLocalVariableListStack->findLocalVariable(params.identifier()); + if (pLocalVariable) + return pLocalVariable->find(Context::METHOD_SET, params, srcInfo); + } - return rdo::Factory::create(); + return rdo::Factory::create(); } void ContextMemory::push() { - LPContext pContext = RDOParser::s_parser()->context(); - ASSERT(pContext); - LPContextMemory pContextMemory = pContext->cast(); - ASSERT(pContextMemory); + LPContext pContext = RDOParser::s_parser()->context(); + ASSERT(pContext); + LPContextMemory pContextMemory = pContext->cast(); + ASSERT(pContextMemory); - LPLocalVariableListStack pLocalVariableListStack = pContextMemory->getLocalMemory(); - ASSERT(pLocalVariableListStack); + LPLocalVariableListStack pLocalVariableListStack = pContextMemory->getLocalMemory(); + ASSERT(pLocalVariableListStack); - LPLocalVariableList pLocalVariableList = rdo::Factory::create(); - ASSERT(pLocalVariableList); - pLocalVariableListStack->push(pLocalVariableList); + LPLocalVariableList pLocalVariableList = rdo::Factory::create(); + ASSERT(pLocalVariableList); + pLocalVariableListStack->push(pLocalVariableList); } void ContextMemory::pop() { - LPContext pContext = RDOParser::s_parser()->context(); - ASSERT(pContext); - LPContextMemory pContextMemory = pContext->cast(); - ASSERT(pContextMemory); + LPContext pContext = RDOParser::s_parser()->context(); + ASSERT(pContext); + LPContextMemory pContextMemory = pContext->cast(); + ASSERT(pContextMemory); - LPLocalVariableListStack pLocalVariableListStack = pContextMemory->getLocalMemory(); - ASSERT(pLocalVariableListStack); + LPLocalVariableListStack pLocalVariableListStack = pContextMemory->getLocalMemory(); + ASSERT(pLocalVariableListStack); - pLocalVariableListStack->pop(); + pLocalVariableListStack->pop(); } CLOSE_RDO_PARSER_NAMESPACE \ No newline at end of file diff --git a/simulator/compiler/parser/context/memory.h b/simulator/compiler/parser/context/memory.h index 7a429b541..b7860e667 100644 --- a/simulator/compiler/parser/context/memory.h +++ b/simulator/compiler/parser/context/memory.h @@ -1,5 +1,4 @@ -#ifndef _CONEXT_MEMORY_H_ -#define _CONEXT_MEMORY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -15,36 +14,34 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------------------------------------------------------------------- struct IContextMemory { - virtual LPLocalVariableListStack getLocalMemory() = 0; + virtual LPLocalVariableListStack getLocalMemory() = 0; }; #define DECLARE_IContextMemory \ public: \ - LPLocalVariableListStack getLocalMemory(); + LPLocalVariableListStack getLocalMemory(); // -------------------------------------------------------------------------------- // -------------------- ContextMemory // -------------------------------------------------------------------------------- class ContextMemory - : public Context - , public IContextMemory - , public IContextFind + : public Context + , public IContextMemory + , public IContextFind { DECLARE_FACTORY(ContextMemory); public: - static void push(); - static void pop (); + static void push(); + static void pop (); protected: - ContextMemory(); + ContextMemory(); private: - LPLocalVariableListStack m_pLocalVariableListStack; + LPLocalVariableListStack m_pLocalVariableListStack; - DECLARE_IContextMemory; - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + DECLARE_IContextMemory; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; DECLARE_POINTER(ContextMemory); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _CONEXT_MEMORY_H_ diff --git a/simulator/compiler/parser/context/stack.cpp b/simulator/compiler/parser/context/stack.cpp index ea0c42020..74422bfb2 100644 --- a/simulator/compiler/parser/context/stack.cpp +++ b/simulator/compiler/parser/context/stack.cpp @@ -14,44 +14,44 @@ ContextStack::ContextStack() ContextStack::~ContextStack() { - while (!m_container.empty()) - pop_not_safed(); + while (!m_container.empty()) + pop_not_safed(); } void ContextStack::push(LPContext pContext) { - m_container.push_back(pContext); - pContext->setContextStack(this); + m_container.push_back(pContext); + pContext->setContextStack(this); } void ContextStack::pop_not_safed() { - ASSERT(!m_container.empty()); - top()->resetContextStack(); - m_container.pop_back(); + ASSERT(!m_container.empty()); + top()->resetContextStack(); + m_container.pop_back(); } LPContext ContextStack::top() const { - ASSERT(!m_container.empty()); - return m_container.back(); + ASSERT(!m_container.empty()); + return m_container.back(); } LPContext ContextStack::global() const { - ASSERT(!m_container.empty()); - return m_container.front(); + ASSERT(!m_container.empty()); + return m_container.front(); } LPContext ContextStack::prev(const LPContext& pContext) const { - Container::const_iterator it = std::find(m_container.begin(), m_container.end(), pContext); - if (it == m_container.end() || it == m_container.begin()) - { - return LPContext(); - } - --it; - return it != m_container.end() ? *it : LPContext(); + Container::const_iterator it = std::find(m_container.begin(), m_container.end(), pContext); + if (it == m_container.end() || it == m_container.begin()) + { + return LPContext(); + } + --it; + return it != m_container.end() ? *it : LPContext(); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/context/stack.h b/simulator/compiler/parser/context/stack.h index abaab2588..18c52214c 100644 --- a/simulator/compiler/parser/context/stack.h +++ b/simulator/compiler/parser/context/stack.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_CONTEXT_STACK_H_ -#define _RDOPARSER_CONTEXT_STACK_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -20,28 +19,26 @@ class ContextStack: public rdo::counter_reference { DECLARE_FACTORY(ContextStack); public: - void push(LPContext pContext); - template void pop () - { - ASSERT(top().object_dynamic_cast()); - pop_not_safed(); - } + void push(LPContext pContext); + template void pop () + { + ASSERT(top().object_dynamic_cast()); + pop_not_safed(); + } - LPContext top () const; - LPContext global() const; - LPContext prev (const LPContext& pContext) const; + LPContext top () const; + LPContext global() const; + LPContext prev (const LPContext& pContext) const; - void pop_not_safed(); + void pop_not_safed(); private: - ContextStack(); - virtual ~ContextStack(); + ContextStack(); + virtual ~ContextStack(); - typedef std::list Container; + typedef std::list Container; - Container m_container; + Container m_container; }; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_CONTEXT_STACK_H_ diff --git a/simulator/compiler/parser/context/statement.cpp b/simulator/compiler/parser/context/statement.cpp index 36d8749f6..a9b59d4ee 100644 --- a/simulator/compiler/parser/context/statement.cpp +++ b/simulator/compiler/parser/context/statement.cpp @@ -21,7 +21,7 @@ ContextBreakable::~ContextBreakable() // -------------------- ContextReturnable // -------------------------------------------------------------------------------- ContextReturnable::ContextReturnable() - : m_returnFlag(false) + : m_returnFlag(false) {} ContextReturnable::~ContextReturnable() @@ -29,36 +29,36 @@ ContextReturnable::~ContextReturnable() bool ContextReturnable::getReturnFlag() const { - if (m_returnFlag) - return true; + if (m_returnFlag) + return true; - return !m_contextReturnableList.empty() - ? getChildFlags() - : false; + return !m_contextReturnableList.empty() + ? getChildFlags() + : false; } void ContextReturnable::setReturnFlag() { - m_returnFlag = true; + m_returnFlag = true; } void ContextReturnable::addChildContext() { - LPContextReturnable pContext = rdo::Factory::create(); - ASSERT(pContext); + LPContextReturnable pContext = rdo::Factory::create(); + ASSERT(pContext); - m_contextReturnableList.push_back(pContext); - RDOParser::s_parser()->contextStack()->push(pContext); + m_contextReturnableList.push_back(pContext); + RDOParser::s_parser()->contextStack()->push(pContext); } bool ContextReturnable::getChildFlags() const { - for (const LPContextReturnable& pContext: m_contextReturnableList) - { - if (!pContext->getReturnFlag()) - return false; - } - return true; + for (const LPContextReturnable& pContext: m_contextReturnableList) + { + if (!pContext->getReturnFlag()) + return false; + } + return true; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/context/statement.h b/simulator/compiler/parser/context/statement.h index 895781ef6..2083ef171 100644 --- a/simulator/compiler/parser/context/statement.h +++ b/simulator/compiler/parser/context/statement.h @@ -1,5 +1,4 @@ -#ifndef _CONTEXT_STATEMENT_H_ -#define _CONTEXT_STATEMENT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -15,8 +14,8 @@ class ContextBreakable: public Context { DECLARE_FACTORY(ContextBreakable); private: - ContextBreakable(); - virtual ~ContextBreakable(); + ContextBreakable(); + virtual ~ContextBreakable(); }; DECLARE_POINTER(ContextBreakable); @@ -28,24 +27,22 @@ class ContextReturnable: public Context { DECLARE_FACTORY(ContextReturnable); public: - bool getReturnFlag() const; - void setReturnFlag(); + bool getReturnFlag() const; + void setReturnFlag(); - void addChildContext(); + void addChildContext(); protected: - ContextReturnable(); - virtual ~ContextReturnable(); + ContextReturnable(); + virtual ~ContextReturnable(); private: - typedef std::vector ContextReturnableList; + typedef std::vector ContextReturnableList; - ContextReturnableList m_contextReturnableList; - bool m_returnFlag; + ContextReturnableList m_contextReturnableList; + bool m_returnFlag; - bool getChildFlags() const; + bool getChildFlags() const; }; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _CONTEXT_STATEMENT_H_ \ No newline at end of file diff --git a/simulator/compiler/parser/expression.cpp b/simulator/compiler/parser/expression.cpp index 45bc19ac3..4aabc8e37 100644 --- a/simulator/compiler/parser/expression.cpp +++ b/simulator/compiler/parser/expression.cpp @@ -16,39 +16,39 @@ const std::string Expression::CONTEXT_PARAM_SET_EXPRESSION = "set_expression"; const std::string Expression::CONTEXT_PARAM_SET_OPERATION_TYPE = "set_operation_type"; Expression::Expression(const LPTypeInfo& pType, const rdo::runtime::LPRDOCalc& pCalc, const RDOParserSrcInfo& src_info) - : m_pType(pType) - , m_pCalc(pCalc) + : m_pType(pType) + , m_pCalc(pCalc) { - ASSERT(m_pType); - - if (m_pCalc) - { - rdo::runtime::LPRDOCalcConst pConstCalc = m_pCalc.object_dynamic_cast(); - if (pConstCalc) - { - m_pValue = rdo::Factory::create(pConstCalc->getValue(), src_info, m_pType); - } - } - setSrcInfo(src_info); + ASSERT(m_pType); + + if (m_pCalc) + { + rdo::runtime::LPRDOCalcConst pConstCalc = m_pCalc.object_dynamic_cast(); + if (pConstCalc) + { + m_pValue = rdo::Factory::create(pConstCalc->getValue(), src_info, m_pType); + } + } + setSrcInfo(src_info); } Expression::Expression(const LPRDOValue& pValue) - : m_pType (pValue->typeInfo()) - , m_pValue(pValue ) + : m_pType (pValue->typeInfo()) + , m_pValue(pValue ) { - ASSERT(pValue); - ASSERT(pValue->constant()); + ASSERT(pValue); + ASSERT(pValue->constant()); - m_pCalc = rdo::Factory::create(pValue->value()); - ASSERT(m_pCalc); + m_pCalc = rdo::Factory::create(pValue->value()); + ASSERT(m_pCalc); - setSrcInfo(pValue->src_info()); + setSrcInfo(pValue->src_info()); } Expression::Expression(const LPExpression& pExpression) - : m_pType (pExpression->m_pType ) - , m_pValue(pExpression->m_pValue) - , m_pCalc (pExpression->m_pCalc ) + : m_pType (pExpression->m_pType ) + , m_pValue(pExpression->m_pValue) + , m_pCalc (pExpression->m_pCalc ) {} Expression::~Expression() @@ -56,41 +56,41 @@ Expression::~Expression() const LPTypeInfo& Expression::typeInfo() const { - return m_pType; + return m_pType; } const rdo::runtime::LPRDOCalc& Expression::calc() const { - return m_pCalc; + return m_pCalc; } void Expression::setSrcInfo(const RDOParserSrcInfo& src_info) { - RDOParserSrcInfo::setSrcInfo(src_info); - if (m_pCalc) - { - m_pCalc->setSrcInfo(src_info); - } + RDOParserSrcInfo::setSrcInfo(src_info); + if (m_pCalc) + { + m_pCalc->setSrcInfo(src_info); + } } LPRDOValue Expression::constant() const { - if (m_pValue) - { - return m_pValue; - } - return LPRDOValue(NULL); + if (m_pValue) + { + return m_pValue; + } + return LPRDOValue(NULL); } // -------------------------------------------------------------------------------- // -------------------- ExpressionEmpty // -------------------------------------------------------------------------------- ExpressionEmpty::ExpressionEmpty() - : Expression( - rdo::Factory::delegate(RDOParserSrcInfo()), - rdo::runtime::LPRDOCalc(), - RDOParserSrcInfo() - ) + : Expression( + rdo::Factory::delegate(RDOParserSrcInfo()), + rdo::runtime::LPRDOCalc(), + RDOParserSrcInfo() + ) {} ExpressionEmpty::~ExpressionEmpty() diff --git a/simulator/compiler/parser/expression.h b/simulator/compiler/parser/expression.h index f6f9a4e1d..6b2a50464 100644 --- a/simulator/compiler/parser/expression.h +++ b/simulator/compiler/parser/expression.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_EXPRESSION_H_ -#define _RDOPARSER_EXPRESSION_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,31 +15,31 @@ OPEN_RDO_PARSER_NAMESPACE class ExpressionStatement; PREDECLARE_POINTER(Expression); class Expression - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(Expression); friend class ExpressionStatement; public: - static const std::string CONTEXT_PARAM_SET_EXPRESSION; - static const std::string CONTEXT_PARAM_SET_OPERATION_TYPE; + static const std::string CONTEXT_PARAM_SET_EXPRESSION; + static const std::string CONTEXT_PARAM_SET_OPERATION_TYPE; - const LPTypeInfo& typeInfo () const; - const rdo::runtime::LPRDOCalc& calc () const; - virtual void setSrcInfo(const RDOParserSrcInfo& src_info); + const LPTypeInfo& typeInfo () const; + const rdo::runtime::LPRDOCalc& calc () const; + virtual void setSrcInfo(const RDOParserSrcInfo& src_info); - LPRDOValue constant () const; + LPRDOValue constant () const; protected: - Expression(const LPTypeInfo& pType, const rdo::runtime::LPRDOCalc& pCalc, const RDOParserSrcInfo& src_info); - Expression(const LPRDOValue& pValue); - Expression(const LPExpression& pExpression); - virtual ~Expression(); + Expression(const LPTypeInfo& pType, const rdo::runtime::LPRDOCalc& pCalc, const RDOParserSrcInfo& src_info); + Expression(const LPRDOValue& pValue); + Expression(const LPExpression& pExpression); + virtual ~Expression(); private: - LPTypeInfo m_pType; - LPRDOValue m_pValue; //! < Используется или m_pValue или m_pCalc - rdo::runtime::LPRDOCalc m_pCalc; //! < Более красивое решение: завести парсеровский калк + LPTypeInfo m_pType; + LPRDOValue m_pValue; // Используется или m_pValue или m_pCalc + rdo::runtime::LPRDOCalc m_pCalc; // Более красивое решение: завести парсеровский калк }; // -------------------------------------------------------------------------------- @@ -50,11 +49,9 @@ class ExpressionEmpty: public Expression { DECLARE_FACTORY(ExpressionEmpty); private: - ExpressionEmpty(); - virtual ~ExpressionEmpty(); + ExpressionEmpty(); + virtual ~ExpressionEmpty(); }; DECLARE_POINTER(ExpressionEmpty); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_EXPRESSION_H_ diff --git a/simulator/compiler/parser/grammar/rdo_lexer.l b/simulator/compiler/parser/grammar/rdo_lexer.l index 3e8d4b24f..d812f16c0 100644 --- a/simulator/compiler/parser/grammar/rdo_lexer.l +++ b/simulator/compiler/parser/grammar/rdo_lexer.l @@ -1,13 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdo_lexer.h - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \date 11.06.2006 - \brief Лексика РДО - \indent 4T -*/ - %{ // ---------------------------------------------------------------------------- PCH #include "simulator/compiler/parser/pch.h" @@ -40,11 +30,11 @@ #define YY_INTERACTIVE #define YY_USER_INIT { \ - LEXER->loc_init(); \ + LEXER->loc_init(); \ } #define YY_USER_ACTION { \ - LEXER->loc_action(); \ + LEXER->loc_action(); \ } %} @@ -327,238 +317,238 @@ $sprite return(RDO_Sprite); sprite return(RDO_sprite_call); (\'[^\']*\') { - const std::string n1(YYText()); - const int len = n1.length(); - const std::string name(std::string(n1, 1, len-2)); - rdo::compiler::parser::LPTypeInfo pType = rdo::Factory::delegate( - LEXER->m_lploc - ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, n1) - : rdo::compiler::parser::RDOParserSrcInfo(n1) - ); - ASSERT(pType); - /// @todo TypeInfo, убрать rdo::compiler::parser::RDOParserSrcInfo() - LEXER->setvalue(PARSER->stack().push(rdo::Factory::create(name, pType->src_info(rdo::compiler::parser::RDOParserSrcInfo()), pType))); - return RDO_STRING_CONST; + const std::string n1(YYText()); + const int len = n1.length(); + const std::string name(std::string(n1, 1, len-2)); + rdo::compiler::parser::LPTypeInfo pType = rdo::Factory::delegate( + LEXER->m_lploc + ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, n1) + : rdo::compiler::parser::RDOParserSrcInfo(n1) + ); + ASSERT(pType); + // TODO TypeInfo, убрать rdo::compiler::parser::RDOParserSrcInfo() + LEXER->setvalue(PARSER->stack().push(rdo::Factory::create(name, pType->src_info(rdo::compiler::parser::RDOParserSrcInfo()), pType))); + return RDO_STRING_CONST; } -"/*" BEGIN(comment_cpp); -[^*.]* ; -[^*\n\r]* ; -"*"+"/" BEGIN(INITIAL); +"/*" BEGIN(comment_cpp); +[^*.]* ; +[^*\n\r]* ; +"*"+"/" BEGIN(INITIAL); -"//" BEGIN(comment_line); -[\n\r]+ BEGIN(INITIAL); +"//" BEGIN(comment_line); +[\n\r]+ BEGIN(INITIAL); "*/" { - LEXER->loc_delta_pos(YYLeng()); - PARSER->error().error(rdo::compiler::parser::RDOParserSrcInfo(), "Не найдено начало комментария"); + LEXER->loc_delta_pos(YYLeng()); + PARSER->error().error(rdo::compiler::parser::RDOParserSrcInfo(), "Не найдено начало комментария"); } {WS}+ {} -[#`~@$%^&|:;(),=\[\]\.\*\>\<\+\-\/\\\{\}] return(YYText()[YYLeng()-1]); +[#`~@$%^&|:;(),=\[\]\.\*\>\<\+\-\/\\\{\}] return(YYText()[YYLeng()-1]); [+-]?[[:digit:]]+ { - const std::string yText = YYText(); - - rdo::compiler::parser::RDOParserSrcInfo srcInfo( - LEXER->m_lploc - ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, yText) - : rdo::compiler::parser::RDOParserSrcInfo(yText) - ); - - rdo::compiler::parser::LPTypeInfo pType = rdo::Factory::delegate(srcInfo); - ASSERT(pType); - - /// @todo TypeInfo, убрать rdo::compiler::parser::RDOParserSrcInfo() - int value = 0; - try - { - value = boost::lexical_cast(yText); - } - catch (const boost::bad_lexical_cast&) - { - PARSER->error().error(srcInfo, boost::str(boost::format("Ошибка преобразования числа '%1%'. Возможно, число слишком большое.") % yText) ); - } - LEXER->setvalue(PARSER->stack().push( - rdo::Factory::create( - value, - pType->src_info(rdo::compiler::parser::RDOParserSrcInfo()), - pType - ) - )); - return RDO_INT_CONST; + const std::string yText = YYText(); + + rdo::compiler::parser::RDOParserSrcInfo srcInfo( + LEXER->m_lploc + ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, yText) + : rdo::compiler::parser::RDOParserSrcInfo(yText) + ); + + rdo::compiler::parser::LPTypeInfo pType = rdo::Factory::delegate(srcInfo); + ASSERT(pType); + + // TODO TypeInfo, убрать rdo::compiler::parser::RDOParserSrcInfo() + int value = 0; + try + { + value = boost::lexical_cast(yText); + } + catch (const boost::bad_lexical_cast&) + { + PARSER->error().error(srcInfo, boost::str(boost::format("Ошибка преобразования числа '%1%'. Возможно, число слишком большое.") % yText) ); + } + LEXER->setvalue(PARSER->stack().push( + rdo::Factory::create( + value, + pType->src_info(rdo::compiler::parser::RDOParserSrcInfo()), + pType + ) + )); + return RDO_INT_CONST; } ([+-]?[[:digit:]]+"..") { - const std::string n1(YYText()); - const std::string::size_type pos = n1.find_first_of(".."); - const std::string yText(n1, 0, pos); - unput('.'); - unput('.'); - LEXER->loc_delta_pos(-2); - - rdo::compiler::parser::RDOParserSrcInfo srcInfo( - LEXER->m_lploc - ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, yText) - : rdo::compiler::parser::RDOParserSrcInfo(yText) - ); - - rdo::compiler::parser::LPTypeInfo pType = rdo::Factory::delegate(srcInfo); - ASSERT(pType); - - /// @todo TypeInfo, убрать rdo::compiler::parser::RDOParserSrcInfo() - int value = 0; - try - { - value = boost::lexical_cast(yText); - } - catch (const boost::bad_lexical_cast&) - { - PARSER->error().error(srcInfo, boost::str(boost::format("Ошибка преобразования числа '%1%'. Возможно, число слишком большое.") % yText) ); - } - LEXER->setvalue(PARSER->stack().push( - rdo::Factory::create( - value, - pType->src_info(rdo::compiler::parser::RDOParserSrcInfo()), - pType - ) - )); - return RDO_INT_CONST; + const std::string n1(YYText()); + const std::string::size_type pos = n1.find_first_of(".."); + const std::string yText(n1, 0, pos); + unput('.'); + unput('.'); + LEXER->loc_delta_pos(-2); + + rdo::compiler::parser::RDOParserSrcInfo srcInfo( + LEXER->m_lploc + ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, yText) + : rdo::compiler::parser::RDOParserSrcInfo(yText) + ); + + rdo::compiler::parser::LPTypeInfo pType = rdo::Factory::delegate(srcInfo); + ASSERT(pType); + + // TODO TypeInfo, убрать rdo::compiler::parser::RDOParserSrcInfo() + int value = 0; + try + { + value = boost::lexical_cast(yText); + } + catch (const boost::bad_lexical_cast&) + { + PARSER->error().error(srcInfo, boost::str(boost::format("Ошибка преобразования числа '%1%'. Возможно, число слишком большое.") % yText) ); + } + LEXER->setvalue(PARSER->stack().push( + rdo::Factory::create( + value, + pType->src_info(rdo::compiler::parser::RDOParserSrcInfo()), + pType + ) + )); + return RDO_INT_CONST; } ([+-]?[[:digit:]]+"."[[:digit:]]*([Ee][+-]?[[:digit:]]+)?) { - const std::string yText = YYText(); - - rdo::compiler::parser::RDOParserSrcInfo srcInfo( - LEXER->m_lploc - ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, yText) - : rdo::compiler::parser::RDOParserSrcInfo(yText) - ); - - rdo::compiler::parser::LPTypeInfo pType = rdo::Factory::delegate(srcInfo); - ASSERT(pType); - - /// @todo TypeInfo, убрать rdo::compiler::parser::RDOParserSrcInfo() - double value = 0; - try - { - value = boost::lexical_cast(yText); - } - catch (const boost::bad_lexical_cast&) - { - PARSER->error().error(srcInfo, boost::str(boost::format("Ошибка преобразования числа '%1%'. Возможно, число слишком большое.") % yText) ); - } - LEXER->setvalue(PARSER->stack().push( - rdo::Factory::create( - value, - pType->src_info(rdo::compiler::parser::RDOParserSrcInfo()), - pType - ) - )); - - return RDO_REAL_CONST; + const std::string yText = YYText(); + + rdo::compiler::parser::RDOParserSrcInfo srcInfo( + LEXER->m_lploc + ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, yText) + : rdo::compiler::parser::RDOParserSrcInfo(yText) + ); + + rdo::compiler::parser::LPTypeInfo pType = rdo::Factory::delegate(srcInfo); + ASSERT(pType); + + // TODO TypeInfo, убрать rdo::compiler::parser::RDOParserSrcInfo() + double value = 0; + try + { + value = boost::lexical_cast(yText); + } + catch (const boost::bad_lexical_cast&) + { + PARSER->error().error(srcInfo, boost::str(boost::format("Ошибка преобразования числа '%1%'. Возможно, число слишком большое.") % yText) ); + } + LEXER->setvalue(PARSER->stack().push( + rdo::Factory::create( + value, + pType->src_info(rdo::compiler::parser::RDOParserSrcInfo()), + pType + ) + )); + + return RDO_REAL_CONST; } true { - rdo::compiler::parser::LPTypeInfo pType = rdo::Factory::delegate( - LEXER->m_lploc ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, YYText()) : rdo::compiler::parser::RDOParserSrcInfo(YYText()) - ); - ASSERT(pType); - /// @todo TypeInfo, убрать rdo::compiler::parser::RDOParserSrcInfo() - LEXER->setvalue(PARSER->stack().push(rdo::Factory::create(rdo::runtime::RDOValue(true), pType->src_info(rdo::compiler::parser::RDOParserSrcInfo()), pType))); - return RDO_BOOL_CONST; + rdo::compiler::parser::LPTypeInfo pType = rdo::Factory::delegate( + LEXER->m_lploc ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, YYText()) : rdo::compiler::parser::RDOParserSrcInfo(YYText()) + ); + ASSERT(pType); + // TODO TypeInfo, убрать rdo::compiler::parser::RDOParserSrcInfo() + LEXER->setvalue(PARSER->stack().push(rdo::Factory::create(rdo::runtime::RDOValue(true), pType->src_info(rdo::compiler::parser::RDOParserSrcInfo()), pType))); + return RDO_BOOL_CONST; } false { - rdo::compiler::parser::LPTypeInfo pType = rdo::Factory::delegate( - LEXER->m_lploc ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, YYText()) : rdo::compiler::parser::RDOParserSrcInfo(YYText()) - ); - ASSERT(pType); - /// @todo TypeInfo, убрать rdo::compiler::parser::RDOParserSrcInfo() - LEXER->setvalue(PARSER->stack().push(rdo::Factory::create(rdo::runtime::RDOValue(false), pType->src_info(rdo::compiler::parser::RDOParserSrcInfo()), pType))); - return RDO_BOOL_CONST; + rdo::compiler::parser::LPTypeInfo pType = rdo::Factory::delegate( + LEXER->m_lploc ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, YYText()) : rdo::compiler::parser::RDOParserSrcInfo(YYText()) + ); + ASSERT(pType); + // TODO TypeInfo, убрать rdo::compiler::parser::RDOParserSrcInfo() + LEXER->setvalue(PARSER->stack().push(rdo::Factory::create(rdo::runtime::RDOValue(false), pType->src_info(rdo::compiler::parser::RDOParserSrcInfo()), pType))); + return RDO_BOOL_CONST; } {IDENTIF}{WS}+NoChange{WS}+NoChange { - const std::string n1(YYText()); - const std::string::size_type pos = n1.find_first_of("\r\n\t :"); - const std::string name(n1, 0, pos); - RUNTIME->memory_insert(name.length() + sizeof(std::string)); - rdo::compiler::parser::LPRDOValue pValue; - if (LEXER->m_lploc) - { - YYLTYPE pos = LEXER_POS; - pos.m_last_line = pos.m_first_line; - pos.m_last_pos = pos.m_first_pos + name.length(); - pos.m_last_seek = pos.m_first_seek + name.length(); - pValue = rdo::Factory::create(rdo::compiler::parser::RDOParserSrcInfo(pos, name)); - } - else - { - pValue = rdo::Factory::create(rdo::compiler::parser::RDOParserSrcInfo(name)); - } - ASSERT(pValue); - LEXER->setvalue(PARSER->stack().push(pValue)); - return RDO_IDENTIF_NoChange_NoChange; + const std::string n1(YYText()); + const std::string::size_type pos = n1.find_first_of("\r\n\t :"); + const std::string name(n1, 0, pos); + RUNTIME->memory_insert(name.length() + sizeof(std::string)); + rdo::compiler::parser::LPRDOValue pValue; + if (LEXER->m_lploc) + { + YYLTYPE pos = LEXER_POS; + pos.m_last_line = pos.m_first_line; + pos.m_last_pos = pos.m_first_pos + name.length(); + pos.m_last_seek = pos.m_first_seek + name.length(); + pValue = rdo::Factory::create(rdo::compiler::parser::RDOParserSrcInfo(pos, name)); + } + else + { + pValue = rdo::Factory::create(rdo::compiler::parser::RDOParserSrcInfo(name)); + } + ASSERT(pValue); + LEXER->setvalue(PARSER->stack().push(pValue)); + return RDO_IDENTIF_NoChange_NoChange; } {IDENTIF}{WS}+NoChange { - const std::string n1(YYText()); - const std::string::size_type pos = n1.find_first_of("\r\n\t :"); - const std::string name(n1, 0, pos); - RUNTIME->memory_insert(name.length() + sizeof(std::string)); - rdo::compiler::parser::LPRDOValue pValue; - if (LEXER->m_lploc) - { - YYLTYPE pos = LEXER_POS; - pos.m_last_line = pos.m_first_line; - pos.m_last_pos = pos.m_first_pos + name.length(); - pos.m_last_seek = pos.m_first_seek + name.length(); - pValue = rdo::Factory::create(rdo::compiler::parser::RDOParserSrcInfo(pos, name)); - } - else - { - pValue = rdo::Factory::create(rdo::compiler::parser::RDOParserSrcInfo(name)); - } - ASSERT(pValue); - LEXER->setvalue(PARSER->stack().push(pValue)); - return RDO_IDENTIF_NoChange; + const std::string n1(YYText()); + const std::string::size_type pos = n1.find_first_of("\r\n\t :"); + const std::string name(n1, 0, pos); + RUNTIME->memory_insert(name.length() + sizeof(std::string)); + rdo::compiler::parser::LPRDOValue pValue; + if (LEXER->m_lploc) + { + YYLTYPE pos = LEXER_POS; + pos.m_last_line = pos.m_first_line; + pos.m_last_pos = pos.m_first_pos + name.length(); + pos.m_last_seek = pos.m_first_seek + name.length(); + pValue = rdo::Factory::create(rdo::compiler::parser::RDOParserSrcInfo(pos, name)); + } + else + { + pValue = rdo::Factory::create(rdo::compiler::parser::RDOParserSrcInfo(name)); + } + ASSERT(pValue); + LEXER->setvalue(PARSER->stack().push(pValue)); + return RDO_IDENTIF_NoChange; } {IDENTIF}{WS}*\: { - const std::string n1(YYText()); - const std::string::size_type pos = n1.find_first_of("\r\n\t :"); - const std::string name(n1, 0, pos); - RUNTIME->memory_insert(name.length() + sizeof(std::string)); - rdo::compiler::parser::LPRDOValue pValue; - if (LEXER->m_lploc) - { - YYLTYPE pos = LEXER_POS; - pos.m_last_line = pos.m_first_line; - pos.m_last_pos = pos.m_first_pos + name.length(); - pos.m_last_seek = pos.m_first_seek + name.length(); - pValue = rdo::Factory::create(rdo::compiler::parser::RDOParserSrcInfo(pos, name)); - } - else - { - pValue = rdo::Factory::create(rdo::compiler::parser::RDOParserSrcInfo(name)); - } - ASSERT(pValue); - LEXER->setvalue(PARSER->stack().push(pValue)); - return RDO_IDENTIF_COLON; + const std::string n1(YYText()); + const std::string::size_type pos = n1.find_first_of("\r\n\t :"); + const std::string name(n1, 0, pos); + RUNTIME->memory_insert(name.length() + sizeof(std::string)); + rdo::compiler::parser::LPRDOValue pValue; + if (LEXER->m_lploc) + { + YYLTYPE pos = LEXER_POS; + pos.m_last_line = pos.m_first_line; + pos.m_last_pos = pos.m_first_pos + name.length(); + pos.m_last_seek = pos.m_first_seek + name.length(); + pValue = rdo::Factory::create(rdo::compiler::parser::RDOParserSrcInfo(pos, name)); + } + else + { + pValue = rdo::Factory::create(rdo::compiler::parser::RDOParserSrcInfo(name)); + } + ASSERT(pValue); + LEXER->setvalue(PARSER->stack().push(pValue)); + return RDO_IDENTIF_COLON; } {IDENTIF} { - const std::string name(YYText()); - RUNTIME->memory_insert(name.length() + sizeof(std::string)); + const std::string name(YYText()); + RUNTIME->memory_insert(name.length() + sizeof(std::string)); - LEXER->setvalue(PARSER->stack().push(rdo::Factory::create(LEXER->m_lploc ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, name) : rdo::compiler::parser::RDOParserSrcInfo(name)))); - return RDO_IDENTIF; + LEXER->setvalue(PARSER->stack().push(rdo::Factory::create(LEXER->m_lploc ? rdo::compiler::parser::RDOParserSrcInfo(LEXER_POS, name) : rdo::compiler::parser::RDOParserSrcInfo(name)))); + return RDO_IDENTIF; } %% diff --git a/simulator/compiler/parser/grammar/rdobison.h b/simulator/compiler/parser/grammar/rdobison.h index 75612d850..a8fa967af 100644 --- a/simulator/compiler/parser/grammar/rdobison.h +++ b/simulator/compiler/parser/grammar/rdobison.h @@ -1,5 +1,4 @@ -#ifndef _RDOBISON_H_ -#define _RDOBISON_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -18,14 +17,14 @@ typedef int YYSTYPE; struct yyltype { - std::size_t m_first_line; - std::size_t m_first_pos; + std::size_t m_first_line; + std::size_t m_first_pos; - std::size_t m_last_line; - std::size_t m_last_pos; + std::size_t m_last_line; + std::size_t m_last_pos; - std::size_t m_first_seek; - std::size_t m_last_seek; + std::size_t m_first_seek; + std::size_t m_last_seek; }; #define YYLTYPE yyltype @@ -34,26 +33,24 @@ struct yyltype #endif #define YYLLOC_DEFAULT(Current, Rhs, N) \ - do { \ - if (N) \ - { \ - (Current).m_first_line = YYRHSLOC(Rhs, 1).m_first_line; \ - (Current).m_first_pos = YYRHSLOC(Rhs, 1).m_first_pos; \ - (Current).m_first_seek = YYRHSLOC(Rhs, 1).m_first_seek; \ - (Current).m_last_line = YYRHSLOC(Rhs, N).m_last_line; \ - (Current).m_last_pos = YYRHSLOC(Rhs, N).m_last_pos; \ - (Current).m_last_seek = YYRHSLOC(Rhs, N).m_last_seek; \ - } \ - else \ - { \ - (Current).m_first_line = YYRHSLOC(Rhs, 0).m_last_line; \ - (Current).m_last_line = YYRHSLOC(Rhs, 0).m_last_line; \ - (Current).m_first_pos = YYRHSLOC(Rhs, 0).m_last_pos; \ - (Current).m_last_pos = YYRHSLOC(Rhs, 0).m_last_pos; \ - (Current).m_first_seek = YYRHSLOC(Rhs, 0).m_last_seek; \ - (Current).m_last_seek = YYRHSLOC(Rhs, 0).m_last_seek; \ - } \ - } \ - while (0) - -#endif // _RDOBISON_H_ + do { \ + if (N) \ + { \ + (Current).m_first_line = YYRHSLOC(Rhs, 1).m_first_line; \ + (Current).m_first_pos = YYRHSLOC(Rhs, 1).m_first_pos; \ + (Current).m_first_seek = YYRHSLOC(Rhs, 1).m_first_seek; \ + (Current).m_last_line = YYRHSLOC(Rhs, N).m_last_line; \ + (Current).m_last_pos = YYRHSLOC(Rhs, N).m_last_pos; \ + (Current).m_last_seek = YYRHSLOC(Rhs, N).m_last_seek; \ + } \ + else \ + { \ + (Current).m_first_line = YYRHSLOC(Rhs, 0).m_last_line; \ + (Current).m_last_line = YYRHSLOC(Rhs, 0).m_last_line; \ + (Current).m_first_pos = YYRHSLOC(Rhs, 0).m_last_pos; \ + (Current).m_last_pos = YYRHSLOC(Rhs, 0).m_last_pos; \ + (Current).m_first_seek = YYRHSLOC(Rhs, 0).m_last_seek; \ + (Current).m_last_seek = YYRHSLOC(Rhs, 0).m_last_seek; \ + } \ + } \ + while (0) diff --git a/simulator/compiler/parser/grammar/rdoevn.yx b/simulator/compiler/parser/grammar/rdoevn.yx index 528c86318..3d691a691 100644 --- a/simulator/compiler/parser/grammar/rdoevn.yx +++ b/simulator/compiler/parser/grammar/rdoevn.yx @@ -1,16 +1,3 @@ -/*! - \copyright (c) RDO-Team, 2011 - \file rdoevn.yx - \authors Барс Александр - \authors Урусов Андрей (rdo@rk9.bmstu.ru) - \authors Лущан Дмитрий (dluschan@rk9.bmstu.ru) - \authors Поподьянец Евгений (kurt.gigacore@gmail.com) - \authors Александровский Кирилл (k.alexandrovsky@gmail.com) - \date 18.10.2013 - \brief Синтаксис компилятора РДО - \indent 4T -*/ - %{ #define YYPARSE_PARAM lexer #define YYLEX_PARAM lexer @@ -299,22 +286,22 @@ typedef rdo::runtime::LPRDOFRMSpace LPRDOFRMSpace; // -------------------- Список компиляторов РДО // -------------------------------------------------------------------------------- rdo_compiler - : /* empty */ - | rtp_main rdo_compiler - | rss_main rdo_compiler - | pat_main rdo_compiler - | dpt_main rdo_compiler - | prc_main rdo_compiler - | frm_main rdo_compiler - | fun_main rdo_compiler - | pmd_main rdo_compiler - | smr_main rdo_compiler - | smr_descr rdo_compiler - | error - { - PARSER->error().error(RDOParserSrcInfo(), "Синтаксическая ошибка"); - } - ; + : /* empty */ + | rtp_main rdo_compiler + | rss_main rdo_compiler + | pat_main rdo_compiler + | dpt_main rdo_compiler + | prc_main rdo_compiler + | frm_main rdo_compiler + | fun_main rdo_compiler + | pmd_main rdo_compiler + | smr_main rdo_compiler + | smr_descr rdo_compiler + | error + { + PARSER->error().error(RDOParserSrcInfo(), "Синтаксическая ошибка"); + } + ; // -------------------------------------------------------------------------------- // -------------------- Синтаксис типов ресурсов @@ -322,543 +309,543 @@ rdo_compiler // -------------------- Описание типов ресурсов // -------------------------------------------------------------------------------- rtp_main - : rtp_res_type - | ext_param_type - ; + : rtp_res_type + | ext_param_type + ; ext_param_type - : RDO_typedef RDO_enum ext_par_type_enum - ; + : RDO_typedef RDO_enum ext_par_type_enum + ; ext_par_type_enum - : type_declaration_enum RDO_IDENTIF - { - #PASS1 - { - LPTypeInfo pType = PARSER->stack().pop($1); - ASSERT(pType); - $$ = PARSER->stack().push(pType); - } - } - ; + : type_declaration_enum RDO_IDENTIF + { + #PASS1 + { + LPTypeInfo pType = PARSER->stack().pop($1); + ASSERT(pType); + $$ = PARSER->stack().push(pType); + } + } + ; rtp_res_type - : rtp_header RDO_Parameters rtp_body RDO_End - { - #PASS1 - { - LPRDORTPResType pResourceType = PARSER->stack().pop($1); - ASSERT(pResourceType); - if (pResourceType->getParams().empty()) - { - PARSER->error().warning(@2, rdo::format("Тип ресурса '%s' не содежит параметров", pResourceType->name().c_str())); - } - } - } - | rtp_header RDO_Parameters rtp_body - { - #PASS1 - { - PARSER->error().error(@2, "Не найдено ключевое слово $End"); - } - } - | rtp_header error - { - #PASS1 - { - PARSER->error().error(@2, "Не найдено ключевое слово $Parameters"); - } - } - ; + : rtp_header RDO_Parameters rtp_body RDO_End + { + #PASS1 + { + LPRDORTPResType pResourceType = PARSER->stack().pop($1); + ASSERT(pResourceType); + if (pResourceType->getParams().empty()) + { + PARSER->error().warning(@2, rdo::format("Тип ресурса '%s' не содежит параметров", pResourceType->name().c_str())); + } + } + } + | rtp_header RDO_Parameters rtp_body + { + #PASS1 + { + PARSER->error().error(@2, "Не найдено ключевое слово $End"); + } + } + | rtp_header error + { + #PASS1 + { + PARSER->error().error(@2, "Не найдено ключевое слово $Parameters"); + } + } + ; rtp_header - : RDO_Resource_type RDO_IDENTIF_COLON rtp_vid_res - { - #PASS1 - { - LEXER->enumReset(); - - LPRDOValue pTypeName = PARSER->stack().pop($2); - ASSERT(pTypeName); - - const std::string name = pTypeName->value().getIdentificator(); - LPRDORTPResType pRTP = PARSER->findRTPResType(name); - if (pRTP) - { - PARSER->error().push_only(pTypeName->src_info(), rdo::format("Тип ресурса уже существует: %s", name.c_str())); - PARSER->error().push_only(pRTP->src_info(), "См. первое определение"); - PARSER->error().push_done(); - } - - LPRDORTPResType pResourceType = rdo::Factory::create(PARSER, pTypeName->src_info(), $3 != 0); - ASSERT(pResourceType); - $$ = PARSER->stack().push(pResourceType); - } - } - | RDO_Resource_type RDO_IDENTIF_COLON RDO_IDENTIF_COLON rtp_vid_res - { - #PASS1 - { - LEXER->enumReset(); - - LPRDOValue pTypeName = PARSER->stack().pop($2); - ASSERT(pTypeName); - - const std::string name = pTypeName->value().getIdentificator(); - LPRDORTPResType pRTP = PARSER->findRTPResType(name); - if (pRTP) - { - PARSER->error().push_only(pTypeName->src_info(), rdo::format("Тип ресурса уже существует: %s", name.c_str())); - PARSER->error().push_only(pRTP->src_info(), "См. первое определение"); - PARSER->error().push_done(); - } - - LPRDOValue pParentTypeName = PARSER->stack().pop($3); - ASSERT(pParentTypeName); - - const std::string prnt_name = pParentTypeName->value().getIdentificator(); - LPRDORTPResType pParentRTP = PARSER->findRTPResType(prnt_name); - if (pParentRTP) - { - LPRDORTPResType pResourceType = rdo::Factory::create(PARSER, pTypeName->src_info(), $4 != 0); - ASSERT(pResourceType); - std::size_t t_ind = 0; - const std::size_t col_par = pParentRTP->getParams().size(); - while (t_ind < col_par) - { - pResourceType->addParam(pParentRTP->getParams()[t_ind]); - PARSER->error().warning(pParentRTP->getParams()[t_ind]->src_info(), rdo::format("Параметр %s передан от родителя %s потомку %s", pParentRTP->getParams()[t_ind]->src_info().src_text().c_str(), prnt_name.c_str(), name.c_str())); - t_ind++; - } - $$ = PARSER->stack().push(pResourceType); - PARSER->error().warning(@2, rdo::format("Тип ресурса %s является потомком типа ресурса %s", name.c_str(), prnt_name.c_str())); - } - else - { - PARSER->error().push_only(@3, rdo::format("Родительский тип ресурса не существует: %s", prnt_name.c_str())); - PARSER->error().push_done(); - } - } - } - | RDO_Resource_type RDO_IDENTIF_COLON error - { - #PASS1 - { - PARSER->error().error(@2, "Не указан вид ресурса"); - } - } - | RDO_Resource_type RDO_IDENTIF_COLON RDO_IDENTIF_COLON error - { - #PASS1 - { - PARSER->error().error(@3, "Не указан вид ресурса"); - } - } - | RDO_Resource_type error - { - #PASS1 - { - const std::string str(LEXER->YYText()); - PARSER->error().error(@2, rdo::format("Ошибка в описании имени типа ресурса: %s", str.c_str())); - } - } - ; + : RDO_Resource_type RDO_IDENTIF_COLON rtp_vid_res + { + #PASS1 + { + LEXER->enumReset(); + + LPRDOValue pTypeName = PARSER->stack().pop($2); + ASSERT(pTypeName); + + const std::string name = pTypeName->value().getIdentificator(); + LPRDORTPResType pRTP = PARSER->findRTPResType(name); + if (pRTP) + { + PARSER->error().push_only(pTypeName->src_info(), rdo::format("Тип ресурса уже существует: %s", name.c_str())); + PARSER->error().push_only(pRTP->src_info(), "См. первое определение"); + PARSER->error().push_done(); + } + + LPRDORTPResType pResourceType = rdo::Factory::create(PARSER, pTypeName->src_info(), $3 != 0); + ASSERT(pResourceType); + $$ = PARSER->stack().push(pResourceType); + } + } + | RDO_Resource_type RDO_IDENTIF_COLON RDO_IDENTIF_COLON rtp_vid_res + { + #PASS1 + { + LEXER->enumReset(); + + LPRDOValue pTypeName = PARSER->stack().pop($2); + ASSERT(pTypeName); + + const std::string name = pTypeName->value().getIdentificator(); + LPRDORTPResType pRTP = PARSER->findRTPResType(name); + if (pRTP) + { + PARSER->error().push_only(pTypeName->src_info(), rdo::format("Тип ресурса уже существует: %s", name.c_str())); + PARSER->error().push_only(pRTP->src_info(), "См. первое определение"); + PARSER->error().push_done(); + } + + LPRDOValue pParentTypeName = PARSER->stack().pop($3); + ASSERT(pParentTypeName); + + const std::string prnt_name = pParentTypeName->value().getIdentificator(); + LPRDORTPResType pParentRTP = PARSER->findRTPResType(prnt_name); + if (pParentRTP) + { + LPRDORTPResType pResourceType = rdo::Factory::create(PARSER, pTypeName->src_info(), $4 != 0); + ASSERT(pResourceType); + std::size_t t_ind = 0; + const std::size_t col_par = pParentRTP->getParams().size(); + while (t_ind < col_par) + { + pResourceType->addParam(pParentRTP->getParams()[t_ind]); + PARSER->error().warning(pParentRTP->getParams()[t_ind]->src_info(), rdo::format("Параметр %s передан от родителя %s потомку %s", pParentRTP->getParams()[t_ind]->src_info().src_text().c_str(), prnt_name.c_str(), name.c_str())); + t_ind++; + } + $$ = PARSER->stack().push(pResourceType); + PARSER->error().warning(@2, rdo::format("Тип ресурса %s является потомком типа ресурса %s", name.c_str(), prnt_name.c_str())); + } + else + { + PARSER->error().push_only(@3, rdo::format("Родительский тип ресурса не существует: %s", prnt_name.c_str())); + PARSER->error().push_done(); + } + } + } + | RDO_Resource_type RDO_IDENTIF_COLON error + { + #PASS1 + { + PARSER->error().error(@2, "Не указан вид ресурса"); + } + } + | RDO_Resource_type RDO_IDENTIF_COLON RDO_IDENTIF_COLON error + { + #PASS1 + { + PARSER->error().error(@3, "Не указан вид ресурса"); + } + } + | RDO_Resource_type error + { + #PASS1 + { + const std::string str(LEXER->YYText()); + PARSER->error().error(@2, rdo::format("Ошибка в описании имени типа ресурса: %s", str.c_str())); + } + } + ; rtp_vid_res - : RDO_permanent - { - #PASS1 - { - $$ = 1; - } - } - | RDO_temporary - { - #PASS1 - { - $$ = 0; - } - } - ; + : RDO_permanent + { + #PASS1 + { + $$ = 1; + } + } + | RDO_temporary + { + #PASS1 + { + $$ = 0; + } + } + ; rtp_body - : /* empty */ - | rtp_body rtp_param - { - #PASS1 - { - LPRDORTPParam pParam = PARSER->stack().pop($2); - PARSER->getLastRTPResType()->addParam(pParam); - } - } - ; + : /* empty */ + | rtp_body rtp_param + { + #PASS1 + { + LPRDORTPParam pParam = PARSER->stack().pop($2); + PARSER->getLastRTPResType()->addParam(pParam); + } + } + ; rtp_param - : RDO_IDENTIF_COLON type_declaration param_value_default - { - #PASS1 - { - LPRDOValue pParamName = PARSER->stack().pop($1); - LPTypeInfo pParamType = PARSER->stack().pop($2); - LPRDOValue pDefault = PARSER->stack().pop($3); - ASSERT(pParamName); - ASSERT(pParamType); - ASSERT(pDefault ); - - if (!pDefault->defined()) - { - LPRDOTypeParamSuchAs pTypeSuchAs = pParamType.object_dynamic_cast(); - if (pTypeSuchAs) - { - pDefault = pTypeSuchAs->getParam()->getDefault(); - } - } - - LPRDORTPParam pParam = rdo::Factory::create(pParamType, pDefault, pParamName->src_info()); - ASSERT(pParam); - $$ = PARSER->stack().push(pParam); - } - } - | RDO_IDENTIF_COLON error - { - #PASS1 - { - if (PARSER->lexer_loc_line() == @1.m_last_line) - { - const std::string str(LEXER->YYText()); - PARSER->error().error(@2, rdo::format("Неверный тип параметра: %s", str.c_str())); - } - else - { - PARSER->error().error(@1, "Ожидается тип параметра"); - } - } - } - | error - { - #PASS1 - { - PARSER->error().error(@1, "Неправильное описание параметра"); - } - } - ; + : RDO_IDENTIF_COLON type_declaration param_value_default + { + #PASS1 + { + LPRDOValue pParamName = PARSER->stack().pop($1); + LPTypeInfo pParamType = PARSER->stack().pop($2); + LPRDOValue pDefault = PARSER->stack().pop($3); + ASSERT(pParamName); + ASSERT(pParamType); + ASSERT(pDefault ); + + if (!pDefault->defined()) + { + LPRDOTypeParamSuchAs pTypeSuchAs = pParamType.object_dynamic_cast(); + if (pTypeSuchAs) + { + pDefault = pTypeSuchAs->getParam()->getDefault(); + } + } + + LPRDORTPParam pParam = rdo::Factory::create(pParamType, pDefault, pParamName->src_info()); + ASSERT(pParam); + $$ = PARSER->stack().push(pParam); + } + } + | RDO_IDENTIF_COLON error + { + #PASS1 + { + if (PARSER->lexer_loc_line() == @1.m_last_line) + { + const std::string str(LEXER->YYText()); + PARSER->error().error(@2, rdo::format("Неверный тип параметра: %s", str.c_str())); + } + else + { + PARSER->error().error(@1, "Ожидается тип параметра"); + } + } + } + | error + { + #PASS1 + { + PARSER->error().error(@1, "Неправильное описание параметра"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Описание типа параметра // -------------------------------------------------------------------------------- type_declaration_context - : type_declaration - { - #PASS2 - { - LPTypeInfo pType = PARSER->stack().pop($1); - ASSERT(pType); - - LPContext pTypeContext = rdo::Factory::create(pType); - ASSERT(pTypeContext); - PARSER->contextStack()->push(pTypeContext); - } - } - ; + : type_declaration + { + #PASS2 + { + LPTypeInfo pType = PARSER->stack().pop($1); + ASSERT(pType); + + LPContext pTypeContext = rdo::Factory::create(pType); + ASSERT(pTypeContext); + PARSER->contextStack()->push(pTypeContext); + } + } + ; type_declaration - : RDO_integer param_type_range - { - LPRDOTypeRangeRange pRange = PARSER->stack().pop($2); - LPTypeInfo pType; - if (pRange) - { - if (pRange->getMin()->typeID() != rdo::runtime::RDOType::t_int || - pRange->getMax()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, "Диапазон целого типа должен быть целочисленным"); - } - LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); - ASSERT(pIntRange); - pType = rdo::Factory::create(pIntRange, RDOParserSrcInfo(@1, @2)); - } - else - { - pType = rdo::Factory::delegate(RDOParserSrcInfo(@1, @2)); - } - ASSERT(pType); - $$ = PARSER->stack().push(pType); - } - | RDO_real param_type_range - { - LPRDOTypeRangeRange pRange = PARSER->stack().pop($2); - LPTypeInfo pType; - if (pRange) - { - LPRDOTypeRealRange pRealRange = rdo::Factory::create(pRange); - ASSERT(pRealRange); - pType = rdo::Factory::create(pRealRange, RDOParserSrcInfo(@1, @2)); - } - else - { - pType = rdo::Factory::delegate(RDOParserSrcInfo(@1, @2)); - } - ASSERT(pType); - $$ = PARSER->stack().push(pType); - } - | RDO_string - { - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); - ASSERT(pType); - $$ = PARSER->stack().push(pType); - } - | type_declaration_array - { - LPRDOArrayType pArray = PARSER->stack().pop($1); - ASSERT(pArray); - - LPTypeInfo pType = rdo::Factory::create(pArray, RDOParserSrcInfo(@1)); - ASSERT(pType); - $$ = PARSER->stack().push(pType); - } - | RDO_bool - { - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); - ASSERT(pType); - $$ = PARSER->stack().push(pType); - } - | type_declaration_enum - { - LEXER->enumReset(); - LPRDOEnumType pEnum = PARSER->stack().pop($1); - ASSERT(pEnum); - - LPTypeInfo pType = rdo::Factory::create(pEnum, RDOParserSrcInfo(@1)); - ASSERT(pType); - $$ = PARSER->stack().push(pType); - } - | RDO_IDENTIF - { - LPRDOValue pValue = PARSER->stack().pop($1); - ASSERT(pValue); - - LPContext pContext = RDOParser::s_parser()->context(); - ASSERT(pContext); - - Context::Params params; - params[Context::Params::IDENTIFIER] = pValue->value().getIdentificator(); - Context::LPFindResult result = pContext->find(Context::METHOD_TYPE_OF, params, pValue->src_info()); - ASSERT(result->getCreateExpression()); - - LPExpression pExpression = result->getCreateExpression()(); - ASSERT(pExpression); - $$ = PARSER->stack().push(pExpression->typeInfo()); - } - | type_declaration_such_as - ; + : RDO_integer param_type_range + { + LPRDOTypeRangeRange pRange = PARSER->stack().pop($2); + LPTypeInfo pType; + if (pRange) + { + if (pRange->getMin()->typeID() != rdo::runtime::RDOType::Type::INT || + pRange->getMax()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, "Диапазон целого типа должен быть целочисленным"); + } + LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); + ASSERT(pIntRange); + pType = rdo::Factory::create(pIntRange, RDOParserSrcInfo(@1, @2)); + } + else + { + pType = rdo::Factory::delegate(RDOParserSrcInfo(@1, @2)); + } + ASSERT(pType); + $$ = PARSER->stack().push(pType); + } + | RDO_real param_type_range + { + LPRDOTypeRangeRange pRange = PARSER->stack().pop($2); + LPTypeInfo pType; + if (pRange) + { + LPRDOTypeRealRange pRealRange = rdo::Factory::create(pRange); + ASSERT(pRealRange); + pType = rdo::Factory::create(pRealRange, RDOParserSrcInfo(@1, @2)); + } + else + { + pType = rdo::Factory::delegate(RDOParserSrcInfo(@1, @2)); + } + ASSERT(pType); + $$ = PARSER->stack().push(pType); + } + | RDO_string + { + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); + ASSERT(pType); + $$ = PARSER->stack().push(pType); + } + | type_declaration_array + { + LPRDOArrayType pArray = PARSER->stack().pop($1); + ASSERT(pArray); + + LPTypeInfo pType = rdo::Factory::create(pArray, RDOParserSrcInfo(@1)); + ASSERT(pType); + $$ = PARSER->stack().push(pType); + } + | RDO_bool + { + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); + ASSERT(pType); + $$ = PARSER->stack().push(pType); + } + | type_declaration_enum + { + LEXER->enumReset(); + LPRDOEnumType pEnum = PARSER->stack().pop($1); + ASSERT(pEnum); + + LPTypeInfo pType = rdo::Factory::create(pEnum, RDOParserSrcInfo(@1)); + ASSERT(pType); + $$ = PARSER->stack().push(pType); + } + | RDO_IDENTIF + { + LPRDOValue pValue = PARSER->stack().pop($1); + ASSERT(pValue); + + LPContext pContext = RDOParser::s_parser()->context(); + ASSERT(pContext); + + Context::Params params; + params[Context::Params::IDENTIFIER] = pValue->value().getIdentificator(); + Context::LPFindResult result = pContext->find(Context::METHOD_TYPE_OF, params, pValue->src_info()); + ASSERT(result->getCreateExpression()); + + LPExpression pExpression = result->getCreateExpression()(); + ASSERT(pExpression); + $$ = PARSER->stack().push(pExpression->typeInfo()); + } + | type_declaration_such_as + ; param_type_range - : /* empty */ - { - $$ = PARSER->stack().push(LPRDOTypeRangeRange()); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(PARSER->stack().pop($2), PARSER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = PARSER->stack().push(pRange); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(PARSER->stack().pop($2), PARSER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = PARSER->stack().push(pRange); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(PARSER->stack().pop($2), PARSER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = PARSER->stack().push(pRange); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST ']' - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(PARSER->stack().pop($2), PARSER->stack().pop($4), RDOParserSrcInfo(@1, @5)); - ASSERT(pRange); - pRange->checkRange(); - $$ = PARSER->stack().push(pRange); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST error - { - PARSER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST error - { - PARSER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST error - { - PARSER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST error - { - PARSER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_REAL_CONST RDO_dblpoint error - { - PARSER->error().error(@4, "Диапазон задан неверно"); - } - | '[' RDO_INT_CONST RDO_dblpoint error - { - PARSER->error().error(@4, "Диапазон задан неверно"); - } - | '[' error - { - PARSER->error().error(@2, "Диапазон задан неверно"); - } - ; + : /* empty */ + { + $$ = PARSER->stack().push(LPRDOTypeRangeRange()); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(PARSER->stack().pop($2), PARSER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = PARSER->stack().push(pRange); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(PARSER->stack().pop($2), PARSER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = PARSER->stack().push(pRange); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(PARSER->stack().pop($2), PARSER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = PARSER->stack().push(pRange); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST ']' + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(PARSER->stack().pop($2), PARSER->stack().pop($4), RDOParserSrcInfo(@1, @5)); + ASSERT(pRange); + pRange->checkRange(); + $$ = PARSER->stack().push(pRange); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_REAL_CONST error + { + PARSER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_REAL_CONST RDO_dblpoint RDO_INT_CONST error + { + PARSER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_REAL_CONST error + { + PARSER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_INT_CONST RDO_dblpoint RDO_INT_CONST error + { + PARSER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_REAL_CONST RDO_dblpoint error + { + PARSER->error().error(@4, "Диапазон задан неверно"); + } + | '[' RDO_INT_CONST RDO_dblpoint error + { + PARSER->error().error(@4, "Диапазон задан неверно"); + } + | '[' error + { + PARSER->error().error(@2, "Диапазон задан неверно"); + } + ; type_declaration_enum - : '(' param_type_enum_list ')' - { - LPRDOEnumType pEnum = PARSER->stack().pop($2); - ASSERT(pEnum); - $$ = PARSER->stack().push(pEnum); - } - | '(' param_type_enum_list error - { - PARSER->error().error(@2, "Перечисление должно заканчиваться скобкой"); - } - ; + : '(' param_type_enum_list ')' + { + LPRDOEnumType pEnum = PARSER->stack().pop($2); + ASSERT(pEnum); + $$ = PARSER->stack().push(pEnum); + } + | '(' param_type_enum_list error + { + PARSER->error().error(@2, "Перечисление должно заканчиваться скобкой"); + } + ; param_type_enum_list - : RDO_IDENTIF - { - LPRDOEnumType pEnum = rdo::Factory::create(); - ASSERT(pEnum); - pEnum->add(PARSER->stack().pop($1)); - LEXER->enumBegin(); - $$ = PARSER->stack().push(pEnum); - } - | param_type_enum_list ',' RDO_IDENTIF - { - if (!LEXER->enumEmpty()) - { - LPRDOEnumType pEnum = PARSER->stack().pop($1); - ASSERT(pEnum); - LPRDOValue pValue = PARSER->stack().pop($3); - ASSERT(pValue); - pEnum->add(pValue); - $$ = PARSER->stack().push(pEnum); - } - else - { - PARSER->error().error(@3, "Ошибка в описании значений перечислимого типа"); - } - } - | param_type_enum_list RDO_IDENTIF - { - if (!LEXER->enumEmpty()) - { - LPRDOEnumType pEnum = PARSER->stack().pop($1); - ASSERT(pEnum); - LPRDOValue pValue = PARSER->stack().pop($2); - ASSERT(pValue); - pEnum->add(pValue); - $$ = PARSER->stack().push(pEnum); - PARSER->error().warning(@1, rdo::format("Пропущена запятая перед: %s", pValue->value().getIdentificator().c_str())); - } - else - { - PARSER->error().error(@2, "Ошибка в описании значений перечислимого типа"); - } - } - | param_type_enum_list ',' RDO_INT_CONST - { - PARSER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); - } - | param_type_enum_list ',' RDO_REAL_CONST - { - PARSER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); - } - | param_type_enum_list RDO_INT_CONST - { - PARSER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); - } - | param_type_enum_list RDO_REAL_CONST - { - PARSER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); - } - | RDO_INT_CONST - { - PARSER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); - } - | RDO_REAL_CONST - { - PARSER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); - } - ; + : RDO_IDENTIF + { + LPRDOEnumType pEnum = rdo::Factory::create(); + ASSERT(pEnum); + pEnum->add(PARSER->stack().pop($1)); + LEXER->enumBegin(); + $$ = PARSER->stack().push(pEnum); + } + | param_type_enum_list ',' RDO_IDENTIF + { + if (!LEXER->enumEmpty()) + { + LPRDOEnumType pEnum = PARSER->stack().pop($1); + ASSERT(pEnum); + LPRDOValue pValue = PARSER->stack().pop($3); + ASSERT(pValue); + pEnum->add(pValue); + $$ = PARSER->stack().push(pEnum); + } + else + { + PARSER->error().error(@3, "Ошибка в описании значений перечислимого типа"); + } + } + | param_type_enum_list RDO_IDENTIF + { + if (!LEXER->enumEmpty()) + { + LPRDOEnumType pEnum = PARSER->stack().pop($1); + ASSERT(pEnum); + LPRDOValue pValue = PARSER->stack().pop($2); + ASSERT(pValue); + pEnum->add(pValue); + $$ = PARSER->stack().push(pEnum); + PARSER->error().warning(@1, rdo::format("Пропущена запятая перед: %s", pValue->value().getIdentificator().c_str())); + } + else + { + PARSER->error().error(@2, "Ошибка в описании значений перечислимого типа"); + } + } + | param_type_enum_list ',' RDO_INT_CONST + { + PARSER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); + } + | param_type_enum_list ',' RDO_REAL_CONST + { + PARSER->error().error(@3, "Значение перечислимого типа не может быть цифрой"); + } + | param_type_enum_list RDO_INT_CONST + { + PARSER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); + } + | param_type_enum_list RDO_REAL_CONST + { + PARSER->error().error(@2, "Значение перечислимого типа не может быть цифрой"); + } + | RDO_INT_CONST + { + PARSER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); + } + | RDO_REAL_CONST + { + PARSER->error().error(@1, "Значение перечислимого типа не может начинаться с цифры"); + } + ; type_declaration_such_as - : RDO_such_as RDO_IDENTIF '.' RDO_IDENTIF - { - const std::string type = PARSER->stack().pop($2)->value().getIdentificator(); - const std::string param = PARSER->stack().pop($4)->value().getIdentificator(); - LPRDORTPResType pResType = PARSER->findRTPResType(type); - if (!pResType) - { - PARSER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); - } - LPRDORTPParam pRTPParam = pResType->findRTPParam(param); - if (!pRTPParam) - { - PARSER->error().error(@4, rdo::format("Ссылка на неизвестный параметр ресурса: %s.%s", type.c_str(), param.c_str())); - } - LPRDOParam pParam = pRTPParam.object_parent_cast(); - ASSERT(pParam); - LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); - ASSERT(pTypeSuchAs); - $$ = PARSER->stack().push(pTypeSuchAs); - } - | RDO_such_as RDO_IDENTIF - { - const std::string constName = PARSER->stack().pop($2)->value().getIdentificator(); - LPRDOFUNConstant pConstant = PARSER->findFUNConstant(constName); - if (!pConstant) - { - PARSER->error().error(@2, rdo::format("Ссылка на несуществующую константу: %s", constName.c_str())); - } - LPRDOParam pParam = pConstant.object_parent_cast(); - ASSERT(pParam); - LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); - ASSERT(pTypeSuchAs); - $$ = PARSER->stack().push(pTypeSuchAs); - } - | RDO_such_as RDO_IDENTIF '.' error - { - const std::string type = PARSER->stack().pop($2)->value().getIdentificator(); - LPRDORTPResType pResType = PARSER->findRTPResType(type); - if (!pResType) - { - PARSER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); - } - else - { - PARSER->error().error(@4, "Ошибка при указании параметра"); - } - } - | RDO_such_as error - { - PARSER->error().error(@2, "После ключевого слова such_as необходимо указать тип и параметер ресурса для ссылки"); - } - ; + : RDO_such_as RDO_IDENTIF '.' RDO_IDENTIF + { + const std::string type = PARSER->stack().pop($2)->value().getIdentificator(); + const std::string param = PARSER->stack().pop($4)->value().getIdentificator(); + LPRDORTPResType pResType = PARSER->findRTPResType(type); + if (!pResType) + { + PARSER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); + } + LPRDORTPParam pRTPParam = pResType->findRTPParam(param); + if (!pRTPParam) + { + PARSER->error().error(@4, rdo::format("Ссылка на неизвестный параметр ресурса: %s.%s", type.c_str(), param.c_str())); + } + LPRDOParam pParam = pRTPParam.object_parent_cast(); + ASSERT(pParam); + LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); + ASSERT(pTypeSuchAs); + $$ = PARSER->stack().push(pTypeSuchAs); + } + | RDO_such_as RDO_IDENTIF + { + const std::string constName = PARSER->stack().pop($2)->value().getIdentificator(); + LPRDOFUNConstant pConstant = PARSER->findFUNConstant(constName); + if (!pConstant) + { + PARSER->error().error(@2, rdo::format("Ссылка на несуществующую константу: %s", constName.c_str())); + } + LPRDOParam pParam = pConstant.object_parent_cast(); + ASSERT(pParam); + LPRDOTypeParamSuchAs pTypeSuchAs = rdo::Factory::create(pParam); + ASSERT(pTypeSuchAs); + $$ = PARSER->stack().push(pTypeSuchAs); + } + | RDO_such_as RDO_IDENTIF '.' error + { + const std::string type = PARSER->stack().pop($2)->value().getIdentificator(); + LPRDORTPResType pResType = PARSER->findRTPResType(type); + if (!pResType) + { + PARSER->error().error(@2, rdo::format("Ссылка на неизвестный тип ресурса: %s", type.c_str())); + } + else + { + PARSER->error().error(@4, "Ошибка при указании параметра"); + } + } + | RDO_such_as error + { + PARSER->error().error(@2, "После ключевого слова such_as необходимо указать тип и параметер ресурса для ссылки"); + } + ; type_declaration_array - : RDO_array '<' type_declaration '>' - { - LPTypeInfo pParamType = PARSER->stack().pop($3); - ASSERT(pParamType); - LPRDOArrayType pArray = rdo::Factory::create(pParamType, RDOParserSrcInfo(@1, @4)); - $$ = PARSER->stack().push(pArray); - } - ; + : RDO_array '<' type_declaration '>' + { + LPTypeInfo pParamType = PARSER->stack().pop($3); + ASSERT(pParamType); + LPRDOArrayType pArray = rdo::Factory::create(pParamType, RDOParserSrcInfo(@1, @4)); + $$ = PARSER->stack().push(pArray); + } + ; // -------------------------------------------------------------------------------- // -------------------- Синтаксис ресурсов @@ -866,251 +853,251 @@ type_declaration_array // -------------------- Описание ресурсов // -------------------------------------------------------------------------------- rss_main - : RDO_Resources rss_resource_list RDO_End - | RDO_Resources rss_resource_list - { - #PASS2 - { - PARSER->error().error(@2, "После описания всех ресурсов ожидается ключевое слово $End"); - } - } - ; + : RDO_Resources rss_resource_list RDO_End + | RDO_Resources rss_resource_list + { + #PASS2 + { + PARSER->error().error(@2, "После описания всех ресурсов ожидается ключевое слово $End"); + } + } + ; rss_resource_list - : /* empty */ - | rss_resource_list rss_resource ';' - | rss_resource_list rss_resource error - { - #PASS2 - { - PARSER->error().error(@2, rdo::format("Пропущена ';'")); - } - } - ; + : /* empty */ + | rss_resource_list rss_resource ';' + | rss_resource_list rss_resource error + { + #PASS2 + { + PARSER->error().error(@2, rdo::format("Пропущена ';'")); + } + } + ; rss_resource - : RDO_IDENTIF '=' rss_constructor_call - { - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($1); - ASSERT(pName); - - LPRDORSSResource pResourceExist = PARSER->findRSSResource(pName->value().getIdentificator()); - if (pResourceExist) - { - PARSER->error().push_only(@1, rdo::format("Ресурс '%s' уже существует", - pName->value().getIdentificator().c_str())); - PARSER->error().push_only(pResourceExist->src_info(), "См. первое определение"); - PARSER->error().push_done(); - } - LPRDORTPResType pNameExist = PARSER->findRTPResType(pName->value().getIdentificator()); - if (pNameExist) - { - PARSER->error().push_only(@1, rdo::format("Недопустимое имя ресурса: '%s'. Данное имя уже зарезервировано ", - pName->value().getIdentificator().c_str())); - PARSER->error().push_only(pNameExist->src_info(), "См. первое определение"); - PARSER->error().push_done(); - } - - LPRDORSSResource pResource = PARSER->stack().pop($3); - ASSERT(pResource); - pResource->setSrcInfo(pName->src_info()); - - if (!pResource->defined()) - { - PARSER->error().error(@3, rdo::format("Заданы не все параметры ресурса: '%s'", pResource->name().c_str())); - } - } - } - | RDO_IDENTIF '.' rss_trace '(' ')' - { - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($1); - ASSERT(pName); - bool traceValue = $3 != 0; - - Context::Params params; - params[Context::Params::IDENTIFIER] = pName->value().getIdentificator(); - Context::LPFindResult result = PARSER->context()->find(Context::METHOD_OPERATOR_DOT, params, pName->src_info()); - ASSERT(result->getSwitchContext()); - - Context::Params traceParams; - traceParams["traceValue"] = traceValue; - result = result->getSwitchContext().context->find("trace()", traceParams, pName->src_info()); - - LPExpression pExpression = result->getCreateExpression()(); - ASSERT(pExpression); - - rdo::runtime::LPRDOCalc pCalc = pExpression->calc(); - LPRDORSSResource pResource = PARSER->findRSSResource(pName->value().getIdentificator()); - ASSERT(pResource); - pResource->setTraceCalc(pCalc); - } - } - | error - { - #PASS2 - { - PARSER->error().error(@1, rdo::format("Синтаксическая ошибка")); - } - } - ; + : RDO_IDENTIF '=' rss_constructor_call + { + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($1); + ASSERT(pName); + + LPRDORSSResource pResourceExist = PARSER->findRSSResource(pName->value().getIdentificator()); + if (pResourceExist) + { + PARSER->error().push_only(@1, rdo::format("Ресурс '%s' уже существует", + pName->value().getIdentificator().c_str())); + PARSER->error().push_only(pResourceExist->src_info(), "См. первое определение"); + PARSER->error().push_done(); + } + LPRDORTPResType pNameExist = PARSER->findRTPResType(pName->value().getIdentificator()); + if (pNameExist) + { + PARSER->error().push_only(@1, rdo::format("Недопустимое имя ресурса: '%s'. Данное имя уже зарезервировано ", + pName->value().getIdentificator().c_str())); + PARSER->error().push_only(pNameExist->src_info(), "См. первое определение"); + PARSER->error().push_done(); + } + + LPRDORSSResource pResource = PARSER->stack().pop($3); + ASSERT(pResource); + pResource->setSrcInfo(pName->src_info()); + + if (!pResource->defined()) + { + PARSER->error().error(@3, rdo::format("Заданы не все параметры ресурса: '%s'", pResource->name().c_str())); + } + } + } + | RDO_IDENTIF '.' rss_trace '(' ')' + { + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($1); + ASSERT(pName); + bool traceValue = $3 != 0; + + Context::Params params; + params[Context::Params::IDENTIFIER] = pName->value().getIdentificator(); + Context::LPFindResult result = PARSER->context()->find(Context::METHOD_OPERATOR_DOT, params, pName->src_info()); + ASSERT(result->getSwitchContext()); + + Context::Params traceParams; + traceParams["traceValue"] = traceValue; + result = result->getSwitchContext().context->find("trace()", traceParams, pName->src_info()); + + LPExpression pExpression = result->getCreateExpression()(); + ASSERT(pExpression); + + rdo::runtime::LPRDOCalc pCalc = pExpression->calc(); + LPRDORSSResource pResource = PARSER->findRSSResource(pName->value().getIdentificator()); + ASSERT(pResource); + pResource->setTraceCalc(pCalc); + } + } + | error + { + #PASS2 + { + PARSER->error().error(@1, rdo::format("Синтаксическая ошибка")); + } + } + ; rss_constructor_call - : rss_constructor_name rss_opt_value_list ')' - { - #PASS2 - { - LPRDORSSResource pResource = PARSER->stack().pop($1); - ASSERT(pResource); - - if (!pResource->defined()) - { - PARSER->error().error(@2, rdo::format("Заданы не все параметры ресурса: '%s'", pResource->name().c_str())); - } - pResource->end(); - $$ = PARSER->stack().push(pResource); - } - } - ; + : rss_constructor_name rss_opt_value_list ')' + { + #PASS2 + { + LPRDORSSResource pResource = PARSER->stack().pop($1); + ASSERT(pResource); + + if (!pResource->defined()) + { + PARSER->error().error(@2, rdo::format("Заданы не все параметры ресурса: '%s'", pResource->name().c_str())); + } + pResource->end(); + $$ = PARSER->stack().push(pResource); + } + } + ; rss_constructor_name - : RDO_IDENTIF '(' - { - #PASS2 - { - LPRDOValue pType = PARSER->stack().pop($1); - ASSERT(pType); - - LPRDORTPResType pResType = PARSER->findRTPResType(pType->value().getIdentificator()); - if (!pResType) - { - PARSER->error().error(@1, rdo::format("Неизвестный тип ресурса: %s", pType->value().getIdentificator().c_str())); - } - LPRDORSSResource pResource = pResType->createRes(PARSER, RDOParserSrcInfo()); - PARSER->insertRSSResource(LPRDORSSResource(pResource)); - $$ = PARSER->stack().push(pResource); - } - } - ; + : RDO_IDENTIF '(' + { + #PASS2 + { + LPRDOValue pType = PARSER->stack().pop($1); + ASSERT(pType); + + LPRDORTPResType pResType = PARSER->findRTPResType(pType->value().getIdentificator()); + if (!pResType) + { + PARSER->error().error(@1, rdo::format("Неизвестный тип ресурса: %s", pType->value().getIdentificator().c_str())); + } + LPRDORSSResource pResource = pResType->createRes(PARSER, RDOParserSrcInfo()); + PARSER->insertRSSResource(LPRDORSSResource(pResource)); + $$ = PARSER->stack().push(pResource); + } + } + ; rss_trace - : RDO_trace - { - #PASS2 - { - $$ = 1; - } - } - | RDO_no_trace - { - #PASS2 - { - $$ = 0; - } - } - ; + : RDO_trace + { + #PASS2 + { + $$ = 1; + } + } + | RDO_no_trace + { + #PASS2 + { + $$ = 0; + } + } + ; rss_opt_value_list - : /* empty */ - | rss_value_list - ; + : /* empty */ + | rss_value_list + ; rss_value_list - : rss_value - | rss_value_list ',' rss_value - ; + : rss_value + | rss_value_list ',' rss_value + ; rss_value - : '*' - { - #PASS2 - { - PARSER->context()->cast()->addParam(rdo::Factory::create(RDOParserSrcInfo(@1, "*"))); - } - } - | '#' - { - #PASS2 - { - PARSER->context()->cast()->addParam(rdo::Factory::create(RDOParserSrcInfo(@1, "#"))); - } - } - | RDO_INT_CONST - { - #PASS2 - { - PARSER->context()->cast()->addParam(PARSER->stack().pop($1)); - } - } - | RDO_REAL_CONST - { - #PASS2 - { - PARSER->context()->cast()->addParam(PARSER->stack().pop($1)); - } - } - | RDO_BOOL_CONST - { - #PASS2 - { - PARSER->context()->cast()->addParam(PARSER->stack().pop($1)); - } - } - | RDO_STRING_CONST - { - #PASS2 - { - PARSER->context()->cast()->addParam(PARSER->stack().pop($1)); - } - } - | RDO_IDENTIF - { - #PASS2 - { - PARSER->context()->cast()->addParam(PARSER->stack().pop($1)); - } - } - | param_array_value - { - #PASS2 - { - PARSER->context()->cast()->addParam(PARSER->stack().pop($1)); - } - } - | rss_constructor_call - { - #PASS2 - { - LPRDORSSResource pResource = PARSER->stack().pop($1); - pResource->setIsNested(true); - rdo::runtime::RDOValue runtimeValue( - pResource->getType(), - pResource - ); - LPTypeInfo pResourceTypeInfo = Factory::create( - pResource->getType(), - pResource->getType()->src_info() - ); - LPRDOValue pValue = Factory::create( - runtimeValue, - pResource->src_info(), - pResourceTypeInfo - ); - - PARSER->context()->cast()->addParam(pValue); - } - } - | error - { - #PASS2 - { - PARSER->error().error(@1, rdo::format("Неправильное значение параметра: %s", LEXER->YYText())); - } - } - ; + : '*' + { + #PASS2 + { + PARSER->context()->cast()->addParam(rdo::Factory::create(RDOParserSrcInfo(@1, "*"))); + } + } + | '#' + { + #PASS2 + { + PARSER->context()->cast()->addParam(rdo::Factory::create(RDOParserSrcInfo(@1, "#"))); + } + } + | RDO_INT_CONST + { + #PASS2 + { + PARSER->context()->cast()->addParam(PARSER->stack().pop($1)); + } + } + | RDO_REAL_CONST + { + #PASS2 + { + PARSER->context()->cast()->addParam(PARSER->stack().pop($1)); + } + } + | RDO_BOOL_CONST + { + #PASS2 + { + PARSER->context()->cast()->addParam(PARSER->stack().pop($1)); + } + } + | RDO_STRING_CONST + { + #PASS2 + { + PARSER->context()->cast()->addParam(PARSER->stack().pop($1)); + } + } + | RDO_IDENTIF + { + #PASS2 + { + PARSER->context()->cast()->addParam(PARSER->stack().pop($1)); + } + } + | param_array_value + { + #PASS2 + { + PARSER->context()->cast()->addParam(PARSER->stack().pop($1)); + } + } + | rss_constructor_call + { + #PASS2 + { + LPRDORSSResource pResource = PARSER->stack().pop($1); + pResource->setIsNested(true); + rdo::runtime::RDOValue runtimeValue( + pResource->getType(), + pResource + ); + LPTypeInfo pResourceTypeInfo = Factory::create( + pResource->getType(), + pResource->getType()->src_info() + ); + LPRDOValue pValue = Factory::create( + runtimeValue, + pResource->src_info(), + pResourceTypeInfo + ); + + PARSER->context()->cast()->addParam(pValue); + } + } + | error + { + #PASS2 + { + PARSER->error().error(@1, rdo::format("Неправильное значение параметра: %s", LEXER->YYText())); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Синтаксис событий (паттернов?) @@ -1118,2035 +1105,2035 @@ rss_value // -------------------- Описание событий (паттернов?) // -------------------------------------------------------------------------------- pat_main - : pat_pattern - { - #PASS1 - { - (void)(@1); - } - - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - } - } - ; + : pat_pattern + { + #PASS1 + { + (void)(@1); + } + + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + } + } + ; pat_header - : RDO_Pattern RDO_IDENTIF_COLON RDO_event pat_trace - { - #PASS1 - { - LPRDOValue pName = PARSER->stack().pop($2); - ASSERT(pName); - LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); - ASSERT(pPattern); - $$ = PARSER->stack().push(pPattern); - } - - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($2); - ASSERT(pName); - LPRDOPATPattern pPattern = PARSER->findPATPattern(pName->value().getIdentificator()); - ASSERT(pPattern); - pPattern->pushContext(); - $$ = PARSER->stack().push(pPattern); - } - } - | RDO_Pattern RDO_IDENTIF_COLON RDO_operation pat_trace - { - #PASS1 - { - LPRDOValue pName = PARSER->stack().pop($2); - ASSERT(pName); - LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); - ASSERT(pPattern); - $$ = PARSER->stack().push(pPattern); - } - - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($2); - ASSERT(pName); - LPRDOPATPattern pPattern = PARSER->findPATPattern(pName->value().getIdentificator()); - ASSERT(pPattern); - pPattern->pushContext(); - $$ = PARSER->stack().push(pPattern); - } - } - | RDO_Pattern RDO_IDENTIF_COLON RDO_rule pat_trace - { - #PASS1 - { - LPRDOValue pName = PARSER->stack().pop($2); - ASSERT(pName); - LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); - ASSERT(pPattern); - $$ = PARSER->stack().push(pPattern); - } - - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($2); - ASSERT(pName); - LPRDOPATPattern pPattern = PARSER->findPATPattern(pName->value().getIdentificator()); - ASSERT(pPattern); - pPattern->pushContext(); - $$ = PARSER->stack().push(pPattern); - } - } - | RDO_Pattern RDO_IDENTIF_COLON RDO_keyboard pat_trace - { - #PASS1 - { - LPRDOValue pName = PARSER->stack().pop($2); - ASSERT(pName); - LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); - ASSERT(pPattern); - $$ = PARSER->stack().push(pPattern); - } - - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($2); - ASSERT(pName); - LPRDOPATPattern pPattern = PARSER->findPATPattern(pName->value().getIdentificator()); - ASSERT(pPattern); - pPattern->pushContext(); - $$ = PARSER->stack().push(pPattern); - } - } - | RDO_Pattern error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается имя образца"); - } - } - | RDO_Pattern RDO_IDENTIF_COLON error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается тип образца"); - } - } - ; + : RDO_Pattern RDO_IDENTIF_COLON RDO_event pat_trace + { + #PASS1 + { + LPRDOValue pName = PARSER->stack().pop($2); + ASSERT(pName); + LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); + ASSERT(pPattern); + $$ = PARSER->stack().push(pPattern); + } + + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($2); + ASSERT(pName); + LPRDOPATPattern pPattern = PARSER->findPATPattern(pName->value().getIdentificator()); + ASSERT(pPattern); + pPattern->pushContext(); + $$ = PARSER->stack().push(pPattern); + } + } + | RDO_Pattern RDO_IDENTIF_COLON RDO_operation pat_trace + { + #PASS1 + { + LPRDOValue pName = PARSER->stack().pop($2); + ASSERT(pName); + LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); + ASSERT(pPattern); + $$ = PARSER->stack().push(pPattern); + } + + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($2); + ASSERT(pName); + LPRDOPATPattern pPattern = PARSER->findPATPattern(pName->value().getIdentificator()); + ASSERT(pPattern); + pPattern->pushContext(); + $$ = PARSER->stack().push(pPattern); + } + } + | RDO_Pattern RDO_IDENTIF_COLON RDO_rule pat_trace + { + #PASS1 + { + LPRDOValue pName = PARSER->stack().pop($2); + ASSERT(pName); + LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); + ASSERT(pPattern); + $$ = PARSER->stack().push(pPattern); + } + + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($2); + ASSERT(pName); + LPRDOPATPattern pPattern = PARSER->findPATPattern(pName->value().getIdentificator()); + ASSERT(pPattern); + pPattern->pushContext(); + $$ = PARSER->stack().push(pPattern); + } + } + | RDO_Pattern RDO_IDENTIF_COLON RDO_keyboard pat_trace + { + #PASS1 + { + LPRDOValue pName = PARSER->stack().pop($2); + ASSERT(pName); + LPRDOPATPattern pPattern = rdo::Factory::create(pName->src_info(), $4 != 0); + ASSERT(pPattern); + $$ = PARSER->stack().push(pPattern); + } + + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($2); + ASSERT(pName); + LPRDOPATPattern pPattern = PARSER->findPATPattern(pName->value().getIdentificator()); + ASSERT(pPattern); + pPattern->pushContext(); + $$ = PARSER->stack().push(pPattern); + } + } + | RDO_Pattern error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается имя образца"); + } + } + | RDO_Pattern RDO_IDENTIF_COLON error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается тип образца"); + } + } + ; pat_trace - : /* empty */ - { - $$ = 0; - } - | RDO_trace - { - $$ = 1; - } - | RDO_no_trace - { - $$ = 0; - } - ; + : /* empty */ + { + $$ = 0; + } + | RDO_trace + { + $$ = 1; + } + | RDO_no_trace + { + $$ = 0; + } + ; pat_params_begin - : pat_header RDO_Parameters - ; + : pat_header RDO_Parameters + ; pat_params - : pat_params_begin RDO_IDENTIF_COLON type_declaration param_value_default - { - #PASS1 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - LPRDOValue pParamName = PARSER->stack().pop($2); - LPTypeInfo pType = PARSER->stack().pop($3); - ASSERT(pPattern ); - ASSERT(pParamName); - ASSERT(pType ); - - LPRDOParam pParam = rdo::Factory::create(pParamName->src_info(), pType, PARSER->stack().pop($4)); - ASSERT(pParam); - pPattern->add(pParam); - $$ = PARSER->stack().push(pPattern); - } - } - | pat_params RDO_IDENTIF_COLON type_declaration param_value_default - { - #PASS1 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - LPRDOValue pParamName = PARSER->stack().pop($2); - LPTypeInfo pType = PARSER->stack().pop($3); - ASSERT(pPattern ); - ASSERT(pParamName); - ASSERT(pType ); - - LPRDOParam pParam = rdo::Factory::create(pParamName->src_info(), pType, PARSER->stack().pop($4)); - ASSERT(pParam); - pPattern->add(pParam); - $$ = PARSER->stack().push(pPattern); - } - } - | pat_params_begin error - { - #PASS1 - { - if (@1.m_last_line != @2.m_last_line) - { - PARSER->error().error(@2, "Ожидается имя параметра образца"); - } - else - { - PARSER->error().error(@2, rdo::format("Ожидается имя параметра образца, найдено: %s", LEXER->YYText())); - } - } - } - | pat_params_begin RDO_IDENTIF error - { - #PASS1 - { - if (@2.m_last_line != @3.m_last_line) - { - PARSER->error().error(@2, @3, "Ожидается двоеточие"); - } - else - { - PARSER->error().error(@2, @3, rdo::format("Ожидается двоеточие, найдено: %s", LEXER->YYText())); - } - } - } - | pat_params_begin RDO_IDENTIF_COLON error - { - #PASS1 - { - if (@2.m_last_line != @3.m_last_line) - { - PARSER->error().error(@2, @3, "Ожидается тип параметра образца"); - } - else - { - PARSER->error().error(@2, @3, rdo::format("Ожидается тип параметра образца, найдено: %s", LEXER->YYText())); - } - } - } - | pat_params error - { - #PASS1 - { - if (@1.m_last_line != @2.m_last_line) - { - PARSER->error().error(@2, "Ожидается имя параметра образца"); - } - else - { - PARSER->error().error(@2, rdo::format("Ожидается имя параметра образца, найдено: %s", LEXER->YYText())); - } - } - } - | pat_params RDO_IDENTIF error - { - #PASS1 - { - if (@2.m_last_line != @3.m_last_line) - { - PARSER->error().error(@2, @3, "Ожидается двоеточие"); - } - else - { - PARSER->error().error(@2, @3, rdo::format("Ожидается двоеточие, найдено: %s", LEXER->YYText())); - } - } - } - | pat_params RDO_IDENTIF_COLON error - { - #PASS1 - { - if (@2.m_last_line != @3.m_last_line) - { - PARSER->error().error(@2, @3, "Ожидается тип параметра образца"); - } - else - { - PARSER->error().error(@2, @3, rdo::format("Ожидается тип параметра образца, найдено: %s", LEXER->YYText())); - } - } - } - ; + : pat_params_begin RDO_IDENTIF_COLON type_declaration param_value_default + { + #PASS1 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + LPRDOValue pParamName = PARSER->stack().pop($2); + LPTypeInfo pType = PARSER->stack().pop($3); + ASSERT(pPattern ); + ASSERT(pParamName); + ASSERT(pType ); + + LPRDOParam pParam = rdo::Factory::create(pParamName->src_info(), pType, PARSER->stack().pop($4)); + ASSERT(pParam); + pPattern->add(pParam); + $$ = PARSER->stack().push(pPattern); + } + } + | pat_params RDO_IDENTIF_COLON type_declaration param_value_default + { + #PASS1 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + LPRDOValue pParamName = PARSER->stack().pop($2); + LPTypeInfo pType = PARSER->stack().pop($3); + ASSERT(pPattern ); + ASSERT(pParamName); + ASSERT(pType ); + + LPRDOParam pParam = rdo::Factory::create(pParamName->src_info(), pType, PARSER->stack().pop($4)); + ASSERT(pParam); + pPattern->add(pParam); + $$ = PARSER->stack().push(pPattern); + } + } + | pat_params_begin error + { + #PASS1 + { + if (@1.m_last_line != @2.m_last_line) + { + PARSER->error().error(@2, "Ожидается имя параметра образца"); + } + else + { + PARSER->error().error(@2, rdo::format("Ожидается имя параметра образца, найдено: %s", LEXER->YYText())); + } + } + } + | pat_params_begin RDO_IDENTIF error + { + #PASS1 + { + if (@2.m_last_line != @3.m_last_line) + { + PARSER->error().error(@2, @3, "Ожидается двоеточие"); + } + else + { + PARSER->error().error(@2, @3, rdo::format("Ожидается двоеточие, найдено: %s", LEXER->YYText())); + } + } + } + | pat_params_begin RDO_IDENTIF_COLON error + { + #PASS1 + { + if (@2.m_last_line != @3.m_last_line) + { + PARSER->error().error(@2, @3, "Ожидается тип параметра образца"); + } + else + { + PARSER->error().error(@2, @3, rdo::format("Ожидается тип параметра образца, найдено: %s", LEXER->YYText())); + } + } + } + | pat_params error + { + #PASS1 + { + if (@1.m_last_line != @2.m_last_line) + { + PARSER->error().error(@2, "Ожидается имя параметра образца"); + } + else + { + PARSER->error().error(@2, rdo::format("Ожидается имя параметра образца, найдено: %s", LEXER->YYText())); + } + } + } + | pat_params RDO_IDENTIF error + { + #PASS1 + { + if (@2.m_last_line != @3.m_last_line) + { + PARSER->error().error(@2, @3, "Ожидается двоеточие"); + } + else + { + PARSER->error().error(@2, @3, rdo::format("Ожидается двоеточие, найдено: %s", LEXER->YYText())); + } + } + } + | pat_params RDO_IDENTIF_COLON error + { + #PASS1 + { + if (@2.m_last_line != @3.m_last_line) + { + PARSER->error().error(@2, @3, "Ожидается тип параметра образца"); + } + else + { + PARSER->error().error(@2, @3, rdo::format("Ожидается тип параметра образца, найдено: %s", LEXER->YYText())); + } + } + } + ; pat_params_end - : pat_params RDO_Relevant_resources - | pat_header RDO_Relevant_resources - | pat_header error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается ключевое слово $Relevant_resources"); - } - } - ; + : pat_params RDO_Relevant_resources + | pat_header RDO_Relevant_resources + | pat_header error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается ключевое слово $Relevant_resources"); + } + } + ; pat_rel_res - : pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF pat_conv pat_conv - { - #PASS2 - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = PARSER->stack().pop($2); - LPRDOValue pTypeName = PARSER->stack().pop($3); - ASSERT(pRelName ); - ASSERT(pTypeName); - - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, (rdo::runtime::RDOResource::ConvertStatus)$5, @4, @5); - break; - } - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@5, "У события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@5, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF pat_conv pat_conv - { - #PASS2 - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = PARSER->stack().pop($2); - LPRDOValue pTypeName = PARSER->stack().pop($3); - ASSERT(pRelName ); - ASSERT(pTypeName); - - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, (rdo::runtime::RDOResource::ConvertStatus)$5, @4, @5); - break; - } - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@5, "У события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@5, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF pat_conv - { - #PASS2 - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - PARSER->error().error(@4, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr((rdo::runtime::RDOResource::ConvertStatus)$4).c_str())); - break; - } - case RDOPATPattern::PT_Event: - case RDOPATPattern::PT_Rule : - { - LPRDOValue pRelName = PARSER->stack().pop($2); - LPRDOValue pTypeName = PARSER->stack().pop($3); - ASSERT(pRelName ); - ASSERT(pTypeName); - - pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, @4); - break; - } - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF pat_conv - { - #PASS2 - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - PARSER->error().error(@4, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr((rdo::runtime::RDOResource::ConvertStatus)$4).c_str())); - break; - } - case RDOPATPattern::PT_Event: - case RDOPATPattern::PT_Rule : - { - LPRDOValue pRelName = PARSER->stack().pop($2); - LPRDOValue pTypeName = PARSER->stack().pop($3); - ASSERT(pRelName ); - ASSERT(pTypeName); - - pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, @4); - break; - } - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange pat_conv - { - #PASS2 - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = PARSER->stack().pop($2); - LPRDOValue pTypeName = PARSER->stack().pop($3); - ASSERT(pRelName ); - ASSERT(pTypeName); - - YYLTYPE convertor_pos = @3; - convertor_pos.m_first_line = convertor_pos.m_last_line; - convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::CS_NoChange, (rdo::runtime::RDOResource::ConvertStatus)$4, convertor_pos, @4); - break; - } - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@4, "У события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange pat_conv - { - #PASS2 - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = PARSER->stack().pop($2); - LPRDOValue pTypeName = PARSER->stack().pop($3); - ASSERT(pRelName ); - ASSERT(pTypeName); - - YYLTYPE convertor_pos = @3; - convertor_pos.m_first_line = convertor_pos.m_last_line; - convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::CS_NoChange, (rdo::runtime::RDOResource::ConvertStatus)$4, convertor_pos, @4); - break; - } - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@4, "У события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange_NoChange - { - #PASS2 - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = PARSER->stack().pop($2); - LPRDOValue pTypeName = PARSER->stack().pop($3); - ASSERT(pRelName ); - ASSERT(pTypeName); - - YYLTYPE convertor_begin_pos = @3; - const std::string str = boost::algorithm::to_lower_copy(std::string(LEXER->YYText())); - const std::string::size_type first_nochange = str.find("nochange"); - std::size_t i = 0; - for (;;) - { - if (str[i] == '\n') - { - convertor_begin_pos.m_first_line++; - convertor_begin_pos.m_first_seek++; - convertor_begin_pos.m_first_pos = 0; - } - else if (str[i] != '\r') - { - convertor_begin_pos.m_first_pos++; - convertor_begin_pos.m_first_seek++; - } - i++; - if (i == first_nochange) - break; - } - convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; - convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - YYLTYPE convertor_end_pos = @3; - convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; - convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::CS_NoChange, rdo::runtime::RDOResource::CS_NoChange, convertor_begin_pos, convertor_end_pos); - break; - } - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@3, "У события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@3, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange_NoChange - { - #PASS2 - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = PARSER->stack().pop($2); - LPRDOValue pTypeName = PARSER->stack().pop($3); - ASSERT(pRelName ); - ASSERT(pTypeName); - - YYLTYPE convertor_begin_pos = @3; - const std::string str = boost::algorithm::to_lower_copy(std::string(LEXER->YYText())); - const std::string::size_type first_nochange = str.find("nochange"); - std::size_t i = 0; - for (;;) - { - if (str[i] == '\n') - { - convertor_begin_pos.m_first_line++; - convertor_begin_pos.m_first_seek++; - convertor_begin_pos.m_first_pos = 0; - } - else if (str[i] != '\r') - { - convertor_begin_pos.m_first_pos++; - convertor_begin_pos.m_first_seek++; - } - i++; - if (i == first_nochange) - break; - } - convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; - convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - YYLTYPE convertor_end_pos = @3; - convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; - convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::CS_NoChange, rdo::runtime::RDOResource::CS_NoChange, convertor_begin_pos, convertor_end_pos); - break; - } - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@3, "У события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@3, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange - { - #PASS2 - { - // проверено для ie,rule,opr,key - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - PARSER->error().error(@3, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).c_str())); - break; - } - case RDOPATPattern::PT_Event: - case RDOPATPattern::PT_Rule : - { - LPRDOValue pRelName = PARSER->stack().pop($2); - LPRDOValue pTypeName = PARSER->stack().pop($3); - ASSERT(pRelName ); - ASSERT(pTypeName); - - YYLTYPE convertor_pos = @3; - convertor_pos.m_first_line = convertor_pos.m_last_line; - convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::CS_NoChange, convertor_pos); - break; - } - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange - { - #PASS2 - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - PARSER->error().error(@3, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).c_str())); - break; - } - case RDOPATPattern::PT_Event: - case RDOPATPattern::PT_Rule : - { - LPRDOValue pRelName = PARSER->stack().pop($2); - LPRDOValue pTypeName = PARSER->stack().pop($3); - ASSERT(pRelName ); - ASSERT(pTypeName); - - YYLTYPE convertor_pos = @3; - convertor_pos.m_first_line = convertor_pos.m_last_line; - convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::CS_NoChange, convertor_pos); - break; - } - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF RDO_IDENTIF_NoChange - { - #PASS2 - { - // проверено для ie,rule,opr,key - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = PARSER->stack().pop($2); - LPRDOValue pTypeName = PARSER->stack().pop($3); - ASSERT(pRelName ); - ASSERT(pTypeName); - - const std::string convert_begin = PARSER->stack().pop($4)->value().getIdentificator(); - YYLTYPE convertor_begin_pos = @4; - convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; - convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + convert_begin.length(); - convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + convert_begin.length(); - YYLTYPE convertor_end_pos = @4; - convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; - convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), pPattern->StrToStatus(convert_begin, convertor_begin_pos), rdo::runtime::RDOResource::CS_NoChange, convertor_begin_pos, convertor_end_pos); - break; - } - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@4, "У события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF RDO_IDENTIF_NoChange - { - #PASS2 - { - // проверено для ie,event,rule,opr,key - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - LPRDOValue pRelName = PARSER->stack().pop($2); - LPRDOValue pTypeName = PARSER->stack().pop($3); - ASSERT(pRelName ); - ASSERT(pTypeName); - - const std::string convert_begin = PARSER->stack().pop($4)->value().getIdentificator(); - YYLTYPE convertor_begin_pos = @4; - convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; - convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + convert_begin.length(); - convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + convert_begin.length(); - YYLTYPE convertor_end_pos = @4; - convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; - convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::CS_NoChange).length(); - pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), pPattern->StrToStatus(convert_begin, convertor_begin_pos), rdo::runtime::RDOResource::CS_NoChange, convertor_begin_pos, convertor_end_pos); - break; - } - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@4, "У события нет события конца, а значит и второго статуса конвертора"); - break; - } - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); - break; - } - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_params_end error - { - #PASS2 - { - PARSER->error().error(@2, "Ошибка в описании релевантных ресурсов"); - } - } - | pat_rel_res error - { - #PASS2 - { - PARSER->error().error(@2, "Ошибка в описании релевантных ресурсов"); - } - } - | pat_params_end RDO_IDENTIF_COLON error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается описатель (имя типа или ресурса)"); - } - } - | pat_rel_res RDO_IDENTIF_COLON error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается описатель (имя типа или ресурса)"); - } - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF error - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - if (pPattern->isHaveConvertEnd()) - { - PARSER->error().error(@3, @4, "Ожидается статус конвертора начала"); - } - else - { - PARSER->error().error(@3, @4, "Ожидается статус конвертора"); - } - } - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF error - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - if (pPattern->isHaveConvertEnd()) - { - PARSER->error().error(@3, @4, "Ожидается статус конвертора начала"); - } - else - { - PARSER->error().error(@3, @4, "Ожидается статус конвертора"); - } - } - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF pat_conv error - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Body"); - break; - } - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Body"); - break; - } - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - PARSER->error().error(@4, @5, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); - break; - } - } - } - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF pat_conv error - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Body"); - break; - } - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Body"); - break; - } - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - PARSER->error().error(@4, @5, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); - break; - } - } - } - } - | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange error - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Body"); - break; - } - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Body"); - break; - } - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - PARSER->error().error(@3, @4, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); - break; - } - } - } - } - | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange error - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Body"); - break; - } - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Body"); - break; - } - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - PARSER->error().error(@3, @4, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); - break; - } - } - } - } - ; + : pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF pat_conv pat_conv + { + #PASS2 + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = PARSER->stack().pop($2); + LPRDOValue pTypeName = PARSER->stack().pop($3); + ASSERT(pRelName ); + ASSERT(pTypeName); + + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, (rdo::runtime::RDOResource::ConvertStatus)$5, @4, @5); + break; + } + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@5, "У события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@5, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF pat_conv pat_conv + { + #PASS2 + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = PARSER->stack().pop($2); + LPRDOValue pTypeName = PARSER->stack().pop($3); + ASSERT(pRelName ); + ASSERT(pTypeName); + + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, (rdo::runtime::RDOResource::ConvertStatus)$5, @4, @5); + break; + } + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@5, "У события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@5, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF pat_conv + { + #PASS2 + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + PARSER->error().error(@4, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr((rdo::runtime::RDOResource::ConvertStatus)$4).c_str())); + break; + } + case RDOPATPattern::Type::EVENT: + case RDOPATPattern::Type::RULE : + { + LPRDOValue pRelName = PARSER->stack().pop($2); + LPRDOValue pTypeName = PARSER->stack().pop($3); + ASSERT(pRelName ); + ASSERT(pTypeName); + + pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, @4); + break; + } + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF pat_conv + { + #PASS2 + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + PARSER->error().error(@4, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr((rdo::runtime::RDOResource::ConvertStatus)$4).c_str())); + break; + } + case RDOPATPattern::Type::EVENT: + case RDOPATPattern::Type::RULE : + { + LPRDOValue pRelName = PARSER->stack().pop($2); + LPRDOValue pTypeName = PARSER->stack().pop($3); + ASSERT(pRelName ); + ASSERT(pTypeName); + + pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), (rdo::runtime::RDOResource::ConvertStatus)$4, @4); + break; + } + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange pat_conv + { + #PASS2 + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = PARSER->stack().pop($2); + LPRDOValue pTypeName = PARSER->stack().pop($3); + ASSERT(pRelName ); + ASSERT(pTypeName); + + YYLTYPE convertor_pos = @3; + convertor_pos.m_first_line = convertor_pos.m_last_line; + convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, (rdo::runtime::RDOResource::ConvertStatus)$4, convertor_pos, @4); + break; + } + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@4, "У события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange pat_conv + { + #PASS2 + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = PARSER->stack().pop($2); + LPRDOValue pTypeName = PARSER->stack().pop($3); + ASSERT(pRelName ); + ASSERT(pTypeName); + + YYLTYPE convertor_pos = @3; + convertor_pos.m_first_line = convertor_pos.m_last_line; + convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, (rdo::runtime::RDOResource::ConvertStatus)$4, convertor_pos, @4); + break; + } + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@4, "У события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange_NoChange + { + #PASS2 + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = PARSER->stack().pop($2); + LPRDOValue pTypeName = PARSER->stack().pop($3); + ASSERT(pRelName ); + ASSERT(pTypeName); + + YYLTYPE convertor_begin_pos = @3; + const std::string str = boost::algorithm::to_lower_copy(std::string(LEXER->YYText())); + const std::string::size_type first_nochange = str.find("nochange"); + std::size_t i = 0; + for (;;) + { + if (str[i] == '\n') + { + convertor_begin_pos.m_first_line++; + convertor_begin_pos.m_first_seek++; + convertor_begin_pos.m_first_pos = 0; + } + else if (str[i] != '\r') + { + convertor_begin_pos.m_first_pos++; + convertor_begin_pos.m_first_seek++; + } + i++; + if (i == first_nochange) + break; + } + convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; + convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + YYLTYPE convertor_end_pos = @3; + convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; + convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, convertor_begin_pos, convertor_end_pos); + break; + } + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@3, "У события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@3, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange_NoChange + { + #PASS2 + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = PARSER->stack().pop($2); + LPRDOValue pTypeName = PARSER->stack().pop($3); + ASSERT(pRelName ); + ASSERT(pTypeName); + + YYLTYPE convertor_begin_pos = @3; + const std::string str = boost::algorithm::to_lower_copy(std::string(LEXER->YYText())); + const std::string::size_type first_nochange = str.find("nochange"); + std::size_t i = 0; + for (;;) + { + if (str[i] == '\n') + { + convertor_begin_pos.m_first_line++; + convertor_begin_pos.m_first_seek++; + convertor_begin_pos.m_first_pos = 0; + } + else if (str[i] != '\r') + { + convertor_begin_pos.m_first_pos++; + convertor_begin_pos.m_first_seek++; + } + i++; + if (i == first_nochange) + break; + } + convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; + convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + YYLTYPE convertor_end_pos = @3; + convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; + convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, convertor_begin_pos, convertor_end_pos); + break; + } + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@3, "У события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@3, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange + { + #PASS2 + { + // проверено для ie,rule,opr,key + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + PARSER->error().error(@3, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).c_str())); + break; + } + case RDOPATPattern::Type::EVENT: + case RDOPATPattern::Type::RULE : + { + LPRDOValue pRelName = PARSER->stack().pop($2); + LPRDOValue pTypeName = PARSER->stack().pop($3); + ASSERT(pRelName ); + ASSERT(pTypeName); + + YYLTYPE convertor_pos = @3; + convertor_pos.m_first_line = convertor_pos.m_last_line; + convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, convertor_pos); + break; + } + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange + { + #PASS2 + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + PARSER->error().error(@3, rdo::format("Помимо статуса конвертора начала (%s), ожидается статус конвертора конца, потому что у операции есть событие конца", RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).c_str())); + break; + } + case RDOPATPattern::Type::EVENT: + case RDOPATPattern::Type::RULE : + { + LPRDOValue pRelName = PARSER->stack().pop($2); + LPRDOValue pTypeName = PARSER->stack().pop($3); + ASSERT(pRelName ); + ASSERT(pTypeName); + + YYLTYPE convertor_pos = @3; + convertor_pos.m_first_line = convertor_pos.m_last_line; + convertor_pos.m_first_pos = convertor_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_pos.m_first_seek = convertor_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern->addRelRes(pRelName->src_info(), pTypeName->src_info(), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, convertor_pos); + break; + } + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF RDO_IDENTIF_NoChange + { + #PASS2 + { + // проверено для ie,rule,opr,key + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = PARSER->stack().pop($2); + LPRDOValue pTypeName = PARSER->stack().pop($3); + ASSERT(pRelName ); + ASSERT(pTypeName); + + const std::string convert_begin = PARSER->stack().pop($4)->value().getIdentificator(); + YYLTYPE convertor_begin_pos = @4; + convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; + convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + convert_begin.length(); + convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + convert_begin.length(); + YYLTYPE convertor_end_pos = @4; + convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; + convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), pPattern->StrToStatus(convert_begin, convertor_begin_pos), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, convertor_begin_pos, convertor_end_pos); + break; + } + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@4, "У события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF RDO_IDENTIF_NoChange + { + #PASS2 + { + // проверено для ie,event,rule,opr,key + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + LPRDOValue pRelName = PARSER->stack().pop($2); + LPRDOValue pTypeName = PARSER->stack().pop($3); + ASSERT(pRelName ); + ASSERT(pTypeName); + + const std::string convert_begin = PARSER->stack().pop($4)->value().getIdentificator(); + YYLTYPE convertor_begin_pos = @4; + convertor_begin_pos.m_last_line = convertor_begin_pos.m_first_line; + convertor_begin_pos.m_last_pos = convertor_begin_pos.m_first_pos + convert_begin.length(); + convertor_begin_pos.m_last_seek = convertor_begin_pos.m_first_seek + convert_begin.length(); + YYLTYPE convertor_end_pos = @4; + convertor_end_pos.m_first_line = convertor_end_pos.m_last_line; + convertor_end_pos.m_first_pos = convertor_end_pos.m_last_pos - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + convertor_end_pos.m_first_seek = convertor_end_pos.m_last_seek - RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus::NOCHANGE).length(); + pPattern.object_static_cast()->addRelRes(pRelName->src_info(), pTypeName->src_info(), pPattern->StrToStatus(convert_begin, convertor_begin_pos), rdo::runtime::RDOResource::ConvertStatus::NOCHANGE, convertor_begin_pos, convertor_end_pos); + break; + } + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@4, "У события нет события конца, а значит и второго статуса конвертора"); + break; + } + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@4, "У продукционного правила нет события конца, а значит и второго статуса конвертора"); + break; + } + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_params_end error + { + #PASS2 + { + PARSER->error().error(@2, "Ошибка в описании релевантных ресурсов"); + } + } + | pat_rel_res error + { + #PASS2 + { + PARSER->error().error(@2, "Ошибка в описании релевантных ресурсов"); + } + } + | pat_params_end RDO_IDENTIF_COLON error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается описатель (имя типа или ресурса)"); + } + } + | pat_rel_res RDO_IDENTIF_COLON error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается описатель (имя типа или ресурса)"); + } + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF error + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + if (pPattern->isHaveConvertEnd()) + { + PARSER->error().error(@3, @4, "Ожидается статус конвертора начала"); + } + else + { + PARSER->error().error(@3, @4, "Ожидается статус конвертора"); + } + } + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF error + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + if (pPattern->isHaveConvertEnd()) + { + PARSER->error().error(@3, @4, "Ожидается статус конвертора начала"); + } + else + { + PARSER->error().error(@3, @4, "Ожидается статус конвертора"); + } + } + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF pat_conv error + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Body"); + break; + } + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Body"); + break; + } + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + PARSER->error().error(@4, @5, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); + break; + } + } + } + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF pat_conv error + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Body"); + break; + } + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@5, "Ожидается способ выбора (first/with_min/with_max) или $Body"); + break; + } + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + PARSER->error().error(@4, @5, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); + break; + } + } + } + } + | pat_params_end RDO_IDENTIF_COLON RDO_IDENTIF_NoChange error + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Body"); + break; + } + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Body"); + break; + } + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + PARSER->error().error(@3, @4, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); + break; + } + } + } + } + | pat_rel_res RDO_IDENTIF_COLON RDO_IDENTIF_NoChange error + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Body"); + break; + } + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@4, "Ожидается способ выбора (first/with_min/with_max) или $Body"); + break; + } + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + PARSER->error().error(@3, @4, rdo::format("Ожидается статус конвертора конца, найдено: %s", LEXER->YYText())); + break; + } + } + } + } + ; pat_conv - : RDO_Keep - { - #PASS2 - { - $$ = rdo::runtime::RDOResource::CS_Keep; - } - } - | RDO_Create - { - #PASS2 - { - $$ = rdo::runtime::RDOResource::CS_Create; - } - } - | RDO_Erase - { - #PASS2 - { - $$ = rdo::runtime::RDOResource::CS_Erase; - } - } - | RDO_NonExist - { - #PASS2 - { - $$ = rdo::runtime::RDOResource::CS_NonExist; - } - } - ; + : RDO_Keep + { + #PASS2 + { + $$ = static_cast(rdo::runtime::RDOResource::ConvertStatus::KEEP); + } + } + | RDO_Create + { + #PASS2 + { + $$ = static_cast(rdo::runtime::RDOResource::ConvertStatus::CREATE); + } + } + | RDO_Erase + { + #PASS2 + { + $$ = static_cast(rdo::runtime::RDOResource::ConvertStatus::ERASE); + } + } + | RDO_NonExist + { + #PASS2 + { + $$ = static_cast(rdo::runtime::RDOResource::ConvertStatus::NONEXIST); + } + } + ; pat_common_choice - : pat_rel_res - | pat_rel_res RDO_first - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - if (pPattern->getType() == RDOPATPattern::PT_Event) - { - PARSER->error().error(@2, "В событиях не используется способ выбора релевантных ресурсов"); - } - else - { - pPattern->setCommonChoiceFirst(); - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_rel_res RDO_with_min fun_arithm - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - if (pPattern->getType() == RDOPATPattern::PT_Event) - { - PARSER->error().error(@2, "В событиях не используется способ выбора релевантных ресурсов"); - } - else - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($3); - ASSERT(pArithm); - pArithm->setSrcPos (@2, @3); - pArithm->setSrcText("with_min " + pArithm->src_text()); - pPattern->setCommonChoiceWithMin(pArithm); - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_rel_res RDO_with_max fun_arithm - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - if ( pPattern->getType() == RDOPATPattern::PT_Event) - { - PARSER->error().error(@2, "В событиях не используется способ выбора релевантных ресурсов"); - } - else - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($3); - ASSERT(pArithm); - pArithm->setSrcPos (@2, @3); - pArithm->setSrcText("with_max " + pArithm->src_text()); - pPattern->setCommonChoiceWithMax(pArithm); - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_rel_res RDO_with_min error - { - #PASS2 - { - PARSER->error().error(@3, "Ошибка в арифметическом выражении"); - } - } - | pat_rel_res RDO_with_max error - { - #PASS2 - { - PARSER->error().error(@3, "Ошибка в арифметическом выражении"); - } - } - ; + : pat_rel_res + | pat_rel_res RDO_first + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + if (pPattern->getType() == RDOPATPattern::Type::EVENT) + { + PARSER->error().error(@2, "В событиях не используется способ выбора релевантных ресурсов"); + } + else + { + pPattern->setCommonChoiceFirst(); + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_rel_res RDO_with_min fun_arithm + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + if (pPattern->getType() == RDOPATPattern::Type::EVENT) + { + PARSER->error().error(@2, "В событиях не используется способ выбора релевантных ресурсов"); + } + else + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($3); + ASSERT(pArithm); + pArithm->setSrcPos (@2, @3); + pArithm->setSrcText("with_min " + pArithm->src_text()); + pPattern->setCommonChoiceWithMin(pArithm); + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_rel_res RDO_with_max fun_arithm + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + if ( pPattern->getType() == RDOPATPattern::Type::EVENT) + { + PARSER->error().error(@2, "В событиях не используется способ выбора релевантных ресурсов"); + } + else + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($3); + ASSERT(pArithm); + pArithm->setSrcPos (@2, @3); + pArithm->setSrcText("with_max " + pArithm->src_text()); + pPattern->setCommonChoiceWithMax(pArithm); + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_rel_res RDO_with_min error + { + #PASS2 + { + PARSER->error().error(@3, "Ошибка в арифметическом выражении"); + } + } + | pat_rel_res RDO_with_max error + { + #PASS2 + { + PARSER->error().error(@3, "Ошибка в арифметическом выражении"); + } + } + ; pat_time - : pat_common_choice RDO_Body - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - PARSER->error().error(@2, "Перед $Body пропущено ключевое слово $Time"); - break; - } - default: - break; - } - $$ = PARSER->stack().push(pPattern); - } - } - | pat_common_choice RDO_Time '=' fun_arithm RDO_Body - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@2, "Поле $Time не используется в событии"); - break; - } - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@2, "Поле $Time не используется в продукционном правиле"); - break; - } - default: - break; - } - LPRDOFUNArithm pArithm = PARSER->stack().pop($4); - ASSERT(pArithm); - pArithm->setSrcPos (@2, @4); - pArithm->setSrcText("$Time = " + pArithm->src_text()); - pPattern->setTime(pArithm); - $$ = PARSER->stack().push(pPattern); - } - } - | pat_common_choice RDO_Time '=' fun_arithm error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ожидается ключевое слово $Body"); - } - } - | pat_common_choice RDO_Time '=' error - { - #PASS2 - { - PARSER->error().error(@4, "Ошибка в арифметическом выражении"); - } - } - | pat_common_choice RDO_Time error - { - #PASS2 - { - PARSER->error().error(@2, @3, "После ключевого слова $Time ожидается знак равенства"); - } - } - | pat_common_choice error - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@2, rdo::format("Ожидается $Body, найдено: %s", LEXER->YYText())); - break; - } - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@2, rdo::format("Ожидается $Body, найдено: %s", LEXER->YYText())); - break; - } - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - PARSER->error().error(@2, rdo::format("Ожидается $Time, найдено: %s", LEXER->YYText())); - break; - } - } - $$ = PARSER->stack().push(pPattern); - } - } - ; + : pat_common_choice RDO_Body + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + PARSER->error().error(@2, "Перед $Body пропущено ключевое слово $Time"); + break; + } + default: + break; + } + $$ = PARSER->stack().push(pPattern); + } + } + | pat_common_choice RDO_Time '=' fun_arithm RDO_Body + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@2, "Поле $Time не используется в событии"); + break; + } + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@2, "Поле $Time не используется в продукционном правиле"); + break; + } + default: + break; + } + LPRDOFUNArithm pArithm = PARSER->stack().pop($4); + ASSERT(pArithm); + pArithm->setSrcPos (@2, @4); + pArithm->setSrcText("$Time = " + pArithm->src_text()); + pPattern->setTime(pArithm); + $$ = PARSER->stack().push(pPattern); + } + } + | pat_common_choice RDO_Time '=' fun_arithm error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается ключевое слово $Body"); + } + } + | pat_common_choice RDO_Time '=' error + { + #PASS2 + { + PARSER->error().error(@4, "Ошибка в арифметическом выражении"); + } + } + | pat_common_choice RDO_Time error + { + #PASS2 + { + PARSER->error().error(@2, @3, "После ключевого слова $Time ожидается знак равенства"); + } + } + | pat_common_choice error + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + switch (pPattern->getType()) + { + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@2, rdo::format("Ожидается $Body, найдено: %s", LEXER->YYText())); + break; + } + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@2, rdo::format("Ожидается $Body, найдено: %s", LEXER->YYText())); + break; + } + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + PARSER->error().error(@2, rdo::format("Ожидается $Time, найдено: %s", LEXER->YYText())); + break; + } + } + $$ = PARSER->stack().push(pPattern); + } + } + ; pat_body - : pat_time RDO_IDENTIF_COLON - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - const std::string name = PARSER->stack().pop($2)->value().getIdentificator(); - pPattern->addRelResBody(RDOParserSrcInfo(@2, name)); - $$ = PARSER->stack().push(pPattern); - } - } - | pat_convert RDO_IDENTIF_COLON - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - const std::string name = PARSER->stack().pop($2)->value().getIdentificator(); - pPattern->addRelResBody(RDOParserSrcInfo(@2, name)); - $$ = PARSER->stack().push(pPattern); - } - } - | pat_time error - { - #PASS2 - { - const std::string str(LEXER->YYText()); - PARSER->error().error(@2, rdo::format("Неизвестный релевантный ресурс: %s", str.c_str())); - } - } - | pat_convert error - { - #PASS2 - { - const std::string str(LEXER->YYText()); - PARSER->error().error(@2, rdo::format("Неизвестный релевантный ресурс: %s", str.c_str())); - } - } - ; + : pat_time RDO_IDENTIF_COLON + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + const std::string name = PARSER->stack().pop($2)->value().getIdentificator(); + pPattern->addRelResBody(RDOParserSrcInfo(@2, name)); + $$ = PARSER->stack().push(pPattern); + } + } + | pat_convert RDO_IDENTIF_COLON + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + const std::string name = PARSER->stack().pop($2)->value().getIdentificator(); + pPattern->addRelResBody(RDOParserSrcInfo(@2, name)); + $$ = PARSER->stack().push(pPattern); + } + } + | pat_time error + { + #PASS2 + { + const std::string str(LEXER->YYText()); + PARSER->error().error(@2, rdo::format("Неизвестный релевантный ресурс: %s", str.c_str())); + } + } + | pat_convert error + { + #PASS2 + { + const std::string str(LEXER->YYText()); + PARSER->error().error(@2, rdo::format("Неизвестный релевантный ресурс: %s", str.c_str())); + } + } + ; pat_res_usage - : pat_body pat_choice pat_order - { - #PASS2 - { - LPRDOPATChoiceFrom pChoiceFrom = PARSER->stack().pop($2); - ASSERT(pChoiceFrom); - pChoiceFrom->setSrcPos(@2); - - LPRDOPATChoiceOrder pChoiceOrder = PARSER->stack().pop($3); - pChoiceOrder->setSrcPos(@3); - - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - pPattern->addRelResUsage(pChoiceFrom, pChoiceOrder); - $$ = PARSER->stack().push(pPattern); - } - } - ; + : pat_body pat_choice pat_order + { + #PASS2 + { + LPRDOPATChoiceFrom pChoiceFrom = PARSER->stack().pop($2); + ASSERT(pChoiceFrom); + pChoiceFrom->setSrcPos(@2); + + LPRDOPATChoiceOrder pChoiceOrder = PARSER->stack().pop($3); + pChoiceOrder->setSrcPos(@3); + + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + pPattern->addRelResUsage(pChoiceFrom, pChoiceOrder); + $$ = PARSER->stack().push(pPattern); + } + } + ; pat_choice - : /* empty */ - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceEmpty; - LPRDOPATChoiceFrom pChoiceFrom = rdo::Factory::create(RDOParserSrcInfo("Choice NoCheck"), RDOPATChoiceFrom::ch_empty); - ASSERT(pChoiceFrom); - $$ = PARSER->stack().push(pChoiceFrom); - } - } - | pat_choice_nocheck - { - #PASS2 - { - LPRDOPATChoiceFrom pChoiceFrom = rdo::Factory::create(RDOParserSrcInfo("Choice NoCheck"), RDOPATChoiceFrom::ch_nocheck); - ASSERT(pChoiceFrom); - $$ = PARSER->stack().push(pChoiceFrom); - } - } - | pat_choice_from fun_logic - { - #PASS2 - { - LPRDOFUNLogic pLogic = PARSER->stack().pop($2); - ASSERT(pLogic); - LPRDOPATChoiceFrom pChoiceFrom = rdo::Factory::create(RDOParserSrcInfo("Choice from " + pLogic->src_text()), RDOPATChoiceFrom::ch_from, pLogic); - ASSERT(pChoiceFrom); - $$ = PARSER->stack().push(pChoiceFrom); - } - } - | pat_choice_from error - { - #PASS2 - { - PARSER->error().error(@2, "Ошибка в логическом выражении"); - } - } - ; + : /* empty */ + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::State::EMPTY; + LPRDOPATChoiceFrom pChoiceFrom = rdo::Factory::create(RDOParserSrcInfo("Choice NoCheck"), RDOPATChoiceFrom::Type::EMPTY); + ASSERT(pChoiceFrom); + $$ = PARSER->stack().push(pChoiceFrom); + } + } + | pat_choice_nocheck + { + #PASS2 + { + LPRDOPATChoiceFrom pChoiceFrom = rdo::Factory::create(RDOParserSrcInfo("Choice NoCheck"), RDOPATChoiceFrom::Type::NOCHECK); + ASSERT(pChoiceFrom); + $$ = PARSER->stack().push(pChoiceFrom); + } + } + | pat_choice_from fun_logic + { + #PASS2 + { + LPRDOFUNLogic pLogic = PARSER->stack().pop($2); + ASSERT(pLogic); + LPRDOPATChoiceFrom pChoiceFrom = rdo::Factory::create(RDOParserSrcInfo("Choice from " + pLogic->src_text()), RDOPATChoiceFrom::Type::FROM, pLogic); + ASSERT(pChoiceFrom); + $$ = PARSER->stack().push(pChoiceFrom); + } + } + | pat_choice_from error + { + #PASS2 + { + PARSER->error().error(@2, "Ошибка в логическом выражении"); + } + } + ; pat_choice_nocheck - : RDO_Choice RDO_NoCheck - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceNoCheck; - } - } - ; + : RDO_Choice RDO_NoCheck + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CHOICE_NOCHECK; + } + } + ; pat_choice_from - : RDO_Choice RDO_from - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceFrom; - } - } - ; + : RDO_Choice RDO_from + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CHOICE_FROM; + } + } + ; pat_order - : /* empty */ - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceOrderEmpty; - LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo(), rdo::runtime::RDOSelectResourceCalc::order_empty); - ASSERT(pChoiceOrder); - $$ = PARSER->stack().push(pChoiceOrder); - } - } - | pat_choice_first - { - #PASS2 - { - LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo("first"), rdo::runtime::RDOSelectResourceCalc::order_first); - ASSERT(pChoiceOrder); - $$ = PARSER->stack().push(pChoiceOrder); - } - } - | pat_choice_with_min fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($2); - ASSERT(pArithm); - LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo("with_min " + pArithm->src_text()), rdo::runtime::RDOSelectResourceCalc::order_with_min, pArithm); - ASSERT(pChoiceOrder); - $$ = PARSER->stack().push(pChoiceOrder); - } - } - | pat_choice_with_max fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($2); - ASSERT(pArithm); - LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo("with_max " + pArithm->src_text()), rdo::runtime::RDOSelectResourceCalc::order_with_max, pArithm); - ASSERT(pChoiceOrder); - $$ = PARSER->stack().push(pChoiceOrder); - } - } - | pat_choice_with_min error - { - #PASS2 - { - PARSER->error().error(@2, "Ошибка в арифметическом выражении"); - } - } - | pat_choice_with_max error - { - #PASS2 - { - PARSER->error().error(@2, "Ошибка в арифметическом выражении"); - } - } - ; + : /* empty */ + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CHOICE_ORDER_EMPTY; + LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo(), rdo::runtime::RDOSelectResourceCalc::Type::EMPTY); + ASSERT(pChoiceOrder); + $$ = PARSER->stack().push(pChoiceOrder); + } + } + | pat_choice_first + { + #PASS2 + { + LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo("first"), rdo::runtime::RDOSelectResourceCalc::Type::FIRST); + ASSERT(pChoiceOrder); + $$ = PARSER->stack().push(pChoiceOrder); + } + } + | pat_choice_with_min fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($2); + ASSERT(pArithm); + LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo("with_min " + pArithm->src_text()), rdo::runtime::RDOSelectResourceCalc::Type::WITH_MIN, pArithm); + ASSERT(pChoiceOrder); + $$ = PARSER->stack().push(pChoiceOrder); + } + } + | pat_choice_with_max fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($2); + ASSERT(pArithm); + LPRDOPATChoiceOrder pChoiceOrder = rdo::Factory::create(RDOParserSrcInfo("with_max " + pArithm->src_text()), rdo::runtime::RDOSelectResourceCalc::Type::WITH_MAX, pArithm); + ASSERT(pChoiceOrder); + $$ = PARSER->stack().push(pChoiceOrder); + } + } + | pat_choice_with_min error + { + #PASS2 + { + PARSER->error().error(@2, "Ошибка в арифметическом выражении"); + } + } + | pat_choice_with_max error + { + #PASS2 + { + PARSER->error().error(@2, "Ошибка в арифметическом выражении"); + } + } + ; pat_choice_first - : RDO_first - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceOrderFirst; - } - } - ; + : RDO_first + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CHOICE_ORDER_FIRST; + } + } + ; pat_choice_with_min - : RDO_with_min - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceOrderWithMin; - } - } - ; + : RDO_with_min + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CHOICE_ORDER_WITH_MIN; + } + } + ; pat_choice_with_max - : RDO_with_max - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::choiceOrderWithMax; - } - } - ; + : RDO_with_max + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CHOICE_ORDER_WITH_MAX; + } + } + ; pat_convert - : pat_res_usage - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - LPRDORelevantResource rel_res = pPattern->m_pCurrRelRes; - std::string str; - if (rel_res->m_pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::order_empty) - { - str = "Сразу после ключевого слова " + rel_res->m_pChoiceOrder->asString(); - } - else if (rel_res->m_pChoiceFrom->m_type != RDOPATChoiceFrom::ch_empty) - { - str = "Сразу после условия выбора"; - } - else - { - str = "Сразу после имени"; - } - if (rel_res->m_statusBegin != rdo::runtime::RDOResource::CS_NoChange && rel_res->m_statusBegin != rdo::runtime::RDOResource::CS_Erase && rel_res->m_statusBegin != rdo::runtime::RDOResource::CS_NonExist) - { - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Event: - { - PARSER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_event для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); - break; - } - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_rule для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); - break; - } - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - PARSER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_begin для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); - break; - } - } - } - if (rel_res->m_statusEnd != rdo::runtime::RDOResource::CS_NoChange && rel_res->m_statusEnd != rdo::runtime::RDOResource::CS_Erase && rel_res->m_statusEnd != rdo::runtime::RDOResource::CS_NonExist) - { - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Event: - case RDOPATPattern::PT_Rule: - { - PARSER->error().error(@1, "Внутренняя ошибка"); - break; - } - case RDOPATPattern::PT_Operation: - case RDOPATPattern::PT_Keyboard : - { - PARSER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_end для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); - break; - } - } - } - - $$ = PARSER->stack().push(pPattern); - } - } - | pat_res_usage convert_begin pat_trace statement_list - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - if (pPattern->getType() != RDOPATPattern::PT_Operation && pPattern->getType() != RDOPATPattern::PT_Keyboard) - { - std::string type = ""; - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Event: type = "событии"; break; - case RDOPATPattern::PT_Rule : type = "продукционном правиле"; break; - default : break; - } - PARSER->error().error(@2, rdo::format("Ключевое слово Convert_begin может быть использовано в обыкновенной или клавиатурной операции, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); - } - - LPExpression pExpressionConvertBody = PARSER->stack().pop($4); - ASSERT(pExpressionConvertBody); - - rdo::runtime::LPRDOCalcStatementList pCalcStatementList = pExpressionConvertBody->calc().object_dynamic_cast(); - ASSERT(pCalcStatementList); - - rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementList = rdo::Factory::create(); - ASSERT(pCalcBaseStatementList); - - rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); - ASSERT(pCalcOpenBrace); - - rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); - ASSERT(pCalcCloseBrace); - - pCalcBaseStatementList->addCalcStatement(pCalcOpenBrace); - pCalcBaseStatementList->addCalcStatement(pCalcStatementList); - pCalcBaseStatementList->addCalcStatement(pCalcCloseBrace); - - LPExpression pExpressionConvert = rdo::Factory::create(pExpressionConvertBody->typeInfo(), pCalcBaseStatementList, pCalcStatementList->srcInfo()); - ASSERT(pExpressionConvert); - - pPattern.object_static_cast()->addRelResConvertBeginEnd($3 != 0, pExpressionConvert, false, NULL, @2, @2, @3, @3); - - RDOParser::s_parser()->contextStack()->pop(); - - $$ = PARSER->stack().push(pPattern); - } - } - | pat_res_usage convert_end pat_trace statement_list - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - if (pPattern->getType() != RDOPATPattern::PT_Operation && pPattern->getType() != RDOPATPattern::PT_Keyboard) - { - std::string type = ""; - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Event: type = "событии"; break; - case RDOPATPattern::PT_Rule : type = "продукционном правиле"; break; - default : break; - } - PARSER->error().error(@2, rdo::format("Ключевое слово Convert_end может быть использовано в обыкновенной и клавиатурной операции, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); - } - - LPExpression pExpressionConvertBody = PARSER->stack().pop($4); - ASSERT(pExpressionConvertBody); - - rdo::runtime::LPRDOCalcStatementList pCalcStatementList = pExpressionConvertBody->calc().object_dynamic_cast(); - ASSERT(pCalcStatementList); - - rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementList = rdo::Factory::create(); - ASSERT(pCalcBaseStatementList); - - rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); - ASSERT(pCalcOpenBrace); - - rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); - ASSERT(pCalcCloseBrace); - - pCalcBaseStatementList->addCalcStatement(pCalcOpenBrace); - pCalcBaseStatementList->addCalcStatement(pCalcStatementList); - pCalcBaseStatementList->addCalcStatement(pCalcCloseBrace); - - LPExpression pExpressionConvert = rdo::Factory::create(pExpressionConvertBody->typeInfo(), pCalcBaseStatementList, pCalcStatementList->srcInfo()); - ASSERT(pExpressionConvert); - - pPattern.object_static_cast()->addRelResConvertBeginEnd(false, NULL, $3 != 0, pExpressionConvert, @2, @2, @3, @3); - - RDOParser::s_parser()->contextStack()->pop(); - - $$ = PARSER->stack().push(pPattern); - } - } - | pat_res_usage convert_begin pat_trace statement_list convert_end pat_trace statement_list - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - if (pPattern->getType() != RDOPATPattern::PT_Operation && pPattern->getType() != RDOPATPattern::PT_Keyboard) - { - std::string type = ""; - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Event: type = "событии"; break; - case RDOPATPattern::PT_Rule : type = "продукционном правиле"; break; - default : break; - } - PARSER->error().error(@2, rdo::format("Ключевые слова Convert_begin и Convert_end могут быть использованы в обыкновенной и клавиатурной операции, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); - } - - LPExpression pExpressionConvertBodyBegin = PARSER->stack().pop($4); - ASSERT(pExpressionConvertBodyBegin); - LPExpression pExpressionConvertBodyEnd = PARSER->stack().pop($7); - ASSERT(pExpressionConvertBodyEnd); - - rdo::runtime::LPRDOCalcStatementList pCalcStatementListBegin = pExpressionConvertBodyBegin->calc().object_dynamic_cast(); - ASSERT(pCalcStatementListBegin); - rdo::runtime::LPRDOCalcStatementList pCalcStatementListEnd = pExpressionConvertBodyEnd->calc().object_dynamic_cast(); - ASSERT(pCalcStatementListEnd); - - rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementListBegin = rdo::Factory::create(); - ASSERT(pCalcBaseStatementListBegin); - - rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementListEnd = rdo::Factory::create(); - ASSERT(pCalcBaseStatementListEnd); - - rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); - ASSERT(pCalcOpenBrace); - - rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); - ASSERT(pCalcCloseBrace); - - pCalcBaseStatementListBegin->addCalcStatement(pCalcOpenBrace); - pCalcBaseStatementListBegin->addCalcStatement(pCalcStatementListBegin); - pCalcBaseStatementListBegin->addCalcStatement(pCalcCloseBrace); - - pCalcBaseStatementListEnd->addCalcStatement(pCalcOpenBrace); - pCalcBaseStatementListEnd->addCalcStatement(pCalcStatementListEnd); - pCalcBaseStatementListEnd->addCalcStatement(pCalcCloseBrace); - - LPExpression pExpressionConvertBegin = rdo::Factory::create(pExpressionConvertBodyBegin->typeInfo(),pCalcBaseStatementListBegin,pCalcBaseStatementListBegin->srcInfo()); - ASSERT(pExpressionConvertBegin); - - LPExpression pExpressionConvertEnd = rdo::Factory::create(pExpressionConvertBodyEnd->typeInfo(),pCalcBaseStatementListEnd,pCalcBaseStatementListEnd->srcInfo()); - ASSERT(pExpressionConvertEnd); - - pPattern.object_static_cast()->addRelResConvertBeginEnd( - $3 != 0, - pExpressionConvertBegin , - $6 != 0 , - pExpressionConvertEnd , - @2, @5, @3, @6 ); - - - RDOParser::s_parser()->contextStack()->pop(); - RDOParser::s_parser()->contextStack()->pop(); - - $$ = PARSER->stack().push(pPattern); - } - } - | pat_res_usage convert_rule pat_trace statement_list - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - if (pPattern->getType() != RDOPATPattern::PT_Rule) - { - std::string type = ""; - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Event : type = "событии"; break; - case RDOPATPattern::PT_Operation: type = "операции"; break; - case RDOPATPattern::PT_Keyboard : type = "клавиатурной операции"; break; - default : break; - } - PARSER->error().error(@2, rdo::format("Ключевое слово Convert_rule может быть использовано в продукционном правиле, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); - } - - LPRDORelevantResource pRelRes = pPattern->m_pCurrRelRes; - ASSERT(pRelRes); - - LPExpression pExpressionConvertBody = PARSER->stack().pop($4); - ASSERT(pExpressionConvertBody); - - rdo::runtime::LPRDOCalcStatementList pCalcStatementList = pExpressionConvertBody->calc().object_dynamic_cast(); - ASSERT(pCalcStatementList); - - rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementList = rdo::Factory::create(); - ASSERT(pCalcBaseStatementList); - - rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); - ASSERT(pCalcOpenBrace); - - rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); - ASSERT(pCalcCloseBrace); - - pCalcBaseStatementList->addCalcStatement(pCalcOpenBrace); - pCalcBaseStatementList->addCalcStatement(pCalcStatementList); - pCalcBaseStatementList->addCalcStatement(pCalcCloseBrace); - - LPExpression pExpressionConvert = rdo::Factory::create(pExpressionConvertBody->typeInfo(), pCalcBaseStatementList, pCalcStatementList->srcInfo()); - ASSERT(pExpressionConvert); - - pPattern->addRelResConvert($3 != 0, pExpressionConvert, @2, @3, pRelRes->m_statusBegin); - - RDOParser::s_parser()->contextStack()->pop(); - - $$ = PARSER->stack().push(pPattern); - } - } - | pat_res_usage convert_event pat_trace statement_list - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - ASSERT(pPattern); - - if (pPattern->getType() != RDOPATPattern::PT_Event) - { - std::string type = ""; - switch (pPattern->getType()) - { - case RDOPATPattern::PT_Rule : type = "продукционном правиле"; break; - case RDOPATPattern::PT_Operation: type = "операции"; break; - case RDOPATPattern::PT_Keyboard : type = "клавиатурной операции"; break; - default : break; - } - PARSER->error().error(@2, rdo::format("Ключевое слово Convert_event может быть использовано в событии, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); - } - - LPExpression pExpressionConvertBody = PARSER->stack().pop($4); - ASSERT(pExpressionConvertBody); - - rdo::runtime::LPRDOCalcStatementList pCalcStatementList = pExpressionConvertBody->calc().object_dynamic_cast(); - ASSERT(pCalcStatementList); - - rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementList = rdo::Factory::create(); - ASSERT(pCalcBaseStatementList); - - rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); - ASSERT(pCalcOpenBrace); - - rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); - ASSERT(pCalcCloseBrace); - - pCalcBaseStatementList->addCalcStatement(pCalcOpenBrace); - pCalcBaseStatementList->addCalcStatement(pCalcStatementList); - pCalcBaseStatementList->addCalcStatement(pCalcCloseBrace); - - LPExpression pExpressionConvert = rdo::Factory::create(pExpressionConvertBody->typeInfo(), pCalcBaseStatementList, pCalcStatementList->srcInfo()); - ASSERT(pExpressionConvert); - - ASSERT(pPattern->m_pCurrRelRes); - pPattern->addRelResConvert($3 != 0, pExpressionConvert, @2, @3, pPattern->m_pCurrRelRes->m_statusBegin); - - RDOParser::s_parser()->contextStack()->pop(); - - $$ = PARSER->stack().push(pPattern); - } - } - ; + : pat_res_usage + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + LPRDORelevantResource rel_res = pPattern->m_pCurrRelRes; + std::string str; + if (rel_res->m_pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::Type::EMPTY) + { + str = "Сразу после ключевого слова " + rel_res->m_pChoiceOrder->asString(); + } + else if (rel_res->m_pChoiceFrom->m_type != RDOPATChoiceFrom::Type::EMPTY) + { + str = "Сразу после условия выбора"; + } + else + { + str = "Сразу после имени"; + } + if (rel_res->m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::NOCHANGE && rel_res->m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::ERASE && rel_res->m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + switch (pPattern->getType()) + { + case RDOPATPattern::Type::EVENT: + { + PARSER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_event для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); + break; + } + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_rule для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); + break; + } + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + PARSER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_begin для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); + break; + } + } + } + if (rel_res->m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::NOCHANGE && rel_res->m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::ERASE && rel_res->m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + switch (pPattern->getType()) + { + case RDOPATPattern::Type::EVENT: + case RDOPATPattern::Type::RULE: + { + PARSER->error().error(@1, "Внутренняя ошибка"); + break; + } + case RDOPATPattern::Type::OPERATION: + case RDOPATPattern::Type::KEYBOARD : + { + PARSER->error().error(@1, rdo::format("%s ожидается ключевое слово Convert_end для релевантного ресурса '%s', т.к. его статус '%s', но найдено: %s", str.c_str(), rel_res->name().c_str(), RDOPATPattern::StatusToStr(rel_res->m_statusBegin).c_str(), LEXER->YYText())); + break; + } + } + } + + $$ = PARSER->stack().push(pPattern); + } + } + | pat_res_usage convert_begin pat_trace statement_list + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + if (pPattern->getType() != RDOPATPattern::Type::OPERATION && pPattern->getType() != RDOPATPattern::Type::KEYBOARD) + { + std::string type = ""; + switch (pPattern->getType()) + { + case RDOPATPattern::Type::EVENT: type = "событии"; break; + case RDOPATPattern::Type::RULE : type = "продукционном правиле"; break; + default: break; + } + PARSER->error().error(@2, rdo::format("Ключевое слово Convert_begin может быть использовано в обыкновенной или клавиатурной операции, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); + } + + LPExpression pExpressionConvertBody = PARSER->stack().pop($4); + ASSERT(pExpressionConvertBody); + + rdo::runtime::LPRDOCalcStatementList pCalcStatementList = pExpressionConvertBody->calc().object_dynamic_cast(); + ASSERT(pCalcStatementList); + + rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementList = rdo::Factory::create(); + ASSERT(pCalcBaseStatementList); + + rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); + ASSERT(pCalcOpenBrace); + + rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); + ASSERT(pCalcCloseBrace); + + pCalcBaseStatementList->addCalcStatement(pCalcOpenBrace); + pCalcBaseStatementList->addCalcStatement(pCalcStatementList); + pCalcBaseStatementList->addCalcStatement(pCalcCloseBrace); + + LPExpression pExpressionConvert = rdo::Factory::create(pExpressionConvertBody->typeInfo(), pCalcBaseStatementList, pCalcStatementList->srcInfo()); + ASSERT(pExpressionConvert); + + pPattern.object_static_cast()->addRelResConvertBeginEnd($3 != 0, pExpressionConvert, false, NULL, @2, @2, @3, @3); + + RDOParser::s_parser()->contextStack()->pop(); + + $$ = PARSER->stack().push(pPattern); + } + } + | pat_res_usage convert_end pat_trace statement_list + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + if (pPattern->getType() != RDOPATPattern::Type::OPERATION && pPattern->getType() != RDOPATPattern::Type::KEYBOARD) + { + std::string type = ""; + switch (pPattern->getType()) + { + case RDOPATPattern::Type::EVENT: type = "событии"; break; + case RDOPATPattern::Type::RULE : type = "продукционном правиле"; break; + default: break; + } + PARSER->error().error(@2, rdo::format("Ключевое слово Convert_end может быть использовано в обыкновенной и клавиатурной операции, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); + } + + LPExpression pExpressionConvertBody = PARSER->stack().pop($4); + ASSERT(pExpressionConvertBody); + + rdo::runtime::LPRDOCalcStatementList pCalcStatementList = pExpressionConvertBody->calc().object_dynamic_cast(); + ASSERT(pCalcStatementList); + + rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementList = rdo::Factory::create(); + ASSERT(pCalcBaseStatementList); + + rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); + ASSERT(pCalcOpenBrace); + + rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); + ASSERT(pCalcCloseBrace); + + pCalcBaseStatementList->addCalcStatement(pCalcOpenBrace); + pCalcBaseStatementList->addCalcStatement(pCalcStatementList); + pCalcBaseStatementList->addCalcStatement(pCalcCloseBrace); + + LPExpression pExpressionConvert = rdo::Factory::create(pExpressionConvertBody->typeInfo(), pCalcBaseStatementList, pCalcStatementList->srcInfo()); + ASSERT(pExpressionConvert); + + pPattern.object_static_cast()->addRelResConvertBeginEnd(false, NULL, $3 != 0, pExpressionConvert, @2, @2, @3, @3); + + RDOParser::s_parser()->contextStack()->pop(); + + $$ = PARSER->stack().push(pPattern); + } + } + | pat_res_usage convert_begin pat_trace statement_list convert_end pat_trace statement_list + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + if (pPattern->getType() != RDOPATPattern::Type::OPERATION && pPattern->getType() != RDOPATPattern::Type::KEYBOARD) + { + std::string type = ""; + switch (pPattern->getType()) + { + case RDOPATPattern::Type::EVENT: type = "событии"; break; + case RDOPATPattern::Type::RULE : type = "продукционном правиле"; break; + default: break; + } + PARSER->error().error(@2, rdo::format("Ключевые слова Convert_begin и Convert_end могут быть использованы в обыкновенной и клавиатурной операции, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); + } + + LPExpression pExpressionConvertBodyBegin = PARSER->stack().pop($4); + ASSERT(pExpressionConvertBodyBegin); + LPExpression pExpressionConvertBodyEnd = PARSER->stack().pop($7); + ASSERT(pExpressionConvertBodyEnd); + + rdo::runtime::LPRDOCalcStatementList pCalcStatementListBegin = pExpressionConvertBodyBegin->calc().object_dynamic_cast(); + ASSERT(pCalcStatementListBegin); + rdo::runtime::LPRDOCalcStatementList pCalcStatementListEnd = pExpressionConvertBodyEnd->calc().object_dynamic_cast(); + ASSERT(pCalcStatementListEnd); + + rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementListBegin = rdo::Factory::create(); + ASSERT(pCalcBaseStatementListBegin); + + rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementListEnd = rdo::Factory::create(); + ASSERT(pCalcBaseStatementListEnd); + + rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); + ASSERT(pCalcOpenBrace); + + rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); + ASSERT(pCalcCloseBrace); + + pCalcBaseStatementListBegin->addCalcStatement(pCalcOpenBrace); + pCalcBaseStatementListBegin->addCalcStatement(pCalcStatementListBegin); + pCalcBaseStatementListBegin->addCalcStatement(pCalcCloseBrace); + + pCalcBaseStatementListEnd->addCalcStatement(pCalcOpenBrace); + pCalcBaseStatementListEnd->addCalcStatement(pCalcStatementListEnd); + pCalcBaseStatementListEnd->addCalcStatement(pCalcCloseBrace); + + LPExpression pExpressionConvertBegin = rdo::Factory::create(pExpressionConvertBodyBegin->typeInfo(),pCalcBaseStatementListBegin,pCalcBaseStatementListBegin->srcInfo()); + ASSERT(pExpressionConvertBegin); + + LPExpression pExpressionConvertEnd = rdo::Factory::create(pExpressionConvertBodyEnd->typeInfo(),pCalcBaseStatementListEnd,pCalcBaseStatementListEnd->srcInfo()); + ASSERT(pExpressionConvertEnd); + + pPattern.object_static_cast()->addRelResConvertBeginEnd( + $3 != 0, + pExpressionConvertBegin , + $6 != 0 , + pExpressionConvertEnd , + @2, @5, @3, @6 ); + + + RDOParser::s_parser()->contextStack()->pop(); + RDOParser::s_parser()->contextStack()->pop(); + + $$ = PARSER->stack().push(pPattern); + } + } + | pat_res_usage convert_rule pat_trace statement_list + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + if (pPattern->getType() != RDOPATPattern::Type::RULE) + { + std::string type = ""; + switch (pPattern->getType()) + { + case RDOPATPattern::Type::EVENT : type = "событии"; break; + case RDOPATPattern::Type::OPERATION: type = "операции"; break; + case RDOPATPattern::Type::KEYBOARD : type = "клавиатурной операции"; break; + default: break; + } + PARSER->error().error(@2, rdo::format("Ключевое слово Convert_rule может быть использовано в продукционном правиле, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); + } + + LPRDORelevantResource pRelRes = pPattern->m_pCurrRelRes; + ASSERT(pRelRes); + + LPExpression pExpressionConvertBody = PARSER->stack().pop($4); + ASSERT(pExpressionConvertBody); + + rdo::runtime::LPRDOCalcStatementList pCalcStatementList = pExpressionConvertBody->calc().object_dynamic_cast(); + ASSERT(pCalcStatementList); + + rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementList = rdo::Factory::create(); + ASSERT(pCalcBaseStatementList); + + rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); + ASSERT(pCalcOpenBrace); + + rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); + ASSERT(pCalcCloseBrace); + + pCalcBaseStatementList->addCalcStatement(pCalcOpenBrace); + pCalcBaseStatementList->addCalcStatement(pCalcStatementList); + pCalcBaseStatementList->addCalcStatement(pCalcCloseBrace); + + LPExpression pExpressionConvert = rdo::Factory::create(pExpressionConvertBody->typeInfo(), pCalcBaseStatementList, pCalcStatementList->srcInfo()); + ASSERT(pExpressionConvert); + + pPattern->addRelResConvert($3 != 0, pExpressionConvert, @2, @3, pRelRes->m_statusBegin); + + RDOParser::s_parser()->contextStack()->pop(); + + $$ = PARSER->stack().push(pPattern); + } + } + | pat_res_usage convert_event pat_trace statement_list + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + ASSERT(pPattern); + + if (pPattern->getType() != RDOPATPattern::Type::EVENT) + { + std::string type = ""; + switch (pPattern->getType()) + { + case RDOPATPattern::Type::RULE : type = "продукционном правиле"; break; + case RDOPATPattern::Type::OPERATION: type = "операции"; break; + case RDOPATPattern::Type::KEYBOARD : type = "клавиатурной операции"; break; + default: break; + } + PARSER->error().error(@2, rdo::format("Ключевое слово Convert_event может быть использовано в событии, но не в %s '%s'", type.c_str(), pPattern->name().c_str())); + } + + LPExpression pExpressionConvertBody = PARSER->stack().pop($4); + ASSERT(pExpressionConvertBody); + + rdo::runtime::LPRDOCalcStatementList pCalcStatementList = pExpressionConvertBody->calc().object_dynamic_cast(); + ASSERT(pCalcStatementList); + + rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementList = rdo::Factory::create(); + ASSERT(pCalcBaseStatementList); + + rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); + ASSERT(pCalcOpenBrace); + + rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); + ASSERT(pCalcCloseBrace); + + pCalcBaseStatementList->addCalcStatement(pCalcOpenBrace); + pCalcBaseStatementList->addCalcStatement(pCalcStatementList); + pCalcBaseStatementList->addCalcStatement(pCalcCloseBrace); + + LPExpression pExpressionConvert = rdo::Factory::create(pExpressionConvertBody->typeInfo(), pCalcBaseStatementList, pCalcStatementList->srcInfo()); + ASSERT(pExpressionConvert); + + ASSERT(pPattern->m_pCurrRelRes); + pPattern->addRelResConvert($3 != 0, pExpressionConvert, @2, @3, pPattern->m_pCurrRelRes->m_statusBegin); + + RDOParser::s_parser()->contextStack()->pop(); + + $$ = PARSER->stack().push(pPattern); + } + } + ; convert_rule - : RDO_Convert_rule - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::convertBegin; - - LPContextReturnable pContextReturnable = rdo::Factory::create(); - ASSERT(pContextReturnable); - - PARSER->contextStack()->push(pContextReturnable); - } - } - ; + : RDO_Convert_rule + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CONVERT_BEGIN; + + LPContextReturnable pContextReturnable = rdo::Factory::create(); + ASSERT(pContextReturnable); + + PARSER->contextStack()->push(pContextReturnable); + } + } + ; convert_event - : RDO_Convert_event - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::convertBegin; - - LPContextReturnable pContextReturnable = rdo::Factory::create(); - ASSERT(pContextReturnable); - - PARSER->contextStack()->push(pContextReturnable); - } - } - ; + : RDO_Convert_event + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CONVERT_BEGIN; + + LPContextReturnable pContextReturnable = rdo::Factory::create(); + ASSERT(pContextReturnable); + + PARSER->contextStack()->push(pContextReturnable); + } + } + ; convert_begin - : RDO_Convert_begin - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::convertBegin; - - LPContextReturnable pContextReturnable = rdo::Factory::create(); - ASSERT(pContextReturnable); - - PARSER->contextStack()->push(pContextReturnable); - } - } - ; + : RDO_Convert_begin + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CONVERT_BEGIN; + + LPContextReturnable pContextReturnable = rdo::Factory::create(); + ASSERT(pContextReturnable); + + PARSER->contextStack()->push(pContextReturnable); + } + } + ; convert_end - : RDO_Convert_end - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::convertEnd; - - LPContextReturnable pContextReturnable = rdo::Factory::create(); - ASSERT(pContextReturnable); - - PARSER->contextStack()->push(pContextReturnable); - } - } - ; + : RDO_Convert_end + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + pPattern->m_pCurrRelRes->m_currentState = RDORelevantResource::State::CONVERT_END; + + LPContextReturnable pContextReturnable = rdo::Factory::create(); + ASSERT(pContextReturnable); + + PARSER->contextStack()->push(pContextReturnable); + } + } + ; pat_pattern - : pat_convert RDO_End - { - #PASS2 - { - LPRDOPATPattern pPattern = PARSER->stack().pop($1); - pPattern->end(); - pPattern->popContext(); - $$ = PARSER->stack().push(pPattern); - } - } - ; + : pat_convert RDO_End + { + #PASS2 + { + LPRDOPATPattern pPattern = PARSER->stack().pop($1); + pPattern->end(); + pPattern->popContext(); + $$ = PARSER->stack().push(pPattern); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Список statement'ов для паттернов // -------------------------------------------------------------------------------- nochange_statement - : RDO_IDENTIF_NoChange ';' - { - #PASS2 - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(); - ASSERT(pCalc); - - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); - ASSERT(pType); - - LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); - ASSERT(pExpression); - - $$ = PARSER->stack().push(pExpression); - } - } - | RDO_IDENTIF_NoChange error - { - #PASS2 - { - PARSER->error().error(@2, "Не найден символ окончания инструкции - точка с запятой"); - } - } - ; + : RDO_IDENTIF_NoChange ';' + { + #PASS2 + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(); + ASSERT(pCalc); + + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); + ASSERT(pType); + + LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); + ASSERT(pExpression); + + $$ = PARSER->stack().push(pExpression); + } + } + | RDO_IDENTIF_NoChange error + { + #PASS2 + { + PARSER->error().error(@2, "Не найден символ окончания инструкции - точка с запятой"); + } + } + ; stopping_statement - : param_full_name '.' RDO_Stopping '(' ')' ';' - { - #PASS2 - { - Context::LPFindResult pPatternResult = PARSER->stack().pop($1); - ASSERT(pPatternResult->getSwitchContext()); - LPContext pPatternContext = pPatternResult->getSwitchContext().context; - ASSERT(pPatternContext); - - LPRDOPATPattern pPattern = pPatternContext.object_dynamic_cast(); - if (!pPattern) - { - PARSER->error().error(@1, rdo::format("Попытка остановить неизвестное событие: %s", pPattern->name().c_str())); - } - - LPRDOPatternEvent pEvent = pPattern.object_dynamic_cast(); - if (!pEvent) - { - PARSER->error().error(@1, rdo::format("Паттерн %s не является событием", pEvent->name().c_str())); - } - - rdo::runtime::LPRDOCalcEventStop pCalc = pEvent->stoping(); - pCalc->setSrcInfo(RDOParserSrcInfo(@1, @6, rdo::format("Остановка события %s", pEvent->name().c_str()))); - - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); - ASSERT(pType); - - LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); - ASSERT(pExpression); - - $$ = PARSER->stack().push(pExpression); - } - } - | param_full_name '.' RDO_Stopping '(' ')' error - { - #PASS2 - { - PARSER->error().error(@4, "Не найден символ окончания инструкции - точка с запятой"); - } - } - ; + : param_full_name '.' RDO_Stopping '(' ')' ';' + { + #PASS2 + { + Context::LPFindResult pPatternResult = PARSER->stack().pop($1); + ASSERT(pPatternResult->getSwitchContext()); + LPContext pPatternContext = pPatternResult->getSwitchContext().context; + ASSERT(pPatternContext); + + LPRDOPATPattern pPattern = pPatternContext.object_dynamic_cast(); + if (!pPattern) + { + PARSER->error().error(@1, rdo::format("Попытка остановить неизвестное событие: %s", pPattern->name().c_str())); + } + + LPRDOPatternEvent pEvent = pPattern.object_dynamic_cast(); + if (!pEvent) + { + PARSER->error().error(@1, rdo::format("Паттерн %s не является событием", pEvent->name().c_str())); + } + + rdo::runtime::LPRDOCalcEventStop pCalc = pEvent->stoping(); + pCalc->setSrcInfo(RDOParserSrcInfo(@1, @6, rdo::format("Остановка события %s", pEvent->name().c_str()))); + + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); + ASSERT(pType); + + LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); + ASSERT(pExpression); + + $$ = PARSER->stack().push(pExpression); + } + } + | param_full_name '.' RDO_Stopping '(' ')' error + { + #PASS2 + { + PARSER->error().error(@4, "Не найден символ окончания инструкции - точка с запятой"); + } + } + ; planning_statement - : param_full_name '.' RDO_Planning '(' arithm_list ')' ';' - { - #PASS2 - { - Context::LPFindResult pPatternResult = PARSER->stack().pop($1); - ASSERT(pPatternResult->getSwitchContext()); - LPContext pPatternContext = pPatternResult->getSwitchContext().context; - ASSERT(pPatternContext); - - LPRDOPATPattern pPattern = pPatternContext.object_dynamic_cast(); - if (!pPattern) - { - PARSER->error().error(@1, rdo::format("Попытка запланировать неизвестное событие: %s", pPattern->name().c_str())); - } - - LPArithmContainer pArithmList = PARSER->stack().pop($5); - - LPRDOPatternEvent pEvent = pPattern.object_dynamic_cast(); - if (!pEvent) - { - PARSER->error().error(@1, rdo::format("Паттерн %s не является событием", pEvent->name().c_str())); - } - - ArithmContainer::Container::const_iterator arithmIt = pArithmList->getContainer().begin(); - if (arithmIt == pArithmList->getContainer().end()) - { - PARSER->error().error(@1, rdo::format("Не указано время планирования события: %s", pEvent->name().c_str())); - } - - LPRDOFUNArithm pTimeArithm = *arithmIt; - ASSERT(pTimeArithm); - ++arithmIt; - - LPArithmContainer pParamList = rdo::Factory::create(); - ASSERT(pParamList); - - while (arithmIt != pArithmList->getContainer().end()) - { - pParamList->addItem(*arithmIt); - ++arithmIt; - } - - rdo::runtime::LPRDOCalc pCalcTime = pTimeArithm->createCalc(); - pCalcTime->setSrcInfo(pTimeArithm->src_info()); - ASSERT(pCalcTime); - - rdo::runtime::LPRDOCalcEventPlan pEventPlan = pEvent->planning(pCalcTime, pParamList); - pEventPlan->setSrcInfo(RDOParserSrcInfo(@1, @6, rdo::format("Планирование события %s в момент времени %s", pEvent->name().c_str(), pCalcTime->srcInfo().src_text().c_str()))); - - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); - ASSERT(pType); - - LPExpression pExpression = rdo::Factory::create(pType, pEventPlan, RDOParserSrcInfo(@1)); - ASSERT(pExpression); - - $$ = PARSER->stack().push(pExpression); - } - } - | param_full_name '.' RDO_Planning '(' arithm_list ')' error - { - #PASS2 - { - PARSER->error().error(@7, "Не найден символ окончания инструкции - точка с запятой"); - } - } - | param_full_name '.' RDO_Planning '(' error - { - #PASS2 - { - PARSER->error().error(@5, "Ошибка в арифметическом выражении"); - } - } - | param_full_name '.' RDO_Planning error - { - #PASS2 - { - PARSER->error().error(@4, "Ожидается открывающая скобка"); - } - } - | param_full_name '.' RDO_Planning '(' arithm_list error - { - #PASS2 - { - PARSER->error().error(@6, "Ожидается закрывающая скобка"); - } - } - ; + : param_full_name '.' RDO_Planning '(' arithm_list ')' ';' + { + #PASS2 + { + Context::LPFindResult pPatternResult = PARSER->stack().pop($1); + ASSERT(pPatternResult->getSwitchContext()); + LPContext pPatternContext = pPatternResult->getSwitchContext().context; + ASSERT(pPatternContext); + + LPRDOPATPattern pPattern = pPatternContext.object_dynamic_cast(); + if (!pPattern) + { + PARSER->error().error(@1, rdo::format("Попытка запланировать неизвестное событие: %s", pPattern->name().c_str())); + } + + LPArithmContainer pArithmList = PARSER->stack().pop($5); + + LPRDOPatternEvent pEvent = pPattern.object_dynamic_cast(); + if (!pEvent) + { + PARSER->error().error(@1, rdo::format("Паттерн %s не является событием", pEvent->name().c_str())); + } + + ArithmContainer::Container::const_iterator arithmIt = pArithmList->getContainer().begin(); + if (arithmIt == pArithmList->getContainer().end()) + { + PARSER->error().error(@1, rdo::format("Не указано время планирования события: %s", pEvent->name().c_str())); + } + + LPRDOFUNArithm pTimeArithm = *arithmIt; + ASSERT(pTimeArithm); + ++arithmIt; + + LPArithmContainer pParamList = rdo::Factory::create(); + ASSERT(pParamList); + + while (arithmIt != pArithmList->getContainer().end()) + { + pParamList->addItem(*arithmIt); + ++arithmIt; + } + + rdo::runtime::LPRDOCalc pCalcTime = pTimeArithm->createCalc(); + pCalcTime->setSrcInfo(pTimeArithm->src_info()); + ASSERT(pCalcTime); + + rdo::runtime::LPRDOCalcEventPlan pEventPlan = pEvent->planning(pCalcTime, pParamList); + pEventPlan->setSrcInfo(RDOParserSrcInfo(@1, @6, rdo::format("Планирование события %s в момент времени %s", pEvent->name().c_str(), pCalcTime->srcInfo().src_text().c_str()))); + + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); + ASSERT(pType); + + LPExpression pExpression = rdo::Factory::create(pType, pEventPlan, RDOParserSrcInfo(@1)); + ASSERT(pExpression); + + $$ = PARSER->stack().push(pExpression); + } + } + | param_full_name '.' RDO_Planning '(' arithm_list ')' error + { + #PASS2 + { + PARSER->error().error(@7, "Не найден символ окончания инструкции - точка с запятой"); + } + } + | param_full_name '.' RDO_Planning '(' error + { + #PASS2 + { + PARSER->error().error(@5, "Ошибка в арифметическом выражении"); + } + } + | param_full_name '.' RDO_Planning error + { + #PASS2 + { + PARSER->error().error(@4, "Ожидается открывающая скобка"); + } + } + | param_full_name '.' RDO_Planning '(' arithm_list error + { + #PASS2 + { + PARSER->error().error(@6, "Ожидается закрывающая скобка"); + } + } + ; process_input_statement - : param_full_name '.' RDO_ProcessStart '(' RDO_IDENTIF ')' ';' - { - #PASS2 - { - Context::LPFindResult pProcessResult = PARSER->stack().pop($1); - ASSERT(pProcessResult->getSwitchContext()); - LPContext pProcessContext = pProcessResult->getSwitchContext().context; - ASSERT(pProcessContext); - - LPRDOPROCProcess pProcess = pProcessContext.object_dynamic_cast(); - if (!pProcess) - { - PARSER->error().error(@1, rdo::format("Попытка запустить неизвестный процесс: %s", pProcess->name().c_str())); - } - - LPIPROCBlock pBlock = (*(pProcess->getBlockList().begin()))->getRuntimeBlock(); - ASSERT(pBlock); - - const std::string relResName = PARSER->stack().pop($5)->value().getIdentificator(); - - LPRDOPATPattern pPattern = PARSER->context()->cast(); - ASSERT(pPattern); - /*из-за использования RDO_IDENTIF_RELRES findRelevantResource() всегда находит ресурс*/ - LPRDORelevantResource pRelRes = pPattern->findRelevantResource(relResName); - const std::string relResTypeName = pRelRes->getType()->name(); - - if (!pProcess->checkTransactType(relResTypeName)) - { - PARSER->error().error(@1, rdo::format("Процесс %s ожидает в качестве транзактов ресурсы типа %s, а не %s", pProcess->name().c_str(), "true_resTypeName", relResTypeName.c_str())); - } - - rdo::runtime::LPRDOCalcProcessControl pCalc = rdo::Factory::create(pBlock, pRelRes->m_relResID); - ASSERT(pCalc); - - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); - ASSERT(pType); - - LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); - ASSERT(pExpression); - - $$ = PARSER->stack().push(pExpression); - } - } - | param_full_name '.' RDO_ProcessStart '(' error ')' ';' - { - #PASS2 - { - PARSER->error().error(@5, "В качестве транзакта процессу можно передавать только релеватный ресурс"); - } - } - ; + : param_full_name '.' RDO_ProcessStart '(' RDO_IDENTIF ')' ';' + { + #PASS2 + { + Context::LPFindResult pProcessResult = PARSER->stack().pop($1); + ASSERT(pProcessResult->getSwitchContext()); + LPContext pProcessContext = pProcessResult->getSwitchContext().context; + ASSERT(pProcessContext); + + LPRDOPROCProcess pProcess = pProcessContext.object_dynamic_cast(); + if (!pProcess) + { + PARSER->error().error(@1, rdo::format("Попытка запустить неизвестный процесс: %s", pProcess->name().c_str())); + } + + LPIPROCBlock pBlock = (*(pProcess->getBlockList().begin()))->getRuntimeBlock(); + ASSERT(pBlock); + + const std::string relResName = PARSER->stack().pop($5)->value().getIdentificator(); + + LPRDOPATPattern pPattern = PARSER->context()->cast(); + ASSERT(pPattern); + /*из-за использования RDO_IDENTIF_RELRES findRelevantResource() всегда находит ресурс*/ + LPRDORelevantResource pRelRes = pPattern->findRelevantResource(relResName); + const std::string relResTypeName = pRelRes->getType()->name(); + + if (!pProcess->checkTransactType(relResTypeName)) + { + PARSER->error().error(@1, rdo::format("Процесс %s ожидает в качестве транзактов ресурсы типа %s, а не %s", pProcess->name().c_str(), "true_resTypeName", relResTypeName.c_str())); + } + + rdo::runtime::LPRDOCalcProcessControl pCalc = rdo::Factory::create(pBlock, pRelRes->m_relResID); + ASSERT(pCalc); + + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); + ASSERT(pType); + + LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); + ASSERT(pExpression); + + $$ = PARSER->stack().push(pExpression); + } + } + | param_full_name '.' RDO_ProcessStart '(' error ')' ';' + { + #PASS2 + { + PARSER->error().error(@5, "В качестве транзакта процессу можно передавать только релеватный ресурс"); + } + } + ; watch_start - : param_full_name '.' RDO_WatchStart '(' ')' ';' - { - #PASS2 - { - Context::LPFindResult pResultGroupResult = PARSER->stack().pop($1); - ASSERT(pResultGroupResult->getSwitchContext()); - LPContext pResultGroupContext = pResultGroupResult->getSwitchContext().context; - ASSERT(pResultGroupContext); - - LPRDOResultGroup pResultGroup = pResultGroupContext.object_dynamic_cast(); - if (!pResultGroup) - { - PARSER->error().error(@1, rdo::format("Неизвестная группа показателей: %s", pResultGroup->name().c_str())); - } - - rdo::runtime::LPRDOCalcWatchGroupStart pCalc = rdo::Factory::create(pResultGroup->getRuntime()); - ASSERT(pCalc); - - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); - ASSERT(pType); - - LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); - ASSERT(pExpression); - - $$ = PARSER->stack().push(pExpression); - } - } - ; + : param_full_name '.' RDO_WatchStart '(' ')' ';' + { + #PASS2 + { + Context::LPFindResult pResultGroupResult = PARSER->stack().pop($1); + ASSERT(pResultGroupResult->getSwitchContext()); + LPContext pResultGroupContext = pResultGroupResult->getSwitchContext().context; + ASSERT(pResultGroupContext); + + LPRDOResultGroup pResultGroup = pResultGroupContext.object_dynamic_cast(); + if (!pResultGroup) + { + PARSER->error().error(@1, rdo::format("Неизвестная группа показателей: %s", pResultGroup->name().c_str())); + } + + rdo::runtime::LPRDOCalcWatchGroupStart pCalc = rdo::Factory::create(pResultGroup->getRuntime()); + ASSERT(pCalc); + + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); + ASSERT(pType); + + LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); + ASSERT(pExpression); + + $$ = PARSER->stack().push(pExpression); + } + } + ; watch_stop - : param_full_name '.' RDO_WatchStop '(' ')' ';' - { - #PASS2 - { - Context::LPFindResult pResultGroupResult = PARSER->stack().pop($1); - ASSERT(pResultGroupResult->getSwitchContext()); - LPContext pResultGroupContext = pResultGroupResult->getSwitchContext().context; - ASSERT(pResultGroupContext); - - LPRDOResultGroup pResultGroup = pResultGroupContext.object_dynamic_cast(); - if (!pResultGroup) - { - PARSER->error().error(@1, rdo::format("Неизвестная группа показателей: %s", pResultGroup->name().c_str())); - } - - rdo::runtime::LPRDOCalcWatchGroupStop pCalc = rdo::Factory::create(pResultGroup->getRuntime()); - ASSERT(pCalc); - - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); - ASSERT(pType); - - LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); - ASSERT(pExpression); - - $$ = PARSER->stack().push(pExpression); - } - } - ; + : param_full_name '.' RDO_WatchStop '(' ')' ';' + { + #PASS2 + { + Context::LPFindResult pResultGroupResult = PARSER->stack().pop($1); + ASSERT(pResultGroupResult->getSwitchContext()); + LPContext pResultGroupContext = pResultGroupResult->getSwitchContext().context; + ASSERT(pResultGroupContext); + + LPRDOResultGroup pResultGroup = pResultGroupContext.object_dynamic_cast(); + if (!pResultGroup) + { + PARSER->error().error(@1, rdo::format("Неизвестная группа показателей: %s", pResultGroup->name().c_str())); + } + + rdo::runtime::LPRDOCalcWatchGroupStop pCalc = rdo::Factory::create(pResultGroup->getRuntime()); + ASSERT(pCalc); + + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); + ASSERT(pType); + + LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); + ASSERT(pExpression); + + $$ = PARSER->stack().push(pExpression); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Синтаксис точек принятия решений @@ -3154,1227 +3141,1318 @@ watch_stop // -------------------- DPT // -------------------------------------------------------------------------------- dpt_main - : dpt_search_end - { - #PASS2 - { - LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); - ASSERT(pDPTSearch); - } - } - | dpt_some_end - { - #PASS2 - { - LPRDODPTSome pDPTSome = PARSER->stack().pop($1); - ASSERT(pDPTSome); - } - } - | dpt_prior_end - { - #PASS2 - { - LPRDODPTPrior pDPTPrior = PARSER->stack().pop($1); - ASSERT(pDPTPrior); - } - } - ; + : dpt_search_end + { + #PASS2 + { + LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); + ASSERT(pDPTSearch); + } + } + | dpt_some_end + { + #PASS2 + { + LPRDODPTSome pDPTSome = PARSER->stack().pop($1); + ASSERT(pDPTSome); + } + } + | dpt_prior_end + { + #PASS2 + { + LPRDODPTPrior pDPTPrior = PARSER->stack().pop($1); + ASSERT(pDPTPrior); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- DPTSearch // -------------------------------------------------------------------------------- dpt_search_trace - : /* empty */ - { - #PASS2 - { - $$ = rdo::runtime::RDODPTSearchTrace::DPT_no_trace; - } - } - | RDO_no_trace - { - #PASS2 - { - $$ = rdo::runtime::RDODPTSearchTrace::DPT_no_trace; - } - } - | RDO_trace - { - #PASS2 - { - PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа search"); - } - } - | RDO_trace_stat - { - #PASS2 - { - $$ = rdo::runtime::RDODPTSearchTrace::DPT_trace_stat; - } - } - | RDO_trace_tops - { - #PASS2 - { - $$ = rdo::runtime::RDODPTSearchTrace::DPT_trace_tops; - } - } - | RDO_trace_all - { - #PASS2 - { - $$ = rdo::runtime::RDODPTSearchTrace::DPT_trace_all; - } - } - ; + : /* empty */ + { + #PASS2 + { + $$ = static_cast(rdo::runtime::RDODPTSearchTrace::TraceFlag::NO_TRACE); + } + } + | RDO_no_trace + { + #PASS2 + { + $$ = static_cast(rdo::runtime::RDODPTSearchTrace::TraceFlag::NO_TRACE); + } + } + | RDO_trace + { + #PASS2 + { + PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа search"); + } + } + | RDO_trace_stat + { + #PASS2 + { + $$ = static_cast(rdo::runtime::RDODPTSearchTrace::TraceFlag::TRACE_STAT); + } + } + | RDO_trace_tops + { + #PASS2 + { + $$ = static_cast(rdo::runtime::RDODPTSearchTrace::TraceFlag::TRACE_TOPS); + } + } + | RDO_trace_all + { + #PASS2 + { + $$ = static_cast(rdo::runtime::RDODPTSearchTrace::TraceFlag::TRACE_ALL); + } + } + ; dpt_search_parent - : /* empty */ - { - #PASS2 - { - $$ = PARSER->stack().push(rdo::Factory::create()); - } - } - | RDO_Parent RDO_IDENTIF - { - #PASS2 - { - $$ = $2; - } - } - | RDO_Parent error - { - #PASS2 - { - PARSER->error().error(@1, "Ошибка в имени родительской точки"); - } - } - ; + : /* empty */ + { + #PASS2 + { + $$ = PARSER->stack().push(rdo::Factory::create()); + } + } + | RDO_Parent RDO_IDENTIF + { + #PASS2 + { + $$ = $2; + } + } + | RDO_Parent error + { + #PASS2 + { + PARSER->error().error(@1, "Ошибка в имени родительской точки"); + } + } + ; dpt_search_begin - : RDO_Decision_point RDO_IDENTIF_COLON RDO_search dpt_search_parent dpt_search_trace - { - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($2); - LPRDOValue pParentName = PARSER->stack().pop($4); - ASSERT(pName); - - LPRDODPTSearch pDPTSearch; - if (pParentName->defined()) - { - LPRDODPTPrior pParentDPTPrior = PARSER->findDPTPrior (pParentName->value().getIdentificator()); - LPRDODPTSearch pParentDPTSearch = PARSER->findDPTSearch(pParentName->value().getIdentificator()); - LPRDODPTSome pParentDPTSome = PARSER->findDPTSome (pParentName->value().getIdentificator()); - if (!pParentDPTPrior && !pParentDPTSearch && !pParentDPTSome) - { - PARSER->error().error(@1, rdo::format("Не найдена родитеская точка %s", pParentName->value().getIdentificator().c_str())); - } - if (pParentDPTSearch) - { - PARSER->error().error(@1, "Точка принятия решений типа search может содержать лишь активности типа rule и не может быть указана в качестве родительской точки"); - } - else if (pParentDPTPrior) - { - LPILogic pParent = pParentDPTPrior->getLogic(); - ASSERT(pParent); - pDPTSearch = rdo::Factory::create(pName->src_info(), *reinterpret_cast(&$5), pParent); - } - else if (pParentDPTSome) - { - LPILogic pParent = pParentDPTSome->getLogic(); - ASSERT(pParent); - pDPTSearch = rdo::Factory::create(pName->src_info(), *reinterpret_cast(&$5), pParent); - } - } - else - { - pDPTSearch = rdo::Factory::create(pName->src_info(), *reinterpret_cast(&$5)); - } - ASSERT(pDPTSearch); - $$ = PARSER->stack().push(pDPTSearch); - } - } - | RDO_Decision_point RDO_IDENTIF_COLON error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается тип точки"); - } - } - | RDO_Decision_point RDO_IDENTIF error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается двоеточие"); - } - } - | RDO_Decision_point error - { - #PASS2 - { - PARSER->error().error(@1, @2, "После ключевого слова $Decision_point ожидается имя точки"); - } - } - ; + : RDO_Decision_point RDO_IDENTIF_COLON RDO_search dpt_search_parent dpt_search_trace + { + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($2); + LPRDOValue pParentName = PARSER->stack().pop($4); + ASSERT(pName); + + LPRDODPTSearch pDPTSearch; + if (pParentName->defined()) + { + LPRDODPTPrior pParentDPTPrior = PARSER->findDPTPrior (pParentName->value().getIdentificator()); + LPRDODPTSearch pParentDPTSearch = PARSER->findDPTSearch(pParentName->value().getIdentificator()); + LPRDODPTSome pParentDPTSome = PARSER->findDPTSome (pParentName->value().getIdentificator()); + if (!pParentDPTPrior && !pParentDPTSearch && !pParentDPTSome) + { + PARSER->error().error(@1, rdo::format("Не найдена родитеская точка %s", pParentName->value().getIdentificator().c_str())); + } + if (pParentDPTSearch) + { + PARSER->error().error(@1, "Точка принятия решений типа search может содержать лишь активности типа rule и не может быть указана в качестве родительской точки"); + } + else if (pParentDPTPrior) + { + LPILogic pParent = pParentDPTPrior->getLogic(); + ASSERT(pParent); + pDPTSearch = rdo::Factory::create(pName->src_info(), *reinterpret_cast(&$5), pParent); + } + else if (pParentDPTSome) + { + LPILogic pParent = pParentDPTSome->getLogic(); + ASSERT(pParent); + pDPTSearch = rdo::Factory::create(pName->src_info(), *reinterpret_cast(&$5), pParent); + } + } + else + { + pDPTSearch = rdo::Factory::create(pName->src_info(), *reinterpret_cast(&$5)); + } + ASSERT(pDPTSearch); + $$ = PARSER->stack().push(pDPTSearch); + } + } + | RDO_Decision_point RDO_IDENTIF_COLON error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается тип точки"); + } + } + | RDO_Decision_point RDO_IDENTIF error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается двоеточие"); + } + } + | RDO_Decision_point error + { + #PASS2 + { + PARSER->error().error(@1, @2, "После ключевого слова $Decision_point ожидается имя точки"); + } + } + ; dpt_search_condition - : dpt_search_begin RDO_Condition fun_logic - { - #PASS2 - { - LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setCondition(PARSER->stack().pop($3)); - $$ = PARSER->stack().push(pDPTSearch); - } - } - | dpt_search_begin RDO_Condition RDO_NoCheck - { - #PASS2 - { - LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setCondition(); - $$ = PARSER->stack().push(pDPTSearch); - } - } - | dpt_search_begin RDO_Condition error - { - #PASS2 - { - PARSER->error().error(@2, @3, "После ключевого слова $Condition ожидается условие начала поиска (начальная вершина)"); - } - } - | dpt_search_begin error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается ключевое слово $Condition"); - } - } - ; + : dpt_search_begin RDO_Condition fun_logic + { + #PASS2 + { + LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setCondition(PARSER->stack().pop($3)); + $$ = PARSER->stack().push(pDPTSearch); + } + } + | dpt_search_begin RDO_Condition RDO_NoCheck + { + #PASS2 + { + LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setCondition(); + $$ = PARSER->stack().push(pDPTSearch); + } + } + | dpt_search_begin RDO_Condition error + { + #PASS2 + { + PARSER->error().error(@2, @3, "После ключевого слова $Condition ожидается условие начала поиска (начальная вершина)"); + } + } + | dpt_search_begin error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается ключевое слово $Condition"); + } + } + ; dpt_search_prior - : dpt_search_condition - | dpt_search_condition RDO_Priority fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($3); - ASSERT(pArithm); - if (!PARSER->getLastDPTSearch()->setPrior(pArithm)) - { - PARSER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); - } - } - } - | dpt_search_condition RDO_Priority error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); - } - } - | dpt_search_condition error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ожидается ключевое слово $Priority"); - } - } - ; + : dpt_search_condition + | dpt_search_condition RDO_Priority fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($3); + ASSERT(pArithm); + if (!PARSER->getLastDPTSearch()->setPrior(pArithm)) + { + PARSER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); + } + } + } + | dpt_search_condition RDO_Priority error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); + } + } + | dpt_search_condition error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ожидается ключевое слово $Priority"); + } + } + ; dpt_search_term - : dpt_search_prior RDO_Term_condition fun_logic - { - #PASS2 - { - LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setTermCondition(PARSER->stack().pop($3)); - $$ = PARSER->stack().push(pDPTSearch); - } - } - | dpt_search_prior RDO_Term_condition RDO_NoCheck - { - #PASS2 - { - LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setTermCondition(); - $$ = PARSER->stack().push(pDPTSearch); - } - } - | dpt_search_prior RDO_Term_condition error - { - #PASS2 - { - PARSER->error().error(@2, @3, "После ключевого слова $Term_condition ожидается условие остановки поиска (конечная вершина)"); - } - } - | dpt_search_prior error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается ключевое слово $Term_condition"); - } - } - ; + : dpt_search_prior RDO_Term_condition fun_logic + { + #PASS2 + { + LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setTermCondition(PARSER->stack().pop($3)); + $$ = PARSER->stack().push(pDPTSearch); + } + } + | dpt_search_prior RDO_Term_condition RDO_NoCheck + { + #PASS2 + { + LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setTermCondition(); + $$ = PARSER->stack().push(pDPTSearch); + } + } + | dpt_search_prior RDO_Term_condition error + { + #PASS2 + { + PARSER->error().error(@2, @3, "После ключевого слова $Term_condition ожидается условие остановки поиска (конечная вершина)"); + } + } + | dpt_search_prior error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается ключевое слово $Term_condition"); + } + } + ; dpt_search_evaluate - : dpt_search_term RDO_Evaluate_by fun_arithm - { - #PASS2 - { - LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setEvaluateBy(PARSER->stack().pop($3)); - $$ = PARSER->stack().push(pDPTSearch); - } - } - | dpt_search_term RDO_Evaluate_by error - { - #PASS2 - { - PARSER->error().error(@2, @3, "После ключевого слова $Evaluate_by ожидается оценочная функция, например, 0 для поиска в ширину"); - } - } - | dpt_search_term error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается ключевое слово $Evaluate_by"); - } - } - ; + : dpt_search_term RDO_Evaluate_by fun_arithm + { + #PASS2 + { + LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setEvaluateBy(PARSER->stack().pop($3)); + $$ = PARSER->stack().push(pDPTSearch); + } + } + | dpt_search_term RDO_Evaluate_by error + { + #PASS2 + { + PARSER->error().error(@2, @3, "После ключевого слова $Evaluate_by ожидается оценочная функция, например, 0 для поиска в ширину"); + } + } + | dpt_search_term error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается ключевое слово $Evaluate_by"); + } + } + ; dp_searcht_compare - : dpt_search_evaluate RDO_Compare_tops '=' RDO_NO - { - #PASS2 - { - LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setCompareTops(false); - $$ = PARSER->stack().push(pDPTSearch); - } - } - | dpt_search_evaluate RDO_Compare_tops '=' RDO_YES - { - #PASS2 - { - LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->setCompareTops(true); - $$ = PARSER->stack().push(pDPTSearch); - } - } - | dpt_search_evaluate RDO_Compare_tops '=' error - { - #PASS2 - { - PARSER->error().error(@3, @4, "Ожидается режим запоминания пройденных вершин (YES или NO)"); - } - } - | dpt_search_evaluate RDO_Compare_tops error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается знак равенства"); - } - } - | dpt_search_evaluate error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается ключевое слово $Compare_tops"); - } - } - ; + : dpt_search_evaluate RDO_Compare_tops '=' RDO_NO + { + #PASS2 + { + LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setCompareTops(false); + $$ = PARSER->stack().push(pDPTSearch); + } + } + | dpt_search_evaluate RDO_Compare_tops '=' RDO_YES + { + #PASS2 + { + LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->setCompareTops(true); + $$ = PARSER->stack().push(pDPTSearch); + } + } + | dpt_search_evaluate RDO_Compare_tops '=' error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ожидается режим запоминания пройденных вершин (YES или NO)"); + } + } + | dpt_search_evaluate RDO_Compare_tops error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается знак равенства"); + } + } + | dpt_search_evaluate error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается ключевое слово $Compare_tops"); + } + } + ; +dpt_search_descr_param_arithm + : fun_arithm + { + #PASS2 + { + LPRDOValue pConstant = PARSER->stack().pop($1)->expression()->constant(); + if (!pConstant || !pConstant->defined()) + { + PARSER->error().error(@1, "Параметр может быть только константой"); + } + LPRDOValue pValue = rdo::Factory::create(pConstant); + ASSERT(pValue); + PARSER->getLastDPTSearch()->getLastActivity()->addParam(pValue); + } + } + ; dpt_search_descr_param - : /* empty */ - | dpt_search_descr_param fun_arithm - { - #PASS2 - { - LPRDOValue pConstant = PARSER->stack().pop($2)->expression()->constant(); - if (!pConstant || !pConstant->defined()) - { - PARSER->error().error(@2, "Параметр может быть только константой"); - } - LPRDOValue pValue = rdo::Factory::create(pConstant); - ASSERT(pValue); - PARSER->getLastDPTSearch()->getLastActivity()->addParam(pValue); - } - } - | dpt_search_descr_param error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ошибка описания параметра образца"); - } - } - ; + : dpt_search_descr_param_arithm + | dpt_search_descr_param ',' dpt_search_descr_param_arithm + | dpt_search_descr_param error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ошибка описания параметра образца"); + } + } + ; dpt_search_descr_value - : RDO_value_before fun_arithm - { - #PASS2 - { - LPRDODPTSearch pDPTSearch = PARSER->getLastDPTSearch(); - ASSERT(pDPTSearch); - pDPTSearch->getLastActivity()->setValue(IDPTSearchActivity::vt_before, PARSER->stack().pop($2)); - } - } - | RDO_value_after fun_arithm - { - #PASS2 - { - LPRDODPTSearch pDPTSearch = PARSER->getLastDPTSearch(); - ASSERT(pDPTSearch); - pDPTSearch->getLastActivity()->setValue(IDPTSearchActivity::vt_after, PARSER->stack().pop($2)); - } - } - | RDO_value_before error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ошибка в арифметическом выражении"); - } - } - | RDO_value_after error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ошибка в арифметическом выражении"); - } - } - ; + : RDO_value_before fun_arithm + { + #PASS2 + { + LPRDODPTSearch pDPTSearch = PARSER->getLastDPTSearch(); + ASSERT(pDPTSearch); + pDPTSearch->getLastActivity()->setValue(IDPTSearchActivity::CostTime::BEFORE, PARSER->stack().pop($2)); + } + } + | RDO_value_after fun_arithm + { + #PASS2 + { + LPRDODPTSearch pDPTSearch = PARSER->getLastDPTSearch(); + ASSERT(pDPTSearch); + pDPTSearch->getLastActivity()->setValue(IDPTSearchActivity::CostTime::AFTER, PARSER->stack().pop($2)); + } + } + | RDO_value_before error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ошибка в арифметическом выражении"); + } + } + | RDO_value_after error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ошибка в арифметическом выражении"); + } + } + ; dpt_search_name - : RDO_IDENTIF_COLON RDO_IDENTIF - { - #PASS2 - { - LPRDODPTSearch pDPTSearch = PARSER->getLastDPTSearch(); - ASSERT(pDPTSearch); - LPRDOValue pName = PARSER->stack().pop($1); - LPRDOValue pPattern = PARSER->stack().pop($2); - ASSERT(pName ); - ASSERT(pPattern); - LPRDODPTActivity pActivity = pDPTSearch->addNewActivity(pName->src_info(), pPattern->src_info()); - ASSERT(pActivity); - $$ = PARSER->stack().push(pActivity); - } - } - | RDO_IDENTIF_COLON error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ожидается имя образца"); - } - } - | RDO_IDENTIF - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается ':'"); - } - } - | error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается имя активности"); - } - } - ; + : RDO_IDENTIF_COLON RDO_IDENTIF + { + #PASS2 + { + LPRDODPTSearch pDPTSearch = PARSER->getLastDPTSearch(); + ASSERT(pDPTSearch); + LPRDOValue pName = PARSER->stack().pop($1); + LPRDOValue pPattern = PARSER->stack().pop($2); + ASSERT(pName ); + ASSERT(pPattern); + LPRDODPTActivity pActivity = pDPTSearch->addNewActivity(pName->src_info(), pPattern->src_info()); + ASSERT(pActivity); + $$ = PARSER->stack().push(pActivity); + } + } + | RDO_IDENTIF_COLON error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ожидается имя образца"); + } + } + | RDO_IDENTIF + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается ':'"); + } + } + | error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается имя активности"); + } + } + ; + +dpt_searcht_activity_param + : /* empty */ + | '(' dpt_search_descr_param ')' + ; dpt_searcht_activity - : /* empty */ - { - #PASS2 - { - $$ = PARSER->stack().push(LPRDODPTActivity()); - } - } - | dpt_searcht_activity dpt_search_name dpt_search_descr_param dpt_search_descr_value - { - #PASS2 - { - LPRDODPTActivity pActivity = PARSER->stack().pop($2); - ASSERT(pActivity) - pActivity->endParam(@3); - $$ = PARSER->stack().push(pActivity); - } - } - | dpt_searcht_activity dpt_search_name dpt_search_descr_param error - { - #PASS2 - { - PARSER->error().error(@3, @4, "Ожидаются ключевые слова value before или value after и стоимость применения правила"); - } - } - ; + : /* empty */ + { + #PASS2 + { + $$ = PARSER->stack().push(LPRDODPTActivity()); + } + } + | dpt_searcht_activity dpt_search_name dpt_searcht_activity_param dpt_search_descr_value ';' + { + #PASS2 + { + LPRDODPTActivity pActivity = PARSER->stack().pop($2); + ASSERT(pActivity) + pActivity->endParam(@3); + $$ = PARSER->stack().push(pActivity); + } + } + | dpt_searcht_activity dpt_search_name error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается открывающая скобка или ключевые слова value before или value after и стоимость применения правила"); + } + } + | dpt_searcht_activity dpt_search_name '(' error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ошибка описания параметров образца"); + } + } + | dpt_searcht_activity dpt_search_name dpt_searcht_activity_param error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ожидается ключевые слова value before или value after и стоимость применения правила"); + } + } + | dpt_searcht_activity dpt_search_name dpt_searcht_activity_param dpt_search_descr_value error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается точка с запятой"); + } + } + ; dpt_search_header - : dp_searcht_compare RDO_Activities dpt_searcht_activity - | dp_searcht_compare error - { - #PASS2 - { - PARSER->error().error(@1, @2, "После режима запоминания пройденных вершин ожидается ключевое слово $Activities"); - } - } - ; + : dp_searcht_compare RDO_Activities dpt_searcht_activity + | dp_searcht_compare error + { + #PASS2 + { + PARSER->error().error(@1, @2, "После режима запоминания пройденных вершин ожидается ключевое слово $Activities"); + } + } + ; dpt_search_end - : dpt_search_header RDO_End - { - #PASS2 - { - LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); - ASSERT(pDPTSearch); - pDPTSearch->end(); - $$ = PARSER->stack().push(pDPTSearch); - } - } - | dpt_search_header - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается ключевое слово $End"); - } - } - ; + : dpt_search_header RDO_End + { + #PASS2 + { + LPRDODPTSearch pDPTSearch = PARSER->stack().pop($1); + ASSERT(pDPTSearch); + pDPTSearch->end(); + $$ = PARSER->stack().push(pDPTSearch); + } + } + | dpt_search_header + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается ключевое слово $End"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- DPTSome // -------------------------------------------------------------------------------- dpt_some_trace - : /* empty */ - { - #PASS2 - { - $$ = 1; - } - } - | RDO_no_trace - { - #PASS2 - { - $$ = 1; - } - } - | RDO_trace - { - #PASS2 - { - $$ = 2; - } - } - | RDO_trace_stat - { - #PASS2 - { - PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа some"); - } - } - | RDO_trace_tops - { - #PASS2 - { - PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа some"); - } - } - | RDO_trace_all - { - #PASS2 - { - PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа some"); - } - } - ; + : /* empty */ + { + #PASS2 + { + $$ = 1; + } + } + | RDO_no_trace + { + #PASS2 + { + $$ = 1; + } + } + | RDO_trace + { + #PASS2 + { + $$ = 2; + } + } + | RDO_trace_stat + { + #PASS2 + { + PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа some"); + } + } + | RDO_trace_tops + { + #PASS2 + { + PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа some"); + } + } + | RDO_trace_all + { + #PASS2 + { + PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа some"); + } + } + ; dpt_some_parent - : /* empty */ - { - #PASS2 - { - $$ = PARSER->stack().push(rdo::Factory::create()); - } - } - | RDO_Parent RDO_IDENTIF - { - #PASS2 - { - $$ = $2; - } - } - | RDO_Parent error - { - #PASS2 - { - PARSER->error().error(@1, "Ошибка в имени родительской точки"); - } - } - ; + : /* empty */ + { + #PASS2 + { + $$ = PARSER->stack().push(rdo::Factory::create()); + } + } + | RDO_Parent RDO_IDENTIF + { + #PASS2 + { + $$ = $2; + } + } + | RDO_Parent error + { + #PASS2 + { + PARSER->error().error(@1, "Ошибка в имени родительской точки"); + } + } + ; dpt_some_begin - : RDO_Decision_point RDO_IDENTIF_COLON RDO_some dpt_some_trace dpt_some_parent - { - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($2); - LPRDOValue pParentName = PARSER->stack().pop($5); - ASSERT(pName); - - LPRDODPTSome pDPTSome; - if (pParentName->defined()) - { - LPRDODPTPrior pParentDPTPrior = PARSER->findDPTPrior (pParentName->value().getIdentificator()); - LPRDODPTSearch pParentDPTSearch = PARSER->findDPTSearch(pParentName->value().getIdentificator()); - LPRDODPTSome pParentDPTSome = PARSER->findDPTSome (pParentName->value().getIdentificator()); - if (!pParentDPTPrior && !pParentDPTSearch && !pParentDPTSome) - { - PARSER->error().error(@1, rdo::format("Не найдена родитеская точка %s", pParentName->value().getIdentificator().c_str())); - } - if (pParentDPTSearch) - { - PARSER->error().error(@5, @1, "Точка принятия решений типа search может содержать лишь активности типа rule и не может быть указана в качестве родительской точки"); - } - else if (pParentDPTPrior) - { - LPILogic pParentLogic = pParentDPTPrior->getLogic(); - ASSERT(pParentLogic); - pDPTSome = rdo::Factory::create(pName->src_info(), pParentLogic); - } - else if (pParentDPTSome) - { - LPILogic pParentLogic = pParentDPTSome->getLogic(); - ASSERT(pParentLogic); - pDPTSome = rdo::Factory::create(pName->src_info(), pParentLogic); - } - } - else - { - pDPTSome = rdo::Factory::create(pName->src_info()); - } - ASSERT(pDPTSome); - $$ = PARSER->stack().push(pDPTSome); - } - } - ; + : RDO_Decision_point RDO_IDENTIF_COLON RDO_some dpt_some_trace dpt_some_parent + { + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($2); + LPRDOValue pParentName = PARSER->stack().pop($5); + ASSERT(pName); + + LPRDODPTSome pDPTSome; + if (pParentName->defined()) + { + LPRDODPTPrior pParentDPTPrior = PARSER->findDPTPrior (pParentName->value().getIdentificator()); + LPRDODPTSearch pParentDPTSearch = PARSER->findDPTSearch(pParentName->value().getIdentificator()); + LPRDODPTSome pParentDPTSome = PARSER->findDPTSome (pParentName->value().getIdentificator()); + if (!pParentDPTPrior && !pParentDPTSearch && !pParentDPTSome) + { + PARSER->error().error(@1, rdo::format("Не найдена родитеская точка %s", pParentName->value().getIdentificator().c_str())); + } + if (pParentDPTSearch) + { + PARSER->error().error(@5, @1, "Точка принятия решений типа search может содержать лишь активности типа rule и не может быть указана в качестве родительской точки"); + } + else if (pParentDPTPrior) + { + LPILogic pParentLogic = pParentDPTPrior->getLogic(); + ASSERT(pParentLogic); + pDPTSome = rdo::Factory::create(pName->src_info(), pParentLogic); + } + else if (pParentDPTSome) + { + LPILogic pParentLogic = pParentDPTSome->getLogic(); + ASSERT(pParentLogic); + pDPTSome = rdo::Factory::create(pName->src_info(), pParentLogic); + } + } + else + { + pDPTSome = rdo::Factory::create(pName->src_info()); + } + ASSERT(pDPTSome); + $$ = PARSER->stack().push(pDPTSome); + } + } + ; dpt_some_condition - : dpt_some_begin RDO_Condition fun_logic - { - #PASS2 - { - LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); - ASSERT(pLogicBase); - pLogicBase->setCondition(PARSER->stack().pop($3)); - $$ = PARSER->stack().push(pLogicBase); - } - } - | dpt_some_begin RDO_Condition RDO_NoCheck - { - #PASS2 - { - LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); - ASSERT(pLogicBase); - pLogicBase->setCondition(); - $$ = PARSER->stack().push(pLogicBase); - } - } - | dpt_some_begin RDO_Condition error - { - #PASS2 - { - PARSER->error().error(@2, @3, "После ключевого слова $Condition ожидается условие запуска точки"); - } - } - | dpt_some_begin - { - #PASS2 - { - LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); - ASSERT(pLogicBase); - pLogicBase->setCondition(); - $$ = PARSER->stack().push(pLogicBase); - } - } - ; + : dpt_some_begin RDO_Condition fun_logic + { + #PASS2 + { + LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); + ASSERT(pLogicBase); + pLogicBase->setCondition(PARSER->stack().pop($3)); + $$ = PARSER->stack().push(pLogicBase); + } + } + | dpt_some_begin RDO_Condition RDO_NoCheck + { + #PASS2 + { + LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); + ASSERT(pLogicBase); + pLogicBase->setCondition(); + $$ = PARSER->stack().push(pLogicBase); + } + } + | dpt_some_begin RDO_Condition error + { + #PASS2 + { + PARSER->error().error(@2, @3, "После ключевого слова $Condition ожидается условие запуска точки"); + } + } + | dpt_some_begin + { + #PASS2 + { + LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); + ASSERT(pLogicBase); + pLogicBase->setCondition(); + $$ = PARSER->stack().push(pLogicBase); + } + } + ; dpt_some_multi - : dpt_some_condition RDO_Multithreading '=' RDO_NO - { - #PASS2 - { - LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); - ASSERT(pLogicBase); - pLogicBase->setMultithreading(false); - $$ = PARSER->stack().push(pLogicBase); - } - } - | dpt_some_condition RDO_Multithreading '=' RDO_YES - { - #PASS2 - { - LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); - ASSERT(pLogicBase); - pLogicBase->setMultithreading(true); - $$ = PARSER->stack().push(pLogicBase); - } - } - | dpt_some_condition RDO_Multithreading error - { - #PASS2 - { - PARSER->error().error(@2, @3, "После ключевого слова $Multithreading ожидается знак равенства и слово YES или NO"); - } - } - | dpt_some_condition - { - #PASS2 - { - LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); - ASSERT(pLogicBase); - pLogicBase->setMultithreading(false); - $$ = PARSER->stack().push(pLogicBase); - } - } - ; + : dpt_some_condition RDO_Multithreading '=' RDO_NO + { + #PASS2 + { + LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); + ASSERT(pLogicBase); + pLogicBase->setMultithreading(false); + $$ = PARSER->stack().push(pLogicBase); + } + } + | dpt_some_condition RDO_Multithreading '=' RDO_YES + { + #PASS2 + { + LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); + ASSERT(pLogicBase); + pLogicBase->setMultithreading(true); + $$ = PARSER->stack().push(pLogicBase); + } + } + | dpt_some_condition RDO_Multithreading error + { + #PASS2 + { + PARSER->error().error(@2, @3, "После ключевого слова $Multithreading ожидается знак равенства и слово YES или NO"); + } + } + | dpt_some_condition + { + #PASS2 + { + LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); + ASSERT(pLogicBase); + pLogicBase->setMultithreading(false); + $$ = PARSER->stack().push(pLogicBase); + } + } + ; dpt_some_prior - : dpt_some_multi - | dpt_some_multi RDO_Priority fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($3); - ASSERT(pArithm); - if (!PARSER->getLastDPTSome()->setPrior(pArithm)) - { - PARSER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); - } - } - } - | dpt_some_multi RDO_Priority error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); - } - } - | dpt_some_multi error - { - #PASS2 - { - PARSER->error().error(@1, @2, "После слова $Condition ожидается ключевое слово $Multithreading"); - } - } - ; + : dpt_some_multi + | dpt_some_multi RDO_Priority fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($3); + ASSERT(pArithm); + if (!PARSER->getLastDPTSome()->setPrior(pArithm)) + { + PARSER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); + } + } + } + | dpt_some_multi RDO_Priority error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); + } + } + | dpt_some_multi error + { + #PASS2 + { + PARSER->error().error(@1, @2, "После слова $Condition ожидается ключевое слово $Multithreading"); + } + } + ; dpt_some_name - : RDO_IDENTIF_COLON RDO_IDENTIF - { - #PASS2 - { - LPRDODPTSome pDPTSome = PARSER->getLastDPTSome(); - ASSERT(pDPTSome); - LPRDOValue pName = PARSER->stack().pop($1); - LPRDOValue pPattern = PARSER->stack().pop($2); - ASSERT(pName ); - ASSERT(pPattern); - LPRDODPTActivity pActivity = pDPTSome->addNewActivity(pName->src_info(), pPattern->src_info()); - ASSERT(pActivity); - $$ = PARSER->stack().push(pActivity); - } - } - | RDO_IDENTIF_COLON error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ожидается имя образца"); - } - } - | RDO_IDENTIF - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается ':'"); - } - } - | error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается имя активности"); - } - } - ; + : RDO_IDENTIF_COLON RDO_IDENTIF + { + #PASS2 + { + LPRDODPTSome pDPTSome = PARSER->getLastDPTSome(); + ASSERT(pDPTSome); + LPRDOValue pName = PARSER->stack().pop($1); + LPRDOValue pPattern = PARSER->stack().pop($2); + ASSERT(pName ); + ASSERT(pPattern); + LPRDODPTActivity pActivity = pDPTSome->addNewActivity(pName->src_info(), pPattern->src_info()); + ASSERT(pActivity); + $$ = PARSER->stack().push(pActivity); + } + } + | RDO_IDENTIF_COLON error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ожидается имя образца"); + } + } + | RDO_IDENTIF + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается ':'"); + } + } + | error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается имя активности"); + } + } + ; dpt_some_descr_keyb - : /* empty */ - | dpt_some_descr_keyb '+' RDO_STRING_CONST - { - #PASS2 - { - LPRDODPTActivityHotKey pActivityHotKey = PARSER->getLastDPTSome()->getLastActivity(); - ASSERT(pActivityHotKey); - const std::string key = PARSER->stack().pop($3)->value().getString(); - pActivityHotKey->addHotKey(key, @3); - } - } - | RDO_STRING_CONST - { - #PASS2 - { - LPRDODPTActivityHotKey pActivityHotKey = PARSER->getLastDPTSome()->getLastActivity(); - ASSERT(pActivityHotKey); - const std::string key = PARSER->stack().pop($1)->value().getString(); - pActivityHotKey->addHotKey(key, @1); - } - } - ; + : dpt_some_descr_keyb '+' RDO_STRING_CONST + { + #PASS2 + { + LPRDODPTActivityHotKey pActivityHotKey = PARSER->getLastDPTSome()->getLastActivity(); + ASSERT(pActivityHotKey); + const std::string key = PARSER->stack().pop($3)->value().getString(); + pActivityHotKey->addHotKey(key, @3); + } + } + | RDO_STRING_CONST + { + #PASS2 + { + LPRDODPTActivityHotKey pActivityHotKey = PARSER->getLastDPTSome()->getLastActivity(); + ASSERT(pActivityHotKey); + const std::string key = PARSER->stack().pop($1)->value().getString(); + pActivityHotKey->addHotKey(key, @1); + } + } + ; + +dpt_some_descr_param_arithm + : fun_arithm + { + #PASS2 + { + LPRDOValue pConstant = PARSER->stack().pop($1)->expression()->constant(); + if (!pConstant || !pConstant->defined()) + { + PARSER->error().error(@1, "Параметр может быть только константой"); + } + LPRDOValue pValue = rdo::Factory::create(pConstant); + ASSERT(pValue); + PARSER->getLastDPTSome()->getLastActivity()->addParam(pValue); + } + } + ; dpt_some_descr_param - : /* empty */ - | dpt_some_descr_param fun_arithm - { - #PASS2 - { - LPRDOValue pConstant = PARSER->stack().pop($2)->expression()->constant(); - if (!pConstant || !pConstant->defined()) - { - PARSER->error().error(@2, "Параметр может быть только константой"); - } - LPRDOValue pValue = rdo::Factory::create(pConstant); - ASSERT(pValue); - PARSER->getLastDPTSome()->getLastActivity()->addParam(pValue); - } - } - | dpt_some_descr_param error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ошибка описания параметра образца"); - } - } - ; + : dpt_some_descr_param_arithm + | dpt_some_descr_param ',' dpt_some_descr_param_arithm + | dpt_some_descr_param ',' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ошибка описания параметра образца"); + } + } + ; + +dpt_some_activity_param + : /* empty */ + | '(' dpt_some_descr_param ')' + | '(' dpt_some_descr_keyb ')' + | '(' dpt_some_descr_keyb ',' dpt_some_descr_param ')' + ; dpt_some_activity - : /* empty */ - { - #PASS2 - { - $$ = PARSER->stack().push(LPRDODPTActivity()); - } - } - | dpt_some_activity dpt_some_name dpt_some_descr_keyb dpt_some_descr_param - { - #PASS2 - { - LPRDODPTActivity pActivity = PARSER->stack().pop($2); - ASSERT(pActivity); - pActivity->endParam(@3); - $$ = PARSER->stack().push(pActivity); - } - } - ; + : /* empty */ + { + #PASS2 + { + $$ = PARSER->stack().push(LPRDODPTActivity()); + } + } + | dpt_some_activity dpt_some_name dpt_some_activity_param ';' + { + #PASS2 + { + LPRDODPTActivity pActivity = PARSER->stack().pop($2); + ASSERT(pActivity); + pActivity->endParam(@3); + $$ = PARSER->stack().push(pActivity); + } + } + | dpt_some_activity dpt_some_name error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается открывающая скобка или точка с запятой"); + } + } + | dpt_some_activity dpt_some_name '(' error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ошибка описания параметров образца"); + } + } + | dpt_some_activity dpt_some_name dpt_some_activity_param error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ожидается точка с запятой"); + } + } + ; dpt_some_header - : dpt_some_prior RDO_Activities dpt_some_activity - | dpt_some_prior error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ожидается ключевое слово $Activities"); - } - } - ; + : dpt_some_prior RDO_Activities dpt_some_activity + | dpt_some_prior error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ожидается ключевое слово $Activities"); + } + } + ; dpt_some_end - : dpt_some_header RDO_End - { - #PASS2 - { - LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); - ASSERT(pLogicBase); - pLogicBase->end(); - $$ = PARSER->stack().push(pLogicBase); - } - } - | dpt_some_header - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается ключевое слово $End"); - } - } - ; + : dpt_some_header RDO_End + { + #PASS2 + { + LPRDOLogicBase pLogicBase = PARSER->stack().pop($1); + ASSERT(pLogicBase); + pLogicBase->end(); + $$ = PARSER->stack().push(pLogicBase); + } + } + | dpt_some_header + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается ключевое слово $End"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- DPT Prior // -------------------------------------------------------------------------------- dpt_prior_trace - : /* empty */ - { - #PASS2 - { - $$ = 1; - } - } - | RDO_no_trace - { - #PASS2 - { - $$ = 1; - } - } - | RDO_trace - { - #PASS2 - { - $$ = 2; - } - } - | RDO_trace_stat - { - #PASS2 - { - PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа prior"); - } - } - | RDO_trace_tops - { - #PASS2 - { - PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа prior"); - } - } - | RDO_trace_all - { - #PASS2 - { - PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа prior"); - } - } - ; + : /* empty */ + { + #PASS2 + { + $$ = 1; + } + } + | RDO_no_trace + { + #PASS2 + { + $$ = 1; + } + } + | RDO_trace + { + #PASS2 + { + $$ = 2; + } + } + | RDO_trace_stat + { + #PASS2 + { + PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа prior"); + } + } + | RDO_trace_tops + { + #PASS2 + { + PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа prior"); + } + } + | RDO_trace_all + { + #PASS2 + { + PARSER->error().error(@1, "Данный признак трассировки не используется в точке типа prior"); + } + } + ; dpt_prior_parent - : /* empty */ - { - #PASS2 - { - $$ = PARSER->stack().push(rdo::Factory::create()); - } - } - | RDO_Parent RDO_IDENTIF - { - #PASS2 - { - $$ = $2; - } - } - | RDO_Parent error - { - #PASS2 - { - PARSER->error().error(@1, "Ошибка в имени родительской точки"); - } - } - ; + : /* empty */ + { + #PASS2 + { + $$ = PARSER->stack().push(rdo::Factory::create()); + } + } + | RDO_Parent RDO_IDENTIF + { + #PASS2 + { + $$ = $2; + } + } + | RDO_Parent error + { + #PASS2 + { + PARSER->error().error(@1, "Ошибка в имени родительской точки"); + } + } + ; dpt_prior_begin - : RDO_Decision_point RDO_IDENTIF_COLON RDO_prior dpt_prior_parent dpt_prior_trace - { - #PASS2 - { - //! @todo а где признак трассировки для prior ? - LPRDOValue pName = PARSER->stack().pop($2); - LPRDOValue pParentName = PARSER->stack().pop($4); - ASSERT(pName); - - LPRDODPTPrior pDPTPrior; - if (pParentName->defined()) - { - LPRDODPTPrior pParentDPTPrior = PARSER->findDPTPrior (pParentName->value().getIdentificator()); - LPRDODPTSearch pParentDPTSearch = PARSER->findDPTSearch(pParentName->value().getIdentificator()); - LPRDODPTSome pParentDPTSome = PARSER->findDPTSome (pParentName->value().getIdentificator()); - if (!pParentDPTPrior && !pParentDPTSome && !pParentDPTSearch) - { - PARSER->error().error(@1, rdo::format("Не найдена родитеская точка %s", pParentName->value().getIdentificator().c_str())); - } - if (pParentDPTSearch) - { - PARSER->error().error(@5, @1, "Точка принятия решений типа search может содержать лишь активности типа rule и не может быть указана в качестве родительской точки"); - } - else if (pParentDPTPrior) - { - LPILogic pParentLogic = pParentDPTPrior->getLogic(); - ASSERT(pParentLogic); - pDPTPrior = rdo::Factory::create(pName->src_info(), pParentLogic); - } - else if (pParentDPTSome) - { - LPILogic pParentLogic = pParentDPTSome->getLogic(); - ASSERT(pParentLogic); - pDPTPrior = rdo::Factory::create(pName->src_info(), pParentLogic); - } - } - else - { - pDPTPrior = rdo::Factory::create(pName->src_info()); - } - ASSERT(pDPTPrior); - $$ = PARSER->stack().push(pDPTPrior); - } - } - ; + : RDO_Decision_point RDO_IDENTIF_COLON RDO_prior dpt_prior_parent dpt_prior_trace + { + #PASS2 + { + // TODO а где признак трассировки для prior ? + LPRDOValue pName = PARSER->stack().pop($2); + LPRDOValue pParentName = PARSER->stack().pop($4); + ASSERT(pName); + + LPRDODPTPrior pDPTPrior; + if (pParentName->defined()) + { + LPRDODPTPrior pParentDPTPrior = PARSER->findDPTPrior (pParentName->value().getIdentificator()); + LPRDODPTSearch pParentDPTSearch = PARSER->findDPTSearch(pParentName->value().getIdentificator()); + LPRDODPTSome pParentDPTSome = PARSER->findDPTSome (pParentName->value().getIdentificator()); + if (!pParentDPTPrior && !pParentDPTSome && !pParentDPTSearch) + { + PARSER->error().error(@1, rdo::format("Не найдена родитеская точка %s", pParentName->value().getIdentificator().c_str())); + } + if (pParentDPTSearch) + { + PARSER->error().error(@5, @1, "Точка принятия решений типа search может содержать лишь активности типа rule и не может быть указана в качестве родительской точки"); + } + else if (pParentDPTPrior) + { + LPILogic pParentLogic = pParentDPTPrior->getLogic(); + ASSERT(pParentLogic); + pDPTPrior = rdo::Factory::create(pName->src_info(), pParentLogic); + } + else if (pParentDPTSome) + { + LPILogic pParentLogic = pParentDPTSome->getLogic(); + ASSERT(pParentLogic); + pDPTPrior = rdo::Factory::create(pName->src_info(), pParentLogic); + } + } + else + { + pDPTPrior = rdo::Factory::create(pName->src_info()); + } + ASSERT(pDPTPrior); + $$ = PARSER->stack().push(pDPTPrior); + } + } + ; dpt_prior_condition - : dpt_prior_begin RDO_Condition fun_logic - { - #PASS2 - { - LPRDODPTPrior pDPTPrior = PARSER->stack().pop($1); - ASSERT(pDPTPrior); - pDPTPrior->setCondition(PARSER->stack().pop($3)); - $$ = PARSER->stack().push(pDPTPrior); - } - } - | dpt_prior_begin RDO_Condition RDO_NoCheck - { - #PASS2 - { - LPRDODPTPrior pDPTPrior = PARSER->stack().pop($1); - ASSERT(pDPTPrior); - pDPTPrior->setCondition(); - $$ = PARSER->stack().push(pDPTPrior); - } - } - | dpt_prior_begin RDO_Condition error - { - #PASS2 - { - PARSER->error().error(@2, @3, "После ключевого слова $Condition ожидается условие запуска точки"); - } - } - | dpt_prior_begin - { - #PASS2 - { - LPRDODPTPrior pDPTPrior = PARSER->stack().pop($1); - ASSERT(pDPTPrior); - pDPTPrior->setCondition(); - $$ = PARSER->stack().push(pDPTPrior); - } - } - ; + : dpt_prior_begin RDO_Condition fun_logic + { + #PASS2 + { + LPRDODPTPrior pDPTPrior = PARSER->stack().pop($1); + ASSERT(pDPTPrior); + pDPTPrior->setCondition(PARSER->stack().pop($3)); + $$ = PARSER->stack().push(pDPTPrior); + } + } + | dpt_prior_begin RDO_Condition RDO_NoCheck + { + #PASS2 + { + LPRDODPTPrior pDPTPrior = PARSER->stack().pop($1); + ASSERT(pDPTPrior); + pDPTPrior->setCondition(); + $$ = PARSER->stack().push(pDPTPrior); + } + } + | dpt_prior_begin RDO_Condition error + { + #PASS2 + { + PARSER->error().error(@2, @3, "После ключевого слова $Condition ожидается условие запуска точки"); + } + } + | dpt_prior_begin + { + #PASS2 + { + LPRDODPTPrior pDPTPrior = PARSER->stack().pop($1); + ASSERT(pDPTPrior); + pDPTPrior->setCondition(); + $$ = PARSER->stack().push(pDPTPrior); + } + } + ; dpt_prior_prior - : dpt_prior_condition - | dpt_prior_condition RDO_Priority fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($3); - ASSERT(pArithm); - if (!PARSER->getLastDPTPrior()->setPrior(pArithm)) - { - PARSER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); - } - } - } - | dpt_prior_condition RDO_Priority error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); - } - } - | dpt_some_condition error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ожидается ключевое слово $Priority"); - } - } - ; + : dpt_prior_condition + | dpt_prior_condition RDO_Priority fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($3); + ASSERT(pArithm); + if (!PARSER->getLastDPTPrior()->setPrior(pArithm)) + { + PARSER->error().error(@3, "Точка принятия решений пока не может иметь приоритет"); + } + } + } + | dpt_prior_condition RDO_Priority error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ошибка описания приоритета точки принятия решений"); + } + } + | dpt_some_condition error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ожидается ключевое слово $Priority"); + } + } + ; dpt_prior_name - : RDO_IDENTIF_COLON RDO_IDENTIF - { - #PASS2 - { - LPRDODPTPrior pDPTPrior = PARSER->getLastDPTPrior(); - ASSERT(pDPTPrior); - LPRDOValue pName = PARSER->stack().pop($1); - LPRDOValue pPattern = PARSER->stack().pop($2); - ASSERT(pName ); - ASSERT(pPattern); - LPRDODPTActivity pActivity = pDPTPrior->addNewActivity(pName->src_info(), pPattern->src_info()); - ASSERT(pActivity); - $$ = PARSER->stack().push(pActivity); - } - } - | RDO_IDENTIF_COLON error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ожидается имя образца"); - } - } - | RDO_IDENTIF - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается ':'"); - } - } - | error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается имя активности"); - } - } - ; + : RDO_IDENTIF_COLON RDO_IDENTIF + { + #PASS2 + { + LPRDODPTPrior pDPTPrior = PARSER->getLastDPTPrior(); + ASSERT(pDPTPrior); + LPRDOValue pName = PARSER->stack().pop($1); + LPRDOValue pPattern = PARSER->stack().pop($2); + ASSERT(pName ); + ASSERT(pPattern); + LPRDODPTActivity pActivity = pDPTPrior->addNewActivity(pName->src_info(), pPattern->src_info()); + ASSERT(pActivity); + $$ = PARSER->stack().push(pActivity); + } + } + | RDO_IDENTIF_COLON error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ожидается имя образца"); + } + } + | RDO_IDENTIF + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается ':'"); + } + } + | error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается имя активности"); + } + } + ; dpt_prior_descr_keyb - : /* empty */ - | dpt_prior_descr_keyb '+' RDO_STRING_CONST - { - #PASS2 - { - LPRDODPTActivityHotKey pActivityHotKey = PARSER->getLastDPTPrior()->getLastActivity(); - ASSERT(pActivityHotKey); - const std::string key = PARSER->stack().pop($3)->value().getString(); - pActivityHotKey->addHotKey(key, @3); - } - } - | RDO_STRING_CONST - { - #PASS2 - { - LPRDODPTActivityHotKey pActivityHotKey = PARSER->getLastDPTPrior()->getLastActivity(); - ASSERT(pActivityHotKey); - const std::string key = PARSER->stack().pop($1)->value().getString(); - pActivityHotKey->addHotKey(key, @1); - } - } - ; + : dpt_prior_descr_keyb '+' RDO_STRING_CONST + { + #PASS2 + { + LPRDODPTActivityHotKey pActivityHotKey = PARSER->getLastDPTPrior()->getLastActivity(); + ASSERT(pActivityHotKey); + const std::string key = PARSER->stack().pop($3)->value().getString(); + pActivityHotKey->addHotKey(key, @3); + } + } + | RDO_STRING_CONST + { + #PASS2 + { + LPRDODPTActivityHotKey pActivityHotKey = PARSER->getLastDPTPrior()->getLastActivity(); + ASSERT(pActivityHotKey); + const std::string key = PARSER->stack().pop($1)->value().getString(); + pActivityHotKey->addHotKey(key, @1); + } + } + ; + +dpt_prior_descr_param_arithm + : fun_arithm + { + #PASS2 + { + LPRDOValue pConstant = PARSER->stack().pop($1)->expression()->constant(); + if (!pConstant || !pConstant->defined()) + { + PARSER->error().error(@1, "Параметр может быть только константой"); + } + LPRDOValue pValue = rdo::Factory::create(pConstant); + ASSERT(pValue); + PARSER->getLastDPTPrior()->getLastActivity()->addParam(pValue); + } + } + ; dpt_prior_descr_param - : /* empty */ - | dpt_prior_descr_param fun_arithm - { - #PASS2 - { - LPRDOValue pConstant = PARSER->stack().pop($2)->expression()->constant(); - if (!pConstant || !pConstant->defined()) - { - PARSER->error().error(@2, "Параметр может быть только константой"); - } - LPRDOValue pValue = rdo::Factory::create(pConstant); - ASSERT(pValue); - PARSER->getLastDPTPrior()->getLastActivity()->addParam(pValue); - } - } - | dpt_prior_descr_param error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ошибка описания параметра образца"); - } - } - ; + : dpt_prior_descr_param_arithm + | dpt_prior_descr_param ',' dpt_prior_descr_param_arithm + | dpt_prior_descr_param ',' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ошибка описания параметра образца"); + } + } + ; dpt_prior_activ_prior - : /* empty */ - | RDO_CF '=' fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($3); - ASSERT(pArithm); - if (!PARSER->getLastDPTPrior()->getLastActivity()->setPrior(pArithm)) - { - PARSER->error().error(@3, "Активность не может иметь приоритет"); - } - } - } - | RDO_CF '=' error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ошибка описания приоритета активности"); - } - } - | RDO_CF error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ошибка: ожидается знак равенства"); - } - } - ; + : /* empty */ + | RDO_CF '=' fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($3); + ASSERT(pArithm); + if (!PARSER->getLastDPTPrior()->getLastActivity()->setPrior(pArithm)) + { + PARSER->error().error(@3, "Активность не может иметь приоритет"); + } + } + } + | RDO_CF '=' error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ошибка описания приоритета активности"); + } + } + | RDO_CF error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ошибка: ожидается знак равенства"); + } + } + ; + +dpt_prior_activity_param + : /* empty */ + | '(' dpt_prior_descr_keyb ')' + | '(' dpt_prior_descr_param ')' + | '(' dpt_prior_descr_keyb ',' dpt_prior_descr_param ')' + ; dpt_prior_activity - : /* empty */ - { - #PASS2 - { - $$ = PARSER->stack().push(LPRDODPTActivity()); - } - } - | dpt_prior_activity dpt_prior_name dpt_prior_descr_keyb dpt_prior_descr_param dpt_prior_activ_prior - { - #PASS2 - { - LPRDODPTActivity pActivity = PARSER->stack().pop($2); - ASSERT(pActivity); - pActivity->endParam(@3); - $$ = PARSER->stack().push(pActivity); - } - } - ; + : /* empty */ + { + #PASS2 + { + $$ = PARSER->stack().push(LPRDODPTActivity()); + } + } + | dpt_prior_activity dpt_prior_name dpt_prior_activity_param dpt_prior_activ_prior ';' + { + #PASS2 + { + LPRDODPTActivity pActivity = PARSER->stack().pop($2); + ASSERT(pActivity); + pActivity->endParam(@3); + $$ = PARSER->stack().push(pActivity); + } + } + | dpt_prior_activity dpt_prior_name error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается открывающая скобка, точка с запятой или описание приоритета активности"); + } + } + | dpt_prior_activity dpt_prior_name '(' error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ошибка описания параметров образца"); + } + } + | dpt_prior_activity dpt_prior_name dpt_prior_activity_param error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ожидается точка с запятой или описание приоритета активности"); + } + } + ; dpt_prior_header - : dpt_prior_prior RDO_Activities dpt_prior_activity - | dpt_prior_prior error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ожидается ключевое слово $Activities"); - } - } - ; + : dpt_prior_prior RDO_Activities dpt_prior_activity + | dpt_prior_prior error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ожидается ключевое слово $Activities"); + } + } + ; dpt_prior_end - : dpt_prior_header RDO_End - { - #PASS2 - { - LPRDODPTPrior pDPTPrior = PARSER->stack().pop($1); - ASSERT(pDPTPrior); - pDPTPrior->end(); - $$ = PARSER->stack().push(pDPTPrior); - } - } - | dpt_prior_header - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается ключевое слово $End"); - } - } - ; + : dpt_prior_header RDO_End + { + #PASS2 + { + LPRDODPTPrior pDPTPrior = PARSER->stack().pop($1); + ASSERT(pDPTPrior); + pDPTPrior->end(); + $$ = PARSER->stack().push(pDPTPrior); + } + } + | dpt_prior_header + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается ключевое слово $End"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Синтаксис анимации @@ -4382,2236 +4460,2237 @@ dpt_prior_end // -------------------- Основной цикл // -------------------------------------------------------------------------------- frm_main - : frm_end - | frm_sprite_end - ; + : frm_end + | frm_sprite_end + ; // -------------------------------------------------------------------------------- // -------------------- Фрейм // -------------------------------------------------------------------------------- frm_begin - : RDO_Frame RDO_IDENTIF - { - #PASS2 - { - LPRDOFRMFrame pFrame = rdo::Factory::create(PARSER->stack().pop($2)->src_info()); - ASSERT(pFrame); - $$ = PARSER->stack().push(pFrame); - - LPIContextParamDefinitionManager pContextParamDefinitionManager = PARSER->context()->interface_cast(); - ASSERT(pContextParamDefinitionManager); - pContextParamDefinitionManager->pushParamDefinitionContext(); - pContextParamDefinitionManager->popParamDefinitionContext (); - - LPIContextFunctionBodyManager pContextFunctionBodyManager = PARSER->context()->interface_cast(); - ASSERT(pContextFunctionBodyManager); - pContextFunctionBodyManager->pushFunctionBodyContext(); - } - } - ; + : RDO_Frame RDO_IDENTIF + { + #PASS2 + { + LPRDOFRMFrame pFrame = rdo::Factory::create(PARSER->stack().pop($2)->src_info()); + ASSERT(pFrame); + $$ = PARSER->stack().push(pFrame); + + LPIContextParamDefinitionManager pContextParamDefinitionManager = PARSER->context()->interface_cast(); + ASSERT(pContextParamDefinitionManager); + pContextParamDefinitionManager->pushParamDefinitionContext(); + pContextParamDefinitionManager->popParamDefinitionContext (); + + LPIContextFunctionBodyManager pContextFunctionBodyManager = PARSER->context()->interface_cast(); + ASSERT(pContextFunctionBodyManager); + pContextFunctionBodyManager->pushFunctionBodyContext(); + } + } + ; frm_background - : frm_begin RDO_Back_picture '=' frm_color - { - #PASS2 - { - LPRDOFRMFrame pFrame = PARSER->stack().pop($1); - ASSERT(pFrame); - LPRDOFRMColor pBgColor = PARSER->stack().pop($4); - ASSERT(pBgColor); - if (pBgColor->getType() != RDOFRMColor::CT_TRANSPARENT && pBgColor->getType() != RDOFRMColor::CT_RGB) - { - PARSER->error().error(@4, "Цвет фона не может быть указан ссылкой на последнее значение"); - } - pFrame->frame()->setBackgroundColor(pBgColor); - $$ = PARSER->stack().push(pFrame); - } - } - | frm_begin RDO_Back_picture '=' - { - #PASS2 - { - LPRDOFRMFrame pFrame = PARSER->stack().pop($1); - ASSERT(pFrame); - $$ = PARSER->stack().push(pFrame); - } - } - | frm_begin RDO_Back_picture error - { - #PASS2 - { - PARSER->error().error(@3, "После ключевого слова $Back_picture ожидается знак равенства"); - } - } - | frm_begin error - { - #PASS2 - { - PARSER->error().error(@2, "После имени кадра ожидается ключевое слово $Back_picture"); - } - } - ; + : frm_begin RDO_Back_picture '=' frm_color + { + #PASS2 + { + LPRDOFRMFrame pFrame = PARSER->stack().pop($1); + ASSERT(pFrame); + LPRDOFRMColor pBgColor = PARSER->stack().pop($4); + ASSERT(pBgColor); + if (pBgColor->getType() != RDOFRMColor::Type::TRANSPARENT_COLOR && pBgColor->getType() != RDOFRMColor::Type::RGB) + { + PARSER->error().error(@4, "Цвет фона не может быть указан ссылкой на последнее значение"); + } + pFrame->frame()->setBackgroundColor(pBgColor); + $$ = PARSER->stack().push(pFrame); + } + } + | frm_begin RDO_Back_picture '=' + { + #PASS2 + { + LPRDOFRMFrame pFrame = PARSER->stack().pop($1); + ASSERT(pFrame); + $$ = PARSER->stack().push(pFrame); + } + } + | frm_begin RDO_Back_picture error + { + #PASS2 + { + PARSER->error().error(@3, "После ключевого слова $Back_picture ожидается знак равенства"); + } + } + | frm_begin error + { + #PASS2 + { + PARSER->error().error(@2, "После имени кадра ожидается ключевое слово $Back_picture"); + } + } + ; frm_backpicture - : frm_background RDO_IDENTIF - { - #PASS2 - { - LPRDOFRMFrame pFrame = PARSER->stack().pop($1); - ASSERT(pFrame); - pFrame->frame()->setBackPicture(PARSER->stack().pop($2)->value().getIdentificator()); - $$ = PARSER->stack().push(pFrame); - } - } - | frm_background RDO_INT_CONST RDO_INT_CONST - { - #PASS2 - { - LPRDOFRMFrame pFrame = PARSER->stack().pop($1); - ASSERT(pFrame); - pFrame->frame()->setBackPicture(PARSER->stack().pop($2)->value().getInt(), PARSER->stack().pop($3)->value().getInt()); - $$ = PARSER->stack().push(pFrame); - } - } - | frm_background RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@2, "После ширины кадра необходимо указать его высоту"); - } - } - | frm_background - { - #PASS2 - { - PARSER->error().error(@1, "Необходимо указать имя фоновой картинки или размер кадра"); - } - } - ; + : frm_background RDO_IDENTIF + { + #PASS2 + { + LPRDOFRMFrame pFrame = PARSER->stack().pop($1); + ASSERT(pFrame); + pFrame->frame()->setBackPicture(PARSER->stack().pop($2)->value().getIdentificator()); + $$ = PARSER->stack().push(pFrame); + } + } + | frm_background RDO_INT_CONST RDO_INT_CONST + { + #PASS2 + { + LPRDOFRMFrame pFrame = PARSER->stack().pop($1); + ASSERT(pFrame); + pFrame->frame()->setBackPicture(PARSER->stack().pop($2)->value().getInt(), PARSER->stack().pop($3)->value().getInt()); + $$ = PARSER->stack().push(pFrame); + } + } + | frm_background RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@2, "После ширины кадра необходимо указать его высоту"); + } + } + | frm_background + { + #PASS2 + { + PARSER->error().error(@1, "Необходимо указать имя фоновой картинки или размер кадра"); + } + } + ; frm_header - : frm_backpicture statement_list - { - #PASS2 - { - LPExpression pExpressionBody = PARSER->stack().pop($2); - ASSERT(pExpressionBody); - - LPContextFunctionBody pContextFunctionBody = PARSER->context()->cast(); - ASSERT(pContextFunctionBody); - pContextFunctionBody->setBody(pExpressionBody->calc()); - - LPIContextFunctionBodyManager pContextFunctionBodyManager = PARSER->context()->interface_cast(); - ASSERT(pContextFunctionBodyManager); - pContextFunctionBodyManager->popFunctionBodyContext(); - - LPRDOFRMFrame pFrame = PARSER->stack().pop($1); - ASSERT(pFrame); - $$ = PARSER->stack().push(pFrame); - } - } - ; + : frm_backpicture statement_list + { + #PASS2 + { + LPExpression pExpressionBody = PARSER->stack().pop($2); + ASSERT(pExpressionBody); + + LPContextFunctionBody pContextFunctionBody = PARSER->context()->cast(); + ASSERT(pContextFunctionBody); + pContextFunctionBody->setBody(pExpressionBody->calc()); + + LPIContextFunctionBodyManager pContextFunctionBodyManager = PARSER->context()->interface_cast(); + ASSERT(pContextFunctionBodyManager); + pContextFunctionBodyManager->popFunctionBodyContext(); + + LPRDOFRMFrame pFrame = PARSER->stack().pop($1); + ASSERT(pFrame); + $$ = PARSER->stack().push(pFrame); + } + } + ; frm_end - : frm_header RDO_End - { - #PASS2 - { - LPRDOFRMFrame pFrame = PARSER->stack().pop($1); - ASSERT(pFrame); - pFrame->end(); - } - } - ; + : frm_header RDO_End + { + #PASS2 + { + LPRDOFRMFrame pFrame = PARSER->stack().pop($1); + ASSERT(pFrame); + pFrame->end(); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Спрайт // -------------------------------------------------------------------------------- frm_sprite_end - : frm_sprite_begin RDO_End - { - #PASS2 - { - LPRDOFRMSprite pSprite = PARSER->stack().pop($1); - ASSERT(pSprite); - pSprite->end(); - } - } - ; + : frm_sprite_begin RDO_End + { + #PASS2 + { + LPRDOFRMSprite pSprite = PARSER->stack().pop($1); + ASSERT(pSprite); + pSprite->end(); + } + } + ; frm_sprite_begin - : frm_sprite_header statement_list - { - #PASS2 - { - LPExpression pExpressionBody = PARSER->stack().pop($2); - ASSERT(pExpressionBody); - - LPContextFunctionBody pContextFunctionBody = PARSER->context()->cast(); - ASSERT(pContextFunctionBody); - pContextFunctionBody->setBody(pExpressionBody->calc()); - - LPIContextFunctionBodyManager pContextFunctionBodyManager = PARSER->context()->interface_cast(); - ASSERT(pContextFunctionBodyManager); - pContextFunctionBodyManager->popFunctionBodyContext(); - - LPRDOFRMSprite pSprite = PARSER->stack().pop($1); - ASSERT(pSprite); - $$ = PARSER->stack().push(pSprite); - } - } - ; + : frm_sprite_header statement_list + { + #PASS2 + { + LPExpression pExpressionBody = PARSER->stack().pop($2); + ASSERT(pExpressionBody); + + LPContextFunctionBody pContextFunctionBody = PARSER->context()->cast(); + ASSERT(pContextFunctionBody); + pContextFunctionBody->setBody(pExpressionBody->calc()); + + LPIContextFunctionBodyManager pContextFunctionBodyManager = PARSER->context()->interface_cast(); + ASSERT(pContextFunctionBodyManager); + pContextFunctionBodyManager->popFunctionBodyContext(); + + LPRDOFRMSprite pSprite = PARSER->stack().pop($1); + ASSERT(pSprite); + $$ = PARSER->stack().push(pSprite); + } + } + ; frm_sprite_header_begin - : RDO_Sprite RDO_IDENTIF - { - #PASS2 - { - LPRDOFRMSprite pSprite = rdo::Factory::create(PARSER->stack().pop($2)->src_info()); - ASSERT(pSprite); - $$ = PARSER->stack().push(pSprite); - } - } - ; + : RDO_Sprite RDO_IDENTIF + { + #PASS2 + { + LPRDOFRMSprite pSprite = rdo::Factory::create(PARSER->stack().pop($2)->src_info()); + ASSERT(pSprite); + $$ = PARSER->stack().push(pSprite); + } + } + ; frm_sprite_header - : frm_sprite_header_begin param_list - { - #PASS2 - { - LPIContextFunctionBodyManager pContextFunctionBodyManager = PARSER->context()->interface_cast(); - ASSERT(pContextFunctionBodyManager); - pContextFunctionBodyManager->pushFunctionBodyContext(); - - LPRDOFRMSprite pSprite = PARSER->stack().pop($1); - ASSERT(pSprite); - $$ = PARSER->stack().push(pSprite); - } - } - ; + : frm_sprite_header_begin param_list + { + #PASS2 + { + LPIContextFunctionBodyManager pContextFunctionBodyManager = PARSER->context()->interface_cast(); + ASSERT(pContextFunctionBodyManager); + pContextFunctionBodyManager->pushFunctionBodyContext(); + + LPRDOFRMSprite pSprite = PARSER->stack().pop($1); + ASSERT(pSprite); + $$ = PARSER->stack().push(pSprite); + } + } + ; frm_sprite - : RDO_sprite_call RDO_IDENTIF '(' arithm_list ')' - { - #PASS2 - { - LPRDOValue pValue = PARSER->stack().pop($2); - LPArithmContainer pArithmContainer = PARSER->stack().pop($4); - ASSERT(pValue); - ASSERT(pArithmContainer); - - const std::string funName = pValue->value().getIdentificator(); - - LPExpression pFunctionExpression = RDOFUNArithm::generateByIdentificator(pValue)->expression(); - ASSERT(pFunctionExpression); - - LPRDOFUNParams pFunParams = rdo::Factory::create(pArithmContainer); - ASSERT(pFunParams); - - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@2, funName)); - pFunParams->setSrcPos (@2, @5); - pFunParams->setSrcText(funName + "(" + pArithmContainer->src_text() + ")"); - LPExpression pExpression = pFunParams->createCallExpression(pFunctionExpression); - ASSERT(pExpression); - $$ = PARSER->stack().push(pExpression); - } - } - | RDO_sprite_call RDO_IDENTIF '(' arithm_list error - { - #PASS2 - { - PARSER->error().error(@5, "Ожидается закрывающая скобка"); - } - } - | RDO_sprite_call RDO_IDENTIF '(' error - { - #PASS2 - { - PARSER->error().error(@4, "Ошибка задания параметров"); - } - } - | RDO_sprite_call RDO_IDENTIF error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается открывающая скобка"); - } - } - ; + : RDO_sprite_call RDO_IDENTIF '(' arithm_list ')' + { + #PASS2 + { + LPRDOValue pValue = PARSER->stack().pop($2); + LPArithmContainer pArithmContainer = PARSER->stack().pop($4); + ASSERT(pValue); + ASSERT(pArithmContainer); + + const std::string funName = pValue->value().getIdentificator(); + + LPExpression pFunctionExpression = RDOFUNArithm::generateByIdentificator(pValue)->expression(); + ASSERT(pFunctionExpression); + + LPRDOFUNParams pFunParams = rdo::Factory::create(pArithmContainer); + ASSERT(pFunParams); + + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@2, funName)); + pFunParams->setSrcPos (@2, @5); + pFunParams->setSrcText(funName + "(" + pArithmContainer->src_text() + ")"); + LPExpression pExpression = pFunParams->createCallExpression(pFunctionExpression); + ASSERT(pExpression); + $$ = PARSER->stack().push(pExpression); + } + } + | RDO_sprite_call RDO_IDENTIF '(' arithm_list error + { + #PASS2 + { + PARSER->error().error(@5, "Ожидается закрывающая скобка"); + } + } + | RDO_sprite_call RDO_IDENTIF '(' error + { + #PASS2 + { + PARSER->error().error(@4, "Ошибка задания параметров"); + } + } + | RDO_sprite_call RDO_IDENTIF error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается открывающая скобка"); + } + } + ; param_list - : param_list_open param_list_body param_list_close - | param_list_open param_list_body error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается закрывающая скобка"); - } - } - | param_list_open error - { - #PASS2 - { - PARSER->error().error(@2, "Ошибка при описании параметра"); - } - } - | error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается открывающая скобка"); - } - } - ; + : param_list_open param_list_body param_list_close + | param_list_open param_list_body error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается закрывающая скобка"); + } + } + | param_list_open error + { + #PASS2 + { + PARSER->error().error(@2, "Ошибка при описании параметра"); + } + } + | error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается открывающая скобка"); + } + } + ; param_list_open - : '(' - { - #PASS2 - { - LPContext pContext = RDOParser::s_parser()->context(); - ASSERT(pContext); - LPIContextParamDefinitionManager pContextParamDefinitionManager = pContext->interface_cast(); - ASSERT(pContextParamDefinitionManager); - pContextParamDefinitionManager->pushParamDefinitionContext(); - } - } - ; + : '(' + { + #PASS2 + { + LPContext pContext = RDOParser::s_parser()->context(); + ASSERT(pContext); + LPIContextParamDefinitionManager pContextParamDefinitionManager = pContext->interface_cast(); + ASSERT(pContextParamDefinitionManager); + pContextParamDefinitionManager->pushParamDefinitionContext(); + } + } + ; param_list_close - : ')' - { - #PASS2 - { - LPContext pContext = RDOParser::s_parser()->context(); - ASSERT(pContext); - LPIContextParamDefinitionManager pContextParamDefinitionManager = pContext->interface_cast(); - ASSERT(pContextParamDefinitionManager); - pContextParamDefinitionManager->popParamDefinitionContext(); - } - } - ; + : ')' + { + #PASS2 + { + LPContext pContext = RDOParser::s_parser()->context(); + ASSERT(pContext); + LPIContextParamDefinitionManager pContextParamDefinitionManager = pContext->interface_cast(); + ASSERT(pContextParamDefinitionManager); + pContextParamDefinitionManager->popParamDefinitionContext(); + } + } + ; param_list_body - : /* empty */ - | param_declaration - | param_list_body ',' param_declaration - | param_list_body ',' error - { - #PASS2 - { - PARSER->error().error(@3, "Ошибка в задании параметра"); - } - } - ; + : /* empty */ + | param_declaration + | param_list_body ',' param_declaration + | param_list_body ',' error + { + #PASS2 + { + PARSER->error().error(@3, "Ошибка в задании параметра"); + } + } + ; param_declaration - : type_declaration RDO_IDENTIF - { - #PASS2 - { - LPTypeInfo pType = PARSER->stack().pop($1); - ASSERT(pType); - - LPRDOValue pName = PARSER->stack().pop($2); - ASSERT(pName); - - LPRDOParam pParam = rdo::Factory::create(pName->src_info(), pType); - ASSERT(pParam); - - LPContextParamDefinition pContextParamDefinition = - RDOParser::s_parser()->context().object_dynamic_cast(); - ASSERT(pContextParamDefinition); - pContextParamDefinition->pushParam(pParam); - } - } - ; + : type_declaration RDO_IDENTIF + { + #PASS2 + { + LPTypeInfo pType = PARSER->stack().pop($1); + ASSERT(pType); + + LPRDOValue pName = PARSER->stack().pop($2); + ASSERT(pName); + + LPRDOParam pParam = rdo::Factory::create(pName->src_info(), pType); + ASSERT(pParam); + + LPContextParamDefinition pContextParamDefinition = + RDOParser::s_parser()->context().object_dynamic_cast(); + ASSERT(pContextParamDefinition); + pContextParamDefinition->pushParam(pParam); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Элементы // -------------------------------------------------------------------------------- frm_item_statement - : frm_item - { - #PASS2 - { - rdo::runtime::LPRDOFRMItem pItem = PARSER->stack().pop($1); - ASSERT(pItem); - - PARSER->getLastFRMCommandList()->list()->insertItem(pItem); - - LPExpression pExpression = RDOFRMCommandList::generateExpression( - pItem, - RDOParserSrcInfo(@1) - ); - ASSERT(pExpression); - - $$ = PARSER->stack().push(pExpression); - } - } - | frm_sprite - { - #PASS2 - { - LPExpression pExpression = PARSER->stack().pop($1); - ASSERT(pExpression); - - PARSER->getLastFRMCommandList()->list()->insertItem(pExpression->calc()); - - $$ = PARSER->stack().push(pExpression); - } - } - ; + : frm_item + { + #PASS2 + { + rdo::runtime::LPRDOFRMItem pItem = PARSER->stack().pop($1); + ASSERT(pItem); + + PARSER->getLastFRMCommandList()->list()->insertItem(pItem); + + LPExpression pExpression = RDOFRMCommandList::generateExpression( + pItem, + RDOParserSrcInfo(@1) + ); + ASSERT(pExpression); + + $$ = PARSER->stack().push(pExpression); + } + } + | frm_sprite + { + #PASS2 + { + LPExpression pExpression = PARSER->stack().pop($1); + ASSERT(pExpression); + + PARSER->getLastFRMCommandList()->list()->insertItem(pExpression->calc()); + + $$ = PARSER->stack().push(pExpression); + } + } + ; frm_item - : frm_text - | frm_bitmap - | frm_rect - | frm_line - | frm_circle - | frm_ellipse - | frm_r_rect - | frm_triang - | frm_s_bmp - | frm_active - | frm_ruler - | frm_space - ; + : frm_text + | frm_bitmap + | frm_rect + | frm_line + | frm_circle + | frm_ellipse + | frm_r_rect + | frm_triang + | frm_s_bmp + | frm_active + | frm_ruler + | frm_space + ; frm_color - : RDO_color_transparent - { - #PASS2 - { - LPRDOFRMColor pColor = rdo::Factory::create(RDOFRMColor::CT_TRANSPARENT); - ASSERT(pColor); - $$ = PARSER->stack().push(pColor); - } - } - | RDO_color_last - { - #PASS2 - { - LPRDOFRMColor pColor = rdo::Factory::create(); - ASSERT(pColor); - $$ = PARSER->stack().push(pColor); - } - } - | RDO_color_white - { - #PASS2 - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(255), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = PARSER->stack().push(pColor); - } - } - | RDO_color_black - { - #PASS2 - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(0), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = PARSER->stack().push(pColor); - } - } - | RDO_color_red - { - #PASS2 - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(0), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = PARSER->stack().push(pColor); - } - } - | RDO_color_green - { - #PASS2 - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(255), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = PARSER->stack().push(pColor); - } - } - | RDO_color_blue - { - #PASS2 - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(0), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = PARSER->stack().push(pColor); - } - } - | RDO_color_cyan - { - #PASS2 - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(255), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = PARSER->stack().push(pColor); - } - } - | RDO_color_magenta - { - #PASS2 - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(0), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = PARSER->stack().push(pColor); - } - } - | RDO_color_yellow - { - #PASS2 - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(255), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = PARSER->stack().push(pColor); - } - } - | RDO_color_gray - { - #PASS2 - { - LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(127), (unsigned char)(127), (unsigned char)(127), RDOParserSrcInfo(@1, LEXER->YYText())); - ASSERT(pColor); - $$ = PARSER->stack().push(pColor); - } - } - | '<' RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST '>' - { - #PASS2 - { - LPRDOFUNArithm pRed = RDOFUNArithm::generateByConst(PARSER->stack().pop($2)); - LPRDOFUNArithm pGreen = RDOFUNArithm::generateByConst(PARSER->stack().pop($3)); - LPRDOFUNArithm pBlue = RDOFUNArithm::generateByConst(PARSER->stack().pop($4)); - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(rdo::explicit_value(0), @2), rdo::Factory::create(rdo::explicit_value(255), @2), @2); - LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); - LPTypeInfo pType = rdo::Factory::create(pIntRange, @2); - pRed->checkParamType(pType); - } - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(rdo::explicit_value(0), @3), rdo::Factory::create(rdo::explicit_value(255), @3), @3); - LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); - LPTypeInfo pType = rdo::Factory::create(pIntRange, @3); - pGreen->checkParamType(pType); - } - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(rdo::explicit_value(0), @4), rdo::Factory::create(rdo::explicit_value(255), @4), @4); - LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); - LPTypeInfo pType = rdo::Factory::create(pIntRange, @4); - pBlue->checkParamType(pType); - } - LPRDOFRMColor pColor = rdo::Factory::create(pRed->createCalc(), pGreen->createCalc(), pBlue->createCalc()); - ASSERT(pColor); - $$ = PARSER->stack().push(pColor); - } - } - | '<' RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@4, "Найдены все составляющие цвета, ожидается '>'"); - } - } - | '<' RDO_INT_CONST RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@3, @4, "Ожидается синяя составляющая цвета"); - } - } - | '<' RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается зеленая составляющая цвета"); - } - } - | '<' fun_arithm ',' fun_arithm ',' fun_arithm '>' - { - #PASS2 - { - LPRDOFUNArithm pRed = PARSER->stack().pop($2); - LPRDOFUNArithm pGreen = PARSER->stack().pop($4); - LPRDOFUNArithm pBlue = PARSER->stack().pop($6); - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(rdo::explicit_value(0), @2), rdo::Factory::create(rdo::explicit_value(255), @2), @2); - LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); - LPTypeInfo pType = rdo::Factory::create(pIntRange, @2); - pRed->checkParamType(pType); - } - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(rdo::explicit_value(0), @4), rdo::Factory::create(rdo::explicit_value(255), @4), @4); - LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); - LPTypeInfo pType = rdo::Factory::create(pIntRange, @4); - pGreen->checkParamType(pType); - } - { - LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(rdo::explicit_value(0), @6), rdo::Factory::create(rdo::explicit_value(255), @6), @6); - LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); - LPTypeInfo pType = rdo::Factory::create(pIntRange, @6); - pBlue->checkParamType(pType); - } - LPRDOFRMColor pColor = rdo::Factory::create(pRed->createCalc(), pGreen->createCalc(), pBlue->createCalc()); - ASSERT(pColor); - $$ = PARSER->stack().push(pColor); - } - } - | '<' fun_arithm ',' fun_arithm ',' fun_arithm error - { - #PASS2 - { - PARSER->error().error(@6, "Найдены все составляющие цвета, ожидается '>'"); - } - } - | '<' fun_arithm ',' fun_arithm ',' error - { - #PASS2 - { - PARSER->error().error(@5, @6, "Ожидается синяя составляющая цвета"); - } - } - | '<' fun_arithm ',' fun_arithm error - { - #PASS2 - { - PARSER->error().error(@4, "После зеленой составляющей цвета ожидается запятая"); - } - } - | '<' fun_arithm ',' error - { - #PASS2 - { - PARSER->error().error(@3, @4, "Ожидается зеленая составляющая цвета"); - } - } - | '<' fun_arithm error - { - #PASS2 - { - PARSER->error().error(@2, "После красной составляющей цвета ожидается запятая"); - } - } - | '<' error - { - #PASS2 - { - PARSER->error().error(@1, "После '<' ожидается красная составляющая цвета"); - } - } - ; + : RDO_color_transparent + { + #PASS2 + { + LPRDOFRMColor pColor = rdo::Factory::create(RDOFRMColor::Type::TRANSPARENT_COLOR); + ASSERT(pColor); + $$ = PARSER->stack().push(pColor); + } + } + | RDO_color_last + { + #PASS2 + { + LPRDOFRMColor pColor = rdo::Factory::create(); + ASSERT(pColor); + $$ = PARSER->stack().push(pColor); + } + } + | RDO_color_white + { + #PASS2 + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(255), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = PARSER->stack().push(pColor); + } + } + | RDO_color_black + { + #PASS2 + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(0), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = PARSER->stack().push(pColor); + } + } + | RDO_color_red + { + #PASS2 + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(0), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = PARSER->stack().push(pColor); + } + } + | RDO_color_green + { + #PASS2 + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(255), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = PARSER->stack().push(pColor); + } + } + | RDO_color_blue + { + #PASS2 + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(0), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = PARSER->stack().push(pColor); + } + } + | RDO_color_cyan + { + #PASS2 + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(0), (unsigned char)(255), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = PARSER->stack().push(pColor); + } + } + | RDO_color_magenta + { + #PASS2 + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(0), (unsigned char)(255), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = PARSER->stack().push(pColor); + } + } + | RDO_color_yellow + { + #PASS2 + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(255), (unsigned char)(255), (unsigned char)(0), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = PARSER->stack().push(pColor); + } + } + | RDO_color_gray + { + #PASS2 + { + LPRDOFRMColor pColor = rdo::Factory::create((unsigned char)(127), (unsigned char)(127), (unsigned char)(127), RDOParserSrcInfo(@1, LEXER->YYText())); + ASSERT(pColor); + $$ = PARSER->stack().push(pColor); + } + } + | '<' RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST '>' + { + #PASS2 + { + LPRDOFUNArithm pRed = RDOFUNArithm::generateByConst(PARSER->stack().pop($2)); + LPRDOFUNArithm pGreen = RDOFUNArithm::generateByConst(PARSER->stack().pop($3)); + LPRDOFUNArithm pBlue = RDOFUNArithm::generateByConst(PARSER->stack().pop($4)); + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(rdo::explicit_value(0), @2), rdo::Factory::create(rdo::explicit_value(255), @2), @2); + LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); + LPTypeInfo pType = rdo::Factory::create(pIntRange, @2); + pRed->checkParamType(pType); + } + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(rdo::explicit_value(0), @3), rdo::Factory::create(rdo::explicit_value(255), @3), @3); + LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); + LPTypeInfo pType = rdo::Factory::create(pIntRange, @3); + pGreen->checkParamType(pType); + } + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(rdo::explicit_value(0), @4), rdo::Factory::create(rdo::explicit_value(255), @4), @4); + LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); + LPTypeInfo pType = rdo::Factory::create(pIntRange, @4); + pBlue->checkParamType(pType); + } + LPRDOFRMColor pColor = rdo::Factory::create(pRed->createCalc(), pGreen->createCalc(), pBlue->createCalc()); + ASSERT(pColor); + $$ = PARSER->stack().push(pColor); + } + } + | '<' RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@4, "Найдены все составляющие цвета, ожидается '>'"); + } + } + | '<' RDO_INT_CONST RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ожидается синяя составляющая цвета"); + } + } + | '<' RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается зеленая составляющая цвета"); + } + } + | '<' fun_arithm ',' fun_arithm ',' fun_arithm '>' + { + #PASS2 + { + LPRDOFUNArithm pRed = PARSER->stack().pop($2); + LPRDOFUNArithm pGreen = PARSER->stack().pop($4); + LPRDOFUNArithm pBlue = PARSER->stack().pop($6); + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(rdo::explicit_value(0), @2), rdo::Factory::create(rdo::explicit_value(255), @2), @2); + LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); + LPTypeInfo pType = rdo::Factory::create(pIntRange, @2); + pRed->checkParamType(pType); + } + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(rdo::explicit_value(0), @4), rdo::Factory::create(rdo::explicit_value(255), @4), @4); + LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); + LPTypeInfo pType = rdo::Factory::create(pIntRange, @4); + pGreen->checkParamType(pType); + } + { + LPRDOTypeRangeRange pRange = rdo::Factory::create(rdo::Factory::create(rdo::explicit_value(0), @6), rdo::Factory::create(rdo::explicit_value(255), @6), @6); + LPRDOTypeIntRange pIntRange = rdo::Factory::create(pRange); + LPTypeInfo pType = rdo::Factory::create(pIntRange, @6); + pBlue->checkParamType(pType); + } + LPRDOFRMColor pColor = rdo::Factory::create(pRed->createCalc(), pGreen->createCalc(), pBlue->createCalc()); + ASSERT(pColor); + $$ = PARSER->stack().push(pColor); + } + } + | '<' fun_arithm ',' fun_arithm ',' fun_arithm error + { + #PASS2 + { + PARSER->error().error(@6, "Найдены все составляющие цвета, ожидается '>'"); + } + } + | '<' fun_arithm ',' fun_arithm ',' error + { + #PASS2 + { + PARSER->error().error(@5, @6, "Ожидается синяя составляющая цвета"); + } + } + | '<' fun_arithm ',' fun_arithm error + { + #PASS2 + { + PARSER->error().error(@4, "После зеленой составляющей цвета ожидается запятая"); + } + } + | '<' fun_arithm ',' error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ожидается зеленая составляющая цвета"); + } + } + | '<' fun_arithm error + { + #PASS2 + { + PARSER->error().error(@2, "После красной составляющей цвета ожидается запятая"); + } + } + | '<' error + { + #PASS2 + { + PARSER->error().error(@1, "После '<' ожидается красная составляющая цвета"); + } + } + ; frm_postype - : /* empty */ - { - #PASS2 - { - $$ = RDOFRMPosition::PT_ABSOLUTE; - } - } - | '+' - { - #PASS2 - { - $$ = RDOFRMPosition::PT_DELTA; - } - } - | '*' - { - #PASS2 - { - $$ = RDOFRMPosition::PT_MULT; - } - } - | '#' RDO_INT_CONST - { - #PASS2 - { - int rilet_id = PARSER->stack().pop($2)->value().getInt(); - if (rilet_id <= 0) - { - PARSER->error().error(@2, "Номер рулетки должен быть больше нуля"); - } - if (!PARSER->getLastFRMCommandList()->list()->findRulet(rilet_id)) - { - PARSER->error().error(@2, rdo::format("Рулетки с номером '%d' не существует", rilet_id)); - } - $$ = RDOFRMPosition::PT_RULET + rilet_id; - } - } - | '#' error - { - #PASS2 - { - PARSER->error().error(@1, "После '#' ожидается целочисленный номер рулетки"); - } - } - ; + : /* empty */ + { + #PASS2 + { + $$ = static_cast(RDOFRMPosition::Type::ABSOLUTE_POSITION); + } + } + | '+' + { + #PASS2 + { + $$ = static_cast(RDOFRMPosition::Type::DELTA); + } + } + | '*' + { + #PASS2 + { + $$ = static_cast(RDOFRMPosition::Type::MULT); + } + } + | '#' RDO_INT_CONST + { + #PASS2 + { + int rulet_id = PARSER->stack().pop($2)->value().getInt(); + if (rulet_id <= 0) + { + PARSER->error().error(@2, "Номер рулетки должен быть больше нуля"); + } + if (!PARSER->getLastFRMCommandList()->list()->findRulet(rulet_id)) + { + PARSER->error().error(@2, rdo::format("Рулетки с номером '%d' не существует", rulet_id)); + } + $$ = static_cast(RDOFRMPosition::Type::RULET) + rulet_id; + } + } + | '#' error + { + #PASS2 + { + PARSER->error().error(@1, "После '#' ожидается целочисленный номер рулетки"); + } + } + ; frm_postype_xy - : frm_postype - | '=' - { - #PASS2 - { - $$ = RDOFRMPosition::PT_GABARIT; - } - } - ; + : frm_postype + | '=' + { + #PASS2 + { + $$ = static_cast(RDOFRMPosition::Type::GABARIT); + } + } + ; frm_postype_wh - : frm_postype; - | '=' - { - #PASS2 - { - PARSER->error().error(@1, "Нельзя использовать данное выравнивание для ширины или высоты"); - } - } - ; + : frm_postype; + | '=' + { + #PASS2 + { + PARSER->error().error(@1, "Нельзя использовать данное выравнивание для ширины или высоты"); + } + } + ; frm_position_xy - : fun_arithm frm_postype_xy - { - #PASS2 - { - rdo::runtime::LPRDOCalc pCalc = PARSER->stack().pop($1)->createCalc(); - if ($2 >= RDOFRMPosition::PT_RULET) - { - LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, RDOFRMPosition::PT_RULET, $2 - RDOFRMPosition::PT_RULET); - ASSERT(pPosition); - $$ = PARSER->stack().push(pPosition); - } - else - { - LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, (RDOFRMPosition::PositionType)$2); - ASSERT(pPosition); - $$ = PARSER->stack().push(pPosition); - } - } - } - ; + : fun_arithm frm_postype_xy + { + #PASS2 + { + rdo::runtime::LPRDOCalc pCalc = PARSER->stack().pop($1)->createCalc(); + if ($2 >= static_cast(RDOFRMPosition::Type::RULET)) + { + LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, RDOFRMPosition::Type::RULET, $2 - static_cast(RDOFRMPosition::Type::RULET)); + ASSERT(pPosition); + $$ = PARSER->stack().push(pPosition); + } + else + { + LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, static_cast($2)); + ASSERT(pPosition); + $$ = PARSER->stack().push(pPosition); + } + } + } + ; frm_position_wh - : fun_arithm frm_postype_wh - { - #PASS2 - { - rdo::runtime::LPRDOCalc pCalc = PARSER->stack().pop($1)->createCalc(); - if ($2 >= RDOFRMPosition::PT_RULET) - { - LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, RDOFRMPosition::PT_RULET, $2 - RDOFRMPosition::PT_RULET); - ASSERT(pPosition); - $$ = PARSER->stack().push(pPosition); - } - else - { - LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, (RDOFRMPosition::PositionType)$2); - ASSERT(pPosition); - $$ = PARSER->stack().push(pPosition); - } - } - } - ; + : fun_arithm frm_postype_wh + { + #PASS2 + { + rdo::runtime::LPRDOCalc pCalc = PARSER->stack().pop($1)->createCalc(); + if ($2 >= static_cast(RDOFRMPosition::Type::RULET)) + { + LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, RDOFRMPosition::Type::RULET, $2 - static_cast(RDOFRMPosition::Type::RULET)); + ASSERT(pPosition); + $$ = PARSER->stack().push(pPosition); + } + else + { + LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, static_cast($2)); + ASSERT(pPosition); + $$ = PARSER->stack().push(pPosition); + } + } + } + ; frm_radius - : fun_arithm frm_postype_xy - { - #PASS2 - { - if ($2 != rdo::runtime::RDOFRMFrame::RDOFRMPosition::PT_ABSOLUTE && - $2 != rdo::runtime::RDOFRMFrame::RDOFRMPosition::PT_DELTA && - $2 != rdo::runtime::RDOFRMFrame::RDOFRMPosition::PT_MULT - ) - { - PARSER->error().error(@2, "Нельзя использовать данное выравнивание для радиуса"); - } - - rdo::runtime::LPRDOCalc pCalc = PARSER->stack().pop($1)->createCalc(); - ASSERT(pCalc); - - LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, (RDOFRMPosition::PositionType)$2); - ASSERT(pPosition); - $$ = PARSER->stack().push(pPosition); - } - }; + : fun_arithm frm_postype_xy + { + #PASS2 + { + const auto positionType = static_cast($2); + if (positionType != rdo::runtime::RDOFRMFrame::RDOFRMPosition::Type::ABSOLUTE_POSITION && + positionType != rdo::runtime::RDOFRMFrame::RDOFRMPosition::Type::DELTA && + positionType != rdo::runtime::RDOFRMFrame::RDOFRMPosition::Type::MULT + ) + { + PARSER->error().error(@2, "Нельзя использовать данное выравнивание для радиуса"); + } + + rdo::runtime::LPRDOCalc pCalc = PARSER->stack().pop($1)->createCalc(); + ASSERT(pCalc); + + LPRDOFRMPosition pPosition = rdo::Factory::create(pCalc, positionType); + ASSERT(pPosition); + $$ = PARSER->stack().push(pPosition); + } + }; frm_ruler - : RDO_ruler '(' RDO_INT_CONST ',' frm_position_xy ',' frm_position_xy ')' - { - #PASS2 - { - LPRDOValue pRuletID = PARSER->stack().pop($3); - ASSERT(pRuletID); - LPRDOFRMRulet pRulet = PARSER->getLastFRMCommandList()->list()->findRulet(pRuletID->value().getInt()); - if (pRulet) - { - PARSER->error().push_only(@3, rdo::format("Рулетка с номером '%d' уже существует", pRuletID->value().getInt())); - PARSER->error().push_only(pRulet->src_info(), "См. первое определение"); - PARSER->error().push_done(); - } - LPRDOFRMPosition pX = PARSER->stack().pop($5); - LPRDOFRMPosition pY = PARSER->stack().pop($7); - ASSERT(pX); - ASSERT(pY); - if (pX->getType() != RDOFRMPosition::PT_ABSOLUTE) - { - PARSER->error().error(@5, "Координаты рулетки должны быть абсолютными"); - } - if (pY->getType() != RDOFRMPosition::PT_ABSOLUTE) - { - PARSER->error().error(@7, "Координаты рулетки должны быть абсолютными"); - } - pRulet = rdo::Factory::create(RDOParserSrcInfo(@1), pRuletID->value().getInt(), pX, pY); - ASSERT(pRulet); - $$ = PARSER->stack().push(pRulet); - } - } - | RDO_ruler '(' RDO_INT_CONST ',' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@7, "Ожидается ')'"); - } - } - | RDO_ruler '(' RDO_INT_CONST ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@6, @7, "Ожидается координата по оси Y"); - } - } - | RDO_ruler '(' RDO_INT_CONST ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@5, "Ожидается запятая"); - } - } - | RDO_ruler '(' RDO_INT_CONST ',' error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ожидается координата по оси X"); - } - } - | RDO_ruler '(' RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается запятая"); - } - } - | RDO_ruler '(' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается номер рулетки"); - } - } - | RDO_ruler error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '('"); - } - } - ; + : RDO_ruler '(' RDO_INT_CONST ',' frm_position_xy ',' frm_position_xy ')' + { + #PASS2 + { + LPRDOValue pRuletID = PARSER->stack().pop($3); + ASSERT(pRuletID); + LPRDOFRMRulet pRulet = PARSER->getLastFRMCommandList()->list()->findRulet(pRuletID->value().getInt()); + if (pRulet) + { + PARSER->error().push_only(@3, rdo::format("Рулетка с номером '%d' уже существует", pRuletID->value().getInt())); + PARSER->error().push_only(pRulet->src_info(), "См. первое определение"); + PARSER->error().push_done(); + } + LPRDOFRMPosition pX = PARSER->stack().pop($5); + LPRDOFRMPosition pY = PARSER->stack().pop($7); + ASSERT(pX); + ASSERT(pY); + if (pX->getType() != RDOFRMPosition::Type::ABSOLUTE_POSITION) + { + PARSER->error().error(@5, "Координаты рулетки должны быть абсолютными"); + } + if (pY->getType() != RDOFRMPosition::Type::ABSOLUTE_POSITION) + { + PARSER->error().error(@7, "Координаты рулетки должны быть абсолютными"); + } + pRulet = rdo::Factory::create(RDOParserSrcInfo(@1), pRuletID->value().getInt(), pX, pY); + ASSERT(pRulet); + $$ = PARSER->stack().push(pRulet); + } + } + | RDO_ruler '(' RDO_INT_CONST ',' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@7, "Ожидается ')'"); + } + } + | RDO_ruler '(' RDO_INT_CONST ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@6, @7, "Ожидается координата по оси Y"); + } + } + | RDO_ruler '(' RDO_INT_CONST ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@5, "Ожидается запятая"); + } + } + | RDO_ruler '(' RDO_INT_CONST ',' error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается координата по оси X"); + } + } + | RDO_ruler '(' RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается запятая"); + } + } + | RDO_ruler '(' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается номер рулетки"); + } + } + | RDO_ruler error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '('"); + } + } + ; frm_space - : RDO_space '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - LPRDOFRMPosition pWidth = PARSER->stack().pop($7); - LPRDOFRMPosition pHeight = PARSER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMSpace pSpace = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight); - ASSERT(pSpace); - $$ = PARSER->stack().push(pSpace); - } - } - | RDO_space '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@9, "Ожидается ')'"); - } - } - | RDO_space '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - #PASS2 - { - PARSER->error().error(@8, @9, "Ожидается высота"); - } - } - | RDO_space '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@7, "Ожидается запятая"); - } - } - | RDO_space '(' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@6, @7, "Ожидается ширина"); - } - } - | RDO_space '(' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@5, "Ожидается запятая"); - } - } - | RDO_space '(' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - } - | RDO_space '(' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается запятая"); - } - } - | RDO_space '(' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается координата по оси X"); - } - } - | RDO_space error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '('"); - } - } - ; + : RDO_space '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + LPRDOFRMPosition pWidth = PARSER->stack().pop($7); + LPRDOFRMPosition pHeight = PARSER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMSpace pSpace = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight); + ASSERT(pSpace); + $$ = PARSER->stack().push(pSpace); + } + } + | RDO_space '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@9, "Ожидается ')'"); + } + } + | RDO_space '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + #PASS2 + { + PARSER->error().error(@8, @9, "Ожидается высота"); + } + } + | RDO_space '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@7, "Ожидается запятая"); + } + } + | RDO_space '(' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@6, @7, "Ожидается ширина"); + } + } + | RDO_space '(' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@5, "Ожидается запятая"); + } + } + | RDO_space '(' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + } + | RDO_space '(' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается запятая"); + } + } + | RDO_space '(' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается координата по оси X"); + } + } + | RDO_space error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '('"); + } + } + ; frm_text_align - : /* empty */ - { - #PASS2 - { - $$ = rdo::animation::TextElement::TETA_LEFT; - } - } - | '<' - { - #PASS2 - { - $$ = rdo::animation::TextElement::TETA_LEFT; - } - } - | '=' - { - #PASS2 - { - $$ = rdo::animation::TextElement::TETA_CENTER; - } - } - | '>' - { - #PASS2 - { - $$ = rdo::animation::TextElement::TETA_RIGHT; - } - } - ; + : /* empty */ + { + #PASS2 + { + $$ = (int)rdo::animation::TextElement::Align::LEFT; + } + } + | '<' + { + #PASS2 + { + $$ = (int)rdo::animation::TextElement::Align::LEFT; + } + } + | '=' + { + #PASS2 + { + $$ = (int)rdo::animation::TextElement::Align::CENTER; + } + } + | '>' + { + #PASS2 + { + $$ = (int)rdo::animation::TextElement::Align::RIGHT; + } + } + ; frm_text_common - : RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ',' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - LPRDOFRMPosition pWidth = PARSER->stack().pop($7); - LPRDOFRMPosition pHeight = PARSER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = PARSER->stack().pop($11); - LPRDOFRMColor pFgColor = PARSER->stack().pop($13); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG_TEXT); - pFgColor->setType(RDOFRMColor::CT_LAST_FG_TEXT); - LPRDOFRMText pText = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pText); - $$ = PARSER->stack().push(pText); - } - } - | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error - { - #PASS2 - { - PARSER->error().error(@13, "Ожидается запятая"); - } - } - | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error - { - #PASS2 - { - PARSER->error().error(@12, @13, "Ожидается цвет текста"); - } - } - | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error - { - #PASS2 - { - PARSER->error().error(@11, "Ожидается запятая"); - } - } - | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error - { - #PASS2 - { - PARSER->error().error(@10, @11, "Ожидается цвет фона"); - } - } - | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@9, "Ожидается запятая"); - } - } - | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - #PASS2 - { - PARSER->error().error(@8, @9, "Ожидается высота"); - } - } - | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@7, "Ожидается запятая"); - } - } - | RDO_text '(' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@6, @7, "Ожидается ширина"); - } - } - | RDO_text '(' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@5, "Ожидается запятая"); - } - } - | RDO_text '(' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - } - | RDO_text '(' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается запятая"); - } - } - | RDO_text '(' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается координата по оси X"); - } - } - | RDO_text error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '('"); - } - } - ; + : RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ',' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + LPRDOFRMPosition pWidth = PARSER->stack().pop($7); + LPRDOFRMPosition pHeight = PARSER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = PARSER->stack().pop($11); + LPRDOFRMColor pFgColor = PARSER->stack().pop($13); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG_TEXT); + pFgColor->setType(RDOFRMColor::Type::LAST_FG_TEXT); + LPRDOFRMText pText = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pText); + $$ = PARSER->stack().push(pText); + } + } + | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error + { + #PASS2 + { + PARSER->error().error(@13, "Ожидается запятая"); + } + } + | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error + { + #PASS2 + { + PARSER->error().error(@12, @13, "Ожидается цвет текста"); + } + } + | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error + { + #PASS2 + { + PARSER->error().error(@11, "Ожидается запятая"); + } + } + | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error + { + #PASS2 + { + PARSER->error().error(@10, @11, "Ожидается цвет фона"); + } + } + | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@9, "Ожидается запятая"); + } + } + | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + #PASS2 + { + PARSER->error().error(@8, @9, "Ожидается высота"); + } + } + | RDO_text '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@7, "Ожидается запятая"); + } + } + | RDO_text '(' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@6, @7, "Ожидается ширина"); + } + } + | RDO_text '(' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@5, "Ожидается запятая"); + } + } + | RDO_text '(' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + } + | RDO_text '(' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается запятая"); + } + } + | RDO_text '(' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается координата по оси X"); + } + } + | RDO_text error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '('"); + } + } + ; frm_text - : frm_text_common frm_text_align fun_arithm ')' - { - #PASS2 - { - LPRDOFRMText pText = PARSER->stack().pop($1); - ASSERT(pText); - pText->setText((rdo::animation::TextElement::TextAlign)$2, PARSER->stack().pop($3)->createCalc()); - $$ = PARSER->stack().push(pText); - } - } - | frm_text_common frm_text_align RDO_STRING_CONST ')' - { - #PASS2 - { - LPRDOFRMText pText = PARSER->stack().pop($1); - ASSERT(pText); - pText->setText((rdo::animation::TextElement::TextAlign)$2, PARSER->stack().pop($3)->value().getString()); - $$ = PARSER->stack().push(pText); - } - } - | frm_text_common frm_text_align fun_arithm error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается ')'"); - } - } - | frm_text_common frm_text_align RDO_STRING_CONST error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается ')'"); - } - } - | frm_text_common frm_text_align error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается параметр ресурса или строка"); - } - } - ; + : frm_text_common frm_text_align fun_arithm ')' + { + #PASS2 + { + LPRDOFRMText pText = PARSER->stack().pop($1); + ASSERT(pText); + pText->setText((rdo::animation::TextElement::Align)$2, PARSER->stack().pop($3)->createCalc()); + $$ = PARSER->stack().push(pText); + } + } + | frm_text_common frm_text_align RDO_STRING_CONST ')' + { + #PASS2 + { + LPRDOFRMText pText = PARSER->stack().pop($1); + ASSERT(pText); + pText->setText((rdo::animation::TextElement::Align)$2, PARSER->stack().pop($3)->value().getString()); + $$ = PARSER->stack().push(pText); + } + } + | frm_text_common frm_text_align fun_arithm error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается ')'"); + } + } + | frm_text_common frm_text_align RDO_STRING_CONST error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается ')'"); + } + } + | frm_text_common frm_text_align error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается параметр ресурса или строка"); + } + } + ; frm_bitmap - : RDO_bitmap '(' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - ASSERT(pX); - ASSERT(pY); - LPRDOFRMBitmap pBitmap = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, PARSER->stack().pop($7)->value().getIdentificator()); - ASSERT(pBitmap); - $$ = PARSER->stack().push(pBitmap); - } - } - | RDO_bitmap '(' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ',' RDO_IDENTIF ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - ASSERT(pX); - ASSERT(pY); - LPRDOFRMBitmap pBitmap = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, PARSER->stack().pop($7)->value().getIdentificator(), PARSER->stack().pop($9)->value().getIdentificator()); - ASSERT(pBitmap); - $$ = PARSER->stack().push(pBitmap); - } - } - | RDO_bitmap '(' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ',' RDO_IDENTIF error - { - #PASS2 - { - PARSER->error().error(@9, "Ожидается ')'"); - } - } - | RDO_bitmap '(' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ',' error - { - #PASS2 - { - PARSER->error().error(@8, @9, "Ожидается имя маски для картинки"); - } - } - | RDO_bitmap '(' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF error - { - #PASS2 - { - PARSER->error().error(@7, "Ожидается ')'"); - } - } - | RDO_bitmap '(' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@6, @7, "Ожидается имя картинки"); - } - } - | RDO_bitmap '(' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@5, "Ожидается запятая"); - } - } - | RDO_bitmap '(' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - } - | RDO_bitmap '(' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается запятая"); - } - } - | RDO_bitmap '(' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается координата по оси X"); - } - } - | RDO_bitmap error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '('"); - } - } - ; + : RDO_bitmap '(' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + ASSERT(pX); + ASSERT(pY); + LPRDOFRMBitmap pBitmap = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, PARSER->stack().pop($7)->value().getIdentificator()); + ASSERT(pBitmap); + $$ = PARSER->stack().push(pBitmap); + } + } + | RDO_bitmap '(' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ',' RDO_IDENTIF ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + ASSERT(pX); + ASSERT(pY); + LPRDOFRMBitmap pBitmap = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, PARSER->stack().pop($7)->value().getIdentificator(), PARSER->stack().pop($9)->value().getIdentificator()); + ASSERT(pBitmap); + $$ = PARSER->stack().push(pBitmap); + } + } + | RDO_bitmap '(' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ',' RDO_IDENTIF error + { + #PASS2 + { + PARSER->error().error(@9, "Ожидается ')'"); + } + } + | RDO_bitmap '(' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF ',' error + { + #PASS2 + { + PARSER->error().error(@8, @9, "Ожидается имя маски для картинки"); + } + } + | RDO_bitmap '(' frm_position_xy ',' frm_position_xy ',' RDO_IDENTIF error + { + #PASS2 + { + PARSER->error().error(@7, "Ожидается ')'"); + } + } + | RDO_bitmap '(' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@6, @7, "Ожидается имя картинки"); + } + } + | RDO_bitmap '(' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@5, "Ожидается запятая"); + } + } + | RDO_bitmap '(' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + } + | RDO_bitmap '(' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается запятая"); + } + } + | RDO_bitmap '(' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается координата по оси X"); + } + } + | RDO_bitmap error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '('"); + } + } + ; frm_s_bmp - : RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - LPRDOFRMPosition pWidth = PARSER->stack().pop($7); - LPRDOFRMPosition pHeight = PARSER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMBitmapStretch pBitmap = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, PARSER->stack().pop($11)->value().getIdentificator()); - ASSERT(pBitmap); - $$ = PARSER->stack().push(pBitmap); - } - } - | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ',' RDO_IDENTIF ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - LPRDOFRMPosition pWidth = PARSER->stack().pop($7); - LPRDOFRMPosition pHeight = PARSER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMBitmapStretch pBitmap = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, PARSER->stack().pop($11)->value().getIdentificator(), PARSER->stack().pop($13)->value().getIdentificator()); - ASSERT(pBitmap); - $$ = PARSER->stack().push(pBitmap); - } - } - | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ',' RDO_IDENTIF error - { - #PASS2 - { - PARSER->error().error(@13, "Ожидается ')'"); - } - } - | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ',' error - { - #PASS2 - { - PARSER->error().error(@12, @13, "Ожидается имя маски для картинки"); - } - } - | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF error - { - #PASS2 - { - PARSER->error().error(@11, "Ожидается ')'"); - } - } - | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error - { - #PASS2 - { - PARSER->error().error(@10, @11, "Ожидается имя картинки"); - } - } - | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@9, "Ожидается запятая"); - } - } - | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - #PASS2 - { - PARSER->error().error(@8, @9, "Ожидается высота"); - } - } - | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@7, "Ожидается запятая"); - } - } - | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@6, @7, "Ожидается ширина"); - } - } - | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@5, "Ожидается запятая"); - } - } - | RDO_s_bmp '(' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - } - | RDO_s_bmp '(' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается запятая"); - } - } - | RDO_s_bmp '(' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается координата по оси X"); - } - } - | RDO_s_bmp error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '('"); - } - } - ; + : RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + LPRDOFRMPosition pWidth = PARSER->stack().pop($7); + LPRDOFRMPosition pHeight = PARSER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMBitmapStretch pBitmap = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, PARSER->stack().pop($11)->value().getIdentificator()); + ASSERT(pBitmap); + $$ = PARSER->stack().push(pBitmap); + } + } + | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ',' RDO_IDENTIF ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + LPRDOFRMPosition pWidth = PARSER->stack().pop($7); + LPRDOFRMPosition pHeight = PARSER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMBitmapStretch pBitmap = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, PARSER->stack().pop($11)->value().getIdentificator(), PARSER->stack().pop($13)->value().getIdentificator()); + ASSERT(pBitmap); + $$ = PARSER->stack().push(pBitmap); + } + } + | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ',' RDO_IDENTIF error + { + #PASS2 + { + PARSER->error().error(@13, "Ожидается ')'"); + } + } + | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF ',' error + { + #PASS2 + { + PARSER->error().error(@12, @13, "Ожидается имя маски для картинки"); + } + } + | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' RDO_IDENTIF error + { + #PASS2 + { + PARSER->error().error(@11, "Ожидается ')'"); + } + } + | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error + { + #PASS2 + { + PARSER->error().error(@10, @11, "Ожидается имя картинки"); + } + } + | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@9, "Ожидается запятая"); + } + } + | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + #PASS2 + { + PARSER->error().error(@8, @9, "Ожидается высота"); + } + } + | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@7, "Ожидается запятая"); + } + } + | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@6, @7, "Ожидается ширина"); + } + } + | RDO_s_bmp '(' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@5, "Ожидается запятая"); + } + } + | RDO_s_bmp '(' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + } + | RDO_s_bmp '(' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается запятая"); + } + } + | RDO_s_bmp '(' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается координата по оси X"); + } + } + | RDO_s_bmp error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '('"); + } + } + ; frm_rect - : RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - LPRDOFRMPosition pWidth = PARSER->stack().pop($7); - LPRDOFRMPosition pHeight = PARSER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = PARSER->stack().pop($11); - LPRDOFRMColor pFgColor = PARSER->stack().pop($13); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMRect pRect = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pRect); - $$ = PARSER->stack().push(pRect); - } - } - | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - LPRDOFRMPosition pWidth = PARSER->stack().pop($7); - LPRDOFRMPosition pHeight = PARSER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = PARSER->stack().pop($11); - LPRDOFRMColor pFgColor = rdo::Factory::create(); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMRect pRect = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pRect); - $$ = PARSER->stack().push(pRect); - } - } - | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - LPRDOFRMPosition pWidth = PARSER->stack().pop($7); - LPRDOFRMPosition pHeight = PARSER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = rdo::Factory::create(); - LPRDOFRMColor pFgColor = rdo::Factory::create(); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMRect pRect = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pRect); - $$ = PARSER->stack().push(pRect); - } - } - | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - LPRDOFRMPosition pWidth = PARSER->stack().pop($7); - LPRDOFRMPosition pHeight = rdo::Factory::create(rdo::Factory::create(0), RDOFRMPosition::PT_DELTA); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = rdo::Factory::create(); - LPRDOFRMColor pFgColor = rdo::Factory::create(); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMRect pRect = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pRect); - $$ = PARSER->stack().push(pRect); - } - } - | RDO_rect '(' frm_position_xy ',' frm_position_xy ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - LPRDOFRMPosition pWidth = rdo::Factory::create(rdo::Factory::create(0), RDOFRMPosition::PT_DELTA); - LPRDOFRMPosition pHeight = rdo::Factory::create(rdo::Factory::create(0), RDOFRMPosition::PT_DELTA); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = rdo::Factory::create(); - LPRDOFRMColor pFgColor = rdo::Factory::create(); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMRect pRect = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pRect); - $$ = PARSER->stack().push(pRect); - } - } - | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error - { - #PASS2 - { - PARSER->error().error(@13, "Ожидается ')'"); - } - } - | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error - { - #PASS2 - { - PARSER->error().error(@12, @13, "Ожидается цвет линии прямоугольника"); - } - } - | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error - { - #PASS2 - { - PARSER->error().error(@11, "Ожидается запятая"); - } - } - | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error - { - #PASS2 - { - PARSER->error().error(@10, @11, "Ожидается цвет фона"); - } - } - | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@9, "Ожидается запятая"); - } - } - | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - #PASS2 - { - PARSER->error().error(@8, @9, "Ожидается высота"); - } - } - | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@7, "Ожидается запятая"); - } - } - | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@6, @7, "Ожидается ширина"); - } - } - | RDO_rect '(' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@5, "Ожидается запятая"); - } - } - | RDO_rect '(' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - } - | RDO_rect '(' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается запятая"); - } - } - | RDO_rect '(' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается координата по оси X"); - } - } - | RDO_rect error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '('"); - } - } - ; + : RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + LPRDOFRMPosition pWidth = PARSER->stack().pop($7); + LPRDOFRMPosition pHeight = PARSER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = PARSER->stack().pop($11); + LPRDOFRMColor pFgColor = PARSER->stack().pop($13); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMRect pRect = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pRect); + $$ = PARSER->stack().push(pRect); + } + } + | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + LPRDOFRMPosition pWidth = PARSER->stack().pop($7); + LPRDOFRMPosition pHeight = PARSER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = PARSER->stack().pop($11); + LPRDOFRMColor pFgColor = rdo::Factory::create(); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMRect pRect = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pRect); + $$ = PARSER->stack().push(pRect); + } + } + | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + LPRDOFRMPosition pWidth = PARSER->stack().pop($7); + LPRDOFRMPosition pHeight = PARSER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = rdo::Factory::create(); + LPRDOFRMColor pFgColor = rdo::Factory::create(); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMRect pRect = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pRect); + $$ = PARSER->stack().push(pRect); + } + } + | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + LPRDOFRMPosition pWidth = PARSER->stack().pop($7); + LPRDOFRMPosition pHeight = rdo::Factory::create(rdo::Factory::create(0), RDOFRMPosition::Type::DELTA); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = rdo::Factory::create(); + LPRDOFRMColor pFgColor = rdo::Factory::create(); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMRect pRect = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pRect); + $$ = PARSER->stack().push(pRect); + } + } + | RDO_rect '(' frm_position_xy ',' frm_position_xy ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + LPRDOFRMPosition pWidth = rdo::Factory::create(rdo::Factory::create(0), RDOFRMPosition::Type::DELTA); + LPRDOFRMPosition pHeight = rdo::Factory::create(rdo::Factory::create(0), RDOFRMPosition::Type::DELTA); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = rdo::Factory::create(); + LPRDOFRMColor pFgColor = rdo::Factory::create(); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMRect pRect = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pRect); + $$ = PARSER->stack().push(pRect); + } + } + | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error + { + #PASS2 + { + PARSER->error().error(@13, "Ожидается ')'"); + } + } + | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error + { + #PASS2 + { + PARSER->error().error(@12, @13, "Ожидается цвет линии прямоугольника"); + } + } + | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error + { + #PASS2 + { + PARSER->error().error(@11, "Ожидается запятая"); + } + } + | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error + { + #PASS2 + { + PARSER->error().error(@10, @11, "Ожидается цвет фона"); + } + } + | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@9, "Ожидается запятая"); + } + } + | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + #PASS2 + { + PARSER->error().error(@8, @9, "Ожидается высота"); + } + } + | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@7, "Ожидается запятая"); + } + } + | RDO_rect '(' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@6, @7, "Ожидается ширина"); + } + } + | RDO_rect '(' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@5, "Ожидается запятая"); + } + } + | RDO_rect '(' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + } + | RDO_rect '(' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается запятая"); + } + } + | RDO_rect '(' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается координата по оси X"); + } + } + | RDO_rect error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '('"); + } + } + ; frm_r_rect - : RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - LPRDOFRMPosition pWidth = PARSER->stack().pop($7); - LPRDOFRMPosition pHeight = PARSER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = PARSER->stack().pop($11); - LPRDOFRMColor pFgColor = PARSER->stack().pop($13); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMRectRound pRoundRect = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pRoundRect); - $$ = PARSER->stack().push(pRoundRect); - } - } - | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error - { - #PASS2 - { - PARSER->error().error(@13, "Ожидается ')'"); - } - } - | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error - { - #PASS2 - { - PARSER->error().error(@12, @13, "Ожидается цвет линии прямоугольника"); - } - } - | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error - { - #PASS2 - { - PARSER->error().error(@11, "Ожидается запятая"); - } - } - | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error - { - #PASS2 - { - PARSER->error().error(@10, @11, "Ожидается цвет фона"); - } - } - | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@9, "Ожидается запятая"); - } - } - | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - #PASS2 - { - PARSER->error().error(@8, @9, "Ожидается высота"); - } - } - | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@7, "Ожидается запятая"); - } - } - | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@6, @7, "Ожидается ширина"); - } - } - | RDO_r_rect '(' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@5, "Ожидается запятая"); - } - } - | RDO_r_rect '(' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - } - | RDO_r_rect '(' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается запятая"); - } - } - | RDO_r_rect '(' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается координата по оси X"); - } - } - | RDO_r_rect error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '('"); - } - } - ; + : RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + LPRDOFRMPosition pWidth = PARSER->stack().pop($7); + LPRDOFRMPosition pHeight = PARSER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = PARSER->stack().pop($11); + LPRDOFRMColor pFgColor = PARSER->stack().pop($13); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMRectRound pRoundRect = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pRoundRect); + $$ = PARSER->stack().push(pRoundRect); + } + } + | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error + { + #PASS2 + { + PARSER->error().error(@13, "Ожидается ')'"); + } + } + | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error + { + #PASS2 + { + PARSER->error().error(@12, @13, "Ожидается цвет линии прямоугольника"); + } + } + | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error + { + #PASS2 + { + PARSER->error().error(@11, "Ожидается запятая"); + } + } + | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error + { + #PASS2 + { + PARSER->error().error(@10, @11, "Ожидается цвет фона"); + } + } + | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@9, "Ожидается запятая"); + } + } + | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + #PASS2 + { + PARSER->error().error(@8, @9, "Ожидается высота"); + } + } + | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@7, "Ожидается запятая"); + } + } + | RDO_r_rect '(' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@6, @7, "Ожидается ширина"); + } + } + | RDO_r_rect '(' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@5, "Ожидается запятая"); + } + } + | RDO_r_rect '(' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + } + | RDO_r_rect '(' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается запятая"); + } + } + | RDO_r_rect '(' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается координата по оси X"); + } + } + | RDO_r_rect error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '('"); + } + } + ; frm_circle - : RDO_circle '(' frm_position_xy ',' frm_position_xy ',' frm_radius ',' frm_color ',' frm_color ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - LPRDOFRMPosition pRadius = PARSER->stack().pop($7); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pRadius); - LPRDOFRMColor pBgColor = PARSER->stack().pop($9); - LPRDOFRMColor pFgColor = PARSER->stack().pop($11); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMCircle pCircle = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pRadius, pBgColor, pFgColor); - ASSERT(pCircle); - $$ = PARSER->stack().push(pCircle); - } - } - | RDO_circle '(' frm_position_xy ',' frm_position_xy ',' frm_radius ',' frm_color ',' frm_color error - { - #PASS2 - { - PARSER->error().error(@11, "Ожидается ')'"); - } - } - | RDO_circle '(' frm_position_xy ',' frm_position_xy ',' frm_radius ',' frm_color ',' error - { - #PASS2 - { - PARSER->error().error(@10, @11, "Ожидается цвет линии круга"); - } - } - | RDO_circle '(' frm_position_xy ',' frm_position_xy ',' frm_radius ',' frm_color error - { - #PASS2 - { - PARSER->error().error(@9, "Ожидается запятая"); - } - } - | RDO_circle '(' frm_position_xy ',' frm_position_xy ',' frm_radius ',' error - { - #PASS2 - { - PARSER->error().error(@8, @9, "Ожидается цвет фона"); - } - } - | RDO_circle '(' frm_position_xy ',' frm_position_xy ',' frm_radius error - { - #PASS2 - { - PARSER->error().error(@7, "Ожидается запятая"); - } - } - | RDO_circle '(' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@6, @7, "Ожидается радиус"); - } - } - | RDO_circle '(' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@5, "Ожидается запятая"); - } - } - | RDO_circle '(' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - } - | RDO_circle '(' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается запятая"); - } - } - | RDO_circle '(' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается координата по оси X"); - } - } - | RDO_circle error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '('"); - } - }; + : RDO_circle '(' frm_position_xy ',' frm_position_xy ',' frm_radius ',' frm_color ',' frm_color ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + LPRDOFRMPosition pRadius = PARSER->stack().pop($7); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pRadius); + LPRDOFRMColor pBgColor = PARSER->stack().pop($9); + LPRDOFRMColor pFgColor = PARSER->stack().pop($11); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMCircle pCircle = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pRadius, pBgColor, pFgColor); + ASSERT(pCircle); + $$ = PARSER->stack().push(pCircle); + } + } + | RDO_circle '(' frm_position_xy ',' frm_position_xy ',' frm_radius ',' frm_color ',' frm_color error + { + #PASS2 + { + PARSER->error().error(@11, "Ожидается ')'"); + } + } + | RDO_circle '(' frm_position_xy ',' frm_position_xy ',' frm_radius ',' frm_color ',' error + { + #PASS2 + { + PARSER->error().error(@10, @11, "Ожидается цвет линии круга"); + } + } + | RDO_circle '(' frm_position_xy ',' frm_position_xy ',' frm_radius ',' frm_color error + { + #PASS2 + { + PARSER->error().error(@9, "Ожидается запятая"); + } + } + | RDO_circle '(' frm_position_xy ',' frm_position_xy ',' frm_radius ',' error + { + #PASS2 + { + PARSER->error().error(@8, @9, "Ожидается цвет фона"); + } + } + | RDO_circle '(' frm_position_xy ',' frm_position_xy ',' frm_radius error + { + #PASS2 + { + PARSER->error().error(@7, "Ожидается запятая"); + } + } + | RDO_circle '(' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@6, @7, "Ожидается радиус"); + } + } + | RDO_circle '(' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@5, "Ожидается запятая"); + } + } + | RDO_circle '(' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + } + | RDO_circle '(' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается запятая"); + } + } + | RDO_circle '(' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается координата по оси X"); + } + } + | RDO_circle error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '('"); + } + }; frm_ellipse - : RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - LPRDOFRMPosition pWidth = PARSER->stack().pop($7); - LPRDOFRMPosition pHeight = PARSER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pBgColor = PARSER->stack().pop($11); - LPRDOFRMColor pFgColor = PARSER->stack().pop($13); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMEllipse pEllipse = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); - ASSERT(pEllipse); - $$ = PARSER->stack().push(pEllipse); - } - } - | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error - { - #PASS2 - { - PARSER->error().error(@13, "Ожидается ')'"); - } - } - | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error - { - #PASS2 - { - PARSER->error().error(@12, @13, "Ожидается цвет линии эллипса"); - } - } - | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error - { - #PASS2 - { - PARSER->error().error(@11, "Ожидается запятая"); - } - } - | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error - { - #PASS2 - { - PARSER->error().error(@10, @11, "Ожидается цвет фона"); - } - } - | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@9, "Ожидается запятая"); - } - } - | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - #PASS2 - { - PARSER->error().error(@8, @9, "Ожидается высота"); - } - } - | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@7, "Ожидается запятая"); - } - } - | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@6, @7, "Ожидается ширина"); - } - } - | RDO_ellipse '(' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@5, "Ожидается запятая"); - } - } - | RDO_ellipse '(' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); - } - } - | RDO_ellipse '(' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается запятая"); - } - } - | RDO_ellipse '(' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается координата по оси X"); - } - } - | RDO_ellipse error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '('"); - } - } - ; + : RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + LPRDOFRMPosition pWidth = PARSER->stack().pop($7); + LPRDOFRMPosition pHeight = PARSER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pBgColor = PARSER->stack().pop($11); + LPRDOFRMColor pFgColor = PARSER->stack().pop($13); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMEllipse pEllipse = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pBgColor, pFgColor); + ASSERT(pEllipse); + $$ = PARSER->stack().push(pEllipse); + } + } + | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' frm_color error + { + #PASS2 + { + PARSER->error().error(@13, "Ожидается ')'"); + } + } + | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color ',' error + { + #PASS2 + { + PARSER->error().error(@12, @13, "Ожидается цвет линии эллипса"); + } + } + | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' frm_color error + { + #PASS2 + { + PARSER->error().error(@11, "Ожидается запятая"); + } + } + | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ',' error + { + #PASS2 + { + PARSER->error().error(@10, @11, "Ожидается цвет фона"); + } + } + | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@9, "Ожидается запятая"); + } + } + | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + #PASS2 + { + PARSER->error().error(@8, @9, "Ожидается высота"); + } + } + | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@7, "Ожидается запятая"); + } + } + | RDO_ellipse '(' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@6, @7, "Ожидается ширина"); + } + } + | RDO_ellipse '(' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@5, "Ожидается запятая"); + } + } + | RDO_ellipse '(' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается координата по оси Y"); + } + } + | RDO_ellipse '(' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается запятая"); + } + } + | RDO_ellipse '(' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается координата по оси X"); + } + } + | RDO_ellipse error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '('"); + } + } + ; frm_line - : RDO_line '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ')' - { - #PASS2 - { - LPRDOFRMPosition pX = PARSER->stack().pop($3); - LPRDOFRMPosition pY = PARSER->stack().pop($5); - LPRDOFRMPosition pWidth = PARSER->stack().pop($7); - LPRDOFRMPosition pHeight = PARSER->stack().pop($9); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMColor pColor = PARSER->stack().pop($11); - ASSERT(pColor); - pColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMLine pLine = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pColor); - ASSERT(pLine); - $$ = PARSER->stack().push(pLine); - } - } - | RDO_line '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color error - { - #PASS2 - { - PARSER->error().error(@11, "Ожидается ')'"); - } - } - | RDO_line '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@10, @11, "Ожидается цвет линии"); - } - } - | RDO_line '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@9, "Ожидается запятая"); - } - } - | RDO_line '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@8, @9, "Ожидается Y2"); - } - } - | RDO_line '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@7, "Ожидается запятая"); - } - } - | RDO_line '(' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@6, @7, "Ожидается X2"); - } - } - | RDO_line '(' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@5, "Ожидается запятая"); - } - } - | RDO_line '(' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ожидается Y1"); - } - } - | RDO_line '(' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается запятая"); - } - } - | RDO_line '(' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается X1"); - } - } - | RDO_line error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '('"); - } - } - ; + : RDO_line '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ')' + { + #PASS2 + { + LPRDOFRMPosition pX = PARSER->stack().pop($3); + LPRDOFRMPosition pY = PARSER->stack().pop($5); + LPRDOFRMPosition pWidth = PARSER->stack().pop($7); + LPRDOFRMPosition pHeight = PARSER->stack().pop($9); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMColor pColor = PARSER->stack().pop($11); + ASSERT(pColor); + pColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMLine pLine = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, pColor); + ASSERT(pLine); + $$ = PARSER->stack().push(pLine); + } + } + | RDO_line '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color error + { + #PASS2 + { + PARSER->error().error(@11, "Ожидается ')'"); + } + } + | RDO_line '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@10, @11, "Ожидается цвет линии"); + } + } + | RDO_line '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@9, "Ожидается запятая"); + } + } + | RDO_line '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@8, @9, "Ожидается Y2"); + } + } + | RDO_line '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@7, "Ожидается запятая"); + } + } + | RDO_line '(' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@6, @7, "Ожидается X2"); + } + } + | RDO_line '(' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@5, "Ожидается запятая"); + } + } + | RDO_line '(' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается Y1"); + } + } + | RDO_line '(' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается запятая"); + } + } + | RDO_line '(' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается X1"); + } + } + | RDO_line error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '('"); + } + } + ; frm_triang - : RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ',' frm_color ')' - { - #PASS2 - { - LPRDOFRMPosition pX1 = PARSER->stack().pop($3); - LPRDOFRMPosition pY1 = PARSER->stack().pop($5); - LPRDOFRMPosition pX2 = PARSER->stack().pop($7); - LPRDOFRMPosition pY2 = PARSER->stack().pop($9); - LPRDOFRMPosition pX3 = PARSER->stack().pop($11); - LPRDOFRMPosition pY3 = PARSER->stack().pop($13); - ASSERT(pX1); - ASSERT(pY1); - ASSERT(pX2); - ASSERT(pY2); - ASSERT(pX3); - ASSERT(pY3); - LPRDOFRMColor pBgColor = PARSER->stack().pop($15); - LPRDOFRMColor pFgColor = PARSER->stack().pop($17); - ASSERT(pBgColor); - ASSERT(pFgColor); - pBgColor->setType(RDOFRMColor::CT_LAST_BG); - pFgColor->setType(RDOFRMColor::CT_LAST_FG); - LPRDOFRMTriang pTriang = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX1, pY1, pX2, pY2, pX3, pY3, pBgColor, pFgColor); - ASSERT(pTriang); - $$ = PARSER->stack().push(pTriang); - } - } - | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ',' frm_color error - { - #PASS2 - { - PARSER->error().error(@17, "Ожидается ')'"); - } - } - | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ',' error - { - #PASS2 - { - PARSER->error().error(@16, @17, "Ожидается цвет линии"); - } - } - | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color error - { - #PASS2 - { - PARSER->error().error(@15, "Ожидается запятая"); - } - } - | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@14, @15, "Ожидается цвет треугольника"); - } - } - | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@13, "Ожидается запятая"); - } - } - | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@12, @13, "Ожидается Y3"); - } - } - | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@11, "Ожидается запятая"); - } - } - | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@10, @11, "Ожидается X3"); - } - } - | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@9, "Ожидается запятая"); - } - } - | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@8, @9, "Ожидается Y2"); - } - } - | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@7, "Ожидается запятая"); - } - } - | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@6, @7, "Ожидается X2"); - } - } - | RDO_triang '(' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@5, "Ожидается запятая"); - } - } - | RDO_triang '(' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ожидается Y1"); - } - } - | RDO_triang '(' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается запятая"); - } - } - | RDO_triang '(' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается X1"); - } - } - | RDO_triang error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '('"); - } - } - ; + : RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ',' frm_color ')' + { + #PASS2 + { + LPRDOFRMPosition pX1 = PARSER->stack().pop($3); + LPRDOFRMPosition pY1 = PARSER->stack().pop($5); + LPRDOFRMPosition pX2 = PARSER->stack().pop($7); + LPRDOFRMPosition pY2 = PARSER->stack().pop($9); + LPRDOFRMPosition pX3 = PARSER->stack().pop($11); + LPRDOFRMPosition pY3 = PARSER->stack().pop($13); + ASSERT(pX1); + ASSERT(pY1); + ASSERT(pX2); + ASSERT(pY2); + ASSERT(pX3); + ASSERT(pY3); + LPRDOFRMColor pBgColor = PARSER->stack().pop($15); + LPRDOFRMColor pFgColor = PARSER->stack().pop($17); + ASSERT(pBgColor); + ASSERT(pFgColor); + pBgColor->setType(RDOFRMColor::Type::LAST_BG); + pFgColor->setType(RDOFRMColor::Type::LAST_FG); + LPRDOFRMTriang pTriang = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX1, pY1, pX2, pY2, pX3, pY3, pBgColor, pFgColor); + ASSERT(pTriang); + $$ = PARSER->stack().push(pTriang); + } + } + | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ',' frm_color error + { + #PASS2 + { + PARSER->error().error(@17, "Ожидается ')'"); + } + } + | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color ',' error + { + #PASS2 + { + PARSER->error().error(@16, @17, "Ожидается цвет линии"); + } + } + | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_color error + { + #PASS2 + { + PARSER->error().error(@15, "Ожидается запятая"); + } + } + | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@14, @15, "Ожидается цвет треугольника"); + } + } + | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@13, "Ожидается запятая"); + } + } + | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@12, @13, "Ожидается Y3"); + } + } + | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@11, "Ожидается запятая"); + } + } + | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@10, @11, "Ожидается X3"); + } + } + | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@9, "Ожидается запятая"); + } + } + | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@8, @9, "Ожидается Y2"); + } + } + | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@7, "Ожидается запятая"); + } + } + | RDO_triang '(' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@6, @7, "Ожидается X2"); + } + } + | RDO_triang '(' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@5, "Ожидается запятая"); + } + } + | RDO_triang '(' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается Y1"); + } + } + | RDO_triang '(' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается запятая"); + } + } + | RDO_triang '(' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается X1"); + } + } + | RDO_triang error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '('"); + } + } + ; frm_active - : RDO_active RDO_IDENTIF '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ')' - { - #PASS2 - { - const std::string oprName = PARSER->stack().pop($2)->value().getIdentificator(); - LPRDODPTActivity pActivity = PARSER->findDPTActivity(oprName); - if (!pActivity) - { - PARSER->error().error(@2, rdo::format("Активность '%s' не найдена", oprName.c_str())); - } - else - { - if (pActivity->pattern()->getType() != RDOPATPattern::PT_Keyboard) - { - PARSER->error().push_only(@2, rdo::format("Активность '%s' должна быть клавиатурной", pActivity->name().c_str())); - PARSER->error().push_only(pActivity->src_info(), "См. акивность"); - PARSER->error().push_only(pActivity->pattern()->src_info(), "См. образец"); - PARSER->error().push_done(); - } - } - LPRDOFRMPosition pX = PARSER->stack().pop($4); - LPRDOFRMPosition pY = PARSER->stack().pop($6); - LPRDOFRMPosition pWidth = PARSER->stack().pop($8); - LPRDOFRMPosition pHeight = PARSER->stack().pop($10); - ASSERT(pX ); - ASSERT(pY ); - ASSERT(pWidth ); - ASSERT(pHeight); - LPRDOFRMActive pActive = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, oprName); - ASSERT(pActive); - $$ = PARSER->stack().push(pActive); - } - } - | RDO_active RDO_IDENTIF '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@10, "Ожидается ')'"); - } - } - | RDO_active RDO_IDENTIF '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error - { - #PASS2 - { - PARSER->error().error(@9, @10, "Ожидается высота"); - } - } - | RDO_active RDO_IDENTIF '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error - { - #PASS2 - { - PARSER->error().error(@8, "Ожидается запятая"); - } - } - | RDO_active RDO_IDENTIF '(' frm_position_xy ',' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@7, @8, "Ожидается ширина"); - } - } - | RDO_active RDO_IDENTIF '(' frm_position_xy ',' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@6, "Ожидается запятая"); - } - } - | RDO_active RDO_IDENTIF '(' frm_position_xy ',' error - { - #PASS2 - { - PARSER->error().error(@5, @6, "Ожидается координата по оси Y"); - } - } - | RDO_active RDO_IDENTIF '(' frm_position_xy error - { - #PASS2 - { - PARSER->error().error(@4, "Ожидается запятая"); - } - } - | RDO_active RDO_IDENTIF '(' error - { - #PASS2 - { - PARSER->error().error(@3, @4, "Ожидается координата по оси X"); - } - } - | RDO_active RDO_IDENTIF error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается '('"); - } - } - | RDO_active error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается имя клавиатурной операции"); - } - } - ; + : RDO_active RDO_IDENTIF '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh ')' + { + #PASS2 + { + const std::string oprName = PARSER->stack().pop($2)->value().getIdentificator(); + LPRDODPTActivity pActivity = PARSER->findDPTActivity(oprName); + if (!pActivity) + { + PARSER->error().error(@2, rdo::format("Активность '%s' не найдена", oprName.c_str())); + } + else + { + if (pActivity->pattern()->getType() != RDOPATPattern::Type::KEYBOARD) + { + PARSER->error().push_only(@2, rdo::format("Активность '%s' должна быть клавиатурной", pActivity->name().c_str())); + PARSER->error().push_only(pActivity->src_info(), "См. акивность"); + PARSER->error().push_only(pActivity->pattern()->src_info(), "См. образец"); + PARSER->error().push_done(); + } + } + LPRDOFRMPosition pX = PARSER->stack().pop($4); + LPRDOFRMPosition pY = PARSER->stack().pop($6); + LPRDOFRMPosition pWidth = PARSER->stack().pop($8); + LPRDOFRMPosition pHeight = PARSER->stack().pop($10); + ASSERT(pX ); + ASSERT(pY ); + ASSERT(pWidth ); + ASSERT(pHeight); + LPRDOFRMActive pActive = rdo::Factory::create(PARSER->getLastFRMCommandList()->list(), pX, pY, pWidth, pHeight, oprName); + ASSERT(pActive); + $$ = PARSER->stack().push(pActive); + } + } + | RDO_active RDO_IDENTIF '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@10, "Ожидается ')'"); + } + } + | RDO_active RDO_IDENTIF '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh ',' error + { + #PASS2 + { + PARSER->error().error(@9, @10, "Ожидается высота"); + } + } + | RDO_active RDO_IDENTIF '(' frm_position_xy ',' frm_position_xy ',' frm_position_wh error + { + #PASS2 + { + PARSER->error().error(@8, "Ожидается запятая"); + } + } + | RDO_active RDO_IDENTIF '(' frm_position_xy ',' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@7, @8, "Ожидается ширина"); + } + } + | RDO_active RDO_IDENTIF '(' frm_position_xy ',' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@6, "Ожидается запятая"); + } + } + | RDO_active RDO_IDENTIF '(' frm_position_xy ',' error + { + #PASS2 + { + PARSER->error().error(@5, @6, "Ожидается координата по оси Y"); + } + } + | RDO_active RDO_IDENTIF '(' frm_position_xy error + { + #PASS2 + { + PARSER->error().error(@4, "Ожидается запятая"); + } + } + | RDO_active RDO_IDENTIF '(' error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ожидается координата по оси X"); + } + } + | RDO_active RDO_IDENTIF error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается '('"); + } + } + | RDO_active error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается имя клавиатурной операции"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Синтаксис функций @@ -6620,1368 +6699,1368 @@ frm_active // -------------------------------------------------------------------------------- fun_main - : fun_consts - | fun_func_seq - ; + : fun_consts + | fun_func_seq + ; // -------------------------------------------------------------------------------- // -------------------- Константы // -------------------------------------------------------------------------------- fun_consts - : RDO_Constant fun_const_body RDO_End - | RDO_Constant fun_const_body - { - PARSER->error().error(@2, "После описания констант ожидается ключевое слово $End"); - } - ; + : RDO_Constant fun_const_body RDO_End + | RDO_Constant fun_const_body + { + PARSER->error().error(@2, "После описания констант ожидается ключевое слово $End"); + } + ; fun_const_body - : /* empty */ - | fun_const_body fun_const_param_desc - | fun_const_body error - { - PARSER->error().error(@1, "Ожидается описание константы"); - } - ; + : /* empty */ + | fun_const_body fun_const_param_desc + | fun_const_body error + { + PARSER->error().error(@1, "Ожидается описание константы"); + } + ; fun_const_param_desc - : RDO_IDENTIF_COLON type_declaration param_value_default - { - #PASS1 - { - LPRDOValue pName = PARSER->stack().pop($1); - ASSERT(pName); - PARSER->checkFunctionName(pName->src_info()); - LPTypeInfo pParamType = PARSER->stack().pop($2); - ASSERT(pParamType); - LPRDOFUNConstant pConstant = rdo::Factory::create(pName->src_info(), pParamType, PARSER->stack().pop($3)); - ASSERT(pConstant); - RUNTIME->setConstValue(pConstant->getNumber(), pConstant->getDefault()->value()); - $$ = PARSER->stack().push(pConstant); - } - } - | RDO_IDENTIF_COLON - { - #PASS1 - { - PARSER->error().error(@1, "Ожидается тип константы"); - } - } - | RDO_IDENTIF_COLON error - { - #PASS1 - { - PARSER->error().error(@2, "Ошибка описания типа константы"); - } - } - ; + : RDO_IDENTIF_COLON type_declaration param_value_default + { + #PASS1 + { + LPRDOValue pName = PARSER->stack().pop($1); + ASSERT(pName); + PARSER->checkFunctionName(pName->src_info()); + LPTypeInfo pParamType = PARSER->stack().pop($2); + ASSERT(pParamType); + LPRDOFUNConstant pConstant = rdo::Factory::create(pName->src_info(), pParamType, PARSER->stack().pop($3)); + ASSERT(pConstant); + RUNTIME->setConstValue(pConstant->getNumber(), pConstant->getDefault()->value()); + $$ = PARSER->stack().push(pConstant); + } + } + | RDO_IDENTIF_COLON + { + #PASS1 + { + PARSER->error().error(@1, "Ожидается тип константы"); + } + } + | RDO_IDENTIF_COLON error + { + #PASS1 + { + PARSER->error().error(@2, "Ошибка описания типа константы"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Последовательности и функции // -------------------------------------------------------------------------------- fun_func_seq - : fun_func_descr - | fun_seq_descr - { - #PASS2 - { - LPRDOFUNSequence pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - } - } - ; + : fun_func_descr + | fun_seq_descr + { + #PASS2 + { + LPRDOFUNSequence pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Функции // -------------------------------------------------------------------------------- fun_func_descr - : fun_func_header fun_func_footer - { - #PASS2 - { - LPRDOFUNFunction pFunction = PARSER->stack().pop($1); - ASSERT(pFunction); - pFunction->end(); - } - } - | fun_func_header error - { - #PASS2 - { - LPRDOFUNFunction pFunction = PARSER->stack().pop($1); - ASSERT(pFunction); - PARSER->error().error(@2, rdo::format("Ожидается ключевое слово $Type с указанием типа функции '%s'", pFunction->name().c_str())); - } - } - ; + : fun_func_header fun_func_footer + { + #PASS2 + { + LPRDOFUNFunction pFunction = PARSER->stack().pop($1); + ASSERT(pFunction); + pFunction->end(); + } + } + | fun_func_header error + { + #PASS2 + { + LPRDOFUNFunction pFunction = PARSER->stack().pop($1); + ASSERT(pFunction); + PARSER->error().error(@2, rdo::format("Ожидается ключевое слово $Type с указанием типа функции '%s'", pFunction->name().c_str())); + } + } + ; fun_func_header - : RDO_Function RDO_IDENTIF_COLON type_declaration param_value_default - { - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($2); - ASSERT(pName); - PARSER->checkFunctionName(pName->src_info()); - LPTypeInfo pRetType = PARSER->stack().pop($3); - ASSERT(pRetType); - LPRDOParam pReturn = rdo::Factory::create(pName->src_info(), pRetType, PARSER->stack().pop($4)); - ASSERT(pReturn); - LPRDOFUNFunction pFunction = rdo::Factory::create(pName->src_info(), pReturn); - ASSERT(pFunction); - $$ = PARSER->stack().push(pFunction); - } - } - | RDO_Function RDO_IDENTIF_COLON error - { - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($2); - ASSERT(pName); - PARSER->error().error(@3, rdo::format("Ожидается тип возвращаемого значения функции '%s'", pName->value().getIdentificator().c_str())); - } - } - | RDO_Function error - { - #PASS2 - { - PARSER->error().error(@2, "После ключевого слова $Function ожидается имя фунции"); - } - } - ; + : RDO_Function RDO_IDENTIF_COLON type_declaration param_value_default + { + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($2); + ASSERT(pName); + PARSER->checkFunctionName(pName->src_info()); + LPTypeInfo pRetType = PARSER->stack().pop($3); + ASSERT(pRetType); + LPRDOParam pReturn = rdo::Factory::create(pName->src_info(), pRetType, PARSER->stack().pop($4)); + ASSERT(pReturn); + LPRDOFUNFunction pFunction = rdo::Factory::create(pName->src_info(), pReturn); + ASSERT(pFunction); + $$ = PARSER->stack().push(pFunction); + } + } + | RDO_Function RDO_IDENTIF_COLON error + { + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($2); + ASSERT(pName); + PARSER->error().error(@3, rdo::format("Ожидается тип возвращаемого значения функции '%s'", pName->value().getIdentificator().c_str())); + } + } + | RDO_Function error + { + #PASS2 + { + PARSER->error().error(@2, "После ключевого слова $Function ожидается имя фунции"); + } + } + ; fun_func_parameters - : /* empty */ - { - #PASS2 - { - LPContext pContext = RDOParser::s_parser()->context(); - ASSERT(pContext); - LPIContextParamDefinitionManager pContextParamDefinitionManager = pContext->interface_cast(); - ASSERT(pContextParamDefinitionManager); - pContextParamDefinitionManager->pushParamDefinitionContext(); - pContextParamDefinitionManager->popParamDefinitionContext(); - } - } - | param_list_open fun_func_params - { - #PASS2 - { - LPContext pContext = RDOParser::s_parser()->context(); - ASSERT(pContext); - LPIContextParamDefinitionManager pContextParamDefinitionManager = pContext->interface_cast(); - ASSERT(pContextParamDefinitionManager); - pContextParamDefinitionManager->popParamDefinitionContext(); - } - } - ; + : /* empty */ + { + #PASS2 + { + LPContext pContext = RDOParser::s_parser()->context(); + ASSERT(pContext); + LPIContextParamDefinitionManager pContextParamDefinitionManager = pContext->interface_cast(); + ASSERT(pContextParamDefinitionManager); + pContextParamDefinitionManager->pushParamDefinitionContext(); + pContextParamDefinitionManager->popParamDefinitionContext(); + } + } + | param_list_open fun_func_params + { + #PASS2 + { + LPContext pContext = RDOParser::s_parser()->context(); + ASSERT(pContext); + LPIContextParamDefinitionManager pContextParamDefinitionManager = pContext->interface_cast(); + ASSERT(pContextParamDefinitionManager); + pContextParamDefinitionManager->popParamDefinitionContext(); + } + } + ; param_list_open - : RDO_Parameters - { - #PASS2 - { - LPContext pContext = RDOParser::s_parser()->context(); - ASSERT(pContext); - LPIContextParamDefinitionManager pContextParamDefinitionManager = pContext->interface_cast(); - ASSERT(pContextParamDefinitionManager); - pContextParamDefinitionManager->pushParamDefinitionContext(); - } - } - ; + : RDO_Parameters + { + #PASS2 + { + LPContext pContext = RDOParser::s_parser()->context(); + ASSERT(pContext); + LPIContextParamDefinitionManager pContextParamDefinitionManager = pContext->interface_cast(); + ASSERT(pContextParamDefinitionManager); + pContextParamDefinitionManager->pushParamDefinitionContext(); + } + } + ; fun_func_params - : /* empty */ - | fun_func_params RDO_IDENTIF_COLON type_declaration param_value_default - { - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($2); - ASSERT(pName); - LPTypeInfo pType = PARSER->stack().pop($3); - ASSERT(pType); - LPRDOParam pParam = rdo::Factory::create(pName->src_info(), pType, PARSER->stack().pop($4)); - ASSERT(pParam); - - LPContextParamDefinition pContextParamDefinition = - RDOParser::s_parser()->context().object_dynamic_cast(); - ASSERT(pContextParamDefinition); - pContextParamDefinition->pushParam(pParam); - } - } - | fun_func_params RDO_IDENTIF_COLON error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается тип параметра функции"); - } - } - | fun_func_params error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается описание параметра функции в формате <имя>: <тип>"); - } - } - ; + : /* empty */ + | fun_func_params RDO_IDENTIF_COLON type_declaration param_value_default + { + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($2); + ASSERT(pName); + LPTypeInfo pType = PARSER->stack().pop($3); + ASSERT(pType); + LPRDOParam pParam = rdo::Factory::create(pName->src_info(), pType, PARSER->stack().pop($4)); + ASSERT(pParam); + + LPContextParamDefinition pContextParamDefinition = + RDOParser::s_parser()->context().object_dynamic_cast(); + ASSERT(pContextParamDefinition); + pContextParamDefinition->pushParam(pParam); + } + } + | fun_func_params RDO_IDENTIF_COLON error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается тип параметра функции"); + } + } + | fun_func_params error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается описание параметра функции в формате <имя>: <тип>"); + } + } + ; fun_func_footer - : RDO_Type '=' RDO_algorithmic fun_func_parameters alg_body statement_list alg_end - { - #PASS2 - { - LPExpression pExpressionBody = PARSER->stack().pop($6); - ASSERT(pExpressionBody); - - LPContextFunctionBody pContextFunctionBody = PARSER->context()->cast(); - ASSERT(pContextFunctionBody); - pContextFunctionBody->setBody(pExpressionBody->calc()); - - LPIContextFunctionBodyManager pContextFunctionBodyManager = PARSER->context()->interface_cast(); - ASSERT(pContextFunctionBodyManager); - pContextFunctionBodyManager->popFunctionBodyContext(); - } - } - | RDO_Type '=' RDO_list fun_func_parameters RDO_Body fun_func_list_body RDO_End - { - #PASS2 - { - LPRDOFUNFunction pFunction = PARSER->getLastFUNFunction(); - ASSERT(pFunction); - pFunction->createListCalc(); - } - } - | RDO_Type '=' RDO_table fun_func_parameters RDO_Body fun_func_list_body RDO_End - { - #PASS2 - { - LPRDOFUNFunction pFunction = PARSER->getLastFUNFunction(); - ASSERT(pFunction); - pFunction->createTableCalc(@6); - } - } - | RDO_Type '=' RDO_algorithmic fun_func_parameters alg_body statement_list error - { - #PASS2 - { - PARSER->contextStack()->pop(); - PARSER->error().error(@7, "Ожидается ключевое слово $End"); - } - } - | RDO_Type '=' RDO_algorithmic fun_func_parameters alg_body error - { - #PASS2 - { - PARSER->contextStack()->pop(); - PARSER->error().error(@6, "Неверный синтаксис алгоритмической функции"); - } - } - | RDO_Type '=' RDO_list fun_func_parameters RDO_Body fun_func_list_body error - { - #PASS2 - { - PARSER->error().error(@7, "Ожидается ключевое слово $End"); - } - } - | RDO_Type '=' RDO_table fun_func_parameters RDO_Body fun_func_list_body error - { - #PASS2 - { - PARSER->error().error(@7, "Ожидается ключевое слово $End"); - } - } - | RDO_Type '=' RDO_algorithmic error - { - #PASS2 - { - PARSER->error().error(@4, "Ожидается ключевое слово $Parameters"); - } - } - | RDO_Type '=' RDO_list error - { - #PASS2 - { - PARSER->error().error(@4, "Ожидается ключевое слово $Parameters"); - } - } - | RDO_Type '=' RDO_table error - { - #PASS2 - { - PARSER->error().error(@4, "Ожидается ключевое слово $Parameters"); - } - } - | RDO_Type '=' error - { - #PASS2 - { - PARSER->error().error(@3, "Неизвестный тип функции"); - } - } - | RDO_Type error - { - #PASS2 - { - PARSER->error().error(@2, "После ключевого слова $Type ожидается тип функции"); - } - } - ; + : RDO_Type '=' RDO_algorithmic fun_func_parameters alg_body statement_list alg_end + { + #PASS2 + { + LPExpression pExpressionBody = PARSER->stack().pop($6); + ASSERT(pExpressionBody); + + LPContextFunctionBody pContextFunctionBody = PARSER->context()->cast(); + ASSERT(pContextFunctionBody); + pContextFunctionBody->setBody(pExpressionBody->calc()); + + LPIContextFunctionBodyManager pContextFunctionBodyManager = PARSER->context()->interface_cast(); + ASSERT(pContextFunctionBodyManager); + pContextFunctionBodyManager->popFunctionBodyContext(); + } + } + | RDO_Type '=' RDO_list fun_func_parameters RDO_Body fun_func_list_body RDO_End + { + #PASS2 + { + LPRDOFUNFunction pFunction = PARSER->getLastFUNFunction(); + ASSERT(pFunction); + pFunction->createListCalc(); + } + } + | RDO_Type '=' RDO_table fun_func_parameters RDO_Body fun_func_list_body RDO_End + { + #PASS2 + { + LPRDOFUNFunction pFunction = PARSER->getLastFUNFunction(); + ASSERT(pFunction); + pFunction->createTableCalc(@6); + } + } + | RDO_Type '=' RDO_algorithmic fun_func_parameters alg_body statement_list error + { + #PASS2 + { + PARSER->contextStack()->pop(); + PARSER->error().error(@7, "Ожидается ключевое слово $End"); + } + } + | RDO_Type '=' RDO_algorithmic fun_func_parameters alg_body error + { + #PASS2 + { + PARSER->contextStack()->pop(); + PARSER->error().error(@6, "Неверный синтаксис алгоритмической функции"); + } + } + | RDO_Type '=' RDO_list fun_func_parameters RDO_Body fun_func_list_body error + { + #PASS2 + { + PARSER->error().error(@7, "Ожидается ключевое слово $End"); + } + } + | RDO_Type '=' RDO_table fun_func_parameters RDO_Body fun_func_list_body error + { + #PASS2 + { + PARSER->error().error(@7, "Ожидается ключевое слово $End"); + } + } + | RDO_Type '=' RDO_algorithmic error + { + #PASS2 + { + PARSER->error().error(@4, "Ожидается ключевое слово $Parameters"); + } + } + | RDO_Type '=' RDO_list error + { + #PASS2 + { + PARSER->error().error(@4, "Ожидается ключевое слово $Parameters"); + } + } + | RDO_Type '=' RDO_table error + { + #PASS2 + { + PARSER->error().error(@4, "Ожидается ключевое слово $Parameters"); + } + } + | RDO_Type '=' error + { + #PASS2 + { + PARSER->error().error(@3, "Неизвестный тип функции"); + } + } + | RDO_Type error + { + #PASS2 + { + PARSER->error().error(@2, "После ключевого слова $Type ожидается тип функции"); + } + } + ; alg_body - : RDO_Body - { - #PASS2 - { - LPIContextFunctionBodyManager pContextFunctionBodyManager = PARSER->context()->interface_cast(); - ASSERT(pContextFunctionBodyManager); - pContextFunctionBodyManager->pushFunctionBodyContext(); - } - } - ; + : RDO_Body + { + #PASS2 + { + LPIContextFunctionBodyManager pContextFunctionBodyManager = PARSER->context()->interface_cast(); + ASSERT(pContextFunctionBodyManager); + pContextFunctionBodyManager->pushFunctionBodyContext(); + } + } + ; alg_end - : RDO_End - ; + : RDO_End + ; fun_func_list_body - : /* empty */ - | fun_func_list_body fun_func_list_value - ; + : /* empty */ + | fun_func_list_body fun_func_list_value + ; fun_func_list_value - : RDO_IDENTIF - { - #PASS2 - { - LPRDOValue pItem = PARSER->stack().pop($1); - ASSERT(pItem); - LPRDOFUNFunctionListElementIdentif pValue = rdo::Factory::create(RDOParserSrcInfo(@1, pItem->value().getIdentificator())); - ASSERT(pValue); - PARSER->getLastFUNFunction()->add(pValue.object_parent_cast()); - $$ = PARSER->stack().push(pValue); - } - } - | RDO_REAL_CONST - { - #PASS2 - { - LPRDOValue pItem = PARSER->stack().pop($1); - ASSERT(pItem); - LPRDOFUNFunctionListElementReal pValue = rdo::Factory::create(@1, pItem->value().getDouble()); - ASSERT(pValue); - PARSER->getLastFUNFunction()->add(pValue.object_parent_cast()); - $$ = PARSER->stack().push(pValue); - } - } - | RDO_INT_CONST - { - #PASS2 - { - LPRDOValue pItem = PARSER->stack().pop($1); - ASSERT(pItem); - LPRDOFUNFunctionListElementInt pValue = rdo::Factory::create(@1, pItem->value().getInt()); - ASSERT(pValue); - PARSER->getLastFUNFunction()->add(pValue.object_parent_cast()); - $$ = PARSER->stack().push(pValue); - } - } - | '=' - { - #PASS2 - { - LPRDOFUNFunctionListElementEq pValue = rdo::Factory::create(@1); - ASSERT(pValue); - PARSER->getLastFUNFunction()->add(pValue.object_parent_cast()); - $$ = PARSER->stack().push(pValue); - } - } - ; + : RDO_IDENTIF + { + #PASS2 + { + LPRDOValue pItem = PARSER->stack().pop($1); + ASSERT(pItem); + LPRDOFUNFunctionListElementIdentif pValue = rdo::Factory::create(RDOParserSrcInfo(@1, pItem->value().getIdentificator())); + ASSERT(pValue); + PARSER->getLastFUNFunction()->add(pValue.object_parent_cast()); + $$ = PARSER->stack().push(pValue); + } + } + | RDO_REAL_CONST + { + #PASS2 + { + LPRDOValue pItem = PARSER->stack().pop($1); + ASSERT(pItem); + LPRDOFUNFunctionListElementReal pValue = rdo::Factory::create(@1, pItem->value().getDouble()); + ASSERT(pValue); + PARSER->getLastFUNFunction()->add(pValue.object_parent_cast()); + $$ = PARSER->stack().push(pValue); + } + } + | RDO_INT_CONST + { + #PASS2 + { + LPRDOValue pItem = PARSER->stack().pop($1); + ASSERT(pItem); + LPRDOFUNFunctionListElementInt pValue = rdo::Factory::create(@1, pItem->value().getInt()); + ASSERT(pValue); + PARSER->getLastFUNFunction()->add(pValue.object_parent_cast()); + $$ = PARSER->stack().push(pValue); + } + } + | '=' + { + #PASS2 + { + LPRDOFUNFunctionListElementEq pValue = rdo::Factory::create(@1); + ASSERT(pValue); + PARSER->getLastFUNFunction()->add(pValue.object_parent_cast()); + $$ = PARSER->stack().push(pValue); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Последовательности // -------------------------------------------------------------------------------- fun_seq_descr - : fun_seq_uniform - | fun_seq_exponential - | fun_seq_normal - | fun_seq_triangular - | fun_seq_by_hist - | fun_seq_enumerative - ; + : fun_seq_uniform + | fun_seq_exponential + | fun_seq_normal + | fun_seq_triangular + | fun_seq_by_hist + | fun_seq_enumerative + ; fun_seq_header - : RDO_Sequence RDO_IDENTIF_COLON type_declaration RDO_Type '=' - { - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($2); - ASSERT(pName); - PARSER->checkFunctionName(pName->src_info()); - LPTypeInfo pType = PARSER->stack().pop($3); - ASSERT(pType); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = rdo::Factory::create(pType, pName->src_info()); - ASSERT(pHeader); - $$ = PARSER->stack().push(pHeader); - } - } - | RDO_Sequence RDO_IDENTIF_COLON type_declaration RDO_Type '=' error - { - #PASS2 - { - PARSER->error().error(@6, "После знака равенства ожидается тип последовательности"); - } - } - | RDO_Sequence RDO_IDENTIF_COLON type_declaration RDO_Type error - { - #PASS2 - { - PARSER->error().error(@5, "После ключевого слова $Type ожидается знак равенства и тип последовательности"); - } - } - | RDO_Sequence RDO_IDENTIF_COLON type_declaration error - { - #PASS2 - { - PARSER->error().error(@4, "Ожидается ключевое слово $Type"); - } - } - | RDO_Sequence RDO_IDENTIF_COLON error - { - #PASS2 - { - PARSER->error().error(@2, @3, "После имени последовательности ожидается тип возвращаемого значения"); - } - } - | RDO_Sequence error - { - #PASS2 - { - PARSER->error().error(@1, @2, "После ключевого слова $Sequence ожидаются имя и тип результата последовательности в формате '<имя> : <тип>'"); - } - } - ; + : RDO_Sequence RDO_IDENTIF_COLON type_declaration RDO_Type '=' + { + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($2); + ASSERT(pName); + PARSER->checkFunctionName(pName->src_info()); + LPTypeInfo pType = PARSER->stack().pop($3); + ASSERT(pType); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = rdo::Factory::create(pType, pName->src_info()); + ASSERT(pHeader); + $$ = PARSER->stack().push(pHeader); + } + } + | RDO_Sequence RDO_IDENTIF_COLON type_declaration RDO_Type '=' error + { + #PASS2 + { + PARSER->error().error(@6, "После знака равенства ожидается тип последовательности"); + } + } + | RDO_Sequence RDO_IDENTIF_COLON type_declaration RDO_Type error + { + #PASS2 + { + PARSER->error().error(@5, "После ключевого слова $Type ожидается знак равенства и тип последовательности"); + } + } + | RDO_Sequence RDO_IDENTIF_COLON type_declaration error + { + #PASS2 + { + PARSER->error().error(@4, "Ожидается ключевое слово $Type"); + } + } + | RDO_Sequence RDO_IDENTIF_COLON error + { + #PASS2 + { + PARSER->error().error(@2, @3, "После имени последовательности ожидается тип возвращаемого значения"); + } + } + | RDO_Sequence error + { + #PASS2 + { + PARSER->error().error(@1, @2, "После ключевого слова $Sequence ожидаются имя и тип результата последовательности в формате '<имя> : <тип>'"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Датчики случайных чисел // -------------------------------------------------------------------------------- fun_seq_uniform - : fun_seq_header RDO_uniform RDO_End - { - #PASS2 - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_header RDO_uniform RDO_INT_CONST RDO_End - { - #PASS2 - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOValue pValue = PARSER->stack().pop($3); - ASSERT(pValue); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, pValue->value().getInt()); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_header RDO_uniform RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@4, "После базы ожидается ключевое слово $End"); - } - } - | fun_seq_header RDO_uniform error - { - #PASS2 - { - PARSER->error().error(@3, "После типа последовательности ожидается база генератора или ключевое слово $End"); - } - } - ; + : fun_seq_header RDO_uniform RDO_End + { + #PASS2 + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_header RDO_uniform RDO_INT_CONST RDO_End + { + #PASS2 + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOValue pValue = PARSER->stack().pop($3); + ASSERT(pValue); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, pValue->value().getInt()); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_header RDO_uniform RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@4, "После базы ожидается ключевое слово $End"); + } + } + | fun_seq_header RDO_uniform error + { + #PASS2 + { + PARSER->error().error(@3, "После типа последовательности ожидается база генератора или ключевое слово $End"); + } + } + ; fun_seq_exponential - : fun_seq_header RDO_exponential RDO_End - { - #PASS2 - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_header RDO_exponential RDO_INT_CONST RDO_End - { - #PASS2 - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOValue pValue = PARSER->stack().pop($3); - ASSERT(pValue); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, pValue->value().getInt()); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_header RDO_exponential RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@4, "После базы ожидается ключевое слово $End"); - } - } - | fun_seq_header RDO_exponential error - { - #PASS2 - { - PARSER->error().error(@3, "После типа последовательности ожидается база генератора или ключевое слово $End"); - } - } - ; + : fun_seq_header RDO_exponential RDO_End + { + #PASS2 + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_header RDO_exponential RDO_INT_CONST RDO_End + { + #PASS2 + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOValue pValue = PARSER->stack().pop($3); + ASSERT(pValue); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, pValue->value().getInt()); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_header RDO_exponential RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@4, "После базы ожидается ключевое слово $End"); + } + } + | fun_seq_header RDO_exponential error + { + #PASS2 + { + PARSER->error().error(@3, "После типа последовательности ожидается база генератора или ключевое слово $End"); + } + } + ; fun_seq_normal - : fun_seq_header RDO_normal RDO_End - { - #PASS2 - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_header RDO_normal RDO_INT_CONST RDO_End - { - #PASS2 - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOValue pValue = PARSER->stack().pop($3); - ASSERT(pValue); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, pValue->value().getInt()); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_header RDO_normal RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@4, "После базы ожидается ключевое слово $End"); - } - } - | fun_seq_header RDO_normal error - { - #PASS2 - { - PARSER->error().error(@3, "После типа последовательности ожидается база генератора или ключевое слово $End"); - } - } - ; + : fun_seq_header RDO_normal RDO_End + { + #PASS2 + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_header RDO_normal RDO_INT_CONST RDO_End + { + #PASS2 + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOValue pValue = PARSER->stack().pop($3); + ASSERT(pValue); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, pValue->value().getInt()); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_header RDO_normal RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@4, "После базы ожидается ключевое слово $End"); + } + } + | fun_seq_header RDO_normal error + { + #PASS2 + { + PARSER->error().error(@3, "После типа последовательности ожидается база генератора или ключевое слово $End"); + } + } + ; fun_seq_triangular - : fun_seq_header RDO_triangular RDO_End - { - #PASS2 - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_header RDO_triangular RDO_INT_CONST RDO_End - { - #PASS2 - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOValue pValue = PARSER->stack().pop($3); - ASSERT(pValue); - LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, pValue->value().getInt()); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_header RDO_triangular RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@4, "После базы ожидается ключевое слово $End"); - } - } - | fun_seq_header RDO_triangular error - { - #PASS2 - { - PARSER->error().error(@3, "После типа последовательности ожидается база генератора или ключевое слово $End"); - } - } - ; + : fun_seq_header RDO_triangular RDO_End + { + #PASS2 + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_header RDO_triangular RDO_INT_CONST RDO_End + { + #PASS2 + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOValue pValue = PARSER->stack().pop($3); + ASSERT(pValue); + LPRDOFUNSequence pSequence = rdo::Factory::create(pHeader, pValue->value().getInt()); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_header RDO_triangular RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@4, "После базы ожидается ключевое слово $End"); + } + } + | fun_seq_header RDO_triangular error + { + #PASS2 + { + PARSER->error().error(@3, "После типа последовательности ожидается база генератора или ключевое слово $End"); + } + } + ; // ---------------------------------------------------------------------------- // ---------- Гистограмма // ---------------------------------------------------------------------------- fun_seq_by_hist_header - : fun_seq_header RDO_by_hist RDO_Body - { - #PASS2 - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pByHistHeader = rdo::Factory::create(pHeader); - ASSERT(pByHistHeader); - $$ = PARSER->stack().push(pByHistHeader); - } - } - | fun_seq_header RDO_by_hist RDO_INT_CONST RDO_Body - { - #PASS2 - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOValue pValue = PARSER->stack().pop($3); - ASSERT(pValue); - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pByHistHeader = rdo::Factory::create(pHeader, pValue->value().getInt()); - ASSERT(pByHistHeader); - $$ = PARSER->stack().push(pByHistHeader); - } - } - | fun_seq_header RDO_by_hist RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@4, "После базы ожидается ключевое слово $Body"); - } - } - | fun_seq_header RDO_by_hist error - { - #PASS2 - { - PARSER->error().error(@3, "После типа последовательности ожидается база генератора или ключевое слово $Body"); - } - } - ; + : fun_seq_header RDO_by_hist RDO_Body + { + #PASS2 + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pByHistHeader = rdo::Factory::create(pHeader); + ASSERT(pByHistHeader); + $$ = PARSER->stack().push(pByHistHeader); + } + } + | fun_seq_header RDO_by_hist RDO_INT_CONST RDO_Body + { + #PASS2 + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOValue pValue = PARSER->stack().pop($3); + ASSERT(pValue); + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pByHistHeader = rdo::Factory::create(pHeader, pValue->value().getInt()); + ASSERT(pByHistHeader); + $$ = PARSER->stack().push(pByHistHeader); + } + } + | fun_seq_header RDO_by_hist RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@4, "После базы ожидается ключевое слово $Body"); + } + } + | fun_seq_header RDO_by_hist error + { + #PASS2 + { + PARSER->error().error(@3, "После типа последовательности ожидается база генератора или ключевое слово $Body"); + } + } + ; fun_seq_by_hist_body_real - : fun_seq_by_hist_header RDO_REAL_CONST RDO_REAL_CONST RDO_REAL_CONST - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - if (pHeader->getHeader()->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str())); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_header RDO_INT_CONST RDO_REAL_CONST RDO_REAL_CONST - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - if (pHeader->getHeader()->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str())); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_header RDO_REAL_CONST RDO_INT_CONST RDO_REAL_CONST - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - if (pHeader->getHeader()->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str())); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_header RDO_REAL_CONST RDO_REAL_CONST RDO_INT_CONST - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - if (pHeader->getHeader()->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str())); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_header RDO_INT_CONST RDO_INT_CONST RDO_REAL_CONST - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_header RDO_REAL_CONST RDO_INT_CONST RDO_INT_CONST - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - if (pHeader->getHeader()->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str())); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_header RDO_INT_CONST RDO_REAL_CONST RDO_INT_CONST - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - if (pHeader->getHeader()->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str())); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_header RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_REAL_CONST RDO_REAL_CONST - { - #PASS2 - { - LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); - ASSERT(pHeader); - if (pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str())); - } - pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_body_real RDO_INT_CONST RDO_REAL_CONST RDO_REAL_CONST - { - #PASS2 - { - LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); - ASSERT(pHeader); - if (pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str())); - } - pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_INT_CONST RDO_REAL_CONST - { - #PASS2 - { - LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); - ASSERT(pHeader); - if (pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str())); - } - pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_REAL_CONST RDO_INT_CONST - { - #PASS2 - { - LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); - ASSERT(pHeader); - if (pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str())); - } - pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_body_real RDO_INT_CONST RDO_INT_CONST RDO_REAL_CONST - { - #PASS2 - { - LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_INT_CONST RDO_INT_CONST - { - #PASS2 - { - LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); - ASSERT(pHeader); - if (pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str())); - } - pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_body_real RDO_INT_CONST RDO_REAL_CONST RDO_INT_CONST - { - #PASS2 - { - LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); - ASSERT(pHeader); - if (pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str())); - } - pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_body_real RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST - { - #PASS2 - { - LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_header RDO_REAL_CONST error - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - PARSER->error().error(@2, @3, "Ожидается конец диапазона"); - } - } - | fun_seq_by_hist_header RDO_INT_CONST error - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - PARSER->error().error(@2, @3, "Ожидается конец диапазона"); - } - } - | fun_seq_by_hist_header RDO_REAL_CONST RDO_REAL_CONST error - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); - } - } - | fun_seq_by_hist_header RDO_INT_CONST RDO_REAL_CONST error - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); - } - } - | fun_seq_by_hist_header RDO_REAL_CONST RDO_INT_CONST error - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); - } - } - | fun_seq_by_hist_header RDO_INT_CONST RDO_INT_CONST error - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); - } - } - | fun_seq_by_hist_body_real RDO_REAL_CONST error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается конец диапазона"); - } - } - | fun_seq_by_hist_body_real RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается конец диапазона"); - } - } - | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_REAL_CONST error - { - #PASS2 - { - PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); - } - } - | fun_seq_by_hist_body_real RDO_INT_CONST RDO_REAL_CONST error - { - #PASS2 - { - PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); - } - } - | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); - } - } - | fun_seq_by_hist_body_real RDO_INT_CONST RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); - } - } - | fun_seq_by_hist_header RDO_End - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - PARSER->error().error(pHeader->src_info(), rdo::format("Последовательность '%s' не должна быть пустой", pHeader->src_text().c_str())); - } - } - ; + : fun_seq_by_hist_header RDO_REAL_CONST RDO_REAL_CONST RDO_REAL_CONST + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + if (pHeader->getHeader()->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str())); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_header RDO_INT_CONST RDO_REAL_CONST RDO_REAL_CONST + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + if (pHeader->getHeader()->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str())); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_header RDO_REAL_CONST RDO_INT_CONST RDO_REAL_CONST + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + if (pHeader->getHeader()->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str())); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_header RDO_REAL_CONST RDO_REAL_CONST RDO_INT_CONST + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + if (pHeader->getHeader()->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str())); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_header RDO_INT_CONST RDO_INT_CONST RDO_REAL_CONST + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_header RDO_REAL_CONST RDO_INT_CONST RDO_INT_CONST + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + if (pHeader->getHeader()->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str())); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_header RDO_INT_CONST RDO_REAL_CONST RDO_INT_CONST + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + if (pHeader->getHeader()->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->getHeader()->src_text().c_str())); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_header RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + LPRDOFUNSequenceByHistReal pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_REAL_CONST RDO_REAL_CONST + { + #PASS2 + { + LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); + ASSERT(pHeader); + if (pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str())); + } + pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_body_real RDO_INT_CONST RDO_REAL_CONST RDO_REAL_CONST + { + #PASS2 + { + LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); + ASSERT(pHeader); + if (pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str())); + } + pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_INT_CONST RDO_REAL_CONST + { + #PASS2 + { + LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); + ASSERT(pHeader); + if (pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str())); + } + pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_REAL_CONST RDO_INT_CONST + { + #PASS2 + { + LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); + ASSERT(pHeader); + if (pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str())); + } + pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_body_real RDO_INT_CONST RDO_INT_CONST RDO_REAL_CONST + { + #PASS2 + { + LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_INT_CONST RDO_INT_CONST + { + #PASS2 + { + LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); + ASSERT(pHeader); + if (pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str())); + } + pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_body_real RDO_INT_CONST RDO_REAL_CONST RDO_INT_CONST + { + #PASS2 + { + LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = pSequence->getHeader(); + ASSERT(pHeader); + if (pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@3, rdo::format("Последовательность '%s' определена как целочисленная, её диапазоны тоже должны быть целочисленными", pHeader->src_text().c_str())); + } + pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_body_real RDO_INT_CONST RDO_INT_CONST RDO_INT_CONST + { + #PASS2 + { + LPRDOFUNSequenceByHistReal pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + pSequence->addReal(PARSER->stack().pop($2), PARSER->stack().pop($3), PARSER->stack().pop($4)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_header RDO_REAL_CONST error + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + PARSER->error().error(@2, @3, "Ожидается конец диапазона"); + } + } + | fun_seq_by_hist_header RDO_INT_CONST error + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + PARSER->error().error(@2, @3, "Ожидается конец диапазона"); + } + } + | fun_seq_by_hist_header RDO_REAL_CONST RDO_REAL_CONST error + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); + } + } + | fun_seq_by_hist_header RDO_INT_CONST RDO_REAL_CONST error + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); + } + } + | fun_seq_by_hist_header RDO_REAL_CONST RDO_INT_CONST error + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); + } + } + | fun_seq_by_hist_header RDO_INT_CONST RDO_INT_CONST error + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL && pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); + } + } + | fun_seq_by_hist_body_real RDO_REAL_CONST error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается конец диапазона"); + } + } + | fun_seq_by_hist_body_real RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается конец диапазона"); + } + } + | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_REAL_CONST error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); + } + } + | fun_seq_by_hist_body_real RDO_INT_CONST RDO_REAL_CONST error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); + } + } + | fun_seq_by_hist_body_real RDO_REAL_CONST RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); + } + } + | fun_seq_by_hist_body_real RDO_INT_CONST RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Ожидается относительная вероятность"); + } + } + | fun_seq_by_hist_header RDO_End + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + PARSER->error().error(pHeader->src_info(), rdo::format("Последовательность '%s' не должна быть пустой", pHeader->src_text().c_str())); + } + } + ; fun_seq_by_hist_body_enum - : fun_seq_by_hist_header RDO_IDENTIF RDO_REAL_CONST - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_enum) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - LPRDOFUNSequenceByHistEnum pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_header RDO_IDENTIF RDO_INT_CONST - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_enum) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - LPRDOFUNSequenceByHistEnum pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_body_enum RDO_IDENTIF RDO_REAL_CONST - { - #PASS2 - { - LPRDOFUNSequenceByHistEnum pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - pSequence->addEnum(PARSER->stack().pop($2), PARSER->stack().pop($3)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_body_enum RDO_IDENTIF RDO_INT_CONST - { - #PASS2 - { - LPRDOFUNSequenceByHistEnum pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - pSequence->addEnum(PARSER->stack().pop($2), PARSER->stack().pop($3)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_header RDO_IDENTIF error - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_enum) - { - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - LPRDOValue pValue = PARSER->stack().pop($2); - ASSERT(pValue); - PARSER->error().error(@2, @3, rdo::format("Ожидается относительная вероятность для значения: %s", pValue->value().getIdentificator().c_str())); - } - } - | fun_seq_by_hist_body_enum RDO_IDENTIF error - { - #PASS2 - { - LPRDOValue pValue = PARSER->stack().pop($2); - ASSERT(pValue); - PARSER->error().error(@2, @3, rdo::format("Ожидается относительная вероятность для значения: %s", pValue->value().getIdentificator().c_str())); - } - } - | fun_seq_by_hist_body_enum RDO_REAL_CONST error - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - } - | fun_seq_by_hist_body_enum RDO_INT_CONST error - { - #PASS2 - { - RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); - } - } - ; + : fun_seq_by_hist_header RDO_IDENTIF RDO_REAL_CONST + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::ENUM) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + LPRDOFUNSequenceByHistEnum pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_header RDO_IDENTIF RDO_INT_CONST + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::ENUM) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + LPRDOFUNSequenceByHistEnum pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2), PARSER->stack().pop($3)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_body_enum RDO_IDENTIF RDO_REAL_CONST + { + #PASS2 + { + LPRDOFUNSequenceByHistEnum pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + pSequence->addEnum(PARSER->stack().pop($2), PARSER->stack().pop($3)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_body_enum RDO_IDENTIF RDO_INT_CONST + { + #PASS2 + { + LPRDOFUNSequenceByHistEnum pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + pSequence->addEnum(PARSER->stack().pop($2), PARSER->stack().pop($3)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_header RDO_IDENTIF error + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + if (pHeader->getHeader()->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::ENUM) + { + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + LPRDOValue pValue = PARSER->stack().pop($2); + ASSERT(pValue); + PARSER->error().error(@2, @3, rdo::format("Ожидается относительная вероятность для значения: %s", pValue->value().getIdentificator().c_str())); + } + } + | fun_seq_by_hist_body_enum RDO_IDENTIF error + { + #PASS2 + { + LPRDOValue pValue = PARSER->stack().pop($2); + ASSERT(pValue); + PARSER->error().error(@2, @3, rdo::format("Ожидается относительная вероятность для значения: %s", pValue->value().getIdentificator().c_str())); + } + } + | fun_seq_by_hist_body_enum RDO_REAL_CONST error + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + } + | fun_seq_by_hist_body_enum RDO_INT_CONST error + { + #PASS2 + { + RDOFUNSequenceByHist::LPRDOFUNSequenceByHistHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + PARSER->error().error(@2, rdo::format("Значение не соответствует типу последовательности, ожидаемые значение должно соответствовать типу: %s", pHeader->getHeader()->getTypeInfo()->src_info().src_text().c_str())); + } + } + ; fun_seq_by_hist - : fun_seq_by_hist_body_real RDO_End - { - #PASS2 - { - LPRDOFUNSequence pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_body_enum RDO_End - { - #PASS2 - { - LPRDOFUNSequence pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_by_hist_body_real error - { - #PASS2 - { - PARSER->error().error(@2, "Ошибка в описании последовательности"); - } - } - | fun_seq_by_hist_body_enum error - { - #PASS2 - { - PARSER->error().error(@2, "Ошибка в описании последовательности"); - } - } - | fun_seq_by_hist_body_real - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается ключевое слово $End"); - } - } - | fun_seq_by_hist_body_enum - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается ключевое слово $End"); - } - } - ; + : fun_seq_by_hist_body_real RDO_End + { + #PASS2 + { + LPRDOFUNSequence pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_body_enum RDO_End + { + #PASS2 + { + LPRDOFUNSequence pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_by_hist_body_real error + { + #PASS2 + { + PARSER->error().error(@2, "Ошибка в описании последовательности"); + } + } + | fun_seq_by_hist_body_enum error + { + #PASS2 + { + PARSER->error().error(@2, "Ошибка в описании последовательности"); + } + } + | fun_seq_by_hist_body_real + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается ключевое слово $End"); + } + } + | fun_seq_by_hist_body_enum + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается ключевое слово $End"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Перечень значений // -------------------------------------------------------------------------------- fun_seq_enumerative - : fun_seq_enumerative_body RDO_End - { - #PASS2 - { - LPRDOFUNSequence pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - pSequence->createCalcs(); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_enumerative_header RDO_End - { - #PASS2 - { - RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - PARSER->error().error(pHeader->src_info(), rdo::format("Последовательность '%s' не должна быть пустой", pHeader->src_text().c_str())); - } - } - ; + : fun_seq_enumerative_body RDO_End + { + #PASS2 + { + LPRDOFUNSequence pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + pSequence->createCalcs(); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_enumerative_header RDO_End + { + #PASS2 + { + RDOFUNSequence::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + PARSER->error().error(pHeader->src_info(), rdo::format("Последовательность '%s' не должна быть пустой", pHeader->src_text().c_str())); + } + } + ; fun_seq_enumerative_header - : fun_seq_header RDO_enumerative RDO_Body - | fun_seq_header RDO_enumerative RDO_INT_CONST error - { - #PASS2 - { - PARSER->error().error(@3, "У последовательности типа enumerative нет базы генератора"); - } - } - | fun_seq_header RDO_enumerative RDO_Parameters error - { - #PASS2 - { - PARSER->error().error(@3, "У последовательности типа enumerative нет параметров"); - } - } - | fun_seq_header RDO_enumerative error - { - #PASS2 - { - PARSER->error().error(@3, "После типа последовательности ожидается ключевое слово $Body"); - } - } - ; + : fun_seq_header RDO_enumerative RDO_Body + | fun_seq_header RDO_enumerative RDO_INT_CONST error + { + #PASS2 + { + PARSER->error().error(@3, "У последовательности типа enumerative нет базы генератора"); + } + } + | fun_seq_header RDO_enumerative RDO_Parameters error + { + #PASS2 + { + PARSER->error().error(@3, "У последовательности типа enumerative нет параметров"); + } + } + | fun_seq_header RDO_enumerative error + { + #PASS2 + { + PARSER->error().error(@3, "После типа последовательности ожидается ключевое слово $Body"); + } + } + ; fun_seq_enumerative_body - : fun_seq_enumerative_header RDO_INT_CONST - { - #PASS2 - { - RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_enumerative_header RDO_REAL_CONST - { - #PASS2 - { - RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_enumerative_header RDO_BOOL_CONST - { - #PASS2 - { - RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_enumerative_header RDO_STRING_CONST - { - #PASS2 - { - RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_enumerative_header RDO_IDENTIF - { - #PASS2 - { - RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); - ASSERT(pHeader); - LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2)); - ASSERT(pSequence); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_enumerative_body RDO_INT_CONST - { - #PASS2 - { - LPRDOFUNSequenceEnumerative pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - pSequence->addValue(PARSER->stack().pop($2)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_enumerative_body RDO_REAL_CONST - { - #PASS2 - { - LPRDOFUNSequenceEnumerative pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - pSequence->addValue(PARSER->stack().pop($2)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_enumerative_body RDO_BOOL_CONST - { - #PASS2 - { - LPRDOFUNSequenceEnumerative pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - pSequence->addValue(PARSER->stack().pop($2)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_enumerative_body RDO_STRING_CONST - { - #PASS2 - { - LPRDOFUNSequenceEnumerative pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - pSequence->addValue(PARSER->stack().pop($2)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_enumerative_body RDO_IDENTIF - { - #PASS2 - { - LPRDOFUNSequenceEnumerative pSequence = PARSER->stack().pop($1); - ASSERT(pSequence); - pSequence->addValue(PARSER->stack().pop($2)); - $$ = PARSER->stack().push(pSequence); - } - } - | fun_seq_enumerative_body error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ожидается элемент последовательности или ключевое слово $End"); - } - } - ; + : fun_seq_enumerative_header RDO_INT_CONST + { + #PASS2 + { + RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_enumerative_header RDO_REAL_CONST + { + #PASS2 + { + RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_enumerative_header RDO_BOOL_CONST + { + #PASS2 + { + RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_enumerative_header RDO_STRING_CONST + { + #PASS2 + { + RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_enumerative_header RDO_IDENTIF + { + #PASS2 + { + RDOFUNSequenceEnumerative::LPRDOFUNSequenceHeader pHeader = PARSER->stack().pop($1); + ASSERT(pHeader); + LPRDOFUNSequenceEnumerative pSequence = rdo::Factory::create(pHeader, PARSER->stack().pop($2)); + ASSERT(pSequence); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_enumerative_body RDO_INT_CONST + { + #PASS2 + { + LPRDOFUNSequenceEnumerative pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + pSequence->addValue(PARSER->stack().pop($2)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_enumerative_body RDO_REAL_CONST + { + #PASS2 + { + LPRDOFUNSequenceEnumerative pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + pSequence->addValue(PARSER->stack().pop($2)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_enumerative_body RDO_BOOL_CONST + { + #PASS2 + { + LPRDOFUNSequenceEnumerative pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + pSequence->addValue(PARSER->stack().pop($2)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_enumerative_body RDO_STRING_CONST + { + #PASS2 + { + LPRDOFUNSequenceEnumerative pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + pSequence->addValue(PARSER->stack().pop($2)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_enumerative_body RDO_IDENTIF + { + #PASS2 + { + LPRDOFUNSequenceEnumerative pSequence = PARSER->stack().pop($1); + ASSERT(pSequence); + pSequence->addValue(PARSER->stack().pop($2)); + $$ = PARSER->stack().push(pSequence); + } + } + | fun_seq_enumerative_body error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ожидается элемент последовательности или ключевое слово $End"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Синтаксис статистики @@ -7990,332 +8069,332 @@ fun_seq_enumerative_body // -------------------------------------------------------------------------------- pmd_main - : pmd_result_group - ; + : pmd_result_group + ; pmd_result_group_name - : /* empty */ - { - #PASS2 - { - LPRDOResultGroup pResultGroup = PARSER->findResultGroup(""); - if (!pResultGroup) - { - pResultGroup = rdo::Factory::create(); - ASSERT(pResultGroup); - pResultGroup->init(RDOParserSrcInfo()); - } - PARSER->contextStack()->push(pResultGroup); - } - } - | RDO_IDENTIF - { - #PASS2 - { - LPRDOResultGroup pResultGroup = rdo::Factory::create(); - ASSERT(pResultGroup); - pResultGroup->init(RDOParserSrcInfo(@1, PARSER->stack().pop($1)->value().getIdentificator())); - PARSER->contextStack()->push(pResultGroup); - } - } - ; + : /* empty */ + { + #PASS2 + { + LPRDOResultGroup pResultGroup = PARSER->findResultGroup(""); + if (!pResultGroup) + { + pResultGroup = rdo::Factory::create(); + ASSERT(pResultGroup); + pResultGroup->init(RDOParserSrcInfo()); + } + PARSER->contextStack()->push(pResultGroup); + } + } + | RDO_IDENTIF + { + #PASS2 + { + LPRDOResultGroup pResultGroup = rdo::Factory::create(); + ASSERT(pResultGroup); + pResultGroup->init(RDOParserSrcInfo(@1, PARSER->stack().pop($1)->value().getIdentificator())); + PARSER->contextStack()->push(pResultGroup); + } + } + ; pmd_result_group - : RDO_Results pmd_result_group_name pmd_body RDO_End - { - #PASS2 - { - PARSER->contextStack()->pop(); - } - } - | RDO_Results pmd_result_group_name pmd_body error - { - #PASS2 - { - PARSER->contextStack()->pop(); - PARSER->error().error(@3, "Ожидается ключевое слово $End"); - } - } - | error - { - #PASS2 - { - YYLTYPE pos( @1 ); - pos.m_last_line = pos.m_first_line; - pos.m_last_pos = pos.m_first_pos; - pos.m_last_seek = pos.m_first_seek; - PARSER->error().error(pos, "Ожидается ключевое слово $Results"); - } - } - ; + : RDO_Results pmd_result_group_name pmd_body RDO_End + { + #PASS2 + { + PARSER->contextStack()->pop(); + } + } + | RDO_Results pmd_result_group_name pmd_body error + { + #PASS2 + { + PARSER->contextStack()->pop(); + PARSER->error().error(@3, "Ожидается ключевое слово $End"); + } + } + | error + { + #PASS2 + { + YYLTYPE pos( @1 ); + pos.m_last_line = pos.m_first_line; + pos.m_last_pos = pos.m_first_pos; + pos.m_last_seek = pos.m_first_seek; + PARSER->error().error(pos, "Ожидается ключевое слово $Results"); + } + } + ; pmd_body - : /* empty */ - | pmd_body pmd_result - { - #PASS2 - { - LPRDOPMDResult pResult = PARSER->stack().pop($2); - ASSERT(pResult); - } - } - ; + : /* empty */ + | pmd_body pmd_result + { + #PASS2 + { + LPRDOPMDResult pResult = PARSER->stack().pop($2); + ASSERT(pResult); + } + } + ; pmd_trace - : /* empty */ - { - #PASS2 - { - $$ = 0; - } - } - | RDO_trace - { - #PASS2 - { - $$ = 1; - } - } - | RDO_no_trace - { - #PASS2 - { - $$ = 0; - } - } - ; + : /* empty */ + { + #PASS2 + { + $$ = 0; + } + } + | RDO_trace + { + #PASS2 + { + $$ = 1; + } + } + | RDO_no_trace + { + #PASS2 + { + $$ = 0; + } + } + ; pmd_result_watch_quant_begin - : RDO_IDENTIF_COLON pmd_trace RDO_watch_quant RDO_IDENTIF - { - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($1); - LPRDOValue pType = PARSER->stack().pop($4); - ASSERT(pName); - ASSERT(pType); - - LPRDOPMDWatchQuant pWatchQuant = rdo::Factory::create(pName->src_info(), pType->src_info()); - ASSERT(pWatchQuant); - pWatchQuant->init($2 != 0, pType->src_info()); - $$ = PARSER->stack().push(pWatchQuant); - } - } - ; + : RDO_IDENTIF_COLON pmd_trace RDO_watch_quant RDO_IDENTIF + { + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($1); + LPRDOValue pType = PARSER->stack().pop($4); + ASSERT(pName); + ASSERT(pType); + + LPRDOPMDWatchQuant pWatchQuant = rdo::Factory::create(pName->src_info(), pType->src_info()); + ASSERT(pWatchQuant); + pWatchQuant->init($2 != 0, pType->src_info()); + $$ = PARSER->stack().push(pWatchQuant); + } + } + ; pmd_result_watch_value_begin - : RDO_IDENTIF_COLON pmd_trace RDO_watch_value RDO_IDENTIF - { - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($1); - LPRDOValue pType = PARSER->stack().pop($4); - ASSERT(pName); - ASSERT(pType); - - LPRDOPMDWatchValue pWatchValue = rdo::Factory::create(pName->src_info(), pType->src_info()); - ASSERT(pWatchValue); - pWatchValue->init($2 != 0, pType->src_info()); - $$ = PARSER->stack().push(pWatchValue); - } - } - ; + : RDO_IDENTIF_COLON pmd_trace RDO_watch_value RDO_IDENTIF + { + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($1); + LPRDOValue pType = PARSER->stack().pop($4); + ASSERT(pName); + ASSERT(pType); + + LPRDOPMDWatchValue pWatchValue = rdo::Factory::create(pName->src_info(), pType->src_info()); + ASSERT(pWatchValue); + pWatchValue->init($2 != 0, pType->src_info()); + $$ = PARSER->stack().push(pWatchValue); + } + } + ; pmd_result - : RDO_IDENTIF_COLON pmd_trace RDO_watch_par param_full_name - { - #PASS2 - { - LPRDOPMDWatchPar pResult = rdo::Factory::create(PARSER->stack().pop($1)->src_info()); - ASSERT(pResult); - - Context::LPFindResult pParamResult = PARSER->stack().pop($4); - ASSERT(pParamResult->getSwitchContext()); - LPContext pParamContext = pParamResult->getSwitchContext().context; - ASSERT(pParamContext); - - Context::Params params = pParamResult->getSwitchContext().params; - - LPRDORTPResType pType = pParamContext.object_dynamic_cast(); - if (pType) - { - PARSER->error().error(@4, "Невозможно наблюдать за параметром типа ресурса"); - } - LPRDORTPParam pParam = pParamContext.object_dynamic_cast(); - if (!pParam) - { - PARSER->error().error(@4, "Ожидается имя параметра"); - } - - RDOParserSrcInfo srcInfo = RDOParserSrcInfo(@4); - srcInfo.setSrcText(params.identifier()); - pParam->setSrcInfo(srcInfo); - pResult->checkParam(pParam); - - pResult->initFromParam($2 != 0, pParam, params.get(RDORSSResource::GET_RESOURCE)->calc(), params.get(RDOParam::CONTEXT_PARAM_PARAM_ID)); - $$ = PARSER->stack().push(pResult); - } - } - | RDO_IDENTIF_COLON pmd_trace RDO_watch_par error - { - #PASS2 - { - PARSER->error().error(@3, @4, "Синтаксическая ошибка в имени параметра"); - } - } - | RDO_IDENTIF_COLON pmd_trace error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается тип показателя"); - } - } - | RDO_IDENTIF_COLON error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ожидается признак трассировки или тип показателя"); - } - } - | RDO_IDENTIF error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ожидается ':'"); - } - } - | error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается имя показателя"); - } - } - | RDO_IDENTIF_COLON pmd_trace RDO_watch_state fun_logic - { - #PASS2 - { - LPRDOPMDWatchState pResult = rdo::Factory::create(PARSER->stack().pop($1)->src_info()); - ASSERT(pResult); - pResult->init($2 != 0, PARSER->stack().pop($4)); - $$ = PARSER->stack().push(pResult); - } - } - | RDO_IDENTIF_COLON pmd_trace RDO_watch_state error - { - #PASS2 - { - PARSER->error().error(@3, @4, "После ключевого слова watch_state ожидается логическое выражение"); - } - } - | pmd_result_watch_quant_begin fun_logic - { - #PASS2 - { - LPRDOPMDWatchQuant pWatchQuant = PARSER->stack().pop($1); - ASSERT(pWatchQuant); - LPRDOFUNLogic pLogic = PARSER->stack().pop($2); - ASSERT(pLogic); - pWatchQuant->setLogic(pLogic); - $$ = PARSER->stack().push(pWatchQuant); - } - } - | pmd_result_watch_quant_begin RDO_NoCheck - { - #PASS2 - { - LPRDOPMDWatchQuant pWatchQuant = PARSER->stack().pop($1); - ASSERT(pWatchQuant); - pWatchQuant->setLogicNoCheck(); - $$ = PARSER->stack().push(pWatchQuant); - } - } - | pmd_result_watch_quant_begin error - { - #PASS2 - { - PARSER->error().error(@1, @2, "После имени типа ожидается логическое выражение"); - } - } - | RDO_IDENTIF_COLON pmd_trace RDO_watch_quant error - { - #PASS2 - { - PARSER->error().error(@3, @4, "После ключевого слова watch_quant ожидается тип ресурса"); - } - } - | pmd_result_watch_value_begin fun_logic fun_arithm - { - #PASS2 - { - LPRDOPMDWatchValue pWatchValue = PARSER->stack().pop($1); - ASSERT(pWatchValue); - LPRDOFUNLogic pLogic = PARSER->stack().pop($2); - ASSERT(pLogic); - LPRDOFUNArithm pArithm = PARSER->stack().pop($3); - ASSERT(pArithm); - pWatchValue->setLogic(pLogic, pArithm); - $$ = PARSER->stack().push(pWatchValue); - } - } - | pmd_result_watch_value_begin RDO_NoCheck fun_arithm - { - #PASS2 - { - LPRDOPMDWatchValue pWatchValue = PARSER->stack().pop($1); - ASSERT(pWatchValue); - LPRDOFUNArithm pArithm = PARSER->stack().pop($3); - ASSERT(pArithm); - pWatchValue->setLogicNoCheck(pArithm); - $$ = PARSER->stack().push(pWatchValue); - } - } - | pmd_result_watch_value_begin fun_logic error - { - #PASS2 - { - PARSER->error().error(@2, @3, "После логического ожидается арифметическое выражение"); - } - } - | pmd_result_watch_value_begin RDO_NoCheck error - { - #PASS2 - { - PARSER->error().error(@2, @3, "После логического ожидается арифметическое выражение"); - } - } - | pmd_result_watch_value_begin error - { - #PASS2 - { - PARSER->error().error(@1, @2, "После имени типа ожидается логическое выражение"); - } - } - | RDO_IDENTIF_COLON pmd_trace RDO_watch_value error - { - #PASS2 - { - PARSER->error().error(@3, @4, "После ключевого слова watch_value ожидается тип ресурса"); - } - } - | RDO_IDENTIF_COLON RDO_get_value fun_arithm - { - #PASS2 - { - LPRDOPMDGetValue pResult = rdo::Factory::create(PARSER->stack().pop($1)->src_info()); - ASSERT(pResult); - pResult->init(PARSER->stack().pop($3)); - $$ = PARSER->stack().push(pResult); - } - } - | RDO_IDENTIF_COLON RDO_get_value error - { - #PASS2 - { - PARSER->error().error(@2, @3, "После ключевого слова get_value ожидается арифметическое выражение"); - } - } - ; + : RDO_IDENTIF_COLON pmd_trace RDO_watch_par param_full_name + { + #PASS2 + { + LPRDOPMDWatchPar pResult = rdo::Factory::create(PARSER->stack().pop($1)->src_info()); + ASSERT(pResult); + + Context::LPFindResult pParamResult = PARSER->stack().pop($4); + ASSERT(pParamResult->getSwitchContext()); + LPContext pParamContext = pParamResult->getSwitchContext().context; + ASSERT(pParamContext); + + Context::Params params = pParamResult->getSwitchContext().params; + + LPRDORTPResType pType = pParamContext.object_dynamic_cast(); + if (pType) + { + PARSER->error().error(@4, "Невозможно наблюдать за параметром типа ресурса"); + } + LPRDORTPParam pParam = pParamContext.object_dynamic_cast(); + if (!pParam) + { + PARSER->error().error(@4, "Ожидается имя параметра"); + } + + RDOParserSrcInfo srcInfo = RDOParserSrcInfo(@4); + srcInfo.setSrcText(params.identifier()); + pParam->setSrcInfo(srcInfo); + pResult->checkParam(pParam); + + pResult->initFromParam($2 != 0, pParam, params.get(RDORSSResource::GET_RESOURCE)->calc(), params.get(RDOParam::CONTEXT_PARAM_PARAM_ID)); + $$ = PARSER->stack().push(pResult); + } + } + | RDO_IDENTIF_COLON pmd_trace RDO_watch_par error + { + #PASS2 + { + PARSER->error().error(@3, @4, "Синтаксическая ошибка в имени параметра"); + } + } + | RDO_IDENTIF_COLON pmd_trace error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается тип показателя"); + } + } + | RDO_IDENTIF_COLON error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ожидается признак трассировки или тип показателя"); + } + } + | RDO_IDENTIF error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ожидается ':'"); + } + } + | error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается имя показателя"); + } + } + | RDO_IDENTIF_COLON pmd_trace RDO_watch_state fun_logic + { + #PASS2 + { + LPRDOPMDWatchState pResult = rdo::Factory::create(PARSER->stack().pop($1)->src_info()); + ASSERT(pResult); + pResult->init($2 != 0, PARSER->stack().pop($4)); + $$ = PARSER->stack().push(pResult); + } + } + | RDO_IDENTIF_COLON pmd_trace RDO_watch_state error + { + #PASS2 + { + PARSER->error().error(@3, @4, "После ключевого слова watch_state ожидается логическое выражение"); + } + } + | pmd_result_watch_quant_begin fun_logic + { + #PASS2 + { + LPRDOPMDWatchQuant pWatchQuant = PARSER->stack().pop($1); + ASSERT(pWatchQuant); + LPRDOFUNLogic pLogic = PARSER->stack().pop($2); + ASSERT(pLogic); + pWatchQuant->setLogic(pLogic); + $$ = PARSER->stack().push(pWatchQuant); + } + } + | pmd_result_watch_quant_begin RDO_NoCheck + { + #PASS2 + { + LPRDOPMDWatchQuant pWatchQuant = PARSER->stack().pop($1); + ASSERT(pWatchQuant); + pWatchQuant->setLogicNoCheck(); + $$ = PARSER->stack().push(pWatchQuant); + } + } + | pmd_result_watch_quant_begin error + { + #PASS2 + { + PARSER->error().error(@1, @2, "После имени типа ожидается логическое выражение"); + } + } + | RDO_IDENTIF_COLON pmd_trace RDO_watch_quant error + { + #PASS2 + { + PARSER->error().error(@3, @4, "После ключевого слова watch_quant ожидается тип ресурса"); + } + } + | pmd_result_watch_value_begin fun_logic fun_arithm + { + #PASS2 + { + LPRDOPMDWatchValue pWatchValue = PARSER->stack().pop($1); + ASSERT(pWatchValue); + LPRDOFUNLogic pLogic = PARSER->stack().pop($2); + ASSERT(pLogic); + LPRDOFUNArithm pArithm = PARSER->stack().pop($3); + ASSERT(pArithm); + pWatchValue->setLogic(pLogic, pArithm); + $$ = PARSER->stack().push(pWatchValue); + } + } + | pmd_result_watch_value_begin RDO_NoCheck fun_arithm + { + #PASS2 + { + LPRDOPMDWatchValue pWatchValue = PARSER->stack().pop($1); + ASSERT(pWatchValue); + LPRDOFUNArithm pArithm = PARSER->stack().pop($3); + ASSERT(pArithm); + pWatchValue->setLogicNoCheck(pArithm); + $$ = PARSER->stack().push(pWatchValue); + } + } + | pmd_result_watch_value_begin fun_logic error + { + #PASS2 + { + PARSER->error().error(@2, @3, "После логического ожидается арифметическое выражение"); + } + } + | pmd_result_watch_value_begin RDO_NoCheck error + { + #PASS2 + { + PARSER->error().error(@2, @3, "После логического ожидается арифметическое выражение"); + } + } + | pmd_result_watch_value_begin error + { + #PASS2 + { + PARSER->error().error(@1, @2, "После имени типа ожидается логическое выражение"); + } + } + | RDO_IDENTIF_COLON pmd_trace RDO_watch_value error + { + #PASS2 + { + PARSER->error().error(@3, @4, "После ключевого слова watch_value ожидается тип ресурса"); + } + } + | RDO_IDENTIF_COLON RDO_get_value fun_arithm + { + #PASS2 + { + LPRDOPMDGetValue pResult = rdo::Factory::create(PARSER->stack().pop($1)->src_info()); + ASSERT(pResult); + pResult->init(PARSER->stack().pop($3)); + $$ = PARSER->stack().push(pResult); + } + } + | RDO_IDENTIF_COLON RDO_get_value error + { + #PASS2 + { + PARSER->error().error(@2, @3, "После ключевого слова get_value ожидается арифметическое выражение"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Процессный подход @@ -8324,2064 +8403,2064 @@ pmd_result // -------------------------------------------------------------------------------- prc_main - : process RDO_End - { - #PASS2 - { - PARSER->getLastPROCProcess()->end(); - } - } - ; + : process RDO_End + { + #PASS2 + { + PARSER->getLastPROCProcess()->end(); + } + } + ; process - : process_header process_input - ; + : process_header process_input + ; process_header - : process_begin process_condition process_prior - ; + : process_begin process_condition process_prior + ; process_begin - : RDO_Process RDO_IDENTIF RDO_IDENTIF - { - #PASS2 - { - LPRDOPROCProcess pProcess = PARSER->getLastPROCProcess(); - if (pProcess && !pProcess->closed()) - { - PARSER->error().error(pProcess->src_info(), "Не закрыт предыдущий блок $Process"); - } - - LPRDOValue transact = PARSER->stack().pop($3); - const std::string transactName = transact->value().getIdentificator(); - const std::string rtp_param_name = "Время_создания"; - - // Получили список всех типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); - // Найти тип ресурса, если его нет, то создать - if (!rtpList[transactName].exist()) - { - // Создадим тип ресурса-транзакта - rdo::compiler::mbuilder::RDOResType rtp(transactName, rdo::compiler::mbuilder::RDOResType::rt_temporary); - // Добавим параметр Время_создания - rdo::compiler::mbuilder::RDOResType::Param param(rtp_param_name, rdo::Factory::create()); - rtp.m_params.append(param); - // Добавим тип ресурса - if (!rtpList.append(rtp)) - { - PARSER->error().error(@2, rdo::format("Ошибка создания типа ресурса: %s", transactName.c_str())); - } - LPRDORTPResType pResType = PARSER->findRTPResType(transactName); - ASSERT(pResType); - pResType->setSubtype(RDORTPResType::RT_PROCESS_TRANSACT); - } - else - { - // Проверим тип на временность - const rdo::compiler::mbuilder::RDOResType& rtp = rtpList[transactName]; - if (rtp.getType() != rdo::compiler::mbuilder::RDOResType::rt_temporary) - { - PARSER->error().push_only(transact->src_info(), rdo::format("Типа транзакта '%s' должен быть временным", rtp.name().c_str())); - PARSER->error().push_only(rtp.src_info(), "См. тип"); - PARSER->error().push_done(); - } - - // Проверим тип на наличие вещественного параметра - if (!rtp.m_params[rtp_param_name].exist()) - { - PARSER->error().error(rtp.src_info(), rdo::format("У типа ресурса '%s' нет требуемого параметра '%s'", rtp.name().c_str(), rtp_param_name.c_str())); - } - // Параметр есть, надо проверить на тип - if (rtp.m_params[rtp_param_name].typeID() != rdo::runtime::RDOType::t_real) - { - PARSER->error().error(rtp.src_info(), rdo::format("У типа ресурса '%s' параметр '%s' не является вещественным типом", rtp.name().c_str(), rtp_param_name.c_str())); - } - // Тип ресурса подходит в качестве типа транзакта - LPRDORTPResType pResType = PARSER->findRTPResType(transactName); - pResType->setSubtype(RDORTPResType::RT_PROCESS_TRANSACT); - } - - LPRDORTPResType transactType = PARSER->findRTPResType(transactName); - - const std::string procName = PARSER->stack().pop($2)->value().getIdentificator(); - pProcess = rdo::Factory::create(RDOParserSrcInfo(@1, @3, procName), procName, transactType); - ASSERT(pProcess); - } - } - | RDO_Process error - { - PARSER->error().error(@2, @2, "Ошибка в процессе!"); - } - ; + : RDO_Process RDO_IDENTIF RDO_IDENTIF + { + #PASS2 + { + LPRDOPROCProcess pProcess = PARSER->getLastPROCProcess(); + if (pProcess && !pProcess->closed()) + { + PARSER->error().error(pProcess->src_info(), "Не закрыт предыдущий блок $Process"); + } + + LPRDOValue transact = PARSER->stack().pop($3); + const std::string transactName = transact->value().getIdentificator(); + const std::string rtp_param_name = "Время_создания"; + + // Получили список всех типов ресурсов + rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); + // Найти тип ресурса, если его нет, то создать + if (!rtpList[transactName].exist()) + { + // Создадим тип ресурса-транзакта + rdo::compiler::mbuilder::RDOResType rtp(transactName, rdo::compiler::mbuilder::RDOResType::Kind::TEMPORARY); + // Добавим параметр Время_создания + rdo::compiler::mbuilder::RDOResType::Param param(rtp_param_name, rdo::Factory::create()); + rtp.m_params.append(param); + // Добавим тип ресурса + if (!rtpList.append(rtp)) + { + PARSER->error().error(@2, rdo::format("Ошибка создания типа ресурса: %s", transactName.c_str())); + } + LPRDORTPResType pResType = PARSER->findRTPResType(transactName); + ASSERT(pResType); + pResType->setSubtype(RDORTPResType::Subtype::PROCESS_TRANSACT); + } + else + { + // Проверим тип на временность + const rdo::compiler::mbuilder::RDOResType& rtp = rtpList[transactName]; + if (rtp.getKind() != rdo::compiler::mbuilder::RDOResType::Kind::TEMPORARY) + { + PARSER->error().push_only(transact->src_info(), rdo::format("Типа транзакта '%s' должен быть временным", rtp.name().c_str())); + PARSER->error().push_only(rtp.src_info(), "См. тип"); + PARSER->error().push_done(); + } + + // Проверим тип на наличие вещественного параметра + if (!rtp.m_params[rtp_param_name].exist()) + { + PARSER->error().error(rtp.src_info(), rdo::format("У типа ресурса '%s' нет требуемого параметра '%s'", rtp.name().c_str(), rtp_param_name.c_str())); + } + // Параметр есть, надо проверить на тип + if (rtp.m_params[rtp_param_name].typeID() != rdo::runtime::RDOType::Type::REAL) + { + PARSER->error().error(rtp.src_info(), rdo::format("У типа ресурса '%s' параметр '%s' не является вещественным типом", rtp.name().c_str(), rtp_param_name.c_str())); + } + // Тип ресурса подходит в качестве типа транзакта + LPRDORTPResType pResType = PARSER->findRTPResType(transactName); + pResType->setSubtype(RDORTPResType::Subtype::PROCESS_TRANSACT); + } + + LPRDORTPResType transactType = PARSER->findRTPResType(transactName); + + const std::string procName = PARSER->stack().pop($2)->value().getIdentificator(); + pProcess = rdo::Factory::create(RDOParserSrcInfo(@1, @3, procName), procName, transactType); + ASSERT(pProcess); + } + } + | RDO_Process error + { + PARSER->error().error(@2, @2, "Ошибка в процессе!"); + } + ; process_condition - : /* empty */ - { - #PASS2 - { - LPRDOPROCProcess pProcess = PARSER->getLastPROCProcess(); - ASSERT(pProcess); - pProcess->setCondition(); - } - } - | RDO_Condition fun_logic - { - #PASS2 - { - LPRDOPROCProcess pProcess = PARSER->getLastPROCProcess(); - ASSERT(pProcess); - pProcess->setCondition(PARSER->stack().pop($2)); - } - } - | RDO_Condition RDO_NoCheck - { - #PASS2 - { - LPRDOPROCProcess pProcess = PARSER->getLastPROCProcess(); - ASSERT(pProcess); - pProcess->setCondition(); - } - } - | RDO_Condition error - { - #PASS1 - { - PARSER->error().error(@2, @2, "После ключевого слова $Condition ожидается условие активации процесса"); - } - } - | error - { - #PASS1 - { - PARSER->error().error(@1, "Ожидается ключевое слово $Condition"); - } - } - ; + : /* empty */ + { + #PASS2 + { + LPRDOPROCProcess pProcess = PARSER->getLastPROCProcess(); + ASSERT(pProcess); + pProcess->setCondition(); + } + } + | RDO_Condition fun_logic + { + #PASS2 + { + LPRDOPROCProcess pProcess = PARSER->getLastPROCProcess(); + ASSERT(pProcess); + pProcess->setCondition(PARSER->stack().pop($2)); + } + } + | RDO_Condition RDO_NoCheck + { + #PASS2 + { + LPRDOPROCProcess pProcess = PARSER->getLastPROCProcess(); + ASSERT(pProcess); + pProcess->setCondition(); + } + } + | RDO_Condition error + { + #PASS1 + { + PARSER->error().error(@2, @2, "После ключевого слова $Condition ожидается условие активации процесса"); + } + } + | error + { + #PASS1 + { + PARSER->error().error(@1, "Ожидается ключевое слово $Condition"); + } + } + ; process_prior - : /* empty */ - | RDO_Priority fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($2); - ASSERT(pArithm); - if (!PARSER->getLastPROCProcess()->setPrior(pArithm)) - { - PARSER->error().error(@2, "Процесс не может иметь приоритет"); - } - } - } - | RDO_Priority error - { - #PASS1 - { - PARSER->error().error(@1, @2, "Ошибка описания приоритета процесса"); - } - } - | error - { - #PASS1 - { - PARSER->error().error(@1, @1, "Ожидается ключевое слово $Priority"); - } - } - ; + : /* empty */ + | RDO_Priority fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($2); + ASSERT(pArithm); + if (!PARSER->getLastPROCProcess()->setPrior(pArithm)) + { + PARSER->error().error(@2, "Процесс не может иметь приоритет"); + } + } + } + | RDO_Priority error + { + #PASS1 + { + PARSER->error().error(@1, @2, "Ошибка описания приоритета процесса"); + } + } + | error + { + #PASS1 + { + PARSER->error().error(@1, @1, "Ожидается ключевое слово $Priority"); + } + } + ; process_input - : /* empty */ - | process_input process_line - ; + : /* empty */ + | process_input process_line + ; process_line - : RDO_IDENTIF - { - #PASS1 - { - PARSER->error().error(@1, rdo::format("Неизвестный оператор '%s'", PARSER->stack().pop($1)->value().getIdentificator().c_str())); - } - } - | proc_planning_statement - { - #PASS2 - { - rdo::runtime::LPRDOCalc pCalc = PARSER->stack().pop($1); - ASSERT(pCalc); - LPRDOPROCOperator pBlock = rdo::Factory::create( - PARSER->getLastPROCProcess(), - "Event planning from process", - pCalc - ); - ASSERT(pBlock); - $$ = PARSER->stack().push(pBlock); - } - } - | proc_stopping_statement - { - #PASS2 - { - rdo::runtime::LPRDOCalc pCalc = PARSER->stack().pop($1); - ASSERT(pCalc); - LPRDOPROCOperator pBlock = rdo::Factory::create( - PARSER->getLastPROCProcess(), - "Event stop from process", - pCalc - ); - ASSERT(pBlock); - $$ = PARSER->stack().push(pBlock); - } - } - | RDO_GENERATE fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($2); - ASSERT(pArithm); - - rdo::runtime::LPRDOCalc pCalcTime = pArithm->createCalc(); - ASSERT(pCalcTime); - - LPRDOPROCProcess pProc = PARSER->getLastPROCProcess(); - ASSERT(pProc); - - LPRDORTPResType pParserType = pProc->getTransacType(); - ASSERT(pParserType); - - const bool permanentFlag = pParserType->isPermanent(); - const bool traceFlag = true; - - std::vector paramList; - //! \error вместо настоящих значений параметров транзакта просто 0 - paramList.push_back(rdo::Factory::create(rdo::runtime::RDOValue(0))); - - rdo::runtime::LPRDOCalcCreateResource pCreateAndGoOnTransactCalc = rdo::Factory::create( - pParserType->getNumber(), - paramList, - traceFlag, - permanentFlag - ); - ASSERT(pCreateAndGoOnTransactCalc); - - LPRDOPROCOperator pBlock = rdo::Factory::create( - pProc, - "GENERATE", - pCalcTime, - pCreateAndGoOnTransactCalc - ); - ASSERT(pBlock); - - $$ = PARSER->stack().push(pBlock); - } - } - | RDO_GENERATE error - { - #PASS1 - { - PARSER->error().error(@2, "Ошибка в арифметическом выражении"); - } - } - | RDO_TERMINATE term_param - { - #PASS2 - { - LPRDOPROCOperator pBlock = PARSER->stack().pop($2); - ASSERT(pBlock); - $$ = PARSER->stack().push(pBlock); - } - } - | RDO_TERMINATE error - { - PARSER->error().error(@1, "Ошибка в параметре оператора TERMINATE"); - } - | RDO_ADVANCE fun_arithm - { - #PASS2 - { - LPRDOPROCOperator pBlock = rdo::Factory::create(PARSER->getLastPROCProcess(), "ADVANCE", PARSER->stack().pop($2)->createCalc()); - ASSERT(pBlock); - $$ = PARSER->stack().push(pBlock); - } - } - | RDO_ADVANCE error - { - #PASS1 - { - PARSER->error().error(@2, "Ошибка в арифметическом выражении"); - } - } - | RDO_QUEUE queue_param - { - #PASS2 - { - TRACE("QUEUE dpt_queue_param\n"); - LPRDOPROCQueue pQueue = PARSER->stack().pop($2); - ASSERT(pQueue); - pQueue->createRuntime(); - $$ = PARSER->stack().push(pQueue); - } - } - | RDO_QUEUE error - { - #PASS1 - { - PARSER->error().error(@1, "Ожидается имя ресурса для сбора статистики по очереди"); - } - } - | RDO_DEPART depart_param - { - #PASS2 - { - TRACE("DEPART dpt_depart_param\n"); - LPRDOPROCDepart pDepart = PARSER->stack().pop($2); - ASSERT(pDepart); - pDepart->createRuntime(); - $$ = PARSER->stack().push(pDepart); - } - } - | RDO_DEPART error - { - #PASS1 - { - PARSER->error().error(@1, "Ожидается имя ресурса для сбора статистики по очереди"); - } - } - | RDO_SEIZE seize_param - { - #PASS2 - { - TRACE("SEIZE dpt_seize_param\n"); - LPRDOPROCSeize pSeize = PARSER->stack().pop($2); - ASSERT(pSeize); - pSeize->createRuntime(); - $$ = PARSER->stack().push(pSeize); - } - } - | RDO_SEIZE error - { - #PASS1 - { - PARSER->error().error(@1, rdo::format("Ожидается список ресурсов, объединяемых в блок, через запятую")); - } - } - | RDO_RELEASE release_param - { - #PASS2 - { - TRACE("RELEASE dpt_release_param\n"); - LPRDOPROCRelease pRelease = PARSER->stack().pop($2); - ASSERT(pRelease); - pRelease->createRuntime(); - $$ = PARSER->stack().push(pRelease); - } - } - | RDO_RELEASE error - { - #PASS1 - { - PARSER->error().error(@1, rdo::format("Ожидается список ресурсов, объединяемых в блок, через запятую")); - } - } - | RDO_ASSIGN assign_param - { - } - | RDO_ASSIGN error - { - #PASS1 - { - PARSER->error().error(@1, rdo::format("Ожидается строка изменения параметра")); - } - } - ; + : RDO_IDENTIF + { + #PASS1 + { + PARSER->error().error(@1, rdo::format("Неизвестный оператор '%s'", PARSER->stack().pop($1)->value().getIdentificator().c_str())); + } + } + | proc_planning_statement + { + #PASS2 + { + rdo::runtime::LPRDOCalc pCalc = PARSER->stack().pop($1); + ASSERT(pCalc); + LPRDOPROCOperator pBlock = rdo::Factory::create( + PARSER->getLastPROCProcess(), + "Event planning from process", + pCalc + ); + ASSERT(pBlock); + $$ = PARSER->stack().push(pBlock); + } + } + | proc_stopping_statement + { + #PASS2 + { + rdo::runtime::LPRDOCalc pCalc = PARSER->stack().pop($1); + ASSERT(pCalc); + LPRDOPROCOperator pBlock = rdo::Factory::create( + PARSER->getLastPROCProcess(), + "Event stop from process", + pCalc + ); + ASSERT(pBlock); + $$ = PARSER->stack().push(pBlock); + } + } + | RDO_GENERATE fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($2); + ASSERT(pArithm); + + rdo::runtime::LPRDOCalc pCalcTime = pArithm->createCalc(); + ASSERT(pCalcTime); + + LPRDOPROCProcess pProc = PARSER->getLastPROCProcess(); + ASSERT(pProc); + + LPRDORTPResType pParserType = pProc->getTransacType(); + ASSERT(pParserType); + + const bool permanentFlag = pParserType->isPermanent(); + const bool traceFlag = true; + + std::vector paramList; + // ERROR вместо настоящих значений параметров транзакта просто 0 + paramList.push_back(rdo::Factory::create(rdo::runtime::RDOValue(0))); + + rdo::runtime::LPRDOCalcCreateResource pCreateAndGoOnTransactCalc = rdo::Factory::create( + pParserType->getNumber(), + paramList, + traceFlag, + permanentFlag + ); + ASSERT(pCreateAndGoOnTransactCalc); + + LPRDOPROCOperator pBlock = rdo::Factory::create( + pProc, + "GENERATE", + pCalcTime, + pCreateAndGoOnTransactCalc + ); + ASSERT(pBlock); + + $$ = PARSER->stack().push(pBlock); + } + } + | RDO_GENERATE error + { + #PASS1 + { + PARSER->error().error(@2, "Ошибка в арифметическом выражении"); + } + } + | RDO_TERMINATE term_param + { + #PASS2 + { + LPRDOPROCOperator pBlock = PARSER->stack().pop($2); + ASSERT(pBlock); + $$ = PARSER->stack().push(pBlock); + } + } + | RDO_TERMINATE error + { + PARSER->error().error(@1, "Ошибка в параметре оператора TERMINATE"); + } + | RDO_ADVANCE fun_arithm + { + #PASS2 + { + LPRDOPROCOperator pBlock = rdo::Factory::create(PARSER->getLastPROCProcess(), "ADVANCE", PARSER->stack().pop($2)->createCalc()); + ASSERT(pBlock); + $$ = PARSER->stack().push(pBlock); + } + } + | RDO_ADVANCE error + { + #PASS1 + { + PARSER->error().error(@2, "Ошибка в арифметическом выражении"); + } + } + | RDO_QUEUE queue_param + { + #PASS2 + { + TRACE("QUEUE dpt_queue_param\n"); + LPRDOPROCQueue pQueue = PARSER->stack().pop($2); + ASSERT(pQueue); + pQueue->createRuntime(); + $$ = PARSER->stack().push(pQueue); + } + } + | RDO_QUEUE error + { + #PASS1 + { + PARSER->error().error(@1, "Ожидается имя ресурса для сбора статистики по очереди"); + } + } + | RDO_DEPART depart_param + { + #PASS2 + { + TRACE("DEPART dpt_depart_param\n"); + LPRDOPROCDepart pDepart = PARSER->stack().pop($2); + ASSERT(pDepart); + pDepart->createRuntime(); + $$ = PARSER->stack().push(pDepart); + } + } + | RDO_DEPART error + { + #PASS1 + { + PARSER->error().error(@1, "Ожидается имя ресурса для сбора статистики по очереди"); + } + } + | RDO_SEIZE seize_param + { + #PASS2 + { + TRACE("SEIZE dpt_seize_param\n"); + LPRDOPROCSeize pSeize = PARSER->stack().pop($2); + ASSERT(pSeize); + pSeize->createRuntime(); + $$ = PARSER->stack().push(pSeize); + } + } + | RDO_SEIZE error + { + #PASS1 + { + PARSER->error().error(@1, rdo::format("Ожидается список ресурсов, объединяемых в блок, через запятую")); + } + } + | RDO_RELEASE release_param + { + #PASS2 + { + TRACE("RELEASE dpt_release_param\n"); + LPRDOPROCRelease pRelease = PARSER->stack().pop($2); + ASSERT(pRelease); + pRelease->createRuntime(); + $$ = PARSER->stack().push(pRelease); + } + } + | RDO_RELEASE error + { + #PASS1 + { + PARSER->error().error(@1, rdo::format("Ожидается список ресурсов, объединяемых в блок, через запятую")); + } + } + | RDO_ASSIGN assign_param + { + } + | RDO_ASSIGN error + { + #PASS1 + { + PARSER->error().error(@1, rdo::format("Ожидается строка изменения параметра")); + } + } + ; proc_planning_statement - : RDO_IDENTIF '.' RDO_Planning '(' arithm_list ')' ';' - { - #PASS2 - { - const std::string eventName = PARSER->stack().pop($1)->value().getIdentificator(); - LPArithmContainer pArithmList = PARSER->stack().pop($5); - - LPRDOPATPattern pPattern = PARSER->findPATPattern(eventName); - if (!pPattern) - { - PARSER->error().error(@1, rdo::format("Попытка запланировать неизвестное событие: %s", eventName.c_str())); - } - - LPRDOPatternEvent pEvent = pPattern.object_dynamic_cast(); - if (!pEvent) - { - PARSER->error().error(@1, rdo::format("Паттерн %s не является событием", eventName.c_str())); - } - - ArithmContainer::Container::const_iterator arithmIt = pArithmList->getContainer().begin(); - if (arithmIt == pArithmList->getContainer().end()) - { - PARSER->error().error(@1, rdo::format("Не указано время планирования события: %s", eventName.c_str())); - } - - LPRDOFUNArithm pTimeArithm = *arithmIt; - ASSERT(pTimeArithm); - ++arithmIt; - - LPArithmContainer pParamList = rdo::Factory::create(); - ASSERT(pParamList); - - while (arithmIt != pArithmList->getContainer().end()) - { - pParamList->addItem(*arithmIt); - ++arithmIt; - } - - rdo::runtime::LPRDOCalc pCalcTime = pTimeArithm->createCalc(); - pCalcTime->setSrcInfo(pTimeArithm->src_info()); - ASSERT(pCalcTime); - - rdo::runtime::LPRDOCalcEventPlan pEventPlan = pEvent->planning(pCalcTime, pParamList); - pEventPlan->setSrcInfo(RDOParserSrcInfo(@1, @6, rdo::format("Планирование события %s в момент времени %s", eventName.c_str(), pCalcTime->srcInfo().src_text().c_str()))); - $$ = PARSER->stack().push(pEventPlan); - } - } - | RDO_IDENTIF '.' RDO_Planning '(' arithm_list ')' error - { - #PASS1 - { - PARSER->error().error(@7, "Не найден символ окончания инструкции - точка с запятой"); - } - } - | RDO_IDENTIF '.' RDO_Planning '(' error - { - #PASS1 - { - PARSER->error().error(@5, "Ошибка в арифметическом выражении"); - } - } - | RDO_IDENTIF '.' RDO_Planning error - { - #PASS1 - { - PARSER->error().error(@4, "Ожидается открывающая скобка"); - } - } - | RDO_IDENTIF '.' RDO_Planning '(' arithm_list error - { - #PASS1 - { - PARSER->error().error(@6, "Ожидается закрывающая скобка"); - } - } - ; + : RDO_IDENTIF '.' RDO_Planning '(' arithm_list ')' ';' + { + #PASS2 + { + const std::string eventName = PARSER->stack().pop($1)->value().getIdentificator(); + LPArithmContainer pArithmList = PARSER->stack().pop($5); + + LPRDOPATPattern pPattern = PARSER->findPATPattern(eventName); + if (!pPattern) + { + PARSER->error().error(@1, rdo::format("Попытка запланировать неизвестное событие: %s", eventName.c_str())); + } + + LPRDOPatternEvent pEvent = pPattern.object_dynamic_cast(); + if (!pEvent) + { + PARSER->error().error(@1, rdo::format("Паттерн %s не является событием", eventName.c_str())); + } + + ArithmContainer::Container::const_iterator arithmIt = pArithmList->getContainer().begin(); + if (arithmIt == pArithmList->getContainer().end()) + { + PARSER->error().error(@1, rdo::format("Не указано время планирования события: %s", eventName.c_str())); + } + + LPRDOFUNArithm pTimeArithm = *arithmIt; + ASSERT(pTimeArithm); + ++arithmIt; + + LPArithmContainer pParamList = rdo::Factory::create(); + ASSERT(pParamList); + + while (arithmIt != pArithmList->getContainer().end()) + { + pParamList->addItem(*arithmIt); + ++arithmIt; + } + + rdo::runtime::LPRDOCalc pCalcTime = pTimeArithm->createCalc(); + pCalcTime->setSrcInfo(pTimeArithm->src_info()); + ASSERT(pCalcTime); + + rdo::runtime::LPRDOCalcEventPlan pEventPlan = pEvent->planning(pCalcTime, pParamList); + pEventPlan->setSrcInfo(RDOParserSrcInfo(@1, @6, rdo::format("Планирование события %s в момент времени %s", eventName.c_str(), pCalcTime->srcInfo().src_text().c_str()))); + $$ = PARSER->stack().push(pEventPlan); + } + } + | RDO_IDENTIF '.' RDO_Planning '(' arithm_list ')' error + { + #PASS1 + { + PARSER->error().error(@7, "Не найден символ окончания инструкции - точка с запятой"); + } + } + | RDO_IDENTIF '.' RDO_Planning '(' error + { + #PASS1 + { + PARSER->error().error(@5, "Ошибка в арифметическом выражении"); + } + } + | RDO_IDENTIF '.' RDO_Planning error + { + #PASS1 + { + PARSER->error().error(@4, "Ожидается открывающая скобка"); + } + } + | RDO_IDENTIF '.' RDO_Planning '(' arithm_list error + { + #PASS1 + { + PARSER->error().error(@6, "Ожидается закрывающая скобка"); + } + } + ; proc_stopping_statement - : RDO_IDENTIF '.' RDO_Stopping '(' ')' ';' - { - #PASS2 - { - const std::string eventName = PARSER->stack().pop($1)->value().getIdentificator(); - LPRDOPATPattern pPattern = PARSER->findPATPattern(eventName); - if (!pPattern) - { - PARSER->error().error(@1, rdo::format("Попытка остановить неизвестное событие: %s", eventName.c_str())); - } - - LPRDOPatternEvent pEvent = pPattern.object_dynamic_cast(); - if (!pEvent) - { - PARSER->error().error(@1, rdo::format("Паттерн %s не является событием", eventName.c_str())); - } - - rdo::runtime::LPRDOCalcEventStop pCalc = pEvent->stoping(); - pCalc->setSrcInfo(RDOParserSrcInfo(@1, @6, rdo::format("Остановка события %s", eventName.c_str()))); - - $$ = PARSER->stack().push(pCalc); - } - } - | RDO_IDENTIF '.' RDO_Stopping '(' ')' error - { - #PASS1 - { - PARSER->error().error(@4, "Не найден символ окончания инструкции - точка с запятой"); - } - } - ; + : RDO_IDENTIF '.' RDO_Stopping '(' ')' ';' + { + #PASS2 + { + const std::string eventName = PARSER->stack().pop($1)->value().getIdentificator(); + LPRDOPATPattern pPattern = PARSER->findPATPattern(eventName); + if (!pPattern) + { + PARSER->error().error(@1, rdo::format("Попытка остановить неизвестное событие: %s", eventName.c_str())); + } + + LPRDOPatternEvent pEvent = pPattern.object_dynamic_cast(); + if (!pEvent) + { + PARSER->error().error(@1, rdo::format("Паттерн %s не является событием", eventName.c_str())); + } + + rdo::runtime::LPRDOCalcEventStop pCalc = pEvent->stoping(); + pCalc->setSrcInfo(RDOParserSrcInfo(@1, @6, rdo::format("Остановка события %s", eventName.c_str()))); + + $$ = PARSER->stack().push(pCalc); + } + } + | RDO_IDENTIF '.' RDO_Stopping '(' ')' error + { + #PASS1 + { + PARSER->error().error(@4, "Не найден символ окончания инструкции - точка с запятой"); + } + } + ; queue_param - : RDO_IDENTIF - { - #PASS2 - { - //! Имя ресурса - const std::string res_name = PARSER->stack().pop($1)->value().getIdentificator().c_str(); - const RDOParserSrcInfo& info = @1; - // Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); - //! Получили список всех типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); - rdo::compiler::mbuilder::RDOResType rtp; - const std::string rtp_name = "QDEPART"; - const std::string q_name = "Очередь_" + res_name; - //! Если ресурс существует, берем его тип и проверяем - if (rssList[res_name].exist()) - { - rtp = rssList[res_name].getType(); - rdo::compiler::mbuilder::BlockForQueue::checkType(rtp, info); - LPRDOPMDWatchPar pResult = rdo::Factory::create(RDOParserSrcInfo(q_name)); - ASSERT(pResult); - pResult->init(false, RDOParserSrcInfo(res_name), RDOParserSrcInfo(std::string("длина_очереди"))); - } - else - { - //! Если тип "QDEPART" существует - if (rtpList[rtp_name].exist()) - { - rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtp_name]; - if (rdo::compiler::mbuilder::BlockForQueue::checkType(rtp_, info)) - { - rdo::compiler::mbuilder::BlockForQueue::createRes(rtp_, res_name); - LPRDOPMDWatchPar pResult = rdo::Factory::create(RDOParserSrcInfo(q_name)); - ASSERT(pResult); - pResult->init(false, RDOParserSrcInfo(res_name), RDOParserSrcInfo(std::string("длина_очереди"))); - } - } - else - { - rdo::compiler::mbuilder::RDOResType rtp_ = rdo::compiler::mbuilder::BlockForQueue::createType(rtp_name, info); - if (rdo::compiler::mbuilder::BlockForQueue::checkType(rtp_, info)) - { - rdo::compiler::mbuilder::BlockForQueue::createRes(rtp_, res_name); - LPRDOPMDWatchPar pResult = rdo::Factory::create(RDOParserSrcInfo(q_name)); - ASSERT(pResult); - pResult->init(false, RDOParserSrcInfo(res_name), RDOParserSrcInfo(std::string("длина_очереди"))); - } - } - } - TRACE1("%s _good\n", res_name.c_str()); - LPRDOPROCQueue pQueue = rdo::Factory::create(PARSER->getLastPROCProcess(), "QUEUE"); - ASSERT(pQueue); - pQueue->setResource(res_name); - $$ = PARSER->stack().push(pQueue); - } - } - | RDO_IDENTIF error - { - #PASS2 - { - PARSER->error().error(@1, "Ошибка в миени очереди"); - } - } - ; + : RDO_IDENTIF + { + #PASS2 + { + // Имя ресурса + const std::string res_name = PARSER->stack().pop($1)->value().getIdentificator().c_str(); + const RDOParserSrcInfo& info = @1; + // Получили список всех ресурсов + rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); + // Получили список всех типов ресурсов + rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); + rdo::compiler::mbuilder::RDOResType rtp; + const std::string rtp_name = "QDEPART"; + const std::string q_name = "Очередь_" + res_name; + // Если ресурс существует, берем его тип и проверяем + if (rssList[res_name].exist()) + { + rtp = rssList[res_name].getType(); + rdo::compiler::mbuilder::BlockForQueue::checkType(rtp, info); + LPRDOPMDWatchPar pResult = rdo::Factory::create(RDOParserSrcInfo(q_name)); + ASSERT(pResult); + pResult->init(false, RDOParserSrcInfo(res_name), RDOParserSrcInfo(std::string("длина_очереди"))); + } + else + { + // Если тип "QDEPART" существует + if (rtpList[rtp_name].exist()) + { + rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtp_name]; + if (rdo::compiler::mbuilder::BlockForQueue::checkType(rtp_, info)) + { + rdo::compiler::mbuilder::BlockForQueue::createRes(rtp_, res_name); + LPRDOPMDWatchPar pResult = rdo::Factory::create(RDOParserSrcInfo(q_name)); + ASSERT(pResult); + pResult->init(false, RDOParserSrcInfo(res_name), RDOParserSrcInfo(std::string("длина_очереди"))); + } + } + else + { + rdo::compiler::mbuilder::RDOResType rtp_ = rdo::compiler::mbuilder::BlockForQueue::createType(rtp_name, info); + if (rdo::compiler::mbuilder::BlockForQueue::checkType(rtp_, info)) + { + rdo::compiler::mbuilder::BlockForQueue::createRes(rtp_, res_name); + LPRDOPMDWatchPar pResult = rdo::Factory::create(RDOParserSrcInfo(q_name)); + ASSERT(pResult); + pResult->init(false, RDOParserSrcInfo(res_name), RDOParserSrcInfo(std::string("длина_очереди"))); + } + } + } + TRACE1("%s _good\n", res_name.c_str()); + LPRDOPROCQueue pQueue = rdo::Factory::create(PARSER->getLastPROCProcess(), "QUEUE"); + ASSERT(pQueue); + pQueue->setResource(res_name); + $$ = PARSER->stack().push(pQueue); + } + } + | RDO_IDENTIF error + { + #PASS2 + { + PARSER->error().error(@1, "Ошибка в миени очереди"); + } + } + ; depart_param - : RDO_IDENTIF - { - #PASS2 - { - //! Имя ресурса - const std::string res_name = PARSER->stack().pop($1)->value().getIdentificator().c_str(); - const RDOParserSrcInfo& info = @1; - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); - //! Получили список всех типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); - rdo::compiler::mbuilder::RDOResType rtp; - const std::string rtp_name = "QDEPART"; - //! Если ресурс существует, берем его тип и проверяем - if (rssList[res_name].exist()) - { - rtp = rssList[res_name].getType(); - rdo::compiler::mbuilder::BlockForQueue::checkType(rtp, info); - } - else - { - if (rtpList[rtp_name].exist()) - { - rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtp_name]; - if (rdo::compiler::mbuilder::BlockForQueue::checkType(rtp_, info)) - { - rdo::compiler::mbuilder::BlockForQueue::createRes(rtp_, res_name); - } - } - else - { - rdo::compiler::mbuilder::RDOResType rtp_ = rdo::compiler::mbuilder::BlockForQueue::createType(rtp_name, info); - if (rdo::compiler::mbuilder::BlockForQueue::checkType(rtp_, info)) - { - rdo::compiler::mbuilder::BlockForQueue::createRes(rtp_, res_name); - } - } - } - TRACE1("%s _good\n", res_name.c_str()); - LPRDOPROCDepart pDepart = rdo::Factory::create(PARSER->getLastPROCProcess(), "DEPART"); - ASSERT(pDepart); - pDepart->setResource(res_name); - $$ = PARSER->stack().push(pDepart); - } - } - | RDO_IDENTIF error - { - #PASS1 - { - PARSER->error().error(@1, "Ошибка в имени ресурса"); - } - } - ; + : RDO_IDENTIF + { + #PASS2 + { + // Имя ресурса + const std::string res_name = PARSER->stack().pop($1)->value().getIdentificator().c_str(); + const RDOParserSrcInfo& info = @1; + // Получили список всех ресурсов + rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); + // Получили список всех типов ресурсов + rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); + rdo::compiler::mbuilder::RDOResType rtp; + const std::string rtp_name = "QDEPART"; + // Если ресурс существует, берем его тип и проверяем + if (rssList[res_name].exist()) + { + rtp = rssList[res_name].getType(); + rdo::compiler::mbuilder::BlockForQueue::checkType(rtp, info); + } + else + { + if (rtpList[rtp_name].exist()) + { + rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtp_name]; + if (rdo::compiler::mbuilder::BlockForQueue::checkType(rtp_, info)) + { + rdo::compiler::mbuilder::BlockForQueue::createRes(rtp_, res_name); + } + } + else + { + rdo::compiler::mbuilder::RDOResType rtp_ = rdo::compiler::mbuilder::BlockForQueue::createType(rtp_name, info); + if (rdo::compiler::mbuilder::BlockForQueue::checkType(rtp_, info)) + { + rdo::compiler::mbuilder::BlockForQueue::createRes(rtp_, res_name); + } + } + } + TRACE1("%s _good\n", res_name.c_str()); + LPRDOPROCDepart pDepart = rdo::Factory::create(PARSER->getLastPROCProcess(), "DEPART"); + ASSERT(pDepart); + pDepart->setResource(res_name); + $$ = PARSER->stack().push(pDepart); + } + } + | RDO_IDENTIF error + { + #PASS1 + { + PARSER->error().error(@1, "Ошибка в имени ресурса"); + } + } + ; term_param - : /* empty */ - { - #PASS2 - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(rdo::runtime::RDOValue(0)); - LPRDOPROCOperator pBlock = rdo::Factory::create(PARSER->getLastPROCProcess(), "TERMINATE", pCalc); - ASSERT(pBlock); - $$ = PARSER->stack().push(pBlock); - } - } - | fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($1); - ASSERT(pArithm); - if (pArithm->typeInfo()->typeID() == rdo::runtime::RDOType::t_int) - { - rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(NULL); - LPRDOPROCOperator pBlock = rdo::Factory::create(PARSER->getLastPROCProcess(), "TERMINATE", pCalc); - ASSERT(pBlock); - $$ = PARSER->stack().push(pBlock); - } - else - { - PARSER->error().error(@1, "Ошибка, для оператора TERMINATE можно использовать только арифметические выражения целого типа"); - } - } - } - | fun_arithm error - { - #PASS1 - { - PARSER->error().error(@1, "Ошибка, после оператора TERMINATE может быть указано только арифметическое выражение целого типа"); - } - } - ; + : /* empty */ + { + #PASS2 + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(rdo::runtime::RDOValue(0)); + LPRDOPROCOperator pBlock = rdo::Factory::create(PARSER->getLastPROCProcess(), "TERMINATE", pCalc); + ASSERT(pBlock); + $$ = PARSER->stack().push(pBlock); + } + } + | fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($1); + ASSERT(pArithm); + if (pArithm->typeInfo()->typeID() == rdo::runtime::RDOType::Type::INT) + { + rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(NULL); + LPRDOPROCOperator pBlock = rdo::Factory::create(PARSER->getLastPROCProcess(), "TERMINATE", pCalc); + ASSERT(pBlock); + $$ = PARSER->stack().push(pBlock); + } + else + { + PARSER->error().error(@1, "Ошибка, для оператора TERMINATE можно использовать только арифметические выражения целого типа"); + } + } + } + | fun_arithm error + { + #PASS1 + { + PARSER->error().error(@1, "Ошибка, после оператора TERMINATE может быть указано только арифметическое выражение целого типа"); + } + } + ; seize_param - : RDO_IDENTIF - { - #PASS2 - { - //! Имя ресурса - const std::string res_name = PARSER->stack().pop($1)->value().getIdentificator().c_str(); - const RDOParserSrcInfo& info = @1; - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); - rdo::compiler::mbuilder::RDOResType rtp; - //! Если ресурс существует, берем его тип и проверяем - if (rssList[res_name].exist()) - { - rtp = rssList[res_name].getType(); - if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp, info)) - { - //! \todo принятие решения об изменении типа должно происходить в rdoproc_rtp.y - if (!rssList[res_name].checkParserResourceType(PARSER)) - { - //здесь нужно переделать тип ресурса, а не ресурс - rdo::compiler::mbuilder::BlockForSeize::reobjectRes(rtp, res_name); - } - } - } - else - { - //! Ресурс не найден, сформировать имя типа по имени ресурса - //! Сформировать имя типа по имени ресурса - const std::string rtp_name(RDOPROCProcess::s_name_prefix + res_name + RDOPROCProcess::s_name_sufix); - //! Получили список всех типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); - //! Нашли тип ресурса - if (rtpList[rtp_name].exist()) - { - rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtp_name]; - if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp_, info)) - { - rdo::compiler::mbuilder::BlockForSeize::createRes(rtp_, res_name); - } - } - else - { - rtp = rdo::compiler::mbuilder::BlockForSeize::createType(rtp_name, info); - rdo::compiler::mbuilder::BlockForSeize::createRes(rtp, res_name); - } - } - LPRDOPROCSeize pSeize = rdo::Factory::create(PARSER->getLastPROCProcess(), "SEIZE"); - ASSERT(pSeize); - pSeize->addResource(res_name); - $$ = PARSER->stack().push(pSeize); - } - } - | seize_param ',' RDO_IDENTIF - { - #PASS2 - { - //! Имя ресурса - const std::string res_name = PARSER->stack().pop($3)->value().getIdentificator().c_str(); - const RDOParserSrcInfo& info = @3; - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); - rdo::compiler::mbuilder::RDOResType rtp; - //! Если ресурс существует, берем его тип и проверяем - if (rssList[res_name].exist()) - { - rtp = rssList[res_name].getType(); - if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp, info)) - { - //! \todo принятие решения об изменении типа должно происходить в rdoproc_rtp.y - if (!rssList[res_name].checkParserResourceType(PARSER)) - { - rdo::compiler::mbuilder::BlockForSeize::reobjectRes(rtp, res_name); - } - } - } - else - { - //! Ресурс не найден, сформировать имя типа по имени ресурса - //! Сформировать имя типа по имени ресурса - const std::string rtp_name(RDOPROCProcess::s_name_prefix + res_name + RDOPROCProcess::s_name_sufix); - //! Получили список всех типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); - //! Нашли тип ресурса - if (rtpList[rtp_name].exist()) - { - rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtp_name]; - if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp_, info)) - { - rdo::compiler::mbuilder::BlockForSeize::createRes(rtp_, res_name); - } - } - else - { - rtp = rdo::compiler::mbuilder::BlockForSeize::createType(rtp_name, info); - rdo::compiler::mbuilder::BlockForSeize::createRes(rtp, res_name); - } - } - LPRDOPROCSeize pSeize = PARSER->stack().pop($1); - ASSERT(pSeize); - pSeize->addResource(res_name); - $$ = PARSER->stack().push(pSeize); - } - } - | seize_param error - { - #PASS1 - { - PARSER->error().error(@1, "Ошибка в имени ресурса"); - } - } - ; + : RDO_IDENTIF + { + #PASS2 + { + // Имя ресурса + const std::string res_name = PARSER->stack().pop($1)->value().getIdentificator().c_str(); + const RDOParserSrcInfo& info = @1; + // Получили список всех ресурсов + rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); + rdo::compiler::mbuilder::RDOResType rtp; + // Если ресурс существует, берем его тип и проверяем + if (rssList[res_name].exist()) + { + rtp = rssList[res_name].getType(); + if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp, info)) + { + // TODO принятие решения об изменении типа должно происходить в rdoproc_rtp.y + if (!rssList[res_name].checkParserResourceType(PARSER)) + { + //здесь нужно переделать тип ресурса, а не ресурс + rdo::compiler::mbuilder::BlockForSeize::reobjectRes(rtp, res_name); + } + } + } + else + { + // Ресурс не найден, сформировать имя типа по имени ресурса + // Сформировать имя типа по имени ресурса + const std::string rtp_name(RDOPROCProcess::s_name_prefix + res_name + RDOPROCProcess::s_name_sufix); + // Получили список всех типов ресурсов + rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); + // Нашли тип ресурса + if (rtpList[rtp_name].exist()) + { + rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtp_name]; + if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp_, info)) + { + rdo::compiler::mbuilder::BlockForSeize::createRes(rtp_, res_name); + } + } + else + { + rtp = rdo::compiler::mbuilder::BlockForSeize::createType(rtp_name, info); + rdo::compiler::mbuilder::BlockForSeize::createRes(rtp, res_name); + } + } + LPRDOPROCSeize pSeize = rdo::Factory::create(PARSER->getLastPROCProcess(), "SEIZE"); + ASSERT(pSeize); + pSeize->addResource(res_name); + $$ = PARSER->stack().push(pSeize); + } + } + | seize_param ',' RDO_IDENTIF + { + #PASS2 + { + // Имя ресурса + const std::string res_name = PARSER->stack().pop($3)->value().getIdentificator().c_str(); + const RDOParserSrcInfo& info = @3; + // Получили список всех ресурсов + rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); + rdo::compiler::mbuilder::RDOResType rtp; + // Если ресурс существует, берем его тип и проверяем + if (rssList[res_name].exist()) + { + rtp = rssList[res_name].getType(); + if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp, info)) + { + // TODO принятие решения об изменении типа должно происходить в rdoproc_rtp.y + if (!rssList[res_name].checkParserResourceType(PARSER)) + { + rdo::compiler::mbuilder::BlockForSeize::reobjectRes(rtp, res_name); + } + } + } + else + { + // Ресурс не найден, сформировать имя типа по имени ресурса + // Сформировать имя типа по имени ресурса + const std::string rtp_name(RDOPROCProcess::s_name_prefix + res_name + RDOPROCProcess::s_name_sufix); + // Получили список всех типов ресурсов + rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); + // Нашли тип ресурса + if (rtpList[rtp_name].exist()) + { + rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtp_name]; + if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp_, info)) + { + rdo::compiler::mbuilder::BlockForSeize::createRes(rtp_, res_name); + } + } + else + { + rtp = rdo::compiler::mbuilder::BlockForSeize::createType(rtp_name, info); + rdo::compiler::mbuilder::BlockForSeize::createRes(rtp, res_name); + } + } + LPRDOPROCSeize pSeize = PARSER->stack().pop($1); + ASSERT(pSeize); + pSeize->addResource(res_name); + $$ = PARSER->stack().push(pSeize); + } + } + | seize_param error + { + #PASS1 + { + PARSER->error().error(@1, "Ошибка в имени ресурса"); + } + } + ; release_param - : RDO_IDENTIF - { - #PASS2 - { - //! Имя ресурса - const std::string res_name = PARSER->stack().pop($1)->value().getIdentificator().c_str(); - const RDOParserSrcInfo& info = @1; - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); - rdo::compiler::mbuilder::RDOResType rtp; - if (rssList[res_name].exist()) - { - rtp = rssList[res_name].getType(); - if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp, info)) - { - //! \todo принятие решения об изменении типа должно происходить в rdoproc_rtp.y - if (!rssList[res_name].checkParserResourceType(PARSER)) - { - rdo::compiler::mbuilder::BlockForSeize::reobjectRes(rtp, res_name); - } - } - } - else - { - //! Ресурс не найден, сформировать имя типа по имени ресурса - //! Сформировать имя типа по имени ресурса - const std::string rtp_name(RDOPROCProcess::s_name_prefix + res_name + RDOPROCProcess::s_name_sufix); - //! Получили список всех типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); - //! Нашли тип ресурса - if (rtpList[rtp_name].exist()) - { - rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtp_name]; - if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp_, info)) - { - rdo::compiler::mbuilder::BlockForSeize::createRes(rtp_, res_name); - } - } - else - { - rtp = rdo::compiler::mbuilder::BlockForSeize::createType(rtp_name, info); - rdo::compiler::mbuilder::BlockForSeize::createRes(rtp, res_name); - } - } - LPRDOPROCRelease pRelease = rdo::Factory::create(PARSER->getLastPROCProcess(), "RELEASE"); - ASSERT(pRelease); - pRelease->addResource(res_name); - $$ = PARSER->stack().push(pRelease); - } - } - | release_param ',' RDO_IDENTIF - { - #PASS2 - { - //! Имя ресурса - const std::string res_name = PARSER->stack().pop($3)->value().getIdentificator().c_str(); - const RDOParserSrcInfo& info = @3; - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); - rdo::compiler::mbuilder::RDOResType rtp; - //! Если ресурс существует берем его тип и проверяем - if (rssList[res_name].exist()) - { - rtp = rssList[res_name].getType(); - if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp, info)) - { - //! \todo принятие решения об изменении типа должно происходить в rdoproc_rtp.y - if (!rssList[res_name].checkParserResourceType(PARSER)) - { - rdo::compiler::mbuilder::BlockForSeize::reobjectRes(rtp, res_name); - } - } - } - else - { - //! Ресурс не найден, сформировать имя типа по имени ресурса - //! Сформировать имя типа по имени ресурса - const std::string rtp_name(RDOPROCProcess::s_name_prefix + res_name + RDOPROCProcess::s_name_sufix); - //! Получили список всех типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); - //! Нашли тип ресурса - if (rtpList[rtp_name].exist()) - { - rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtp_name]; - if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp_, info)) - { - rdo::compiler::mbuilder::BlockForSeize::createRes(rtp_, res_name); - } - } - else - { - rtp = rdo::compiler::mbuilder::BlockForSeize::createType(rtp_name, info); - rdo::compiler::mbuilder::BlockForSeize::createRes(rtp, res_name); - } - } - LPRDOPROCRelease pRelease = PARSER->stack().pop($1); - ASSERT(pRelease); - pRelease->addResource(res_name); - $$ = PARSER->stack().push(pRelease); - } - } - | release_param error - { - #PASS2 - { - PARSER->error().error(@1, "Ошибка в имени ресурса"); - } - } - ; + : RDO_IDENTIF + { + #PASS2 + { + // Имя ресурса + const std::string res_name = PARSER->stack().pop($1)->value().getIdentificator().c_str(); + const RDOParserSrcInfo& info = @1; + // Получили список всех ресурсов + rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); + rdo::compiler::mbuilder::RDOResType rtp; + if (rssList[res_name].exist()) + { + rtp = rssList[res_name].getType(); + if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp, info)) + { + // TODO принятие решения об изменении типа должно происходить в rdoproc_rtp.y + if (!rssList[res_name].checkParserResourceType(PARSER)) + { + rdo::compiler::mbuilder::BlockForSeize::reobjectRes(rtp, res_name); + } + } + } + else + { + // Ресурс не найден, сформировать имя типа по имени ресурса + // Сформировать имя типа по имени ресурса + const std::string rtp_name(RDOPROCProcess::s_name_prefix + res_name + RDOPROCProcess::s_name_sufix); + // Получили список всех типов ресурсов + rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); + // Нашли тип ресурса + if (rtpList[rtp_name].exist()) + { + rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtp_name]; + if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp_, info)) + { + rdo::compiler::mbuilder::BlockForSeize::createRes(rtp_, res_name); + } + } + else + { + rtp = rdo::compiler::mbuilder::BlockForSeize::createType(rtp_name, info); + rdo::compiler::mbuilder::BlockForSeize::createRes(rtp, res_name); + } + } + LPRDOPROCRelease pRelease = rdo::Factory::create(PARSER->getLastPROCProcess(), "RELEASE"); + ASSERT(pRelease); + pRelease->addResource(res_name); + $$ = PARSER->stack().push(pRelease); + } + } + | release_param ',' RDO_IDENTIF + { + #PASS2 + { + // Имя ресурса + const std::string res_name = PARSER->stack().pop($3)->value().getIdentificator().c_str(); + const RDOParserSrcInfo& info = @3; + // Получили список всех ресурсов + rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); + rdo::compiler::mbuilder::RDOResType rtp; + // Если ресурс существует берем его тип и проверяем + if (rssList[res_name].exist()) + { + rtp = rssList[res_name].getType(); + if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp, info)) + { + // TODO принятие решения об изменении типа должно происходить в rdoproc_rtp.y + if (!rssList[res_name].checkParserResourceType(PARSER)) + { + rdo::compiler::mbuilder::BlockForSeize::reobjectRes(rtp, res_name); + } + } + } + else + { + // Ресурс не найден, сформировать имя типа по имени ресурса + // Сформировать имя типа по имени ресурса + const std::string rtp_name(RDOPROCProcess::s_name_prefix + res_name + RDOPROCProcess::s_name_sufix); + // Получили список всех типов ресурсов + rdo::compiler::mbuilder::RDOResTypeList rtpList(PARSER); + // Нашли тип ресурса + if (rtpList[rtp_name].exist()) + { + rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtp_name]; + if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp_, info)) + { + rdo::compiler::mbuilder::BlockForSeize::createRes(rtp_, res_name); + } + } + else + { + rtp = rdo::compiler::mbuilder::BlockForSeize::createType(rtp_name, info); + rdo::compiler::mbuilder::BlockForSeize::createRes(rtp, res_name); + } + } + LPRDOPROCRelease pRelease = PARSER->stack().pop($1); + ASSERT(pRelease); + pRelease->addResource(res_name); + $$ = PARSER->stack().push(pRelease); + } + } + | release_param error + { + #PASS2 + { + PARSER->error().error(@1, "Ошибка в имени ресурса"); + } + } + ; assign_param - : RDO_IDENTIF '.' RDO_IDENTIF '=' fun_arithm - { - #PASS2 - { - const std::string res = PARSER->stack().pop($1)->value().getIdentificator(); - const std::string param = PARSER->stack().pop($3)->value().getIdentificator(); - rdo::compiler::mbuilder::RDOResType rtp; - - // Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); - - // Если ресурс существует, берем его тип и проверяем наличие параметра - if (rssList[res].exist()) - { - rtp = rssList[res].getType(); - if(!rtp.m_params[param].exist()) - { - PARSER->error().error(@1, rdo::format("Ссылка на неизвестный параметр ресурса: %s.%s", res.c_str(), param.c_str())); - } - - LPRDOFUNArithm pArithm = PARSER->stack().pop($5); - ASSERT(pArithm); - - LPRDORSSResource pResource = PARSER->findRSSResource(res); - ASSERT(pResource); - - LPRDORTPResType pResType = pResource->getType(); - LPRDORTPParam pParam = pResType->findRTPParam(param); - pArithm->checkParamType(pParam->getTypeInfo()); - - const std::size_t res = pResource->getID(); - const std::size_t par = rtp.m_params[param].id(); - - rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(pParam->getTypeInfo()); - ASSERT(pCalc); - - rdo::runtime::LPRDOCalcProcAssign pAssignCalc = rdo::Factory::create(pCalc, res, par); - ASSERT(pAssignCalc); - - LPRDOPROCOperator pBlock = rdo::Factory::create(PARSER->getLastPROCProcess(), "ASSIGN", pAssignCalc); - ASSERT(pBlock); - $$ = PARSER->stack().push(pBlock); - } - else - { - PARSER->error().error(@1, rdo::format("Ссылка на неизвестный ресурс: %s", res.c_str())); - } - } - } - ; + : RDO_IDENTIF '.' RDO_IDENTIF '=' fun_arithm + { + #PASS2 + { + const std::string res = PARSER->stack().pop($1)->value().getIdentificator(); + const std::string param = PARSER->stack().pop($3)->value().getIdentificator(); + rdo::compiler::mbuilder::RDOResType rtp; + + // Получили список всех ресурсов + rdo::compiler::mbuilder::RDOResourceList rssList(PARSER); + + // Если ресурс существует, берем его тип и проверяем наличие параметра + if (rssList[res].exist()) + { + rtp = rssList[res].getType(); + if(!rtp.m_params[param].exist()) + { + PARSER->error().error(@1, rdo::format("Ссылка на неизвестный параметр ресурса: %s.%s", res.c_str(), param.c_str())); + } + + LPRDOFUNArithm pArithm = PARSER->stack().pop($5); + ASSERT(pArithm); + + LPRDORSSResource pResource = PARSER->findRSSResource(res); + ASSERT(pResource); + + LPRDORTPResType pResType = pResource->getType(); + LPRDORTPParam pParam = pResType->findRTPParam(param); + pArithm->checkParamType(pParam->getTypeInfo()); + + const std::size_t res = pResource->getID(); + const std::size_t par = rtp.m_params[param].id(); + + rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(pParam->getTypeInfo()); + ASSERT(pCalc); + + rdo::runtime::LPRDOCalcProcAssign pAssignCalc = rdo::Factory::create(pCalc, res, par); + ASSERT(pAssignCalc); + + LPRDOPROCOperator pBlock = rdo::Factory::create(PARSER->getLastPROCProcess(), "ASSIGN", pAssignCalc); + ASSERT(pBlock); + $$ = PARSER->stack().push(pBlock); + } + else + { + PARSER->error().error(@1, rdo::format("Ссылка на неизвестный ресурс: %s", res.c_str())); + } + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Синтаксис прогона // -------------------------------------------------------------------------------- smr_main - : RDO_IDENTIF '.' RDO_Planning '(' arithm_list ')' - { - #PASS2 - { - const std::string eventName = PARSER->stack().pop($1)->value().getIdentificator(); - LPArithmContainer pArithmList = PARSER->stack().pop($5); - - LPRDOPATPattern pPattern = PARSER->findPATPattern(eventName); - if (!pPattern) - { - PARSER->error().error(@1, rdo::format("Попытка запланировать неизвестное событие: %s", eventName.c_str())); - } - - LPRDOPatternEvent pEvent = pPattern.object_dynamic_cast(); - if (!pEvent) - { - PARSER->error().error(@1, rdo::format("Паттерн %s не является событием", eventName.c_str())); - } - - ArithmContainer::Container::const_iterator arithmIt = pArithmList->getContainer().begin(); - if (arithmIt == pArithmList->getContainer().end()) - { - PARSER->error().error(@1, rdo::format("Не указано время планирования события: %s", eventName.c_str())); - } - - LPRDOFUNArithm pTimeArithm = *arithmIt; - ASSERT(pTimeArithm); - ++arithmIt; - - LPArithmContainer pParamList = rdo::Factory::create(); - ASSERT(pParamList); - - while (arithmIt != pArithmList->getContainer().end()) - { - pParamList->addItem(*arithmIt); - ++arithmIt; - } - - rdo::runtime::LPRDOCalc pCalcTime = pTimeArithm->createCalc(); - pCalcTime->setSrcInfo(pTimeArithm->src_info()); - ASSERT(pCalcTime); - - rdo::runtime::LPRDOCalcEventPlan pEventPlan = pEvent->planning(pCalcTime, pParamList); - pEventPlan->setSrcInfo(RDOParserSrcInfo(@1, @6, rdo::format("Планирование события %s в момент времени %s", eventName.c_str(), pCalcTime->srcInfo().src_text().c_str()))); - pEvent->setBeforeStartModelPlaning(pEventPlan); - } - } - | RDO_External_Model RDO_IDENTIF '=' RDO_IDENTIF - | RDO_Show_mode '=' smr_show_mode - { - #PASS2 - { - LPRDOSMR pSMR = PARSER->getSMR(); - ASSERT(pSMR); - pSMR->setShowMode((rdo::service::simulation::ShowMode)$3); - } - } - | RDO_Show_mode '=' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается режим анимации"); - } - } - | RDO_Show_mode error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '='"); - } - } - | RDO_Frame_number '=' RDO_INT_CONST - { - #PASS2 - { - LPRDOSMR pSMR = PARSER->getSMR(); - ASSERT(pSMR); - pSMR->setFrameNumber(PARSER->stack().pop($3)->value().getInt(), @3); - } - } - | RDO_Frame_number '=' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается начальный номер кадра"); - } - } - | RDO_Frame_number error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '='"); - } - } - | RDO_Show_rate '=' RDO_REAL_CONST - { - #PASS2 - { - LPRDOSMR pSMR = PARSER->getSMR(); - ASSERT(pSMR); - pSMR->setShowRate(PARSER->stack().pop($3)->value().getDouble(), @3); - } - } - | RDO_Show_rate '=' RDO_INT_CONST - { - #PASS2 - { - LPRDOSMR pSMR = PARSER->getSMR(); - ASSERT(pSMR); - pSMR->setShowRate(PARSER->stack().pop($3)->value().getInt(), @3); - } - } - | RDO_Show_rate '=' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается масштабный коэффициент"); - } - } - | RDO_Show_rate error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '='"); - } - } - | RDO_Run_StartTime '=' RDO_REAL_CONST - { - #PASS2 - { - LPRDOSMR pSMR = PARSER->getSMR(); - ASSERT(pSMR); - pSMR->setRunStartTime(PARSER->stack().pop($3)->value().getDouble(), @3); - } - } - | RDO_Run_StartTime '=' RDO_INT_CONST - { - #PASS2 - { - LPRDOSMR pSMR = PARSER->getSMR(); - ASSERT(pSMR); - pSMR->setRunStartTime(PARSER->stack().pop($3)->value().getInt(), @3); - } - } - | RDO_Run_StartTime '=' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается начальное модельное время"); - } - } - | RDO_Run_StartTime error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '='"); - } - } - | RDO_Trace_StartTime '=' RDO_REAL_CONST - { - #PASS2 - { - LPRDOSMR pSMR = PARSER->getSMR(); - ASSERT(pSMR); - pSMR->setTraceStartTime(PARSER->stack().pop($3)->value().getDouble(), @3); - } - } - | RDO_Trace_StartTime '=' RDO_INT_CONST - { - #PASS2 - { - LPRDOSMR pSMR = PARSER->getSMR(); - ASSERT(pSMR); - pSMR->setTraceStartTime(PARSER->stack().pop($3)->value().getInt(), @3); - } - } - | RDO_Trace_StartTime '=' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается начальное время трассировки"); - } - } - | RDO_Trace_StartTime error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '='"); - } - } - | RDO_Trace_EndTime '=' RDO_REAL_CONST - { - #PASS2 - { - LPRDOSMR pSMR = PARSER->getSMR(); - ASSERT(pSMR); - pSMR->setTraceEndTime(PARSER->stack().pop($3)->value().getDouble(), @3); - } - } - | RDO_Trace_EndTime '=' RDO_INT_CONST - { - #PASS2 - { - LPRDOSMR pSMR = PARSER->getSMR(); - ASSERT(pSMR); - pSMR->setTraceEndTime(PARSER->stack().pop($3)->value().getInt(), @3); - } - } - | RDO_Trace_EndTime '=' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается конечное время трассировки"); - } - } - | RDO_Trace_EndTime error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '='"); - } - } - | RDO_Terminate_if fun_logic - { - #PASS2 - { - LPRDOFUNLogic pLogic = PARSER->stack().pop($2); - ASSERT(pLogic); - PARSER->getSMR()->setTerminateIf(pLogic); - } - } - | RDO_Terminate_if error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ошибка логического выражения в терминальном условии"); - } - } - | RDO_Break_point RDO_IDENTIF fun_logic - { - #PASS2 - { - LPRDOSMR pSMR = PARSER->getSMR(); - ASSERT(pSMR); - LPRDOFUNLogic pLogic = PARSER->stack().pop($3); - ASSERT(pLogic); - pSMR->insertBreakPoint(PARSER->stack().pop($2)->src_info(), pLogic); - } - } - | RDO_Break_point RDO_IDENTIF error - { - #PASS2 - { - PARSER->error().error(@3, "Ошибка логического выражения в точке останова"); - } - } - | RDO_Break_point error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ожидается имя точки останова"); - } - } - | RDO_IDENTIF '=' fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($3); - ASSERT(pArithm); - PARSER->getSMR()->setConstValue(PARSER->stack().pop($1)->src_info(), pArithm); - } - } - | RDO_IDENTIF '.' RDO_IDENTIF '=' fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($5); - ASSERT(pArithm); - PARSER->getSMR()->setResParValue(PARSER->stack().pop($1)->src_info(), PARSER->stack().pop($3)->src_info(), pArithm); - } - } - | RDO_IDENTIF '.' RDO_Seed '=' RDO_INT_CONST - { - #PASS2 - { - LPRDOSMR pSMR = PARSER->getSMR(); - ASSERT(pSMR); - pSMR->setSeed(PARSER->stack().pop($1)->src_info(), PARSER->stack().pop($5)->value().getInt()); - } - } - | RDO_IDENTIF '.' RDO_Seed '=' error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ожидается база генератора"); - } - } - | RDO_IDENTIF '.' RDO_Seed error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается '='"); - } - } - ; + : RDO_IDENTIF '.' RDO_Planning '(' arithm_list ')' + { + #PASS2 + { + const std::string eventName = PARSER->stack().pop($1)->value().getIdentificator(); + LPArithmContainer pArithmList = PARSER->stack().pop($5); + + LPRDOPATPattern pPattern = PARSER->findPATPattern(eventName); + if (!pPattern) + { + PARSER->error().error(@1, rdo::format("Попытка запланировать неизвестное событие: %s", eventName.c_str())); + } + + LPRDOPatternEvent pEvent = pPattern.object_dynamic_cast(); + if (!pEvent) + { + PARSER->error().error(@1, rdo::format("Паттерн %s не является событием", eventName.c_str())); + } + + ArithmContainer::Container::const_iterator arithmIt = pArithmList->getContainer().begin(); + if (arithmIt == pArithmList->getContainer().end()) + { + PARSER->error().error(@1, rdo::format("Не указано время планирования события: %s", eventName.c_str())); + } + + LPRDOFUNArithm pTimeArithm = *arithmIt; + ASSERT(pTimeArithm); + ++arithmIt; + + LPArithmContainer pParamList = rdo::Factory::create(); + ASSERT(pParamList); + + while (arithmIt != pArithmList->getContainer().end()) + { + pParamList->addItem(*arithmIt); + ++arithmIt; + } + + rdo::runtime::LPRDOCalc pCalcTime = pTimeArithm->createCalc(); + pCalcTime->setSrcInfo(pTimeArithm->src_info()); + ASSERT(pCalcTime); + + rdo::runtime::LPRDOCalcEventPlan pEventPlan = pEvent->planning(pCalcTime, pParamList); + pEventPlan->setSrcInfo(RDOParserSrcInfo(@1, @6, rdo::format("Планирование события %s в момент времени %s", eventName.c_str(), pCalcTime->srcInfo().src_text().c_str()))); + pEvent->setBeforeStartModelPlaning(pEventPlan); + } + } + | RDO_External_Model RDO_IDENTIF '=' RDO_IDENTIF + | RDO_Show_mode '=' smr_show_mode + { + #PASS2 + { + LPRDOSMR pSMR = PARSER->getSMR(); + ASSERT(pSMR); + pSMR->setShowMode((rdo::service::simulation::ShowMode)$3); + } + } + | RDO_Show_mode '=' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается режим анимации"); + } + } + | RDO_Show_mode error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '='"); + } + } + | RDO_Frame_number '=' RDO_INT_CONST + { + #PASS2 + { + LPRDOSMR pSMR = PARSER->getSMR(); + ASSERT(pSMR); + pSMR->setFrameNumber(PARSER->stack().pop($3)->value().getInt(), @3); + } + } + | RDO_Frame_number '=' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается начальный номер кадра"); + } + } + | RDO_Frame_number error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '='"); + } + } + | RDO_Show_rate '=' RDO_REAL_CONST + { + #PASS2 + { + LPRDOSMR pSMR = PARSER->getSMR(); + ASSERT(pSMR); + pSMR->setShowRate(PARSER->stack().pop($3)->value().getDouble(), @3); + } + } + | RDO_Show_rate '=' RDO_INT_CONST + { + #PASS2 + { + LPRDOSMR pSMR = PARSER->getSMR(); + ASSERT(pSMR); + pSMR->setShowRate(PARSER->stack().pop($3)->value().getInt(), @3); + } + } + | RDO_Show_rate '=' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается масштабный коэффициент"); + } + } + | RDO_Show_rate error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '='"); + } + } + | RDO_Run_StartTime '=' RDO_REAL_CONST + { + #PASS2 + { + LPRDOSMR pSMR = PARSER->getSMR(); + ASSERT(pSMR); + pSMR->setRunStartTime(PARSER->stack().pop($3)->value().getDouble(), @3); + } + } + | RDO_Run_StartTime '=' RDO_INT_CONST + { + #PASS2 + { + LPRDOSMR pSMR = PARSER->getSMR(); + ASSERT(pSMR); + pSMR->setRunStartTime(PARSER->stack().pop($3)->value().getInt(), @3); + } + } + | RDO_Run_StartTime '=' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается начальное модельное время"); + } + } + | RDO_Run_StartTime error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '='"); + } + } + | RDO_Trace_StartTime '=' RDO_REAL_CONST + { + #PASS2 + { + LPRDOSMR pSMR = PARSER->getSMR(); + ASSERT(pSMR); + pSMR->setTraceStartTime(PARSER->stack().pop($3)->value().getDouble(), @3); + } + } + | RDO_Trace_StartTime '=' RDO_INT_CONST + { + #PASS2 + { + LPRDOSMR pSMR = PARSER->getSMR(); + ASSERT(pSMR); + pSMR->setTraceStartTime(PARSER->stack().pop($3)->value().getInt(), @3); + } + } + | RDO_Trace_StartTime '=' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается начальное время трассировки"); + } + } + | RDO_Trace_StartTime error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '='"); + } + } + | RDO_Trace_EndTime '=' RDO_REAL_CONST + { + #PASS2 + { + LPRDOSMR pSMR = PARSER->getSMR(); + ASSERT(pSMR); + pSMR->setTraceEndTime(PARSER->stack().pop($3)->value().getDouble(), @3); + } + } + | RDO_Trace_EndTime '=' RDO_INT_CONST + { + #PASS2 + { + LPRDOSMR pSMR = PARSER->getSMR(); + ASSERT(pSMR); + pSMR->setTraceEndTime(PARSER->stack().pop($3)->value().getInt(), @3); + } + } + | RDO_Trace_EndTime '=' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается конечное время трассировки"); + } + } + | RDO_Trace_EndTime error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '='"); + } + } + | RDO_Terminate_if fun_logic + { + #PASS2 + { + LPRDOFUNLogic pLogic = PARSER->stack().pop($2); + ASSERT(pLogic); + PARSER->getSMR()->setTerminateIf(pLogic); + } + } + | RDO_Terminate_if error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ошибка логического выражения в терминальном условии"); + } + } + | RDO_Break_point RDO_IDENTIF fun_logic + { + #PASS2 + { + LPRDOSMR pSMR = PARSER->getSMR(); + ASSERT(pSMR); + LPRDOFUNLogic pLogic = PARSER->stack().pop($3); + ASSERT(pLogic); + pSMR->insertBreakPoint(PARSER->stack().pop($2)->src_info(), pLogic); + } + } + | RDO_Break_point RDO_IDENTIF error + { + #PASS2 + { + PARSER->error().error(@3, "Ошибка логического выражения в точке останова"); + } + } + | RDO_Break_point error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ожидается имя точки останова"); + } + } + | RDO_IDENTIF '=' fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($3); + ASSERT(pArithm); + PARSER->getSMR()->setConstValue(PARSER->stack().pop($1)->src_info(), pArithm); + } + } + | RDO_IDENTIF '.' RDO_IDENTIF '=' fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($5); + ASSERT(pArithm); + PARSER->getSMR()->setResParValue(PARSER->stack().pop($1)->src_info(), PARSER->stack().pop($3)->src_info(), pArithm); + } + } + | RDO_IDENTIF '.' RDO_Seed '=' RDO_INT_CONST + { + #PASS2 + { + LPRDOSMR pSMR = PARSER->getSMR(); + ASSERT(pSMR); + pSMR->setSeed(PARSER->stack().pop($1)->src_info(), PARSER->stack().pop($5)->value().getInt()); + } + } + | RDO_IDENTIF '.' RDO_Seed '=' error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ожидается база генератора"); + } + } + | RDO_IDENTIF '.' RDO_Seed error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается '='"); + } + } + ; smr_show_mode - : RDO_NoShow - { - $$ = rdo::service::simulation::SM_NoShow; - } - | RDO_Monitor - { - $$ = rdo::service::simulation::SM_Monitor; - } - | RDO_Animation - { - $$ = rdo::service::simulation::SM_Animation; - } - ; + : RDO_NoShow + { + $$ = (int)rdo::service::simulation::ShowMode::NoShow; + } + | RDO_Monitor + { + $$ = (int)rdo::service::simulation::ShowMode::Monitor; + } + | RDO_Animation + { + $$ = (int)rdo::service::simulation::ShowMode::Animation; + } + ; // -------------------------------------------------------------------------------- // -------------------- Синтаксис для внешней модели // -------------------------------------------------------------------------------- smr_descr - : RDO_External_Model RDO_IDENTIF '=' RDO_IDENTIF - { - #PASS1 - { - const std::string alias = PARSER->stack().pop($2)->value().getIdentificator(); - const std::string model = PARSER->stack().pop($4)->value().getIdentificator(); - LPRDOSMR pSMR = PARSER->getSMR(); - ASSERT(pSMR); - pSMR->setExternalModelName(alias, model); - } - } - | RDO_External_Model RDO_IDENTIF '=' error - { - #PASS1 - { - PARSER->error().error( @3, @4, "Ожидается путь и название внешней модели" ); - } - } - | RDO_External_Model RDO_IDENTIF error - { - #PASS1 - { - PARSER->error().error( @2, "Ожидается '='" ); - } - } - | RDO_External_Model error - { - #PASS1 - { - PARSER->error().error( @1, "Ожидается псевдоним внешей модели" ); - } - } - ; + : RDO_External_Model RDO_IDENTIF '=' RDO_IDENTIF + { + #PASS1 + { + const std::string alias = PARSER->stack().pop($2)->value().getIdentificator(); + const std::string model = PARSER->stack().pop($4)->value().getIdentificator(); + LPRDOSMR pSMR = PARSER->getSMR(); + ASSERT(pSMR); + pSMR->setExternalModelName(alias, model); + } + } + | RDO_External_Model RDO_IDENTIF '=' error + { + #PASS1 + { + PARSER->error().error( @3, @4, "Ожидается путь и название внешней модели" ); + } + } + | RDO_External_Model RDO_IDENTIF error + { + #PASS1 + { + PARSER->error().error( @2, "Ожидается '='" ); + } + } + | RDO_External_Model error + { + #PASS1 + { + PARSER->error().error( @1, "Ожидается псевдоним внешей модели" ); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Список особых statement'ов // -------------------------------------------------------------------------------- return_statement - // statement'ы анимации - : RDO_Return - { - #PASS2 - { - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); - ASSERT(pType); - - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(rdo::runtime::RDOValue(0)); - ASSERT(pCalc); - - rdo::runtime::LPRDOCalc pCalcReturn = rdo::Factory::create(pCalc); - ASSERT(pCalcReturn); - - LPExpression pExpression = rdo::Factory::create(pType, pCalcReturn, RDOParserSrcInfo(@1)); - ASSERT(pExpression); - - LPContextReturnable pContextReturnable = PARSER->context()->cast(); - ASSERT(pContextReturnable); - pContextReturnable->setReturnFlag(); - - $$ = PARSER->stack().push(pExpression); - } - } - // statement'ы функций - | RDO_Return fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($2); - ASSERT(pArithm); - - LPTypeInfo pType = rdo::Factory::create(PARSER->getLastFUNFunction()->getReturn()->getTypeInfo()); - ASSERT(pType); - - rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(pType); - ASSERT(pCalc); - - rdo::runtime::LPRDOCalc pCalcReturn = rdo::Factory::create(pCalc); - ASSERT(pCalcReturn); - - LPExpression pExpression = rdo::Factory::create(pType, pCalcReturn, RDOParserSrcInfo(@1)); - ASSERT(pExpression); - - LPContextReturnable pContextReturnable = PARSER->context()->cast(); - ASSERT(pContextReturnable); - pContextReturnable->setReturnFlag(); - - $$ = PARSER->stack().push(pExpression); - } - } - ; + // statement'ы анимации + : RDO_Return + { + #PASS2 + { + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); + ASSERT(pType); + + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(rdo::runtime::RDOValue(0)); + ASSERT(pCalc); + + rdo::runtime::LPRDOCalc pCalcReturn = rdo::Factory::create(pCalc); + ASSERT(pCalcReturn); + + LPExpression pExpression = rdo::Factory::create(pType, pCalcReturn, RDOParserSrcInfo(@1)); + ASSERT(pExpression); + + LPContextReturnable pContextReturnable = PARSER->context()->cast(); + ASSERT(pContextReturnable); + pContextReturnable->setReturnFlag(); + + $$ = PARSER->stack().push(pExpression); + } + } + // statement'ы функций + | RDO_Return fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($2); + ASSERT(pArithm); + + LPTypeInfo pType = rdo::Factory::create(PARSER->getLastFUNFunction()->getReturn()->getTypeInfo()); + ASSERT(pType); + + rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(pType); + ASSERT(pCalc); + + rdo::runtime::LPRDOCalc pCalcReturn = rdo::Factory::create(pCalc); + ASSERT(pCalcReturn); + + LPExpression pExpression = rdo::Factory::create(pType, pCalcReturn, RDOParserSrcInfo(@1)); + ASSERT(pExpression); + + LPContextReturnable pContextReturnable = PARSER->context()->cast(); + ASSERT(pContextReturnable); + pContextReturnable->setReturnFlag(); + + $$ = PARSER->stack().push(pExpression); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Список общих statement'ов // -------------------------------------------------------------------------------- statement - : empty_statement ';' - | empty_statement error - { - #PASS2 - { - PARSER->error().error(@1, "Не найден символ окончания инструкции - точка с запятой"); - } - } - | set_statement ';' - | set_statement error - { - #PASS2 - { - PARSER->error().error(@1, "Не найден символ окончания инструкции - точка с запятой"); - } - } - | set_array_item_statement ';' - | set_array_item_statement error - { - #PASS2 - { - PARSER->error().error(@1, "Не найден символ окончания инструкции - точка с запятой"); - } - } - | local_variable_declaration ';' - | local_variable_declaration error - { - #PASS2 - { - PARSER->error().error(@1, "Не найден символ окончания инструкции - точка с запятой"); - } - } - | if_statement - | for_statement - | break_statement ';' - | break_statement error - { - #PASS2 - { - PARSER->error().error(@1, "Не найден символ окончания инструкции - точка с запятой"); - } - } - | return_statement ';' - | return_statement error - { - #PASS2 - { - PARSER->error().error(@1, "Не найден символ окончания инструкции - точка с запятой"); - } - } - | nochange_statement - | process_input_statement - | stopping_statement - | planning_statement - | watch_start - | watch_stop - | open_brace statement_list close_brace - { - #PASS2 - { - LPExpression pStatementList = PARSER->stack().pop($2); - ASSERT(pStatementList); - - rdo::runtime::LPRDOCalcStatementList pCalcStatementList = pStatementList->calc().object_dynamic_cast(); - ASSERT(pCalcStatementList); - - rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementList = rdo::Factory::create(); - ASSERT(pCalcBaseStatementList); - - rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); - ASSERT(pCalcOpenBrace); - - rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); - ASSERT(pCalcCloseBrace); - - pCalcBaseStatementList->addCalcStatement(pCalcOpenBrace); - pCalcBaseStatementList->addCalcStatement(pCalcStatementList); - pCalcBaseStatementList->addCalcStatement(pCalcCloseBrace); - - LPExpression pExpression = rdo::Factory::create(pStatementList->typeInfo(), pCalcBaseStatementList, RDOParserSrcInfo(@1, @3)); - ASSERT(pExpression); - - $$ = PARSER->stack().push(pExpression); - } - } - | frm_item_statement ';' - | frm_item_statement - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается ';'"); - } - } - | error - { - #PASS2 - { - PARSER->error().error(@1, "Неизвестная инструкция"); - } - } - ; + : empty_statement ';' + | empty_statement error + { + #PASS2 + { + PARSER->error().error(@1, "Не найден символ окончания инструкции - точка с запятой"); + } + } + | set_statement ';' + | set_statement error + { + #PASS2 + { + PARSER->error().error(@1, "Не найден символ окончания инструкции - точка с запятой"); + } + } + | set_array_item_statement ';' + | set_array_item_statement error + { + #PASS2 + { + PARSER->error().error(@1, "Не найден символ окончания инструкции - точка с запятой"); + } + } + | local_variable_declaration ';' + | local_variable_declaration error + { + #PASS2 + { + PARSER->error().error(@1, "Не найден символ окончания инструкции - точка с запятой"); + } + } + | if_statement + | for_statement + | break_statement ';' + | break_statement error + { + #PASS2 + { + PARSER->error().error(@1, "Не найден символ окончания инструкции - точка с запятой"); + } + } + | return_statement ';' + | return_statement error + { + #PASS2 + { + PARSER->error().error(@1, "Не найден символ окончания инструкции - точка с запятой"); + } + } + | nochange_statement + | process_input_statement + | stopping_statement + | planning_statement + | watch_start + | watch_stop + | open_brace statement_list close_brace + { + #PASS2 + { + LPExpression pStatementList = PARSER->stack().pop($2); + ASSERT(pStatementList); + + rdo::runtime::LPRDOCalcStatementList pCalcStatementList = pStatementList->calc().object_dynamic_cast(); + ASSERT(pCalcStatementList); + + rdo::runtime::LPRDOCalcBaseStatementList pCalcBaseStatementList = rdo::Factory::create(); + ASSERT(pCalcBaseStatementList); + + rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); + ASSERT(pCalcOpenBrace); + + rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); + ASSERT(pCalcCloseBrace); + + pCalcBaseStatementList->addCalcStatement(pCalcOpenBrace); + pCalcBaseStatementList->addCalcStatement(pCalcStatementList); + pCalcBaseStatementList->addCalcStatement(pCalcCloseBrace); + + LPExpression pExpression = rdo::Factory::create(pStatementList->typeInfo(), pCalcBaseStatementList, RDOParserSrcInfo(@1, @3)); + ASSERT(pExpression); + + $$ = PARSER->stack().push(pExpression); + } + } + | frm_item_statement ';' + | frm_item_statement + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается ';'"); + } + } + | error + { + #PASS2 + { + PARSER->error().error(@1, "Неизвестная инструкция"); + } + } + ; returnable_statement - : returnable_context_push statement returnable_context_pop - { - #PASS2 - { - $$ = $2; - } - } - ; + : returnable_context_push statement returnable_context_pop + { + #PASS2 + { + $$ = $2; + } + } + ; returnable_context_push - : /* empty */ - { - #PASS2 - { - LPContextReturnable pContextReturnable = PARSER->context()->cast(); - ASSERT(pContextReturnable); - pContextReturnable->addChildContext(); - } - } - ; + : /* empty */ + { + #PASS2 + { + LPContextReturnable pContextReturnable = PARSER->context()->cast(); + ASSERT(pContextReturnable); + pContextReturnable->addChildContext(); + } + } + ; returnable_context_pop - : /* empty */ - { - #PASS2 - { - PARSER->contextStack()->pop(); - } - } - ; + : /* empty */ + { + #PASS2 + { + PARSER->contextStack()->pop(); + } + } + ; open_brace - : '{' - { - #PASS2 - { - ContextMemory::push(); - } - } - ; + : '{' + { + #PASS2 + { + ContextMemory::push(); + } + } + ; close_brace - : '}' - { - #PASS2 - { - ContextMemory::pop(); - } - } - ; + : '}' + { + #PASS2 + { + ContextMemory::pop(); + } + } + ; statement_list - : /* empty */ - { - #PASS2 - { - rdo::runtime::LPRDOCalcStatementList pCalcStatementList = rdo::Factory::create(); - ASSERT(pCalcStatementList); + : /* empty */ + { + #PASS2 + { + rdo::runtime::LPRDOCalcStatementList pCalcStatementList = rdo::Factory::create(); + ASSERT(pCalcStatementList); - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo()); - ASSERT(pType); + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo()); + ASSERT(pType); - LPExpression pExpression = rdo::Factory::create(pType, pCalcStatementList, RDOParserSrcInfo()); - ASSERT(pExpression); + LPExpression pExpression = rdo::Factory::create(pType, pCalcStatementList, RDOParserSrcInfo()); + ASSERT(pExpression); - $$ = PARSER->stack().push(pExpression); - } - } - | statement_list statement - { - #PASS2 - { - LPExpression pExpressionStatementList = PARSER->stack().pop($1); - ASSERT(pExpressionStatementList); + $$ = PARSER->stack().push(pExpression); + } + } + | statement_list statement + { + #PASS2 + { + LPExpression pExpressionStatementList = PARSER->stack().pop($1); + ASSERT(pExpressionStatementList); - LPExpression pExpressionStatement = PARSER->stack().pop($2); - ASSERT(pExpressionStatement); + LPExpression pExpressionStatement = PARSER->stack().pop($2); + ASSERT(pExpressionStatement); - rdo::runtime::LPRDOCalcStatementList pCalcStatementList = pExpressionStatementList->calc().object_dynamic_cast(); - ASSERT(pCalcStatementList); + rdo::runtime::LPRDOCalcStatementList pCalcStatementList = pExpressionStatementList->calc().object_dynamic_cast(); + ASSERT(pCalcStatementList); - pCalcStatementList->addCalcStatement(pExpressionStatement->calc()); + pCalcStatementList->addCalcStatement(pExpressionStatement->calc()); - pExpressionStatementList->setSrcInfo(RDOParserSrcInfo(@1, @2)); + pExpressionStatementList->setSrcInfo(RDOParserSrcInfo(@1, @2)); - $$ = PARSER->stack().push(pExpressionStatementList); - } - } - ; + $$ = PARSER->stack().push(pExpressionStatementList); + } + } + ; empty_statement - : ';' - { - #PASS2 - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(); - ASSERT(pCalc); - - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); - ASSERT(pType); - - LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); - ASSERT(pExpression); - - $$ = PARSER->stack().push(pExpression); - } - } - | error ';' - { - #PASS2 - { - PARSER->error().error(@1, "Ошибка в инструкции"); - } - } - ; + : ';' + { + #PASS2 + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(); + ASSERT(pCalc); + + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); + ASSERT(pType); + + LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); + ASSERT(pExpression); + + $$ = PARSER->stack().push(pExpression); + } + } + | error ';' + { + #PASS2 + { + PARSER->error().error(@1, "Ошибка в инструкции"); + } + } + ; set_statement - : param_full_name set_increment_or_decrement_type - { - #PASS2 - { - Context::LPFindResult pParamResult = PARSER->stack().pop($1); - ASSERT(pParamResult->getSwitchContext()); - LPContext pParamContext = pParamResult->getSwitchContext().context; - ASSERT(pParamContext); - - Context::Params params = pParamResult->getSwitchContext().params; - - std::string name; - RDOParserSrcInfo srcInfo = RDOParserSrcInfo(@1); - if (params.exists(Context::Params::IDENTIFIER)) - { - name = params.identifier(); - srcInfo.setSrcText(name); - } - - rdo::runtime::SetOperationType::Type setOperationType = static_cast($2); - - params[Expression::CONTEXT_PARAM_SET_EXPRESSION] = rdo::Factory::create( - rdo::Factory::delegate(RDOParserSrcInfo(@2)), - rdo::Factory::create(1), - RDOParserSrcInfo(@2) - ); - params[Expression::CONTEXT_PARAM_SET_OPERATION_TYPE] = setOperationType; - Context::LPFindResult result = pParamContext->find(Context::METHOD_SET, params, srcInfo); - LPExpression pExpression = result->getCreateExpression()(); - pExpression->calc()->setSrcInfo(RDOParserSrcInfo(@1, @2, rdo::format("%s%s", name.c_str(), rdo::runtime::SetOperationType::toString(setOperationType).c_str()))); - - $$ = PARSER->stack().push(pExpression); - } - } - | param_full_name set_operation_type fun_arithm - { - #PASS2 - { - Context::LPFindResult pParamResult = PARSER->stack().pop($1); - ASSERT(pParamResult->getSwitchContext()); - LPContext pParamContext = pParamResult->getSwitchContext().context; - ASSERT(pParamContext); - - Context::Params params = pParamResult->getSwitchContext().params; - - std::string name; - RDOParserSrcInfo srcInfo = RDOParserSrcInfo(@1); - if (params.exists(Context::Params::IDENTIFIER)) - { - name = params.identifier(); - srcInfo.setSrcText(name); - } - - rdo::runtime::SetOperationType::Type setOperationType = static_cast($2); - LPRDOFUNArithm pRightArithm = PARSER->stack().pop($3); - - params[RDOFUNArithm::CONTEXT_PARAM_SET_ARITHM] = pRightArithm; - params[Expression::CONTEXT_PARAM_SET_OPERATION_TYPE] = setOperationType; - Context::LPFindResult result = pParamContext->find(Context::METHOD_SET, params, srcInfo); - LPExpression pExpression = result->getCreateExpression()(); - pExpression->calc()->setSrcInfo(RDOParserSrcInfo(@1, @3, rdo::format("%s %s %s", name.c_str(), rdo::runtime::SetOperationType::toString(setOperationType).c_str(), pRightArithm->src_text().c_str()))); - LPRDOFUNArithm pLeftArithm = rdo::Factory::create(pExpression); - ASSERT(pLeftArithm); - pLeftArithm->setEqual(pRightArithm); - - $$ = PARSER->stack().push(pExpression); - } - } - | param_full_name set_operation_type error - { - #PASS2 - { - PARSER->error().error(@3, "Ошибка в арифметическом выражении"); - } - } - ; + : param_full_name set_increment_or_decrement_type + { + #PASS2 + { + Context::LPFindResult pParamResult = PARSER->stack().pop($1); + ASSERT(pParamResult->getSwitchContext()); + LPContext pParamContext = pParamResult->getSwitchContext().context; + ASSERT(pParamContext); + + Context::Params params = pParamResult->getSwitchContext().params; + + std::string name; + RDOParserSrcInfo srcInfo = RDOParserSrcInfo(@1); + if (params.exists(Context::Params::IDENTIFIER)) + { + name = params.identifier(); + srcInfo.setSrcText(name); + } + + rdo::runtime::SetOperation::Type setOperationType = static_cast($2); + + params[Expression::CONTEXT_PARAM_SET_EXPRESSION] = rdo::Factory::create( + rdo::Factory::delegate(RDOParserSrcInfo(@2)), + rdo::Factory::create(1), + RDOParserSrcInfo(@2) + ); + params[Expression::CONTEXT_PARAM_SET_OPERATION_TYPE] = setOperationType; + Context::LPFindResult result = pParamContext->find(Context::METHOD_SET, params, srcInfo); + LPExpression pExpression = result->getCreateExpression()(); + pExpression->calc()->setSrcInfo(RDOParserSrcInfo(@1, @2, rdo::format("%s%s", name.c_str(), rdo::runtime::SetOperation::toString(setOperationType).c_str()))); + + $$ = PARSER->stack().push(pExpression); + } + } + | param_full_name set_operation_type fun_arithm + { + #PASS2 + { + Context::LPFindResult pParamResult = PARSER->stack().pop($1); + ASSERT(pParamResult->getSwitchContext()); + LPContext pParamContext = pParamResult->getSwitchContext().context; + ASSERT(pParamContext); + + Context::Params params = pParamResult->getSwitchContext().params; + + std::string name; + RDOParserSrcInfo srcInfo = RDOParserSrcInfo(@1); + if (params.exists(Context::Params::IDENTIFIER)) + { + name = params.identifier(); + srcInfo.setSrcText(name); + } + + rdo::runtime::SetOperation::Type setOperationType = static_cast($2); + LPRDOFUNArithm pRightArithm = PARSER->stack().pop($3); + + params[RDOFUNArithm::CONTEXT_PARAM_SET_ARITHM] = pRightArithm; + params[Expression::CONTEXT_PARAM_SET_OPERATION_TYPE] = setOperationType; + Context::LPFindResult result = pParamContext->find(Context::METHOD_SET, params, srcInfo); + LPExpression pExpression = result->getCreateExpression()(); + pExpression->calc()->setSrcInfo(RDOParserSrcInfo(@1, @3, rdo::format("%s %s %s", name.c_str(), rdo::runtime::SetOperation::toString(setOperationType).c_str(), pRightArithm->src_text().c_str()))); + LPRDOFUNArithm pLeftArithm = rdo::Factory::create(pExpression); + ASSERT(pLeftArithm); + pLeftArithm->setEqual(pRightArithm); + + $$ = PARSER->stack().push(pExpression); + } + } + | param_full_name set_operation_type error + { + #PASS2 + { + PARSER->error().error(@3, "Ошибка в арифметическом выражении"); + } + } + ; set_increment_or_decrement_type - : RDO_IncrEqual - { - $$ = rdo::runtime::SetOperationType::INCREMENT; - } - | RDO_DecrEqual - { - $$ = rdo::runtime::SetOperationType::DECRIMENT; - } - ; + : RDO_IncrEqual + { + $$ = static_cast(rdo::runtime::SetOperation::Type::INCREMENT); + } + | RDO_DecrEqual + { + $$ = static_cast(rdo::runtime::SetOperation::Type::DECRIMENT); + } + ; set_operation_type - : RDO_set - { - $$ = rdo::runtime::SetOperationType::SET; - } - | '=' - { - $$ = rdo::runtime::SetOperationType::SET; - } - | RDO_PlusEqual - { - $$ = rdo::runtime::SetOperationType::ADDITION; - } - | RDO_MinusEqual - { - $$ = rdo::runtime::SetOperationType::SUBTRACTION; - } - | RDO_MultiplyEqual - { - $$ = rdo::runtime::SetOperationType::MULTIPLY; - } - | RDO_DivideEqual - { - $$ = rdo::runtime::SetOperationType::DIVIDE; - } - ; + : RDO_set + { + $$ = static_cast(rdo::runtime::SetOperation::Type::SET); + } + | '=' + { + $$ = static_cast(rdo::runtime::SetOperation::Type::SET); + } + | RDO_PlusEqual + { + $$ = static_cast(rdo::runtime::SetOperation::Type::ADDITION); + } + | RDO_MinusEqual + { + $$ = static_cast(rdo::runtime::SetOperation::Type::SUBTRACTION); + } + | RDO_MultiplyEqual + { + $$ = static_cast(rdo::runtime::SetOperation::Type::MULTIPLY); + } + | RDO_DivideEqual + { + $$ = static_cast(rdo::runtime::SetOperation::Type::DIVIDE); + } + ; set_array_item_statement - : RDO_IDENTIF '[' fun_arithm ']' '=' fun_arithm - { - #PASS2 - { - LPRDOValue pParamName = PARSER->stack().pop($1); - ASSERT(pParamName); - LPRDOFUNArithm pArrayArithm = RDOFUNArithm::generateByIdentificator(pParamName); - LPRDOFUNArithm pArithmInd = PARSER->stack().pop($3); - LPRDOFUNArithm pRightArithm = PARSER->stack().pop($6); - ASSERT(pArrayArithm); - ASSERT(pArithmInd ); - ASSERT(pRightArithm); - - if (!pArrayArithm->typeInfo()->itype().object_dynamic_cast()) - { - PARSER->error().error(@1, rdo::format("'%s' не является массивом", pParamName->value().getIdentificator().c_str())); - } - - LPIType pType = pArrayArithm->typeInfo()->itype(); - ASSERT(pType); - LPRDOArrayType pArrayType = pType.object_dynamic_cast(); - ASSERT(pArrayType); - - LPTypeInfo pItemType = pArrayType->getItemType()->type_cast(pRightArithm->typeInfo(), RDOParserSrcInfo(@1)); - ASSERT(pItemType); - - rdo::runtime::LPRDOCalc pArrayItemCalc = rdo::Factory::create(pArrayArithm->calc(), pArithmInd->calc(), pRightArithm->calc()); - ASSERT(pArrayItemCalc); - - LPExpression setExpression = rdo::Factory::create( - rdo::Factory::delegate(RDOParserSrcInfo(@1, @6)), - pArrayItemCalc, - RDOParserSrcInfo(@1, @6) - ); - - Context::Params params; - params[Context::Params::IDENTIFIER] = pParamName->value().getIdentificator(); - params[Expression::CONTEXT_PARAM_SET_EXPRESSION] = setExpression; - params[Expression::CONTEXT_PARAM_SET_OPERATION_TYPE] = rdo::runtime::SetOperationType::SET; - Context::LPFindResult result = PARSER->context()->find(Context::METHOD_SET, params, pParamName->src_info()); - $$ = PARSER->stack().push(result->getCreateExpression()()); - } - } - ; + : RDO_IDENTIF '[' fun_arithm ']' '=' fun_arithm + { + #PASS2 + { + LPRDOValue pParamName = PARSER->stack().pop($1); + ASSERT(pParamName); + LPRDOFUNArithm pArrayArithm = RDOFUNArithm::generateByIdentificator(pParamName); + LPRDOFUNArithm pArithmInd = PARSER->stack().pop($3); + LPRDOFUNArithm pRightArithm = PARSER->stack().pop($6); + ASSERT(pArrayArithm); + ASSERT(pArithmInd ); + ASSERT(pRightArithm); + + if (!pArrayArithm->typeInfo()->itype().object_dynamic_cast()) + { + PARSER->error().error(@1, rdo::format("'%s' не является массивом", pParamName->value().getIdentificator().c_str())); + } + + LPIType pType = pArrayArithm->typeInfo()->itype(); + ASSERT(pType); + LPRDOArrayType pArrayType = pType.object_dynamic_cast(); + ASSERT(pArrayType); + + LPTypeInfo pItemType = pArrayType->getItemType()->type_cast(pRightArithm->typeInfo(), RDOParserSrcInfo(@1)); + ASSERT(pItemType); + + rdo::runtime::LPRDOCalc pArrayItemCalc = rdo::Factory::create(pArrayArithm->calc(), pArithmInd->calc(), pRightArithm->calc()); + ASSERT(pArrayItemCalc); + + LPExpression setExpression = rdo::Factory::create( + rdo::Factory::delegate(RDOParserSrcInfo(@1, @6)), + pArrayItemCalc, + RDOParserSrcInfo(@1, @6) + ); + + Context::Params params; + params[Context::Params::IDENTIFIER] = pParamName->value().getIdentificator(); + params[Expression::CONTEXT_PARAM_SET_EXPRESSION] = setExpression; + params[Expression::CONTEXT_PARAM_SET_OPERATION_TYPE] = rdo::runtime::SetOperation::Type::SET; + Context::LPFindResult result = PARSER->context()->find(Context::METHOD_SET, params, pParamName->src_info()); + $$ = PARSER->stack().push(result->getCreateExpression()()); + } + } + ; local_variable_declaration - : local_variable_declaration_context init_declaration_list - { - #PASS2 - { - LPTypeContext pTypeContext = PARSER->context()->cast(); - ASSERT(pTypeContext); + : local_variable_declaration_context init_declaration_list + { + #PASS2 + { + LPTypeContext pTypeContext = PARSER->context()->cast(); + ASSERT(pTypeContext); - LPTypeInfo pType = pTypeContext->getTypeInfo(); - ASSERT(pType); + LPTypeInfo pType = pTypeContext->getTypeInfo(); + ASSERT(pType); - LPContextLocalVariable pContextLocalVariable = PARSER->context().object_dynamic_cast(); - ASSERT(pContextLocalVariable); + LPContextLocalVariable pContextLocalVariable = PARSER->context().object_dynamic_cast(); + ASSERT(pContextLocalVariable); - LPExpression pExpression = rdo::Factory::create( - pType, pContextLocalVariable->calc(), RDOParserSrcInfo(@1, @2) - ); - ASSERT(pExpression); + LPExpression pExpression = rdo::Factory::create( + pType, pContextLocalVariable->calc(), RDOParserSrcInfo(@1, @2) + ); + ASSERT(pExpression); - PARSER->contextStack()->pop(); - PARSER->contextStack()->pop(); + PARSER->contextStack()->pop(); + PARSER->contextStack()->pop(); - $$ = PARSER->stack().push(pExpression); - } - } - ; + $$ = PARSER->stack().push(pExpression); + } + } + ; local_variable_declaration_context - : type_declaration_context - { - #PASS2 - { - LPContextMemory pContextMemory = PARSER->context()->cast(); - ASSERT(pContextMemory); - - LPLocalVariableListStack pLocalVariableListStack = pContextMemory->getLocalMemory(); - ASSERT(pLocalVariableListStack); - LPLocalVariableList pLocalVariableList = pLocalVariableListStack->top(); - ASSERT(pLocalVariableList); - - LPContextLocalVariable pContextLocalVariable = rdo::Factory::create( - boost::bind(&LocalVariableList::append, pLocalVariableList.get(), _1) - ); - ASSERT(pContextLocalVariable); - PARSER->contextStack()->push(pContextLocalVariable); - } - } - ; + : type_declaration_context + { + #PASS2 + { + LPContextMemory pContextMemory = PARSER->context()->cast(); + ASSERT(pContextMemory); + + LPLocalVariableListStack pLocalVariableListStack = pContextMemory->getLocalMemory(); + ASSERT(pLocalVariableListStack); + LPLocalVariableList pLocalVariableList = pLocalVariableListStack->top(); + ASSERT(pLocalVariableList); + + LPContextLocalVariable pContextLocalVariable = rdo::Factory::create( + boost::bind(&LocalVariableList::append, pLocalVariableList.get(), _1) + ); + ASSERT(pContextLocalVariable); + PARSER->contextStack()->push(pContextLocalVariable); + } + } + ; init_declaration_list - : init_declaration_list_item - | init_declaration_list ',' init_declaration_list_item - ; + : init_declaration_list_item + | init_declaration_list ',' init_declaration_list_item + ; init_declaration_list_item - : RDO_IDENTIF init_declaration_value - { - #PASS2 - { - LPRDOValue pVariableName = PARSER->stack().pop($1); - ASSERT(pVariableName); + : RDO_IDENTIF init_declaration_value + { + #PASS2 + { + LPRDOValue pVariableName = PARSER->stack().pop($1); + ASSERT(pVariableName); - LPExpression pExpression = PARSER->stack().pop($2); - ASSERT(pExpression); + LPExpression pExpression = PARSER->stack().pop($2); + ASSERT(pExpression); - LPTypeContext pTypeContext = PARSER->context()->cast(); - ASSERT(pTypeContext); + LPTypeContext pTypeContext = PARSER->context()->cast(); + ASSERT(pTypeContext); - pTypeContext->getTypeInfo()->type_cast(pExpression->typeInfo(), RDOParserSrcInfo(@2)); + pTypeContext->getTypeInfo()->type_cast(pExpression->typeInfo(), RDOParserSrcInfo(@2)); - pExpression->setSrcInfo(RDOParserSrcInfo(@1, @2, pVariableName->src_text())); + pExpression->setSrcInfo(RDOParserSrcInfo(@1, @2, pVariableName->src_text())); - LPLocalVariable pLocalVariable = rdo::Factory::create(pVariableName, pExpression); - ASSERT(pLocalVariable); + LPLocalVariable pLocalVariable = rdo::Factory::create(pVariableName, pExpression); + ASSERT(pLocalVariable); - LPContextLocalVariable pContextLocalVariable = PARSER->context().object_dynamic_cast(); - ASSERT(pContextLocalVariable); - pContextLocalVariable->pushLocalVariable(pLocalVariable); - } - } - ; + LPContextLocalVariable pContextLocalVariable = PARSER->context().object_dynamic_cast(); + ASSERT(pContextLocalVariable); + pContextLocalVariable->pushLocalVariable(pLocalVariable); + } + } + ; init_declaration_value - : /* empty */ - { - #PASS2 - { - LPTypeContext pTypeContext = PARSER->context()->cast(); - ASSERT(pTypeContext); - - LPTypeInfo pTypeInfo = pTypeContext->getTypeInfo(); - ASSERT(pTypeInfo); - - LPExpression pExpression = rdo::Factory::create( - pTypeInfo, - rdo::Factory::create(pTypeInfo->itype()->get_default()), - RDOParserSrcInfo() - ); - ASSERT(pExpression); - $$ = PARSER->stack().push(pExpression); - } - } - | '=' fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($2); - ASSERT(pArithm); - $$ = PARSER->stack().push(pArithm->expression()); - } - } - ; + : /* empty */ + { + #PASS2 + { + LPTypeContext pTypeContext = PARSER->context()->cast(); + ASSERT(pTypeContext); + + LPTypeInfo pTypeInfo = pTypeContext->getTypeInfo(); + ASSERT(pTypeInfo); + + LPExpression pExpression = rdo::Factory::create( + pTypeInfo, + rdo::Factory::create(pTypeInfo->itype()->get_default()), + RDOParserSrcInfo() + ); + ASSERT(pExpression); + $$ = PARSER->stack().push(pExpression); + } + } + | '=' fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($2); + ASSERT(pArithm); + $$ = PARSER->stack().push(pArithm->expression()); + } + } + ; if_statement - : if_condition if_then_statement if_else_statement - { - #PASS2 - { - LPExpression pIfExpression = PARSER->stack().pop($1); - ASSERT(pIfExpression); + : if_condition if_then_statement if_else_statement + { + #PASS2 + { + LPExpression pIfExpression = PARSER->stack().pop($1); + ASSERT(pIfExpression); - rdo::runtime::LPRDOCalcIf pIfCalc = pIfExpression->calc().object_dynamic_cast(); - ASSERT(pIfCalc); + rdo::runtime::LPRDOCalcIf pIfCalc = pIfExpression->calc().object_dynamic_cast(); + ASSERT(pIfCalc); - pIfCalc->setThenStatement(PARSER->stack().pop($2)->calc()); + pIfCalc->setThenStatement(PARSER->stack().pop($2)->calc()); - LPExpression pIfElseExpression = PARSER->stack().pop($3); - ASSERT(pIfElseExpression); + LPExpression pIfElseExpression = PARSER->stack().pop($3); + ASSERT(pIfElseExpression); - if (!pIfElseExpression.object_dynamic_cast()) - { - pIfCalc->setElseStatement(pIfElseExpression->calc()); - } + if (!pIfElseExpression.object_dynamic_cast()) + { + pIfCalc->setElseStatement(pIfElseExpression->calc()); + } - PARSER->contextStack()->pop(); + PARSER->contextStack()->pop(); - $$ = PARSER->stack().push(pIfExpression); - } - } - ; + $$ = PARSER->stack().push(pIfExpression); + } + } + ; if_condition - : RDO_if '(' fun_logic ')' - { - #PASS2 - { - LPRDOFUNLogic pCondition = PARSER->stack().pop($3); - ASSERT(pCondition); - - rdo::runtime::LPRDOCalc pConditionCalc = pCondition->getCalc(); - ASSERT(pConditionCalc); - - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); - ASSERT(pType); - - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pConditionCalc); - ASSERT(pCalc); - - LPContextReturnable pContextReturnable = PARSER->context()->cast(); - ASSERT(pContextReturnable); - pContextReturnable->addChildContext(); - - LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); - ASSERT(pExpression); - $$ = PARSER->stack().push(pExpression); - } - } - | RDO_if error fun_logic - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается открывающая скобка"); - } - } - | RDO_if '(' fun_logic error - { - #PASS2 - { - PARSER->error().error(@4, "Ожидается закрывающая скобка"); - } - } - ; + : RDO_if '(' fun_logic ')' + { + #PASS2 + { + LPRDOFUNLogic pCondition = PARSER->stack().pop($3); + ASSERT(pCondition); + + rdo::runtime::LPRDOCalc pConditionCalc = pCondition->getCalc(); + ASSERT(pConditionCalc); + + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); + ASSERT(pType); + + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pConditionCalc); + ASSERT(pCalc); + + LPContextReturnable pContextReturnable = PARSER->context()->cast(); + ASSERT(pContextReturnable); + pContextReturnable->addChildContext(); + + LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); + ASSERT(pExpression); + $$ = PARSER->stack().push(pExpression); + } + } + | RDO_if error fun_logic + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается открывающая скобка"); + } + } + | RDO_if '(' fun_logic error + { + #PASS2 + { + PARSER->error().error(@4, "Ожидается закрывающая скобка"); + } + } + ; if_then_statement - : returnable_statement - ; + : returnable_statement + ; if_else_statement - : returnable_context_push returnable_context_pop - { - #PASS2 - { - $$ = PARSER->stack().push(rdo::Factory::create()); - } - } - | RDO_else returnable_statement - { - #PASS2 - { - $$ = $2; - } - } - ; + : returnable_context_push returnable_context_pop + { + #PASS2 + { + $$ = PARSER->stack().push(rdo::Factory::create()); + } + } + | RDO_else returnable_statement + { + #PASS2 + { + $$ = $2; + } + } + ; for_statement - : for_header statement - { - #PASS2 - { - LPExpression pExpressionHeader = PARSER->stack().pop($1); - ASSERT(pExpressionHeader); + : for_header statement + { + #PASS2 + { + LPExpression pExpressionHeader = PARSER->stack().pop($1); + ASSERT(pExpressionHeader); - LPExpression pExpressionStatement = PARSER->stack().pop($2); - ASSERT(pExpressionStatement); + LPExpression pExpressionStatement = PARSER->stack().pop($2); + ASSERT(pExpressionStatement); - rdo::runtime::LPRDOCalc pCalcStatementList = pExpressionStatement->calc(); - ASSERT(pCalcStatementList); + rdo::runtime::LPRDOCalc pCalcStatementList = pExpressionStatement->calc(); + ASSERT(pCalcStatementList); - rdo::runtime::LPRDOCalcFor pCalcFor = pExpressionHeader->calc().object_dynamic_cast(); - ASSERT(pCalcFor); + rdo::runtime::LPRDOCalcFor pCalcFor = pExpressionHeader->calc().object_dynamic_cast(); + ASSERT(pCalcFor); - pCalcFor->setStatement(pCalcStatementList); + pCalcFor->setStatement(pCalcStatementList); - rdo::runtime::LPRDOCalcBreakCatch pCalcBreakCatch = rdo::Factory::create(); - ASSERT(pCalcBreakCatch); - pCalcBreakCatch->addStatementList(pCalcFor); + rdo::runtime::LPRDOCalcBreakCatch pCalcBreakCatch = rdo::Factory::create(); + ASSERT(pCalcBreakCatch); + pCalcBreakCatch->addStatementList(pCalcFor); - LPExpression pExpression = rdo::Factory::create(pExpressionStatement->typeInfo(), pCalcBreakCatch, RDOParserSrcInfo(@1, @2)); + LPExpression pExpression = rdo::Factory::create(pExpressionStatement->typeInfo(), pCalcBreakCatch, RDOParserSrcInfo(@1, @2)); - PARSER->contextStack()->pop(); + PARSER->contextStack()->pop(); - $$ = PARSER->stack().push(pExpression); - } - } - ; + $$ = PARSER->stack().push(pExpression); + } + } + ; for_header - : RDO_for '(' local_variable_declaration ';' fun_logic ';' set_statement ')' - { - #PASS2 - { - LPExpression pDeclarationExpression = PARSER->stack().pop($3); - ASSERT(pDeclarationExpression); + : RDO_for '(' local_variable_declaration ';' fun_logic ';' set_statement ')' + { + #PASS2 + { + LPExpression pDeclarationExpression = PARSER->stack().pop($3); + ASSERT(pDeclarationExpression); - LPRDOFUNLogic pCondition = PARSER->stack().pop($5); - ASSERT(pCondition); + LPRDOFUNLogic pCondition = PARSER->stack().pop($5); + ASSERT(pCondition); - rdo::runtime::LPRDOCalc pConditionCalc = pCondition->getCalc(); - ASSERT(pConditionCalc); + rdo::runtime::LPRDOCalc pConditionCalc = pCondition->getCalc(); + ASSERT(pConditionCalc); - LPExpression pEqualExpression = PARSER->stack().pop($7); - ASSERT(pEqualExpression); + LPExpression pEqualExpression = PARSER->stack().pop($7); + ASSERT(pEqualExpression); - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create( - pDeclarationExpression->calc(), - pConditionCalc , - pEqualExpression->calc() ); - ASSERT(pCalc); + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create( + pDeclarationExpression->calc(), + pConditionCalc , + pEqualExpression->calc() ); + ASSERT(pCalc); - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1, @8)); - ASSERT(pType); + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1, @8)); + ASSERT(pType); - LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1, @8)); + LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1, @8)); - LPContextBreakable pContextBreakable = rdo::Factory::create(); - ASSERT(pContextBreakable); + LPContextBreakable pContextBreakable = rdo::Factory::create(); + ASSERT(pContextBreakable); - PARSER->contextStack()->push(pContextBreakable); + PARSER->contextStack()->push(pContextBreakable); - $$ = PARSER->stack().push(pExpression); - } - } - | RDO_for '(' set_statement ';' fun_logic ';' set_statement ')' - { - #PASS2 - { - LPExpression pInitExpression = PARSER->stack().pop($3); - ASSERT(pInitExpression); + $$ = PARSER->stack().push(pExpression); + } + } + | RDO_for '(' set_statement ';' fun_logic ';' set_statement ')' + { + #PASS2 + { + LPExpression pInitExpression = PARSER->stack().pop($3); + ASSERT(pInitExpression); - LPRDOFUNLogic pCondition = PARSER->stack().pop($5); - ASSERT(pCondition); + LPRDOFUNLogic pCondition = PARSER->stack().pop($5); + ASSERT(pCondition); - rdo::runtime::LPRDOCalc pConditionCalc = pCondition->getCalc(); - ASSERT(pConditionCalc); + rdo::runtime::LPRDOCalc pConditionCalc = pCondition->getCalc(); + ASSERT(pConditionCalc); - LPExpression pEqualExpression = PARSER->stack().pop($7); - ASSERT(pEqualExpression); + LPExpression pEqualExpression = PARSER->stack().pop($7); + ASSERT(pEqualExpression); - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1, @8)); - ASSERT(pType); + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1, @8)); + ASSERT(pType); - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create( - pInitExpression->calc() , - pConditionCalc , - pEqualExpression->calc() ); - ASSERT(pCalc); + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create( + pInitExpression->calc() , + pConditionCalc , + pEqualExpression->calc() ); + ASSERT(pCalc); - LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1, @8)); + LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1, @8)); - LPContextBreakable pContextBreakable = rdo::Factory::create(); - ASSERT(pContextBreakable); + LPContextBreakable pContextBreakable = rdo::Factory::create(); + ASSERT(pContextBreakable); - PARSER->contextStack()->push(pContextBreakable); + PARSER->contextStack()->push(pContextBreakable); - $$ = PARSER->stack().push(pExpression); - } - } - ; + $$ = PARSER->stack().push(pExpression); + } + } + ; break_statement - :RDO_Break - { - #PASS2 - { - LPContext pContext = RDOParser::s_parser()->context(); - ASSERT(pContext); - - if (pContext->cast()) - { - rdo::runtime::LPRDOCalc pCalcBreak = rdo::Factory::create(); - ASSERT(pCalcBreak); - - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); - ASSERT(pType); - - LPExpression pExpression = rdo::Factory::create(pType, pCalcBreak, RDOParserSrcInfo(@1)); - ASSERT(pExpression); - - $$ = PARSER->stack().push(pExpression); - } - else - { - PARSER->error().error(@1, "Нельзя использовать break вне цикла"); - } - } - } - ; + :RDO_Break + { + #PASS2 + { + LPContext pContext = RDOParser::s_parser()->context(); + ASSERT(pContext); + + if (pContext->cast()) + { + rdo::runtime::LPRDOCalc pCalcBreak = rdo::Factory::create(); + ASSERT(pCalcBreak); + + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); + ASSERT(pType); + + LPExpression pExpression = rdo::Factory::create(pType, pCalcBreak, RDOParserSrcInfo(@1)); + ASSERT(pExpression); + + $$ = PARSER->stack().push(pExpression); + } + else + { + PARSER->error().error(@1, "Нельзя использовать break вне цикла"); + } + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Общие составные токены для всех объектов РДО @@ -10389,1070 +10468,1070 @@ break_statement // -------------------- Описание переменной // -------------------------------------------------------------------------------- param_value - : RDO_INT_CONST - | RDO_REAL_CONST - | RDO_STRING_CONST - | RDO_IDENTIF - | RDO_BOOL_CONST - | param_array_value - ; + : RDO_INT_CONST + | RDO_REAL_CONST + | RDO_STRING_CONST + | RDO_IDENTIF + | RDO_BOOL_CONST + | param_array_value + ; param_array_value - : '[' array_item ']' - { - LPRDOArrayValue pArrayValue = PARSER->stack().pop($2); - ASSERT(pArrayValue); - RDOParserSrcInfo srcInfo(@1, @3, pArrayValue->getAsString()); - pArrayValue->setSrcInfo(srcInfo); - pArrayValue->getArrayType()->setSrcInfo(srcInfo); - $$ = PARSER->stack().push(rdo::Factory::create(pArrayValue->getArrayType()->typeInfo(), pArrayValue)); - } - | '[' array_item error - { - PARSER->error().error(@2, "Массив должен закрываться скобкой"); - } - ; + : '[' array_item ']' + { + LPRDOArrayValue pArrayValue = PARSER->stack().pop($2); + ASSERT(pArrayValue); + RDOParserSrcInfo srcInfo(@1, @3, pArrayValue->getAsString()); + pArrayValue->setSrcInfo(srcInfo); + pArrayValue->getArrayType()->setSrcInfo(srcInfo); + $$ = PARSER->stack().push(rdo::Factory::create(pArrayValue->getArrayType()->typeInfo(), pArrayValue)); + } + | '[' array_item error + { + PARSER->error().error(@2, "Массив должен закрываться скобкой"); + } + ; array_item - : param_value - { - LPRDOValue pValue = PARSER->stack().pop($1); - ASSERT(pValue); - LPRDOArrayType pArrayType = rdo::Factory::create(pValue->typeInfo(), RDOParserSrcInfo(@1)); - ASSERT(pArrayType); - LPRDOArrayValue pArrayValue = rdo::Factory::create(pArrayType); - ASSERT(pArrayValue); - pArrayValue->insertItem(pValue); - $$ = PARSER->stack().push(pArrayValue); - } - | array_item ',' param_value - { - LPRDOArrayValue pArrayValue = PARSER->stack().pop($1); - ASSERT(pArrayValue); - LPRDOValue pValue = PARSER->stack().pop($3); - ASSERT(pValue); - pArrayValue->insertItem(pValue); - $$ = PARSER->stack().push(pArrayValue); - } - | array_item param_value - { - LPRDOArrayValue pArrayValue = PARSER->stack().pop($1); - ASSERT(pArrayValue); - LPRDOValue pValue = PARSER->stack().pop($2); - ASSERT(pValue); - pArrayValue->insertItem(pValue); - $$ = PARSER->stack().push(pArrayValue); - PARSER->error().warning(@1, rdo::format("Пропущена запятая перед: %s", pValue->value().getAsString().c_str())); - } - ; + : param_value + { + LPRDOValue pValue = PARSER->stack().pop($1); + ASSERT(pValue); + LPRDOArrayType pArrayType = rdo::Factory::create(pValue->typeInfo(), RDOParserSrcInfo(@1)); + ASSERT(pArrayType); + LPRDOArrayValue pArrayValue = rdo::Factory::create(pArrayType); + ASSERT(pArrayValue); + pArrayValue->insertItem(pValue); + $$ = PARSER->stack().push(pArrayValue); + } + | array_item ',' param_value + { + LPRDOArrayValue pArrayValue = PARSER->stack().pop($1); + ASSERT(pArrayValue); + LPRDOValue pValue = PARSER->stack().pop($3); + ASSERT(pValue); + pArrayValue->insertItem(pValue); + $$ = PARSER->stack().push(pArrayValue); + } + | array_item param_value + { + LPRDOArrayValue pArrayValue = PARSER->stack().pop($1); + ASSERT(pArrayValue); + LPRDOValue pValue = PARSER->stack().pop($2); + ASSERT(pValue); + pArrayValue->insertItem(pValue); + $$ = PARSER->stack().push(pArrayValue); + PARSER->error().warning(@1, rdo::format("Пропущена запятая перед: %s", pValue->value().getAsString().c_str())); + } + ; param_value_default - : /* empty */ - { - LPRDOValue pValue = rdo::Factory::create(); - ASSERT(pValue); - $$ = PARSER->stack().push(pValue); - } - | '=' param_value - { - $$ = $2; - } - | '=' rss_constructor_call - { - PARSER->error().error(@2, "Для вложенных ресурсов нельзя задавать значение по умолчанию"); - } - | '=' error - { - RDOParserSrcInfo src_info(@1, @2, true); - if (src_info.src_pos().point()) - { - PARSER->error().error(src_info, "Не указано значение по умолчанию"); - } - else - { - PARSER->error().error(src_info, "Неверное значение по умолчанию"); - } - } - ; + : /* empty */ + { + LPRDOValue pValue = rdo::Factory::create(); + ASSERT(pValue); + $$ = PARSER->stack().push(pValue); + } + | '=' param_value + { + $$ = $2; + } + | '=' rss_constructor_call + { + PARSER->error().error(@2, "Для вложенных ресурсов нельзя задавать значение по умолчанию"); + } + | '=' error + { + RDOParserSrcInfo src_info(@1, @2, true); + if (src_info.src_pos().point()) + { + PARSER->error().error(src_info, "Не указано значение по умолчанию"); + } + else + { + PARSER->error().error(src_info, "Неверное значение по умолчанию"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Логические выражения // -------------------------------------------------------------------------------- fun_logic_eq - : RDO_eq - { - #PASS2 - { - $$ = RDO_eq; - } - } - ; + : RDO_eq + { + #PASS2 + { + $$ = RDO_eq; + } + } + ; fun_logic - : fun_arithm fun_logic_eq fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); - LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); - ASSERT(pResult); - $$ = PARSER->stack().push(pResult); - } - } - | fun_arithm RDO_neq fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); - LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); - ASSERT(pResult); - $$ = PARSER->stack().push(pResult); - } - } - | fun_arithm '<' fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); - LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); - ASSERT(pResult); - $$ = PARSER->stack().push(pResult); - } - } - | fun_arithm '>' fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); - LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); - ASSERT(pResult); - $$ = PARSER->stack().push(pResult); - } - } - | fun_arithm RDO_leq fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); - LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); - ASSERT(pResult); - $$ = PARSER->stack().push(pResult); - } - } - | fun_arithm RDO_geq fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); - LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); - ASSERT(pResult); - $$ = PARSER->stack().push(pResult); - } - } - | fun_logic RDO_and fun_logic - { - #PASS2 - { - LPRDOFUNLogic pLogic1 = PARSER->stack().pop($1); - LPRDOFUNLogic pLogic2 = PARSER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); - ASSERT(pResult); - $$ = PARSER->stack().push(pResult); - } - } - | fun_logic RDO_or fun_logic - { - #PASS2 - { - LPRDOFUNLogic pLogic1 = PARSER->stack().pop($1); - LPRDOFUNLogic pLogic2 = PARSER->stack().pop($3); - ASSERT(pLogic1); - ASSERT(pLogic2); - LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); - ASSERT(pResult); - $$ = PARSER->stack().push(pResult); - } - } - | fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($1); - ASSERT(pArithm); - LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); - ASSERT(pResult); - $$ = PARSER->stack().push(pResult); - } - } - | fun_group - | fun_select_logic - | '[' fun_logic ']' - { - #PASS2 - { - LPRDOFUNLogic pLogic = PARSER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("[" + pLogic->src_text() + "]"); - $$ = PARSER->stack().push(pLogic); - } - } - | '(' fun_logic ')' - { - #PASS2 - { - LPRDOFUNLogic pLogic = PARSER->stack().pop($2); - ASSERT(pLogic); - pLogic->setSrcPos (@1, @3); - pLogic->setSrcText("(" + pLogic->src_text() + ")"); - $$ = PARSER->stack().push(pLogic); - } - } - | RDO_not fun_logic - { - #PASS2 - { - LPRDOFUNLogic pLogic = PARSER->stack().pop($2); - ASSERT(pLogic); - RDOParserSrcInfo src_info(@1, @2); - LPRDOFUNLogic pLogicNot = pLogic->operator_not(src_info.src_pos()); - ASSERT(pLogicNot); - $$ = PARSER->stack().push(pLogicNot); - } - } - | '[' fun_logic error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - } - | '(' fun_logic error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - } - ; + : fun_arithm fun_logic_eq fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); + LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator ==(pArithm2); + ASSERT(pResult); + $$ = PARSER->stack().push(pResult); + } + } + | fun_arithm RDO_neq fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); + LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator !=(pArithm2); + ASSERT(pResult); + $$ = PARSER->stack().push(pResult); + } + } + | fun_arithm '<' fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); + LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <(pArithm2); + ASSERT(pResult); + $$ = PARSER->stack().push(pResult); + } + } + | fun_arithm '>' fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); + LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >(pArithm2); + ASSERT(pResult); + $$ = PARSER->stack().push(pResult); + } + } + | fun_arithm RDO_leq fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); + LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator <=(pArithm2); + ASSERT(pResult); + $$ = PARSER->stack().push(pResult); + } + } + | fun_arithm RDO_geq fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); + LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNLogic pResult = pArithm1->operator >=(pArithm2); + ASSERT(pResult); + $$ = PARSER->stack().push(pResult); + } + } + | fun_logic RDO_and fun_logic + { + #PASS2 + { + LPRDOFUNLogic pLogic1 = PARSER->stack().pop($1); + LPRDOFUNLogic pLogic2 = PARSER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator &&(pLogic2); + ASSERT(pResult); + $$ = PARSER->stack().push(pResult); + } + } + | fun_logic RDO_or fun_logic + { + #PASS2 + { + LPRDOFUNLogic pLogic1 = PARSER->stack().pop($1); + LPRDOFUNLogic pLogic2 = PARSER->stack().pop($3); + ASSERT(pLogic1); + ASSERT(pLogic2); + LPRDOFUNLogic pResult = pLogic1->operator ||(pLogic2); + ASSERT(pResult); + $$ = PARSER->stack().push(pResult); + } + } + | fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($1); + ASSERT(pArithm); + LPRDOFUNLogic pResult = rdo::Factory::create(pArithm); + ASSERT(pResult); + $$ = PARSER->stack().push(pResult); + } + } + | fun_group + | fun_select_logic + | '[' fun_logic ']' + { + #PASS2 + { + LPRDOFUNLogic pLogic = PARSER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("[" + pLogic->src_text() + "]"); + $$ = PARSER->stack().push(pLogic); + } + } + | '(' fun_logic ')' + { + #PASS2 + { + LPRDOFUNLogic pLogic = PARSER->stack().pop($2); + ASSERT(pLogic); + pLogic->setSrcPos (@1, @3); + pLogic->setSrcText("(" + pLogic->src_text() + ")"); + $$ = PARSER->stack().push(pLogic); + } + } + | RDO_not fun_logic + { + #PASS2 + { + LPRDOFUNLogic pLogic = PARSER->stack().pop($2); + ASSERT(pLogic); + RDOParserSrcInfo src_info(@1, @2); + LPRDOFUNLogic pLogicNot = pLogic->operator_not(src_info.src_pos()); + ASSERT(pLogicNot); + $$ = PARSER->stack().push(pLogicNot); + } + } + | '[' fun_logic error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + } + | '(' fun_logic error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Арифметические выражения // -------------------------------------------------------------------------------- param_full_name - : RDO_IDENTIF - { - #PASS2 - { - LPRDOValue pName = PARSER->stack().pop($1); - Context::Params params; - params[Context::Params::IDENTIFIER] = pName->value().getIdentificator(); - Context::LPFindResult result = PARSER->context()->find(Context::METHOD_OPERATOR_DOT, params, pName->src_info()); - $$ = PARSER->stack().push(result); - } - } - | param_full_name '.' RDO_IDENTIF - { - #PASS2 - { - Context::LPFindResult pParentResult = PARSER->stack().pop($1); - ASSERT(pParentResult->getSwitchContext()); - LPContext pParentContext = pParentResult->getSwitchContext().context; - LPRDOValue pName = PARSER->stack().pop($3); - - Context::Params params = pParentResult->getSwitchContext().params; - params[Context::Params::IDENTIFIER] = pName->value().getIdentificator(); - Context::LPFindResult result = pParentContext->find(Context::METHOD_OPERATOR_DOT, params, pName->src_info()); - - $$ = PARSER->stack().push(result); - } - } - ; + : RDO_IDENTIF + { + #PASS2 + { + LPRDOValue pName = PARSER->stack().pop($1); + Context::Params params; + params[Context::Params::IDENTIFIER] = pName->value().getIdentificator(); + Context::LPFindResult result = PARSER->context()->find(Context::METHOD_OPERATOR_DOT, params, pName->src_info()); + $$ = PARSER->stack().push(result); + } + } + | param_full_name '.' RDO_IDENTIF + { + #PASS2 + { + Context::LPFindResult pParentResult = PARSER->stack().pop($1); + ASSERT(pParentResult->getSwitchContext()); + LPContext pParentContext = pParentResult->getSwitchContext().context; + LPRDOValue pName = PARSER->stack().pop($3); + + Context::Params params = pParentResult->getSwitchContext().params; + params[Context::Params::IDENTIFIER] = pName->value().getIdentificator(); + Context::LPFindResult result = pParentContext->find(Context::METHOD_OPERATOR_DOT, params, pName->src_info()); + + $$ = PARSER->stack().push(result); + } + } + ; fun_arithm - : RDO_INT_CONST - { - #PASS2 - { - $$ = PARSER->stack().push(RDOFUNArithm::generateByConst(PARSER->stack().pop($1))); - } - } - | RDO_REAL_CONST - { - #PASS2 - { - $$ = PARSER->stack().push(RDOFUNArithm::generateByConst(PARSER->stack().pop($1))); - } - } - | RDO_BOOL_CONST - { - #PASS2 - { - $$ = PARSER->stack().push(RDOFUNArithm::generateByConst(PARSER->stack().pop($1))); - } - } - | RDO_STRING_CONST - { - #PASS2 - { - $$ = PARSER->stack().push(RDOFUNArithm::generateByConst(PARSER->stack().pop($1))); - } - } - | param_array_value - { - #PASS2 - { - $$ = PARSER->stack().push(RDOFUNArithm::generateByConst(PARSER->stack().pop($1))); - } - } - | param_full_name - { - #PASS2 - { - Context::LPFindResult pParamResult = PARSER->stack().pop($1); - ASSERT(pParamResult->getSwitchContext()); - LPContext pParamContext = pParamResult->getSwitchContext().context; - ASSERT(pParamContext); - - Context::Params params = pParamResult->getSwitchContext().params; - - std::string name; - RDOParserSrcInfo srcInfo = RDOParserSrcInfo(@1); - if (params.exists(Context::Params::IDENTIFIER)) - { - name = params.identifier(); - srcInfo.setSrcText(name); - } - - Context::LPFindResult result = pParamContext->find(Context::METHOD_GET, params, srcInfo); - LPExpression pExpression = result->getCreateExpression()(); - ASSERT(pExpression); - $$ = PARSER->stack().push(rdo::Factory::create(pExpression)); - } - } - | '*' - { - #PASS2 - { - LPRDOValue pValue = rdo::Factory::create(RDOParserSrcInfo(@1, "*")); - ASSERT(pValue); - LPExpression pExpression = rdo::Factory::create(pValue); - ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); - $$ = PARSER->stack().push(pArithm); - } - } - | fun_arithm '+' fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); - LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); - ASSERT(pResult); - $$ = PARSER->stack().push(pResult); - } - } - | fun_arithm '-' fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); - LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); - ASSERT(pResult); - $$ = PARSER->stack().push(pResult); - } - } - | fun_arithm '*' fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); - LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); - ASSERT(pResult); - $$ = PARSER->stack().push(pResult); - } - } - | fun_arithm '/' fun_arithm - { - #PASS2 - { - LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); - LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); - ASSERT(pArithm1); - ASSERT(pArithm2); - LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); - ASSERT(pResult); - $$ = PARSER->stack().push(pResult); - } - } - | fun_arithm_func_call - | fun_select_arithm - | '(' fun_arithm ')' - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($2); - ASSERT(pArithm); - pArithm->setSrcPos (@1, @3); - pArithm->setSrcText("(" + pArithm->src_text() + ")"); - $$ = PARSER->stack().push(pArithm); - } - } - | '-' fun_arithm %prec RDO_UMINUS - { - #PASS2 - { - LPRDOFUNArithm pArithm = PARSER->stack().pop($2); - ASSERT(pArithm); - RDOParserSrcInfo info; - info.setSrcPos(@1, @2); - $$ = PARSER->stack().push(pArithm->uminus(info.src_pos())); - } - } - | param_full_name '.' RDO_Size - { - #PASS2 - { - Context::LPFindResult pParamResult = PARSER->stack().pop($1); - ASSERT(pParamResult->getSwitchContext()); - LPContext pParamContext = pParamResult->getSwitchContext().context; - ASSERT(pParamContext); - - Context::Params params = pParamResult->getSwitchContext().params; - - std::string name; - RDOParserSrcInfo srcInfo = RDOParserSrcInfo(@1); - if (params.exists(Context::Params::IDENTIFIER)) - { - name = params.identifier(); - srcInfo.setSrcText(name); - } - - Context::LPFindResult result = pParamContext->find(Context::METHOD_GET, params, srcInfo); - LPExpression pArithmExpression = result->getCreateExpression()(); - ASSERT(pArithmExpression); - - LPRDOFUNArithm pArithm = rdo::Factory::create(pArithmExpression); - - rdo::runtime::LPRDOCalc pCalc; - if (pArithm->typeInfo()->itype().object_dynamic_cast()) - { - pCalc = rdo::Factory::create(pArithm->calc()); - ASSERT(pCalc); - } - else - { - PARSER->error().error(@1, rdo::format("'%s' не является массивом", name.c_str())); - } - - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); - ASSERT(pType); - - LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); - ASSERT(pExpression); - - LPRDOFUNArithm pArithmArraySize = rdo::Factory::create(pExpression); - ASSERT(pArithmArraySize); - - $$ = PARSER->stack().push(pArithmArraySize); - } - } - | RDO_IDENTIF '[' fun_arithm ']' '.' RDO_IDENTIF - { - #PASS2 - { - LPRDOValue pArrayValue = PARSER->stack().pop($1); - ASSERT(pArrayValue); - - LPRDOFUNArithm pArrayArithm = RDOFUNArithm::generateByIdentificator(pArrayValue); - ASSERT(pArrayArithm); - - LPRDOArrayType pArrayType = pArrayArithm->typeInfo()->itype().object_dynamic_cast(); - if (!pArrayType) - { - PARSER->error().error(@1, rdo::format("'%s' не является массивом" - , pArrayValue->value().getIdentificator().c_str()) - ); - } - - LPRDORTPResType pResType = pArrayType->getItemType()->itype().object_dynamic_cast(); - if (!pResType) - { - PARSER->error().error(@1, rdo::format("'%s' не является массивом ресурсов" - , pArrayValue->value().getIdentificator().c_str()) - ); - } - - LPRDOFUNArithm pArrayIndex = PARSER->stack().pop($3); - ASSERT(pArrayIndex); - - LPRDOValue pParamName = PARSER->stack().pop($6); - ASSERT(pParamName); - - const std::size_t paramIndex = pResType->getRTPParamNumber(pParamName->value().getAsString()); - - if (paramIndex == RDORTPResType::UNDEFINED_PARAM) - { - PARSER->error().error(@6, rdo::format("'%s' не является параметром ресурса '%s'" - , pParamName->value().getAsString().c_str() - , pResType->name().c_str()) - ); - } - - rdo::runtime::LPRDOCalc pArrayItem = rdo::Factory::create( - pArrayArithm->calc(), - pArrayIndex->calc() - ); - ASSERT(pArrayItem); - - rdo::runtime::LPRDOCalc pParamValue = rdo::Factory::create( - pArrayItem, paramIndex - ); - ASSERT(pParamValue); - - LPExpression pParamExpression = rdo::Factory::create( - pResType->getParams()[paramIndex]->getTypeInfo(), - pParamValue, - RDOParserSrcInfo(@6) - ); - ASSERT(pParamExpression); - - LPRDOFUNArithm pParamArithm = rdo::Factory::create(pParamExpression); - ASSERT(pParamArithm); - - $$ = PARSER->stack().push(pParamArithm); - } - } - | RDO_IDENTIF '[' fun_arithm ']' - { - #PASS2 - { - LPRDOValue pValue = PARSER->stack().pop($1); - ASSERT(pValue); - - LPRDOFUNArithm pArithm = RDOFUNArithm::generateByIdentificator(pValue); - ASSERT(pArithm); - - LPRDOFUNArithm pArithmInd = PARSER->stack().pop($3); - ASSERT(pArithmInd); - - LPIType pType = pArithm->typeInfo()->itype(); - ASSERT(pType); - - LPRDOArrayType pArrayType = pType.object_dynamic_cast(); - if (!pArrayType) - { - PARSER->error().error(@1, rdo::format("'%s' не является массивом", pValue->value().getIdentificator().c_str())); - } - - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pArithm->calc(), pArithmInd->calc()); - ASSERT(pCalc); - - LPTypeInfo pItemType = pArrayType->getItemType(); - ASSERT(pItemType); - - LPExpression pExpression = rdo::Factory::create(pItemType, pCalc, RDOParserSrcInfo(@1)); - ASSERT(pExpression); - - LPRDOFUNArithm pArithmArrayItem = rdo::Factory::create(pExpression); - ASSERT(pArithmArrayItem); - - $$ = PARSER->stack().push(pArithmArrayItem); - } - } - ; + : RDO_INT_CONST + { + #PASS2 + { + $$ = PARSER->stack().push(RDOFUNArithm::generateByConst(PARSER->stack().pop($1))); + } + } + | RDO_REAL_CONST + { + #PASS2 + { + $$ = PARSER->stack().push(RDOFUNArithm::generateByConst(PARSER->stack().pop($1))); + } + } + | RDO_BOOL_CONST + { + #PASS2 + { + $$ = PARSER->stack().push(RDOFUNArithm::generateByConst(PARSER->stack().pop($1))); + } + } + | RDO_STRING_CONST + { + #PASS2 + { + $$ = PARSER->stack().push(RDOFUNArithm::generateByConst(PARSER->stack().pop($1))); + } + } + | param_array_value + { + #PASS2 + { + $$ = PARSER->stack().push(RDOFUNArithm::generateByConst(PARSER->stack().pop($1))); + } + } + | param_full_name + { + #PASS2 + { + Context::LPFindResult pParamResult = PARSER->stack().pop($1); + ASSERT(pParamResult->getSwitchContext()); + LPContext pParamContext = pParamResult->getSwitchContext().context; + ASSERT(pParamContext); + + Context::Params params = pParamResult->getSwitchContext().params; + + std::string name; + RDOParserSrcInfo srcInfo = RDOParserSrcInfo(@1); + if (params.exists(Context::Params::IDENTIFIER)) + { + name = params.identifier(); + srcInfo.setSrcText(name); + } + + Context::LPFindResult result = pParamContext->find(Context::METHOD_GET, params, srcInfo); + LPExpression pExpression = result->getCreateExpression()(); + ASSERT(pExpression); + $$ = PARSER->stack().push(rdo::Factory::create(pExpression)); + } + } + | '*' + { + #PASS2 + { + LPRDOValue pValue = rdo::Factory::create(RDOParserSrcInfo(@1, "*")); + ASSERT(pValue); + LPExpression pExpression = rdo::Factory::create(pValue); + ASSERT(pExpression); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); + $$ = PARSER->stack().push(pArithm); + } + } + | fun_arithm '+' fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); + LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator +(pArithm2); + ASSERT(pResult); + $$ = PARSER->stack().push(pResult); + } + } + | fun_arithm '-' fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); + LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator -(pArithm2); + ASSERT(pResult); + $$ = PARSER->stack().push(pResult); + } + } + | fun_arithm '*' fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); + LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator *(pArithm2); + ASSERT(pResult); + $$ = PARSER->stack().push(pResult); + } + } + | fun_arithm '/' fun_arithm + { + #PASS2 + { + LPRDOFUNArithm pArithm1 = PARSER->stack().pop($1); + LPRDOFUNArithm pArithm2 = PARSER->stack().pop($3); + ASSERT(pArithm1); + ASSERT(pArithm2); + LPRDOFUNArithm pResult = pArithm1->operator /(pArithm2); + ASSERT(pResult); + $$ = PARSER->stack().push(pResult); + } + } + | fun_arithm_func_call + | fun_select_arithm + | '(' fun_arithm ')' + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($2); + ASSERT(pArithm); + pArithm->setSrcPos (@1, @3); + pArithm->setSrcText("(" + pArithm->src_text() + ")"); + $$ = PARSER->stack().push(pArithm); + } + } + | '-' fun_arithm %prec RDO_UMINUS + { + #PASS2 + { + LPRDOFUNArithm pArithm = PARSER->stack().pop($2); + ASSERT(pArithm); + RDOParserSrcInfo info; + info.setSrcPos(@1, @2); + $$ = PARSER->stack().push(pArithm->uminus(info.src_pos())); + } + } + | param_full_name '.' RDO_Size + { + #PASS2 + { + Context::LPFindResult pParamResult = PARSER->stack().pop($1); + ASSERT(pParamResult->getSwitchContext()); + LPContext pParamContext = pParamResult->getSwitchContext().context; + ASSERT(pParamContext); + + Context::Params params = pParamResult->getSwitchContext().params; + + std::string name; + RDOParserSrcInfo srcInfo = RDOParserSrcInfo(@1); + if (params.exists(Context::Params::IDENTIFIER)) + { + name = params.identifier(); + srcInfo.setSrcText(name); + } + + Context::LPFindResult result = pParamContext->find(Context::METHOD_GET, params, srcInfo); + LPExpression pArithmExpression = result->getCreateExpression()(); + ASSERT(pArithmExpression); + + LPRDOFUNArithm pArithm = rdo::Factory::create(pArithmExpression); + + rdo::runtime::LPRDOCalc pCalc; + if (pArithm->typeInfo()->itype().object_dynamic_cast()) + { + pCalc = rdo::Factory::create(pArithm->calc()); + ASSERT(pCalc); + } + else + { + PARSER->error().error(@1, rdo::format("'%s' не является массивом", name.c_str())); + } + + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo(@1)); + ASSERT(pType); + + LPExpression pExpression = rdo::Factory::create(pType, pCalc, RDOParserSrcInfo(@1)); + ASSERT(pExpression); + + LPRDOFUNArithm pArithmArraySize = rdo::Factory::create(pExpression); + ASSERT(pArithmArraySize); + + $$ = PARSER->stack().push(pArithmArraySize); + } + } + | RDO_IDENTIF '[' fun_arithm ']' '.' RDO_IDENTIF + { + #PASS2 + { + LPRDOValue pArrayValue = PARSER->stack().pop($1); + ASSERT(pArrayValue); + + LPRDOFUNArithm pArrayArithm = RDOFUNArithm::generateByIdentificator(pArrayValue); + ASSERT(pArrayArithm); + + LPRDOArrayType pArrayType = pArrayArithm->typeInfo()->itype().object_dynamic_cast(); + if (!pArrayType) + { + PARSER->error().error(@1, rdo::format("'%s' не является массивом" + , pArrayValue->value().getIdentificator().c_str()) + ); + } + + LPRDORTPResType pResType = pArrayType->getItemType()->itype().object_dynamic_cast(); + if (!pResType) + { + PARSER->error().error(@1, rdo::format("'%s' не является массивом ресурсов" + , pArrayValue->value().getIdentificator().c_str()) + ); + } + + LPRDOFUNArithm pArrayIndex = PARSER->stack().pop($3); + ASSERT(pArrayIndex); + + LPRDOValue pParamName = PARSER->stack().pop($6); + ASSERT(pParamName); + + const std::size_t paramIndex = pResType->getRTPParamNumber(pParamName->value().getAsString()); + + if (paramIndex == RDORTPResType::UNDEFINED_PARAM) + { + PARSER->error().error(@6, rdo::format("'%s' не является параметром ресурса '%s'" + , pParamName->value().getAsString().c_str() + , pResType->name().c_str()) + ); + } + + rdo::runtime::LPRDOCalc pArrayItem = rdo::Factory::create( + pArrayArithm->calc(), + pArrayIndex->calc() + ); + ASSERT(pArrayItem); + + rdo::runtime::LPRDOCalc pParamValue = rdo::Factory::create( + pArrayItem, paramIndex + ); + ASSERT(pParamValue); + + LPExpression pParamExpression = rdo::Factory::create( + pResType->getParams()[paramIndex]->getTypeInfo(), + pParamValue, + RDOParserSrcInfo(@6) + ); + ASSERT(pParamExpression); + + LPRDOFUNArithm pParamArithm = rdo::Factory::create(pParamExpression); + ASSERT(pParamArithm); + + $$ = PARSER->stack().push(pParamArithm); + } + } + | RDO_IDENTIF '[' fun_arithm ']' + { + #PASS2 + { + LPRDOValue pValue = PARSER->stack().pop($1); + ASSERT(pValue); + + LPRDOFUNArithm pArithm = RDOFUNArithm::generateByIdentificator(pValue); + ASSERT(pArithm); + + LPRDOFUNArithm pArithmInd = PARSER->stack().pop($3); + ASSERT(pArithmInd); + + LPIType pType = pArithm->typeInfo()->itype(); + ASSERT(pType); + + LPRDOArrayType pArrayType = pType.object_dynamic_cast(); + if (!pArrayType) + { + PARSER->error().error(@1, rdo::format("'%s' не является массивом", pValue->value().getIdentificator().c_str())); + } + + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pArithm->calc(), pArithmInd->calc()); + ASSERT(pCalc); + + LPTypeInfo pItemType = pArrayType->getItemType(); + ASSERT(pItemType); + + LPExpression pExpression = rdo::Factory::create(pItemType, pCalc, RDOParserSrcInfo(@1)); + ASSERT(pExpression); + + LPRDOFUNArithm pArithmArrayItem = rdo::Factory::create(pExpression); + ASSERT(pArithmArrayItem); + + $$ = PARSER->stack().push(pArithmArrayItem); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Функции и последовательности // -------------------------------------------------------------------------------- fun_arithm_func_call - : RDO_IDENTIF '(' arithm_list ')' - { - #PASS2 - { - const std::string funName = PARSER->stack().pop($1)->value().getIdentificator(); - LPArithmContainer pArithmContainer = PARSER->stack().pop($3); - ASSERT(pArithmContainer); - - LPRDOFUNParams pFunParams = rdo::Factory::create(pArithmContainer); - ASSERT(pFunParams); - - pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); - pFunParams->setSrcPos (@1, @4); - pFunParams->setSrcText(funName + "(" + pArithmContainer->src_text() + ")"); - LPRDOFUNArithm pArithm = pFunParams->createCall(funName); - ASSERT(pArithm); - $$ = PARSER->stack().push(pArithm); - } - } - | RDO_IDENTIF '(' error - { - #PASS2 - { - PARSER->error().error(@3, "Ошибка в параметрах функции"); - } - } - ; + : RDO_IDENTIF '(' arithm_list ')' + { + #PASS2 + { + const std::string funName = PARSER->stack().pop($1)->value().getIdentificator(); + LPArithmContainer pArithmContainer = PARSER->stack().pop($3); + ASSERT(pArithmContainer); + + LPRDOFUNParams pFunParams = rdo::Factory::create(pArithmContainer); + ASSERT(pFunParams); + + pFunParams->getFunseqName().setSrcInfo(RDOParserSrcInfo(@1, funName)); + pFunParams->setSrcPos (@1, @4); + pFunParams->setSrcText(funName + "(" + pArithmContainer->src_text() + ")"); + LPRDOFUNArithm pArithm = pFunParams->createCall(funName); + ASSERT(pArithm); + $$ = PARSER->stack().push(pArithm); + } + } + | RDO_IDENTIF '(' error + { + #PASS2 + { + PARSER->error().error(@3, "Ошибка в параметрах функции"); + } + } + ; arithm_list - : /* empty */ - { - #PASS2 - { - LPArithmContainer pArithmContainer = rdo::Factory::create(); - ASSERT(pArithmContainer); - $$ = PARSER->stack().push(pArithmContainer); - } - } - | arithm_list_body - ; + : /* empty */ + { + #PASS2 + { + LPArithmContainer pArithmContainer = rdo::Factory::create(); + ASSERT(pArithmContainer); + $$ = PARSER->stack().push(pArithmContainer); + } + } + | arithm_list_body + ; arithm_list_body - : fun_arithm - { - #PASS2 - { - LPArithmContainer pArithmContainer = rdo::Factory::create(); - LPRDOFUNArithm pArithm = PARSER->stack().pop($1); - ASSERT (pArithmContainer); - ASSERT (pArithm); - pArithmContainer->setSrcText(pArithm->src_text()); - pArithmContainer->addItem (pArithm); - $$ = PARSER->stack().push(pArithmContainer); - } - } - | arithm_list_body ',' fun_arithm - { - #PASS2 - { - LPArithmContainer pArithmContainer = PARSER->stack().pop($1); - LPRDOFUNArithm pArithm = PARSER->stack().pop($3); - ASSERT (pArithmContainer); - ASSERT (pArithm); - pArithmContainer->setSrcText(pArithmContainer->src_text() + ", " + pArithm->src_text()); - pArithmContainer->addItem (pArithm); - $$ = PARSER->stack().push(pArithmContainer); - } - } - | arithm_list_body ',' error - { - #PASS2 - { - PARSER->error().error(@3, "Ошибка в арифметическом выражении"); - } - } - ; + : fun_arithm + { + #PASS2 + { + LPArithmContainer pArithmContainer = rdo::Factory::create(); + LPRDOFUNArithm pArithm = PARSER->stack().pop($1); + ASSERT (pArithmContainer); + ASSERT (pArithm); + pArithmContainer->setSrcText(pArithm->src_text()); + pArithmContainer->addItem (pArithm); + $$ = PARSER->stack().push(pArithmContainer); + } + } + | arithm_list_body ',' fun_arithm + { + #PASS2 + { + LPArithmContainer pArithmContainer = PARSER->stack().pop($1); + LPRDOFUNArithm pArithm = PARSER->stack().pop($3); + ASSERT (pArithmContainer); + ASSERT (pArithm); + pArithmContainer->setSrcText(pArithmContainer->src_text() + ", " + pArithm->src_text()); + pArithmContainer->addItem (pArithm); + $$ = PARSER->stack().push(pArithmContainer); + } + } + | arithm_list_body ',' error + { + #PASS2 + { + PARSER->error().error(@3, "Ошибка в арифметическом выражении"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Групповые выражения // -------------------------------------------------------------------------------- fun_group_keyword - : RDO_Exist - { - #PASS2 - { - $$ = RDOFUNGroupLogic::fgt_exist; - } - } - | RDO_Not_Exist - { - #PASS2 - { - $$ = RDOFUNGroupLogic::fgt_notexist; - } - } - | RDO_For_All - { - #PASS2 - { - $$ = RDOFUNGroupLogic::fgt_forall; - } - } - | RDO_Not_For_All - { - #PASS2 - { - $$ = RDOFUNGroupLogic::fgt_notforall; - } - } - ; + : RDO_Exist + { + #PASS2 + { + $$ = (int)RDOFUNGroupLogic::Type::EXIST; + } + } + | RDO_Not_Exist + { + #PASS2 + { + $$ = (int)RDOFUNGroupLogic::Type::NOTEXIST; + } + } + | RDO_For_All + { + #PASS2 + { + $$ = (int)RDOFUNGroupLogic::Type::FORALL; + } + } + | RDO_Not_For_All + { + #PASS2 + { + $$ = (int)RDOFUNGroupLogic::Type::NOTFORALL; + } + } + ; fun_group_header - : fun_group_keyword '(' RDO_IDENTIF_COLON - { - #PASS2 - { - LPRDOValue pValue = PARSER->stack().pop($3); - ASSERT(pValue); - $$ = PARSER->stack().push(rdo::Factory::create((RDOFUNGroupLogic::FunGroupType)$1, pValue->src_info())); - } - } - | fun_group_keyword '(' error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается имя типа"); - } - } - | fun_group_keyword error - { - #PASS2 - { - PARSER->error().error(@1, "После имени функции ожидается открывающаяся скобка"); - } - } - ; + : fun_group_keyword '(' RDO_IDENTIF_COLON + { + #PASS2 + { + LPRDOValue pValue = PARSER->stack().pop($3); + ASSERT(pValue); + $$ = PARSER->stack().push(rdo::Factory::create(static_cast($1), pValue->src_info())); + } + } + | fun_group_keyword '(' error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается имя типа"); + } + } + | fun_group_keyword error + { + #PASS2 + { + PARSER->error().error(@1, "После имени функции ожидается открывающаяся скобка"); + } + } + ; fun_group - : fun_group_header fun_logic ')' - { - #PASS2 - { - LPRDOFUNGroupLogic pGroupFun = PARSER->stack().pop($1); - LPRDOFUNLogic pLogic = PARSER->stack().pop ($2); - ASSERT(pGroupFun); - ASSERT(pLogic ); - pGroupFun->setSrcPos(@1, @3); - $$ = PARSER->stack().push(pGroupFun->createFunLogic(pLogic)); - } - } - | fun_group_header RDO_NoCheck ')' - { - #PASS2 - { - LPRDOFUNGroupLogic pGroupFun = PARSER->stack().pop($1); - ASSERT(pGroupFun); - pGroupFun->setSrcPos(@1, @3); - LPRDOFUNLogic pTrueLogic = RDOFUNLogic::generateTrue(RDOParserSrcInfo(@2, "NoCheck")); - ASSERT(pTrueLogic); - $$ = PARSER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); - } - } - | fun_group_header fun_logic error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - } - | fun_group_header RDO_NoCheck error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - } - | fun_group_header error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - } - ; + : fun_group_header fun_logic ')' + { + #PASS2 + { + LPRDOFUNGroupLogic pGroupFun = PARSER->stack().pop($1); + LPRDOFUNLogic pLogic = PARSER->stack().pop ($2); + ASSERT(pGroupFun); + ASSERT(pLogic ); + pGroupFun->setSrcPos(@1, @3); + $$ = PARSER->stack().push(pGroupFun->createFunLogic(pLogic)); + } + } + | fun_group_header RDO_NoCheck ')' + { + #PASS2 + { + LPRDOFUNGroupLogic pGroupFun = PARSER->stack().pop($1); + ASSERT(pGroupFun); + pGroupFun->setSrcPos(@1, @3); + LPRDOFUNLogic pTrueLogic = RDOFUNLogic::generateTrue(RDOParserSrcInfo(@2, "NoCheck")); + ASSERT(pTrueLogic); + $$ = PARSER->stack().push(pGroupFun->createFunLogic(pTrueLogic)); + } + } + | fun_group_header fun_logic error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + } + | fun_group_header RDO_NoCheck error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + } + | fun_group_header error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + } + ; // -------------------------------------------------------------------------------- // -------------------- Select // -------------------------------------------------------------------------------- fun_select_header - : RDO_Select '(' RDO_IDENTIF_COLON - { - #PASS2 - { - LPRDOValue pValue = PARSER->stack().pop($3); - ASSERT(pValue); - LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); - ASSERT(pSelect); - pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); - $$ = PARSER->stack().push(pSelect); - } - } - | RDO_Select '(' error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается имя типа"); - } - } - | RDO_Select error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается октрывающаяся скобка"); - } - } - ; + : RDO_Select '(' RDO_IDENTIF_COLON + { + #PASS2 + { + LPRDOValue pValue = PARSER->stack().pop($3); + ASSERT(pValue); + LPRDOFUNSelect pSelect = rdo::Factory::create(pValue->src_info()); + ASSERT(pSelect); + pSelect->setSrcText("Select(" + pValue->value().getIdentificator() + ": "); + $$ = PARSER->stack().push(pSelect); + } + } + | RDO_Select '(' error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается имя типа"); + } + } + | RDO_Select error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается октрывающаяся скобка"); + } + } + ; fun_select_body - : fun_select_header fun_logic ')' - { - #PASS2 - { - LPRDOFUNSelect pSelect = PARSER->stack().pop($1); - LPRDOFUNLogic pLogic = PARSER->stack().pop ($2); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); - pSelect->initSelect(pLogic); - $$ = PARSER->stack().push(pSelect); - } - } - | fun_select_header RDO_NoCheck ')' - { - #PASS2 - { - LPRDOFUNSelect pSelect = PARSER->stack().pop($1); - ASSERT(pSelect); - RDOParserSrcInfo info(@2, "NoCheck"); - pSelect->setSrcText(pSelect->src_text() + info.src_text() + ")"); - LPRDOFUNLogic pTrueLogic = RDOFUNLogic::generateTrue(info); - ASSERT(pTrueLogic); - pSelect->initSelect(pTrueLogic); - $$ = PARSER->stack().push(pSelect); - } - } - | fun_select_header fun_logic error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - } - | fun_select_header RDO_NoCheck error - { - #PASS2 - { - PARSER->error().error(@2, "Ожидается закрывающаяся скобка"); - } - } - | fun_select_header error - { - #PASS2 - { - PARSER->error().error(@1, @2, "Ошибка в логическом выражении"); - } - } - ; + : fun_select_header fun_logic ')' + { + #PASS2 + { + LPRDOFUNSelect pSelect = PARSER->stack().pop($1); + LPRDOFUNLogic pLogic = PARSER->stack().pop ($2); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcText(pSelect->src_text() + pLogic->src_text() + ")"); + pSelect->initSelect(pLogic); + $$ = PARSER->stack().push(pSelect); + } + } + | fun_select_header RDO_NoCheck ')' + { + #PASS2 + { + LPRDOFUNSelect pSelect = PARSER->stack().pop($1); + ASSERT(pSelect); + RDOParserSrcInfo info(@2, "NoCheck"); + pSelect->setSrcText(pSelect->src_text() + info.src_text() + ")"); + LPRDOFUNLogic pTrueLogic = RDOFUNLogic::generateTrue(info); + ASSERT(pTrueLogic); + pSelect->initSelect(pTrueLogic); + $$ = PARSER->stack().push(pSelect); + } + } + | fun_select_header fun_logic error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + } + | fun_select_header RDO_NoCheck error + { + #PASS2 + { + PARSER->error().error(@2, "Ожидается закрывающаяся скобка"); + } + } + | fun_select_header error + { + #PASS2 + { + PARSER->error().error(@1, @2, "Ошибка в логическом выражении"); + } + } + ; fun_select_keyword - : RDO_Exist - { - #PASS2 - { - $$ = RDOFUNGroupLogic::fgt_exist; - } - } - | RDO_Not_Exist - { - #PASS2 - { - $$ = RDOFUNGroupLogic::fgt_notexist; - } - } - | RDO_For_All - { - #PASS2 - { - $$ = RDOFUNGroupLogic::fgt_forall; - } - } - | RDO_Not_For_All - { - #PASS2 - { - $$ = RDOFUNGroupLogic::fgt_notforall; - } - } - ; + : RDO_Exist + { + #PASS2 + { + $$ = (int)RDOFUNGroupLogic::Type::EXIST; + } + } + | RDO_Not_Exist + { + #PASS2 + { + $$ = (int)RDOFUNGroupLogic::Type::NOTEXIST; + } + } + | RDO_For_All + { + #PASS2 + { + $$ = (int)RDOFUNGroupLogic::Type::FORALL; + } + } + | RDO_Not_For_All + { + #PASS2 + { + $$ = (int)RDOFUNGroupLogic::Type::NOTFORALL; + } + } + ; fun_select_logic - : fun_select_body '.' fun_select_keyword '(' fun_logic ')' - { - #PASS2 - { - LPRDOFUNSelect pSelect = PARSER->stack().pop($1); - LPRDOFUNLogic pLogic = PARSER->stack().pop ($5); - ASSERT(pSelect); - ASSERT(pLogic ); - pSelect->setSrcPos(@1, @6); - RDOParserSrcInfo srcInfo(@3, @5, ""); - - Context::Params params; - params["FunGroupType"] = (RDOFUNGroupLogic::FunGroupType)$3; - params["GroupLogic"] = pLogic; - Context::LPFindResult result = PARSER->context()->find("select()", params, srcInfo); - LPExpression pExpression = result->getCreateExpression()(); - ASSERT(pExpression); - LPRDOFUNLogic pLogicSelect = rdo::Factory::create(pExpression, false); - ASSERT(pLogicSelect); - pLogicSelect->setSrcInfo(srcInfo); - $$ = PARSER->stack().push(pLogicSelect); - } - } - | fun_select_body '.' fun_select_keyword '(' error - { - #PASS2 - { - PARSER->error().error(@4, @5, "Ошибка в логическом выражении"); - } - } - | fun_select_body '.' fun_select_keyword error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается открывающаяся скобка"); - } - } - | fun_select_body '.' RDO_Empty '(' ')' - { - #PASS2 - { - LPRDOFUNSelect pSelect = PARSER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo srcInfo(@3, @5, ""); - - Context::Params params; - params["FunGroupType"] = RDOFUNGroupLogic::fgt_empty; - Context::LPFindResult result = PARSER->context()->find("select()", params, srcInfo); - LPExpression pExpression = result->getCreateExpression()(); - ASSERT(pExpression); - LPRDOFUNLogic pLogic = rdo::Factory::create(pExpression, false); - ASSERT(pLogic); - pLogic->setSrcInfo(srcInfo); - $$ = PARSER->stack().push(pLogic); - } - } - | fun_select_body '.' RDO_Empty '(' error - { - #PASS2 - { - PARSER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - } - | fun_select_body '.' RDO_Empty error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается открывающаяся скобка"); - } - } - | fun_select_body '.' error - { - #PASS2 - { - PARSER->error().error(@2, @3, "Ожидается метод списка ресурсов"); - } - } - | fun_select_body error - { - #PASS2 - { - PARSER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); - } - } - ; + : fun_select_body '.' fun_select_keyword '(' fun_logic ')' + { + #PASS2 + { + LPRDOFUNSelect pSelect = PARSER->stack().pop($1); + LPRDOFUNLogic pLogic = PARSER->stack().pop ($5); + ASSERT(pSelect); + ASSERT(pLogic ); + pSelect->setSrcPos(@1, @6); + RDOParserSrcInfo srcInfo(@3, @5, ""); + + Context::Params params; + params["FunGroupType"] = static_cast($3); + params["GroupLogic"] = pLogic; + Context::LPFindResult result = PARSER->context()->find("select()", params, srcInfo); + LPExpression pExpression = result->getCreateExpression()(); + ASSERT(pExpression); + LPRDOFUNLogic pLogicSelect = rdo::Factory::create(pExpression, false); + ASSERT(pLogicSelect); + pLogicSelect->setSrcInfo(srcInfo); + $$ = PARSER->stack().push(pLogicSelect); + } + } + | fun_select_body '.' fun_select_keyword '(' error + { + #PASS2 + { + PARSER->error().error(@4, @5, "Ошибка в логическом выражении"); + } + } + | fun_select_body '.' fun_select_keyword error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается открывающаяся скобка"); + } + } + | fun_select_body '.' RDO_Empty '(' ')' + { + #PASS2 + { + LPRDOFUNSelect pSelect = PARSER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo srcInfo(@3, @5, ""); + + Context::Params params; + params["FunGroupType"] = RDOFUNGroupLogic::Type::EMPTY; + Context::LPFindResult result = PARSER->context()->find("select()", params, srcInfo); + LPExpression pExpression = result->getCreateExpression()(); + ASSERT(pExpression); + LPRDOFUNLogic pLogic = rdo::Factory::create(pExpression, false); + ASSERT(pLogic); + pLogic->setSrcInfo(srcInfo); + $$ = PARSER->stack().push(pLogic); + } + } + | fun_select_body '.' RDO_Empty '(' error + { + #PASS2 + { + PARSER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + } + | fun_select_body '.' RDO_Empty error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается открывающаяся скобка"); + } + } + | fun_select_body '.' error + { + #PASS2 + { + PARSER->error().error(@2, @3, "Ожидается метод списка ресурсов"); + } + } + | fun_select_body error + { + #PASS2 + { + PARSER->error().error(@1, "Ожидается '.' (точка) для вызова метода списка ресурсов"); + } + } + ; fun_select_arithm - : fun_select_body '.' RDO_Size '(' ')' - { - #PASS2 - { - LPRDOFUNSelect pSelect = PARSER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo srcInfo(@3, @5, ""); - - Context::Params params; - params["FunGroupType"] = RDOFUNGroupLogic::fgt_size; - Context::LPFindResult result = PARSER->context()->find("select()", params, srcInfo); - LPExpression pExpression = result->getCreateExpression()(); - ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); - pArithm->setSrcInfo(srcInfo); - $$ = PARSER->stack().push(pArithm); - } - } - | fun_select_body '.' RDO_Size error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается открывающаяся скобка"); - } - } - | fun_select_body '.' RDO_Size '(' error - { - #PASS2 - { - PARSER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - } - | fun_select_body '.' RDO_Select_Array '(' ')' - { - #PASS2 - { - LPRDOFUNSelect pSelect = PARSER->stack().pop($1); - ASSERT(pSelect); - pSelect->setSrcPos(@1, @5); - RDOParserSrcInfo srcInfo(@3, @5, ""); - - Context::Params params; - params["FunGroupType"] = RDOFUNGroupLogic::fgt_array; - Context::LPFindResult result = PARSER->context()->find("select()", params, srcInfo); - LPExpression pExpression = result->getCreateExpression()(); - ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); - pArithm->setSrcInfo(srcInfo); - $$ = PARSER->stack().push(pArithm); - } - } - | fun_select_body '.' RDO_Select_Array error - { - #PASS2 - { - PARSER->error().error(@3, "Ожидается открывающаяся скобка"); - } - } - | fun_select_body '.' RDO_Select_Array '(' error - { - #PASS2 - { - PARSER->error().error(@4, "Ожидается закрывающаяся скобка"); - } - } - ; + : fun_select_body '.' RDO_Size '(' ')' + { + #PASS2 + { + LPRDOFUNSelect pSelect = PARSER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo srcInfo(@3, @5, ""); + + Context::Params params; + params["FunGroupType"] = RDOFUNGroupLogic::Type::SIZE; + Context::LPFindResult result = PARSER->context()->find("select()", params, srcInfo); + LPExpression pExpression = result->getCreateExpression()(); + ASSERT(pExpression); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); + pArithm->setSrcInfo(srcInfo); + $$ = PARSER->stack().push(pArithm); + } + } + | fun_select_body '.' RDO_Size error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается открывающаяся скобка"); + } + } + | fun_select_body '.' RDO_Size '(' error + { + #PASS2 + { + PARSER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + } + | fun_select_body '.' RDO_Select_Array '(' ')' + { + #PASS2 + { + LPRDOFUNSelect pSelect = PARSER->stack().pop($1); + ASSERT(pSelect); + pSelect->setSrcPos(@1, @5); + RDOParserSrcInfo srcInfo(@3, @5, ""); + + Context::Params params; + params["FunGroupType"] = RDOFUNGroupLogic::Type::ARRAY; + Context::LPFindResult result = PARSER->context()->find("select()", params, srcInfo); + LPExpression pExpression = result->getCreateExpression()(); + ASSERT(pExpression); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); + pArithm->setSrcInfo(srcInfo); + $$ = PARSER->stack().push(pArithm); + } + } + | fun_select_body '.' RDO_Select_Array error + { + #PASS2 + { + PARSER->error().error(@3, "Ожидается открывающаяся скобка"); + } + } + | fun_select_body '.' RDO_Select_Array '(' error + { + #PASS2 + { + PARSER->error().error(@4, "Ожидается закрывающаяся скобка"); + } + } + ; %% diff --git a/simulator/compiler/parser/namespace.h b/simulator/compiler/parser/namespace.h index 46c36a566..63c31f72b 100644 --- a/simulator/compiler/parser/namespace.h +++ b/simulator/compiler/parser/namespace.h @@ -1,13 +1,8 @@ -#ifndef _SIMULATOR_COMPILER_PARSER_NAMESPACE_H_ -#define _SIMULATOR_COMPILER_PARSER_NAMESPACE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS // -------------------------------------------------------------------------------- -//! \namespace rdo::compiler::parser -//! \brief Пространство имён парсера #define OPEN_RDO_PARSER_NAMESPACE namespace rdo { namespace compiler { namespace parser { #define CLOSE_RDO_PARSER_NAMESPACE }}}; - -#endif // _SIMULATOR_COMPILER_PARSER_NAMESPACE_H_ diff --git a/simulator/compiler/parser/param.cpp b/simulator/compiler/parser/param.cpp index 9c6806dab..0a9c4ab13 100644 --- a/simulator/compiler/parser/param.cpp +++ b/simulator/compiler/parser/param.cpp @@ -18,21 +18,21 @@ OPEN_RDO_PARSER_NAMESPACE const std::string RDOParam::CONTEXT_PARAM_PARAM_ID = "param_id"; RDOParam::RDOParam(const std::string& name, const LPTypeInfo& pType, const LPRDOValue& pDefault) - : RDOParserSrcInfo(name ) - , m_pType (pType ) - , m_pDefault (pDefault) - , m_defined (false) + : RDOParserSrcInfo(name ) + , m_pType (pType ) + , m_pDefault (pDefault) + , m_defined (false) { - checkDefault(); + checkDefault(); } RDOParam::RDOParam(const RDOParserSrcInfo& srcInfo, const LPTypeInfo& pType, const LPRDOValue& pDefault) - : RDOParserSrcInfo(srcInfo ) - , m_pType (pType ) - , m_pDefault (pDefault) - , m_defined (false) + : RDOParserSrcInfo(srcInfo ) + , m_pType (pType ) + , m_pDefault (pDefault) + , m_defined (false) { - checkDefault(); + checkDefault(); } RDOParam::~RDOParam() @@ -40,11 +40,11 @@ RDOParam::~RDOParam() void RDOParam::checkDefault() { - if (m_pDefault && m_pDefault->defined()) - { - m_pType->itype()->type_cast(m_pDefault->typeInfo()->itype(), m_pDefault->src_info(), this->src_info(), m_pDefault->src_info()); - m_pDefault = m_pType->itype()->value_cast(m_pDefault, this->src_info(), m_pDefault->src_info()); - } + if (m_pDefault && m_pDefault->defined()) + { + m_pType->itype()->type_cast(m_pDefault->typeInfo()->itype(), m_pDefault->src_info(), this->src_info(), m_pDefault->src_info()); + m_pDefault = m_pType->itype()->value_cast(m_pDefault, this->src_info(), m_pDefault->src_info()); + } } namespace @@ -52,36 +52,35 @@ namespace LPExpression contextGetParam(const rdo::runtime::LPRDOCalc& resource, std::size_t paramID, const LPTypeInfo& paramType, const RDOParserSrcInfo& srcInfo) { - return rdo::Factory::create( - paramType, - rdo::Factory::create(resource, paramID), - srcInfo - ); + return rdo::Factory::create( + paramType, + rdo::Factory::create(resource, paramID), + srcInfo + ); } -template +template LPExpression contextSetParam(const rdo::runtime::LPRDOCalc& getResource, const LPTypeInfo& pTypeInfo, const std::size_t paramID, const rdo::runtime::LPRDOCalc& rightValue, const RDOParserSrcInfo& srcInfo) { - rdo::runtime::LPRDOCalc setParamCalc = rdo::Factory >::create(getResource, paramID, rightValue); - - //! Проверка на диапазон - LPRDOTypeIntRange pTypeIntRange = pTypeInfo->itype().object_dynamic_cast(); - if (pTypeIntRange) - { - setParamCalc = rdo::Factory::create(pTypeIntRange->range()->getMin()->value(), pTypeIntRange->range()->getMax()->value(), setParamCalc); - } - - LPRDOTypeRealRange pTypeRealRange = pTypeInfo->itype().object_dynamic_cast(); - if (pTypeRealRange) - { - setParamCalc = rdo::Factory::create(pTypeRealRange->range()->getMin()->value(), pTypeRealRange->range()->getMax()->value(), setParamCalc); - } - - return rdo::Factory::create( - pTypeInfo, - setParamCalc, - srcInfo - ); + rdo::runtime::LPRDOCalc setParamCalc = rdo::Factory >::create(getResource, paramID, rightValue); + + LPRDOTypeIntRange pTypeIntRange = pTypeInfo->itype().object_dynamic_cast(); + if (pTypeIntRange) + { + setParamCalc = rdo::Factory::create(pTypeIntRange->range()->getMin()->value(), pTypeIntRange->range()->getMax()->value(), setParamCalc); + } + + LPRDOTypeRealRange pTypeRealRange = pTypeInfo->itype().object_dynamic_cast(); + if (pTypeRealRange) + { + setParamCalc = rdo::Factory::create(pTypeRealRange->range()->getMin()->value(), pTypeRealRange->range()->getMax()->value(), setParamCalc); + } + + return rdo::Factory::create( + pTypeInfo, + setParamCalc, + srcInfo + ); } @@ -89,64 +88,64 @@ LPExpression contextSetParam(const rdo::runtime::LPRDOCalc& getResource, const L Context::LPFindResult RDOParam::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const { - if (method == Context::METHOD_GET) - { - LPExpression resource = params.get(RDORSSResource::GET_RESOURCE); - const std::size_t paramID = params.get(RDOParam::CONTEXT_PARAM_PARAM_ID); - return rdo::Factory::create(CreateExpression(boost::bind(&contextGetParam, resource->calc(), paramID, getTypeInfo(), srcInfo))); - } - - if (method == Context::METHOD_SET) - { - using namespace rdo::runtime; - const LPExpression resource = params.get(RDORSSResource::GET_RESOURCE); - const std::size_t paramID = params.get(RDOParam::CONTEXT_PARAM_PARAM_ID); - const LPRDOCalc rightValue = params.exists(Expression::CONTEXT_PARAM_SET_EXPRESSION) - ? params.get(Expression::CONTEXT_PARAM_SET_EXPRESSION)->calc() - : params.get(RDOFUNArithm::CONTEXT_PARAM_SET_ARITHM)->createCalc(getTypeInfo()); - - const LPRDOCalc paramValue = rdo::Factory::create(CreateExpression - (boost::bind(&contextGetParam, resource->calc(), paramID, getTypeInfo(), srcInfo)) - )->getCreateExpression()()->calc(); - - LPRDOCalc operationResult; - - if (params.get(Expression::CONTEXT_PARAM_SET_OPERATION_TYPE) == SetOperationType::SET) - { - LPRDOParam pThis(const_cast(this)); - pThis->setDefined(true); - } - - switch (params.get(Expression::CONTEXT_PARAM_SET_OPERATION_TYPE)) - { - case SetOperationType::NOCHANGE : - return rdo::Factory::create(CreateExpression(boost::bind(&contextSetParam, resource->calc(), getTypeInfo(), paramID, rightValue, srcInfo))); - case SetOperationType::SET : - operationResult = rightValue; - break; - case SetOperationType::ADDITION : - operationResult = rdo::Factory::create(paramValue, rightValue); - break; - case SetOperationType::SUBTRACTION: - operationResult = rdo::Factory::create(paramValue, rightValue); - break; - case SetOperationType::MULTIPLY : - operationResult = rdo::Factory::create(paramValue, rightValue); - break; - case SetOperationType::DIVIDE : - operationResult = rdo::Factory::create(paramValue, rightValue); - break; - case SetOperationType::INCREMENT : - operationResult = rdo::Factory::create(paramValue, rdo::Factory::create(1)); - break; - case SetOperationType::DECRIMENT : - operationResult = rdo::Factory::create(paramValue, rdo::Factory::create(1)); - break; - } - ASSERT(operationResult); - return rdo::Factory::create(CreateExpression(boost::bind(&contextSetParam, resource->calc(), getTypeInfo(), paramID, operationResult, srcInfo))); - } - return rdo::Factory::create(); + if (method == Context::METHOD_GET) + { + LPExpression resource = params.get(RDORSSResource::GET_RESOURCE); + const std::size_t paramID = params.get(RDOParam::CONTEXT_PARAM_PARAM_ID); + return rdo::Factory::create(CreateExpression(boost::bind(&contextGetParam, resource->calc(), paramID, getTypeInfo(), srcInfo))); + } + + if (method == Context::METHOD_SET) + { + using namespace rdo::runtime; + const LPExpression resource = params.get(RDORSSResource::GET_RESOURCE); + const std::size_t paramID = params.get(RDOParam::CONTEXT_PARAM_PARAM_ID); + const LPRDOCalc rightValue = params.exists(Expression::CONTEXT_PARAM_SET_EXPRESSION) + ? params.get(Expression::CONTEXT_PARAM_SET_EXPRESSION)->calc() + : params.get(RDOFUNArithm::CONTEXT_PARAM_SET_ARITHM)->createCalc(getTypeInfo()); + + const LPRDOCalc paramValue = rdo::Factory::create(CreateExpression + (boost::bind(&contextGetParam, resource->calc(), paramID, getTypeInfo(), srcInfo)) + )->getCreateExpression()()->calc(); + + LPRDOCalc operationResult; + + if (params.get(Expression::CONTEXT_PARAM_SET_OPERATION_TYPE) == SetOperation::Type::SET) + { + LPRDOParam pThis(const_cast(this)); + pThis->setDefined(true); + } + + switch (params.get(Expression::CONTEXT_PARAM_SET_OPERATION_TYPE)) + { + case SetOperation::Type::NOCHANGE : + return rdo::Factory::create(CreateExpression(boost::bind(&contextSetParam, resource->calc(), getTypeInfo(), paramID, rightValue, srcInfo))); + case SetOperation::Type::SET : + operationResult = rightValue; + break; + case SetOperation::Type::ADDITION : + operationResult = rdo::Factory::create(paramValue, rightValue); + break; + case SetOperation::Type::SUBTRACTION: + operationResult = rdo::Factory::create(paramValue, rightValue); + break; + case SetOperation::Type::MULTIPLY : + operationResult = rdo::Factory::create(paramValue, rightValue); + break; + case SetOperation::Type::DIVIDE : + operationResult = rdo::Factory::create(paramValue, rightValue); + break; + case SetOperation::Type::INCREMENT : + operationResult = rdo::Factory::create(paramValue, rdo::Factory::create(1)); + break; + case SetOperation::Type::DECRIMENT : + operationResult = rdo::Factory::create(paramValue, rdo::Factory::create(1)); + break; + } + ASSERT(operationResult); + return rdo::Factory::create(CreateExpression(boost::bind(&contextSetParam, resource->calc(), getTypeInfo(), paramID, operationResult, srcInfo))); + } + return rdo::Factory::create(); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/param.h b/simulator/compiler/parser/param.h index 1973ae645..360ead7bd 100644 --- a/simulator/compiler/parser/param.h +++ b/simulator/compiler/parser/param.h @@ -1,5 +1,4 @@ -#ifndef _PARSER_PARAM_H_ -#define _PARSER_PARAM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,37 +15,35 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- RDOParam // -------------------------------------------------------------------------------- class RDOParam - : public virtual rdo::counter_reference - , public RDOParserSrcInfo - , public Context - , public IContextFind + : public virtual rdo::counter_reference + , public RDOParserSrcInfo + , public Context + , public IContextFind { DECLARE_FACTORY(RDOParam) public: - static const std::string CONTEXT_PARAM_PARAM_ID; + static const std::string CONTEXT_PARAM_PARAM_ID; - const std::string& name() const { return src_info().src_text(); } - LPTypeInfo getTypeInfo() const { return m_pType; } - const LPRDOValue& getDefault () const { return m_pDefault; } - bool getDefined() const { return m_defined; } - void setDefined(bool defined) { m_defined = defined; } + const std::string& name() const { return src_info().src_text(); } + LPTypeInfo getTypeInfo() const { return m_pType; } + const LPRDOValue& getDefault () const { return m_pDefault; } + bool getDefined() const { return m_defined; } + void setDefined(bool defined) { m_defined = defined; } protected: - RDOParam(const std::string& name, const LPTypeInfo& pType, const LPRDOValue& pDefault = LPRDOValue(NULL)); - RDOParam(const RDOParserSrcInfo& srcInfo, const LPTypeInfo& pType, const LPRDOValue& pDefault = LPRDOValue(NULL)); - virtual ~RDOParam(); + RDOParam(const std::string& name, const LPTypeInfo& pType, const LPRDOValue& pDefault = LPRDOValue(NULL)); + RDOParam(const RDOParserSrcInfo& srcInfo, const LPTypeInfo& pType, const LPRDOValue& pDefault = LPRDOValue(NULL)); + virtual ~RDOParam(); private: - LPTypeInfo m_pType; - LPRDOValue m_pDefault; - bool m_defined; + LPTypeInfo m_pType; + LPRDOValue m_pDefault; + bool m_defined; - void checkDefault(); + void checkDefault(); - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; DECLARE_POINTER(RDOParam); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _PARSER_PARAM_H_ diff --git a/simulator/compiler/parser/parser/std_fun.cpp b/simulator/compiler/parser/parser/std_fun.cpp index 85418baa1..2d6241cfa 100644 --- a/simulator/compiler/parser/parser/std_fun.cpp +++ b/simulator/compiler/parser/parser/std_fun.cpp @@ -20,68 +20,68 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------------------------------------------------------------------- double cotan(double value) { - return 1.0 / tan(value); + return 1.0 / tan(value); } int intLocal(int value) { - return value; + return value; } double specValueConvert(double value) { - if (boost::math::isnan(value)) - { - return std::numeric_limits::quiet_NaN(); - } - else if (boost::math::isinf(value)) - { - return std::numeric_limits::infinity(); - } - return value; + if (boost::math::isnan(value)) + { + return std::numeric_limits::quiet_NaN(); + } + else if (boost::math::isinf(value)) + { + return std::numeric_limits::infinity(); + } + return value; } double logLocal(double value) { - return specValueConvert(log(value)); + return specValueConvert(log(value)); } double log10Local(double value) { - return specValueConvert(log10(value)); + return specValueConvert(log10(value)); } double log2Local(double value) { - return specValueConvert(log(value) / log(2.0)); + return specValueConvert(log(value) / log(2.0)); } double logNLocal(double value1, double value2) { - return specValueConvert(log(value1) / log(value2)); + return specValueConvert(log(value1) / log(value2)); } template T maxLocal(T value1, T value2) { - return value1 > value2 ? value1 : value2; + return value1 > value2 ? value1 : value2; } template T minLocal(T value1, T value2) { - return value1 < value2 ? value1 : value2; + return value1 < value2 ? value1 : value2; } double modf(double value) { - double tmp; - return ::modf(value, &tmp); + double tmp; + return ::modf(value, &tmp); } int roundLocal(double value) { - return (int)floor(value + 0.5); + return (int)floor(value + 0.5); } //#define SPEED_TEST @@ -92,134 +92,134 @@ int roundLocal(double value) class MaxCalc: public rdo::runtime::RDOFunCalc { private: - rdo::runtime::RDOValue& doCalc(rdo::runtime::RDORuntime* pRuntime) - { - m_value = max(pRuntime->getFuncArgument(0).getDouble(), pRuntime->getFuncArgument(1).getDouble()); - return m_value; - } + rdo::runtime::RDOValue& doCalc(rdo::runtime::RDORuntime* pRuntime) + { + m_value = max(pRuntime->getFuncArgument(0).getDouble(), pRuntime->getFuncArgument(1).getDouble()); + return m_value; + } }; class Test: public rdo::runtime::RDOFunCalc { public: - rdo::runtime::RDOValue& doCalc(rdo::runtime::RDORuntime* runtime) - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(); - ASSERT(pCalc); + rdo::runtime::RDOValue& doCalc(rdo::runtime::RDORuntime* runtime) + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(); + ASSERT(pCalc); - boost::posix_time::ptime tnow = boost::posix_time::microsec_clock::local_time(); - const std::size_t tnow1 = rdo::runtime::RDOSimulatorBase::getMSec(tnow); + boost::posix_time::ptime tnow = boost::posix_time::microsec_clock::local_time(); + const std::size_t tnow1 = rdo::runtime::RDOSimulatorBase::getMSec(tnow); - for (std::size_t i = 0; i < 10000000; i++) - { - pCalc->calcValue(runtime); - } + for (std::size_t i = 0; i < 10000000; i++) + { + pCalc->calcValue(runtime); + } - tnow = boost::posix_time::microsec_clock::local_time(); - const std::size_t tnow2 = rdo::runtime::RDOSimulatorBase::getMSec(tnow); - const std::size_t delta = tnow2 - tnow1; - YYLTYPE pos = {1, 1, 1, 1, 1, 1}; - RDOParser::s_parser()->error().error(RDOParserSrcInfo(pos), rdo::format("delay %d", delta)); + tnow = boost::posix_time::microsec_clock::local_time(); + const std::size_t tnow2 = rdo::runtime::RDOSimulatorBase::getMSec(tnow); + const std::size_t delta = tnow2 - tnow1; + YYLTYPE pos = {1, 1, 1, 1, 1, 1}; + RDOParser::s_parser()->error().error(RDOParserSrcInfo(pos), rdo::format("delay %d", delta)); - return m_value; - } + return m_value; + } }; #endif void RDOParserSTDFUN::generate(const std::string& name, const rdo::runtime::LPRDOFunCalc& pCalc, const LPRDOParam& pReturnType, const ParamList& paramList) const { - const std::string nameLower = boost::algorithm::to_lower_copy(name); - generateReal(name, pCalc, pReturnType, paramList); - generateReal(nameLower, pCalc, pReturnType, paramList); + const std::string nameLower = boost::algorithm::to_lower_copy(name); + generateReal(name, pCalc, pReturnType, paramList); + generateReal(nameLower, pCalc, pReturnType, paramList); } void RDOParserSTDFUN::generateReal(const std::string& name, const rdo::runtime::LPRDOFunCalc& pCalc, const LPRDOParam& pReturnType, const ParamList& paramList) const { - ASSERT(pCalc); + ASSERT(pCalc); - LPRDOFUNFunction pFunction = rdo::Factory::create(name, pReturnType); - ASSERT(pFunction); + LPRDOFUNFunction pFunction = rdo::Factory::create(name, pReturnType); + ASSERT(pFunction); - LPIContextParamDefinitionManager pParamDefinitionManager = pFunction.interface_dynamic_cast(); - ASSERT(pParamDefinitionManager); - pParamDefinitionManager->pushParamDefinitionContext(); + LPIContextParamDefinitionManager pParamDefinitionManager = pFunction.interface_dynamic_cast(); + ASSERT(pParamDefinitionManager); + pParamDefinitionManager->pushParamDefinitionContext(); - LPContext pContext = RDOParser::s_parser()->context(); - ASSERT(pContext); - LPContextParamDefinition pContextParamDefinition = pContext->cast(); - ASSERT(pContextParamDefinition); + LPContext pContext = RDOParser::s_parser()->context(); + ASSERT(pContext); + LPContextParamDefinition pContextParamDefinition = pContext->cast(); + ASSERT(pContextParamDefinition); - std::size_t paramIndex = 1; - for (const auto& param: paramList) - { - LPRDOParam pParam = rdo::Factory::create(rdo::format("p%d", paramIndex), param); - ASSERT(pParam); - pContextParamDefinition->pushParam(pParam); - paramIndex++; - } + std::size_t paramIndex = 1; + for (const auto& param: paramList) + { + LPRDOParam pParam = rdo::Factory::create(rdo::format("p%d", paramIndex), param); + ASSERT(pParam); + pContextParamDefinition->pushParam(pParam); + paramIndex++; + } - pParamDefinitionManager->popParamDefinitionContext(); + pParamDefinitionManager->popParamDefinitionContext(); - pFunction->setFunctionCalc(pCalc); - pFunction->end(); + pFunction->setFunctionCalc(pCalc); + pFunction->end(); } void RDOParserSTDFUN::parse(const LPRDOParser& /*pParser*/) { - typedef rdo::runtime::std_fun1 StdFun_D_D; - typedef rdo::runtime::std_fun2 StdFun_D_DD; - typedef rdo::runtime::std_fun2 StdFun_D_DI; - typedef rdo::runtime::std_fun1 StdFun_I_I; - typedef rdo::runtime::std_fun2 StdFun_I_II; - typedef rdo::runtime::std_fun1 StdFun_I_D; - - typedef rdo::runtime::RDOFunCalcStd Function_D_D; - typedef rdo::runtime::RDOFunCalcStd Function_D_DD; - typedef rdo::runtime::RDOFunCalcStd Function_D_DI; - typedef rdo::runtime::RDOFunCalcStd Function_I_I; - typedef rdo::runtime::RDOFunCalcStd Function_I_II; - typedef rdo::runtime::RDOFunCalcStd Function_I_D; - - LPTypeInfo intType = rdo::Factory::delegate(RDOParserSrcInfo()); - LPTypeInfo realType = rdo::Factory::delegate(RDOParserSrcInfo()); - LPRDOParam pIntReturn = rdo::Factory::create(RDOParserSrcInfo(), intType ); - LPRDOParam pRealReturn = rdo::Factory::create(RDOParserSrcInfo(), realType); - - generate("Abs", rdo::Factory ::create(fabs), pRealReturn, ParamList(realType)); - generate("ArcCos", rdo::Factory ::create(acos), pRealReturn, ParamList(realType)); - generate("ArcSin", rdo::Factory ::create(asin), pRealReturn, ParamList(realType)); - generate("ArcTan", rdo::Factory ::create(atan), pRealReturn, ParamList(realType)); - generate("Cos", rdo::Factory ::create(cos), pRealReturn, ParamList(realType)); - generate("Cotan", rdo::Factory ::create(cotan), pRealReturn, ParamList(realType)); - generate("Exp", rdo::Factory ::create(exp), pRealReturn, ParamList(realType)); - generate("Floor", rdo::Factory ::create(floor), pIntReturn, ParamList(realType)); - generate("Frac", rdo::Factory ::create(modf), pRealReturn, ParamList(realType)); - generate("IAbs", rdo::Factory ::create(static_cast(abs)), - pIntReturn, ParamList(intType)); - generate("IMax", rdo::Factory::create(maxLocal), pIntReturn, ParamList(intType)(intType)); - generate("IMin", rdo::Factory::create(minLocal), pIntReturn, ParamList(intType)(intType)); - generate("Int", rdo::Factory ::create(intLocal), pIntReturn, ParamList(realType)); - generate("IntPower", rdo::Factory::create(static_cast(std::pow)), - pRealReturn, ParamList(realType)(intType)); - generate("Ln", rdo::Factory ::create(logLocal), pRealReturn, ParamList(realType)); - generate("Log10", rdo::Factory ::create(log10Local), pRealReturn, ParamList(realType)); - generate("Log2", rdo::Factory ::create(log2Local), pRealReturn, ParamList(realType)); - generate("LogN", rdo::Factory::create(logNLocal), pRealReturn, ParamList(realType)(realType)); - generate("Max", rdo::Factory::create(maxLocal), - pRealReturn, ParamList(realType)(realType)); - generate("Min", rdo::Factory::create(minLocal), - pRealReturn, ParamList(realType)(realType)); - generate("Power", rdo::Factory::create(static_cast(pow)), - pRealReturn, ParamList(realType)(realType)); - generate("Round", rdo::Factory ::create(roundLocal), pIntReturn, ParamList(realType)); - generate("Sin", rdo::Factory ::create(sin), pRealReturn, ParamList(realType)); - generate("Sqrt", rdo::Factory ::create(sqrt), pRealReturn, ParamList(realType)); - generate("Tan", rdo::Factory ::create(tan), pRealReturn, ParamList(realType)); + typedef rdo::runtime::std_fun1 StdFun_D_D; + typedef rdo::runtime::std_fun2 StdFun_D_DD; + typedef rdo::runtime::std_fun2 StdFun_D_DI; + typedef rdo::runtime::std_fun1 StdFun_I_I; + typedef rdo::runtime::std_fun2 StdFun_I_II; + typedef rdo::runtime::std_fun1 StdFun_I_D; + + typedef rdo::runtime::RDOFunCalcStd Function_D_D; + typedef rdo::runtime::RDOFunCalcStd Function_D_DD; + typedef rdo::runtime::RDOFunCalcStd Function_D_DI; + typedef rdo::runtime::RDOFunCalcStd Function_I_I; + typedef rdo::runtime::RDOFunCalcStd Function_I_II; + typedef rdo::runtime::RDOFunCalcStd Function_I_D; + + LPTypeInfo intType = rdo::Factory::delegate(RDOParserSrcInfo()); + LPTypeInfo realType = rdo::Factory::delegate(RDOParserSrcInfo()); + LPRDOParam pIntReturn = rdo::Factory::create(RDOParserSrcInfo(), intType ); + LPRDOParam pRealReturn = rdo::Factory::create(RDOParserSrcInfo(), realType); + + generate("Abs", rdo::Factory ::create(fabs), pRealReturn, {realType}); + generate("ArcCos", rdo::Factory ::create(acos), pRealReturn, {realType}); + generate("ArcSin", rdo::Factory ::create(asin), pRealReturn, {realType}); + generate("ArcTan", rdo::Factory ::create(atan), pRealReturn, {realType}); + generate("Cos", rdo::Factory ::create(cos), pRealReturn, {realType}); + generate("Cotan", rdo::Factory ::create(cotan), pRealReturn, {realType}); + generate("Exp", rdo::Factory ::create(exp), pRealReturn, {realType}); + generate("Floor", rdo::Factory ::create(floor), pIntReturn, {realType}); + generate("Frac", rdo::Factory ::create(modf), pRealReturn, {realType}); + generate("IAbs", rdo::Factory ::create(static_cast(abs)), + pIntReturn, {intType}); + generate("IMax", rdo::Factory::create(maxLocal), pIntReturn, {intType, intType}); + generate("IMin", rdo::Factory::create(minLocal), pIntReturn, {intType, intType}); + generate("Int", rdo::Factory ::create(intLocal), pIntReturn, {realType}); + generate("IntPower", rdo::Factory::create(static_cast(std::pow)), + pRealReturn, {realType, intType}); + generate("Ln", rdo::Factory ::create(logLocal), pRealReturn, {realType}); + generate("Log10", rdo::Factory ::create(log10Local), pRealReturn, {realType}); + generate("Log2", rdo::Factory ::create(log2Local), pRealReturn, {realType}); + generate("LogN", rdo::Factory::create(logNLocal), pRealReturn, {realType, realType}); + generate("Max", rdo::Factory::create(maxLocal), + pRealReturn, {realType, realType}); + generate("Min", rdo::Factory::create(minLocal), + pRealReturn, {realType, realType}); + generate("Power", rdo::Factory::create(static_cast(pow)), + pRealReturn, {realType, realType}); + generate("Round", rdo::Factory ::create(roundLocal), pIntReturn, {realType}); + generate("Sin", rdo::Factory ::create(sin), pRealReturn, {realType}); + generate("Sqrt", rdo::Factory ::create(sqrt), pRealReturn, {realType}); + generate("Tan", rdo::Factory ::create(tan), pRealReturn, {realType}); #ifndef SPEED_TEST #else - fun->setFunctionCalc(rdo::Factory::create()); + fun->setFunctionCalc(rdo::Factory::create()); #endif } diff --git a/simulator/compiler/parser/parser/std_fun.h b/simulator/compiler/parser/parser/std_fun.h index c89d5824b..e78eb3348 100644 --- a/simulator/compiler/parser/parser/std_fun.h +++ b/simulator/compiler/parser/parser/std_fun.h @@ -1,8 +1,8 @@ -#ifndef _RDOPARSER_STD_FUN_H_ -#define _RDOPARSER_STD_FUN_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include +#include // ----------------------------------------------------------------------- SYNOPSIS #include "simulator/compiler/parser/rdoparser_rdo.h" #include "simulator/compiler/parser/param.h" @@ -18,17 +18,15 @@ class RDOParserSTDFUN: public RDOParserItem { DECLARE_FACTORY(RDOParserSTDFUN); private: - RDOParserSTDFUN() - : RDOParserItem(rdo::model::FUN, NULL, NULL) - {} + RDOParserSTDFUN() + : RDOParserItem(rdo::FileType::FUN, NULL, NULL) + {} - virtual void parse(const LPRDOParser& pParser); + virtual void parse(const LPRDOParser& pParser); - typedef rdo::vector ParamList; - void generate(const std::string& name, const rdo::runtime::LPRDOFunCalc& pCalc, const LPRDOParam& pReturnType, const ParamList& paramList) const; - void generateReal(const std::string& name, const rdo::runtime::LPRDOFunCalc& pCalc, const LPRDOParam& pReturnType, const ParamList& paramList) const; + typedef std::vector ParamList; + void generate(const std::string& name, const rdo::runtime::LPRDOFunCalc& pCalc, const LPRDOParam& pReturnType, const ParamList& paramList) const; + void generateReal(const std::string& name, const rdo::runtime::LPRDOFunCalc& pCalc, const LPRDOParam& pReturnType, const ParamList& paramList) const; }; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_STD_FUN_H_ diff --git a/simulator/compiler/parser/pch.h b/simulator/compiler/parser/pch.h index 4c6c982f0..52ebee86e 100644 --- a/simulator/compiler/parser/pch.h +++ b/simulator/compiler/parser/pch.h @@ -1,15 +1,14 @@ -#ifndef _PARSER_PCH_H_ -#define _PARSER_PCH_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM #include "utils/src/common/platform.h" #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable: 4786) + #pragma warning(disable: 4786) #endif // COMPILER_VISUAL_STUDIO -#ifndef WINVER //! Allow use of features specific to Windows XP or later. - #define WINVER 0x0501 //! Change this to the appropriate value to target other versions of Windows. +#ifndef WINVER // Allow use of features specific to Windows XP or later. + #define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. #endif // ----------------------------------------------------------------------- INCLUDES #include @@ -28,5 +27,3 @@ #include "utils/src/common/rdocommon.h" #include "utils/src/debug/rdodebug.h" // -------------------------------------------------------------------------------- - -#endif // _PARSER_PCH_H_ diff --git a/simulator/compiler/parser/rdo_array.cpp b/simulator/compiler/parser/rdo_array.cpp index 48f73cb57..53fe39073 100644 --- a/simulator/compiler/parser/rdo_array.cpp +++ b/simulator/compiler/parser/rdo_array.cpp @@ -14,7 +14,7 @@ OPEN_RDO_PARSER_NAMESPACE //---------- RDOArrayValue //---------------------------------------------------------------------------- RDOArrayValue::RDOArrayValue(const LPRDOArrayType& pArrayType) - : m_pArrayType(pArrayType) + : m_pArrayType(pArrayType) {} RDOArrayValue::~RDOArrayValue() @@ -22,62 +22,62 @@ RDOArrayValue::~RDOArrayValue() void RDOArrayValue::insertItem(const LPRDOValue& pValue) { - ASSERT(pValue); + ASSERT(pValue); - m_pArrayType->getItemType()->itype()->type_cast(pValue->typeInfo()->itype(), pValue->src_info(), m_pArrayType->src_info(), pValue->src_info()); - LPRDOValue pItemValue = m_pArrayType->getItemType()->itype()->value_cast(pValue, m_pArrayType->src_info(), pValue->src_info()); - ASSERT(pItemValue); - m_container.push_back(pItemValue); + m_pArrayType->getItemType()->itype()->type_cast(pValue->typeInfo()->itype(), pValue->src_info(), m_pArrayType->src_info(), pValue->src_info()); + LPRDOValue pItemValue = m_pArrayType->getItemType()->itype()->value_cast(pValue, m_pArrayType->src_info(), pValue->src_info()); + ASSERT(pItemValue); + m_container.push_back(pItemValue); } const LPRDOArrayType& RDOArrayValue::getArrayType() const { - return m_pArrayType; + return m_pArrayType; } LPRDOArrayType& RDOArrayValue::getArrayType() { - return m_pArrayType; + return m_pArrayType; } rdo::runtime::RDOValue RDOArrayValue::getRArray() const { - return rdo::runtime::RDOValue(m_pArrayType, createRuntimeValue()); + return rdo::runtime::RDOValue(m_pArrayType, createRuntimeValue()); } rdo::runtime::LPRDOArrayValue RDOArrayValue::createRuntimeValue() const { - rdo::runtime::LPRDOArrayValue pArrayValue = rdo::Factory::create( - m_pArrayType.object_dynamic_cast()); - ASSERT(pArrayValue); - for (const auto& item: m_container) - { - pArrayValue->push_back(item->value()); - } - return pArrayValue; + rdo::runtime::LPRDOArrayValue pArrayValue = rdo::Factory::create( + m_pArrayType.object_dynamic_cast()); + ASSERT(pArrayValue); + for (const auto& item: m_container) + { + pArrayValue->push_back(item->value()); + } + return pArrayValue; } std::string RDOArrayValue::getAsString() const { - std::string arrayValue; + std::string arrayValue; - for (Container::const_iterator it = m_container.begin(); it != m_container.end(); ++it) - { - if (it == m_container.begin()) - { - arrayValue = rdo::format("[%s", (*it)->value().getAsString().c_str()); - } - else - { - arrayValue = rdo::format("%s, %s", arrayValue.c_str(), (*it)->value().getAsString().c_str()); - } - } - return rdo::format("%s]", arrayValue.c_str()); + for (Container::const_iterator it = m_container.begin(); it != m_container.end(); ++it) + { + if (it == m_container.begin()) + { + arrayValue = rdo::format("[%s", (*it)->value().getAsString().c_str()); + } + else + { + arrayValue = rdo::format("%s, %s", arrayValue.c_str(), (*it)->value().getAsString().c_str()); + } + } + return rdo::format("%s]", arrayValue.c_str()); } const RDOArrayValue::Container& RDOArrayValue::getContainer() const { - return m_container; + return m_container; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdo_array.h b/simulator/compiler/parser/rdo_array.h index fe5328f67..21fb600a3 100644 --- a/simulator/compiler/parser/rdo_array.h +++ b/simulator/compiler/parser/rdo_array.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_VALUE_ARRAY_H_ -#define _RDOPARSER_VALUE_ARRAY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -14,30 +13,28 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOArrayValue); class RDOArrayValue - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOArrayValue); public: - typedef std::vector Container; + typedef std::vector Container; - void insertItem(const LPRDOValue& pValue); + void insertItem(const LPRDOValue& pValue); - const LPRDOArrayType& getArrayType() const; - LPRDOArrayType& getArrayType(); - rdo::runtime::RDOValue getRArray() const; - rdo::runtime::LPRDOArrayValue createRuntimeValue() const; - std::string getAsString() const; - const Container& getContainer() const; + const LPRDOArrayType& getArrayType() const; + LPRDOArrayType& getArrayType(); + rdo::runtime::RDOValue getRArray() const; + rdo::runtime::LPRDOArrayValue createRuntimeValue() const; + std::string getAsString() const; + const Container& getContainer() const; private: - RDOArrayValue(const LPRDOArrayType& pArrayType); - virtual ~RDOArrayValue(); + RDOArrayValue(const LPRDOArrayType& pArrayType); + virtual ~RDOArrayValue(); - Container m_container; - LPRDOArrayType m_pArrayType; + Container m_container; + LPRDOArrayType m_pArrayType; }; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_VALUE_ARRAY_H_ diff --git a/simulator/compiler/parser/rdo_logic-inl.h b/simulator/compiler/parser/rdo_logic-inl.h index a92acb4d9..697edbdff 100644 --- a/simulator/compiler/parser/rdo_logic-inl.h +++ b/simulator/compiler/parser/rdo_logic-inl.h @@ -6,7 +6,7 @@ OPEN_RDO_PARSER_NAMESPACE template inline RDOLogic::RDOLogic(const RDOParserSrcInfo& src_info) - : RDOLogicBase(src_info) + : RDOLogicBase(src_info) {} template @@ -16,22 +16,22 @@ inline RDOLogic::~RDOLogic() template inline typename RDOLogic::LPActivity RDOLogic::addNewActivity(const RDOParserSrcInfo& activity_src_info, const RDOParserSrcInfo& pattern_src_info) { - LPActivity pAactivity = rdo::Factory::create(m_pRuntimeLogic.object_dynamic_cast(), activity_src_info, pattern_src_info); - ASSERT(pAactivity); - m_activityList.push_back(pAactivity); - return pAactivity; + LPActivity pAactivity = rdo::Factory::create(m_pRuntimeLogic.object_dynamic_cast(), activity_src_info, pattern_src_info); + ASSERT(pAactivity); + m_activityList.push_back(pAactivity); + return pAactivity; } template inline typename RDOLogic::LPActivity RDOLogic::getLastActivity() const { - return !m_activityList.empty() ? m_activityList.back() : LPActivity(NULL); + return !m_activityList.empty() ? m_activityList.back() : LPActivity(NULL); } template inline const typename RDOLogic::ActivityList& RDOLogic::getActivities() const { - return m_activityList; + return m_activityList; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdo_logic.h b/simulator/compiler/parser/rdo_logic.h index 717640efd..d86256bef 100644 --- a/simulator/compiler/parser/rdo_logic.h +++ b/simulator/compiler/parser/rdo_logic.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_LOGIC_H_ -#define _RDOPARSER_LOGIC_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -19,23 +18,21 @@ template class RDOLogic: public RDOLogicBase { public: - typedef rdo::intrusive_ptr LPActivity; - typedef std::vector ActivityList; + typedef rdo::intrusive_ptr LPActivity; + typedef std::vector ActivityList; - LPActivity addNewActivity (const RDOParserSrcInfo& activity_src_info, const RDOParserSrcInfo& pattern_src_info); - LPActivity getLastActivity() const; - const ActivityList& getActivities () const; + LPActivity addNewActivity (const RDOParserSrcInfo& activity_src_info, const RDOParserSrcInfo& pattern_src_info); + LPActivity getLastActivity() const; + const ActivityList& getActivities () const; protected: - RDOLogic(const RDOParserSrcInfo& src_info); - virtual ~RDOLogic(); + RDOLogic(const RDOParserSrcInfo& src_info); + virtual ~RDOLogic(); private: - ActivityList m_activityList; + ActivityList m_activityList; }; CLOSE_RDO_PARSER_NAMESPACE #include "simulator/compiler/parser/rdo_logic-inl.h" - -#endif // _RDOPARSER_LOGIC_H_ diff --git a/simulator/compiler/parser/rdo_logic_base.cpp b/simulator/compiler/parser/rdo_logic_base.cpp index 1b413e9ea..b76166846 100644 --- a/simulator/compiler/parser/rdo_logic_base.cpp +++ b/simulator/compiler/parser/rdo_logic_base.cpp @@ -13,8 +13,8 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- RDOLogicBase // -------------------------------------------------------------------------------- RDOLogicBase::RDOLogicBase(const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_multithreading(false ) + : RDOParserSrcInfo(src_info) + , m_multithreading(false ) {} RDOLogicBase::~RDOLogicBase() @@ -22,52 +22,52 @@ RDOLogicBase::~RDOLogicBase() const std::string& RDOLogicBase::name() const { - return src_info().src_text(); + return src_info().src_text(); } bool RDOLogicBase::setPrior(LPRDOFUNArithm& pPrior) { - LPIPriority pPriority = m_pRuntimeLogic.object_dynamic_cast(); - if (pPriority) - { - return pPriority->setPrior(pPrior->createCalc()); - } - return false; + LPIPriority pPriority = m_pRuntimeLogic.object_dynamic_cast(); + if (pPriority) + { + return pPriority->setPrior(pPrior->createCalc()); + } + return false; } bool RDOLogicBase::getMultithreading() const { - return m_multithreading; + return m_multithreading; } void RDOLogicBase::setMultithreading(bool multithreading) { - m_multithreading = multithreading; + m_multithreading = multithreading; } void RDOLogicBase::setCondition(const LPRDOFUNLogic& pConditon) { - m_pConditon = pConditon; + m_pConditon = pConditon; } LPRDOFUNLogic RDOLogicBase::getConditon() const { - return m_pConditon; + return m_pConditon; } LPILogic RDOLogicBase::getLogic() const { - return m_pRuntimeLogic; + return m_pRuntimeLogic; } void RDOLogicBase::end() { - if (getConditon()) - { - m_pRuntimeLogic->setCondition(getConditon()->getCalc()); - } - m_pRuntimeLogic->setMultithreading(m_multithreading); - RDOParser::s_parser()->contextStack()->pop(); + if (getConditon()) + { + m_pRuntimeLogic->setCondition(getConditon()->getCalc()); + } + m_pRuntimeLogic->setMultithreading(m_multithreading); + RDOParser::s_parser()->contextStack()->pop(); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdo_logic_base.h b/simulator/compiler/parser/rdo_logic_base.h index a9cd126f8..462e19d65 100644 --- a/simulator/compiler/parser/rdo_logic_base.h +++ b/simulator/compiler/parser/rdo_logic_base.h @@ -1,5 +1,4 @@ -#ifndef _PARSER_LOGIC_BASE_H_ -#define _PARSER_LOGIC_BASE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -10,29 +9,27 @@ OPEN_RDO_PARSER_NAMESPACE PREDECLARE_POINTER(RDOLogicBase); class RDOLogicBase - : public virtual rdo::counter_reference - , public RDOParserSrcInfo + : public virtual rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOLogicBase); public: - const std::string& name () const; - bool setPrior(LPRDOFUNArithm& pPrior); - bool getMultithreading() const; - void setMultithreading(bool multithreading = false); - void setCondition(const LPRDOFUNLogic& pConditon = NULL); - LPRDOFUNLogic getConditon() const; - LPILogic getLogic() const; - virtual void end(); + const std::string& name () const; + bool setPrior(LPRDOFUNArithm& pPrior); + bool getMultithreading() const; + void setMultithreading(bool multithreading = false); + void setCondition(const LPRDOFUNLogic& pConditon = NULL); + LPRDOFUNLogic getConditon() const; + LPILogic getLogic() const; + virtual void end(); protected: - RDOLogicBase(const RDOParserSrcInfo& src_info); - virtual ~RDOLogicBase(); + RDOLogicBase(const RDOParserSrcInfo& src_info); + virtual ~RDOLogicBase(); - LPRDOFUNLogic m_pConditon; - LPILogic m_pRuntimeLogic; - bool m_multithreading; + LPRDOFUNLogic m_pConditon; + LPILogic m_pRuntimeLogic; + bool m_multithreading; }; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _PARSER_LOGIC_BASE_H_ diff --git a/simulator/compiler/parser/rdo_object.cpp b/simulator/compiler/parser/rdo_object.cpp index 54fc6b19f..2999303fe 100644 --- a/simulator/compiler/parser/rdo_object.cpp +++ b/simulator/compiler/parser/rdo_object.cpp @@ -12,79 +12,79 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- RDOParserSrcInfo // -------------------------------------------------------------------------------- RDOParserSrcInfo::RDOParserSrcInfo() - : RDOSrcInfo() + : RDOSrcInfo() { - init(); + init(); } RDOParserSrcInfo::RDOParserSrcInfo(const YYLTYPE& pos) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - setSrcPos (pos); - setSrcText(RDOParser::lexer_text()); + init(); + setSrcPos (pos); + setSrcText(RDOParser::lexer_text()); } RDOParserSrcInfo::RDOParserSrcInfo(const rdo::runtime::RDOSrcInfo& info) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - RDOSrcInfo::setSrcInfo(info); + init(); + RDOSrcInfo::setSrcInfo(info); } RDOParserSrcInfo::RDOParserSrcInfo(const rdo::runtime::RDOSrcInfo::Position& pos) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - RDOSrcInfo::setSrcPos(pos); - setSrcText(RDOParser::lexer_text()); + init(); + RDOSrcInfo::setSrcPos(pos); + setSrcText(RDOParser::lexer_text()); } RDOParserSrcInfo::RDOParserSrcInfo(const std::string& text) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - setSrcText(text); + init(); + setSrcText(text); } RDOParserSrcInfo::RDOParserSrcInfo(const YYLTYPE& pos, const std::string& text) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - setSrcPos (pos ); - setSrcText(text); + init(); + setSrcPos (pos ); + setSrcText(text); } RDOParserSrcInfo::RDOParserSrcInfo(const YYLTYPE& pos_begin, const YYLTYPE& pos_end, bool first_align) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - if (!first_align) - { - setSrcPos(pos_begin, pos_end); - } - else - { - if (pos_begin.m_first_line == pos_end.m_last_line) - { - setSrcPos(pos_begin, pos_end); - } - else - { - YYLTYPE pos(pos_begin); - pos.m_first_line = pos.m_last_line; - pos.m_first_pos = pos.m_last_pos; - setSrcPos(pos); - } - } + init(); + if (!first_align) + { + setSrcPos(pos_begin, pos_end); + } + else + { + if (pos_begin.m_first_line == pos_end.m_last_line) + { + setSrcPos(pos_begin, pos_end); + } + else + { + YYLTYPE pos(pos_begin); + pos.m_first_line = pos.m_last_line; + pos.m_first_pos = pos.m_last_pos; + setSrcPos(pos); + } + } } RDOParserSrcInfo::RDOParserSrcInfo(const YYLTYPE& pos_begin, const YYLTYPE& pos_end, const std::string& text) - : RDOSrcInfo() + : RDOSrcInfo() { - init(); - setSrcPos (pos_begin, pos_end); - setSrcText(text); + init(); + setSrcPos (pos_begin, pos_end); + setSrcText(text); } RDOParserSrcInfo::~RDOParserSrcInfo() @@ -92,13 +92,13 @@ RDOParserSrcInfo::~RDOParserSrcInfo() void RDOParserSrcInfo::init() { - setSrcFileType(RDOParser::getFileToParse()); - rdo::runtime::RDOSrcInfo::Position pos; - pos.m_first_pos = RDOParser::lexer_loc_pos(); - pos.m_last_pos = pos.m_first_pos; - pos.m_first_line = RDOParser::lexer_loc_line(); - pos.m_last_line = pos.m_first_line; - RDOSrcInfo::setSrcPos(pos); + setSrcFileType(RDOParser::getFileToParse()); + rdo::runtime::RDOSrcInfo::Position pos; + pos.m_first_pos = RDOParser::lexer_loc_pos(); + pos.m_last_pos = pos.m_first_pos; + pos.m_first_line = RDOParser::lexer_loc_line(); + pos.m_last_line = pos.m_first_line; + RDOSrcInfo::setSrcPos(pos); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdo_object.h b/simulator/compiler/parser/rdo_object.h index 5445efc0e..c90244c99 100644 --- a/simulator/compiler/parser/rdo_object.h +++ b/simulator/compiler/parser/rdo_object.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_OBJECT_H_ -#define _RDOPARSER_OBJECT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -17,119 +16,117 @@ OPEN_RDO_PARSER_NAMESPACE class RDOParserSrcInfo: public rdo::runtime::RDOSrcInfo { public: - RDOParserSrcInfo(); - RDOParserSrcInfo(const YYLTYPE& pos); - RDOParserSrcInfo(const rdo::runtime::RDOSrcInfo& info); - RDOParserSrcInfo(const rdo::runtime::RDOSrcInfo::Position& pos); - explicit RDOParserSrcInfo(const std::string& text); - RDOParserSrcInfo(const YYLTYPE& pos, const std::string& text); - RDOParserSrcInfo(const YYLTYPE& pos_begin, const YYLTYPE& pos_end, bool first_align = false); - RDOParserSrcInfo(const YYLTYPE& pos_begin, const YYLTYPE& pos_end, const std::string& text); - virtual ~RDOParserSrcInfo(); + RDOParserSrcInfo(); + RDOParserSrcInfo(const YYLTYPE& pos); + RDOParserSrcInfo(const rdo::runtime::RDOSrcInfo& info); + RDOParserSrcInfo(const rdo::runtime::RDOSrcInfo::Position& pos); + explicit RDOParserSrcInfo(const std::string& text); + RDOParserSrcInfo(const YYLTYPE& pos, const std::string& text); + RDOParserSrcInfo(const YYLTYPE& pos_begin, const YYLTYPE& pos_end, bool first_align = false); + RDOParserSrcInfo(const YYLTYPE& pos_begin, const YYLTYPE& pos_end, const std::string& text); + virtual ~RDOParserSrcInfo(); - virtual void setSrcInfo(const RDOParserSrcInfo& info) - { - setSrcPos (info.src_pos() ); - setSrcText (info.src_text() ); - setSrcFileType(info.src_filetype()); - } - void setSrcInfo(const RDOParserSrcInfo& begin, const std::string& delim, const RDOParserSrcInfo& end) - { - RDOParserSrcInfo src_info; - src_info.setSrcPos (begin.src_pos().m_first_line, begin.src_pos().m_first_pos, end.src_pos().m_last_line, end.src_pos().m_last_pos); - src_info.setSrcText (begin.src_text() + delim + end.src_text()); - src_info.setSrcFileType(begin.src_filetype()); - setSrcInfo(src_info); - } - virtual void setSrcPos(const RDOSrcInfo::Position& pos) - { - RDOSrcInfo::setSrcPos(pos); - } - void setSrcPos(const YYLTYPE& pos) - { - setSrcPos(Position(pos.m_first_line, pos.m_first_pos, pos.m_last_line, pos.m_last_pos)); - } - void setSrcPos(const YYLTYPE& pos_begin, const YYLTYPE& pos_end) - { - setSrcPos(Position(pos_begin.m_first_line, pos_begin.m_first_pos, pos_end.m_last_line, pos_end.m_last_pos)); - } - void setSrcPos(std::size_t first_line, std::size_t first_pos, std::size_t last_line, std::size_t last_pos) - { - setSrcPos(Position(first_line, first_pos, last_line, last_pos)); - } - YYLTYPE getPosAsYY() const - { - YYLTYPE pos1; - Position pos2 = src_pos(); - pos1.m_first_line = pos2.m_first_line; - pos1.m_first_pos = pos2.m_first_pos; - pos1.m_last_line = pos2.m_last_line; - pos1.m_last_pos = pos2.m_last_pos; - pos1.m_first_seek = std::size_t(Position::UNDEFINE_POS); - pos1.m_last_seek = std::size_t(Position::UNDEFINE_POS); - return pos1; - } - static std::size_t getPosByLength(std::size_t pos, const std::string& text) - { - return pos + text.length(); - } + virtual void setSrcInfo(const RDOParserSrcInfo& info) + { + setSrcPos (info.src_pos() ); + setSrcText (info.src_text() ); + setSrcFileType(info.src_filetype()); + } + void setSrcInfo(const RDOParserSrcInfo& begin, const std::string& delim, const RDOParserSrcInfo& end) + { + RDOParserSrcInfo src_info; + src_info.setSrcPos (begin.src_pos().m_first_line, begin.src_pos().m_first_pos, end.src_pos().m_last_line, end.src_pos().m_last_pos); + src_info.setSrcText (begin.src_text() + delim + end.src_text()); + src_info.setSrcFileType(begin.src_filetype()); + setSrcInfo(src_info); + } + virtual void setSrcPos(const RDOSrcInfo::Position& pos) + { + RDOSrcInfo::setSrcPos(pos); + } + void setSrcPos(const YYLTYPE& pos) + { + setSrcPos(Position(pos.m_first_line, pos.m_first_pos, pos.m_last_line, pos.m_last_pos)); + } + void setSrcPos(const YYLTYPE& pos_begin, const YYLTYPE& pos_end) + { + setSrcPos(Position(pos_begin.m_first_line, pos_begin.m_first_pos, pos_end.m_last_line, pos_end.m_last_pos)); + } + void setSrcPos(std::size_t first_line, std::size_t first_pos, std::size_t last_line, std::size_t last_pos) + { + setSrcPos(Position(first_line, first_pos, last_line, last_pos)); + } + YYLTYPE getPosAsYY() const + { + YYLTYPE pos1; + Position pos2 = src_pos(); + pos1.m_first_line = pos2.m_first_line; + pos1.m_first_pos = pos2.m_first_pos; + pos1.m_last_line = pos2.m_last_line; + pos1.m_last_pos = pos2.m_last_pos; + pos1.m_first_seek = std::size_t(Position::UNDEFINE_POS); + pos1.m_last_seek = std::size_t(Position::UNDEFINE_POS); + return pos1; + } + static std::size_t getPosByLength(std::size_t pos, const std::string& text) + { + return pos + text.length(); + } private: - void init(); + void init(); }; template class compareName { public: - compareName(const compareName& obj) - : m_name(obj.m_name) - {} - compareName(const std::string& name) - : m_name(name) - {} - compareName& operator= (const compareName& obj) - { - m_name = obj.m_name; - return *this; - } - bool operator()(const T* pObj) - { - return pObj->name() == m_name; - } - bool operator() (const rdo::intrusive_ptr& pObj) - { - return pObj->name() == m_name; - } + compareName(const compareName& obj) + : m_name(obj.m_name) + {} + compareName(const std::string& name) + : m_name(name) + {} + compareName& operator= (const compareName& obj) + { + m_name = obj.m_name; + return *this; + } + bool operator()(const T* pObj) + { + return pObj->name() == m_name; + } + bool operator() (const rdo::intrusive_ptr& pObj) + { + return pObj->name() == m_name; + } private: - const std::string& m_name; + const std::string& m_name; }; template class compareNameRef { public: - compareNameRef(const compareNameRef& obj) - : m_name(obj.m_name) - {} - compareNameRef(const std::string& name) - : m_name(name) - {} - compareNameRef& operator= (const compareNameRef& obj) - { - m_name = obj.m_name; - return *this; - } - bool operator() (const T& obj) - { - return obj.name() == m_name; - } + compareNameRef(const compareNameRef& obj) + : m_name(obj.m_name) + {} + compareNameRef(const std::string& name) + : m_name(name) + {} + compareNameRef& operator= (const compareNameRef& obj) + { + m_name = obj.m_name; + return *this; + } + bool operator() (const T& obj) + { + return obj.name() == m_name; + } private: - const std::string& m_name; + const std::string& m_name; }; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_OBJECT_H_ diff --git a/simulator/compiler/parser/rdo_value-inl.h b/simulator/compiler/parser/rdo_value-inl.h index 73205dec1..4fcfa86ec 100644 --- a/simulator/compiler/parser/rdo_value-inl.h +++ b/simulator/compiler/parser/rdo_value-inl.h @@ -7,59 +7,59 @@ OPEN_RDO_PARSER_NAMESPACE template inline RDOValue::RDOValue(const LPTypeInfo& pType, const rdo::intrusive_ptr& pObject) - : RDOParserSrcInfo(pObject->src_info()) - , m_pType (pType ) + : RDOParserSrcInfo(pObject->src_info()) + , m_pType (pType ) { - setPointer(pObject); + setPointer(pObject); } template inline RDOValue::RDOValue(const LPTypeInfo& pType, const rdo::intrusive_ptr& pObject, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_pType (pType ) + : RDOParserSrcInfo(src_info) + , m_pType (pType ) { - setPointer(pObject); + setPointer(pObject); } template inline void RDOValue::setPointer(const rdo::intrusive_ptr& pObject) { - STATIC_ASSERT(sizeof(rdo::intrusive_ptr_interface_wrapper) >= sizeof(double)); + STATIC_ASSERT(sizeof(rdo::intrusive_ptr_interface_wrapper) >= sizeof(double)); - ASSERT(m_pType); - ASSERT(pObject); - ASSERT( - typeID() == rdo::runtime::RDOType::t_string || - typeID() == rdo::runtime::RDOType::t_identificator || - typeID() == rdo::runtime::RDOType::t_pointer - ); + ASSERT(m_pType); + ASSERT(pObject); + ASSERT( + typeID() == rdo::runtime::RDOType::Type::STRING || + typeID() == rdo::runtime::RDOType::Type::IDENTIFICATOR || + typeID() == rdo::runtime::RDOType::Type::POINTER + ); - new (&m_buffer) rdo::intrusive_ptr_interface_wrapper(pObject); - m_value = rdo::runtime::RDOValue(m_pType->type(), pObject->createRuntimeValue()); + new (&m_buffer) rdo::intrusive_ptr_interface_wrapper(pObject); + m_value = rdo::runtime::RDOValue(m_pType->type(), pObject->createRuntimeValue()); } template inline T& RDOValue::__get() { - return *reinterpret_cast(&m_buffer); + return *reinterpret_cast(&m_buffer); } template inline const T& RDOValue::__get() const { - return *reinterpret_cast(&m_buffer); + return *reinterpret_cast(&m_buffer); } template inline const rdo::intrusive_ptr& RDOValue::get() const { - ASSERT( - typeID() == rdo::runtime::RDOType::t_string || - typeID() == rdo::runtime::RDOType::t_identificator || - typeID() == rdo::runtime::RDOType::t_pointer - ); + ASSERT( + typeID() == rdo::runtime::RDOType::Type::STRING || + typeID() == rdo::runtime::RDOType::Type::IDENTIFICATOR || + typeID() == rdo::runtime::RDOType::Type::POINTER + ); - return __get >(); + return __get >(); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdo_value.cpp b/simulator/compiler/parser/rdo_value.cpp index 2d08b2b27..faa7fef5a 100644 --- a/simulator/compiler/parser/rdo_value.cpp +++ b/simulator/compiler/parser/rdo_value.cpp @@ -13,158 +13,158 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- RDOValue // -------------------------------------------------------------------------------- RDOValue::RDOValue() - : RDOParserSrcInfo() - , m_value (rdo::runtime::RDOValue(rdo::runtime::g_unknow.object_parent_cast())) + : RDOParserSrcInfo() + , m_value (rdo::runtime::RDOValue(rdo::runtime::g_UNKNOW.object_parent_cast())) { - //! @todo RDOParserSrcInfo() для TypeInfo реально неопределёно, добавить соответствующий конструктор - LPRDOValue pValue = getUnknow(RDOParserSrcInfo()); - ASSERT(pValue); + // TODO RDOParserSrcInfo() для TypeInfo реально неопределёно, добавить соответствующий конструктор + LPRDOValue pValue = getUnknow(RDOParserSrcInfo()); + ASSERT(pValue); - m_pType = pValue->m_pType; - m_value = pValue->m_value; - ASSERT(m_pType); + m_pType = pValue->m_pType; + m_value = pValue->m_value; + ASSERT(m_pType); } // Для t_identificator известно только имя, но не тип RDOValue::RDOValue(const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info ) - , m_value (rdo::runtime::RDOValue(src_info.src_text(), rdo::runtime::g_identificator)) + : RDOParserSrcInfo(src_info ) + , m_value (rdo::runtime::RDOValue(src_info.src_text(), rdo::runtime::g_IDENTIFICATOR)) { - m_pType = rdo::Factory::delegate(src_info); - ASSERT(m_pType); + m_pType = rdo::Factory::delegate(src_info); + ASSERT(m_pType); } RDOValue::RDOValue(const LPRDOValue& pValue) - : RDOParserSrcInfo(pValue->src_info()) - , m_value (pValue->m_value ) - , m_pType (pValue->m_pType ) + : RDOParserSrcInfo(pValue->src_info()) + , m_value (pValue->m_value ) + , m_pType (pValue->m_pType ) { - ASSERT(m_pType); + ASSERT(m_pType); - memcpy(&m_buffer, &pValue->m_buffer, sizeof(m_buffer)); + memcpy(&m_buffer, &pValue->m_buffer, sizeof(m_buffer)); - switch (typeID()) - { - case rdo::runtime::RDOType::t_pointer: - reinterpret_cast(&m_buffer)->addref(); - break; + switch (typeID()) + { + case rdo::runtime::RDOType::Type::POINTER: + reinterpret_cast(&m_buffer)->addref(); + break; - default: - break; - } + default: + break; + } } RDOValue::RDOValue(const rdo::explicit_value& value, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_value (value ) + : RDOParserSrcInfo(src_info) + , m_value (value ) { - m_pType = rdo::Factory::delegate(src_info); + m_pType = rdo::Factory::delegate(src_info); } RDOValue::RDOValue(const rdo::explicit_value& value, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_value (value ) + : RDOParserSrcInfo(src_info) + , m_value (value ) { - m_pType = rdo::Factory::delegate(src_info); + m_pType = rdo::Factory::delegate(src_info); } RDOValue::RDOValue(const rdo::explicit_value& value, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_value (value ) + : RDOParserSrcInfo(src_info) + , m_value (value ) { - m_pType = rdo::Factory::delegate(src_info); + m_pType = rdo::Factory::delegate(src_info); } RDOValue::RDOValue(const rdo::explicit_value& value, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_value (value ) + : RDOParserSrcInfo(src_info) + , m_value (value ) { - m_pType = rdo::Factory::delegate(src_info); + m_pType = rdo::Factory::delegate(src_info); } RDOValue::RDOValue(const LPTypeInfo& pType) - : RDOParserSrcInfo(pType->src_info(RDOParserSrcInfo())) - , m_value (pType->type()) - , m_pType (pType) + : RDOParserSrcInfo(pType->src_info(RDOParserSrcInfo())) + , m_value (pType->type()) + , m_pType (pType) { - ASSERT(m_pType); + ASSERT(m_pType); } RDOValue::RDOValue(const LPTypeInfo& pType, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) - , m_value (pType->type()) - , m_pType (pType) + : RDOParserSrcInfo(src_info) + , m_value (pType->type()) + , m_pType (pType) { - ASSERT(m_pType); + ASSERT(m_pType); } RDOValue::RDOValue(const rdo::runtime::RDOValue& value, const RDOParserSrcInfo& src_info, const LPTypeInfo& pType) - : RDOParserSrcInfo(src_info) - , m_value (value) - , m_pType (pType) + : RDOParserSrcInfo(src_info) + , m_value (value) + , m_pType (pType) { - ASSERT(m_pType); + ASSERT(m_pType); } const LPTypeInfo& RDOValue::typeInfo() const { - return m_pType; + return m_pType; } -rdo::runtime::RDOType::TypeID RDOValue::typeID() const +rdo::runtime::RDOType::Type RDOValue::typeID() const { - return m_pType->typeID(); + return m_pType->typeID(); } rdo::runtime::RDOValue& RDOValue::value() { - return m_value; + return m_value; } const rdo::runtime::RDOValue& RDOValue::value() const { - return m_value; + return m_value; } bool RDOValue::defined() const { - return m_value.typeID() != rdo::runtime::RDOType::t_unknow; + return m_value.typeID() != rdo::runtime::RDOType::Type::UNKNOW; } bool RDOValue::constant() const { - if (m_value.typeID() == rdo::runtime::RDOType::t_int || - m_value.typeID() == rdo::runtime::RDOType::t_real || - m_value.typeID() == rdo::runtime::RDOType::t_bool || - m_value.typeID() == rdo::runtime::RDOType::t_string) - { - return true; - } + if (m_value.typeID() == rdo::runtime::RDOType::Type::INT || + m_value.typeID() == rdo::runtime::RDOType::Type::REAL || + m_value.typeID() == rdo::runtime::RDOType::Type::BOOL || + m_value.typeID() == rdo::runtime::RDOType::Type::STRING) + { + return true; + } - if (m_value.typeID() == rdo::runtime::RDOType::t_identificator && m_value.getIdentificator() == "*") - { - return true; - } + if (m_value.typeID() == rdo::runtime::RDOType::Type::IDENTIFICATOR && m_value.getIdentificator() == "*") + { + return true; + } - if (m_value.typeID() == rdo::runtime::RDOType::t_pointer) - { - return m_value.isType(); - } + if (m_value.typeID() == rdo::runtime::RDOType::Type::POINTER) + { + return m_value.isType(); + } - return false; + return false; } LPRDOValue RDOValue::getIdentificator(const std::string& identificator) { - return rdo::Factory::create(RDOParserSrcInfo(identificator)); + return rdo::Factory::create(RDOParserSrcInfo(identificator)); } LPRDOValue RDOValue::getUnknow(const RDOParserSrcInfo& src_info) { - return rdo::Factory::create( - rdo::Factory::delegate(src_info), - src_info - ); + return rdo::Factory::create( + rdo::Factory::delegate(src_info), + src_info + ); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdo_value.h b/simulator/compiler/parser/rdo_value.h index d64464d76..81a771880 100644 --- a/simulator/compiler/parser/rdo_value.h +++ b/simulator/compiler/parser/rdo_value.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_VALUE_H_ -#define _RDOPARSER_VALUE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -19,73 +18,70 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOValue); class RDOValue - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOValue); public: - const LPTypeInfo& typeInfo() const; - rdo::runtime::RDOType::TypeID typeID () const; - rdo::runtime::RDOValue& value (); - const rdo::runtime::RDOValue& value () const; + const LPTypeInfo& typeInfo() const; + rdo::runtime::RDOType::Type typeID () const; + rdo::runtime::RDOValue& value (); + const rdo::runtime::RDOValue& value () const; - bool defined () const; - bool constant() const; + bool defined () const; + bool constant() const; - template - const rdo::intrusive_ptr& get() const; + template + const rdo::intrusive_ptr& get() const; - static LPRDOValue getIdentificator(const std::string& identificator); - static LPRDOValue getUnknow(const RDOParserSrcInfo& src_info); + static LPRDOValue getIdentificator(const std::string& identificator); + static LPRDOValue getUnknow(const RDOParserSrcInfo& src_info); private: - // Неопределенный тип - RDOValue(); + // Неопределенный тип + RDOValue(); - // Для t_identificator известно только имя, но не тип - RDOValue(const RDOParserSrcInfo& src_info); + // Для t_identificator известно только имя, но не тип + RDOValue(const RDOParserSrcInfo& src_info); - // От копии - RDOValue(const LPRDOValue& pValue); + // От копии + RDOValue(const LPRDOValue& pValue); - // Он стандартных типов - RDOValue(const rdo::explicit_value& value, const RDOParserSrcInfo& src_info); - RDOValue(const rdo::explicit_value& value, const RDOParserSrcInfo& src_info); - RDOValue(const rdo::explicit_value& value, const RDOParserSrcInfo& src_info); - RDOValue(const rdo::explicit_value& value, const RDOParserSrcInfo& src_info); + // Он стандартных типов + RDOValue(const rdo::explicit_value& value, const RDOParserSrcInfo& src_info); + RDOValue(const rdo::explicit_value& value, const RDOParserSrcInfo& src_info); + RDOValue(const rdo::explicit_value& value, const RDOParserSrcInfo& src_info); + RDOValue(const rdo::explicit_value& value, const RDOParserSrcInfo& src_info); - // От типа - RDOValue(const LPTypeInfo& pType); - RDOValue(const LPTypeInfo& pType, const RDOParserSrcInfo& src_info); + // От типа + RDOValue(const LPTypeInfo& pType); + RDOValue(const LPTypeInfo& pType, const RDOParserSrcInfo& src_info); - // От типа и объекта - template - RDOValue(const LPTypeInfo& pType, const rdo::intrusive_ptr& pObject); - template - RDOValue(const LPTypeInfo& pType, const rdo::intrusive_ptr& pObject, const RDOParserSrcInfo& src_info); + // От типа и объекта + template + RDOValue(const LPTypeInfo& pType, const rdo::intrusive_ptr& pObject); + template + RDOValue(const LPTypeInfo& pType, const rdo::intrusive_ptr& pObject, const RDOParserSrcInfo& src_info); - // От рантайм RDOValue - RDOValue(const rdo::runtime::RDOValue& value, const RDOParserSrcInfo& src_info, const LPTypeInfo& pType); + // От рантайм RDOValue + RDOValue(const rdo::runtime::RDOValue& value, const RDOParserSrcInfo& src_info, const LPTypeInfo& pType); - template - void setPointer(const rdo::intrusive_ptr& pObject); + template + void setPointer(const rdo::intrusive_ptr& pObject); - //! Тип контейнера значения, размер определяется по максимальному размеру типа данных - typedef unsigned char Value[sizeof(rdo::intrusive_ptr_interface_wrapper)]; + typedef unsigned char Value[sizeof(rdo::intrusive_ptr_interface_wrapper)]; - Value m_buffer; - rdo::runtime::RDOValue m_value; - LPTypeInfo m_pType; + Value m_buffer; + rdo::runtime::RDOValue m_value; + LPTypeInfo m_pType; - template - T& __get(); + template + T& __get(); - template - const T& __get() const; + template + const T& __get() const; }; CLOSE_RDO_PARSER_NAMESPACE #include "simulator/compiler/parser/rdo_value-inl.h" - -#endif // _RDOPARSER_VALUE_H_ diff --git a/simulator/compiler/parser/rdodpt.cpp b/simulator/compiler/parser/rdodpt.cpp index 40904c2f9..06e5c7cd3 100644 --- a/simulator/compiler/parser/rdodpt.cpp +++ b/simulator/compiler/parser/rdodpt.cpp @@ -21,9 +21,9 @@ OPEN_RDO_PARSER_NAMESPACE int dptlex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void dpterror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -33,17 +33,17 @@ void dpterror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) // -------------------- RDODPTActivity // -------------------------------------------------------------------------------- RDODPTActivity::RDODPTActivity(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info) - : RDOParserSrcInfo(src_info) - , m_currParam (0 ) + : RDOParserSrcInfo(src_info) + , m_currParam (0 ) { - RDOParser::s_parser()->checkActivityName(src_info); - m_pPattern = RDOParser::s_parser()->findPATPattern(pattern_src_info.src_text()); - if (!m_pPattern) - { - RDOParser::s_parser()->error().error(pattern_src_info, rdo::format("Не найден образец: %s", pattern_src_info.src_text().c_str())); - } - RDOParser::s_parser()->contextStack()->push(this); - RDOParser::s_parser()->insertDPTActivity(this); + RDOParser::s_parser()->checkActivityName(src_info); + m_pPattern = RDOParser::s_parser()->findPATPattern(pattern_src_info.src_text()); + if (!m_pPattern) + { + RDOParser::s_parser()->error().error(pattern_src_info, rdo::format("Не найден образец: %s", pattern_src_info.src_text().c_str())); + } + RDOParser::s_parser()->contextStack()->push(this); + RDOParser::s_parser()->insertDPTActivity(this); } RDODPTActivity::~RDODPTActivity() @@ -51,111 +51,111 @@ RDODPTActivity::~RDODPTActivity() Context::LPFindResult RDODPTActivity::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const { - return m_pPattern->onFindContext(method, params, srcInfo); + return m_pPattern->onFindContext(method, params, srcInfo); } void RDODPTActivity::addParam(const LPRDOValue& pParam) { - ASSERT(pParam); - - if (m_pPattern->m_paramList.size() <= m_currParam) - { - if (pParam->src_pos().m_first_line == src_pos().m_first_line) - { - RDOParser::s_parser()->error().push_only(pParam->src_pos(), rdo::format("Слишком много параметров для образца '%s' при описании активности '%s'", m_pPattern->name().c_str(), name().c_str())); - RDOParser::s_parser()->error().push_only(m_pPattern->src_info(), "См. образец"); - RDOParser::s_parser()->error().push_done(); - } - else - { - RDOParser::s_parser()->error().error(pParam->src_pos(), "Имя активности должно заканчиваться двоеточием"); - } - } - rdo::runtime::RDOValue val; - LPRDOParam pPatternParam = m_pPattern->m_paramList.at(m_currParam); - if (pParam->value().getAsString() == "*") - { - if (!pPatternParam->getDefault()->defined()) - { - RDOParser::s_parser()->error().push_only(pParam->src_pos(), rdo::format("Нет значения по умолчанию для параметра '%s'", pPatternParam->src_text().c_str())); - RDOParser::s_parser()->error().push_only(pPatternParam->src_info(), rdo::format("См. параметр '%s', тип '%s'", pPatternParam->src_text().c_str(), pPatternParam->getTypeInfo()->src_info().src_text().c_str())); - RDOParser::s_parser()->error().push_done(); - } - val = pPatternParam->getDefault()->value(); - } - else - { - val = pPatternParam->getTypeInfo()->value_cast(pParam)->value(); - } - - rdo::runtime::LPRDOCalc pParamCalc = rdo::Factory::create(val); - pParamCalc->setSrcInfo(RDOParserSrcInfo(pParam->getPosAsYY(), rdo::format("Параметр образца %s.%s = %s", m_pPattern->name().c_str(), pPatternParam->name().c_str(), pParam->value().getAsString().c_str()))); - m_pActivity->addParamCalc(pParamCalc); - m_currParam++; + ASSERT(pParam); + + if (m_pPattern->m_paramList.size() <= m_currParam) + { + if (pParam->src_pos().m_first_line == src_pos().m_first_line) + { + RDOParser::s_parser()->error().push_only(pParam->src_pos(), rdo::format("Слишком много параметров для образца '%s' при описании активности '%s'", m_pPattern->name().c_str(), name().c_str())); + RDOParser::s_parser()->error().push_only(m_pPattern->src_info(), "См. образец"); + RDOParser::s_parser()->error().push_done(); + } + else + { + RDOParser::s_parser()->error().error(pParam->src_pos(), "Имя активности должно заканчиваться двоеточием"); + } + } + rdo::runtime::RDOValue val; + LPRDOParam pPatternParam = m_pPattern->m_paramList.at(m_currParam); + if (pParam->value().getAsString() == "*") + { + if (!pPatternParam->getDefault()->defined()) + { + RDOParser::s_parser()->error().push_only(pParam->src_pos(), rdo::format("Нет значения по умолчанию для параметра '%s'", pPatternParam->src_text().c_str())); + RDOParser::s_parser()->error().push_only(pPatternParam->src_info(), rdo::format("См. параметр '%s', тип '%s'", pPatternParam->src_text().c_str(), pPatternParam->getTypeInfo()->src_info().src_text().c_str())); + RDOParser::s_parser()->error().push_done(); + } + val = pPatternParam->getDefault()->value(); + } + else + { + val = pPatternParam->getTypeInfo()->value_cast(pParam)->value(); + } + + rdo::runtime::LPRDOCalc pParamCalc = rdo::Factory::create(val); + pParamCalc->setSrcInfo(RDOParserSrcInfo(pParam->getPosAsYY(), rdo::format("Параметр образца %s.%s = %s", m_pPattern->name().c_str(), pPatternParam->name().c_str(), pParam->value().getAsString().c_str()))); + m_pActivity->addParamCalc(pParamCalc); + m_currParam++; } void RDODPTActivity::endParam(const YYLTYPE& param_pos) { - if (m_pPattern->m_paramList.size() > m_currParam) - { - LPRDOParam pPatternParam = m_pPattern->m_paramList.at(m_currParam); - RDOParser::s_parser()->error().push_only(param_pos, rdo::format("Указаны не все параметра образца '%s':", m_pPattern->src_text().c_str())); - for (std::size_t i = m_currParam; i < m_pPattern->m_paramList.size(); i++) - { - pPatternParam = m_pPattern->m_paramList.at(i); - RDOParser::s_parser()->error().push_only(pPatternParam->src_info(), rdo::format("Ожидаемый параметр '%s' имеет тип '%s'", pPatternParam->name().c_str(), pPatternParam->getTypeInfo()->src_info().src_text().c_str())); - } - RDOParser::s_parser()->error().push_done(); - } - if (m_pPattern->getType() == RDOPATPattern::PT_Keyboard) - { - LPIKeyboard pKeyboard = m_pActivity.object_dynamic_cast(); - ASSERT(pKeyboard); - if (!pKeyboard->hasHotKey()) - { - RDOParser::s_parser()->error().push_only(param_pos, "Для активности должна быть указана клавиша"); - RDOParser::s_parser()->error().push_only(m_pPattern->src_info(), "См. образец"); - RDOParser::s_parser()->error().push_done(); - } - } - RDOParser::s_parser()->contextStack()->pop(); + if (m_pPattern->m_paramList.size() > m_currParam) + { + LPRDOParam pPatternParam = m_pPattern->m_paramList.at(m_currParam); + RDOParser::s_parser()->error().push_only(param_pos, rdo::format("Указаны не все параметра образца '%s':", m_pPattern->src_text().c_str())); + for (std::size_t i = m_currParam; i < m_pPattern->m_paramList.size(); i++) + { + pPatternParam = m_pPattern->m_paramList.at(i); + RDOParser::s_parser()->error().push_only(pPatternParam->src_info(), rdo::format("Ожидаемый параметр '%s' имеет тип '%s'", pPatternParam->name().c_str(), pPatternParam->getTypeInfo()->src_info().src_text().c_str())); + } + RDOParser::s_parser()->error().push_done(); + } + if (m_pPattern->getType() == RDOPATPattern::Type::KEYBOARD) + { + LPIKeyboard pKeyboard = m_pActivity.object_dynamic_cast(); + ASSERT(pKeyboard); + if (!pKeyboard->hasHotKey()) + { + RDOParser::s_parser()->error().push_only(param_pos, "Для активности должна быть указана клавиша"); + RDOParser::s_parser()->error().push_only(m_pPattern->src_info(), "См. образец"); + RDOParser::s_parser()->error().push_done(); + } + } + RDOParser::s_parser()->contextStack()->pop(); } bool RDODPTActivity::setPrior(LPRDOFUNArithm& pPrior) { - LPIPriority pPriorActivity = m_pActivity.object_dynamic_cast(); - if (pPriorActivity) - { - return pPriorActivity->setPrior(pPrior->createCalc()); - } - return false; + LPIPriority pPriorActivity = m_pActivity.object_dynamic_cast(); + if (pPriorActivity) + { + return pPriorActivity->setPrior(pPrior->createCalc()); + } + return false; } // -------------------------------------------------------------------------------- // -------------------- RDODPTActivityHotKey // -------------------------------------------------------------------------------- RDODPTActivityHotKey::RDODPTActivityHotKey(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info) - : RDODPTActivity(src_info, pattern_src_info) + : RDODPTActivity(src_info, pattern_src_info) { - switch (pattern()->getType()) - { - case RDOPATPattern::PT_Rule: - m_pActivity = pattern()->getPatRuntime()->createActivity(pDPT, RDOParser::s_parser()->runtime(), name()).object_dynamic_cast(); - break; - - case RDOPATPattern::PT_Operation: - m_pActivity = pattern()->getPatRuntime()->createActivity(pDPT, RDOParser::s_parser()->runtime(), name()).object_dynamic_cast(); - break; - - case RDOPATPattern::PT_Keyboard: - m_pActivity = pattern()->getPatRuntime()->createActivity(pDPT, RDOParser::s_parser()->runtime(), name()).object_dynamic_cast(); - break; - - default: - RDOParser::s_parser()->error().push_only(this->src_info(), "Неизвестный тип образца"); - RDOParser::s_parser()->error().push_only(pattern()->src_info(), "См. образец"); - RDOParser::s_parser()->error().push_done(); - } + switch (pattern()->getType()) + { + case RDOPATPattern::Type::RULE: + m_pActivity = pattern()->getPatRuntime()->createActivity(pDPT, RDOParser::s_parser()->runtime(), name()).object_dynamic_cast(); + break; + + case RDOPATPattern::Type::OPERATION: + m_pActivity = pattern()->getPatRuntime()->createActivity(pDPT, RDOParser::s_parser()->runtime(), name()).object_dynamic_cast(); + break; + + case RDOPATPattern::Type::KEYBOARD: + m_pActivity = pattern()->getPatRuntime()->createActivity(pDPT, RDOParser::s_parser()->runtime(), name()).object_dynamic_cast(); + break; + + default: + RDOParser::s_parser()->error().push_only(this->src_info(), "Неизвестный тип образца"); + RDOParser::s_parser()->error().push_only(pattern()->src_info(), "См. образец"); + RDOParser::s_parser()->error().push_done(); + } } RDODPTActivityHotKey::~RDODPTActivityHotKey() @@ -163,43 +163,43 @@ RDODPTActivityHotKey::~RDODPTActivityHotKey() void RDODPTActivityHotKey::addHotKey(const std::string& hotKey, const YYLTYPE& hotkey_pos) { - if (pattern()->getType() != RDOPATPattern::PT_Keyboard) - { - RDOParser::s_parser()->error().push_only(hotkey_pos, "Горячие клавиши используются только в клавиатурных операциях"); - RDOParser::s_parser()->error().push_only(pattern()->src_info(), "См. образец"); - RDOParser::s_parser()->error().push_done(); - } - LPIKeyboard pKeyboard = m_pActivity.object_dynamic_cast(); - ASSERT(pKeyboard); - switch (pKeyboard->addHotKey(RDOParser::s_parser()->runtime(), hotKey)) - { - case rdo::runtime::RDOKeyboard::addhk_ok: - break; - - case rdo::runtime::RDOKeyboard::addhk_already: - RDOParser::s_parser()->error().error(hotkey_pos, rdo::format("Для активности '%s' клавиша уже назначена", src_text().c_str())); - break; - - case rdo::runtime::RDOKeyboard::addhk_notfound: - RDOParser::s_parser()->error().error(hotkey_pos, rdo::format("Неизвестная клавиша: %s", hotKey.c_str())); - break; - - case rdo::runtime::RDOKeyboard::addhk_dont: - RDOParser::s_parser()->error().push_only(src_info(), rdo::format("Операция '%s' не является клавиатурной", src_text().c_str())); - RDOParser::s_parser()->error().push_only(pattern()->src_info(), "См. образец"); - RDOParser::s_parser()->error().push_done(); - break; - - default: - RDOParser::s_parser()->error().error(src_info(), "Внутренная ошибка: RDOOPROperation::addHotKey"); - } + if (pattern()->getType() != RDOPATPattern::Type::KEYBOARD) + { + RDOParser::s_parser()->error().push_only(hotkey_pos, "Горячие клавиши используются только в клавиатурных операциях"); + RDOParser::s_parser()->error().push_only(pattern()->src_info(), "См. образец"); + RDOParser::s_parser()->error().push_done(); + } + LPIKeyboard pKeyboard = m_pActivity.object_dynamic_cast(); + ASSERT(pKeyboard); + switch (pKeyboard->addHotKey(RDOParser::s_parser()->runtime(), hotKey)) + { + case rdo::runtime::RDOKeyboard::AddHotKeyResult::OK: + break; + + case rdo::runtime::RDOKeyboard::AddHotKeyResult::ALREADY: + RDOParser::s_parser()->error().error(hotkey_pos, rdo::format("Для активности '%s' клавиша уже назначена", src_text().c_str())); + break; + + case rdo::runtime::RDOKeyboard::AddHotKeyResult::NOTFOUND: + RDOParser::s_parser()->error().error(hotkey_pos, rdo::format("Неизвестная клавиша: %s", hotKey.c_str())); + break; + + case rdo::runtime::RDOKeyboard::AddHotKeyResult::DONT: + RDOParser::s_parser()->error().push_only(src_info(), rdo::format("Операция '%s' не является клавиатурной", src_text().c_str())); + RDOParser::s_parser()->error().push_only(pattern()->src_info(), "См. образец"); + RDOParser::s_parser()->error().push_done(); + break; + + default: + RDOParser::s_parser()->error().error(src_info(), "Внутренняя ошибка: RDOOPROperation::addHotKey"); + } } // -------------------------------------------------------------------------------- // -------------------- RDODPTSomeActivity // -------------------------------------------------------------------------------- RDODPTSomeActivity::RDODPTSomeActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info) - : RDODPTActivityHotKey(pDPT, src_info, pattern_src_info) + : RDODPTActivityHotKey(pDPT, src_info, pattern_src_info) {} RDODPTSomeActivity::~RDODPTSomeActivity() @@ -209,7 +209,7 @@ RDODPTSomeActivity::~RDODPTSomeActivity() // -------------------- RDODPTPriorActivity // -------------------------------------------------------------------------------- RDODPTPriorActivity::RDODPTPriorActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info) - : RDODPTActivityHotKey(pDPT, src_info, pattern_src_info) + : RDODPTActivityHotKey(pDPT, src_info, pattern_src_info) {} RDODPTPriorActivity::~RDODPTPriorActivity() @@ -219,14 +219,14 @@ RDODPTPriorActivity::~RDODPTPriorActivity() // -------------------- RDODPTSome // -------------------------------------------------------------------------------- RDODPTSome::RDODPTSome(const RDOParserSrcInfo& src_info, LPILogic pParent) - : RDOLogic(src_info) + : RDOLogic(src_info) { - RDOParser::s_parser()->checkDPTName(this->src_info()); - m_pRuntimeLogic = rdo::Factory::create(RDOParser::s_parser()->runtime(), pParent.object_dynamic_cast()).object_dynamic_cast(); - ASSERT(m_pRuntimeLogic); - m_pRuntimeLogic->init(RDOParser::s_parser()->runtime()); - RDOParser::s_parser()->insertDPTSome(this); - RDOParser::s_parser()->contextStack()->push(this); + RDOParser::s_parser()->checkDPTName(this->src_info()); + m_pRuntimeLogic = rdo::Factory::create(RDOParser::s_parser()->runtime(), pParent.object_dynamic_cast()).object_dynamic_cast(); + ASSERT(m_pRuntimeLogic); + m_pRuntimeLogic->init(RDOParser::s_parser()->runtime()); + RDOParser::s_parser()->insertDPTSome(this); + RDOParser::s_parser()->contextStack()->push(this); } RDODPTSome::~RDODPTSome() @@ -234,22 +234,22 @@ RDODPTSome::~RDODPTSome() Context::LPFindResult RDODPTSome::onFindContext(const std::string& /*method*/, const Context::Params& /*params*/, const RDOParserSrcInfo& /*srcInfo*/) const { - //! Добавлен для порядка, чтобы контекст активности был на стеке после контекста точки - return rdo::Factory::create(); + // Добавлен для порядка, чтобы контекст активности был на стеке после контекста точки + return rdo::Factory::create(); } // -------------------------------------------------------------------------------- // -------------------- RDODPTPrior // -------------------------------------------------------------------------------- RDODPTPrior::RDODPTPrior(const RDOParserSrcInfo& src_info, LPILogic pParent) - : RDOLogic(src_info) + : RDOLogic(src_info) { - RDOParser::s_parser()->checkDPTName(this->src_info()); - m_pRuntimeLogic = rdo::Factory::create(RDOParser::s_parser()->runtime(), pParent.object_dynamic_cast()); - ASSERT(m_pRuntimeLogic); - m_pRuntimeLogic->init(RDOParser::s_parser()->runtime()); - RDOParser::s_parser()->insertDPTPrior(this); - RDOParser::s_parser()->contextStack()->push(this); + RDOParser::s_parser()->checkDPTName(this->src_info()); + m_pRuntimeLogic = rdo::Factory::create(RDOParser::s_parser()->runtime(), pParent.object_dynamic_cast()); + ASSERT(m_pRuntimeLogic); + m_pRuntimeLogic->init(RDOParser::s_parser()->runtime()); + RDOParser::s_parser()->insertDPTPrior(this); + RDOParser::s_parser()->contextStack()->push(this); } RDODPTPrior::~RDODPTPrior() @@ -257,58 +257,58 @@ RDODPTPrior::~RDODPTPrior() Context::LPFindResult RDODPTPrior::onFindContext(const std::string& /*method*/, const Context::Params& /*params*/, const RDOParserSrcInfo& /*srcInfo*/) const { - //! Добавлен для порядка, чтобы контекст активности был на стеке после контекста точки - return rdo::Factory::create(); + // Добавлен для порядка, чтобы контекст активности был на стеке после контекста точки + return rdo::Factory::create(); } // -------------------------------------------------------------------------------- // -------------------- RDODPTSearchActivity // -------------------------------------------------------------------------------- RDODPTSearchActivity::RDODPTSearchActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info) - : RDODPTActivity(src_info, pattern_src_info ) - , m_value (IDPTSearchActivity::vt_before) + : RDODPTActivity(src_info, pattern_src_info ) + , m_value (IDPTSearchActivity::CostTime::BEFORE) { - if (pattern()->getType() != RDOPATPattern::PT_Rule) - { - RDOParser::s_parser()->error().push_only(this->src_info(), "Только продукционные правила могут быть использованы в точке принятия решений типа search"); - RDOParser::s_parser()->error().push_only(pattern()->src_info(), "См. образец"); - RDOParser::s_parser()->error().push_done(); - } - for (RDOPATPattern::RelResList::const_iterator it = pattern()->rel_res_begin(); it != pattern()->rel_res_end(); ++it) - { - if (((*it)->m_statusBegin == rdo::runtime::RDOResource::CS_Create) || ((*it)->m_statusBegin == rdo::runtime::RDOResource::CS_Erase)) - { - RDOParser::s_parser()->error().push_only(this->src_info(), rdo::format("В продукционном правиле '%s' нельзя создавать или удалять ресурсы, т.к. оно используется в точке типа search", src_text().c_str())); - RDOParser::s_parser()->error().push_only(pattern()->src_info(), "См. образец"); - RDOParser::s_parser()->error().push_only((*it)->src_info(), "См. релевантный ресурс"); - RDOParser::s_parser()->error().push_done(); - } - } - m_pActivity = rdo::Factory::create(RDOParser::s_parser()->runtime(), pattern()->getPatRuntime(), true, name()); - ASSERT(m_pActivity); + if (pattern()->getType() != RDOPATPattern::Type::RULE) + { + RDOParser::s_parser()->error().push_only(this->src_info(), "Только продукционные правила могут быть использованы в точке принятия решений типа search"); + RDOParser::s_parser()->error().push_only(pattern()->src_info(), "См. образец"); + RDOParser::s_parser()->error().push_done(); + } + for (RDOPATPattern::RelResList::const_iterator it = pattern()->rel_res_begin(); it != pattern()->rel_res_end(); ++it) + { + if (((*it)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::CREATE) || ((*it)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE)) + { + RDOParser::s_parser()->error().push_only(this->src_info(), rdo::format("В продукционном правиле '%s' нельзя создавать или удалять ресурсы, т.к. оно используется в точке типа search", src_text().c_str())); + RDOParser::s_parser()->error().push_only(pattern()->src_info(), "См. образец"); + RDOParser::s_parser()->error().push_only((*it)->src_info(), "См. релевантный ресурс"); + RDOParser::s_parser()->error().push_done(); + } + } + m_pActivity = rdo::Factory::create(RDOParser::s_parser()->runtime(), pattern()->getPatRuntime(), true, name()); + ASSERT(m_pActivity); } RDODPTSearchActivity::~RDODPTSearchActivity() {} -void RDODPTSearchActivity::setValue(IDPTSearchActivity::ValueTime value, const LPRDOFUNArithm& pRuleCost) +void RDODPTSearchActivity::setValue(IDPTSearchActivity::CostTime value, const LPRDOFUNArithm& pRuleCost) { - m_value = value; - m_pRuleCost = pRuleCost; + m_value = value; + m_pRuleCost = pRuleCost; } // -------------------------------------------------------------------------------- // -------------------- RDODPTSearch // -------------------------------------------------------------------------------- -RDODPTSearch::RDODPTSearch(const RDOParserSrcInfo& src_info, rdo::runtime::RDODPTSearchTrace::DPT_TraceFlag trace, LPILogic pParent) - : RDOLogic(src_info) - , m_pParent(pParent) - , m_closed (false ) - , m_trace (trace ) +RDODPTSearch::RDODPTSearch(const RDOParserSrcInfo& src_info, rdo::runtime::RDODPTSearchTrace::TraceFlag trace, LPILogic pParent) + : RDOLogic(src_info) + , m_pParent(pParent) + , m_closed (false ) + , m_trace (trace ) { - RDOParser::s_parser()->checkDPTName (this->src_info()); - RDOParser::s_parser()->insertDPTSearch(this); - RDOParser::s_parser()->contextStack()->push(this); + RDOParser::s_parser()->checkDPTName (this->src_info()); + RDOParser::s_parser()->insertDPTSearch(this); + RDOParser::s_parser()->contextStack()->push(this); } RDODPTSearch::~RDODPTSearch() @@ -316,44 +316,44 @@ RDODPTSearch::~RDODPTSearch() Context::LPFindResult RDODPTSearch::onFindContext(const std::string& /*method*/, const Context::Params& /*params*/, const RDOParserSrcInfo& /*srcInfo*/) const { - //! Добавлен для порядка, чтобы контекст активности был на стеке после контекста точки - return rdo::Factory::create(); + // Добавлен для порядка, чтобы контекст активности был на стеке после контекста точки + return rdo::Factory::create(); } void RDODPTSearch::end() { - rdo::runtime::LPRDOCalc pCalcCondition = m_pConditon ? m_pConditon->getCalc() : rdo::Factory::create(1).object_parent_cast(); - rdo::runtime::LPRDOCalc pCalcTerminate = m_pTermConditon ? m_pTermConditon->getCalc() : rdo::Factory::create(1).object_parent_cast(); - - m_pRuntimeLogic = rdo::Factory::create(RDOParser::s_parser()->runtime(), - m_pParent.object_dynamic_cast(), - pCalcCondition, - pCalcTerminate, - m_pEvalBy->createCalc(), - m_compTops, - m_trace); - ASSERT(m_pRuntimeLogic); - m_pRuntimeLogic->init(RDOParser::s_parser()->runtime()); - - int size = getActivities().size(); - for (int i = 0; i < size; i++) - { - LPRDODPTSearchActivity pSearchActivity = getActivities().at(i); - ASSERT(pSearchActivity); - LPIDPTSearchActivity pActivity = rdo::Factory::create( - pSearchActivity->activity().object_dynamic_cast(), - pSearchActivity->getValue(), - pSearchActivity->getRuleCost()->createCalc() - ); - ASSERT(pActivity); - LPIDPTSearchLogic pSearchLogic = m_pRuntimeLogic.object_dynamic_cast(); - ASSERT(pSearchLogic); - pSearchLogic->addActivity(pActivity); - } - m_closed = true; - - //! @todo проверить, можно ли избавиться от повторения этой строки. Уже есть в RDOLogicBase::end() - RDOParser::s_parser()->contextStack()->pop(); + rdo::runtime::LPRDOCalc pCalcCondition = m_pConditon ? m_pConditon->getCalc() : rdo::Factory::create(1).object_parent_cast(); + rdo::runtime::LPRDOCalc pCalcTerminate = m_pTermConditon ? m_pTermConditon->getCalc() : rdo::Factory::create(1).object_parent_cast(); + + m_pRuntimeLogic = rdo::Factory::create(RDOParser::s_parser()->runtime(), + m_pParent.object_dynamic_cast(), + pCalcCondition, + pCalcTerminate, + m_pEvalBy->createCalc(), + m_compTops, + m_trace); + ASSERT(m_pRuntimeLogic); + m_pRuntimeLogic->init(RDOParser::s_parser()->runtime()); + + int size = getActivities().size(); + for (int i = 0; i < size; i++) + { + LPRDODPTSearchActivity pSearchActivity = getActivities().at(i); + ASSERT(pSearchActivity); + LPIDPTSearchActivity pActivity = rdo::Factory::create( + pSearchActivity->activity().object_dynamic_cast(), + pSearchActivity->getValue(), + pSearchActivity->getRuleCost()->createCalc() + ); + ASSERT(pActivity); + LPIDPTSearchLogic pSearchLogic = m_pRuntimeLogic.object_dynamic_cast(); + ASSERT(pSearchLogic); + pSearchLogic->addActivity(pActivity); + } + m_closed = true; + + // TODO проверить, можно ли избавиться от повторения этой строки. Уже есть в RDOLogicBase::end() + RDOParser::s_parser()->contextStack()->pop(); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdodpt.h b/simulator/compiler/parser/rdodpt.h index fc159ab26..778e9fdaf 100644 --- a/simulator/compiler/parser/rdodpt.h +++ b/simulator/compiler/parser/rdodpt.h @@ -1,5 +1,4 @@ -#ifndef _LIB_PARSER_DPT_H_ -#define _LIB_PARSER_DPT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -39,32 +38,32 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- RDOParsEvent // -------------------------------------------------------------------------------- class RDOParsEvent - : public RDOParserSrcInfo - , public Context - , public IContextFind + : public RDOParserSrcInfo + , public Context + , public IContextFind { - DECLARE_FACTORY(RDOParsEvent); + DECLARE_FACTORY(RDOParsEvent); public: - const std::string& name() const { return src_info().src_text(); } - const LPIActivity& activity() const { return m_pActivity; } - LPRDOPATPattern pattern () const { return m_pPattern; } + const std::string& name() const { return src_info().src_text(); } + const LPIActivity& activity() const { return m_pActivity; } + LPRDOPATPattern pattern () const { return m_pPattern; } - void addParam(const RDOValue& param); - void endParam(const YYLTYPE& param_pos); + void addParam(const RDOValue& param); + void endParam(const YYLTYPE& param_pos); -// bool setPrior(LPRDOFUNArithm& pPrior); +// bool setPrior(LPRDOFUNArithm& pPrior); protected: - RDOParsEvent(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); - virtual ~RDOParsEvent(); + RDOParsEvent(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); + virtual ~RDOParsEvent(); - LPIActivity m_pActivity; + LPIActivity m_pActivity; private: - std::size_t m_currParam; - LPRDOPATPattern m_pPattern; + std::size_t m_currParam; + LPRDOPATPattern m_pPattern; - DECLARE_IContextFind; + DECLARE_IContextFind; }; DECLARE_POINTER(RDOParsEvent); */ @@ -73,32 +72,32 @@ DECLARE_POINTER(RDOParsEvent); // -------------------- RDODPTActivity // -------------------------------------------------------------------------------- class RDODPTActivity - : public RDOParserSrcInfo - , public Context - , public IContextFind + : public RDOParserSrcInfo + , public Context + , public IContextFind { DECLARE_FACTORY(RDODPTActivity); public: - const std::string& name() const { return src_info().src_text(); } - const LPIActivity& activity() const { return m_pActivity; } - LPRDOPATPattern pattern () const { return m_pPattern; } + const std::string& name() const { return src_info().src_text(); } + const LPIActivity& activity() const { return m_pActivity; } + LPRDOPATPattern pattern () const { return m_pPattern; } - void addParam(const LPRDOValue& pParam); - void endParam(const YYLTYPE& param_pos); + void addParam(const LPRDOValue& pParam); + void endParam(const YYLTYPE& param_pos); - bool setPrior(LPRDOFUNArithm& pPrior); + bool setPrior(LPRDOFUNArithm& pPrior); protected: - RDODPTActivity(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); - virtual ~RDODPTActivity(); + RDODPTActivity(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); + virtual ~RDODPTActivity(); - LPIActivity m_pActivity; + LPIActivity m_pActivity; private: - std::size_t m_currParam; - LPRDOPATPattern m_pPattern; + std::size_t m_currParam; + LPRDOPATPattern m_pPattern; - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; DECLARE_POINTER(RDODPTActivity); @@ -109,11 +108,11 @@ class RDODPTActivityHotKey: public RDODPTActivity { DECLARE_FACTORY(RDODPTActivityHotKey) public: - void addHotKey(const std::string& hotKey, const YYLTYPE& hotkey_pos); + void addHotKey(const std::string& hotKey, const YYLTYPE& hotkey_pos); protected: - RDODPTActivityHotKey(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); - virtual ~RDODPTActivityHotKey(); + RDODPTActivityHotKey(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); + virtual ~RDODPTActivityHotKey(); }; DECLARE_POINTER(RDODPTActivityHotKey); @@ -125,8 +124,8 @@ class RDODPTSomeActivity: public RDODPTActivityHotKey { DECLARE_FACTORY(RDODPTSomeActivity); private: - RDODPTSomeActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); - virtual ~RDODPTSomeActivity(); + RDODPTSomeActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); + virtual ~RDODPTSomeActivity(); }; // -------------------------------------------------------------------------------- @@ -136,25 +135,25 @@ class RDODPTPriorActivity: public RDODPTActivityHotKey { DECLARE_FACTORY(RDODPTPriorActivity); private: - RDODPTPriorActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); - virtual ~RDODPTPriorActivity(); + RDODPTPriorActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); + virtual ~RDODPTPriorActivity(); }; // -------------------------------------------------------------------------------- // -------------------- RDODPTSome // -------------------------------------------------------------------------------- class RDODPTSome - : public RDOLogic - , public Context - , public IContextFind + : public RDOLogic + , public Context + , public IContextFind { DECLARE_FACTORY(RDODPTSome); private: - RDODPTSome(const RDOParserSrcInfo& src_info, LPILogic pParent = NULL); - virtual ~RDODPTSome(); + RDODPTSome(const RDOParserSrcInfo& src_info, LPILogic pParent = NULL); + virtual ~RDODPTSome(); - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; DECLARE_POINTER(RDODPTSome); @@ -162,17 +161,17 @@ DECLARE_POINTER(RDODPTSome); // -------------------- RDODPTPrior // -------------------------------------------------------------------------------- class RDODPTPrior - : public RDOLogic - , public Context - , public IContextFind + : public RDOLogic + , public Context + , public IContextFind { DECLARE_FACTORY(RDODPTPrior); private: - RDODPTPrior(const RDOParserSrcInfo& src_info, LPILogic pParent = NULL); - virtual ~RDODPTPrior(); + RDODPTPrior(const RDOParserSrcInfo& src_info, LPILogic pParent = NULL); + virtual ~RDODPTPrior(); - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; DECLARE_POINTER(RDODPTPrior); @@ -183,18 +182,18 @@ class RDODPTSearchActivity: public RDODPTActivity { DECLARE_FACTORY(RDODPTSearchActivity); public: - IDPTSearchActivity::ValueTime getValue() const { return m_value; } - void setValue(IDPTSearchActivity::ValueTime value, - const LPRDOFUNArithm& pRuleCost); + IDPTSearchActivity::CostTime getValue() const { return m_value; } + void setValue(IDPTSearchActivity::CostTime value, + const LPRDOFUNArithm& pRuleCost); - LPRDOFUNArithm getRuleCost() const { return m_pRuleCost; } + LPRDOFUNArithm getRuleCost() const { return m_pRuleCost; } private: - RDODPTSearchActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); - virtual ~RDODPTSearchActivity(); + RDODPTSearchActivity(LPIBaseOperationContainer pDPT, const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& pattern_src_info); + virtual ~RDODPTSearchActivity(); - IDPTSearchActivity::ValueTime m_value; - LPRDOFUNArithm m_pRuleCost; + IDPTSearchActivity::CostTime m_value; + LPRDOFUNArithm m_pRuleCost; }; DECLARE_POINTER(RDODPTSearchActivity); @@ -202,33 +201,31 @@ DECLARE_POINTER(RDODPTSearchActivity); // -------------------- RDODPTSearch // -------------------------------------------------------------------------------- class RDODPTSearch - : public RDOLogic - , public Context - , public IContextFind + : public RDOLogic + , public Context + , public IContextFind { DECLARE_FACTORY(RDODPTSearch); public: - void setTermCondition(const LPRDOFUNLogic& pTermConditon = NULL) { m_pTermConditon = pTermConditon; } - void setEvaluateBy(const LPRDOFUNArithm& pEvalBy) { m_pEvalBy = pEvalBy; } - void setCompareTops(bool compTops) { m_compTops = compTops; } - void end(); - bool closed() const { return m_closed; } + void setTermCondition(const LPRDOFUNLogic& pTermConditon = NULL) { m_pTermConditon = pTermConditon; } + void setEvaluateBy(const LPRDOFUNArithm& pEvalBy) { m_pEvalBy = pEvalBy; } + void setCompareTops(bool compTops) { m_compTops = compTops; } + void end(); + bool closed() const { return m_closed; } private: - RDODPTSearch(const RDOParserSrcInfo& src_info, rdo::runtime::RDODPTSearchTrace::DPT_TraceFlag trace = rdo::runtime::RDODPTSearchTrace::DPT_no_trace, LPILogic pParent = NULL); - virtual ~RDODPTSearch(); + RDODPTSearch(const RDOParserSrcInfo& src_info, rdo::runtime::RDODPTSearchTrace::TraceFlag trace = rdo::runtime::RDODPTSearchTrace::TraceFlag::NO_TRACE, LPILogic pParent = NULL); + virtual ~RDODPTSearch(); - LPRDOFUNLogic m_pTermConditon; - LPRDOFUNArithm m_pEvalBy; - LPILogic m_pParent; - bool m_compTops; - bool m_closed; - rdo::runtime::RDODPTSearchTrace::DPT_TraceFlag m_trace; + LPRDOFUNLogic m_pTermConditon; + LPRDOFUNArithm m_pEvalBy; + LPILogic m_pParent; + bool m_compTops; + bool m_closed; + rdo::runtime::RDODPTSearchTrace::TraceFlag m_trace; - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; DECLARE_POINTER(RDODPTSearch); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _LIB_PARSER_DPT_H_ diff --git a/simulator/compiler/parser/rdofun.cpp b/simulator/compiler/parser/rdofun.cpp index a472be290..491db23c4 100644 --- a/simulator/compiler/parser/rdofun.cpp +++ b/simulator/compiler/parser/rdofun.cpp @@ -23,9 +23,9 @@ OPEN_RDO_PARSER_NAMESPACE int funlex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void funerror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -36,64 +36,64 @@ void funerror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) // -------------------------------------------------------------------------------- void RDOFUNDoubleToIntByResult::roundCalc() { - for (const auto& intOrDouble: m_intOrDouble) - { - intOrDouble->needRound(); - } + for (const auto& intOrDouble: m_intOrDouble) + { + intOrDouble->needRound(); + } } // -------------------------------------------------------------------------------- // -------------------- RDOFUNBase // -------------------------------------------------------------------------------- RDOFUNBase::RDOFUNBase(const RDOParserSrcInfo& srcInfo) - : RDOParserSrcInfo(srcInfo) + : RDOParserSrcInfo(srcInfo) {} RDOFUNBase::RDOFUNBase(const LPExpression& pExpression) - : m_pExpression(pExpression) + : m_pExpression(pExpression) { - ASSERT(m_pExpression); + ASSERT(m_pExpression); } const LPExpression& RDOFUNBase::expression() const { - ASSERT(m_pExpression); - return m_pExpression; + ASSERT(m_pExpression); + return m_pExpression; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNLogic // -------------------------------------------------------------------------------- RDOFUNLogic::RDOFUNLogic(const LPRDOFUNArithm& pArithm) - : RDOFUNBase(pArithm->expression()) + : RDOFUNBase(pArithm->expression()) { - if (pArithm->typeID() != rdo::runtime::RDOType::t_bool) - { - RDOParser::s_parser()->error().error(src_info(), rdo::format("Ожидается логическое выражение, найдено: %s", src_text().c_str())); - } + if (pArithm->typeID() != rdo::runtime::RDOType::Type::BOOL) + { + RDOParser::s_parser()->error().error(src_info(), rdo::format("Ожидается логическое выражение, найдено: %s", src_text().c_str())); + } } RDOFUNLogic::RDOFUNLogic(const LPExpression& pExpression, bool hideWarning) - : RDOFUNBase(pExpression) -{ - rdo::runtime::RDOSrcInfo srcInfo = m_pExpression->src_info(); - srcInfo.setSrcFileType(src_filetype()); - m_pExpression->setSrcInfo(srcInfo); - if (!hideWarning) - { - rdo::runtime::LPRDOCalcConst pConstCalc = m_pExpression->calc().object_dynamic_cast(); - if (pConstCalc) - { - if (pConstCalc->getValue().getAsBool()) - { - RDOParser::s_parser()->error().warning(pConstCalc->srcInfo(), rdo::format("Логическое выражение всегда истинно: %s", pConstCalc->srcInfo().src_text().c_str())); - } - else - { - RDOParser::s_parser()->error().warning(pConstCalc->srcInfo(), rdo::format("Логическое выражение всегда ложно: %s", pConstCalc->srcInfo().src_text().c_str())); - } - } - } + : RDOFUNBase(pExpression) +{ + rdo::runtime::RDOSrcInfo srcInfo = m_pExpression->src_info(); + srcInfo.setSrcFileType(src_filetype()); + m_pExpression->setSrcInfo(srcInfo); + if (!hideWarning) + { + rdo::runtime::LPRDOCalcConst pConstCalc = m_pExpression->calc().object_dynamic_cast(); + if (pConstCalc) + { + if (pConstCalc->getValue().getAsBool()) + { + RDOParser::s_parser()->error().warning(pConstCalc->srcInfo(), rdo::format("Логическое выражение всегда истинно: %s", pConstCalc->srcInfo().src_text().c_str())); + } + else + { + RDOParser::s_parser()->error().warning(pConstCalc->srcInfo(), rdo::format("Логическое выражение всегда ложно: %s", pConstCalc->srcInfo().src_text().c_str())); + } + } + } } RDOFUNLogic::~RDOFUNLogic() @@ -101,114 +101,114 @@ RDOFUNLogic::~RDOFUNLogic() LPRDOFUNLogic RDOFUNLogic::generateTrue(const RDOParserSrcInfo& srcInfo) { - LPExpression pExpression = rdo::Factory::create( - rdo::Factory::delegate(srcInfo), - rdo::Factory::create(true), - srcInfo - ); - ASSERT(pExpression); + LPExpression pExpression = rdo::Factory::create( + rdo::Factory::delegate(srcInfo), + rdo::Factory::create(true), + srcInfo + ); + ASSERT(pExpression); - LPRDOFUNLogic pLogic = rdo::Factory::create(pExpression, false); - ASSERT(pLogic); + LPRDOFUNLogic pLogic = rdo::Factory::create(pExpression, false); + ASSERT(pLogic); - return pLogic; + return pLogic; } -rdo::runtime::LPRDOCalc RDOFUNLogic::getCalc(rdo::runtime::RDOType::TypeID id) +rdo::runtime::LPRDOCalc RDOFUNLogic::getCalc(rdo::runtime::RDOType::Type id) { - if (id != rdo::runtime::RDOType::t_real) - { - m_intOrDouble.roundCalc(); - } - return m_pExpression->calc(); + if (id != rdo::runtime::RDOType::Type::REAL) + { + m_intOrDouble.roundCalc(); + } + return m_pExpression->calc(); } LPRDOFUNLogic RDOFUNLogic::createLogic(const rdo::runtime::LPRDOCalc& pCalc) { - ASSERT(pCalc); + ASSERT(pCalc); - LPExpression pExpression = rdo::Factory::create( - rdo::Factory::delegate(pCalc->srcInfo()), - pCalc, - pCalc->srcInfo() - ); - ASSERT(pExpression); + LPExpression pExpression = rdo::Factory::create( + rdo::Factory::delegate(pCalc->srcInfo()), + pCalc, + pCalc->srcInfo() + ); + ASSERT(pExpression); - LPRDOFUNLogic pLogic = rdo::Factory::create(pExpression, false); - ASSERT(pLogic); + LPRDOFUNLogic pLogic = rdo::Factory::create(pExpression, false); + ASSERT(pLogic); - pLogic->setSrcInfo(pCalc->srcInfo()); + pLogic->setSrcInfo(pCalc->srcInfo()); - return pLogic; + return pLogic; } template LPRDOFUNLogic RDOFUNLogic::generateLogic(const LPRDOFUNLogic& pSecond) { - ASSERT(pSecond); + ASSERT(pSecond); - rdo::runtime::LPRDOCalc pCalc = rdo::runtime::RDOCalcBinaryBase::generateCalc(m_pExpression->calc(), pSecond->m_pExpression->calc()); - ASSERT(pCalc); - LPRDOFUNLogic pLogic = createLogic(pCalc); - pLogic->m_intOrDouble.insert(m_intOrDouble, pSecond->m_intOrDouble); - return pLogic; + rdo::runtime::LPRDOCalc pCalc = rdo::runtime::RDOCalcBinaryBase::generateCalc(m_pExpression->calc(), pSecond->m_pExpression->calc()); + ASSERT(pCalc); + LPRDOFUNLogic pLogic = createLogic(pCalc); + pLogic->m_intOrDouble.insert(m_intOrDouble, pSecond->m_intOrDouble); + return pLogic; } template LPRDOFUNLogic RDOFUNLogic::generateLogic(const RDOSrcInfo::Position& position) { - rdo::runtime::LPRDOCalc pCalc = rdo::runtime::RDOCalcUnaryBase::generateCalc(position, m_pExpression->calc()); - ASSERT(pCalc); - LPRDOFUNLogic pLogic = createLogic(pCalc); - pLogic->m_intOrDouble.insert(m_intOrDouble); - return pLogic; + rdo::runtime::LPRDOCalc pCalc = rdo::runtime::RDOCalcUnaryBase::generateCalc(position, m_pExpression->calc()); + ASSERT(pCalc); + LPRDOFUNLogic pLogic = createLogic(pCalc); + pLogic->m_intOrDouble.insert(m_intOrDouble); + return pLogic; } LPRDOFUNLogic RDOFUNLogic::operator&& (const LPRDOFUNLogic& pSecond) { - return generateLogic(pSecond); + return generateLogic(pSecond); } LPRDOFUNLogic RDOFUNLogic::operator|| (const LPRDOFUNLogic& pSecond) { - return generateLogic(pSecond); + return generateLogic(pSecond); } LPRDOFUNLogic RDOFUNLogic::operator_not(const RDOSrcInfo::Position& position) { - return generateLogic(position); + return generateLogic(position); } void RDOFUNLogic::setSrcInfo(const RDOParserSrcInfo& srcInfo) { - RDOParserSrcInfo::setSrcInfo(srcInfo); - m_pExpression->setSrcInfo(srcInfo); + RDOParserSrcInfo::setSrcInfo(srcInfo); + m_pExpression->setSrcInfo(srcInfo); } void RDOFUNLogic::setSrcPos(const RDOSrcInfo::Position& position) { - RDOParserSrcInfo::setSrcPos(position); - rdo::runtime::RDOSrcInfo srcInfo = m_pExpression->src_info(); - srcInfo.setSrcPos(position); - m_pExpression->setSrcInfo(srcInfo); + RDOParserSrcInfo::setSrcPos(position); + rdo::runtime::RDOSrcInfo srcInfo = m_pExpression->src_info(); + srcInfo.setSrcPos(position); + m_pExpression->setSrcInfo(srcInfo); } void RDOFUNLogic::setSrcText(const std::string& value) { - RDOParserSrcInfo::setSrcText(value); - rdo::runtime::RDOSrcInfo srcInfo = m_pExpression->src_info(); - srcInfo.setSrcText(value); - m_pExpression->setSrcInfo(srcInfo); + RDOParserSrcInfo::setSrcText(value); + rdo::runtime::RDOSrcInfo srcInfo = m_pExpression->src_info(); + srcInfo.setSrcText(value); + m_pExpression->setSrcInfo(srcInfo); } void RDOFUNLogic::setSrcPos(const YYLTYPE& error_pos) { - RDOParserSrcInfo::setSrcPos(error_pos); + RDOParserSrcInfo::setSrcPos(error_pos); } void RDOFUNLogic::setSrcPos(const YYLTYPE& pos_begin, const YYLTYPE& pos_end) { - RDOParserSrcInfo::setSrcPos(pos_begin, pos_end); + RDOParserSrcInfo::setSrcPos(pos_begin, pos_end); } // -------------------------------------------------------------------------------- @@ -217,10 +217,10 @@ void RDOFUNLogic::setSrcPos(const YYLTYPE& pos_begin, const YYLTYPE& pos_end) const std::string RDOFUNArithm::CONTEXT_PARAM_SET_ARITHM = "set_arithm"; RDOFUNArithm::RDOFUNArithm(const LPExpression& pExpression) - : RDOFUNBase(pExpression) + : RDOFUNBase(pExpression) { - ASSERT(m_pExpression); - setSrcInfo(m_pExpression->src_info()); + ASSERT(m_pExpression); + setSrcInfo(m_pExpression->src_info()); } RDOFUNArithm::~RDOFUNArithm() @@ -228,429 +228,429 @@ RDOFUNArithm::~RDOFUNArithm() LPRDOFUNArithm RDOFUNArithm::generateByConst(const LPRDOValue& pValue) { - ASSERT(pValue); - ASSERT(pValue->constant()); + ASSERT(pValue); + ASSERT(pValue->constant()); - LPExpression pExpression = rdo::Factory::create(pValue); - ASSERT(pExpression); + LPExpression pExpression = rdo::Factory::create(pValue); + ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); - return pArithm; + return pArithm; } LPRDOFUNArithm RDOFUNArithm::generateByIdentificator(const LPRDOValue& pValue) { - ASSERT(pValue); + ASSERT(pValue); - LPContext pContext = RDOParser::s_parser()->context(); - ASSERT(pContext); + LPContext pContext = RDOParser::s_parser()->context(); + ASSERT(pContext); - Context::Params params; - params[Context::Params::IDENTIFIER] = pValue->value().getIdentificator(); - Context::LPFindResult result = pContext->find(Context::METHOD_GET, params, pValue->src_info()); - ASSERT(result->getCreateExpression()); + Context::Params params; + params[Context::Params::IDENTIFIER] = pValue->value().getIdentificator(); + Context::LPFindResult result = pContext->find(Context::METHOD_GET, params, pValue->src_info()); + ASSERT(result->getCreateExpression()); - LPExpression pExpression = result->getCreateExpression()(); - ASSERT(pExpression); + LPExpression pExpression = result->getCreateExpression()(); + ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); - return pArithm; + return pArithm; } LPRDOFUNArithm RDOFUNArithm::generateByIdentificator(const LPRDOValue& pValue1, const LPRDOValue& pValue2) { - ASSERT(pValue1); - ASSERT(pValue2); + ASSERT(pValue1); + ASSERT(pValue2); - LPContext pContext = RDOParser::s_parser()->context(); - ASSERT(pContext); + LPContext pContext = RDOParser::s_parser()->context(); + ASSERT(pContext); - Context::Params params; - params[Context::Params::IDENTIFIER] = pValue1->value().getIdentificator(); - Context::LPFindResult result = pContext->find(Context::METHOD_OPERATOR_DOT, params, pValue1->src_info()); - ASSERT(result->getSwitchContext()); + Context::Params params; + params[Context::Params::IDENTIFIER] = pValue1->value().getIdentificator(); + Context::LPFindResult result = pContext->find(Context::METHOD_OPERATOR_DOT, params, pValue1->src_info()); + ASSERT(result->getSwitchContext()); - params = result->getSwitchContext().params; - ASSERT(!params.exists(Context::Params::IDENTIFIER)); - params[Context::Params::IDENTIFIER] = pValue2->value().getIdentificator(); - result = result->getSwitchContext().context->find(Context::METHOD_GET, params, pValue2->src_info()); - ASSERT(result->getCreateExpression()); + params = result->getSwitchContext().params; + ASSERT(!params.exists(Context::Params::IDENTIFIER)); + params[Context::Params::IDENTIFIER] = pValue2->value().getIdentificator(); + result = result->getSwitchContext().context->find(Context::METHOD_GET, params, pValue2->src_info()); + ASSERT(result->getCreateExpression()); - LPExpression pExpression = result->getCreateExpression()(); - ASSERT(pExpression); + LPExpression pExpression = result->getCreateExpression()(); + ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); - return pArithm; + return pArithm; } void RDOFUNArithm::castType(const LPRDOFUNArithm& pSecond, const std::string& error) { - try - { - expression()->typeInfo()->itype()->type_cast(pSecond->expression()->typeInfo()->itype(), pSecond->expression()->src_info(), expression()->src_info(), expression()->src_info()); - } - catch (const RDOSyntaxException&) - { - RDOParser::s_parser()->error().error(pSecond->src_info(), rdo::format(error.c_str(), typeInfo()->itype()->name().c_str(), pSecond->typeInfo()->itype()->name().c_str())); - } + try + { + expression()->typeInfo()->itype()->type_cast(pSecond->expression()->typeInfo()->itype(), pSecond->expression()->src_info(), expression()->src_info(), expression()->src_info()); + } + catch (const RDOSyntaxException&) + { + RDOParser::s_parser()->error().error(pSecond->src_info(), rdo::format(error.c_str(), typeInfo()->itype()->name().c_str(), pSecond->typeInfo()->itype()->name().c_str())); + } } void RDOFUNArithm::castValue(const LPRDOFUNArithm& pSecond, const std::string& error) { - try - { - LPIType pType = expression()->typeInfo()->itype()->type_cast(pSecond->expression()->typeInfo()->itype(), pSecond->expression()->src_info(), expression()->src_info(), expression()->src_info()); - ASSERT(pType); - LPRDOValue pConstant = pSecond->expression()->constant(); - if (pConstant && pConstant->defined()) - { - pConstant = expression()->typeInfo()->itype()->value_cast(pConstant, expression()->src_info(), pSecond->expression()->src_info()); - ASSERT(pConstant); - pSecond->m_pExpression = rdo::Factory::create( - rdo::Factory::create( - pType, - expression()->src_info() - ), - rdo::Factory::create(pConstant->value()), - pConstant->src_info() - ); - ASSERT(pSecond->m_pExpression); - } - } - catch (const RDOSyntaxException&) - { - RDOParser::s_parser()->error().error(pSecond->src_info(), rdo::format(error.c_str(), expression()->src_info().src_text().c_str(), pSecond->expression()->src_info().src_text().c_str())); - } + try + { + LPIType pType = expression()->typeInfo()->itype()->type_cast(pSecond->expression()->typeInfo()->itype(), pSecond->expression()->src_info(), expression()->src_info(), expression()->src_info()); + ASSERT(pType); + LPRDOValue pConstant = pSecond->expression()->constant(); + if (pConstant && pConstant->defined()) + { + pConstant = expression()->typeInfo()->itype()->value_cast(pConstant, expression()->src_info(), pSecond->expression()->src_info()); + ASSERT(pConstant); + pSecond->m_pExpression = rdo::Factory::create( + rdo::Factory::create( + pType, + expression()->src_info() + ), + rdo::Factory::create(pConstant->value()), + pConstant->src_info() + ); + ASSERT(pSecond->m_pExpression); + } + } + catch (const RDOSyntaxException&) + { + RDOParser::s_parser()->error().error(pSecond->src_info(), rdo::format(error.c_str(), expression()->src_info().src_text().c_str(), pSecond->expression()->src_info().src_text().c_str())); + } } template rdo::runtime::LPRDOCalc RDOFUNArithm::generateCalc(const rdo::runtime::RDOSrcInfo::Position& position, const std::string& /*error*/) { - rdo::runtime::LPRDOCalc pCalc = rdo::runtime::RDOCalcUnaryBase::generateCalc(position, m_pExpression->calc()); - ASSERT(pCalc); - return pCalc; + rdo::runtime::LPRDOCalc pCalc = rdo::runtime::RDOCalcUnaryBase::generateCalc(position, m_pExpression->calc()); + ASSERT(pCalc); + return pCalc; } template rdo::runtime::LPRDOCalc RDOFUNArithm::generateCalc(const LPRDOFUNArithm& pSecond, const std::string& error) { - castType(pSecond, error); - rdo::runtime::LPRDOCalc pCalc = rdo::runtime::RDOCalcBinaryBase::generateCalc(m_pExpression->calc(), pSecond->m_pExpression->calc()); - ASSERT(pCalc); - return pCalc; + castType(pSecond, error); + rdo::runtime::LPRDOCalc pCalc = rdo::runtime::RDOCalcBinaryBase::generateCalc(m_pExpression->calc(), pSecond->m_pExpression->calc()); + ASSERT(pCalc); + return pCalc; } template LPRDOFUNArithm RDOFUNArithm::generateArithm(const rdo::runtime::RDOSrcInfo::Position& position, const std::string& error) { - rdo::runtime::LPRDOCalc pCalc = generateCalc(position, error); - ASSERT(pCalc); + rdo::runtime::LPRDOCalc pCalc = generateCalc(position, error); + ASSERT(pCalc); - LPTypeInfo pType = getPreType(this); - ASSERT(pType); + LPTypeInfo pType = getPreType(this); + ASSERT(pType); - LPExpression pExpression = rdo::Factory::create( - pType, - pCalc, - pCalc->srcInfo() - ); - ASSERT(pExpression); + LPExpression pExpression = rdo::Factory::create( + pType, + pCalc, + pCalc->srcInfo() + ); + ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); - pArithm->m_intOrDouble.insert(m_intOrDouble); - return pArithm; + pArithm->m_intOrDouble.insert(m_intOrDouble); + return pArithm; } template LPRDOFUNArithm RDOFUNArithm::generateArithm(const LPRDOFUNArithm& pSecond, const std::string& error) { - rdo::runtime::LPRDOCalc pCalc = generateCalc(pSecond, error); - ASSERT(pCalc); + rdo::runtime::LPRDOCalc pCalc = generateCalc(pSecond, error); + ASSERT(pCalc); - LPTypeInfo pType = getPreType(pSecond); - ASSERT(pType); + LPTypeInfo pType = getPreType(pSecond); + ASSERT(pType); - LPExpression pExpression = rdo::Factory::create( - pType, - pCalc, - pCalc->srcInfo() - ); - ASSERT(pExpression); + LPExpression pExpression = rdo::Factory::create( + pType, + pCalc, + pCalc->srcInfo() + ); + ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); - pArithm->m_intOrDouble.insert(m_intOrDouble, pSecond->m_intOrDouble); - return pArithm; + pArithm->m_intOrDouble.insert(m_intOrDouble, pSecond->m_intOrDouble); + return pArithm; } template LPRDOFUNLogic RDOFUNArithm::generateLogic(const LPRDOFUNArithm& pSecond, const std::string& error) { - rdo::runtime::LPRDOCalc pCalc = generateCalc(pSecond, error); - ASSERT(pCalc); + rdo::runtime::LPRDOCalc pCalc = generateCalc(pSecond, error); + ASSERT(pCalc); - LPExpression pExpression = rdo::Factory::create( - rdo::Factory::delegate(pCalc->srcInfo()), - pCalc, - pCalc->srcInfo() - ); - ASSERT(pExpression); + LPExpression pExpression = rdo::Factory::create( + rdo::Factory::delegate(pCalc->srcInfo()), + pCalc, + pCalc->srcInfo() + ); + ASSERT(pExpression); - LPRDOFUNLogic pLogic = rdo::Factory::create(pExpression, false); - ASSERT(pLogic); + LPRDOFUNLogic pLogic = rdo::Factory::create(pExpression, false); + ASSERT(pLogic); - pLogic->setSrcInfo(pCalc->srcInfo()); - pLogic->m_intOrDouble.insert(m_intOrDouble, pSecond->m_intOrDouble); - return pLogic; + pLogic->setSrcInfo(pCalc->srcInfo()); + pLogic->m_intOrDouble.insert(m_intOrDouble, pSecond->m_intOrDouble); + return pLogic; } rdo::runtime::RDOValue RDOFUNArithm::const_value() const { - rdo::runtime::LPRDOCalcConst pCalc = calc().object_dynamic_cast(); - ASSERT(pCalc); - return pCalc->getValue(); + rdo::runtime::LPRDOCalcConst pCalc = calc().object_dynamic_cast(); + ASSERT(pCalc); + return pCalc->getValue(); } LPTypeInfo RDOFUNArithm::getPreType(const LPRDOFUNArithm& pSecond) { - if (typeID() == rdo::runtime::RDOType::t_unknow) - { - RDOParser::s_parser()->error().error(src_info(), rdo::format("Внутренная ошибка парсера: неопределенное значение арифметического выражения: %s", src_text().c_str())); - } - if (pSecond->typeID() == rdo::runtime::RDOType::t_unknow) - { - RDOParser::s_parser()->error().error(pSecond->src_info(), rdo::format("Внутренная ошибка парсера: неопределенное значение арифметического выражения: %s", pSecond->src_text().c_str())); - } - if (typeID() == rdo::runtime::RDOType::t_identificator) - { - rdo::runtime::LPRDOCalcConst pCalc = calc().object_dynamic_cast(); - ASSERT(pCalc); - RDOParser::s_parser()->error().error(src_info(), rdo::format("Неизвестный идентификатор: %s", const_value().getIdentificator().c_str())); - } - if (pSecond->typeID() == rdo::runtime::RDOType::t_identificator) - { - RDOParser::s_parser()->error().error(pSecond->src_info(), rdo::format("Неизвестный идентификатор: %s", pSecond->const_value().getIdentificator().c_str())); - } - - return typeInfo()->type_cast(pSecond->typeInfo(), src_info()); + if (typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + RDOParser::s_parser()->error().error(src_info(), rdo::format("Внутренняя ошибка парсера: неопределенное значение арифметического выражения: %s", src_text().c_str())); + } + if (pSecond->typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + RDOParser::s_parser()->error().error(pSecond->src_info(), rdo::format("Внутренняя ошибка парсера: неопределенное значение арифметического выражения: %s", pSecond->src_text().c_str())); + } + if (typeID() == rdo::runtime::RDOType::Type::IDENTIFICATOR) + { + rdo::runtime::LPRDOCalcConst pCalc = calc().object_dynamic_cast(); + ASSERT(pCalc); + RDOParser::s_parser()->error().error(src_info(), rdo::format("Неизвестный идентификатор: %s", const_value().getIdentificator().c_str())); + } + if (pSecond->typeID() == rdo::runtime::RDOType::Type::IDENTIFICATOR) + { + RDOParser::s_parser()->error().error(pSecond->src_info(), rdo::format("Неизвестный идентификатор: %s", pSecond->const_value().getIdentificator().c_str())); + } + + return typeInfo()->type_cast(pSecond->typeInfo(), src_info()); } LPRDOFUNArithm RDOFUNArithm::operator+ (const LPRDOFUNArithm& pSecond) { - return generateArithm(pSecond, "Ну не могу я сложить %s и %s"); + return generateArithm(pSecond, "Ну не могу я сложить %s и %s"); } LPRDOFUNArithm RDOFUNArithm::operator- (const LPRDOFUNArithm& pSecond) { - return generateArithm(pSecond, "Нельзя из %s вычесть %s"); + return generateArithm(pSecond, "Нельзя из %s вычесть %s"); } LPRDOFUNArithm RDOFUNArithm::operator* (const LPRDOFUNArithm& pSecond) { - return generateArithm(pSecond, "Нельзя %s умножить на %s"); + return generateArithm(pSecond, "Нельзя %s умножить на %s"); } LPRDOFUNArithm RDOFUNArithm::operator/ (const LPRDOFUNArithm& pSecond) { - rdo::runtime::LPRDOCalc pCalc = generateCalc(pSecond, "Нельзя %s разделить на %s"); - ASSERT(pCalc); - LPTypeInfo pType = getPreType(pSecond); - ASSERT(pType); - - /// @todo перевод вещественного в целое при делении. А что делать с умножением и т.д. ? - //! Ответ: с умножением надо делать тоже самое, только непонятно как - if (pType->typeID() == rdo::runtime::RDOType::t_int) - { - rdo::runtime::LPRDOCalc pNewCalcDiv = pCalc; - pCalc = rdo::Factory::create(pNewCalcDiv); - pCalc->setSrcInfo(pNewCalcDiv->srcInfo()); - } - LPExpression pExpression = rdo::Factory::create( - pType, - pCalc, - pCalc->srcInfo() - ); - ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - if (pType->typeID() == rdo::runtime::RDOType::t_int) - { - rdo::runtime::LPRDOCalcDoubleToIntByResult pResult = pCalc.object_static_cast(); - pArithm->m_intOrDouble.push_back(pResult); - } - pArithm->m_intOrDouble.insert(m_intOrDouble, pSecond->m_intOrDouble); - return pArithm; + rdo::runtime::LPRDOCalc pCalc = generateCalc(pSecond, "Нельзя %s разделить на %s"); + ASSERT(pCalc); + LPTypeInfo pType = getPreType(pSecond); + ASSERT(pType); + + // TODO перевод вещественного в целое при делении. А что делать с умножением и т.д. ? + // Ответ: с умножением надо делать тоже самое, только непонятно как + if (pType->typeID() == rdo::runtime::RDOType::Type::INT) + { + rdo::runtime::LPRDOCalc pNewCalcDiv = pCalc; + pCalc = rdo::Factory::create(pNewCalcDiv); + pCalc->setSrcInfo(pNewCalcDiv->srcInfo()); + } + LPExpression pExpression = rdo::Factory::create( + pType, + pCalc, + pCalc->srcInfo() + ); + ASSERT(pExpression); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + if (pType->typeID() == rdo::runtime::RDOType::Type::INT) + { + rdo::runtime::LPRDOCalcDoubleToIntByResult pResult = pCalc.object_static_cast(); + pArithm->m_intOrDouble.push_back(pResult); + } + pArithm->m_intOrDouble.insert(m_intOrDouble, pSecond->m_intOrDouble); + return pArithm; } LPRDOFUNArithm RDOFUNArithm::setEqual(const LPRDOFUNArithm& pSecond) { - castValue(pSecond, "Ошибка присваивания %s = %s"); - return this; + castValue(pSecond, "Ошибка присваивания %s = %s"); + return this; } LPRDOFUNArithm RDOFUNArithm::uminus(const rdo::runtime::RDOSrcInfo::Position& position) { - return generateArithm(position, "Нельзя взять унарный минус от %s"); + return generateArithm(position, "Нельзя взять унарный минус от %s"); } LPRDOFUNLogic RDOFUNArithm::operator< (const LPRDOFUNArithm& pSecond) { - return generateLogic(pSecond, "Нельзя сравнивать %s и %s"); + return generateLogic(pSecond, "Нельзя сравнивать %s и %s"); } LPRDOFUNLogic RDOFUNArithm::operator> (const LPRDOFUNArithm& pSecond) { - return generateLogic(pSecond, "Нельзя сравнивать %s и %s"); + return generateLogic(pSecond, "Нельзя сравнивать %s и %s"); } LPRDOFUNLogic RDOFUNArithm::operator<= (const LPRDOFUNArithm& pSecond) { - return generateLogic(pSecond, "Нельзя сравнивать %s и %s"); + return generateLogic(pSecond, "Нельзя сравнивать %s и %s"); } LPRDOFUNLogic RDOFUNArithm::operator>= (const LPRDOFUNArithm& pSecond) { - return generateLogic(pSecond, "Нельзя сравнивать %s и %s"); + return generateLogic(pSecond, "Нельзя сравнивать %s и %s"); } LPRDOFUNLogic RDOFUNArithm::operator== (const LPRDOFUNArithm& pSecond) { - castValue(pSecond, "Ошибка сравнения %s == %s"); - return generateLogic(pSecond, "Нельзя сравнивать %s и %s"); + castValue(pSecond, "Ошибка сравнения %s == %s"); + return generateLogic(pSecond, "Нельзя сравнивать %s и %s"); } LPRDOFUNLogic RDOFUNArithm::operator!= (const LPRDOFUNArithm& pSecond) { - castValue(pSecond, "Ошибка сравнения %s <> %s"); - return generateLogic(pSecond, "Нельзя сравнивать %s и %s"); + castValue(pSecond, "Ошибка сравнения %s <> %s"); + return generateLogic(pSecond, "Нельзя сравнивать %s и %s"); } void RDOFUNArithm::checkParamType(const LPTypeInfo& pType) { - pType->itype()->type_cast(typeInfo()->itype(), src_info(), pType->src_info(), src_info()); - rdo::runtime::LPRDOCalcConst pConstCalc = calc().object_dynamic_cast(); - if (pConstCalc) - { - rdo::runtime::RDOValue value = pConstCalc->getValue(); - pType->value_cast(rdo::Factory::create(value, src_info(), typeInfo())); - } + pType->itype()->type_cast(typeInfo()->itype(), src_info(), pType->src_info(), src_info()); + rdo::runtime::LPRDOCalcConst pConstCalc = calc().object_dynamic_cast(); + if (pConstCalc) + { + rdo::runtime::RDOValue value = pConstCalc->getValue(); + pType->value_cast(rdo::Factory::create(value, src_info(), typeInfo())); + } } void RDOFUNArithm::wrongVarInitialization(const LPRDOValue& name) { - const std::string identificator = name->value().getIdentificator(); - LPRDOFUNFunction pFunction = RDOParser::s_parser()->getLastFUNFunction(); - ASSERT(pFunction); - LPRDOParam pParam = pFunction->findParam(identificator); - if (pParam) - { - RDOParser::s_parser()->error().error(name->src_info(), rdo::format("Функции не могут изменить свой параметр: %s", identificator.c_str())); - } - else - { - RDOParser::s_parser()->error().error(name->src_info(), rdo::format("Неизвестный идентификатор: %s", identificator.c_str())); - } + const std::string identificator = name->value().getIdentificator(); + LPRDOFUNFunction pFunction = RDOParser::s_parser()->getLastFUNFunction(); + ASSERT(pFunction); + LPRDOParam pParam = pFunction->findParam(identificator); + if (pParam) + { + RDOParser::s_parser()->error().error(name->src_info(), rdo::format("Функции не могут изменить свой параметр: %s", identificator.c_str())); + } + else + { + RDOParser::s_parser()->error().error(name->src_info(), rdo::format("Неизвестный идентификатор: %s", identificator.c_str())); + } } rdo::runtime::LPRDOCalc RDOFUNArithm::createCalc(const LPTypeInfo& pForType) { - if (typeID() != rdo::runtime::RDOType::t_identificator) - { - if (!pForType) - { - return m_pExpression->calc(); - } - if (pForType->typeID() != rdo::runtime::RDOType::t_int) - { - if (pForType->typeID() == rdo::runtime::RDOType::t_enum) - { - m_intOrDouble.roundCalc(); - } - return m_pExpression->calc(); - } - else - { - m_intOrDouble.roundCalc(); - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_pExpression->calc()->srcInfo().src_pos(), m_pExpression->calc()); - ASSERT(pCalc); - pCalc->setSrcInfo(src_info()); - return pCalc; - } - } - else if (typeID() == rdo::runtime::RDOType::t_identificator && !pForType) - { - RDOParser::s_parser()->error().error(src_info(), rdo::format("Неизвестный идентификатор: %s", const_value().getAsString().c_str())); - } - - if (!pForType) - { - RDOParser::s_parser()->error().error(src_info(), "Неизвестный тип параметра"); - } - - rdo::runtime::LPRDOCalc pNewCalc = rdo::Factory::create(pForType->value_cast(rdo::Factory::create(src_info()))->value()); - pNewCalc->setSrcInfo(src_info()); - return pNewCalc; + if (typeID() != rdo::runtime::RDOType::Type::IDENTIFICATOR) + { + if (!pForType) + { + return m_pExpression->calc(); + } + if (pForType->typeID() != rdo::runtime::RDOType::Type::INT) + { + if (pForType->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + m_intOrDouble.roundCalc(); + } + return m_pExpression->calc(); + } + else + { + m_intOrDouble.roundCalc(); + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_pExpression->calc()->srcInfo().src_pos(), m_pExpression->calc()); + ASSERT(pCalc); + pCalc->setSrcInfo(src_info()); + return pCalc; + } + } + else if (typeID() == rdo::runtime::RDOType::Type::IDENTIFICATOR && !pForType) + { + RDOParser::s_parser()->error().error(src_info(), rdo::format("Неизвестный идентификатор: %s", const_value().getAsString().c_str())); + } + + if (!pForType) + { + RDOParser::s_parser()->error().error(src_info(), "Неизвестный тип параметра"); + } + + rdo::runtime::LPRDOCalc pNewCalc = rdo::Factory::create(pForType->value_cast(rdo::Factory::create(src_info()))->value()); + pNewCalc->setSrcInfo(src_info()); + return pNewCalc; } void RDOFUNArithm::setSrcInfo(const RDOParserSrcInfo& srcInfo) { - RDOParserSrcInfo::setSrcInfo(srcInfo); - m_pExpression->setSrcInfo(srcInfo); + RDOParserSrcInfo::setSrcInfo(srcInfo); + m_pExpression->setSrcInfo(srcInfo); } void RDOFUNArithm::setSrcPos(const RDOSrcInfo::Position& position) { - RDOParserSrcInfo::setSrcPos(position); - rdo::runtime::RDOSrcInfo srcInfo = m_pExpression->src_info(); - srcInfo.setSrcPos(position); - m_pExpression->setSrcInfo(srcInfo); + RDOParserSrcInfo::setSrcPos(position); + rdo::runtime::RDOSrcInfo srcInfo = m_pExpression->src_info(); + srcInfo.setSrcPos(position); + m_pExpression->setSrcInfo(srcInfo); } void RDOFUNArithm::setSrcText(const std::string& value) { - RDOParserSrcInfo::setSrcText(value); - rdo::runtime::RDOSrcInfo srcInfo = m_pExpression->src_info(); - srcInfo.setSrcText(this->src_info().src_text()); - m_pExpression->setSrcInfo(srcInfo); + RDOParserSrcInfo::setSrcText(value); + rdo::runtime::RDOSrcInfo srcInfo = m_pExpression->src_info(); + srcInfo.setSrcText(this->src_info().src_text()); + m_pExpression->setSrcInfo(srcInfo); } void RDOFUNArithm::setSrcInfo(const RDOParserSrcInfo& begin, const std::string& delim, const RDOParserSrcInfo& end) { - RDOParserSrcInfo::setSrcInfo(begin, delim, end); + RDOParserSrcInfo::setSrcInfo(begin, delim, end); } void RDOFUNArithm::setSrcPos(const YYLTYPE& error_pos) { - RDOParserSrcInfo::setSrcPos(error_pos); + RDOParserSrcInfo::setSrcPos(error_pos); } void RDOFUNArithm::setSrcPos(const YYLTYPE& pos_begin, const YYLTYPE& pos_end) { - RDOParserSrcInfo::setSrcPos(pos_begin, pos_end); + RDOParserSrcInfo::setSrcPos(pos_begin, pos_end); } // -------------------------------------------------------------------------------- // -------------------- RDOFUNConstant // -------------------------------------------------------------------------------- RDOFUNConstant::RDOFUNConstant(const RDOParserSrcInfo& srcInfo, const LPTypeInfo& pType, const LPRDOValue& pDefault) - : RDOParam(srcInfo, pType, pDefault) + : RDOParam(srcInfo, pType, pDefault) { - if (!getDefault() || !getDefault()->defined()) - { - ASSERT(pType); - RDOParser::s_parser()->error().error(pType->src_info(), "Константа должна иметь значение"); - } + if (!getDefault() || !getDefault()->defined()) + { + ASSERT(pType); + RDOParser::s_parser()->error().error(pType->src_info(), "Константа должна иметь значение"); + } - m_number = RDOParser::s_parser()->getFUNCONST_id(); - RDOParser::s_parser()->insertFUNConstant(this); + m_number = RDOParser::s_parser()->getFUNCONST_id(); + RDOParser::s_parser()->insertFUNConstant(this); } RDOFUNConstant::~RDOFUNConstant() @@ -661,30 +661,30 @@ namespace LPExpression contextConstant(const LPTypeInfo pTypeInfo, const int& number, const RDOParserSrcInfo& srcInfo) { - return rdo::Factory::create( - pTypeInfo, - rdo::Factory::create(number), - srcInfo - ); + return rdo::Factory::create( + pTypeInfo, + rdo::Factory::create(number), + srcInfo + ); } } -Context::LPFindResult RDOFUNConstant::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const +Context::LPFindResult RDOFUNConstant::onFindContext(const std::string& method, const Context::Params& /*params*/, const RDOParserSrcInfo& srcInfo) const { - if (method == Context::METHOD_GET) - { - return rdo::Factory::create(CreateExpression(boost::bind(&contextConstant, getTypeInfo(), getNumber(), srcInfo))); - } + if (method == Context::METHOD_GET) + { + return rdo::Factory::create(CreateExpression(boost::bind(&contextConstant, getTypeInfo(), getNumber(), srcInfo))); + } - return rdo::Factory::create(); + return rdo::Factory::create(); } // -------------------------------------------------------------------------------- // -------------------- ArithmContainer // -------------------------------------------------------------------------------- ArithmContainer::ArithmContainer() - : RDOParserSrcInfo() + : RDOParserSrcInfo() {} ArithmContainer::~ArithmContainer() @@ -692,29 +692,29 @@ ArithmContainer::~ArithmContainer() void ArithmContainer::addItem(const LPRDOFUNArithm& pArithm) { - ASSERT(pArithm); - m_arithmList.push_back(pArithm); + ASSERT(pArithm); + m_arithmList.push_back(pArithm); } LPFunctionParamType ArithmContainer::getType() const { - FunctionParamType::ParamList paramList; + FunctionParamType::ParamList paramList; - for (const LPRDOFUNArithm& pArithm: m_arithmList) - { - paramList.push_back(pArithm->typeInfo()); - } + for (const LPRDOFUNArithm& pArithm: m_arithmList) + { + paramList.push_back(pArithm->typeInfo()); + } - if (paramList.empty()) - { - paramList.push_back( - rdo::Factory::delegate(src_info()) - ); - } + if (paramList.empty()) + { + paramList.push_back( + rdo::Factory::delegate(src_info()) + ); + } - LPFunctionParamType pParamType = rdo::Factory::create(paramList, src_info()); - ASSERT(pParamType); - return pParamType; + LPFunctionParamType pParamType = rdo::Factory::create(paramList, src_info()); + ASSERT(pParamType); + return pParamType; } // -------------------------------------------------------------------------------- @@ -723,10 +723,10 @@ LPFunctionParamType ArithmContainer::getType() const // Параметры, с которыми функция вызывается // -------------------------------------------------------------------------------- RDOFUNParams::RDOFUNParams(const LPArithmContainer& pArithmContainer) - : RDOParserSrcInfo ( ) - , m_pArithmContainer(pArithmContainer) + : RDOParserSrcInfo ( ) + , m_pArithmContainer(pArithmContainer) { - ASSERT(m_pArithmContainer); + ASSERT(m_pArithmContainer); } RDOFUNParams::~RDOFUNParams() @@ -734,117 +734,117 @@ RDOFUNParams::~RDOFUNParams() rdo::runtime::LPRDOCalc RDOFUNParams::getCalc(std::size_t paramID, const LPTypeInfo& pType) { - ASSERT(paramID < m_pArithmContainer->getContainer().size()); - rdo::runtime::LPRDOCalc pCalc = m_pArithmContainer->getContainer()[paramID]->createCalc(pType); - ASSERT(pCalc); - return pCalc; + ASSERT(paramID < m_pArithmContainer->getContainer().size()); + rdo::runtime::LPRDOCalc pCalc = m_pArithmContainer->getContainer()[paramID]->createCalc(pType); + ASSERT(pCalc); + return pCalc; } LPExpression RDOFUNParams::createCallExpression(const LPExpression& pExpression) { - ASSERT(pExpression); + ASSERT(pExpression); - LPFunctionType pFunctionType = pExpression->typeInfo()->itype().object_dynamic_cast(); - ASSERT(pFunctionType); + LPFunctionType pFunctionType = pExpression->typeInfo()->itype().object_dynamic_cast(); + ASSERT(pFunctionType); - LPFunctionParamType pFunctionParamType = pFunctionType->paramType(); - ASSERT(pFunctionParamType); + LPFunctionParamType pFunctionParamType = pFunctionType->paramType(); + ASSERT(pFunctionParamType); - LPFunctionParamType pCallerParamType = m_pArithmContainer->getType(); - ASSERT(pCallerParamType); + LPFunctionParamType pCallerParamType = m_pArithmContainer->getType(); + ASSERT(pCallerParamType); - pFunctionParamType.object_dynamic_cast()->type_cast( - pCallerParamType, - pCallerParamType->src_info(), - pFunctionParamType->src_info(), - src_info() - ); + pFunctionParamType.object_dynamic_cast()->type_cast( + pCallerParamType, + pCallerParamType->src_info(), + pFunctionParamType->src_info(), + src_info() + ); - rdo::runtime::LPRDOCalc pCalc = pExpression->calc(); - ASSERT(pCalc); + rdo::runtime::LPRDOCalc pCalc = pExpression->calc(); + ASSERT(pCalc); - rdo::runtime::LPRDOCalcFunctionCaller pFuncCall = rdo::Factory::create(pCalc); - ASSERT(pFuncCall); - pFuncCall->setSrcInfo(src_info()); + rdo::runtime::LPRDOCalcFunctionCaller pFuncCall = rdo::Factory::create(pCalc); + ASSERT(pFuncCall); + pFuncCall->setSrcInfo(src_info()); - ArithmContainer::Container::const_iterator arithmIt = m_pArithmContainer->getContainer().begin(); - for (const LPTypeInfo& pFuncParam: pFunctionParamType->paramList()) - { - if (pFuncParam->typeID() != rdo::runtime::RDOType::t_void) - { - LPRDOFUNArithm pArithm = *arithmIt; - ASSERT(pArithm); + ArithmContainer::Container::const_iterator arithmIt = m_pArithmContainer->getContainer().begin(); + for (const LPTypeInfo& pFuncParam: pFunctionParamType->paramList()) + { + if (pFuncParam->typeID() != rdo::runtime::RDOType::Type::EMPTY) + { + LPRDOFUNArithm pArithm = *arithmIt; + ASSERT(pArithm); - pArithm->checkParamType(pFuncParam); - pFuncCall->addParameter(pFuncParam->itype()->calc_cast(pArithm->createCalc(pFuncParam), pArithm->typeInfo()->itype())); + pArithm->checkParamType(pFuncParam); + pFuncCall->addParameter(pFuncParam->itype()->calc_cast(pArithm->createCalc(pFuncParam), pArithm->typeInfo()->itype())); - ++arithmIt; - } - } + ++arithmIt; + } + } - LPExpression pResult = rdo::Factory::create( - pFunctionType->returnType(), - pFuncCall, - src_info() - ); - ASSERT(pResult); + LPExpression pResult = rdo::Factory::create( + pFunctionType->returnType(), + pFuncCall, + src_info() + ); + ASSERT(pResult); - return pResult; + return pResult; } LPRDOFUNArithm RDOFUNParams::createCall(const std::string& funName) { - LPRDOFUNFunction pFunction = RDOParser::s_parser()->findFUNFunction(funName); - if (!pFunction) - { - return createSeqCall(funName); - } - - const std::size_t nParams = pFunction->getParams().size(); - if (nParams != m_pArithmContainer->getContainer().size()) - { - RDOParser::s_parser()->error().error(src_info(), rdo::format("Неверное количество параметров функции: %s", funName.c_str())); - } - - rdo::runtime::LPRDOCalc pCalc = pFunction->getFunctionCalc(); - ASSERT(pCalc); - pCalc = pFunction->getReturn()->getTypeInfo()->itype()->calc_cast(pCalc, pFunction->getReturn()->getTypeInfo()->itype()); - ASSERT(pCalc); - rdo::runtime::LPRDOCalcFunctionCaller pFuncCall = rdo::Factory::create(pCalc); - pFuncCall->setSrcInfo(src_info()); - for (std::size_t i = 0; i < nParams; i++) - { - LPTypeInfo pFuncParam = pFunction->getParams()[i]->getTypeInfo(); - LPRDOFUNArithm pArithm = m_pArithmContainer->getContainer()[i]; - ASSERT(pArithm); - pArithm->checkParamType(pFuncParam); - pFuncCall->addParameter(pFuncParam->itype()->calc_cast(pArithm->createCalc(pFuncParam), pArithm->typeInfo()->itype())); - } - - LPExpression pExpression = rdo::Factory::create( - pFunction->getReturn()->getTypeInfo(), - pFuncCall, - src_info() - ); - ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); - pArithm->setSrcInfo(src_info()); - return pArithm; + LPRDOFUNFunction pFunction = RDOParser::s_parser()->findFUNFunction(funName); + if (!pFunction) + { + return createSeqCall(funName); + } + + const std::size_t nParams = pFunction->getParams().size(); + if (nParams != m_pArithmContainer->getContainer().size()) + { + RDOParser::s_parser()->error().error(src_info(), rdo::format("Неверное количество параметров функции: %s", funName.c_str())); + } + + rdo::runtime::LPRDOCalc pCalc = pFunction->getFunctionCalc(); + ASSERT(pCalc); + pCalc = pFunction->getReturn()->getTypeInfo()->itype()->calc_cast(pCalc, pFunction->getReturn()->getTypeInfo()->itype()); + ASSERT(pCalc); + rdo::runtime::LPRDOCalcFunctionCaller pFuncCall = rdo::Factory::create(pCalc); + pFuncCall->setSrcInfo(src_info()); + for (std::size_t i = 0; i < nParams; i++) + { + LPTypeInfo pFuncParam = pFunction->getParams()[i]->getTypeInfo(); + LPRDOFUNArithm pArithm = m_pArithmContainer->getContainer()[i]; + ASSERT(pArithm); + pArithm->checkParamType(pFuncParam); + pFuncCall->addParameter(pFuncParam->itype()->calc_cast(pArithm->createCalc(pFuncParam), pArithm->typeInfo()->itype())); + } + + LPExpression pExpression = rdo::Factory::create( + pFunction->getReturn()->getTypeInfo(), + pFuncCall, + src_info() + ); + ASSERT(pExpression); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); + pArithm->setSrcInfo(src_info()); + return pArithm; } LPRDOFUNArithm RDOFUNParams::createSeqCall(const std::string& seqName) { - LPRDOFUNSequence pSequence = RDOParser::s_parser()->findFUNSequence(seqName); - if (!pSequence) - { - RDOParser::s_parser()->error().error(m_funseqName, rdo::format("Неопределенная функция или последовательность: %s", seqName.c_str())); - } - LPRDOFUNParams pThis(this); - ASSERT(pThis); - LPRDOFUNArithm pArithm = pSequence->createCallCalc(pThis, src_info()); - ASSERT(pArithm); - return pArithm; + LPRDOFUNSequence pSequence = RDOParser::s_parser()->findFUNSequence(seqName); + if (!pSequence) + { + RDOParser::s_parser()->error().error(m_funseqName, rdo::format("Неопределенная функция или последовательность: %s", seqName.c_str())); + } + LPRDOFUNParams pThis(this); + ASSERT(pThis); + LPRDOFUNArithm pArithm = pSequence->createCallCalc(pThis, src_info()); + ASSERT(pArithm); + return pArithm; } // -------------------------------------------------------------------------------- @@ -853,11 +853,11 @@ LPRDOFUNArithm RDOFUNParams::createSeqCall(const std::string& seqName) // -------------------- RDOFUNSequence // -------------------------------------------------------------------------------- RDOFUNSequence::RDOFUNSequence(const LPRDOFUNSequenceHeader& pHeader, int seed) - : RDOParserSrcInfo(pHeader->src_info()) - , m_pHeader (pHeader ) - , m_seed (seed ) + : RDOParserSrcInfo(pHeader->src_info()) + , m_pHeader (pHeader ) + , m_seed (seed ) { - RDOParser::s_parser()->insertFUNSequence(this); + RDOParser::s_parser()->insertFUNSequence(this); } RDOFUNSequence::~RDOFUNSequence() @@ -865,43 +865,43 @@ RDOFUNSequence::~RDOFUNSequence() void RDOFUNSequence::initResult() { - initCalcSrcInfo(); - m_pNextCalc->m_res_real = true; - switch (m_pHeader->getTypeInfo()->typeID()) - { - case rdo::runtime::RDOType::t_int: - { - LPRDOTypeIntRange pRange = m_pHeader->getTypeInfo()->itype().object_dynamic_cast(); - if (pRange) - { - m_pNextCalc->m_range = rdo::runtime::RDOCalcSeqNext::Range(pRange->range()->getMin()->value().getDouble(), pRange->range()->getMax()->value().getDouble()); - } - break; - } - case rdo::runtime::RDOType::t_real: - { - m_pNextCalc->m_res_real = true; - LPRDOTypeRealRange pRange = m_pHeader->getTypeInfo()->itype().object_dynamic_cast(); - if (pRange) - { - m_pNextCalc->m_range = rdo::runtime::RDOCalcSeqNext::Range(pRange->range()->getMin()->value().getDouble(), pRange->range()->getMax()->value().getDouble()); - } - break; - } - default: - break; - } + initCalcSrcInfo(); + m_pNextCalc->m_res_real = true; + switch (m_pHeader->getTypeInfo()->typeID()) + { + case rdo::runtime::RDOType::Type::INT: + { + LPRDOTypeIntRange pRange = m_pHeader->getTypeInfo()->itype().object_dynamic_cast(); + if (pRange) + { + m_pNextCalc->m_range = rdo::runtime::RDOCalcSeqNext::Range(pRange->range()->getMin()->value().getDouble(), pRange->range()->getMax()->value().getDouble()); + } + break; + } + case rdo::runtime::RDOType::Type::REAL: + { + m_pNextCalc->m_res_real = true; + LPRDOTypeRealRange pRange = m_pHeader->getTypeInfo()->itype().object_dynamic_cast(); + if (pRange) + { + m_pNextCalc->m_range = rdo::runtime::RDOCalcSeqNext::Range(pRange->range()->getMin()->value().getDouble(), pRange->range()->getMax()->value().getDouble()); + } + break; + } + default: + break; + } } void RDOFUNSequence::initCalcSrcInfo() { - if (m_pInitCalc) - { - rdo::runtime::RDOSrcInfo srcInfo(m_pHeader->src_info()); - srcInfo.setSrcText("Установка базы последовательности " + m_pHeader->src_text()); - m_pInitCalc->setSrcInfo(srcInfo); - } - m_pNextCalc->setSrcInfo(m_pHeader->src_info()); + if (m_pInitCalc) + { + rdo::runtime::RDOSrcInfo srcInfo(m_pHeader->src_info()); + srcInfo.setSrcText("Установка базы последовательности " + m_pHeader->src_text()); + m_pInitCalc->setSrcInfo(srcInfo); + } + m_pNextCalc->setSrcInfo(m_pHeader->src_info()); } namespace @@ -909,29 +909,29 @@ namespace LPExpression contextSequence(const std::string& name, const RDOParserSrcInfo& srcInfo) { - LPRDOFUNParams pParams = rdo::Factory::create( - rdo::Factory::create() - ); - LPRDOFUNArithm pArithm = pParams->createSeqCall(name); - pArithm->setSrcInfo(srcInfo); + LPRDOFUNParams pParams = rdo::Factory::create( + rdo::Factory::create() + ); + LPRDOFUNArithm pArithm = pParams->createSeqCall(name); + pArithm->setSrcInfo(srcInfo); - return rdo::Factory::create( - pArithm->typeInfo(), - pArithm->calc(), - srcInfo - ); + return rdo::Factory::create( + pArithm->typeInfo(), + pArithm->calc(), + srcInfo + ); } } -Context::LPFindResult RDOFUNSequence::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const +Context::LPFindResult RDOFUNSequence::onFindContext(const std::string& method, const Context::Params& /*params*/, const RDOParserSrcInfo& srcInfo) const { - if (method == Context::METHOD_GET) - { - return rdo::Factory::create(CreateExpression(boost::bind(&contextSequence, name(), srcInfo))); - } + if (method == Context::METHOD_GET) + { + return rdo::Factory::create(CreateExpression(boost::bind(&contextSequence, name(), srcInfo))); + } - return rdo::Factory::create(); + return rdo::Factory::create(); } // -------------------------------------------------------------------------------- @@ -940,216 +940,216 @@ Context::LPFindResult RDOFUNSequence::onFindContext(const std::string& method, c // -------------------- RDOFUNSequenceUniform // -------------------------------------------------------------------------------- RDOFUNSequenceUniform::RDOFUNSequenceUniform(const LPRDOFUNSequenceHeader& pHeader, int seed) - : RDOFUNSequence(pHeader, seed) + : RDOFUNSequence(pHeader, seed) { - if (m_pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_enum) - { - RDOParser::s_parser()->error().error(src_info(), rdo::format("Последовательность '%s' может возвращять значения только целого или вещественного типа", src_text().c_str())); - } + if (m_pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + RDOParser::s_parser()->error().error(src_info(), rdo::format("Последовательность '%s' может возвращять значения только целого или вещественного типа", src_text().c_str())); + } } void RDOFUNSequenceUniform::createCalcs() { - rdo::runtime::RandGeneratorUniform* pGenerator = new rdo::runtime::RandGeneratorUniform(); - m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); - RDOParser::s_parser()->runtime()->addInitCalc(m_pInitCalc); - m_pNextCalc = rdo::Factory::create(pGenerator); - initResult(); + rdo::runtime::RandGeneratorUniform* pGenerator = new rdo::runtime::RandGeneratorUniform(); + m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); + RDOParser::s_parser()->runtime()->addInitCalc(m_pInitCalc); + m_pNextCalc = rdo::Factory::create(pGenerator); + initResult(); } LPRDOFUNArithm RDOFUNSequenceUniform::createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seqSrcInfo) const { - if (pParamList->getParamList()->getContainer().size() != 2) - { - RDOParser::s_parser()->error().error(seqSrcInfo, rdo::format("Для равномерного закона распределения '%s' нужно указать два параметра: минимальную и максимальную границы диапазона", name().c_str())); - } - - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); - ASSERT(pFuctionCall); - - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo()); - rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); - rdo::runtime::LPRDOCalc pArg2 = pParamList->getCalc(1, pType); - - pFuctionCall->addParameter(pArg1); - pFuctionCall->addParameter(pArg2); - - LPExpression pExpression = rdo::Factory::create( - m_pHeader->getTypeInfo(), - pFuctionCall, - pParamList->src_info() - ); - ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); - pArithm->setSrcInfo(seqSrcInfo); - if (pArithm->typeID() == rdo::runtime::RDOType::t_enum) - { - RDOParser::s_parser()->error().error(src_info(), "Внутренняя ошибка парсера"); - } - return pArithm; + if (pParamList->getParamList()->getContainer().size() != 2) + { + RDOParser::s_parser()->error().error(seqSrcInfo, rdo::format("Для равномерного закона распределения '%s' нужно указать два параметра: минимальную и максимальную границы диапазона", name().c_str())); + } + + rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); + ASSERT(pFuctionCall); + + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo()); + rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); + rdo::runtime::LPRDOCalc pArg2 = pParamList->getCalc(1, pType); + + pFuctionCall->addParameter(pArg1); + pFuctionCall->addParameter(pArg2); + + LPExpression pExpression = rdo::Factory::create( + m_pHeader->getTypeInfo(), + pFuctionCall, + pParamList->src_info() + ); + ASSERT(pExpression); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); + pArithm->setSrcInfo(seqSrcInfo); + if (pArithm->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + RDOParser::s_parser()->error().error(src_info(), "Внутренняя ошибка парсера"); + } + return pArithm; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNSequenceExponential // -------------------------------------------------------------------------------- RDOFUNSequenceExponential::RDOFUNSequenceExponential(const LPRDOFUNSequenceHeader& pHeader, int seed) - : RDOFUNSequence(pHeader, seed) + : RDOFUNSequence(pHeader, seed) { - if (m_pHeader->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int && m_pHeader->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real) - { - RDOParser::s_parser()->error().error(src_info(), rdo::format("Последовательность '%s' может возвращять значения только целого или вещественного типа", src_text().c_str())); - } + if (m_pHeader->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT && m_pHeader->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL) + { + RDOParser::s_parser()->error().error(src_info(), rdo::format("Последовательность '%s' может возвращять значения только целого или вещественного типа", src_text().c_str())); + } } void RDOFUNSequenceExponential::createCalcs() { - rdo::runtime::RandGeneratorExponential* pGenerator = new rdo::runtime::RandGeneratorExponential(); - m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); - RDOParser::s_parser()->runtime()->addInitCalc(m_pInitCalc); - m_pNextCalc = rdo::Factory::create(pGenerator); - initResult(); + rdo::runtime::RandGeneratorExponential* pGenerator = new rdo::runtime::RandGeneratorExponential(); + m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); + RDOParser::s_parser()->runtime()->addInitCalc(m_pInitCalc); + m_pNextCalc = rdo::Factory::create(pGenerator); + initResult(); } LPRDOFUNArithm RDOFUNSequenceExponential::createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seqSrcInfo) const { - if (pParamList->getParamList()->getContainer().size() != 1) - { - RDOParser::s_parser()->error().error(seqSrcInfo, rdo::format("Для экспоненциального закона распределения '%s' нужно указать один параметр: математическое ожидание", name().c_str())); - } + if (pParamList->getParamList()->getContainer().size() != 1) + { + RDOParser::s_parser()->error().error(seqSrcInfo, rdo::format("Для экспоненциального закона распределения '%s' нужно указать один параметр: математическое ожидание", name().c_str())); + } - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); - ASSERT(pFuctionCall); + rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); + ASSERT(pFuctionCall); - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo()); - rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo()); + rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); - pFuctionCall->addParameter(pArg1); + pFuctionCall->addParameter(pArg1); - LPExpression pExpression = rdo::Factory::create( - m_pHeader->getTypeInfo(), - pFuctionCall, - pParamList->src_info() - ); - ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); - pArithm->setSrcInfo(seqSrcInfo); - if (pArithm->typeID() == rdo::runtime::RDOType::t_enum) - { - RDOParser::s_parser()->error().error(src_info(), "Внутренняя ошибка парсера"); - } - return pArithm; + LPExpression pExpression = rdo::Factory::create( + m_pHeader->getTypeInfo(), + pFuctionCall, + pParamList->src_info() + ); + ASSERT(pExpression); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); + pArithm->setSrcInfo(seqSrcInfo); + if (pArithm->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + RDOParser::s_parser()->error().error(src_info(), "Внутренняя ошибка парсера"); + } + return pArithm; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNSequenceNormal // -------------------------------------------------------------------------------- RDOFUNSequenceNormal::RDOFUNSequenceNormal(const LPRDOFUNSequenceHeader& pHeader, int seed) - : RDOFUNSequence(pHeader, seed) + : RDOFUNSequence(pHeader, seed) { - if (m_pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::t_enum) - { - RDOParser::s_parser()->error().error(src_info(), rdo::format("Последовательность '%s' может возвращять значения только целого или вещественного типа", src_text().c_str())); - } + if (m_pHeader->getTypeInfo()->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + RDOParser::s_parser()->error().error(src_info(), rdo::format("Последовательность '%s' может возвращять значения только целого или вещественного типа", src_text().c_str())); + } } void RDOFUNSequenceNormal::createCalcs() { - rdo::runtime::RandGeneratorNormal* pGenerator = new rdo::runtime::RandGeneratorNormal(); - m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); - RDOParser::s_parser()->runtime()->addInitCalc(m_pInitCalc); - m_pNextCalc = rdo::Factory::create(pGenerator); - initResult(); + rdo::runtime::RandGeneratorNormal* pGenerator = new rdo::runtime::RandGeneratorNormal(); + m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); + RDOParser::s_parser()->runtime()->addInitCalc(m_pInitCalc); + m_pNextCalc = rdo::Factory::create(pGenerator); + initResult(); } LPRDOFUNArithm RDOFUNSequenceNormal::createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seqSrcInfo) const { - if (pParamList->getParamList()->getContainer().size() != 2) - { - RDOParser::s_parser()->error().error(seqSrcInfo, rdo::format("Для нормального закона распределения '%s' нужно указать два параметра: математическое ожидание и среднее квадратическое отклонение", name().c_str())); - } - - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); - ASSERT(pFuctionCall); - - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo()); - rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); - rdo::runtime::LPRDOCalc pArg2 = pParamList->getCalc(1, pType); - - pFuctionCall->addParameter(pArg1); - pFuctionCall->addParameter(pArg2); - - LPExpression pExpression = rdo::Factory::create( - m_pHeader->getTypeInfo(), - pFuctionCall, - pParamList->src_info() - ); - ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); - pArithm->setSrcInfo(seqSrcInfo); - if (pArithm->typeID() == rdo::runtime::RDOType::t_enum) - { - RDOParser::s_parser()->error().error(src_info(), "Внутренняя ошибка парсера"); - } - return pArithm; + if (pParamList->getParamList()->getContainer().size() != 2) + { + RDOParser::s_parser()->error().error(seqSrcInfo, rdo::format("Для нормального закона распределения '%s' нужно указать два параметра: математическое ожидание и среднее квадратическое отклонение", name().c_str())); + } + + rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); + ASSERT(pFuctionCall); + + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo()); + rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); + rdo::runtime::LPRDOCalc pArg2 = pParamList->getCalc(1, pType); + + pFuctionCall->addParameter(pArg1); + pFuctionCall->addParameter(pArg2); + + LPExpression pExpression = rdo::Factory::create( + m_pHeader->getTypeInfo(), + pFuctionCall, + pParamList->src_info() + ); + ASSERT(pExpression); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); + pArithm->setSrcInfo(seqSrcInfo); + if (pArithm->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + RDOParser::s_parser()->error().error(src_info(), "Внутренняя ошибка парсера"); + } + return pArithm; } // ---------------------------------------------------------------------------- // ---------- RDOFUNSequenceTriangular // ---------------------------------------------------------------------------- RDOFUNSequenceTriangular::RDOFUNSequenceTriangular(const LPRDOFUNSequenceHeader& pHeader, int seed) - : RDOFUNSequence(pHeader, seed) + : RDOFUNSequence(pHeader, seed) { - if (m_pHeader->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_int && m_pHeader->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_real) - { - RDOParser::s_parser()->error().error(src_info(), rdo::format("Последовательность '%s' может возвращять значения только целого или вещественного типа", src_text().c_str())); - } + if (m_pHeader->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::INT && m_pHeader->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::REAL) + { + RDOParser::s_parser()->error().error(src_info(), rdo::format("Последовательность '%s' может возвращять значения только целого или вещественного типа", src_text().c_str())); + } } void RDOFUNSequenceTriangular::createCalcs() { - rdo::runtime::RandGeneratorTriangular* pGenerator = new rdo::runtime::RandGeneratorTriangular(); - m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); - RDOParser::s_parser()->runtime()->addInitCalc(m_pInitCalc); - m_pNextCalc = rdo::Factory::create(pGenerator); - initResult(); + rdo::runtime::RandGeneratorTriangular* pGenerator = new rdo::runtime::RandGeneratorTriangular(); + m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); + RDOParser::s_parser()->runtime()->addInitCalc(m_pInitCalc); + m_pNextCalc = rdo::Factory::create(pGenerator); + initResult(); } LPRDOFUNArithm RDOFUNSequenceTriangular::createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seqSrcInfo) const { - if (pParamList->getParamList()->getContainer().size() != 3) - { - RDOParser::s_parser()->error().error(seqSrcInfo, rdo::format("Для треугольного закона распределения '%s' нужно указать три параметра: левую границу, точку под высотой треугольника, правую границу", name().c_str())); - } - - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); - ASSERT(pFuctionCall); - - LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo()); - rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); - rdo::runtime::LPRDOCalc pArg2 = pParamList->getCalc(1, pType); - rdo::runtime::LPRDOCalc pArg3 = pParamList->getCalc(2, pType); - - pFuctionCall->addParameter(pArg1); - pFuctionCall->addParameter(pArg2); - pFuctionCall->addParameter(pArg3); - - LPExpression pExpression = rdo::Factory::create( - m_pHeader->getTypeInfo(), - pFuctionCall, - pParamList->src_info() - ); - ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); - pArithm->setSrcInfo(seqSrcInfo); - if (pArithm->typeID() == rdo::runtime::RDOType::t_enum) - { - RDOParser::s_parser()->error().error(src_info(), "Внутренняя ошибка парсера"); - } - return pArithm; + if (pParamList->getParamList()->getContainer().size() != 3) + { + RDOParser::s_parser()->error().error(seqSrcInfo, rdo::format("Для треугольного закона распределения '%s' нужно указать три параметра: левую границу, точку под высотой треугольника, правую границу", name().c_str())); + } + + rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); + ASSERT(pFuctionCall); + + LPTypeInfo pType = rdo::Factory::delegate(RDOParserSrcInfo()); + rdo::runtime::LPRDOCalc pArg1 = pParamList->getCalc(0, pType); + rdo::runtime::LPRDOCalc pArg2 = pParamList->getCalc(1, pType); + rdo::runtime::LPRDOCalc pArg3 = pParamList->getCalc(2, pType); + + pFuctionCall->addParameter(pArg1); + pFuctionCall->addParameter(pArg2); + pFuctionCall->addParameter(pArg3); + + LPExpression pExpression = rdo::Factory::create( + m_pHeader->getTypeInfo(), + pFuctionCall, + pParamList->src_info() + ); + ASSERT(pExpression); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); + pArithm->setSrcInfo(seqSrcInfo); + if (pArithm->typeID() == rdo::runtime::RDOType::Type::ENUM) + { + RDOParser::s_parser()->error().error(src_info(), "Внутренняя ошибка парсера"); + } + return pArithm; } // ---------------------------------------------------------------------------- @@ -1158,128 +1158,128 @@ LPRDOFUNArithm RDOFUNSequenceTriangular::createCallCalc(LPRDOFUNParams& pParamLi // ---------- RDOFUNSequenceByHist // ---------------------------------------------------------------------------- RDOFUNSequenceByHist::RDOFUNSequenceByHist(const LPRDOFUNSequenceByHistHeader& pHeader) - : RDOFUNSequence(pHeader->getHeader(), pHeader->getSeed()) + : RDOFUNSequence(pHeader->getHeader(), pHeader->getSeed()) {} LPRDOFUNArithm RDOFUNSequenceByHist::createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& srcInfo) const { - if (pParamList->getParamList()->getContainer().size() != 0) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Гистограмма '%s' должна вызываться без параметров", name().c_str())); - } + if (pParamList->getParamList()->getContainer().size() != 0) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Гистограмма '%s' должна вызываться без параметров", name().c_str())); + } - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); - ASSERT(pFuctionCall); + rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); + ASSERT(pFuctionCall); - LPExpression pExpression = rdo::Factory::create( - m_pHeader->getTypeInfo(), - pFuctionCall, - pParamList->src_info() - ); - ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); - pArithm->setSrcInfo(srcInfo); - return pArithm; + LPExpression pExpression = rdo::Factory::create( + m_pHeader->getTypeInfo(), + pFuctionCall, + pParamList->src_info() + ); + ASSERT(pExpression); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); + pArithm->setSrcInfo(srcInfo); + return pArithm; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNSequenceByHistReal // -------------------------------------------------------------------------------- RDOFUNSequenceByHistReal::RDOFUNSequenceByHistReal(const LPRDOFUNSequenceByHistHeader& pHeader, const LPRDOValue& pFrom, const LPRDOValue& pTo, const LPRDOValue& pFreq) - : RDOFUNSequenceByHist(pHeader) + : RDOFUNSequenceByHist(pHeader) { - addReal(pFrom, pTo, pFreq); + addReal(pFrom, pTo, pFreq); } void RDOFUNSequenceByHistReal::addReal(const LPRDOValue& pFrom, const LPRDOValue& pTo, const LPRDOValue& pFreq) { - ASSERT(pFrom); - ASSERT(pTo ); - ASSERT(pFreq); - - if (!m_to.empty() && pFrom->value() != m_to.back()) - { - RDOParser::s_parser()->error().error(pFrom->src_info(), "Начало интервала должно совпадать с окончанием предыдущего"); - } - if (pFrom->value() > pTo->value()) - { - RDOParser::s_parser()->error().error(pTo->src_info(), "Начало интервала должно быть меньше его конца"); - } - if (pFreq->value() == 0) - { - RDOParser::s_parser()->error().warning(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); - } - else if (pFreq->value() < 0) - { - RDOParser::s_parser()->error().error(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); - } - m_pHeader->getTypeInfo()->value_cast(pFrom); - m_pHeader->getTypeInfo()->value_cast(pTo ); - m_from.push_back(pFrom->value()); - m_to .push_back(pTo ->value()); - m_freq.push_back(pFreq->value()); + ASSERT(pFrom); + ASSERT(pTo ); + ASSERT(pFreq); + + if (!m_to.empty() && pFrom->value() != m_to.back()) + { + RDOParser::s_parser()->error().error(pFrom->src_info(), "Начало интервала должно совпадать с окончанием предыдущего"); + } + if (pFrom->value() > pTo->value()) + { + RDOParser::s_parser()->error().error(pTo->src_info(), "Начало интервала должно быть меньше его конца"); + } + if (pFreq->value() == 0) + { + RDOParser::s_parser()->error().warning(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); + } + else if (pFreq->value() < 0) + { + RDOParser::s_parser()->error().error(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); + } + m_pHeader->getTypeInfo()->value_cast(pFrom); + m_pHeader->getTypeInfo()->value_cast(pTo ); + m_from.push_back(pFrom->value()); + m_to .push_back(pTo ->value()); + m_freq.push_back(pFreq->value()); } void RDOFUNSequenceByHistReal::createCalcs() { - rdo::runtime::RandGeneratorByHistReal* pGenerator = new rdo::runtime::RandGeneratorByHistReal(); - int size = m_from.size(); - for (int i = 0; i < size; i++) - { - pGenerator->addValues(m_from[i].getDouble(), m_to[i].getDouble(), m_freq[i].getDouble()); - } + rdo::runtime::RandGeneratorByHistReal* pGenerator = new rdo::runtime::RandGeneratorByHistReal(); + int size = m_from.size(); + for (int i = 0; i < size; i++) + { + pGenerator->addValues(m_from[i].getDouble(), m_to[i].getDouble(), m_freq[i].getDouble()); + } - m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); - RDOParser::s_parser()->runtime()->addInitCalc(m_pInitCalc); - m_pNextCalc = rdo::Factory::create(pGenerator); - initResult(); + m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); + RDOParser::s_parser()->runtime()->addInitCalc(m_pInitCalc); + m_pNextCalc = rdo::Factory::create(pGenerator); + initResult(); } // -------------------------------------------------------------------------------- // -------------------- RDOFUNSequenceByHistEnum // -------------------------------------------------------------------------------- RDOFUNSequenceByHistEnum::RDOFUNSequenceByHistEnum(const LPRDOFUNSequenceByHistHeader& pHeader, const LPRDOValue& pValue, const LPRDOValue& pFreq) - : RDOFUNSequenceByHist(pHeader) + : RDOFUNSequenceByHist(pHeader) { - addEnum(pValue, pFreq); + addEnum(pValue, pFreq); } void RDOFUNSequenceByHistEnum::addEnum(const LPRDOValue& pValue, const LPRDOValue& pFreq) { - ASSERT(pValue); - ASSERT(pFreq ); - - if (pFreq->value() == 0) - { - RDOParser::s_parser()->error().warning(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); - } - else if (pFreq->value() < 0) - { - RDOParser::s_parser()->error().error(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); - } - m_pHeader->getTypeInfo()->value_cast(pValue); - rdo::runtime::RDOValue enum_id = m_pHeader->getTypeInfo()->value_cast(pValue)->value(); - if (std::find(m_values.begin(), m_values.end(), enum_id) != m_values.end()) - { - RDOParser::s_parser()->error().error(pValue->src_info(), rdo::format("Перечислимое значение определено дважды: %s", pValue->value().getIdentificator().c_str())); - } - m_values.push_back(enum_id); - m_freq .push_back(pFreq->value()); + ASSERT(pValue); + ASSERT(pFreq ); + + if (pFreq->value() == 0) + { + RDOParser::s_parser()->error().warning(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); + } + else if (pFreq->value() < 0) + { + RDOParser::s_parser()->error().error(pFreq->src_info(), "Относительная вероятность должна быть больше нуля"); + } + m_pHeader->getTypeInfo()->value_cast(pValue); + rdo::runtime::RDOValue enum_id = m_pHeader->getTypeInfo()->value_cast(pValue)->value(); + if (std::find(m_values.begin(), m_values.end(), enum_id) != m_values.end()) + { + RDOParser::s_parser()->error().error(pValue->src_info(), rdo::format("Перечислимое значение определено дважды: %s", pValue->value().getIdentificator().c_str())); + } + m_values.push_back(enum_id); + m_freq .push_back(pFreq->value()); } void RDOFUNSequenceByHistEnum::createCalcs() { - rdo::runtime::RandGeneratorByHistEnum* pGenerator = new rdo::runtime::RandGeneratorByHistEnum(); - const std::size_t size = m_values.size(); - for (std::size_t i = 0; i < size; i++) - { - pGenerator->addValues(m_values[i], m_freq[i].getDouble()); - } - m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); - RDOParser::s_parser()->runtime()->addInitCalc(m_pInitCalc); - m_pNextCalc = rdo::Factory::create(pGenerator); - initCalcSrcInfo(); + rdo::runtime::RandGeneratorByHistEnum* pGenerator = new rdo::runtime::RandGeneratorByHistEnum(); + const std::size_t size = m_values.size(); + for (std::size_t i = 0; i < size; i++) + { + pGenerator->addValues(m_values[i], m_freq[i].getDouble()); + } + m_pInitCalc = rdo::Factory::create(m_seed, pGenerator); + RDOParser::s_parser()->runtime()->addInitCalc(m_pInitCalc); + m_pNextCalc = rdo::Factory::create(pGenerator); + initCalcSrcInfo(); } // -------------------------------------------------------------------------------- @@ -1289,24 +1289,24 @@ void RDOFUNSequenceByHistEnum::createCalcs() // -------------------------------------------------------------------------------- LPRDOFUNArithm RDOFUNSequenceEnumerative::createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& srcInfo) const { - if (pParamList->getParamList()->getContainer().size() != 0) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Перечисление '%s' должно вызываться без параметров", name().c_str())); - } + if (pParamList->getParamList()->getContainer().size() != 0) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Перечисление '%s' должно вызываться без параметров", name().c_str())); + } - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); - ASSERT(pFuctionCall); + rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(m_pNextCalc); + ASSERT(pFuctionCall); - LPExpression pExpression = rdo::Factory::create( - m_pHeader->getTypeInfo(), - pFuctionCall, - pParamList->src_info() - ); - ASSERT(pExpression); - LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); - ASSERT(pArithm); - pArithm->setSrcInfo(srcInfo); - return pArithm; + LPExpression pExpression = rdo::Factory::create( + m_pHeader->getTypeInfo(), + pFuctionCall, + pParamList->src_info() + ); + ASSERT(pExpression); + LPRDOFUNArithm pArithm = rdo::Factory::create(pExpression); + ASSERT(pArithm); + pArithm->setSrcInfo(srcInfo); + return pArithm; } // -------------------------------------------------------------------------------- @@ -1314,13 +1314,13 @@ LPRDOFUNArithm RDOFUNSequenceEnumerative::createCallCalc(LPRDOFUNParams& pParamL // -------------------------------------------------------------------------------- void RDOFUNSequenceEnumerative::createCalcs() { - rdo::runtime::RandGeneratorEnumerative* pGenerator = new rdo::runtime::RandGeneratorEnumerative(); - for (std::size_t i = 0; i < m_valueList.size(); i++) - { - pGenerator->addValue(m_valueList[i]->value()); - } - m_pNextCalc = rdo::Factory::create(pGenerator); - initCalcSrcInfo(); + rdo::runtime::RandGeneratorEnumerative* pGenerator = new rdo::runtime::RandGeneratorEnumerative(); + for (std::size_t i = 0; i < m_valueList.size(); i++) + { + pGenerator->addValue(m_valueList[i]->value()); + } + m_pNextCalc = rdo::Factory::create(pGenerator); + initCalcSrcInfo(); } // -------------------------------------------------------------------------------- @@ -1329,7 +1329,7 @@ void RDOFUNSequenceEnumerative::createCalcs() // -------------------- RDOFUNFunctionListElement // -------------------------------------------------------------------------------- RDOFUNFunctionListElement::RDOFUNFunctionListElement(const RDOParserSrcInfo& srcInfo) - : RDOParserSrcInfo(srcInfo) + : RDOParserSrcInfo(srcInfo) {} RDOFUNFunctionListElement::~RDOFUNFunctionListElement() @@ -1337,95 +1337,95 @@ RDOFUNFunctionListElement::~RDOFUNFunctionListElement() rdo::runtime::LPRDOCalcIsEqual RDOFUNFunctionListElement::createIsEqualCalc(const LPTypeInfo& pRetType, const rdo::runtime::LPRDOCalcFuncParam& pFuncParam, const RDOParserSrcInfo& src_pos) const { - rdo::runtime::LPRDOCalcConst pCalcConst = createResultCalc(pRetType, src_pos); - return rdo::Factory::create(pFuncParam, pCalcConst); + rdo::runtime::LPRDOCalcConst pCalcConst = createResultCalc(pRetType, src_pos); + return rdo::Factory::create(pFuncParam, pCalcConst); } // -------------------------------------------------------------------------------- // -------------------- RDOFUNFunctionListElementIdentif // -------------------------------------------------------------------------------- RDOFUNFunctionListElementIdentif::RDOFUNFunctionListElementIdentif(const RDOParserSrcInfo& srcInfo) - : RDOFUNFunctionListElement(srcInfo) + : RDOFUNFunctionListElement(srcInfo) {} rdo::runtime::LPRDOCalcConst RDOFUNFunctionListElementIdentif::createResultCalc(const LPTypeInfo& pRetType, const RDOParserSrcInfo& src_pos) const { - rdo::runtime::LPRDOCalcConst pCalcConst = rdo::Factory::create( - pRetType->value_cast( - rdo::Factory::create(RDOParserSrcInfo(src_pos.getPosAsYY(), src_text())) - )->value() - ); - ASSERT(pCalcConst); - pCalcConst->setSrcInfo(src_pos); - return pCalcConst; + rdo::runtime::LPRDOCalcConst pCalcConst = rdo::Factory::create( + pRetType->value_cast( + rdo::Factory::create(RDOParserSrcInfo(src_pos.getPosAsYY(), src_text())) + )->value() + ); + ASSERT(pCalcConst); + pCalcConst->setSrcInfo(src_pos); + return pCalcConst; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNFunctionListElementReal // -------------------------------------------------------------------------------- RDOFUNFunctionListElementReal::RDOFUNFunctionListElementReal(const YYLTYPE& position, double value) - : RDOFUNFunctionListElement(RDOParserSrcInfo(position, rdo::format("%f", value))) - , m_value(value) + : RDOFUNFunctionListElement(RDOParserSrcInfo(position, rdo::format("%f", value))) + , m_value(value) {} rdo::runtime::LPRDOCalcConst RDOFUNFunctionListElementReal::createResultCalc(const LPTypeInfo& pRetType, const RDOParserSrcInfo& src_pos) const { - LPTypeInfo pType = rdo::Factory::delegate(src_info()); - ASSERT(pType); - rdo::runtime::LPRDOCalcConst pCalcConst = rdo::Factory::create( - pRetType->value_cast( - rdo::Factory::create(m_value, src_pos, pType) - )->value() - ); - ASSERT(pCalcConst); - pCalcConst->setSrcInfo(src_pos); - return pCalcConst; + LPTypeInfo pType = rdo::Factory::delegate(src_info()); + ASSERT(pType); + rdo::runtime::LPRDOCalcConst pCalcConst = rdo::Factory::create( + pRetType->value_cast( + rdo::Factory::create(m_value, src_pos, pType) + )->value() + ); + ASSERT(pCalcConst); + pCalcConst->setSrcInfo(src_pos); + return pCalcConst; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNFunctionListElementInt // -------------------------------------------------------------------------------- RDOFUNFunctionListElementInt::RDOFUNFunctionListElementInt(const YYLTYPE& position, int value) - : RDOFUNFunctionListElement(RDOParserSrcInfo(position, rdo::format("%d", value))) - , m_value(value) + : RDOFUNFunctionListElement(RDOParserSrcInfo(position, rdo::format("%d", value))) + , m_value(value) {} rdo::runtime::LPRDOCalcConst RDOFUNFunctionListElementInt::createResultCalc(const LPTypeInfo& pRetType, const RDOParserSrcInfo& src_pos) const { - LPTypeInfo pType = rdo::Factory::delegate(src_info()); - ASSERT(pType); - rdo::runtime::LPRDOCalcConst pCalcConst = rdo::Factory::create( - pRetType->value_cast( - rdo::Factory::create(m_value, src_pos, pType) - )->value() - ); - ASSERT(pCalcConst); - pCalcConst->setSrcInfo(src_pos); - return pCalcConst; + LPTypeInfo pType = rdo::Factory::delegate(src_info()); + ASSERT(pType); + rdo::runtime::LPRDOCalcConst pCalcConst = rdo::Factory::create( + pRetType->value_cast( + rdo::Factory::create(m_value, src_pos, pType) + )->value() + ); + ASSERT(pCalcConst); + pCalcConst->setSrcInfo(src_pos); + return pCalcConst; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNFunctionListElementEq // -------------------------------------------------------------------------------- RDOFUNFunctionListElementEq::RDOFUNFunctionListElementEq(const YYLTYPE& position) - : RDOFUNFunctionListElement(RDOParserSrcInfo(position, "=")) + : RDOFUNFunctionListElement(RDOParserSrcInfo(position, "=")) {} rdo::runtime::LPRDOCalcConst RDOFUNFunctionListElementEq::createResultCalc(const LPTypeInfo& /*pRetType*/, const RDOParserSrcInfo& src_pos) const { - RDOParser::s_parser()->error().error(src_pos, "Внутренная ошибка парсера: RDOFUNFunctionListElementEq::createResultCalc"); - NEVER_REACH_HERE; - return NULL; + RDOParser::s_parser()->error().error(src_pos, "Внутренняя ошибка парсера: RDOFUNFunctionListElementEq::createResultCalc"); + NEVER_REACH_HERE; + return NULL; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNCalculateIf // -------------------------------------------------------------------------------- RDOFUNCalculateIf::RDOFUNCalculateIf(const LPRDOFUNLogic& pCondition, const LPRDOFUNArithm& pAction) - : m_pCondition(pCondition) - , m_pAction (pAction ) + : m_pCondition(pCondition) + , m_pAction (pAction ) { - m_pAction->checkParamType(RDOParser::s_parser()->getLastFUNFunction()->getReturn()->getTypeInfo()); + m_pAction->checkParamType(RDOParser::s_parser()->getLastFUNFunction()->getReturn()->getTypeInfo()); } RDOFUNCalculateIf::~RDOFUNCalculateIf() @@ -1435,29 +1435,29 @@ RDOFUNCalculateIf::~RDOFUNCalculateIf() // -------------------- RDOFUNFunction // -------------------------------------------------------------------------------- RDOFUNFunction::RDOFUNFunction(const RDOParserSrcInfo& srcInfo, const LPRDOParam& pReturn) - : Function (pReturn->getTypeInfo(), srcInfo) - , m_pReturn(pReturn) + : Function (pReturn->getTypeInfo(), srcInfo) + , m_pReturn(pReturn) { - if (m_pReturn->getDefault()->defined()) - { - LPRDOValue pDefault = m_pReturn->getTypeInfo()->value_cast(m_pReturn->getDefault()); - ASSERT(pDefault); + if (m_pReturn->getDefault()->defined()) + { + LPRDOValue pDefault = m_pReturn->getTypeInfo()->value_cast(m_pReturn->getDefault()); + ASSERT(pDefault); - rdo::runtime::LPRDOCalcConst pCalcDefault = rdo::Factory::create(pDefault->value()); - ASSERT(pCalcDefault); - pCalcDefault->setSrcInfo(m_pReturn->getTypeInfo()->src_info()); + rdo::runtime::LPRDOCalcConst pCalcDefault = rdo::Factory::create(pDefault->value()); + ASSERT(pCalcDefault); + pCalcDefault->setSrcInfo(m_pReturn->getTypeInfo()->src_info()); - Function::setDefaultCalc(pCalcDefault); - } + Function::setDefaultCalc(pCalcDefault); + } - init(); + init(); } RDOFUNFunction::RDOFUNFunction(const std::string& name, const LPRDOParam& pReturn) - : Function (pReturn->getTypeInfo(), RDOParserSrcInfo(name)) - , m_pReturn(pReturn) + : Function (pReturn->getTypeInfo(), RDOParserSrcInfo(name)) + , m_pReturn(pReturn) { - init(); + init(); } RDOFUNFunction::~RDOFUNFunction() @@ -1465,233 +1465,233 @@ RDOFUNFunction::~RDOFUNFunction() void RDOFUNFunction::init() { - RDOParser::s_parser()->insertFUNFunction(this); - Function::pushContext(); + RDOParser::s_parser()->insertFUNFunction(this); + Function::pushContext(); } void RDOFUNFunction::end() { - Function::popContext(); + Function::popContext(); } const std::string& RDOFUNFunction::name() const { - return src_info().src_text(); + return src_info().src_text(); } void RDOFUNFunction::add(const LPRDOFUNFunctionListElement& pParam) { - m_elementList.push_back(pParam); + m_elementList.push_back(pParam); } void RDOFUNFunction::add(const LPRDOFUNCalculateIf& pCalculateIf) { - m_calculateIfList.push_back(pCalculateIf); + m_calculateIfList.push_back(pCalculateIf); } void RDOFUNFunction::createListCalc() { - if (!m_pReturn->getDefault()->defined()) - { - RDOParser::s_parser()->error().error(m_pReturn->src_info(), rdo::format("Функция '%s' должна иметь значение по умолчанию", name().c_str())); - } - if (getParams().empty()) - { - RDOParser::s_parser()->error().error(src_info(), rdo::format("Функция '%s' должна иметь параметры, т.к. её тип list", name().c_str())); - } - if (m_elementList.empty()) - { - RDOParser::s_parser()->error().warning(src_info(), rdo::format("Функция '%s' не содержит списка", name().c_str())); - } - - rdo::runtime::LPRDOCalcConst pCalcDefault = rdo::Factory::create(m_pReturn->getDefault()->value()); - ASSERT(pCalcDefault); - pCalcDefault->setSrcInfo(m_pReturn->getDefault()->src_info()); - rdo::runtime::LPRDOFunListCalc pFunListCalc = rdo::Factory::create(pCalcDefault); - ASSERT(pFunListCalc); - pFunListCalc->setSrcInfo(src_info()); - ElementList::const_iterator elem_it = m_elementList.begin(); - while (elem_it != m_elementList.end()) - { - rdo::runtime::LPRDOCalc pCaseCalc = rdo::Factory::create(true); - ASSERT(pCaseCalc); - pCaseCalc->setSrcInfo((*elem_it)->src_info()); - int currParamNumber = 0; - ParamList::const_iterator param_it = getParams().begin(); - while (param_it != getParams().end()) - { - LPRDOParam pParam = *param_it; - if (elem_it == m_elementList.end()) - { - --elem_it; - RDOParser::s_parser()->error().error((*elem_it)->src_info(), rdo::format("Ожидается значение для параметра '%s'", pParam->name().c_str())); - } - LPRDOFUNFunctionListElement pListElement = *elem_it; - ASSERT(pListElement); - if (pListElement->isEquivalence()) - { - if ((param_it + 1) == getParams().end()) - { - RDOParser::s_parser()->error().error(pListElement->src_info(), rdo::format("Перед знаком равенства ожидается значение для параметра: %s",pParam->name().c_str())); - } - else - { - std::string str = (*param_it)->src_text(); - ++param_it; - while (param_it != getParams().end()) - { - str += ", "; - str += (*param_it)->src_text(); - ++param_it; - } - RDOParser::s_parser()->error().error(pListElement->src_info(), rdo::format("Перед знаком равенства ожидаются значения для параметров: %s", str.c_str())); - } - } - rdo::runtime::LPRDOCalcFuncParam pFuncParam = rdo::Factory::create(currParamNumber, pParam->src_info()); - ASSERT(pFuncParam); - rdo::runtime::LPRDOCalcIsEqual pCompareCalc = pListElement->createIsEqualCalc(pParam->getTypeInfo(), pFuncParam, pListElement->src_info()); - ASSERT(pCompareCalc); - rdo::runtime::LPRDOCalc pAndCalc = rdo::Factory::create(pCaseCalc, pCompareCalc); - ASSERT(pAndCalc); - pCaseCalc = pAndCalc; - ++elem_it; - ++param_it; - ++currParamNumber; - } - if (elem_it == m_elementList.end()) - { - --elem_it; - --param_it; - RDOParser::s_parser()->error().error((*elem_it)->src_info(), rdo::format("После значения для параметра '%s' ожидается знак равенства", (*param_it)->name().c_str())); - } - if (!(*elem_it)->isEquivalence()) - { - RDOParser::s_parser()->error().error((*elem_it)->src_info(), rdo::format("Слишком много значений, вместо '%s' ожидается знак равенства", (*elem_it)->src_text().c_str())); - } - ++elem_it; - if (elem_it == m_elementList.end()) - { - --elem_it; - RDOParser::s_parser()->error().error((*elem_it)->src_info(), rdo::format("После знака равенства ожидается значение функции '%s'", name().c_str())); - } - rdo::runtime::LPRDOCalcConst pResultCalc = (*elem_it)->createResultCalc(m_pReturn->getTypeInfo(), (*elem_it)->src_info()); - pFunListCalc->addCase(pCaseCalc, pResultCalc); - ++elem_it; - } - setFunctionCalc(pFunListCalc); + if (!m_pReturn->getDefault()->defined()) + { + RDOParser::s_parser()->error().error(m_pReturn->src_info(), rdo::format("Функция '%s' должна иметь значение по умолчанию", name().c_str())); + } + if (getParams().empty()) + { + RDOParser::s_parser()->error().error(src_info(), rdo::format("Функция '%s' должна иметь параметры, т.к. её тип list", name().c_str())); + } + if (m_elementList.empty()) + { + RDOParser::s_parser()->error().warning(src_info(), rdo::format("Функция '%s' не содержит списка", name().c_str())); + } + + rdo::runtime::LPRDOCalcConst pCalcDefault = rdo::Factory::create(m_pReturn->getDefault()->value()); + ASSERT(pCalcDefault); + pCalcDefault->setSrcInfo(m_pReturn->getDefault()->src_info()); + rdo::runtime::LPRDOFunListCalc pFunListCalc = rdo::Factory::create(pCalcDefault); + ASSERT(pFunListCalc); + pFunListCalc->setSrcInfo(src_info()); + ElementList::const_iterator elem_it = m_elementList.begin(); + while (elem_it != m_elementList.end()) + { + rdo::runtime::LPRDOCalc pCaseCalc = rdo::Factory::create(true); + ASSERT(pCaseCalc); + pCaseCalc->setSrcInfo((*elem_it)->src_info()); + int currParamNumber = 0; + ParamList::const_iterator param_it = getParams().begin(); + while (param_it != getParams().end()) + { + LPRDOParam pParam = *param_it; + if (elem_it == m_elementList.end()) + { + --elem_it; + RDOParser::s_parser()->error().error((*elem_it)->src_info(), rdo::format("Ожидается значение для параметра '%s'", pParam->name().c_str())); + } + LPRDOFUNFunctionListElement pListElement = *elem_it; + ASSERT(pListElement); + if (pListElement->isEquivalence()) + { + if ((param_it + 1) == getParams().end()) + { + RDOParser::s_parser()->error().error(pListElement->src_info(), rdo::format("Перед знаком равенства ожидается значение для параметра: %s",pParam->name().c_str())); + } + else + { + std::string str = (*param_it)->src_text(); + ++param_it; + while (param_it != getParams().end()) + { + str += ", "; + str += (*param_it)->src_text(); + ++param_it; + } + RDOParser::s_parser()->error().error(pListElement->src_info(), rdo::format("Перед знаком равенства ожидаются значения для параметров: %s", str.c_str())); + } + } + rdo::runtime::LPRDOCalcFuncParam pFuncParam = rdo::Factory::create(currParamNumber, pParam->src_info()); + ASSERT(pFuncParam); + rdo::runtime::LPRDOCalcIsEqual pCompareCalc = pListElement->createIsEqualCalc(pParam->getTypeInfo(), pFuncParam, pListElement->src_info()); + ASSERT(pCompareCalc); + rdo::runtime::LPRDOCalc pAndCalc = rdo::Factory::create(pCaseCalc, pCompareCalc); + ASSERT(pAndCalc); + pCaseCalc = pAndCalc; + ++elem_it; + ++param_it; + ++currParamNumber; + } + if (elem_it == m_elementList.end()) + { + --elem_it; + --param_it; + RDOParser::s_parser()->error().error((*elem_it)->src_info(), rdo::format("После значения для параметра '%s' ожидается знак равенства", (*param_it)->name().c_str())); + } + if (!(*elem_it)->isEquivalence()) + { + RDOParser::s_parser()->error().error((*elem_it)->src_info(), rdo::format("Слишком много значений, вместо '%s' ожидается знак равенства", (*elem_it)->src_text().c_str())); + } + ++elem_it; + if (elem_it == m_elementList.end()) + { + --elem_it; + RDOParser::s_parser()->error().error((*elem_it)->src_info(), rdo::format("После знака равенства ожидается значение функции '%s'", name().c_str())); + } + rdo::runtime::LPRDOCalcConst pResultCalc = (*elem_it)->createResultCalc(m_pReturn->getTypeInfo(), (*elem_it)->src_info()); + pFunListCalc->addCase(pCaseCalc, pResultCalc); + ++elem_it; + } + setFunctionCalc(pFunListCalc); } void RDOFUNFunction::createTableCalc(const YYLTYPE& elements_pos) { - ElementList::const_iterator it = m_elementList.begin(); - while (it != m_elementList.end()) - { - if ((*it)->isEquivalence()) - { - RDOParser::s_parser()->error().error((*it)->src_info(), "Символ '=' недопустим в табличной функции"); - } - ++it; - } - int param_cnt = getParams().size(); - std::size_t range = 1; - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(0); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText("0"); - pCalc->setSrcInfo(srcInfo); - for (int currParam = 0; currParam < param_cnt; currParam++) - { - LPRDOParam pFunctionParam = getParams().at(currParam); - ASSERT(pFunctionParam); - rdo::runtime::LPRDOCalcFuncParam pFuncParam = rdo::Factory::create(currParam, pFunctionParam->src_info()); - ASSERT(pFuncParam); - rdo::runtime::LPRDOCalc pValue2 = pFuncParam; - if (pFunctionParam->getTypeInfo()->typeID() != rdo::runtime::RDOType::t_enum) - { - rdo::runtime::LPRDOCalcConst pCalcConst1 = rdo::Factory::create(1); - pCalcConst1->setSrcInfo(pFunctionParam->src_info()); - pValue2 = rdo::Factory::create(pValue2, pCalcConst1); - } - rdo::runtime::LPRDOCalcConst pCalcConst2 = rdo::Factory::create(range); - ASSERT(pCalcConst2); - pCalcConst2->setSrcInfo(pFunctionParam->src_info()); - rdo::runtime::LPRDOCalcMult pCalcMult = rdo::Factory::create(pCalcConst2, pValue2); - rdo::runtime::LPRDOCalcPlus pCalcAdd = rdo::Factory::create(pCalcMult, pCalc); - - switch (pFunctionParam->getTypeInfo()->typeID()) - { - case rdo::runtime::RDOType::t_int: - if (dynamic_cast(pFunctionParam->getTypeInfo()->itype().get())) - { - LPRDOTypeIntRange pRange = pFunctionParam->getTypeInfo()->itype().object_dynamic_cast(); - if (pRange->range()->getMin()->value().getInt() != 1) - { - RDOParser::s_parser()->error().error(pRange->range()->src_info(), rdo::format("Минимальное значение диапазона должно быть 1, текущий диапазон [%d..%d]", pRange->range()->getMin()->value().getInt(), pRange->range()->getMax()->value().getInt())); - } - range *= pRange->range()->getMax()->value().getInt() - pRange->range()->getMin()->value().getInt() + 1; - } - else - { - RDOParser::s_parser()->error().error(pFunctionParam->getTypeInfo()->src_info(), "Для параметра табличной функции должен быть задан допустимый диапазон"); - } - break; - case rdo::runtime::RDOType::t_enum: - range *= pFunctionParam->getTypeInfo()->itype().object_dynamic_cast()->getValues().size(); - break; - default: - RDOParser::s_parser()->error().error(pFunctionParam->getTypeInfo()->src_info(), "Параметр табличной функции может быть целого или перечислимого типа"); - } - pCalc = pCalcAdd; - } - - if (m_elementList.size() != range) - { - RDOParser::s_parser()->error().error(elements_pos, rdo::format("Неверное количество элементов табличной функции '%s': %d, требуется %d", name().c_str(), m_elementList.size(), range)); - } - - rdo::runtime::LPRDOFuncTableCalc pFuncTableCalc = rdo::Factory::create(pCalc); - ASSERT(pFuncTableCalc); - pFuncTableCalc->setSrcInfo(src_info()); - for (std::size_t currElem = 0; currElem < range; currElem++) - { - LPRDOFUNFunctionListElement pListElement = m_elementList.at(currElem); - ASSERT(pListElement); - rdo::runtime::LPRDOCalcConst pResultCalc = pListElement->createResultCalc(m_pReturn->getTypeInfo(), pListElement->src_info()); - ASSERT(pResultCalc); - pFuncTableCalc->addResultCalc(pResultCalc); - } - setFunctionCalc(pFuncTableCalc); + ElementList::const_iterator it = m_elementList.begin(); + while (it != m_elementList.end()) + { + if ((*it)->isEquivalence()) + { + RDOParser::s_parser()->error().error((*it)->src_info(), "Символ '=' недопустим в табличной функции"); + } + ++it; + } + int param_cnt = getParams().size(); + std::size_t range = 1; + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(0); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText("0"); + pCalc->setSrcInfo(srcInfo); + for (int currParam = 0; currParam < param_cnt; currParam++) + { + LPRDOParam pFunctionParam = getParams().at(currParam); + ASSERT(pFunctionParam); + rdo::runtime::LPRDOCalcFuncParam pFuncParam = rdo::Factory::create(currParam, pFunctionParam->src_info()); + ASSERT(pFuncParam); + rdo::runtime::LPRDOCalc pValue2 = pFuncParam; + if (pFunctionParam->getTypeInfo()->typeID() != rdo::runtime::RDOType::Type::ENUM) + { + rdo::runtime::LPRDOCalcConst pCalcConst1 = rdo::Factory::create(1); + pCalcConst1->setSrcInfo(pFunctionParam->src_info()); + pValue2 = rdo::Factory::create(pValue2, pCalcConst1); + } + rdo::runtime::LPRDOCalcConst pCalcConst2 = rdo::Factory::create(range); + ASSERT(pCalcConst2); + pCalcConst2->setSrcInfo(pFunctionParam->src_info()); + rdo::runtime::LPRDOCalcMult pCalcMult = rdo::Factory::create(pCalcConst2, pValue2); + rdo::runtime::LPRDOCalcPlus pCalcAdd = rdo::Factory::create(pCalcMult, pCalc); + + switch (pFunctionParam->getTypeInfo()->typeID()) + { + case rdo::runtime::RDOType::Type::INT: + if (dynamic_cast(pFunctionParam->getTypeInfo()->itype().get())) + { + LPRDOTypeIntRange pRange = pFunctionParam->getTypeInfo()->itype().object_dynamic_cast(); + if (pRange->range()->getMin()->value().getInt() != 1) + { + RDOParser::s_parser()->error().error(pRange->range()->src_info(), rdo::format("Минимальное значение диапазона должно быть 1, текущий диапазон [%d..%d]", pRange->range()->getMin()->value().getInt(), pRange->range()->getMax()->value().getInt())); + } + range *= pRange->range()->getMax()->value().getInt() - pRange->range()->getMin()->value().getInt() + 1; + } + else + { + RDOParser::s_parser()->error().error(pFunctionParam->getTypeInfo()->src_info(), "Для параметра табличной функции должен быть задан допустимый диапазон"); + } + break; + case rdo::runtime::RDOType::Type::ENUM: + range *= pFunctionParam->getTypeInfo()->itype().object_dynamic_cast()->getValues().size(); + break; + default: + RDOParser::s_parser()->error().error(pFunctionParam->getTypeInfo()->src_info(), "Параметр табличной функции может быть целого или перечислимого типа"); + } + pCalc = pCalcAdd; + } + + if (m_elementList.size() != range) + { + RDOParser::s_parser()->error().error(elements_pos, rdo::format("Неверное количество элементов табличной функции '%s': %d, требуется %d", name().c_str(), m_elementList.size(), range)); + } + + rdo::runtime::LPRDOFuncTableCalc pFuncTableCalc = rdo::Factory::create(pCalc); + ASSERT(pFuncTableCalc); + pFuncTableCalc->setSrcInfo(src_info()); + for (std::size_t currElem = 0; currElem < range; currElem++) + { + LPRDOFUNFunctionListElement pListElement = m_elementList.at(currElem); + ASSERT(pListElement); + rdo::runtime::LPRDOCalcConst pResultCalc = pListElement->createResultCalc(m_pReturn->getTypeInfo(), pListElement->src_info()); + ASSERT(pResultCalc); + pFuncTableCalc->addResultCalc(pResultCalc); + } + setFunctionCalc(pFuncTableCalc); } const LPRDOParam& RDOFUNFunction::getReturn() const { - return m_pReturn; + return m_pReturn; } rdo::runtime::LPRDOCalc RDOFUNFunction::getFunctionCalc() const { - return m_pFunctionCalc - ? m_pFunctionCalc - : expression()->calc(); + return m_pFunctionCalc + ? m_pFunctionCalc + : expression()->calc(); } void RDOFUNFunction::setFunctionCalc(const rdo::runtime::LPRDOCalc& pCalc) { - ASSERT(pCalc); - m_pFunctionCalc = pCalc; - if (m_pFunctionCalc->srcInfo().src_empty()) - { - m_pFunctionCalc->setSrcInfo(src_info()); - } + ASSERT(pCalc); + m_pFunctionCalc = pCalc; + if (m_pFunctionCalc->srcInfo().src_empty()) + { + m_pFunctionCalc->setSrcInfo(src_info()); + } } // -------------------------------------------------------------------------------- // -------------------- RDOFUNGroup // -------------------------------------------------------------------------------- RDOFUNGroup::RDOFUNGroup(const RDOParserSrcInfo& res_info) - : RDOParserSrcInfo(res_info) + : RDOParserSrcInfo(res_info) { - init(res_info); + init(res_info); } RDOFUNGroup::~RDOFUNGroup() @@ -1699,188 +1699,188 @@ RDOFUNGroup::~RDOFUNGroup() void RDOFUNGroup::init(const RDOParserSrcInfo& res_info) { - m_pResType = RDOParser::s_parser()->findRTPResType(res_info.src_text()); - if (!m_pResType) - { - RDOParser::s_parser()->error().error(res_info, rdo::format("Неизвестный тип ресурса: %s", res_info.src_text().c_str())); - } - RDOParser::s_parser()->insertFUNGroup(this); - RDOParser::s_parser()->contextStack()->push(this); + m_pResType = RDOParser::s_parser()->findRTPResType(res_info.src_text()); + if (!m_pResType) + { + RDOParser::s_parser()->error().error(res_info, rdo::format("Неизвестный тип ресурса: %s", res_info.src_text().c_str())); + } + RDOParser::s_parser()->insertFUNGroup(this); + RDOParser::s_parser()->contextStack()->push(this); } void RDOFUNGroup::end() { - RDOParser::s_parser()->getFUNGroupStack().pop_back(); - RDOParser::s_parser()->contextStack()->pop(); + RDOParser::s_parser()->getFUNGroupStack().pop_back(); + RDOParser::s_parser()->contextStack()->pop(); } Context::LPFindResult RDOFUNGroup::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const { - //! Тип ресурса внутри групповой функции - if (method == Context::METHOD_OPERATOR_DOT) - { - if (getResType()->name() == params.identifier()) - { - Context::Params params; - params[RDORSSResource::GET_RESOURCE] = rdo::Factory::create( - rdo::Factory::create(getResType(), srcInfo), - rdo::Factory::create(), - srcInfo - ); - return rdo::Factory::create(SwitchContext(getResType(), params)); - } - } + // Тип ресурса внутри групповой функции + if (method == Context::METHOD_OPERATOR_DOT) + { + if (getResType()->name() == params.identifier()) + { + Context::Params params; + params[RDORSSResource::GET_RESOURCE] = rdo::Factory::create( + rdo::Factory::create(getResType(), srcInfo), + rdo::Factory::create(), + srcInfo + ); + return rdo::Factory::create(SwitchContext(getResType(), params)); + } + } - return rdo::Factory::create(); + return rdo::Factory::create(); } // -------------------------------------------------------------------------------- // -------------------- RDOFUNGroupLogic // -------------------------------------------------------------------------------- -RDOFUNGroupLogic::RDOFUNGroupLogic(FunGroupType funType, const RDOParserSrcInfo& res_info) - : RDOFUNGroup(res_info) - , m_funType (funType ) +RDOFUNGroupLogic::RDOFUNGroupLogic(Type type, const RDOParserSrcInfo& res_info) + : RDOFUNGroup(res_info) + , m_type(type) {} LPRDOFUNLogic RDOFUNGroupLogic::createFunLogic(LPRDOFUNLogic& pCondition) { - rdo::runtime::LPRDOFunCalcGroup pCalc; - switch (m_funType) - { - case fgt_exist : setSrcText("Exist(" + getResType()->name() + ": " + pCondition->src_text() + ")"); pCalc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; - case fgt_notexist : setSrcText("NotExist(" + getResType()->name() + ": " + pCondition->src_text() + ")"); pCalc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; - case fgt_forall : setSrcText("ForAll(" + getResType()->name() + ": " + pCondition->src_text() + ")"); pCalc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; - case fgt_notforall: setSrcText("NotForAll(" + getResType()->name() + ": " + pCondition->src_text() + ")"); pCalc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; - default: RDOParser::s_parser()->error().error(src_info(), "Внутренная ошибка: несуществующий тип функции"); - } - end(); + rdo::runtime::LPRDOFunCalcGroup pCalc; + switch (m_type) + { + case Type::EXIST : setSrcText("Exist(" + getResType()->name() + ": " + pCondition->src_text() + ")"); pCalc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; + case Type::NOTEXIST : setSrcText("NotExist(" + getResType()->name() + ": " + pCondition->src_text() + ")"); pCalc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; + case Type::FORALL : setSrcText("ForAll(" + getResType()->name() + ": " + pCondition->src_text() + ")"); pCalc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; + case Type::NOTFORALL: setSrcText("NotForAll(" + getResType()->name() + ": " + pCondition->src_text() + ")"); pCalc = rdo::Factory::create(getResType()->getNumber(), pCondition->getCalc()); break; + default: RDOParser::s_parser()->error().error(src_info(), "Внутренняя ошибка: несуществующий тип функции"); + } + end(); - LPExpression pExpression = rdo::Factory::create( - rdo::Factory::delegate(pCalc->srcInfo()), - pCalc, - pCalc->srcInfo() - ); - ASSERT(pExpression); + LPExpression pExpression = rdo::Factory::create( + rdo::Factory::delegate(pCalc->srcInfo()), + pCalc, + pCalc->srcInfo() + ); + ASSERT(pExpression); - LPRDOFUNLogic pLogic = rdo::Factory::create(pExpression, false); - ASSERT(pLogic); + LPRDOFUNLogic pLogic = rdo::Factory::create(pExpression, false); + ASSERT(pLogic); - pLogic->setSrcInfo(src_info()); - return pLogic; + pLogic->setSrcInfo(src_info()); + return pLogic; } // -------------------------------------------------------------------------------- // -------------------- RDOFUNSelect // -------------------------------------------------------------------------------- RDOFUNSelect::RDOFUNSelect(const RDOParserSrcInfo& res_info) - : RDOFUNGroup(RDOParserSrcInfo(res_info.src_text())) + : RDOFUNGroup(RDOParserSrcInfo(res_info.src_text())) {} -//! Сам Select как выборка по типу и условию +// Сам Select как выборка по типу и условию void RDOFUNSelect::initSelect(LPRDOFUNLogic pCondition) { - m_pCalcSelect = rdo::Factory::create(getResType().interface_dynamic_cast(), getResType()->getNumber(), pCondition->getCalc()); - m_pCalcSelect->setSrcInfo(pCondition->src_info()); + m_pCalcSelect = rdo::Factory::create(getResType().interface_dynamic_cast(), getResType()->getNumber(), pCondition->getCalc()); + m_pCalcSelect->setSrcInfo(pCondition->src_info()); } namespace { - LPExpression getSelectExpression( - const LPRDOFUNSelect& select, - const rdo::runtime::LPRDOCalc& selectCalc, - const LPTypeInfo& selectType, - const RDOParserSrcInfo& srcInfo) - { - select->end(); - return rdo::Factory::create( - selectType, - selectCalc, - srcInfo - ); - } + LPExpression getSelectExpression( + const LPRDOFUNSelect& select, + const rdo::runtime::LPRDOCalc& selectCalc, + const LPTypeInfo& selectType, + const RDOParserSrcInfo& srcInfo) + { + select->end(); + return rdo::Factory::create( + selectType, + selectCalc, + srcInfo + ); + } } Context::LPFindResult RDOFUNSelect::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const { - if (method == "select()") - { - rdo::runtime::LPRDOCalc selectCalc; - LPTypeInfo selectType; - - switch (params.get("FunGroupType")) - { - case RDOFUNGroupLogic::fgt_exist: - { - LPRDOFUNLogic pCondition = params.get("GroupLogic"); - const_cast(this)->setSrcText(src_text() + ".Exist(" + pCondition->src_text() + ")"); - selectCalc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); - selectCalc->setSrcInfo(src_info()); - selectType = rdo::Factory::delegate(selectCalc->srcInfo()); - break; - } - case RDOFUNGroupLogic::fgt_notexist: - { - LPRDOFUNLogic pCondition = params.get("GroupLogic"); - const_cast(this)->setSrcText(src_text() + ".NotExist(" + pCondition->src_text() + ")"); - selectCalc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); - selectCalc->setSrcInfo(src_info()); - selectType = rdo::Factory::delegate(selectCalc->srcInfo()); - break; - } - case RDOFUNGroupLogic::fgt_forall: - { - LPRDOFUNLogic pCondition = params.get("GroupLogic"); - const_cast(this)->setSrcText(src_text() + ".ForAll(" + pCondition->src_text() + ")"); - selectCalc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); - selectCalc->setSrcInfo(src_info()); - selectType = rdo::Factory::delegate(selectCalc->srcInfo()); - break; - } - case RDOFUNGroupLogic::fgt_notforall: - { - LPRDOFUNLogic pCondition = params.get("GroupLogic"); - const_cast(this)->setSrcText(src_text() + ".NotForAll(" + pCondition->src_text() + ")"); - selectCalc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); - selectCalc->setSrcInfo(src_info()); - selectType = rdo::Factory::delegate(selectCalc->srcInfo()); - break; - } - case RDOFUNGroupLogic::fgt_empty: - { - const_cast(this)->setSrcText(src_text() + ".Empty(" + srcInfo.src_text() + ")"); - selectCalc = rdo::Factory::create(m_pCalcSelect); - selectCalc->setSrcInfo(src_info()); - selectType = rdo::Factory::delegate(selectCalc->srcInfo()); - break; - } - case RDOFUNGroupLogic::fgt_size: - { - const_cast(this)->setSrcText(src_text() + ".Size(" + srcInfo.src_text() + ")"); - selectCalc = rdo::Factory::create(m_pCalcSelect); - selectCalc->setSrcInfo(src_info()); - selectType = rdo::Factory::delegate(srcInfo); - break; - } - case RDOFUNGroupLogic::fgt_array: - { - const_cast(this)->setSrcText(src_text() + ".Array(" + srcInfo.src_text() + ")"); - LPRDOArrayType pArrayType = rdo::Factory::create(rdo::Factory::create(getResType(), srcInfo), srcInfo); - selectCalc = rdo::Factory::create(m_pCalcSelect); - selectCalc->setSrcInfo(src_info()); - selectType = rdo::Factory::create(pArrayType, srcInfo); - break; - } - default: - RDOParser::s_parser()->error().error(srcInfo, "Внутренная ошибка: неизвестный метод для списка ресурсов"); - break; - } - ASSERT(selectCalc); - ASSERT(selectType); - return rdo::Factory::create(CreateExpression(boost::bind(&getSelectExpression, - LPRDOFUNSelect(const_cast(this)), selectCalc,selectType, srcInfo))); - } - - return RDOFUNGroup::onFindContext(method, params, srcInfo); + if (method == "select()") + { + rdo::runtime::LPRDOCalc selectCalc; + LPTypeInfo selectType; + + switch (params.get("FunGroupType")) + { + case RDOFUNGroupLogic::Type::EXIST: + { + LPRDOFUNLogic pCondition = params.get("GroupLogic"); + const_cast(this)->setSrcText(src_text() + ".Exist(" + pCondition->src_text() + ")"); + selectCalc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); + selectCalc->setSrcInfo(src_info()); + selectType = rdo::Factory::delegate(selectCalc->srcInfo()); + break; + } + case RDOFUNGroupLogic::Type::NOTEXIST: + { + LPRDOFUNLogic pCondition = params.get("GroupLogic"); + const_cast(this)->setSrcText(src_text() + ".NotExist(" + pCondition->src_text() + ")"); + selectCalc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); + selectCalc->setSrcInfo(src_info()); + selectType = rdo::Factory::delegate(selectCalc->srcInfo()); + break; + } + case RDOFUNGroupLogic::Type::FORALL: + { + LPRDOFUNLogic pCondition = params.get("GroupLogic"); + const_cast(this)->setSrcText(src_text() + ".ForAll(" + pCondition->src_text() + ")"); + selectCalc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); + selectCalc->setSrcInfo(src_info()); + selectType = rdo::Factory::delegate(selectCalc->srcInfo()); + break; + } + case RDOFUNGroupLogic::Type::NOTFORALL: + { + LPRDOFUNLogic pCondition = params.get("GroupLogic"); + const_cast(this)->setSrcText(src_text() + ".NotForAll(" + pCondition->src_text() + ")"); + selectCalc = rdo::Factory::create(m_pCalcSelect, pCondition->getCalc()); + selectCalc->setSrcInfo(src_info()); + selectType = rdo::Factory::delegate(selectCalc->srcInfo()); + break; + } + case RDOFUNGroupLogic::Type::EMPTY: + { + const_cast(this)->setSrcText(src_text() + ".Empty(" + srcInfo.src_text() + ")"); + selectCalc = rdo::Factory::create(m_pCalcSelect); + selectCalc->setSrcInfo(src_info()); + selectType = rdo::Factory::delegate(selectCalc->srcInfo()); + break; + } + case RDOFUNGroupLogic::Type::SIZE: + { + const_cast(this)->setSrcText(src_text() + ".Size(" + srcInfo.src_text() + ")"); + selectCalc = rdo::Factory::create(m_pCalcSelect); + selectCalc->setSrcInfo(src_info()); + selectType = rdo::Factory::delegate(srcInfo); + break; + } + case RDOFUNGroupLogic::Type::ARRAY: + { + const_cast(this)->setSrcText(src_text() + ".Array(" + srcInfo.src_text() + ")"); + LPRDOArrayType pArrayType = rdo::Factory::create(rdo::Factory::create(getResType(), srcInfo), srcInfo); + selectCalc = rdo::Factory::create(m_pCalcSelect); + selectCalc->setSrcInfo(src_info()); + selectType = rdo::Factory::create(pArrayType, srcInfo); + break; + } + default: + RDOParser::s_parser()->error().error(srcInfo, "Внутренняя ошибка: неизвестный метод для списка ресурсов"); + break; + } + ASSERT(selectCalc); + ASSERT(selectType); + return rdo::Factory::create(CreateExpression(boost::bind(&getSelectExpression, + LPRDOFUNSelect(const_cast(this)), selectCalc,selectType, srcInfo))); + } + + return RDOFUNGroup::onFindContext(method, params, srcInfo); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdofun.h b/simulator/compiler/parser/rdofun.h index 4c60fe77a..a7099ab1d 100644 --- a/simulator/compiler/parser/rdofun.h +++ b/simulator/compiler/parser/rdofun.h @@ -1,5 +1,4 @@ -#ifndef _RDOFUN_H_ -#define _RDOFUN_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -32,25 +31,25 @@ OPEN_RDO_PARSER_NAMESPACE class RDOFUNDoubleToIntByResult { public: - void roundCalc(); - void push_back(const rdo::runtime::LPRDOCalcDoubleToIntByResult& pCalc) - { - m_intOrDouble.push_back(pCalc); - } - void insert(const RDOFUNDoubleToIntByResult& first) - { - m_intOrDouble.insert(m_intOrDouble.end(), first.m_intOrDouble.begin(), first.m_intOrDouble.end()); - } - void insert(const RDOFUNDoubleToIntByResult& first, const RDOFUNDoubleToIntByResult& pSecond) - { - m_intOrDouble.insert(m_intOrDouble.end(), first.m_intOrDouble.begin(), first.m_intOrDouble.end()); - m_intOrDouble.insert(m_intOrDouble.end(), pSecond.m_intOrDouble.begin(), pSecond.m_intOrDouble.end()); - } + void roundCalc(); + void push_back(const rdo::runtime::LPRDOCalcDoubleToIntByResult& pCalc) + { + m_intOrDouble.push_back(pCalc); + } + void insert(const RDOFUNDoubleToIntByResult& first) + { + m_intOrDouble.insert(m_intOrDouble.end(), first.m_intOrDouble.begin(), first.m_intOrDouble.end()); + } + void insert(const RDOFUNDoubleToIntByResult& first, const RDOFUNDoubleToIntByResult& pSecond) + { + m_intOrDouble.insert(m_intOrDouble.end(), first.m_intOrDouble.begin(), first.m_intOrDouble.end()); + m_intOrDouble.insert(m_intOrDouble.end(), pSecond.m_intOrDouble.begin(), pSecond.m_intOrDouble.end()); + } private: - typedef std::vector CalcList; + typedef std::vector CalcList; - CalcList m_intOrDouble; + CalcList m_intOrDouble; }; // -------------------------------------------------------------------------------- @@ -58,18 +57,18 @@ class RDOFUNDoubleToIntByResult // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOFUNBase); class RDOFUNBase - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { public: - const LPExpression& expression() const; + const LPExpression& expression() const; protected: - RDOFUNBase(const RDOParserSrcInfo& srcInfo); - RDOFUNBase(const LPExpression& pExpression); + RDOFUNBase(const RDOParserSrcInfo& srcInfo); + RDOFUNBase(const LPExpression& pExpression); - LPExpression m_pExpression; - RDOFUNDoubleToIntByResult m_intOrDouble; + LPExpression m_pExpression; + RDOFUNDoubleToIntByResult m_intOrDouble; }; // -------------------------------------------------------------------------------- @@ -83,32 +82,32 @@ class RDOFUNLogic: public RDOFUNBase DECLARE_FACTORY(RDOFUNLogic); friend class RDOFUNArithm; public: - rdo::runtime::LPRDOCalc getCalc(rdo::runtime::RDOType::TypeID id = rdo::runtime::RDOType::t_real); + rdo::runtime::LPRDOCalc getCalc(rdo::runtime::RDOType::Type id = rdo::runtime::RDOType::Type::REAL); - LPRDOFUNLogic operator && (const LPRDOFUNLogic& pSecond); - LPRDOFUNLogic operator || (const LPRDOFUNLogic& pSecond); - LPRDOFUNLogic operator_not(const RDOSrcInfo::Position& position); + LPRDOFUNLogic operator && (const LPRDOFUNLogic& pSecond); + LPRDOFUNLogic operator || (const LPRDOFUNLogic& pSecond); + LPRDOFUNLogic operator_not(const RDOSrcInfo::Position& position); - virtual void setSrcInfo(const RDOParserSrcInfo& srcInfo); - virtual void setSrcPos(const RDOSrcInfo::Position& position); - virtual void setSrcText(const std::string& value); - void setSrcPos(const YYLTYPE& error_pos); - void setSrcPos(const YYLTYPE& pos_begin, const YYLTYPE& pos_end); + virtual void setSrcInfo(const RDOParserSrcInfo& srcInfo); + virtual void setSrcPos(const RDOSrcInfo::Position& position); + virtual void setSrcText(const std::string& value); + void setSrcPos(const YYLTYPE& error_pos); + void setSrcPos(const YYLTYPE& pos_begin, const YYLTYPE& pos_end); - static LPRDOFUNLogic generateTrue(const RDOParserSrcInfo& srcInfo); + static LPRDOFUNLogic generateTrue(const RDOParserSrcInfo& srcInfo); private: - RDOFUNLogic(const LPRDOFUNArithm& pArithm); - RDOFUNLogic(const LPExpression& pExpression, bool hideWarning); - virtual ~RDOFUNLogic(); + RDOFUNLogic(const LPRDOFUNArithm& pArithm); + RDOFUNLogic(const LPExpression& pExpression, bool hideWarning); + virtual ~RDOFUNLogic(); - LPRDOFUNLogic createLogic(const rdo::runtime::LPRDOCalc& pCalc); + LPRDOFUNLogic createLogic(const rdo::runtime::LPRDOCalc& pCalc); - template - LPRDOFUNLogic generateLogic(const LPRDOFUNLogic& pSecond); + template + LPRDOFUNLogic generateLogic(const LPRDOFUNLogic& pSecond); - template - LPRDOFUNLogic generateLogic(const RDOSrcInfo::Position& position); + template + LPRDOFUNLogic generateLogic(const RDOSrcInfo::Position& position); }; DECLARE_POINTER(LPRDOFUNLogic); @@ -119,69 +118,69 @@ class RDOFUNArithm: public RDOFUNBase { DECLARE_FACTORY(RDOFUNArithm); public: - static const std::string CONTEXT_PARAM_SET_ARITHM; + static const std::string CONTEXT_PARAM_SET_ARITHM; - LPRDOFUNArithm operator +(const LPRDOFUNArithm& pSecond); - LPRDOFUNArithm operator -(const LPRDOFUNArithm& pSecond); - LPRDOFUNArithm operator *(const LPRDOFUNArithm& pSecond); - LPRDOFUNArithm operator /(const LPRDOFUNArithm& pSecond); - LPRDOFUNArithm setEqual (const LPRDOFUNArithm& pSecond); - LPRDOFUNArithm uminus (const rdo::runtime::RDOSrcInfo::Position& position); + LPRDOFUNArithm operator +(const LPRDOFUNArithm& pSecond); + LPRDOFUNArithm operator -(const LPRDOFUNArithm& pSecond); + LPRDOFUNArithm operator *(const LPRDOFUNArithm& pSecond); + LPRDOFUNArithm operator /(const LPRDOFUNArithm& pSecond); + LPRDOFUNArithm setEqual (const LPRDOFUNArithm& pSecond); + LPRDOFUNArithm uminus (const rdo::runtime::RDOSrcInfo::Position& position); - LPRDOFUNLogic operator ==(const LPRDOFUNArithm& pSecond); - LPRDOFUNLogic operator !=(const LPRDOFUNArithm& pSecond); - LPRDOFUNLogic operator < (const LPRDOFUNArithm& pSecond); - LPRDOFUNLogic operator > (const LPRDOFUNArithm& pSecond); - LPRDOFUNLogic operator <=(const LPRDOFUNArithm& pSecond); - LPRDOFUNLogic operator >=(const LPRDOFUNArithm& pSecond); + LPRDOFUNLogic operator ==(const LPRDOFUNArithm& pSecond); + LPRDOFUNLogic operator !=(const LPRDOFUNArithm& pSecond); + LPRDOFUNLogic operator < (const LPRDOFUNArithm& pSecond); + LPRDOFUNLogic operator > (const LPRDOFUNArithm& pSecond); + LPRDOFUNLogic operator <=(const LPRDOFUNArithm& pSecond); + LPRDOFUNLogic operator >=(const LPRDOFUNArithm& pSecond); - rdo::runtime::LPRDOCalc createCalc(const LPTypeInfo& pForType = NULL); + rdo::runtime::LPRDOCalc createCalc(const LPTypeInfo& pForType = NULL); - const LPTypeInfo& typeInfo () const { return m_pExpression->typeInfo(); } - rdo::runtime::LPRDOCalc calc () const { return m_pExpression->calc(); } - rdo::runtime::RDOValue const_value() const; + const LPTypeInfo& typeInfo () const { return m_pExpression->typeInfo(); } + rdo::runtime::LPRDOCalc calc () const { return m_pExpression->calc(); } + rdo::runtime::RDOValue const_value() const; - LPRDOEnumType enumType () const { return typeInfo()->itype().object_static_cast(); } - rdo::runtime::RDOType::TypeID typeID () const { return typeInfo()->typeID(); } + LPRDOEnumType enumType () const { return typeInfo()->itype().object_static_cast(); } + rdo::runtime::RDOType::Type typeID () const { return typeInfo()->typeID(); } - virtual void setSrcInfo(const RDOParserSrcInfo& srcInfo ); - virtual void setSrcPos (const RDOSrcInfo::Position& position); - virtual void setSrcText(const std::string& value); - void setSrcInfo(const RDOParserSrcInfo& begin, const std::string& delim, const RDOParserSrcInfo& end); - void setSrcPos (const YYLTYPE& error_pos); - void setSrcPos (const YYLTYPE& pos_begin, const YYLTYPE& pos_end); + virtual void setSrcInfo(const RDOParserSrcInfo& srcInfo ); + virtual void setSrcPos (const RDOSrcInfo::Position& position); + virtual void setSrcText(const std::string& value); + void setSrcInfo(const RDOParserSrcInfo& begin, const std::string& delim, const RDOParserSrcInfo& end); + void setSrcPos (const YYLTYPE& error_pos); + void setSrcPos (const YYLTYPE& pos_begin, const YYLTYPE& pos_end); - void checkParamType(const LPTypeInfo& pType); + void checkParamType(const LPTypeInfo& pType); - static void wrongVarInitialization(const LPRDOValue& name); + static void wrongVarInitialization(const LPRDOValue& name); - static LPRDOFUNArithm generateByConst (const LPRDOValue& pValue); - static LPRDOFUNArithm generateByIdentificator(const LPRDOValue& pValue); - static LPRDOFUNArithm generateByIdentificator(const LPRDOValue& pValue1, const LPRDOValue& pValue2); + static LPRDOFUNArithm generateByConst (const LPRDOValue& pValue); + static LPRDOFUNArithm generateByIdentificator(const LPRDOValue& pValue); + static LPRDOFUNArithm generateByIdentificator(const LPRDOValue& pValue1, const LPRDOValue& pValue2); private: - RDOFUNArithm(const LPExpression& pExpression); - virtual ~RDOFUNArithm(); + RDOFUNArithm(const LPExpression& pExpression); + virtual ~RDOFUNArithm(); - LPTypeInfo getPreType(const LPRDOFUNArithm& pSecond); + LPTypeInfo getPreType(const LPRDOFUNArithm& pSecond); - template - rdo::runtime::LPRDOCalc generateCalc(const rdo::runtime::RDOSrcInfo::Position& position, const std::string& error); + template + rdo::runtime::LPRDOCalc generateCalc(const rdo::runtime::RDOSrcInfo::Position& position, const std::string& error); - template - rdo::runtime::LPRDOCalc generateCalc(const LPRDOFUNArithm& pSecond, const std::string& error); + template + rdo::runtime::LPRDOCalc generateCalc(const LPRDOFUNArithm& pSecond, const std::string& error); - template - LPRDOFUNArithm generateArithm(const rdo::runtime::RDOSrcInfo::Position& position, const std::string& error); + template + LPRDOFUNArithm generateArithm(const rdo::runtime::RDOSrcInfo::Position& position, const std::string& error); - template - LPRDOFUNArithm generateArithm(const LPRDOFUNArithm& pSecond, const std::string& error); + template + LPRDOFUNArithm generateArithm(const LPRDOFUNArithm& pSecond, const std::string& error); - template - LPRDOFUNLogic generateLogic(const LPRDOFUNArithm& pSecond, const std::string& error); + template + LPRDOFUNLogic generateLogic(const LPRDOFUNArithm& pSecond, const std::string& error); - void castType (const LPRDOFUNArithm& pSecond, const std::string& error); - void castValue(const LPRDOFUNArithm& pSecond, const std::string& error); + void castType (const LPRDOFUNArithm& pSecond, const std::string& error); + void castValue(const LPRDOFUNArithm& pSecond, const std::string& error); }; DECLARE_POINTER(LPRDOFUNArithm); @@ -192,38 +191,36 @@ class RDOFUNConstant: public RDOParam { DECLARE_FACTORY(RDOFUNConstant); public: - int getNumber() const { return m_number; } + int getNumber() const { return m_number; } private: - RDOFUNConstant(const RDOParserSrcInfo& srcInfo, const LPTypeInfo& pType, const LPRDOValue& pDefault); - virtual ~RDOFUNConstant(); + RDOFUNConstant(const RDOParserSrcInfo& srcInfo, const LPTypeInfo& pType, const LPRDOValue& pDefault); + virtual ~RDOFUNConstant(); - int m_number; + int m_number; - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; DECLARE_POINTER(RDOFUNConstant); -//! Список арифметических выражений -//! \details Используется для передачи параметров при вызове событий и функций PREDECLARE_POINTER(ArithmContainer); class ArithmContainer - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(ArithmContainer); public: - typedef std::vector Container; + typedef std::vector Container; - const Container& getContainer() const { return m_arithmList; } - void addItem (const LPRDOFUNArithm& pArithm); - LPFunctionParamType getType () const; + const Container& getContainer() const { return m_arithmList; } + void addItem (const LPRDOFUNArithm& pArithm); + LPFunctionParamType getType () const; private: - ArithmContainer(); - virtual ~ArithmContainer(); + ArithmContainer(); + virtual ~ArithmContainer(); - Container m_arithmList; + Container m_arithmList; }; // -------------------------------------------------------------------------------- @@ -233,28 +230,29 @@ DECLARE_FACTORY(ArithmContainer); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOFUNParams); class RDOFUNParams - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOFUNParams); public: - typedef std::vector ParamList; + typedef std::vector ParamList; - RDOParserSrcInfo& getFunseqName() { return m_funseqName; } - const LPArithmContainer& getParamList() const { return m_pArithmContainer ; } - rdo::runtime::LPRDOCalc getCalc(std::size_t paramID, const LPTypeInfo& pType); + RDOParserSrcInfo& getFunseqName() { return m_funseqName; } + const LPArithmContainer& getParamList() const { return m_pArithmContainer ; } + rdo::runtime::LPRDOCalc getCalc(std::size_t paramID, const LPTypeInfo& pType); - LPExpression createCallExpression(const LPExpression& pFunction); - LPRDOFUNArithm createCall(const std::string& funName); - LPRDOFUNArithm createSeqCall(const std::string& seqName); + LPExpression createCallExpression(const LPExpression& pFunction); + LPRDOFUNArithm createCall(const std::string& funName); + LPRDOFUNArithm createSeqCall(const std::string& seqName); private: - RDOFUNParams(const LPArithmContainer& pArithmContainer); - virtual ~RDOFUNParams(); + RDOFUNParams(const LPArithmContainer& pArithmContainer); + virtual ~RDOFUNParams(); - RDOParserSrcInfo m_funseqName; - LPArithmContainer m_pArithmContainer; + RDOParserSrcInfo m_funseqName; + LPArithmContainer m_pArithmContainer; }; + // -------------------------------------------------------------------------------- // -------------------- Последовательности // -------------------------------------------------------------------------------- @@ -262,52 +260,52 @@ DECLARE_FACTORY(RDOFUNParams); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOFUNSequence); class RDOFUNSequence - : public virtual rdo::counter_reference - , public RDOParserSrcInfo - , public Context - , public IContextFind + : public virtual rdo::counter_reference + , public RDOParserSrcInfo + , public Context + , public IContextFind { DECLARE_FACTORY(RDOFUNSequence); public: - PREDECLARE_POINTER(RDOFUNSequenceHeader); - class RDOFUNSequenceHeader - : public rdo::counter_reference - , public RDOParserSrcInfo - { - DECLARE_FACTORY(RDOFUNSequenceHeader); - public: - const LPTypeInfo& getTypeInfo() const { return m_pType; } - - private: - RDOFUNSequenceHeader(const LPTypeInfo& pType, const RDOParserSrcInfo& srcInfo) - : RDOParserSrcInfo(srcInfo) - , m_pType (pType ) - {} - - LPTypeInfo m_pType; - }; - - const std::string& name() const { return m_pHeader->src_text(); } - const LPRDOFUNSequenceHeader& getHeader() const { return m_pHeader; } - rdo::runtime::LPRDOCalcSeqInit& getInitCalc() { return m_pInitCalc; } - rdo::runtime::LPRDOCalcSeqNext& getNextCalc() { return m_pNextCalc; } - - virtual void createCalcs () = 0; - virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& srcInfo) const = 0; + PREDECLARE_POINTER(RDOFUNSequenceHeader); + class RDOFUNSequenceHeader + : public rdo::counter_reference + , public RDOParserSrcInfo + { + DECLARE_FACTORY(RDOFUNSequenceHeader); + public: + const LPTypeInfo& getTypeInfo() const { return m_pType; } + + private: + RDOFUNSequenceHeader(const LPTypeInfo& pType, const RDOParserSrcInfo& srcInfo) + : RDOParserSrcInfo(srcInfo) + , m_pType (pType ) + {} + + LPTypeInfo m_pType; + }; + + const std::string& name() const { return m_pHeader->src_text(); } + const LPRDOFUNSequenceHeader& getHeader() const { return m_pHeader; } + rdo::runtime::LPRDOCalcSeqInit& getInitCalc() { return m_pInitCalc; } + rdo::runtime::LPRDOCalcSeqNext& getNextCalc() { return m_pNextCalc; } + + virtual void createCalcs () = 0; + virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& srcInfo) const = 0; protected: - RDOFUNSequence(const LPRDOFUNSequenceHeader& pHeader, int seed); - virtual ~RDOFUNSequence(); + RDOFUNSequence(const LPRDOFUNSequenceHeader& pHeader, int seed); + virtual ~RDOFUNSequence(); - LPRDOFUNSequenceHeader m_pHeader; - int m_seed; - rdo::runtime::LPRDOCalcSeqInit m_pInitCalc; - rdo::runtime::LPRDOCalcSeqNext m_pNextCalc; + LPRDOFUNSequenceHeader m_pHeader; + int m_seed; + rdo::runtime::LPRDOCalcSeqInit m_pInitCalc; + rdo::runtime::LPRDOCalcSeqNext m_pNextCalc; - void initResult (); - void initCalcSrcInfo(); + void initResult (); + void initCalcSrcInfo(); - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; // -------------------------------------------------------------------------------- @@ -319,10 +317,10 @@ class RDOFUNSequenceUniform: public RDOFUNSequence { DECLARE_FACTORY(RDOFUNSequenceUniform); private: - RDOFUNSequenceUniform(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); + RDOFUNSequenceUniform(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); - virtual void createCalcs (); - virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seqSrcInfo) const; + virtual void createCalcs (); + virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seqSrcInfo) const; }; // -------------------------------------------------------------------------------- @@ -332,10 +330,10 @@ class RDOFUNSequenceExponential: public RDOFUNSequence { DECLARE_FACTORY(RDOFUNSequenceExponential); private: - RDOFUNSequenceExponential(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); + RDOFUNSequenceExponential(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); - virtual void createCalcs (); - virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seqSrcInfo) const; + virtual void createCalcs (); + virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seqSrcInfo) const; }; // -------------------------------------------------------------------------------- @@ -345,10 +343,10 @@ class RDOFUNSequenceNormal: public RDOFUNSequence { DECLARE_FACTORY(RDOFUNSequenceNormal); private: - RDOFUNSequenceNormal(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); + RDOFUNSequenceNormal(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); - virtual void createCalcs (); - virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seqSrcInfo) const; + virtual void createCalcs (); + virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seqSrcInfo) const; }; // ---------------------------------------------------------------------------- @@ -358,10 +356,10 @@ class RDOFUNSequenceTriangular: public RDOFUNSequence { DECLARE_FACTORY(RDOFUNSequenceTriangular); private: - RDOFUNSequenceTriangular(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); + RDOFUNSequenceTriangular(const LPRDOFUNSequenceHeader& pHeader, int seed = 123456789); - virtual void createCalcs (); - virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seqSrcInfo) const; + virtual void createCalcs (); + virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& seqSrcInfo) const; }; // ---------------------------------------------------------------------------- @@ -372,32 +370,32 @@ DECLARE_FACTORY(RDOFUNSequenceTriangular); class RDOFUNSequenceByHist: public RDOFUNSequence { public: - PREDECLARE_POINTER(RDOFUNSequenceByHistHeader); - class RDOFUNSequenceByHistHeader - : public rdo::counter_reference - , public RDOParserSrcInfo - { - DECLARE_FACTORY(RDOFUNSequenceByHistHeader); - public: - const RDOFUNSequence::LPRDOFUNSequenceHeader& getHeader() const { return m_pHeader; } - int getSeed () const { return m_seed; } - - private: - RDOFUNSequenceByHistHeader(const RDOFUNSequence::LPRDOFUNSequenceHeader& pHeader, int seed = 123456789) - : RDOParserSrcInfo(pHeader->src_info()) - , m_pHeader (pHeader ) - , m_seed (seed ) - {} - - RDOFUNSequence::LPRDOFUNSequenceHeader m_pHeader; - int m_seed; - }; + PREDECLARE_POINTER(RDOFUNSequenceByHistHeader); + class RDOFUNSequenceByHistHeader + : public rdo::counter_reference + , public RDOParserSrcInfo + { + DECLARE_FACTORY(RDOFUNSequenceByHistHeader); + public: + const RDOFUNSequence::LPRDOFUNSequenceHeader& getHeader() const { return m_pHeader; } + int getSeed () const { return m_seed; } + + private: + RDOFUNSequenceByHistHeader(const RDOFUNSequence::LPRDOFUNSequenceHeader& pHeader, int seed = 123456789) + : RDOParserSrcInfo(pHeader->src_info()) + , m_pHeader (pHeader ) + , m_seed (seed ) + {} + + RDOFUNSequence::LPRDOFUNSequenceHeader m_pHeader; + int m_seed; + }; protected: - RDOFUNSequenceByHist(const LPRDOFUNSequenceByHistHeader& pHeader); + RDOFUNSequenceByHist(const LPRDOFUNSequenceByHistHeader& pHeader); private: - virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& srcInfo) const; + virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& srcInfo) const; }; // -------------------------------------------------------------------------------- @@ -407,17 +405,17 @@ class RDOFUNSequenceByHistReal: public RDOFUNSequenceByHist { DECLARE_FACTORY(RDOFUNSequenceByHistReal); public: - typedef std::vector ValueList; + typedef std::vector ValueList; - void addReal(const LPRDOValue& pFrom, const LPRDOValue& pTo, const LPRDOValue& pFreq); + void addReal(const LPRDOValue& pFrom, const LPRDOValue& pTo, const LPRDOValue& pFreq); private: - RDOFUNSequenceByHistReal(const LPRDOFUNSequenceByHistHeader& pHeader, const LPRDOValue& pFrom, const LPRDOValue& pTo, const LPRDOValue& pFreq); - virtual void createCalcs(); + RDOFUNSequenceByHistReal(const LPRDOFUNSequenceByHistHeader& pHeader, const LPRDOValue& pFrom, const LPRDOValue& pTo, const LPRDOValue& pFreq); + virtual void createCalcs(); - ValueList m_from; - ValueList m_to; - ValueList m_freq; + ValueList m_from; + ValueList m_to; + ValueList m_freq; }; DECLARE_POINTER(RDOFUNSequenceByHistReal); @@ -428,16 +426,16 @@ class RDOFUNSequenceByHistEnum: public RDOFUNSequenceByHist { DECLARE_FACTORY(RDOFUNSequenceByHistEnum); public: - typedef std::vector ValueList; + typedef std::vector ValueList; - void addEnum(const LPRDOValue& pValue, const LPRDOValue& pFreq); + void addEnum(const LPRDOValue& pValue, const LPRDOValue& pFreq); private: - RDOFUNSequenceByHistEnum(const LPRDOFUNSequenceByHistHeader& pHeader, const LPRDOValue& pValue, const LPRDOValue& pFreq); - virtual void createCalcs(); + RDOFUNSequenceByHistEnum(const LPRDOFUNSequenceByHistHeader& pHeader, const LPRDOValue& pValue, const LPRDOValue& pFreq); + virtual void createCalcs(); - ValueList m_values; - ValueList m_freq; + ValueList m_values; + ValueList m_freq; }; DECLARE_POINTER(RDOFUNSequenceByHistEnum); @@ -450,25 +448,25 @@ class RDOFUNSequenceEnumerative: public RDOFUNSequence { DECLARE_FACTORY(RDOFUNSequenceEnumerative); public: - void addValue(const LPRDOValue& pValue) - { - m_valueList.push_back(m_pHeader->getTypeInfo()->value_cast(pValue)); - } + void addValue(const LPRDOValue& pValue) + { + m_valueList.push_back(m_pHeader->getTypeInfo()->value_cast(pValue)); + } private: - RDOFUNSequenceEnumerative(const LPRDOFUNSequenceHeader& pHeader, const LPRDOValue& pValue) - : RDOFUNSequence(pHeader, 0) - { - addValue(pValue); - } - virtual ~RDOFUNSequenceEnumerative() - {} - - typedef std::vector ValueList; - ValueList m_valueList; - - virtual void createCalcs (); - virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& srcInfo) const; + RDOFUNSequenceEnumerative(const LPRDOFUNSequenceHeader& pHeader, const LPRDOValue& pValue) + : RDOFUNSequence(pHeader, 0) + { + addValue(pValue); + } + virtual ~RDOFUNSequenceEnumerative() + {} + + typedef std::vector ValueList; + ValueList m_valueList; + + virtual void createCalcs (); + virtual LPRDOFUNArithm createCallCalc(LPRDOFUNParams& pParamList, const RDOParserSrcInfo& srcInfo) const; }; DECLARE_POINTER(RDOFUNSequenceEnumerative); @@ -481,18 +479,18 @@ DECLARE_POINTER(RDOFUNSequenceEnumerative); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOFUNFunctionListElement); class RDOFUNFunctionListElement - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOFUNFunctionListElement) public: - virtual rdo::runtime::LPRDOCalcIsEqual createIsEqualCalc(const LPTypeInfo& pRetType, const rdo::runtime::LPRDOCalcFuncParam& pFuncParam, const RDOParserSrcInfo& src_pos) const; - virtual rdo::runtime::LPRDOCalcConst createResultCalc (const LPTypeInfo& pRetType, const RDOParserSrcInfo& src_pos) const = 0; - virtual bool isEquivalence() const { return false; } + virtual rdo::runtime::LPRDOCalcIsEqual createIsEqualCalc(const LPTypeInfo& pRetType, const rdo::runtime::LPRDOCalcFuncParam& pFuncParam, const RDOParserSrcInfo& src_pos) const; + virtual rdo::runtime::LPRDOCalcConst createResultCalc (const LPTypeInfo& pRetType, const RDOParserSrcInfo& src_pos) const = 0; + virtual bool isEquivalence() const { return false; } protected: - RDOFUNFunctionListElement(const RDOParserSrcInfo& srcInfo); - virtual ~RDOFUNFunctionListElement(); + RDOFUNFunctionListElement(const RDOParserSrcInfo& srcInfo); + virtual ~RDOFUNFunctionListElement(); }; // -------------------------------------------------------------------------------- @@ -502,9 +500,9 @@ class RDOFUNFunctionListElementIdentif: public RDOFUNFunctionListElement { DECLARE_FACTORY(RDOFUNFunctionListElementIdentif) private: - RDOFUNFunctionListElementIdentif(const RDOParserSrcInfo& srcInfo); + RDOFUNFunctionListElementIdentif(const RDOParserSrcInfo& srcInfo); - virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPTypeInfo& pRetType, const RDOParserSrcInfo& src_pos) const; + virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPTypeInfo& pRetType, const RDOParserSrcInfo& src_pos) const; }; DECLARE_POINTER(RDOFUNFunctionListElementIdentif); @@ -515,13 +513,13 @@ class RDOFUNFunctionListElementReal: public RDOFUNFunctionListElement { DECLARE_FACTORY(RDOFUNFunctionListElementReal) public: - double getValue() const { return m_value; } + double getValue() const { return m_value; } private: - RDOFUNFunctionListElementReal(const YYLTYPE& position, double value); - virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPTypeInfo& pRetType, const RDOParserSrcInfo& src_pos) const; + RDOFUNFunctionListElementReal(const YYLTYPE& position, double value); + virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPTypeInfo& pRetType, const RDOParserSrcInfo& src_pos) const; - double m_value; + double m_value; }; DECLARE_POINTER(RDOFUNFunctionListElementReal); @@ -532,13 +530,13 @@ class RDOFUNFunctionListElementInt: public RDOFUNFunctionListElement { DECLARE_FACTORY(RDOFUNFunctionListElementInt) public: - int getValue() const { return m_value; } + int getValue() const { return m_value; } private: - RDOFUNFunctionListElementInt(const YYLTYPE& position, int value); - virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPTypeInfo& pRetType, const RDOParserSrcInfo& src_pos) const; + RDOFUNFunctionListElementInt(const YYLTYPE& position, int value); + virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPTypeInfo& pRetType, const RDOParserSrcInfo& src_pos) const; - int m_value; + int m_value; }; DECLARE_POINTER(RDOFUNFunctionListElementInt); @@ -549,10 +547,10 @@ class RDOFUNFunctionListElementEq: public RDOFUNFunctionListElement { DECLARE_FACTORY(RDOFUNFunctionListElementEq) private: - RDOFUNFunctionListElementEq(const YYLTYPE& position); + RDOFUNFunctionListElementEq(const YYLTYPE& position); - virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPTypeInfo& pRetType, const RDOParserSrcInfo& src_pos) const; - virtual bool isEquivalence() const { return true; } + virtual rdo::runtime::LPRDOCalcConst createResultCalc(const LPTypeInfo& pRetType, const RDOParserSrcInfo& src_pos) const; + virtual bool isEquivalence() const { return true; } }; DECLARE_POINTER(RDOFUNFunctionListElementEq); @@ -561,20 +559,20 @@ DECLARE_POINTER(RDOFUNFunctionListElementEq); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOFUNCalculateIf); class RDOFUNCalculateIf - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOFUNCalculateIf) public: - LPRDOFUNLogic& getCondition() { return m_pCondition; } - LPRDOFUNArithm& getAction() { return m_pAction; } + LPRDOFUNLogic& getCondition() { return m_pCondition; } + LPRDOFUNArithm& getAction() { return m_pAction; } private: - RDOFUNCalculateIf(const LPRDOFUNLogic& pCondition, const LPRDOFUNArithm& pAction); - virtual ~RDOFUNCalculateIf(); + RDOFUNCalculateIf(const LPRDOFUNLogic& pCondition, const LPRDOFUNArithm& pAction); + virtual ~RDOFUNCalculateIf(); - LPRDOFUNLogic m_pCondition; - LPRDOFUNArithm m_pAction; + LPRDOFUNLogic m_pCondition; + LPRDOFUNArithm m_pAction; }; // -------------------------------------------------------------------------------- @@ -584,34 +582,34 @@ class RDOFUNFunction: public Function { DECLARE_FACTORY(RDOFUNFunction) public: - const std::string& name() const; + const std::string& name() const; - void add(const LPRDOFUNFunctionListElement& pListElement); - void add(const LPRDOFUNCalculateIf& pCalculateIf); + void add(const LPRDOFUNFunctionListElement& pListElement); + void add(const LPRDOFUNCalculateIf& pCalculateIf); - void createListCalc(); - void createTableCalc(const YYLTYPE& elements_pos); - const LPRDOParam& getReturn() const; - void end(); + void createListCalc(); + void createTableCalc(const YYLTYPE& elements_pos); + const LPRDOParam& getReturn() const; + void end(); - rdo::runtime::LPRDOCalc getFunctionCalc() const; - void setFunctionCalc(const rdo::runtime::LPRDOCalc& pCalc); + rdo::runtime::LPRDOCalc getFunctionCalc() const; + void setFunctionCalc(const rdo::runtime::LPRDOCalc& pCalc); private: - RDOFUNFunction(const RDOParserSrcInfo& srcInfo, const LPRDOParam& pReturn); - RDOFUNFunction(const std::string& name, const LPRDOParam& pReturn); - virtual ~RDOFUNFunction(); + RDOFUNFunction(const RDOParserSrcInfo& srcInfo, const LPRDOParam& pReturn); + RDOFUNFunction(const std::string& name, const LPRDOParam& pReturn); + virtual ~RDOFUNFunction(); - typedef std::vector ElementList; - typedef std::vector CalculateIfList; + typedef std::vector ElementList; + typedef std::vector CalculateIfList; - LPRDOParam m_pReturn; - ElementList m_elementList; //! for list and table - CalculateIfList m_calculateIfList; //! for algorithmic - rdo::runtime::LPRDOCalc m_pFunctionCalc; - LPContextMemory m_pContextMemory; + LPRDOParam m_pReturn; + ElementList m_elementList; // for list and table + CalculateIfList m_calculateIfList; // for algorithmic + rdo::runtime::LPRDOCalc m_pFunctionCalc; + LPContextMemory m_pContextMemory; - void init(); + void init(); }; DECLARE_POINTER(RDOFUNFunction); @@ -621,26 +619,26 @@ DECLARE_POINTER(RDOFUNFunction); // -------------------- RDOFUNGroup // -------------------------------------------------------------------------------- class RDOFUNGroup - : public RDOParserSrcInfo - , public Context - , public IContextFind + : public RDOParserSrcInfo + , public Context + , public IContextFind { DECLARE_FACTORY(RDOFUNGroup); public: - const LPRDORTPResType& getResType()const { return m_pResType; } + const LPRDORTPResType& getResType()const { return m_pResType; } - void end(); + void end(); protected: - RDOFUNGroup(const RDOParserSrcInfo& res_info); - virtual ~RDOFUNGroup(); + RDOFUNGroup(const RDOParserSrcInfo& res_info); + virtual ~RDOFUNGroup(); - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; private: - void init(const RDOParserSrcInfo& res_info); + void init(const RDOParserSrcInfo& res_info); - LPRDORTPResType m_pResType; + LPRDORTPResType m_pResType; }; DECLARE_POINTER(RDOFUNGroup); @@ -648,29 +646,29 @@ DECLARE_POINTER(RDOFUNGroup); // -------------------- RDOFUNGroupLogic // -------------------------------------------------------------------------------- class RDOFUNGroupLogic - : public RDOFUNGroup - , public boost::noncopyable + : public RDOFUNGroup + , private boost::noncopyable { DECLARE_FACTORY(RDOFUNGroupLogic) public: - enum FunGroupType - { - fgt_unknow = 0, - fgt_exist = 1, - fgt_notexist = 2, - fgt_forall = 3, - fgt_notforall = 4, - fgt_empty = 5, - fgt_size = 6, - fgt_array = 7 - }; - - LPRDOFUNLogic createFunLogic(LPRDOFUNLogic& pCondition); + enum class Type + { + UNKNOW = 0, + EXIST = 1, + NOTEXIST = 2, + FORALL = 3, + NOTFORALL = 4, + EMPTY = 5, + SIZE = 6, + ARRAY = 7 + }; + + LPRDOFUNLogic createFunLogic(LPRDOFUNLogic& pCondition); private: - RDOFUNGroupLogic(FunGroupType funType, const RDOParserSrcInfo& res_info); + RDOFUNGroupLogic(Type type, const RDOParserSrcInfo& res_info); - const int m_funType; + const Type m_type; }; DECLARE_POINTER(RDOFUNGroupLogic); @@ -681,17 +679,15 @@ class RDOFUNSelect: public RDOFUNGroup { DECLARE_FACTORY(RDOFUNSelect) public: - void initSelect(LPRDOFUNLogic pCondition = NULL); + void initSelect(LPRDOFUNLogic pCondition = NULL); private: - RDOFUNSelect(const RDOParserSrcInfo& res_info); + RDOFUNSelect(const RDOParserSrcInfo& res_info); - rdo::runtime::LPRDOFunCalcSelect m_pCalcSelect; + rdo::runtime::LPRDOFunCalcSelect m_pCalcSelect; - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; DECLARE_POINTER(RDOFUNSelect); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOFUN_H_ diff --git a/simulator/compiler/parser/rdoparser.cpp b/simulator/compiler/parser/rdoparser.cpp index 67ce4bba8..509a96f5c 100644 --- a/simulator/compiler/parser/rdoparser.cpp +++ b/simulator/compiler/parser/rdoparser.cpp @@ -30,24 +30,24 @@ const std::string RDOParser::METHOD_TERMINATE_COUNTER = "terminate_counter()"; #define DECLARE_PARSER_OBJECT_CONTAINER_NONAME(NAME) \ void RDOParser::insert##NAME(LPRDO##NAME value) \ { \ - howIsIt(); \ - m_all##NAME.push_back(value); \ + howIsIt(); \ + m_all##NAME.push_back(value); \ } #define DECLARE_PARSER_OBJECT_CONTAINER(NAME) \ DECLARE_PARSER_OBJECT_CONTAINER_NONAME(NAME) \ const LPRDO##NAME RDOParser::find##NAME(const std::string& name) const \ { \ - NAME##List::const_iterator it = std::find_if(m_all##NAME.begin(), m_all##NAME.end(), compareName(name)); \ - return it != m_all##NAME.end() ? *it : LPRDO##NAME(NULL); \ + NAME##List::const_iterator it = std::find_if(m_all##NAME.begin(), m_all##NAME.end(), compareName(name)); \ + return it != m_all##NAME.end() ? *it : LPRDO##NAME(NULL); \ } \ bool RDOParser::remove##NAME(const LPRDO##NAME item) \ { \ - NAME##List::iterator it = std::find(m_all##NAME.begin(), m_all##NAME.end(), item); \ - if (it == m_all##NAME.end()) \ - return false; \ - m_all##NAME.erase(it); \ - return true; \ + NAME##List::iterator it = std::find(m_all##NAME.begin(), m_all##NAME.end(), item); \ + if (it == m_all##NAME.end()) \ + return false; \ + m_all##NAME.erase(it); \ + return true; \ } DECLARE_PARSER_OBJECT_CONTAINER(PATPattern ); @@ -68,67 +68,67 @@ DECLARE_PARSER_OBJECT_CONTAINER(PROCProcess ); DECLARE_PARSER_OBJECT_CONTAINER_NONAME(FUNGroup); -rdo::model::FileType RDOParser::getFileToParse() +rdo::FileType RDOParser::getFileToParse() { - return !s_parserStack.empty() && s_parserStack.back()->m_parser_item ? s_parserStack.back()->m_parser_item->m_type : rdo::model::PAT; + return !s_parserStack.empty() && s_parserStack.back()->m_parser_item ? s_parserStack.back()->m_parser_item->m_type : rdo::FileType::PAT; } std::size_t RDOParser::lexer_loc_line() { - return !s_parserStack.empty() && s_parserStack.back()->m_parser_item ? s_parserStack.back()->m_parser_item->lexer_loc_line() : ~0; + return !s_parserStack.empty() && s_parserStack.back()->m_parser_item ? s_parserStack.back()->m_parser_item->lexer_loc_line() : ~0; } std::size_t RDOParser::lexer_loc_pos() { - return !s_parserStack.empty() && s_parserStack.back()->m_parser_item ? s_parserStack.back()->m_parser_item->lexer_loc_pos() : 0; + return !s_parserStack.empty() && s_parserStack.back()->m_parser_item ? s_parserStack.back()->m_parser_item->lexer_loc_pos() : 0; } std::string RDOParser::lexer_text() { - LPRDOParserRDOItem pParserItem = !s_parserStack.empty() - ? s_parserStack.back()->m_parser_item.object_dynamic_cast() - : LPRDOParserRDOItem(); + LPRDOParserRDOItem pParserItem = !s_parserStack.empty() + ? s_parserStack.back()->m_parser_item.object_dynamic_cast() + : LPRDOParserRDOItem(); - return pParserItem - ? pParserItem->text() - : std::string(); + return pParserItem + ? pParserItem->text() + : std::string(); } LPRDOParser RDOParser::s_parser() { - return !s_parserStack.empty() ? s_parserStack.back() : LPRDOParser(NULL); + return !s_parserStack.empty() ? s_parserStack.back() : LPRDOParser(NULL); } RDOParser::RDOParser() - : m_pattern (false) - , m_parser_item(NULL ) + : m_pattern (false) + , m_parser_item(NULL ) { - m_compilers.push_back(rdo::Factory ::create()); - m_compilers.push_back(rdo::Factory::create(rdo::model::SMR, evn_preparse_parse, evn_preparse_lex)); - - m_compilers.push_back(rdo::Factory::create(rdo::model::RTP, evn_preparse_parse, evn_preparse_lex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::RTP, evnparse, evnlex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::RSS, evn_preparse_parse, evn_preparse_lex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::RSS, evnparse, evnlex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::PRC, evn_preparse_parse, evn_preparse_lex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::PRC, evnparse, evnlex)); + m_compilers.push_back(rdo::Factory ::create()); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::SMR, evn_preparse_parse, evn_preparse_lex)); + + m_compilers.push_back(rdo::Factory::create(rdo::FileType::RTP, evn_preparse_parse, evn_preparse_lex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::RTP, evnparse, evnlex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::RSS, evn_preparse_parse, evn_preparse_lex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::RSS, evnparse, evnlex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::PRC, evn_preparse_parse, evn_preparse_lex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::PRC, evnparse, evnlex)); #ifdef CORBA_ENABLE - m_compilers.push_back(rdo::Factory::create()); - m_compilers.push_back(rdo::Factory::create()); + m_compilers.push_back(rdo::Factory::create()); + m_compilers.push_back(rdo::Factory::create()); #endif - m_compilers.push_back(rdo::Factory::create(rdo::model::FUN, evn_preparse_parse, evn_preparse_lex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::FUN, evnparse, evnlex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::EVN, evn_preparse_parse, evn_preparse_lex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::EVN, evnparse, evnlex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::PAT, evn_preparse_parse, evn_preparse_lex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::PAT, evnparse, evnlex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::DPT, evn_preparse_parse, evn_preparse_lex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::DPT, evnparse, evnlex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::FRM, evn_preparse_parse, evn_preparse_lex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::FRM, evnparse, evnlex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::PMD, evn_preparse_parse, evn_preparse_lex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::PMD, evnparse, evnlex)); - m_compilers.push_back(rdo::Factory::create(rdo::model::SMR, evnparse, evnlex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::FUN, evn_preparse_parse, evn_preparse_lex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::FUN, evnparse, evnlex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::EVN, evn_preparse_parse, evn_preparse_lex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::EVN, evnparse, evnlex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::PAT, evn_preparse_parse, evn_preparse_lex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::PAT, evnparse, evnlex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::DPT, evn_preparse_parse, evn_preparse_lex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::DPT, evnparse, evnlex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::FRM, evn_preparse_parse, evn_preparse_lex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::FRM, evnparse, evnlex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::PMD, evn_preparse_parse, evn_preparse_lex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::PMD, evnparse, evnlex)); + m_compilers.push_back(rdo::Factory::create(rdo::FileType::SMR, evnparse, evnlex)); } RDOParser::~RDOParser() @@ -136,71 +136,71 @@ RDOParser::~RDOParser() void RDOParser::init() { - s_parserStack.push_back(this); + s_parserStack.push_back(this); - m_pRuntime = rdo::Factory::create(new rdo::runtime::Error()); - ASSERT(m_pRuntime); - m_pRuntime->memory_insert(sizeof(RDOParser)); - m_pRuntime->init(); + m_pRuntime = rdo::Factory::create(new rdo::runtime::Error()); + ASSERT(m_pRuntime); + m_pRuntime->memory_insert(sizeof(RDOParser)); + m_pRuntime->init(); - m_pContextStack = rdo::Factory::create(); - ASSERT(m_pContextStack); + m_pContextStack = rdo::Factory::create(); + ASSERT(m_pContextStack); - m_pContextStack->push(this); + m_pContextStack->push(this); - LPRDOSMR pSMR = rdo::Factory::create(); - ASSERT(pSMR); - setSMR(pSMR); + LPRDOSMR pSMR = rdo::Factory::create(); + ASSERT(pSMR); + setSMR(pSMR); - m_resultGeneratorID.get(); //! Для PMD нумерация с 1 + m_resultGeneratorID.get(); // Для PMD нумерация с 1 } void RDOParser::deinit() { - while (!m_pContextStack->top().object_dynamic_cast()) - { - m_pContextStack->pop_not_safed(); - } - m_pContextStack->pop(); - - m_allPATPattern .clear(); - m_allRTPResType .clear(); - m_allRSSResource.clear(); - m_allFRMFrame .clear(); - m_allFRMSprite .clear(); - m_allFRMCommandList.clear(); - m_allFUNConstant.clear(); - m_allFUNFunction.clear(); - m_allFUNSequence.clear(); - m_allDPTSearch .clear(); - m_allDPTSome .clear(); - m_allDPTPrior .clear(); - m_allDPTActivity.clear(); - m_allResultGroup.clear(); - m_allPROCProcess.clear(); - m_allFUNGroup .clear(); - - m_parser_item = NULL; - m_pSMR = NULL; - m_pContextStack = NULL; - - m_preCastTypeList .clear(); - m_movementObjectList.clear(); - - m_pRuntime->deinit(); - m_pRuntime = NULL; - - s_parserStack.remove(this); + while (!m_pContextStack->top().object_dynamic_cast()) + { + m_pContextStack->pop_not_safed(); + } + m_pContextStack->pop(); + + m_allPATPattern .clear(); + m_allRTPResType .clear(); + m_allRSSResource.clear(); + m_allFRMFrame .clear(); + m_allFRMSprite .clear(); + m_allFRMCommandList.clear(); + m_allFUNConstant.clear(); + m_allFUNFunction.clear(); + m_allFUNSequence.clear(); + m_allDPTSearch .clear(); + m_allDPTSome .clear(); + m_allDPTPrior .clear(); + m_allDPTActivity.clear(); + m_allResultGroup.clear(); + m_allPROCProcess.clear(); + m_allFUNGroup .clear(); + + m_parser_item = NULL; + m_pSMR = NULL; + m_pContextStack = NULL; + + m_preCastTypeList .clear(); + m_movementObjectList.clear(); + + m_pRuntime->deinit(); + m_pRuntime = NULL; + + s_parserStack.remove(this); } LPContextStack RDOParser::contextStack() { - return m_pContextStack; + return m_pContextStack; } LPContext RDOParser::context() const { - return m_pContextStack->top(); + return m_pContextStack->top(); } namespace @@ -208,428 +208,428 @@ namespace LPExpression contextTimeNow(const RDOParserSrcInfo& srcInfo) { - return rdo::Factory::create( - rdo::Factory::delegate(srcInfo), - rdo::Factory::create(), - srcInfo - ); + return rdo::Factory::create( + rdo::Factory::delegate(srcInfo), + rdo::Factory::create(), + srcInfo + ); } LPExpression contextSeconds(const RDOParserSrcInfo& srcInfo) { - return rdo::Factory::create( - rdo::Factory::delegate(srcInfo), - rdo::Factory::create(), - srcInfo - ); + return rdo::Factory::create( + rdo::Factory::delegate(srcInfo), + rdo::Factory::create(), + srcInfo + ); } LPExpression contextTerminateCounter(const RDOParserSrcInfo& srcInfo) { - return rdo::Factory::create( - rdo::Factory::delegate(srcInfo), - rdo::Factory::create(), - srcInfo - ); + return rdo::Factory::create( + rdo::Factory::delegate(srcInfo), + rdo::Factory::create(), + srcInfo + ); } } Context::LPFindResult RDOParser::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const { - const std::string identifier = params.identifier(); - - if (method == Context::METHOD_GET) - { - if (identifier == "Time_now" || identifier == "time_now" || identifier == "Системное_время" || identifier == "системное_время") - { - return rdo::Factory::create(CreateExpression(boost::bind(&contextTimeNow, srcInfo))); - } - else if (identifier == "Seconds" || identifier == "seconds") - { - return rdo::Factory::create(CreateExpression(boost::bind(&contextSeconds, srcInfo))); - } - else if (identifier == "Terminate_counter" || identifier == "terminate_counter") - { - return rdo::Factory::create(CreateExpression(boost::bind(&contextTerminateCounter, srcInfo))); - } - } - - if (method == Context::METHOD_OPERATOR_DOT) - { - LPRDOParser pThis(const_cast(this)); - if (identifier == "Time_now" || identifier == "time_now" - || identifier == "Системное_время" || identifier == "системное_время" - || identifier == "Seconds" || identifier == "seconds" - || identifier == "Terminate_counter" || identifier == "terminate_counter") - { - return rdo::Factory::create(SwitchContext(pThis, params)); - } - } - - if (method == Context::METHOD_TYPE_OF) - { - LPRDORTPResType pResType = findRTPResType(identifier); - if (pResType) - { - return pResType->find(method, params, srcInfo); - } - } - - if (method == Context::METHOD_OPERATOR_DOT) - { - LPRDORTPResType pResType = findRTPResType(identifier); - if (pResType) - { - return rdo::Factory::create(SwitchContext(pResType, params)); - } - - LPRDORSSResource pResource = findRSSResource(identifier); - if (pResource) - { - return rdo::Factory::create(SwitchContext(pResource, params)); - } - - LPRDOPATPattern pPattern = findPATPattern(identifier); - if (pPattern) - { - return rdo::Factory::create(SwitchContext(pPattern, params)); - } - - LPRDOPROCProcess pProcess = findPROCProcess(identifier); - if (pProcess) - { - return rdo::Factory::create(SwitchContext(pProcess, params)); - } - - LPRDOResultGroup pResultGroup = findResultGroup(identifier); - if (pResultGroup) - { - return rdo::Factory::create(SwitchContext(pResultGroup, params)); - } - - LPRDOFUNConstant pConstant = findFUNConstant(identifier); - if (pConstant) - { - return rdo::Factory::create(SwitchContext(pConstant, params)); - } - - LPRDOFUNSequence pSequence = findFUNSequence(identifier); - if (pSequence) - { - return rdo::Factory::create(SwitchContext(pSequence, params)); - } - - //! Возможно, что это значение перечислимого типа, только одно и тоже значение может встречаться в разных - //! перечислимых типах, поэтому какой именно из них выбрать - вопрос - { - ErrorBlockMonicker errorBlockMonicker; - for (const LPTypeInfo& type: m_preCastTypeList) - { - LPRDOEnumType enumType = type->itype().object_dynamic_cast(); - ASSERT(enumType); - - std::size_t index = enumType->findEnum(identifier); - if (index != rdo::runtime::RDOEnumType::END) - { - return rdo::Factory::create(SwitchContext(enumType, params)); - } - } - } - - } - - return rdo::Factory::create(); + const std::string identifier = params.identifier(); + + if (method == Context::METHOD_GET) + { + if (identifier == "Time_now" || identifier == "time_now" || identifier == "Системное_время" || identifier == "системное_время") + { + return rdo::Factory::create(CreateExpression(boost::bind(&contextTimeNow, srcInfo))); + } + else if (identifier == "Seconds" || identifier == "seconds") + { + return rdo::Factory::create(CreateExpression(boost::bind(&contextSeconds, srcInfo))); + } + else if (identifier == "Terminate_counter" || identifier == "terminate_counter") + { + return rdo::Factory::create(CreateExpression(boost::bind(&contextTerminateCounter, srcInfo))); + } + } + + if (method == Context::METHOD_OPERATOR_DOT) + { + LPRDOParser pThis(const_cast(this)); + if (identifier == "Time_now" || identifier == "time_now" + || identifier == "Системное_время" || identifier == "системное_время" + || identifier == "Seconds" || identifier == "seconds" + || identifier == "Terminate_counter" || identifier == "terminate_counter") + { + return rdo::Factory::create(SwitchContext(pThis, params)); + } + } + + if (method == Context::METHOD_TYPE_OF) + { + LPRDORTPResType pResType = findRTPResType(identifier); + if (pResType) + { + return pResType->find(method, params, srcInfo); + } + } + + if (method == Context::METHOD_OPERATOR_DOT) + { + LPRDORTPResType pResType = findRTPResType(identifier); + if (pResType) + { + return rdo::Factory::create(SwitchContext(pResType, params)); + } + + LPRDORSSResource pResource = findRSSResource(identifier); + if (pResource) + { + return rdo::Factory::create(SwitchContext(pResource, params)); + } + + LPRDOPATPattern pPattern = findPATPattern(identifier); + if (pPattern) + { + return rdo::Factory::create(SwitchContext(pPattern, params)); + } + + LPRDOPROCProcess pProcess = findPROCProcess(identifier); + if (pProcess) + { + return rdo::Factory::create(SwitchContext(pProcess, params)); + } + + LPRDOResultGroup pResultGroup = findResultGroup(identifier); + if (pResultGroup) + { + return rdo::Factory::create(SwitchContext(pResultGroup, params)); + } + + LPRDOFUNConstant pConstant = findFUNConstant(identifier); + if (pConstant) + { + return rdo::Factory::create(SwitchContext(pConstant, params)); + } + + LPRDOFUNSequence pSequence = findFUNSequence(identifier); + if (pSequence) + { + return rdo::Factory::create(SwitchContext(pSequence, params)); + } + + // Возможно, что это значение перечислимого типа, только одно и тоже значение может встречаться в разных + // перечислимых типах, поэтому какой именно из них выбрать - вопрос + { + ErrorBlockMonicker errorBlockMonicker; + for (const LPTypeInfo& type: m_preCastTypeList) + { + LPRDOEnumType enumType = type->itype().object_dynamic_cast(); + ASSERT(enumType); + + std::size_t index = enumType->findEnum(identifier); + if (index != rdo::runtime::RDOEnumType::END) + { + return rdo::Factory::create(SwitchContext(enumType, params)); + } + } + } + + } + + return rdo::Factory::create(); } bool RDOParser::isCurrentDPTSearch() { - return getLastDPTSearch() && !getLastDPTSearch()->closed() ? true : false; + return getLastDPTSearch() && !getLastDPTSearch()->closed() ? true : false; } bool RDOParser::isCurrentDPTPrior() { - return getLastDPTPrior() ? true : false; + return getLastDPTPrior() ? true : false; } void RDOParser::insertChanges(const std::string& name, const std::string& value) { - m_changes.push_back(Changes(name, value)); + m_changes.push_back(Changes(name, value)); } std::string RDOParser::getChanges() const { - std::stringstream stream; - stream << "$Changes" << std::endl; - std::size_t changes_max_length = 0; - for (const auto& change: m_changes) - { - if (change.m_name.length() > changes_max_length) - { - changes_max_length = change.m_name.length(); - } - } - for (const auto& change: m_changes) - { - stream << " " << change.m_name; - for (std::size_t i = change.m_name.length(); i < changes_max_length; i++) - { - stream << " "; - } - stream << " = " << change.m_value << std::endl; - } - return stream.str(); + std::stringstream stream; + stream << "$Changes" << std::endl; + std::size_t changes_max_length = 0; + for (const auto& change: m_changes) + { + if (change.m_name.length() > changes_max_length) + { + changes_max_length = change.m_name.length(); + } + } + for (const auto& change: m_changes) + { + stream << " " << change.m_name; + for (std::size_t i = change.m_name.length(); i < changes_max_length; i++) + { + stream << " "; + } + stream << " = " << change.m_value << std::endl; + } + return stream.str(); } std::string RDOParser::getModelStructure() { - std::stringstream modelStructure; - - // $Changes - modelStructure << getChanges(); - - // RTP - modelStructure << std::endl << std::endl << "$Resource_type" << std::endl; - for (const auto& rtp: m_allRTPResType) - { - rtp->writeModelStructure(modelStructure); - } - - // RSS - modelStructure << std::endl << "$Resources" << std::endl; - for (const auto& rss: m_allRSSResource) - { - rss->writeModelStructure(modelStructure); - } - - // PAT - modelStructure << std::endl << "$Pattern" << std::endl; - for (const auto& pat: m_allPATPattern) - { - pat->writeModelStructure(modelStructure); - } - - // OPR/DPT - std::size_t counter = 1; - modelStructure << std::endl << "$Activities" << std::endl; - modelStructure << m_pRuntime->writeActivitiesStructure(counter); - - // DPT only - for (std::size_t i = 0; i < m_allDPTSearch.size(); i++) - { - for (std::size_t j = 0; j < m_allDPTSearch.at(i)->getActivities().size(); j++) - { - LPRDODPTSearchActivity pSearchActivity = m_allDPTSearch.at(i)->getActivities().at(j); - ASSERT(pSearchActivity); - modelStructure << counter++ << " " << pSearchActivity->name() << " " << pSearchActivity->pattern()->getPatternId() << std::endl; - } - } - - // PMD - modelStructure << std::endl << "$Watching" << std::endl; - std::size_t watching_max_length = 0; - for (const auto& watching: m_pRuntime->getResult()) - { - LPITrace trace = watching.object_dynamic_cast(); - LPIName name = trace.object_dynamic_cast(); - LPIModelStructure structure = trace.object_dynamic_cast(); - if (trace && name && structure) - { - if (trace->traceable() && name->name().length() > watching_max_length) - { - watching_max_length = name->name().length(); - } - } - } - for (const auto& watching: m_pRuntime->getResult()) - { - LPITrace trace = watching.object_dynamic_cast(); - LPIName name = trace.object_dynamic_cast(); - LPIModelStructure structure = trace.object_dynamic_cast(); - if (trace && name && structure) - { - if (trace->traceable()) - { - modelStructure << " " << name->name(); - for (std::size_t i = name->name().length(); i < watching_max_length + 2; i++) - modelStructure << " "; - - structure->writeModelStructure(modelStructure); - } - } - } - - return modelStructure.str(); + std::stringstream modelStructure; + + // $Changes + modelStructure << getChanges(); + + // RTP + modelStructure << std::endl << std::endl << "$Resource_type" << std::endl; + for (const auto& rtp: m_allRTPResType) + { + rtp->writeModelStructure(modelStructure); + } + + // RSS + modelStructure << std::endl << "$Resources" << std::endl; + for (const auto& rss: m_allRSSResource) + { + rss->writeModelStructure(modelStructure); + } + + // PAT + modelStructure << std::endl << "$Pattern" << std::endl; + for (const auto& pat: m_allPATPattern) + { + pat->writeModelStructure(modelStructure); + } + + // OPR/DPT + std::size_t counter = 1; + modelStructure << std::endl << "$Activities" << std::endl; + modelStructure << m_pRuntime->writeActivitiesStructure(counter); + + // DPT only + for (std::size_t i = 0; i < m_allDPTSearch.size(); i++) + { + for (std::size_t j = 0; j < m_allDPTSearch.at(i)->getActivities().size(); j++) + { + LPRDODPTSearchActivity pSearchActivity = m_allDPTSearch.at(i)->getActivities().at(j); + ASSERT(pSearchActivity); + modelStructure << counter++ << " " << pSearchActivity->name() << " " << pSearchActivity->pattern()->getPatternId() << std::endl; + } + } + + // PMD + modelStructure << std::endl << "$Watching" << std::endl; + std::size_t watching_max_length = 0; + for (const auto& watching: m_pRuntime->getResult()) + { + LPITrace trace = watching.object_dynamic_cast(); + LPIName name = trace.object_dynamic_cast(); + LPIModelStructure structure = trace.object_dynamic_cast(); + if (trace && name && structure) + { + if (trace->traceable() && name->name().length() > watching_max_length) + { + watching_max_length = name->name().length(); + } + } + } + for (const auto& watching: m_pRuntime->getResult()) + { + LPITrace trace = watching.object_dynamic_cast(); + LPIName name = trace.object_dynamic_cast(); + LPIModelStructure structure = trace.object_dynamic_cast(); + if (trace && name && structure) + { + if (trace->traceable()) + { + modelStructure << " " << name->name(); + for (std::size_t i = name->name().length(); i < watching_max_length + 2; i++) + modelStructure << " "; + + structure->writeModelStructure(modelStructure); + } + } + } + + return modelStructure.str(); } void RDOParser::parse() { - for (const LPRDOParserItem& compiler: m_compilers) - { - m_parser_item = compiler; - m_parser_item->parse(this); - m_parser_item = NULL; - } - runRTPPost(); + for (const LPRDOParserItem& compiler: m_compilers) + { + m_parser_item = compiler; + m_parser_item->parse(this); + m_parser_item = NULL; + } + runRTPPost(); } void RDOParser::parse(std::istream& stream) { - for (const LPRDOParserItem& compiler: m_compilers) - { - m_parser_item = compiler; - m_parser_item->parse(this, stream); - m_parser_item = NULL; - } + for (const LPRDOParserItem& compiler: m_compilers) + { + m_parser_item = compiler; + m_parser_item->parse(this, stream); + m_parser_item = NULL; + } } void RDOParser::beforeRun() { - runRSSPost(); - runSMRPost(); + runRSSPost(); + runSMRPost(); } void RDOParser::runRSSPost() { - //! В режиме совместимости со старым РДО создаем ресурсы по номерам их типов, а не по номерам самих ресурсов из RSS + // В режиме совместимости со старым РДО создаем ресурсы по номерам их типов, а не по номерам самих ресурсов из RSS #ifdef RDOSIM_COMPATIBLE - for (const auto& rtp: getRTPResTypes()) - { + for (const auto& rtp: getRTPResTypes()) + { #endif - for (const auto& rss: getRSSResources()) - { + for (const auto& rss: getRSSResources()) + { #ifdef RDOSIM_COMPATIBLE - if (rss->getType() == rtp) - { + if (rss->getType() == rtp) + { #endif - if (!rss->getIsNested()) - { - const std::vector calcList = rss->createCalcList(); - for (const rdo::runtime::LPRDOCalc& calc: calcList) - { - runtime()->addInitCalc(calc); - } - } + if (!rss->getIsNested()) + { + const std::vector calcList = rss->createCalcList(); + for (const rdo::runtime::LPRDOCalc& calc: calcList) + { + runtime()->addInitCalc(calc); + } + } #ifdef RDOSIM_COMPATIBLE - } + } #endif - } + } #ifdef RDOSIM_COMPATIBLE - } + } #endif } void RDOParser::runSMRPost() { - //! Калки, созданные в SMR - for (const auto& calc: m_pSMR->getCalcList()) - runtime()->addInitCalc(calc); - //! Планирование событий, описанных в SMR - for (const LPRDOPATPattern& pattern: getPATPatterns()) - { - LPRDOPatternEvent event = pattern.object_dynamic_cast(); - if (!event) - continue; - - rdo::runtime::LPRDOCalc initCalc = event->getBeforeStartModelPlaning(); - if (initCalc) - { - runtime()->addInitCalc(initCalc); - } - } + // Калки, созданные в SMR + for (const auto& calc: m_pSMR->getCalcList()) + runtime()->addInitCalc(calc); + // Планирование событий, описанных в SMR + for (const LPRDOPATPattern& pattern: getPATPatterns()) + { + LPRDOPatternEvent event = pattern.object_dynamic_cast(); + if (!event) + continue; + + rdo::runtime::LPRDOCalc initCalc = event->getBeforeStartModelPlaning(); + if (initCalc) + { + runtime()->addInitCalc(initCalc); + } + } } void RDOParser::runRTPPost() { - for (const LPRDORTPResType& type: getRTPResTypes()) - { - type->setupRuntimeFactory(); - } + for (const LPRDORTPResType& type: getRTPResTypes()) + { + type->setupRuntimeFactory(); + } } void RDOParser::checkFunctionName(const RDOParserSrcInfo& src_info) { - LPRDOFUNConstant pConstant = findFUNConstant(src_info.src_text()); - if (pConstant) - { - error().push_only(src_info, rdo::format("Константа '%s' уже существует", src_info.src_text().c_str())); -// parser->error("Second appearance of the same constant name: " + *(_cons->getName())); - error().push_only(pConstant->src_info(), "См. первое определение"); - error().push_done(); - } - LPRDOFUNSequence pSequence = findFUNSequence(src_info.src_text()); - if (pSequence) - { - error().push_only(src_info, rdo::format("Последовательность '%s' уже существует", src_info.src_text().c_str())); - error().push_only(pSequence->src_info(), "См. первое определение"); - error().push_done(); - } - LPRDOFUNFunction pFunction = findFUNFunction(src_info.src_text()); - if (pFunction) - { - error().push_only(src_info, rdo::format("Функция '%s' уже существует", src_info.src_text().c_str())); - error().push_only(pFunction->src_info(), "См. первое определение"); - error().push_done(); - } + LPRDOFUNConstant pConstant = findFUNConstant(src_info.src_text()); + if (pConstant) + { + error().push_only(src_info, rdo::format("Константа '%s' уже существует", src_info.src_text().c_str())); +// parser->error("Second appearance of the same constant name: " + *(_cons->getName())); + error().push_only(pConstant->src_info(), "См. первое определение"); + error().push_done(); + } + LPRDOFUNSequence pSequence = findFUNSequence(src_info.src_text()); + if (pSequence) + { + error().push_only(src_info, rdo::format("Последовательность '%s' уже существует", src_info.src_text().c_str())); + error().push_only(pSequence->src_info(), "См. первое определение"); + error().push_done(); + } + LPRDOFUNFunction pFunction = findFUNFunction(src_info.src_text()); + if (pFunction) + { + error().push_only(src_info, rdo::format("Функция '%s' уже существует", src_info.src_text().c_str())); + error().push_only(pFunction->src_info(), "См. первое определение"); + error().push_done(); + } } void RDOParser::checkActivityName(const RDOParserSrcInfo& src_info) { - for (const auto& search: getDPTSearchs()) - { - RDODPTSearch::ActivityList::const_iterator it_search_act = std::find_if(search->getActivities().begin(), search->getActivities().end(), compareName(src_info.src_text())); - if (it_search_act != search->getActivities().end()) - { - error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); - error().push_only((*it_search_act)->src_info(), "См. первое определение"); - error().push_done(); -// error("Activity name: " + *_name + " already defined"); - } - } - for (const auto& some: getDPTSomes()) - { - RDODPTSome::ActivityList::const_iterator it_some_act = std::find_if(some->getActivities().begin(), some->getActivities().end(), compareName(src_info.src_text())); - if (it_some_act != some->getActivities().end()) - { - error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); - error().push_only((*it_some_act)->src_info(), "См. первое определение"); - error().push_done(); - } - } - for (const auto& prior: getDPTPriors()) - { - RDODPTPrior::ActivityList::const_iterator it_prior_act = std::find_if(prior->getActivities().begin(), prior->getActivities().end(), compareName(src_info.src_text())); - if (it_prior_act != prior->getActivities().end()) - { - error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); - error().push_only((*it_prior_act)->src_info(), "См. первое определение"); - error().push_done(); - } - } + for (const auto& search: getDPTSearchs()) + { + RDODPTSearch::ActivityList::const_iterator it_search_act = std::find_if(search->getActivities().begin(), search->getActivities().end(), compareName(src_info.src_text())); + if (it_search_act != search->getActivities().end()) + { + error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); + error().push_only((*it_search_act)->src_info(), "См. первое определение"); + error().push_done(); +// error("Activity name: " + *_name + " already defined"); + } + } + for (const auto& some: getDPTSomes()) + { + RDODPTSome::ActivityList::const_iterator it_some_act = std::find_if(some->getActivities().begin(), some->getActivities().end(), compareName(src_info.src_text())); + if (it_some_act != some->getActivities().end()) + { + error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); + error().push_only((*it_some_act)->src_info(), "См. первое определение"); + error().push_done(); + } + } + for (const auto& prior: getDPTPriors()) + { + RDODPTPrior::ActivityList::const_iterator it_prior_act = std::find_if(prior->getActivities().begin(), prior->getActivities().end(), compareName(src_info.src_text())); + if (it_prior_act != prior->getActivities().end()) + { + error().push_only(src_info, rdo::format("Активность '%s' уже существует", src_info.src_text().c_str())); + error().push_only((*it_prior_act)->src_info(), "См. первое определение"); + error().push_done(); + } + } } void RDOParser::checkDPTName(const RDOParserSrcInfo& src_info) { - if (src_info.src_text().empty()) - { - // Актуально для операций и свободных блоков активностей - return; - } - DPTSearchList::const_iterator search_it = std::find_if(getDPTSearchs().begin(), getDPTSearchs().end(), compareName(src_info.src_text())); - if (search_it != getDPTSearchs().end()) - { - error().push_only(src_info, rdo::format("Точка '%s' уже существует", src_info.src_text().c_str())); - error().push_only((*search_it)->src_info(), "См. первое определение"); - error().push_done(); -// error(src_info, "DPT name: " + src_info.src_text() + " already defined"); - } - DPTSomeList::const_iterator some_it = std::find_if(getDPTSomes().begin(), getDPTSomes().end(), compareName(src_info.src_text())); - if (some_it != getDPTSomes().end()) - { - error().push_only(src_info, rdo::format("Точка '%s' уже существует", src_info.src_text().c_str())); - error().push_only((*some_it)->src_info(), "См. первое определение"); - error().push_done(); - } + if (src_info.src_text().empty()) + { + // Актуально для операций и свободных блоков активностей + return; + } + DPTSearchList::const_iterator search_it = std::find_if(getDPTSearchs().begin(), getDPTSearchs().end(), compareName(src_info.src_text())); + if (search_it != getDPTSearchs().end()) + { + error().push_only(src_info, rdo::format("Точка '%s' уже существует", src_info.src_text().c_str())); + error().push_only((*search_it)->src_info(), "См. первое определение"); + error().push_done(); +// error(src_info, "DPT name: " + src_info.src_text() + " already defined"); + } + DPTSomeList::const_iterator some_it = std::find_if(getDPTSomes().begin(), getDPTSomes().end(), compareName(src_info.src_text())); + if (some_it != getDPTSomes().end()) + { + error().push_only(src_info, rdo::format("Точка '%s' уже существует", src_info.src_text().c_str())); + error().push_only((*some_it)->src_info(), "См. первое определение"); + error().push_done(); + } } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdoparser.h b/simulator/compiler/parser/rdoparser.h index c205e2b2b..cd57db57f 100644 --- a/simulator/compiler/parser/rdoparser.h +++ b/simulator/compiler/parser/rdoparser.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_H_ -#define _RDOPARSER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -43,17 +42,17 @@ class RDORTPFuzzyParam; // -------------------------------------------------------------------------------- #define DEFINE_OBJECT_CONTAINER_MINIMUM(TYPE, NAME) \ public: \ - typedef std::vector NAME##List; \ - void insert##NAME (TYPE value); \ - TYPE getLast##NAME() { return !m_all##NAME.empty() ? m_all##NAME.back() : TYPE(NULL); } \ - const NAME##List& get##NAME##s () const { return m_all##NAME; } \ + typedef std::vector NAME##List; \ + void insert##NAME (TYPE value); \ + TYPE getLast##NAME() { return !m_all##NAME.empty() ? m_all##NAME.back() : TYPE(NULL); } \ + const NAME##List& get##NAME##s () const { return m_all##NAME; } \ private: \ - NAME##List m_all##NAME; + NAME##List m_all##NAME; #define DEFINE_OBJECT_CONTAINER_WITHNAME(TYPE, NAME) \ public: \ - const TYPE find##NAME (const std::string& name) const; \ - bool remove##NAME(const TYPE item); + const TYPE find##NAME (const std::string& name) const; \ + bool remove##NAME(const TYPE item); #define DEFINE_OBJECT_CONTAINER_NONAME(NAME) \ DEFINE_OBJECT_CONTAINER_MINIMUM(LPRDO##NAME, NAME) @@ -67,12 +66,12 @@ PREDECLARE_POINTER(RDOParser); template struct identity { - typedef T type; + typedef T type; }; class RDOParser - : public Context - , public IContextFind + : public Context + , public IContextFind { DECLARE_FACTORY(RDOParser); @@ -96,170 +95,168 @@ DEFINE_OBJECT_CONTAINER(PROCProcess ); DEFINE_OBJECT_CONTAINER_NONAME(FUNGroup); public: - virtual void init (); - virtual void deinit(); - - const rdo::runtime::LPRDORuntime& runtime() const { return m_pRuntime; } - - bool isPattern() const { return m_pattern; } - FUNGroupList& getFUNGroupStack() { return m_allFUNGroup; } - - void checkFunctionName (const RDOParserSrcInfo& src_info); - void checkActivityName (const RDOParserSrcInfo& src_info); - void checkDPTName (const RDOParserSrcInfo& src_info); - - void insertChanges (const std::string& name, const std::string& value); - - bool isCurrentDPTSearch(); - bool isCurrentDPTPrior(); - - std::size_t getRTP_id() const { return m_allRTPResType.size() + 1; } - std::size_t getRSS_id() const { return m_allRSSResource.size() + 0; } - std::size_t getPAT_id() const { return m_allPATPattern.size() + 0; } - std::size_t getPMD_id() { return m_resultGeneratorID.get(); } - std::size_t getFUNCONST_id() const { return m_allFUNConstant.size() + 0; } - - std::string getModelStructure(); - std::string getChanges() const; - - LPRDOSMR getSMR() const { return m_pSMR; } - void setSMR(const LPRDOSMR& pSMR) { m_pSMR = pSMR; } - bool hasSMR() const { return m_pSMR ? true : false; } - - void parse(); - void parse(std::istream& stream); - - void beforeRun(); - - const Error& error() const { return m_error; } - Error& error() { return m_error; } - - class Stack: private rdo::IndexedStack - { - friend class RDOParser; - public: - typedef rdo::IndexedStack IndexedStack; - - template - IndexedStack::ID push(const rdo::intrusive_ptr& pObject) - { - rdo::LPISmartPtrWrapper pWrapper = new rdo::smart_ptr_wrapper(pObject); - return IndexedStack::push(pWrapper); - } - template - rdo::intrusive_ptr pop(IndexedStack::ID id) - { - rdo::LPISmartPtrWrapper pWrapper = IndexedStack::pop(id); - ASSERT(pWrapper); - - // Падение в в этом месте означает, что из стека вытаскивается указатель неправильного типа - // Что бы узнать тип, необходимо найти команду push для этого указателя - ASSERT((pWrapper->getRefCounter() && dynamic_cast(pWrapper->getRefCounter())) || !pWrapper->getRefCounter()); - - rdo::intrusive_ptr pObject = *reinterpret_cast*>(pWrapper->getSmartPtr()); - pWrapper->destroy(); - return pObject; - } - - rdo::LPISmartPtrWrapper raw_pop(IndexedStack::ID id) - { - rdo::LPISmartPtrWrapper pWrapper = IndexedStack::pop(id); - ASSERT(pWrapper); - return pWrapper; - } - - private: - void clear() - { - for (const auto& stack: m_stack) - stack.second->destroy(); - } - }; - - Stack& stack() - { - return m_movementObjectList; - } - - typedef std::vector PreCastTypeList; - void insertPreCastType(const LPTypeInfo& pType) - { - m_preCastTypeList.push_back(pType); - } - - LPContextStack contextStack(); - LPContext context () const; - - static rdo::model::FileType getFileToParse(); - static std::size_t lexer_loc_line(); - static std::size_t lexer_loc_pos(); - static std::string lexer_text(); - static LPRDOParser s_parser(); - - template - void howIsIt() - { - howIsIt(identity()); - } - - static const std::string METHOD_TIME_NOW; - static const std::string METHOD_SECONDS; - static const std::string METHOD_TERMINATE_COUNTER; + virtual void init (); + virtual void deinit(); + + const rdo::runtime::LPRDORuntime& runtime() const { return m_pRuntime; } + + bool isPattern() const { return m_pattern; } + FUNGroupList& getFUNGroupStack() { return m_allFUNGroup; } + + void checkFunctionName (const RDOParserSrcInfo& src_info); + void checkActivityName (const RDOParserSrcInfo& src_info); + void checkDPTName (const RDOParserSrcInfo& src_info); + + void insertChanges (const std::string& name, const std::string& value); + + bool isCurrentDPTSearch(); + bool isCurrentDPTPrior(); + + std::size_t getRTP_id() const { return m_allRTPResType.size() + 1; } + std::size_t getRSS_id() const { return m_allRSSResource.size() + 0; } + std::size_t getPAT_id() const { return m_allPATPattern.size() + 0; } + std::size_t getPMD_id() { return m_resultGeneratorID.get(); } + std::size_t getFUNCONST_id() const { return m_allFUNConstant.size() + 0; } + + std::string getModelStructure(); + std::string getChanges() const; + + LPRDOSMR getSMR() const { return m_pSMR; } + void setSMR(const LPRDOSMR& pSMR) { m_pSMR = pSMR; } + bool hasSMR() const { return m_pSMR ? true : false; } + + void parse(); + void parse(std::istream& stream); + + void beforeRun(); + + const Error& error() const { return m_error; } + Error& error() { return m_error; } + + class Stack: private rdo::IndexedStack + { + friend class RDOParser; + public: + typedef rdo::IndexedStack IndexedStack; + + template + IndexedStack::ID push(const rdo::intrusive_ptr& pObject) + { + rdo::LPISmartPtrWrapper pWrapper = new rdo::smart_ptr_wrapper(pObject); + return IndexedStack::push(pWrapper); + } + template + rdo::intrusive_ptr pop(IndexedStack::ID id) + { + rdo::LPISmartPtrWrapper pWrapper = IndexedStack::pop(id); + ASSERT(pWrapper); + + // Падение в в этом месте означает, что из стека вытаскивается указатель неправильного типа + // Что бы узнать тип, необходимо найти команду push для этого указателя + ASSERT((pWrapper->getRefCounter() && dynamic_cast(pWrapper->getRefCounter())) || !pWrapper->getRefCounter()); + + rdo::intrusive_ptr pObject = *reinterpret_cast*>(pWrapper->getSmartPtr()); + pWrapper->destroy(); + return pObject; + } + + rdo::LPISmartPtrWrapper raw_pop(IndexedStack::ID id) + { + rdo::LPISmartPtrWrapper pWrapper = IndexedStack::pop(id); + ASSERT(pWrapper); + return pWrapper; + } + + private: + void clear() + { + for (const auto& stack: m_stack) + stack.second->destroy(); + } + }; + + Stack& stack() + { + return m_movementObjectList; + } + + typedef std::vector PreCastTypeList; + void insertPreCastType(const LPTypeInfo& pType) + { + m_preCastTypeList.push_back(pType); + } + + LPContextStack contextStack(); + LPContext context () const; + + static rdo::FileType getFileToParse(); + static std::size_t lexer_loc_line(); + static std::size_t lexer_loc_pos(); + static std::string lexer_text(); + static LPRDOParser s_parser(); + + template + void howIsIt() + { + howIsIt(identity()); + } + + static const std::string METHOD_TIME_NOW; + static const std::string METHOD_SECONDS; + static const std::string METHOD_TERMINATE_COUNTER; private: - RDOParser(); - virtual ~RDOParser(); - - typedef std::vector Compilers; - - rdo::runtime::LPRDORuntime m_pRuntime; - LPRDOSMR m_pSMR; - Error m_error; - Stack m_movementObjectList; - PreCastTypeList m_preCastTypeList; - LPContextStack m_pContextStack; - bool m_pattern; - rdo::IDGenerator m_resultGeneratorID; - Compilers m_compilers; - LPRDOParserItem m_parser_item; - - void runRSSPost(); - void runSMRPost(); - void runRTPPost(); - - template - void howIsIt(identity) - { - m_pattern = false; - } - - void howIsIt(identity) - {} - - void howIsIt(identity) - { - m_pattern = true; - } - - struct Changes - { - std::string m_name; - std::string m_value; - Changes(const std::string& name, const std::string& value) - : m_name (name ) - , m_value(value) - {} - }; - typedef std::vector ChangesList; - ChangesList m_changes; - - typedef std::list ParserList; - static ParserList s_parserStack; - - DECLARE_IContextFind; + RDOParser(); + virtual ~RDOParser(); + + typedef std::vector Compilers; + + rdo::runtime::LPRDORuntime m_pRuntime; + LPRDOSMR m_pSMR; + Error m_error; + Stack m_movementObjectList; + PreCastTypeList m_preCastTypeList; + LPContextStack m_pContextStack; + bool m_pattern; + rdo::IDGenerator m_resultGeneratorID; + Compilers m_compilers; + LPRDOParserItem m_parser_item; + + void runRSSPost(); + void runSMRPost(); + void runRTPPost(); + + template + void howIsIt(identity) + { + m_pattern = false; + } + + void howIsIt(identity) + {} + + void howIsIt(identity) + { + m_pattern = true; + } + + struct Changes + { + std::string m_name; + std::string m_value; + Changes(const std::string& name, const std::string& value) + : m_name (name ) + , m_value(value) + {} + }; + typedef std::vector ChangesList; + ChangesList m_changes; + + typedef std::list ParserList; + static ParserList s_parserStack; + + DECLARE_IContextFind; }; DECLARE_POINTER(RDOParser); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_H_ diff --git a/simulator/compiler/parser/rdoparser_base.cpp b/simulator/compiler/parser/rdoparser_base.cpp index 9047eac3d..422ed3f7f 100644 --- a/simulator/compiler/parser/rdoparser_base.cpp +++ b/simulator/compiler/parser/rdoparser_base.cpp @@ -8,22 +8,21 @@ OPEN_RDO_PARSER_NAMESPACE RDOParserItem::RDOParserItem() - : m_type (rdo::model::PAT) - , m_parser_fun(NULL) - , m_lexer_fun (NULL) - , m_from (sf_repository) + : m_type (rdo::FileType::PAT) + , m_parser_fun(NULL) + , m_lexer_fun (NULL) + , m_from (StreamFrom::REPOSITORY) {} RDOParserItem::RDOParserItem( - rdo::model::FileType type, - t_bison_parse_fun parser_fun, - t_flex_lexer_fun lexer_fun, - StreamFrom from -) - : m_type (type ) - , m_parser_fun(parser_fun) - , m_lexer_fun (lexer_fun ) - , m_from (from ) + rdo::FileType type, + t_bison_parse_fun parser_fun, + t_flex_lexer_fun lexer_fun, + StreamFrom from) + : m_type (type) + , m_parser_fun(parser_fun) + , m_lexer_fun (lexer_fun) + , m_from (from) {} RDOParserItem::~RDOParserItem() @@ -34,12 +33,12 @@ void RDOParserItem::parse(const LPRDOParser& /*pParser*/, std::istream& /*in_str std::size_t RDOParserItem::lexer_loc_line() { - return std::size_t(rdo::runtime::RDOSrcInfo::Position::UNDEFINE_LINE); + return std::size_t(rdo::runtime::RDOSrcInfo::Position::UNDEFINE_LINE); } std::size_t RDOParserItem::lexer_loc_pos() { - return 0; + return 0; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdoparser_base.h b/simulator/compiler/parser/rdoparser_base.h index e6926d47d..ce0a9b3e3 100644 --- a/simulator/compiler/parser/rdoparser_base.h +++ b/simulator/compiler/parser/rdoparser_base.h @@ -1,8 +1,8 @@ -#ifndef _RDOPARSER_BASE_H_ -#define _RDOPARSER_BASE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include +#include // ----------------------------------------------------------------------- SYNOPSIS #include "utils/src/smart_ptr/intrusive_ptr/intrusive_ptr.h" #include "utils/src/common/rdocommon.h" @@ -22,40 +22,40 @@ typedef int(*t_flex_lexer_fun)(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer); PREDECLARE_POINTER(RDOParser); PREDECLARE_POINTER(RDOParserItem); -class RDOParserItem: public rdo::counter_reference +class RDOParserItem + : public rdo::counter_reference + , private boost::noncopyable { DECLARE_FACTORY(RDOParserItem); public: - enum StreamFrom - { - sf_repository, - sf_editor - }; + enum class StreamFrom + { + REPOSITORY, + EDITOR + }; - rdo::model::FileType m_type; + rdo::FileType m_type; - t_bison_parse_fun m_parser_fun; - t_flex_lexer_fun m_lexer_fun; + t_bison_parse_fun m_parser_fun; + t_flex_lexer_fun m_lexer_fun; - virtual void parse(const LPRDOParser& pParser) = 0; - virtual void parse(const LPRDOParser& pParser, std::istream& in_stream); + virtual void parse(const LPRDOParser& pParser) = 0; + virtual void parse(const LPRDOParser& pParser, std::istream& in_stream); - virtual std::size_t lexer_loc_line(); - virtual std::size_t lexer_loc_pos(); + virtual std::size_t lexer_loc_line(); + virtual std::size_t lexer_loc_pos(); protected: - RDOParserItem(); - RDOParserItem( - rdo::model::FileType type, - t_bison_parse_fun parser_fun, - t_flex_lexer_fun lexer_fun, - StreamFrom from = sf_repository - ); - virtual ~RDOParserItem(); - - StreamFrom m_from; + RDOParserItem(); + RDOParserItem( + rdo::FileType type, + t_bison_parse_fun parser_fun, + t_flex_lexer_fun lexer_fun, + StreamFrom from = StreamFrom::REPOSITORY + ); + virtual ~RDOParserItem(); + + const StreamFrom m_from; }; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_BASE_H_ diff --git a/simulator/compiler/parser/rdoparser_corba.cpp b/simulator/compiler/parser/rdoparser_corba.cpp index 805dfd097..5c18a2050 100644 --- a/simulator/compiler/parser/rdoparser_corba.cpp +++ b/simulator/compiler/parser/rdoparser_corba.cpp @@ -20,453 +20,453 @@ OPEN_RDO_PARSER_NAMESPACE void print_RTP(RDOCorba::GetRTP_var& my_rtpList) { - FILE* f1; + FILE* f1; #pragma warning(disable: 4996) - f1 = fopen(file1, "w"); + f1 = fopen(file1, "w"); #pragma warning(default: 4996) - for (std::size_t i = 0; i < my_rtpList->length(); i++) - { - fprintf(f1, "\nИнформация о типе ресурса №%d:\n", i+1); - fprintf(f1, " Имя типа ресурса №%d: %s \n", i+1, my_rtpList[i].m_name); - - if (my_rtpList[i].m_type==RDOCorba::rt_permanent) - fprintf(f1, " Вид типа ресурса: tr_permanent\n"); - else - fprintf(f1, " Вид типа ресурса: tr_temporary\n"); - - for (std::size_t j = 0; j != my_rtpList[i].m_param_count; j++) - { - fprintf(f1, "\n Информация о параметре №%d:\n", j+1); - fprintf(f1, " Имя параметра: %s \n", my_rtpList[i].m_param[j].m_name); - - switch (my_rtpList[i].m_param[j].m_type) - { - case RDOCorba::int_type: - fprintf(f1, " Тип параметра: integer\n"); - if (my_rtpList[i].m_param[j].m_range_int == 1) - { - fprintf(f1, " Минимальное значение: %d \n", my_rtpList[i].m_param[j].m_min_int); - fprintf(f1, " Максимальное значение: %d \n", my_rtpList[i].m_param[j].m_max_int); - } - if (my_rtpList[i].m_param[j].m_default_int_ch == 1) - { - fprintf(f1, " Значение по умолчанию: %d \n", my_rtpList[i].m_param[j].m_default_int); - } - break; - case RDOCorba::double_type: - fprintf(f1, " Тип параметра: real\n"); - if (my_rtpList[i].m_param[j].m_range_double == 1) - { - fprintf(f1, " Минимальное значение: %f \n", my_rtpList[i].m_param[j].m_min_double); - fprintf(f1, " Максимальное значение: %f \n", my_rtpList[i].m_param[j].m_max_double); - } - if (my_rtpList[i].m_param[j].m_default_double_ch == 1) - { - fprintf(f1, " Значение по умолчанию: %f \n", my_rtpList[i].m_param[j].m_default_double); - } - break; - case RDOCorba::enum_type: - { - fprintf(f1, " Тип параметра: enum\n"); - fprintf(f1, " Значения параметра:"); - - CORBA::Long k = 0; - - while (k != my_rtpList[i].m_param[j].m_var_enum_count) - { - fprintf(f1, "\t%s", my_rtpList[i].m_param[j].m_var_enum[k].pd_data); - k++; - } - - fprintf(f1, "\n"); - - if (my_rtpList[i].m_param[j].m_default_enum_ch == 1) - { - fprintf(f1, "\n Значение по умолчанию: %s \n", my_rtpList[i].m_param[j].m_default_enum); - } - break; - } - default: break; - } - } - } - - fclose(f1); + for (std::size_t i = 0; i < my_rtpList->length(); i++) + { + fprintf(f1, "\nИнформация о типе ресурса №%d:\n", i+1); + fprintf(f1, " Имя типа ресурса №%d: %s \n", i+1, my_rtpList[i].m_name); + + if (my_rtpList[i].m_type==RDOCorba::rt_permanent) + fprintf(f1, " Вид типа ресурса: tr_permanent\n"); + else + fprintf(f1, " Вид типа ресурса: tr_temporary\n"); + + for (std::size_t j = 0; j != my_rtpList[i].m_param_count; j++) + { + fprintf(f1, "\n Информация о параметре №%d:\n", j+1); + fprintf(f1, " Имя параметра: %s \n", my_rtpList[i].m_param[j].m_name); + + switch (my_rtpList[i].m_param[j].m_type) + { + case RDOCorba::int_type: + fprintf(f1, " Тип параметра: integer\n"); + if (my_rtpList[i].m_param[j].m_range_int == 1) + { + fprintf(f1, " Минимальное значение: %d \n", my_rtpList[i].m_param[j].m_min_int); + fprintf(f1, " Максимальное значение: %d \n", my_rtpList[i].m_param[j].m_max_int); + } + if (my_rtpList[i].m_param[j].m_default_int_ch == 1) + { + fprintf(f1, " Значение по умолчанию: %d \n", my_rtpList[i].m_param[j].m_default_int); + } + break; + case RDOCorba::double_type: + fprintf(f1, " Тип параметра: real\n"); + if (my_rtpList[i].m_param[j].m_range_double == 1) + { + fprintf(f1, " Минимальное значение: %f \n", my_rtpList[i].m_param[j].m_min_double); + fprintf(f1, " Максимальное значение: %f \n", my_rtpList[i].m_param[j].m_max_double); + } + if (my_rtpList[i].m_param[j].m_default_double_ch == 1) + { + fprintf(f1, " Значение по умолчанию: %f \n", my_rtpList[i].m_param[j].m_default_double); + } + break; + case RDOCorba::enum_type: + { + fprintf(f1, " Тип параметра: enum\n"); + fprintf(f1, " Значения параметра:"); + + CORBA::Long k = 0; + + while (k != my_rtpList[i].m_param[j].m_var_enum_count) + { + fprintf(f1, "\t%s", my_rtpList[i].m_param[j].m_var_enum[k].pd_data); + k++; + } + + fprintf(f1, "\n"); + + if (my_rtpList[i].m_param[j].m_default_enum_ch == 1) + { + fprintf(f1, "\n Значение по умолчанию: %s \n", my_rtpList[i].m_param[j].m_default_enum); + } + break; + } + default: break; + } + } + } + + fclose(f1); } void print_RSS(RDOCorba::GetRSS_var& my_rssList) { - FILE* f2; + FILE* f2; #pragma warning(disable: 4996) - f2 = fopen(file2, "w"); + f2 = fopen(file2, "w"); #pragma warning(default: 4996) - - for (std::size_t i = 0; i < my_rssList->length(); i++) - { - fprintf(f2, "\nИнформация о ресурсе №%d:\n\n", i+1); - fprintf(f2, "Имя ресурса: %s/ Тип ресурса: %s\n", my_rssList[i].m_name, my_rssList[i].m_type); - - for (std::size_t j = 0; j != my_rssList[i].m_param_count; j++) - { - switch (my_rssList[i].m_param[j].m_type) - { - case RDOCorba::int_type: - fprintf(f2, " Значение параметра: %s = %d\n", my_rssList[i].m_param[j].m_name, my_rssList[i].m_param[j].m_int); - break; - case RDOCorba::double_type: - fprintf(f2, " Значение параметра: %s = %f\n", my_rssList[i].m_param[j].m_name, my_rssList[i].m_param[j].m_double); - break; - case RDOCorba::enum_type: - fprintf(f2, " Значение параметра: %s = %s\n", my_rssList[i].m_param[j].m_name, my_rssList[i].m_param[j].m_enum); - break; - default: break; - } - } - } - - fclose(f2); + + for (std::size_t i = 0; i < my_rssList->length(); i++) + { + fprintf(f2, "\nИнформация о ресурсе №%d:\n\n", i+1); + fprintf(f2, "Имя ресурса: %s/ Тип ресурса: %s\n", my_rssList[i].m_name, my_rssList[i].m_type); + + for (std::size_t j = 0; j != my_rssList[i].m_param_count; j++) + { + switch (my_rssList[i].m_param[j].m_type) + { + case RDOCorba::int_type: + fprintf(f2, " Значение параметра: %s = %d\n", my_rssList[i].m_param[j].m_name, my_rssList[i].m_param[j].m_int); + break; + case RDOCorba::double_type: + fprintf(f2, " Значение параметра: %s = %f\n", my_rssList[i].m_param[j].m_name, my_rssList[i].m_param[j].m_double); + break; + case RDOCorba::enum_type: + fprintf(f2, " Значение параметра: %s = %s\n", my_rssList[i].m_param[j].m_name, my_rssList[i].m_param[j].m_enum); + break; + default: break; + } + } + } + + fclose(f2); } static CORBA::Object_ptr getObjectReference(CORBA::ORB_ptr orb, const char* ObjectName) { - CosNaming::NamingContext_var rootContext; - - try - { - //! Obtain a reference to the root context of the Name service: - CORBA::Object_var obj; - - obj = orb->resolve_initial_references("NameService"); - - //! Narrow the reference returned. - rootContext = CosNaming::NamingContext::_narrow(obj); - - if(CORBA::is_nil(rootContext)) - { - TRACE("Failed to narrow the root naming context.\n"); - return CORBA::Object::_nil(); - } - } - catch (const CORBA::NO_RESOURCES&) - { - TRACE("Caught NO_RESOURCES exception. You must configure omniORB with the location of the naming service.\n"); - return 0; - } - catch (const CORBA::ORB::InvalidName&) - { - //! This should not happen! - TRACE("Service required is invalid [does not exist].\n"); - return CORBA::Object::_nil(); - } - - //! Create a name object, containing the name test/context: - CosNaming::Name name; - name.length(2); - name[0].id = (const char*)"RDO"; //! string copied - name[0].kind = (const char*)"RDO_context"; //! string copied - name[1].id = (const char*)ObjectName; - name[1].kind = (const char*)"Object"; - - //! Note on kind: The kind field is used to indicate the type - //! of the object. This is to avoid conventions such as that used - //! by files (name.type -- e.g. test.ps = postscript etc.) - try - { - //! Resolve the name to an object reference. - return rootContext->resolve(name); - } - catch(const CosNaming::NamingContext::NotFound&) - { - //! This exception is thrown if any of the components of the - //! path [contexts or the object] aren’t found: - TRACE("Context not found."); - } - catch(const CORBA::TRANSIENT&) - { - TRACE("Caught system exception TRANSIENT -- unable to contact the naming service. Make sure the naming server is running and that omniORB is configured correctly. \n"); - } - catch(const CORBA::SystemException& ex) - { - TRACE1("Caught a CORBA:: %s while using the naming service.\n", ex._name()); - return 0; - } - - return CORBA::Object::_nil(); + CosNaming::NamingContext_var rootContext; + + try + { + // Obtain a reference to the root context of the Name service: + CORBA::Object_var obj; + + obj = orb->resolve_initial_references("NameService"); + + // Narrow the reference returned. + rootContext = CosNaming::NamingContext::_narrow(obj); + + if(CORBA::is_nil(rootContext)) + { + TRACE("Failed to narrow the root naming context.\n"); + return CORBA::Object::_nil(); + } + } + catch (const CORBA::NO_RESOURCES&) + { + TRACE("Caught NO_RESOURCES exception. You must configure omniORB with the location of the naming service.\n"); + return 0; + } + catch (const CORBA::ORB::InvalidName&) + { + // This should not happen! + TRACE("Service required is invalid [does not exist].\n"); + return CORBA::Object::_nil(); + } + + // Create a name object, containing the name test/context: + CosNaming::Name name; + name.length(2); + name[0].id = (const char*)"RDO"; // string copied + name[0].kind = (const char*)"RDO_context"; // string copied + name[1].id = (const char*)ObjectName; + name[1].kind = (const char*)"Object"; + + // Note on kind: The kind field is used to indicate the type + // of the object. This is to avoid conventions such as that used + // by files (name.type -- e.g. test.ps = postscript etc.) + try + { + // Resolve the name to an object reference. + return rootContext->resolve(name); + } + catch(const CosNaming::NamingContext::NotFound&) + { + // This exception is thrown if any of the components of the + // path [contexts or the object] aren’t found: + TRACE("Context not found."); + } + catch(const CORBA::TRANSIENT&) + { + TRACE("Caught system exception TRANSIENT -- unable to contact the naming service. Make sure the naming server is running and that omniORB is configured correctly. \n"); + } + catch(const CORBA::SystemException& ex) + { + TRACE1("Caught a CORBA:: %s while using the naming service.\n", ex._name()); + return 0; + } + + return CORBA::Object::_nil(); } -//! ---------------------------------------------------------------------------- -//! ---------- RDOParserCorbaRTP -//! ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// ---------- RDOParserCorbaRTP +// ---------------------------------------------------------------------------- void RDOParserCorbaRTP::parse(const LPRDOParser& pParser) { - //! Тут надо запросить все типы ресурсов у парного РДО, - //! вызвав с помощью корбы некий метод, который вернёт кучу структур - //! с описанием RTP и насоздавать этих типов - - RDOParserSMRInfo parser; - parser.parse(); - - const char* left; - const char* right; - - RDOSMR::StringTable tmp = parser.getSMR()->getExternalModelList(); - for (const auto& pair: tmp) - { - left = pair.first.c_str(); - right = pair.second.c_str(); - - try - { - int argc = 0; - - CORBA::ORB_var orb = CORBA::ORB_init (argc, NULL); - CORBA::Object_var obj = getObjectReference(orb, left); //! может лучше right - RDOCorba_var rdocorbaref = RDOCorba::_narrow(obj); - - //------------------------------------------------------------- - CORBA::Long rtp_count = 0; - - RDOCorba::GetRTP_var tmp_rtp = rdocorbaref->getRDORTPlist(rtp_count); - RDOCorba::GetRTP_var my_rtpList(tmp_rtp); - - //! Печатаем в файл на С для теста - print_RTP(my_rtpList); - //!------------------------------------------------------------- - //! Добавляем к существующим типам ресурсов и выводим в трассировке - - //! Получили список всех описанных типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(pParser); - - for (std::size_t i = 0; i < my_rtpList->length(); i++) - { - rdo::compiler::mbuilder::RDOResType rtp(my_rtpList[i].m_name.in()); - - //! Наполняем его параметрами - for (std::size_t j = 0; j != my_rtpList[i].m_param_count; j++) - { - switch (my_rtpList[i].m_param[j].m_type) - { - case RDOCorba::int_type: - { - rdo::compiler::mbuilder::RDOResType::Param par_int(my_rtpList[i].m_param[j].m_name.in(), rdo::Factory::create()); - - if (my_rtpList[i].m_param[j].m_range_int == 1) - par_int.setRange(RDOValue(my_rtpList[i].m_param[j].m_min_int), RDOValue(my_rtpList[i].m_param[j].m_max_int)); - - if (my_rtpList[i].m_param[j].m_default_int_ch == 1) - par_int.setDefault(RDOValue(my_rtpList[i].m_param[j].m_default_int)); - - rtp.m_params.append(par_int); - break; - } - case RDOCorba::double_type: - { - rdo::compiler::mbuilder::RDOResType::Param par_double(my_rtpList[i].m_param[j].m_name.in(), rdo::Factory::create()); - - if (my_rtpList[i].m_param[j].m_range_double == 1) - par_double.setRange(RDOValue(my_rtpList[i].m_param[j].m_min_double), RDOValue(my_rtpList[i].m_param[j].m_max_double)); - - if (my_rtpList[i].m_param[j].m_default_double_ch == 1) - par_double.setDefault(RDOValue(my_rtpList[i].m_param[j].m_default_double)); - - rtp.m_params.append(par_double); - break; - } - case RDOCorba::enum_type: - { - //! Создадим список значений параметра перечислимого типа - rdo::runtime::RDOEnumType::Enums enumList; - - for (CORBA::Long k = 0; k < my_rtpList[i].m_param[j].m_var_enum_count ; k++) - { - enumList.push_back(my_rtpList[i].m_param[j].m_var_enum[k].pd_data); - } - - //! Создадим параметр перечислимого типа - rdo::compiler::mbuilder::RDOResType::Param par_enum(my_rtpList[i].m_param[j].m_name.in(), enumList); - - //Добавляем, если есть значение по умолчанию - if (my_rtpList[i].m_param[j].m_default_enum_ch == 1) - { - std::string temp_string; - temp_string = my_rtpList[i].m_param[j].m_default_enum.in(); - par_enum.setDefault(RDOValue::getIdentificator(temp_string)); - } - rtp.m_params.append(par_enum); - break; - } - default: break; - } - } - - //! Добавляем к существующим типам ресурсов - if (rtpList.append(rtp)) - { - //! Добавили успешно - TRACE("Еще один тип ресурсов добавился!!!\n"); - } - else - { - //! Неудача, возможно, тип с таким именем уже есть - TRACE("Где-то есть ошибка или тип ресурса уже существует!!!\n"); - } - } - - //! Вывели все типы ресурсов (исключительно для теста) - for (const auto& rtp: rtpList) - { - TRACE1("rtp.name = %s\n", rtp.name().c_str()); - for (const auto& param: rtp.m_params) - { - const std::string info = rdo::format(" param: %s: %s", param.name().c_str() , param.typeStr().c_str()); - if (param.hasRange()) - { - info = rdo::format("%s [%s..%s]", info.c_str(), param.getMin()->getAsString().c_str(), param.getMax()->getAsString().c_str()); - } - if (param.hasDefault()) - { - info = rdo::format("%s = %s", info.c_str(), param.getDefault()->getAsString().c_str()); - } - TRACE1("%s\n", info.c_str()); - - if (param.typeID() == rdo::runtime::RDOType::t_enum) - { - for (const auto& enumValue: param.getEnum()->getEnums()) - { - TRACE1(" - enum - %s\n", enumValue.c_str()); - } - } - } - } - - //! ------------------------------------------------------------- - CORBA::Long rss_count = 0; - - RDOCorba::GetRSS_var tmp_rss = rdocorbaref->getRDORSSPlist(rss_count); - RDOCorba::GetRSS_var my_rssList(tmp_rss); - - //! Печатаем в файл на С для теста: - print_RSS(my_rssList); - - //! ------------------------------------------------------------- - //! Добавляем к существующим ресурсам и выводим в трассировке - - //! Переписали имеющиеся ресурсы в rssList - rdo::compiler::mbuilder::RDOResourceList rssList(pParser); - - for (std::size_t i = 0; i < my_rssList->length(); i++) - { - //! Нашли тип ресурса по известному имени и создали ресурс указанного типа - rdo::compiler::mbuilder::RDOResType _rtp = rtpList[my_rssList[i].m_type.in()]; - rdo::compiler::mbuilder::RDOResource rss(_rtp, my_rssList[i].m_name.in()); - - //! rdo::compiler::mbuilder::RDOResource::Params::const_iterator it_param = rss.begin(); - - for (std::size_t j = 0; j != my_rssList[i].m_param_count; j++) - { - //! Записываем начальные значения параметров ресурса - switch (my_rssList[i].m_param[j].m_type) - { - case RDOCorba::int_type: - rss[my_rssList[i].m_param[j].m_name.in()] = RDOValue(my_rssList[i].m_param[j].m_int); - break; - case RDOCorba::double_type: - rss[my_rssList[i].m_param[j].m_name.in()] = RDOValue(my_rssList[i].m_param[j].m_double); - break; - case RDOCorba::enum_type: - { - std::string temp_string; - temp_string = my_rssList[i].m_param[j].m_enum.in(); - rss[my_rssList[i].m_param[j].m_name.in()] = RDOValue::getIdentificator(temp_string); - break; - } - default: break; - } - } - - //! Добавляем к существующим ресурсам - if (rssList.append(rss)) - { - //! Добавили успешно - TRACE("Еще один ресурс добавился!!!\n"); - } - else - { - //! Неудача - TRACE("Где-то есть ошибка или ресурс уже существует!!!\n"); - } - } - - //! Вывели все ресурсы для теста - //! rdo::compiler::mbuilder::RDOResourceList rssList(&parser); - for (const auto& rss: rssList) - { - TRACE2("rss.name = %s: %s\n", rss.name().c_str(), rss.getType().name().c_str()); - for (const auto& param: rss) - { - TRACE2(" %s = %s\n", param.first.c_str(), param.second->getAsString().c_str()); - } - } - - //------------------------------------------------------------- - orb->destroy(); - } - catch(const CORBA::TRANSIENT&) - { - TRACE("Caught system exception TRANSIENT -- unable to contact the server.\n"); - } - catch(const CORBA::SystemException& ex) - { - TRACE1("Caught a CORBA:: %s\n", ex._name()); - } - catch(const CORBA::Exception& ex) - { - TRACE1("Caught CORBA::Exception: %s\n", ex._name()); - } - catch(const omniORB::fatalException& fe) - { - TRACE3("Caught omniORB::fatalException: file: %s line: %d mesg: %s\n", fe.file() , fe.line() , fe.errmsg()); - } - } + // Тут надо запросить все типы ресурсов у парного РДО, + // вызвав с помощью корбы некий метод, который вернёт кучу структур + // с описанием RTP и насоздавать этих типов + + RDOParserSMRInfo parser; + parser.parse(); + + const char* left; + const char* right; + + RDOSMR::StringTable tmp = parser.getSMR()->getExternalModelList(); + for (const auto& pair: tmp) + { + left = pair.first.c_str(); + right = pair.second.c_str(); + + try + { + int argc = 0; + + CORBA::ORB_var orb = CORBA::ORB_init (argc, NULL); + CORBA::Object_var obj = getObjectReference(orb, left); // может лучше right + RDOCorba_var rdocorbaref = RDOCorba::_narrow(obj); + + //------------------------------------------------------------- + CORBA::Long rtp_count = 0; + + RDOCorba::GetRTP_var tmp_rtp = rdocorbaref->getRDORTPlist(rtp_count); + RDOCorba::GetRTP_var my_rtpList(tmp_rtp); + + // Печатаем в файл на С для теста + print_RTP(my_rtpList); + //------------------------------------------------------------- + // Добавляем к существующим типам ресурсов и выводим в трассировке + + // Получили список всех описанных типов ресурсов + rdo::compiler::mbuilder::RDOResTypeList rtpList(pParser); + + for (std::size_t i = 0; i < my_rtpList->length(); i++) + { + rdo::compiler::mbuilder::RDOResType rtp(my_rtpList[i].m_name.in()); + + // Наполняем его параметрами + for (std::size_t j = 0; j != my_rtpList[i].m_param_count; j++) + { + switch (my_rtpList[i].m_param[j].m_type) + { + case RDOCorba::int_type: + { + rdo::compiler::mbuilder::RDOResType::Param par_int(my_rtpList[i].m_param[j].m_name.in(), rdo::Factory::create()); + + if (my_rtpList[i].m_param[j].m_range_int == 1) + par_int.setRange(RDOValue(my_rtpList[i].m_param[j].m_min_int), RDOValue(my_rtpList[i].m_param[j].m_max_int)); + + if (my_rtpList[i].m_param[j].m_default_int_ch == 1) + par_int.setDefault(RDOValue(my_rtpList[i].m_param[j].m_default_int)); + + rtp.m_params.append(par_int); + break; + } + case RDOCorba::double_type: + { + rdo::compiler::mbuilder::RDOResType::Param par_double(my_rtpList[i].m_param[j].m_name.in(), rdo::Factory::create()); + + if (my_rtpList[i].m_param[j].m_range_double == 1) + par_double.setRange(RDOValue(my_rtpList[i].m_param[j].m_min_double), RDOValue(my_rtpList[i].m_param[j].m_max_double)); + + if (my_rtpList[i].m_param[j].m_default_double_ch == 1) + par_double.setDefault(RDOValue(my_rtpList[i].m_param[j].m_default_double)); + + rtp.m_params.append(par_double); + break; + } + case RDOCorba::enum_type: + { + // Создадим список значений параметра перечислимого типа + rdo::runtime::RDOEnumType::Enums enumList; + + for (CORBA::Long k = 0; k < my_rtpList[i].m_param[j].m_var_enum_count ; k++) + { + enumList.push_back(my_rtpList[i].m_param[j].m_var_enum[k].pd_data); + } + + // Создадим параметр перечислимого типа + rdo::compiler::mbuilder::RDOResType::Param par_enum(my_rtpList[i].m_param[j].m_name.in(), enumList); + + //Добавляем, если есть значение по умолчанию + if (my_rtpList[i].m_param[j].m_default_enum_ch == 1) + { + std::string temp_string; + temp_string = my_rtpList[i].m_param[j].m_default_enum.in(); + par_enum.setDefault(RDOValue::getIdentificator(temp_string)); + } + rtp.m_params.append(par_enum); + break; + } + default: break; + } + } + + // Добавляем к существующим типам ресурсов + if (rtpList.append(rtp)) + { + // Добавили успешно + TRACE("Еще один тип ресурсов добавился!!!\n"); + } + else + { + // Неудача, возможно, тип с таким именем уже есть + TRACE("Где-то есть ошибка или тип ресурса уже существует!!!\n"); + } + } + + // Вывели все типы ресурсов (исключительно для теста) + for (const auto& rtp: rtpList) + { + TRACE1("rtp.name = %s\n", rtp.name().c_str()); + for (const auto& param: rtp.m_params) + { + const std::string info = rdo::format(" param: %s: %s", param.name().c_str() , param.typeStr().c_str()); + if (param.hasRange()) + { + info = rdo::format("%s [%s..%s]", info.c_str(), param.getMin()->getAsString().c_str(), param.getMax()->getAsString().c_str()); + } + if (param.hasDefault()) + { + info = rdo::format("%s = %s", info.c_str(), param.getDefault()->getAsString().c_str()); + } + TRACE1("%s\n", info.c_str()); + + if (param.typeID() == rdo::runtime::RDOType::Type::ENUM) + { + for (const auto& enumValue: param.getEnum()->getEnums()) + { + TRACE1(" - enum - %s\n", enumValue.c_str()); + } + } + } + } + + // ------------------------------------------------------------- + CORBA::Long rss_count = 0; + + RDOCorba::GetRSS_var tmp_rss = rdocorbaref->getRDORSSPlist(rss_count); + RDOCorba::GetRSS_var my_rssList(tmp_rss); + + // Печатаем в файл на С для теста: + print_RSS(my_rssList); + + // ------------------------------------------------------------- + // Добавляем к существующим ресурсам и выводим в трассировке + + // Переписали имеющиеся ресурсы в rssList + rdo::compiler::mbuilder::RDOResourceList rssList(pParser); + + for (std::size_t i = 0; i < my_rssList->length(); i++) + { + // Нашли тип ресурса по известному имени и создали ресурс указанного типа + rdo::compiler::mbuilder::RDOResType _rtp = rtpList[my_rssList[i].m_type.in()]; + rdo::compiler::mbuilder::RDOResource rss(_rtp, my_rssList[i].m_name.in()); + + // rdo::compiler::mbuilder::RDOResource::Params::const_iterator it_param = rss.begin(); + + for (std::size_t j = 0; j != my_rssList[i].m_param_count; j++) + { + // Записываем начальные значения параметров ресурса + switch (my_rssList[i].m_param[j].m_type) + { + case RDOCorba::int_type: + rss[my_rssList[i].m_param[j].m_name.in()] = RDOValue(my_rssList[i].m_param[j].m_int); + break; + case RDOCorba::double_type: + rss[my_rssList[i].m_param[j].m_name.in()] = RDOValue(my_rssList[i].m_param[j].m_double); + break; + case RDOCorba::enum_type: + { + std::string temp_string; + temp_string = my_rssList[i].m_param[j].m_enum.in(); + rss[my_rssList[i].m_param[j].m_name.in()] = RDOValue::getIdentificator(temp_string); + break; + } + default: break; + } + } + + // Добавляем к существующим ресурсам + if (rssList.append(rss)) + { + // Добавили успешно + TRACE("Еще один ресурс добавился!!!\n"); + } + else + { + // Неудача + TRACE("Где-то есть ошибка или ресурс уже существует!!!\n"); + } + } + + // Вывели все ресурсы для теста + // rdo::compiler::mbuilder::RDOResourceList rssList(&parser); + for (const auto& rss: rssList) + { + TRACE2("rss.name = %s: %s\n", rss.name().c_str(), rss.getType().name().c_str()); + for (const auto& param: rss) + { + TRACE2(" %s = %s\n", param.first.c_str(), param.second->getAsString().c_str()); + } + } + + //------------------------------------------------------------- + orb->destroy(); + } + catch(const CORBA::TRANSIENT&) + { + TRACE("Caught system exception TRANSIENT -- unable to contact the server.\n"); + } + catch(const CORBA::SystemException& ex) + { + TRACE1("Caught a CORBA:: %s\n", ex._name()); + } + catch(const CORBA::Exception& ex) + { + TRACE1("Caught CORBA::Exception: %s\n", ex._name()); + } + catch(const omniORB::fatalException& fe) + { + TRACE3("Caught omniORB::fatalException: file: %s line: %d mesg: %s\n", fe.file() , fe.line() , fe.errmsg()); + } + } } -//! ---------------------------------------------------------------------------- -//! ---------- RDOParserCorbaRSS -//! ---------------------------------------------------------------------------- +// ---------------------------------------------------------------------------- +// ---------- RDOParserCorbaRSS +// ---------------------------------------------------------------------------- void RDOParserCorbaRSS::parse(const LPRDOParser& pParser) { /* - //! Тут надо запросить все ресурсы у парного РДО - - //! Количество полученных ресурсов - const std::size_t rss_count = 1; - - //! Получили список всех типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(pParser); - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(pParser); - - for (std::size_t i = 0; i < rss_count; i++) - { - //! Создали новый ресурс - rdo::compiler::mbuilder::RDOResource rss(rtpList["Парикмахеры"], "MyRSS1"); - //! Заполнили его параметры - rss["длительность_max"] = 174; - //! Добавляем его к списку существующих - if (rssList.append(rss)) - { - //! Добавили успешно - } - else - { - //! Неудача - } - //! Пример проверки ресурса на существование - if (rssList.exist("qqq")) - { - } - } + // Тут надо запросить все ресурсы у парного РДО + + // Количество полученных ресурсов + const std::size_t rss_count = 1; + + // Получили список всех типов ресурсов + rdo::compiler::mbuilder::RDOResTypeList rtpList(pParser); + // Получили список всех ресурсов + rdo::compiler::mbuilder::RDOResourceList rssList(pParser); + + for (std::size_t i = 0; i < rss_count; i++) + { + // Создали новый ресурс + rdo::compiler::mbuilder::RDOResource rss(rtpList["Парикмахеры"], "MyRSS1"); + // Заполнили его параметры + rss["длительность_max"] = 174; + // Добавляем его к списку существующих + if (rssList.append(rss)) + { + // Добавили успешно + } + else + { + // Неудача + } + // Пример проверки ресурса на существование + if (rssList.exist("qqq")) + { + } + } */ } diff --git a/simulator/compiler/parser/rdoparser_corba.h b/simulator/compiler/parser/rdoparser_corba.h index 5902f7dd8..bd58feb87 100644 --- a/simulator/compiler/parser/rdoparser_corba.h +++ b/simulator/compiler/parser/rdoparser_corba.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_CORBA_H_ -#define _RDOPARSER_CORBA_H_ +#pragma once #ifdef CORBA_ENABLE @@ -17,10 +16,10 @@ class RDOParserCorbaRTP: public RDOParserRDOItem { DECLARE_FACTORY(RDOParserCorbaRTP); private: - RDOParserCorbaRTP() - : RDOParserRDOItem(rdo::model::RTP, NULL, NULL, NULL) - {} - virtual void parse(const LPRDOParser& pParser); + RDOParserCorbaRTP() + : RDOParserRDOItem(rdo::FileType::RTP, NULL, NULL, NULL) + {} + virtual void parse(const LPRDOParser& pParser); }; // -------------------------------------------------------------------------------- @@ -30,14 +29,12 @@ class RDOParserCorbaRSS: public RDOParserRDOItem { DECLARE_FACTORY(RDOParserCorbaRSS); private: - RDOParserCorbaRSS() - : RDOParserRDOItem(rdo::model::RSS, NULL, NULL, NULL) - {} - virtual void parse(const LPRDOParser& pParser); + RDOParserCorbaRSS() + : RDOParserRDOItem(rdo::FileType::RSS, NULL, NULL, NULL) + {} + virtual void parse(const LPRDOParser& pParser); }; CLOSE_RDO_PARSER_NAMESPACE #endif // CORBA_ENABLE - -#endif // _RDOPARSER_CORBA_H_ diff --git a/simulator/compiler/parser/rdoparser_error.cpp b/simulator/compiler/parser/rdoparser_error.cpp index bfb5e949a..1dcb7e65c 100644 --- a/simulator/compiler/parser/rdoparser_error.cpp +++ b/simulator/compiler/parser/rdoparser_error.cpp @@ -14,104 +14,104 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- Error // -------------------------------------------------------------------------------- Error::Error() - : m_blocked(false) + : m_blocked(false) {} -//! 1 +// 1 void Error::error(const RDOParserSrcInfo& src_info, const std::string& message) { - if (blocked()) - return; + if (blocked()) + return; - push_only(src_info, message); - throw RDOSyntaxException(m_errorList.back().getText()); + push_only(src_info, message); + throw RDOSyntaxException(m_errorList.back().getText()); } void Error::warning(const RDOParserSrcInfo& src_info, const std::string& message) { - if (blocked()) - return; + if (blocked()) + return; - m_errorList.push_back(rdo::simulation::report::FileMessage(message, src_info.src_filetype(), src_info.src_pos().m_last_line, src_info.src_pos().m_last_pos, FileMessage::MT_WARNING)); + m_errorList.push_back(rdo::simulation::report::FileMessage(message, src_info.src_filetype(), src_info.src_pos().m_last_line, src_info.src_pos().m_last_pos, FileMessage::Type::MESSAGE_WARNING)); } void Error::push_only(const RDOParserSrcInfo& src_info, const std::string& message) { - if (blocked()) - return; + if (blocked()) + return; - if (src_info.src_pos().m_last_line != rdo::runtime::RDOSrcInfo::Position::UNDEFINE_LINE && src_info.src_pos().m_last_pos != rdo::runtime::RDOSrcInfo::Position::UNDEFINE_POS) - { - m_errorList.push_back(rdo::simulation::report::FileMessage(message, src_info.src_filetype(), src_info.src_pos().m_last_line, src_info.src_pos().m_last_pos)); - } + if (src_info.src_pos().m_last_line != rdo::runtime::RDOSrcInfo::Position::UNDEFINE_LINE && src_info.src_pos().m_last_pos != rdo::runtime::RDOSrcInfo::Position::UNDEFINE_POS) + { + m_errorList.push_back(rdo::simulation::report::FileMessage(message, src_info.src_filetype(), src_info.src_pos().m_last_line, src_info.src_pos().m_last_pos)); + } } -//! 2 +// 2 void Error::error(const RDOParserSrcInfo& src_info1, const RDOParserSrcInfo& src_info2, const std::string& message) { - if (blocked()) - return; + if (blocked()) + return; - push_only(src_info1.src_pos().m_last_line != src_info2.src_pos().m_last_line ? src_info1 : src_info2, message); - throw RDOSyntaxException(m_errorList.back().getText()); + push_only(src_info1.src_pos().m_last_line != src_info2.src_pos().m_last_line ? src_info1 : src_info2, message); + throw RDOSyntaxException(m_errorList.back().getText()); } -//! misc +// misc void Error::push_done() { - if (blocked()) - return; + if (blocked()) + return; - if (!m_errorList.empty()) - { - throw RDOSyntaxException(m_errorList.back().getText()); - } + if (!m_errorList.empty()) + { + throw RDOSyntaxException(m_errorList.back().getText()); + } } void Error::modify(const std::string& message) { - if (blocked()) - return; - - if (!m_errorList.empty()) - { - const std::string new_text = message + m_errorList.front().getText();; - m_errorList.front().setText(new_text); - throw RDOSyntaxException(""); - } + if (blocked()) + return; + + if (!m_errorList.empty()) + { + const std::string new_text = message + m_errorList.front().getText();; + m_errorList.front().setText(new_text); + throw RDOSyntaxException(""); + } } void Error::clear() { - if (blocked()) - return; + if (blocked()) + return; - m_errorList.clear(); + m_errorList.clear(); } const Error::ErrorList& Error::getList() const { - return m_errorList; + return m_errorList; } void Error::block() { - m_blocked = true; + m_blocked = true; } void Error::unblock() { - m_blocked = false; + m_blocked = false; } bool Error::blocked() const { - return m_blocked; + return m_blocked; } Error& g_error() { - return RDOParser::s_parser()->error(); + return RDOParser::s_parser()->error(); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdoparser_error.h b/simulator/compiler/parser/rdoparser_error.h index 71abfaa80..284bd0827 100644 --- a/simulator/compiler/parser/rdoparser_error.h +++ b/simulator/compiler/parser/rdoparser_error.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_ERROR_H_ -#define _RDOPARSER_ERROR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -18,10 +17,10 @@ OPEN_RDO_PARSER_NAMESPACE class RDOSyntaxException: public rdo::runtime::RDOException { public: - RDOSyntaxException(const std::string& message) - : RDOException(message) - {} - virtual std::string getType() const { return "RDO Syntax Error"; } + RDOSyntaxException(const std::string& message) + : RDOException(message) + {} + virtual std::string getType() const { return "RDO Syntax Error"; } }; // -------------------------------------------------------------------------------- @@ -30,30 +29,30 @@ class RDOSyntaxException: public rdo::runtime::RDOException class Error { public: - typedef std::vector ErrorList; + typedef std::vector ErrorList; - Error(); + Error(); - //! 1 - void error(const RDOParserSrcInfo& src_info, const std::string& message); - void warning(const RDOParserSrcInfo& src_info, const std::string& message); - void push_only(const RDOParserSrcInfo& src_info, const std::string& message); + // 1 + void error(const RDOParserSrcInfo& src_info, const std::string& message); + void warning(const RDOParserSrcInfo& src_info, const std::string& message); + void push_only(const RDOParserSrcInfo& src_info, const std::string& message); - //! 2 - void error(const RDOParserSrcInfo& src_info1, const RDOParserSrcInfo& src_info2, const std::string& message); + // 2 + void error(const RDOParserSrcInfo& src_info1, const RDOParserSrcInfo& src_info2, const std::string& message); - //! misc - void push_done(); - void modify(const std::string& message); - void clear(); - const ErrorList& getList () const; - void block(); - void unblock(); - bool blocked() const; + // misc + void push_done(); + void modify(const std::string& message); + void clear(); + const ErrorList& getList () const; + void block(); + void unblock(); + bool blocked() const; private: - ErrorList m_errorList; - bool m_blocked; + ErrorList m_errorList; + bool m_blocked; }; Error& g_error(); @@ -61,16 +60,14 @@ Error& g_error(); class ErrorBlockMonicker { public: - ErrorBlockMonicker() - { - g_error().block(); - } - ~ErrorBlockMonicker() - { - g_error().unblock(); - } + ErrorBlockMonicker() + { + g_error().block(); + } + ~ErrorBlockMonicker() + { + g_error().unblock(); + } }; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_ERROR_H_ diff --git a/simulator/compiler/parser/rdoparser_lexer.cpp b/simulator/compiler/parser/rdoparser_lexer.cpp index 999525b44..fdda314d0 100644 --- a/simulator/compiler/parser/rdoparser_lexer.cpp +++ b/simulator/compiler/parser/rdoparser_lexer.cpp @@ -12,19 +12,19 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- RDOLexer // -------------------------------------------------------------------------------- RDOLexer::RDOLexer(const LPRDOParser& pParser, std::istream* yyin, std::ostream* yyout) - : yyFlexLexer(yyin, yyout) - , m_lpval (NULL ) - , m_lploc (NULL ) - , m_yyin (yyin ) - , m_yyout (yyout ) - , m_pParser (pParser ) - , m_enumEmpty(true ) - , m_array_param_cnt(0 ) + : yyFlexLexer(yyin, yyout) + , m_lpval (NULL ) + , m_lploc (NULL ) + , m_yyin (yyin ) + , m_yyout (yyout ) + , m_pParser (pParser ) + , m_enumEmpty(true ) + , m_array_param_cnt(0 ) {} const LPRDOParser& RDOLexer::parser() const { - return m_pParser; + return m_pParser; } #ifdef YY_INTERACTIVE @@ -33,36 +33,36 @@ int RDOLexer::LexerInput(char* buf, int /* max_size */) int RDOLexer::LexerInput(char* buf, int max_size) #endif { - if (m_yyin->eof() || m_yyin->fail()) - return 0; + if (m_yyin->eof() || m_yyin->fail()) + return 0; #ifdef YY_INTERACTIVE - m_yyin->get(buf[0]); + m_yyin->get(buf[0]); - if (m_yyin->eof()) - return 0; + if (m_yyin->eof()) + return 0; - if (m_yyin->bad()) - return -1; + if (m_yyin->bad()) + return -1; - return 1; + return 1; #else - (void) m_yyin->read(buf, max_size); - - if (m_yyin->bad()) - { - return -1; - } - else - { - return (int)m_yyin->gcount(); - } + (void) m_yyin->read(buf, max_size); + + if (m_yyin->bad()) + { + return -1; + } + else + { + return (int)m_yyin->gcount(); + } #endif } void RDOLexer::LexerOutput(const char* buf, int size) { - (void) m_yyout->write(buf, size); + (void) m_yyout->write(buf, size); } #ifndef YY_EXIT_FAILURE @@ -71,86 +71,86 @@ void RDOLexer::LexerOutput(const char* buf, int size) void RDOLexer::LexerError(const char msg[]) { - std::cerr << msg << '\n'; - exit(YY_EXIT_FAILURE); + std::cerr << msg << '\n'; + exit(YY_EXIT_FAILURE); } void RDOLexer::loc_init() { - if (m_lploc) - { - m_lploc->m_first_line = 0; - m_lploc->m_first_pos = 0; - m_lploc->m_last_line = 0; - m_lploc->m_last_pos = 0; - m_lploc->m_first_seek = 0; - m_lploc->m_last_seek = 0; - } + if (m_lploc) + { + m_lploc->m_first_line = 0; + m_lploc->m_first_pos = 0; + m_lploc->m_last_line = 0; + m_lploc->m_last_pos = 0; + m_lploc->m_first_seek = 0; + m_lploc->m_last_seek = 0; + } } void RDOLexer::loc_action() { - if (m_lploc) - { - m_lploc->m_first_line = m_lploc->m_last_line; - m_lploc->m_first_pos = m_lploc->m_last_pos; - m_lploc->m_first_seek = m_lploc->m_last_seek; - for (int i = 0; i < YYLeng(); i++) - { - switch (YYText()[i]) - { - case '\n': - m_lploc->m_last_line++; - m_lploc->m_last_pos = 0; - break; - case '\r': - m_lploc->m_last_pos = 0; - break; - default: - m_lploc->m_last_pos++; - break; - } - - m_lploc->m_last_seek++; - } - } + if (m_lploc) + { + m_lploc->m_first_line = m_lploc->m_last_line; + m_lploc->m_first_pos = m_lploc->m_last_pos; + m_lploc->m_first_seek = m_lploc->m_last_seek; + for (int i = 0; i < YYLeng(); i++) + { + switch (YYText()[i]) + { + case '\n': + m_lploc->m_last_line++; + m_lploc->m_last_pos = 0; + break; + case '\r': + m_lploc->m_last_pos = 0; + break; + default: + m_lploc->m_last_pos++; + break; + } + + m_lploc->m_last_seek++; + } + } } void RDOLexer::loc_delta_pos(int value) { - if (m_lploc) - { - m_lploc->m_first_pos += value; - m_lploc->m_last_pos += value; - } + if (m_lploc) + { + m_lploc->m_first_pos += value; + m_lploc->m_last_pos += value; + } } void RDOLexer::setvalue(int value) { - *m_lpval = value; + *m_lpval = value; } void RDOLexer::enumBegin() { - m_enumEmpty = false; + m_enumEmpty = false; } void RDOLexer::enumReset() { - m_enumEmpty = true; + m_enumEmpty = true; } bool RDOLexer::enumEmpty() { - return m_enumEmpty; + return m_enumEmpty; } extern "C" { - int yywrap(void) - { - return 1; - } + int yywrap(void) + { + return 1; + } } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdoparser_lexer.h b/simulator/compiler/parser/rdoparser_lexer.h index 953a13594..eeb8f0bdc 100644 --- a/simulator/compiler/parser/rdoparser_lexer.h +++ b/simulator/compiler/parser/rdoparser_lexer.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_LEXER_H_ -#define _RDOPARSER_LEXER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -24,38 +23,36 @@ PREDECLARE_POINTER(RDOParser); class RDOLexer: public yyFlexLexer { public: - RDOLexer(const LPRDOParser& pParser, std::istream* yyin, std::ostream* yyout); + RDOLexer(const LPRDOParser& pParser, std::istream* yyin, std::ostream* yyout); - void loc_init(); - void loc_action(); - void loc_delta_pos(int value); - void setvalue(int value); + void loc_init(); + void loc_action(); + void loc_delta_pos(int value); + void setvalue(int value); - const LPRDOParser& parser() const; + const LPRDOParser& parser() const; - void enumBegin(); - void enumReset(); - bool enumEmpty(); + void enumBegin(); + void enumReset(); + bool enumEmpty(); - int* m_lpval; - YYLTYPE* m_lploc; + int* m_lpval; + YYLTYPE* m_lploc; protected: - virtual int LexerInput(char* buf, int max_size); - virtual void LexerOutput(const char* buf, int size); - virtual void LexerError(const char* msg); + virtual int LexerInput(char* buf, int max_size); + virtual void LexerOutput(const char* buf, int size); + virtual void LexerError(const char* msg); private: - std::istream* m_yyin; - std::ostream* m_yyout; - LPRDOParser m_pParser; - bool m_enumEmpty; - int m_array_param_cnt; + std::istream* m_yyin; + std::ostream* m_yyout; + LPRDOParser m_pParser; + bool m_enumEmpty; + int m_array_param_cnt; }; CLOSE_RDO_PARSER_NAMESPACE #define LEXER reinterpret_cast(lexer) #define LEXER_POS (*LEXER->m_lploc) - -#endif // _RDOPARSER_LEXER_H_ diff --git a/simulator/compiler/parser/rdoparser_rdo.cpp b/simulator/compiler/parser/rdoparser_rdo.cpp index db6db1b12..893ad5086 100644 --- a/simulator/compiler/parser/rdoparser_rdo.cpp +++ b/simulator/compiler/parser/rdoparser_rdo.cpp @@ -23,92 +23,87 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------------------------------------------------------------------- // -------------------- RDOParserRDOItem // -------------------------------------------------------------------------------- -RDOParserRDOItem::RDOParserRDOItem(rdo::model::FileType type, t_bison_parse_fun parser_fun, t_flex_lexer_fun lexer_fun, StreamFrom from) - : RDOParserItem(type, parser_fun, lexer_fun, from) - , m_pLexer(NULL) +RDOParserRDOItem::RDOParserRDOItem(rdo::FileType type, t_bison_parse_fun parser_fun, t_flex_lexer_fun lexer_fun, StreamFrom from) + : RDOParserItem(type, parser_fun, lexer_fun, from) + , m_pLexer(NULL) {} RDOParserRDOItem::~RDOParserRDOItem() { - if (m_pLexer) - { - delete m_pLexer; - m_pLexer = NULL; - } + if (m_pLexer) + { + delete m_pLexer; + m_pLexer = NULL; + } } void RDOParserRDOItem::parse(const LPRDOParser& pParser) { - ASSERT(pParser); - - std::stringstream in_stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); - switch (m_from) - { - case sf_repository: - { - rdo::repository::RDOThreadRepository::FileData fileData(m_type, in_stream); - kernel->sendMessage(kernel->repository(), RDOThread::RT_REPOSITORY_LOAD, &fileData); - break; - } - case sf_editor: - { - rdo::repository::RDOThreadRepository::FileData fileData(m_type, in_stream); - kernel->sendMessage(kernel->studio(), RDOThread::RT_STUDIO_MODEL_GET_TEXT, &fileData); - break; - } - } - if (in_stream.good()) - { - parse(pParser, in_stream); - } + ASSERT(pParser); + + std::stringstream in_stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); + switch (m_from) + { + case StreamFrom::REPOSITORY: + { + rdo::repository::RDOThreadRepository::FileData fileData(m_type, in_stream); + kernel->sendMessage(kernel->repository(), RDOThread::Message::REPOSITORY_LOAD, &fileData); + break; + } + + case StreamFrom::EDITOR: + { + rdo::repository::RDOThreadRepository::FileData fileData(m_type, in_stream); + kernel->sendMessage(kernel->studio(), RDOThread::Message::STUDIO_MODEL_GET_TEXT, &fileData); + break; + } + } + + if (in_stream.good()) + parse(pParser, in_stream); } void RDOParserRDOItem::parse(const LPRDOParser& pParser, std::istream& in_stream) { - ASSERT(pParser ); - ASSERT(!m_pLexer); - - std::ostringstream out_stream; - m_pLexer = getLexer(pParser, &in_stream, &out_stream); - - if (m_pLexer) - { - if (m_parser_fun) - { - m_parser_fun(m_pLexer); - } - delete m_pLexer; - m_pLexer = NULL; - } + ASSERT(pParser ); + ASSERT(!m_pLexer); + + std::ostringstream out_stream; + m_pLexer = getLexer(pParser, &in_stream, &out_stream); + + if (m_pLexer) + { + if (m_parser_fun) + m_parser_fun(m_pLexer); + + delete m_pLexer; + m_pLexer = NULL; + } } RDOLexer* RDOParserRDOItem::getLexer(const LPRDOParser& pParser, std::istream* in_stream, std::ostream* out_stream) { - ASSERT(pParser); - return new RDOLexer(pParser, in_stream, out_stream); + ASSERT(pParser); + return new RDOLexer(pParser, in_stream, out_stream); } std::size_t RDOParserRDOItem::lexer_loc_line() { - if (m_pLexer) - { - return m_pLexer->m_lploc ? m_pLexer->m_lploc->m_first_line : m_pLexer->lineno(); - } - else - { - return std::size_t(rdo::runtime::RDOSrcInfo::Position::UNDEFINE_LINE); - } + if (m_pLexer) + return m_pLexer->m_lploc ? m_pLexer->m_lploc->m_first_line : m_pLexer->lineno(); + else + return std::size_t(rdo::runtime::RDOSrcInfo::Position::UNDEFINE_LINE); } std::size_t RDOParserRDOItem::lexer_loc_pos() { - return m_pLexer && m_pLexer->m_lploc ? m_pLexer->m_lploc->m_first_pos : 0; + return m_pLexer && m_pLexer->m_lploc ? m_pLexer->m_lploc->m_first_pos : 0; } std::string RDOParserRDOItem::text() const { - ASSERT(m_pLexer); - return m_pLexer->YYText(); + ASSERT(m_pLexer); + return m_pLexer->YYText(); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdoparser_rdo.h b/simulator/compiler/parser/rdoparser_rdo.h index 68d5182d5..23527395b 100644 --- a/simulator/compiler/parser/rdoparser_rdo.h +++ b/simulator/compiler/parser/rdoparser_rdo.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_RDO_H_ -#define _RDOPARSER_RDO_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -22,25 +21,23 @@ class RDOParserRDOItem: public RDOParserItem { DECLARE_FACTORY(RDOParserRDOItem); public: - virtual void parse(const LPRDOParser& pParser); - virtual std::size_t lexer_loc_line(); - virtual std::size_t lexer_loc_pos(); + virtual void parse(const LPRDOParser& pParser); + virtual std::size_t lexer_loc_line(); + virtual std::size_t lexer_loc_pos(); - std::string text() const; + std::string text() const; protected: - RDOParserRDOItem(rdo::model::FileType _type, t_bison_parse_fun _parser_fun, t_flex_lexer_fun _lexer_fun, StreamFrom from = sf_repository); - virtual ~RDOParserRDOItem(); + RDOParserRDOItem(rdo::FileType _type, t_bison_parse_fun _parser_fun, t_flex_lexer_fun _lexer_fun, StreamFrom from = StreamFrom::REPOSITORY); + virtual ~RDOParserRDOItem(); - RDOLexer* m_pLexer; - YYLTYPE m_loc; + RDOLexer* m_pLexer; + YYLTYPE m_loc; private: - void parse(const LPRDOParser& pParser, std::istream& in_stream); - RDOLexer* getLexer(const LPRDOParser& pParser, std::istream* in_stream, std::ostream* out_stream); + void parse(const LPRDOParser& pParser, std::istream& in_stream); + RDOLexer* getLexer(const LPRDOParser& pParser, std::istream* in_stream, std::ostream* out_stream); }; DECLARE_POINTER(RDOParserRDOItem); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_RDO_H_ diff --git a/simulator/compiler/parser/rdopat.cpp b/simulator/compiler/parser/rdopat.cpp index 545c316ea..6da16d2f8 100644 --- a/simulator/compiler/parser/rdopat.cpp +++ b/simulator/compiler/parser/rdopat.cpp @@ -17,9 +17,9 @@ OPEN_RDO_PARSER_NAMESPACE int patlex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void paterror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -27,9 +27,9 @@ void paterror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) int evnlex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void evnerror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -37,9 +37,9 @@ void evnerror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) int evn_preparse_lex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void evn_preparse_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -49,21 +49,21 @@ void evn_preparse_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*messa // -------------------- RDOPATPattern // -------------------------------------------------------------------------------- RDOPATPattern::RDOPATPattern(const RDOParserSrcInfo& name_src_info) - : RDOParserSrcInfo (name_src_info) - , m_useCommonChoice (false ) - , m_currentRelResIndex(0 ) + : RDOParserSrcInfo (name_src_info) + , m_useCommonChoice (false ) + , m_currentRelResIndex(0 ) { - LPRDOPATPattern pPatternExist = RDOParser::s_parser()->findPATPattern(src_text()); - if (pPatternExist) - { - parser::g_error().push_only(src_info(), rdo::format("Паттерн '%s' уже существует", name().c_str())); - parser::g_error().push_only(pPatternExist->src_info(), "См. первое определение"); - parser::g_error().push_done(); - } - RDOParser::s_parser()->insertPATPattern(this); + LPRDOPATPattern pPatternExist = RDOParser::s_parser()->findPATPattern(src_text()); + if (pPatternExist) + { + parser::g_error().push_only(src_info(), rdo::format("Паттерн '%s' уже существует", name().c_str())); + parser::g_error().push_only(pPatternExist->src_info(), "См. первое определение"); + parser::g_error().push_done(); + } + RDOParser::s_parser()->insertPATPattern(this); - m_pContextMemory = rdo::Factory::create(); - ASSERT(m_pContextMemory); + m_pContextMemory = rdo::Factory::create(); + ASSERT(m_pContextMemory); } RDOPATPattern::~RDOPATPattern() @@ -71,102 +71,102 @@ RDOPATPattern::~RDOPATPattern() void RDOPATPattern::pushContext() { - RDOParser::s_parser()->contextStack()->push(this); - RDOParser::s_parser()->contextStack()->push(m_pContextMemory); - ContextMemory::push(); + RDOParser::s_parser()->contextStack()->push(this); + RDOParser::s_parser()->contextStack()->push(m_pContextMemory); + ContextMemory::push(); } void RDOPATPattern::popContext() { - ContextMemory::pop(); - RDOParser::s_parser()->contextStack()->pop(); - RDOParser::s_parser()->contextStack()->pop(); + ContextMemory::pop(); + RDOParser::s_parser()->contextStack()->pop(); + RDOParser::s_parser()->contextStack()->pop(); } -std::string RDOPATPattern::typeToString(PatType type) const +std::string RDOPATPattern::typeToString(Type type) { - switch (type) - { - case PT_Event : return "событие"; - case PT_Rule : return "продукционное правило"; - case PT_Operation: return "операция"; - case PT_Keyboard : return "клавиатурная операция"; - default : return "неизвестный"; - } + switch (type) + { + case Type::EVENT : return "событие"; + case Type::RULE : return "продукционное правило"; + case Type::OPERATION: return "операция"; + case Type::KEYBOARD : return "клавиатурная операция"; + default: return "неизвестный"; + } } LPRDORelevantResource RDOPATPattern::findRelRes(const std::string& identifier, const RDOParserSrcInfo& srcInfo) const { - //! Релевантные ресурсы - LPRDORelevantResource pRelevantResource = findRelevantResource(identifier); - if (pRelevantResource) - { - if (!m_pCurrRelRes) - { - //! Внутри with_min-common-choice или $Time - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_NonExist || pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Create) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс не может быть использован, т.к. он еще не существует: %s", pRelevantResource->name().c_str())); - } - } - else - { - //! Внутри $Body - //! Проверяем использование неинициализированного рел.ресурса (pRelevantResource) в Choice from другом рел.ресурсе (m_pCurrRelRes) - if (m_pCurrRelRes->isChoiceFromState()) - { - if (!pRelevantResource->m_alreadyHaveConverter && !pRelevantResource->isDirect()) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс не определен: %s. Его нельзя использовать в условиях выбора других ресурсов до его собственного Choice from", pRelevantResource->name().c_str())); - } - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_NonExist) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс в начале операции не существует (NonExist): %s", pRelevantResource->name().c_str())); - } - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Create) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Сразу после создания (Create) релевантный ресурс '%s' можно использовать только в конверторах, но не в условии выбора", pRelevantResource->name().c_str())); - } - } - //! Проверяем использование временного рел.ресурса внутри конвертора другого рел.ресурса - if (pRelevantResource->getType()->isTemporary()) - { - //! В конверторе начала - if (m_pCurrRelRes->m_currentState == RDORelevantResource::convertBegin) - { - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Create && !pRelevantResource->m_alreadyHaveConverter) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс нельзя использовать до его создания (Create): %s", pRelevantResource->name().c_str())); - } - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Erase && pRelevantResource->m_alreadyHaveConverter) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс нельзя использовать после удаления (Erase): %s", pRelevantResource->name().c_str())); - } - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_NonExist) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс не существует в этом конверторе (NonExist): %s", pRelevantResource->name().c_str())); - } - } - //! В конверторе конца - if (m_pCurrRelRes->m_currentState == RDORelevantResource::convertEnd) - { - if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::CS_Create && !pRelevantResource->m_alreadyHaveConverter) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс нельзя использовать до его создания (Create): %s", pRelevantResource->name().c_str())); - } - if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::CS_Erase && pRelevantResource->m_alreadyHaveConverter) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс нельзя использовать после удаления (Erase): %s", pRelevantResource->name().c_str())); - } - if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::CS_NonExist) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс не существует в этом конверторе (NonExist): %s", pRelevantResource->name().c_str())); - } - } - } - } - } - return pRelevantResource; + // Релевантные ресурсы + LPRDORelevantResource pRelevantResource = findRelevantResource(identifier); + if (pRelevantResource) + { + if (!m_pCurrRelRes) + { + // Внутри with_min-common-choice или $Time + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NONEXIST || pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс не может быть использован, т.к. он еще не существует: %s", pRelevantResource->name().c_str())); + } + } + else + { + // Внутри $Body + // Проверяем использование неинициализированного рел.ресурса (pRelevantResource) в Choice from другом рел.ресурсе (m_pCurrRelRes) + if (m_pCurrRelRes->isChoiceFromState()) + { + if (!pRelevantResource->m_alreadyHaveConverter && !pRelevantResource->isDirect()) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс не определен: %s. Его нельзя использовать в условиях выбора других ресурсов до его собственного Choice from", pRelevantResource->name().c_str())); + } + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс в начале операции не существует (NonExist): %s", pRelevantResource->name().c_str())); + } + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Сразу после создания (Create) релевантный ресурс '%s' можно использовать только в конверторах, но не в условии выбора", pRelevantResource->name().c_str())); + } + } + // Проверяем использование временного рел.ресурса внутри конвертора другого рел.ресурса + if (pRelevantResource->getType()->isTemporary()) + { + // В конверторе начала + if (m_pCurrRelRes->m_currentState == RDORelevantResource::State::CONVERT_BEGIN) + { + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::CREATE && !pRelevantResource->m_alreadyHaveConverter) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс нельзя использовать до его создания (Create): %s", pRelevantResource->name().c_str())); + } + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE && pRelevantResource->m_alreadyHaveConverter) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс нельзя использовать после удаления (Erase): %s", pRelevantResource->name().c_str())); + } + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс не существует в этом конверторе (NonExist): %s", pRelevantResource->name().c_str())); + } + } + // В конверторе конца + if (m_pCurrRelRes->m_currentState == RDORelevantResource::State::CONVERT_END) + { + if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::ConvertStatus::CREATE && !pRelevantResource->m_alreadyHaveConverter) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс нельзя использовать до его создания (Create): %s", pRelevantResource->name().c_str())); + } + if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::ConvertStatus::ERASE && pRelevantResource->m_alreadyHaveConverter) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс нельзя использовать после удаления (Erase): %s", pRelevantResource->name().c_str())); + } + if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Релевантный ресурс не существует в этом конверторе (NonExist): %s", pRelevantResource->name().c_str())); + } + } + } + } + } + return pRelevantResource; } namespace @@ -174,545 +174,545 @@ namespace LPExpression contextParameters(const LPRDOParam& param, std::size_t paramID, const RDOParserSrcInfo& srcInfo) { - return rdo::Factory::create( - param->getTypeInfo(), - rdo::Factory::create(paramID), - srcInfo - ); + return rdo::Factory::create( + param->getTypeInfo(), + rdo::Factory::create(paramID), + srcInfo + ); } void pushRelevantResourceContext(const LPRDORelevantResource& pRelevantResource) { - RDOParser::s_parser()->contextStack()->push(pRelevantResource); + RDOParser::s_parser()->contextStack()->push(pRelevantResource); } void popRelevantResourceContext() { - if (RDOParser::s_parser()->contextStack()->top().object_dynamic_cast()) - { - RDOParser::s_parser()->contextStack()->pop(); - } + if (RDOParser::s_parser()->contextStack()->top().object_dynamic_cast()) + { + RDOParser::s_parser()->contextStack()->pop(); + } } } Context::LPFindResult RDOPATPattern::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const { - Context::LPFindResult result = m_pContextMemory->onFindContext(method, params, srcInfo); - if (result->getCreateExpression()) - { - return result; - } - - if (method == Context::METHOD_GET || method == Context::METHOD_OPERATOR_DOT) - { - const std::string identifier = params.identifier(); - - LPRDORelevantResource pRelevantResource = findRelRes(identifier, srcInfo); - if (pRelevantResource) - { - if (method == Context::METHOD_OPERATOR_DOT) - { - return rdo::Factory::create(SwitchContext(pRelevantResource, params)); - } - - if (method == Context::METHOD_GET) - { - return pRelevantResource->find(Context::METHOD_GET, params, srcInfo); - } - } - LPRDOParam pParam = findPATPatternParam(identifier); - if (pParam) - { - if (method == Context::METHOD_GET) - { - return rdo::Factory::create(CreateExpression(boost::bind(&contextParameters, pParam, findPATPatternParamNum(identifier), srcInfo))); - } - if (method == Context::METHOD_OPERATOR_DOT) - { - LPRDOPATPattern pThis(const_cast(this)); - return rdo::Factory::create(SwitchContext(pThis, params)); - } - } - } - - return rdo::Factory::create(); + Context::LPFindResult result = m_pContextMemory->onFindContext(method, params, srcInfo); + if (result->getCreateExpression()) + { + return result; + } + + if (method == Context::METHOD_GET || method == Context::METHOD_OPERATOR_DOT) + { + const std::string identifier = params.identifier(); + + LPRDORelevantResource pRelevantResource = findRelRes(identifier, srcInfo); + if (pRelevantResource) + { + if (method == Context::METHOD_OPERATOR_DOT) + { + return rdo::Factory::create(SwitchContext(pRelevantResource, params)); + } + + if (method == Context::METHOD_GET) + { + return pRelevantResource->find(Context::METHOD_GET, params, srcInfo); + } + } + LPRDOParam pParam = findPATPatternParam(identifier); + if (pParam) + { + if (method == Context::METHOD_GET) + { + return rdo::Factory::create(CreateExpression(boost::bind(&contextParameters, pParam, findPATPatternParamNum(identifier), srcInfo))); + } + if (method == Context::METHOD_OPERATOR_DOT) + { + LPRDOPATPattern pThis(const_cast(this)); + return rdo::Factory::create(SwitchContext(pThis, params)); + } + } + } + + return rdo::Factory::create(); } std::string RDOPATPattern::StatusToStr(rdo::runtime::RDOResource::ConvertStatus value) { - switch (value) - { - case rdo::runtime::RDOResource::CS_Keep : return "Keep"; - case rdo::runtime::RDOResource::CS_Create : return "Create"; - case rdo::runtime::RDOResource::CS_Erase : return "Erase"; - case rdo::runtime::RDOResource::CS_NonExist: return "NonExist"; - case rdo::runtime::RDOResource::CS_NoChange: return "NoChange"; - default : NEVER_REACH_HERE; - } - return std::string(); + switch (value) + { + case rdo::runtime::RDOResource::ConvertStatus::KEEP : return "Keep"; + case rdo::runtime::RDOResource::ConvertStatus::CREATE : return "Create"; + case rdo::runtime::RDOResource::ConvertStatus::ERASE : return "Erase"; + case rdo::runtime::RDOResource::ConvertStatus::NONEXIST: return "NonExist"; + case rdo::runtime::RDOResource::ConvertStatus::NOCHANGE: return "NoChange"; + default : NEVER_REACH_HERE; + } + return std::string(); } rdo::runtime::RDOResource::ConvertStatus RDOPATPattern::StrToStatus(const std::string& value, const YYLTYPE& convertor_pos) { - if (value == "Keep" || value == "keep") - { - return rdo::runtime::RDOResource::CS_Keep; - } - else if (value == "Create" || value == "create") - { - return rdo::runtime::RDOResource::CS_Create; - } - else if (value == "Erase" || value == "erase") - { - return rdo::runtime::RDOResource::CS_Erase; - } - else if (value == "NonExist" || value == "nonexist") - { - return rdo::runtime::RDOResource::CS_NonExist; - } - else if (value == "NoChange" || value == "nochange") - { - return rdo::runtime::RDOResource::CS_NoChange; - } - parser::g_error().error(convertor_pos, rdo::format("Неверный статус конвертора: %s", value.c_str())); - return rdo::runtime::RDOResource::CS_Keep; + if (value == "Keep" || value == "keep") + { + return rdo::runtime::RDOResource::ConvertStatus::KEEP; + } + else if (value == "Create" || value == "create") + { + return rdo::runtime::RDOResource::ConvertStatus::CREATE; + } + else if (value == "Erase" || value == "erase") + { + return rdo::runtime::RDOResource::ConvertStatus::ERASE; + } + else if (value == "NonExist" || value == "nonexist") + { + return rdo::runtime::RDOResource::ConvertStatus::NONEXIST; + } + else if (value == "NoChange" || value == "nochange") + { + return rdo::runtime::RDOResource::ConvertStatus::NOCHANGE; + } + parser::g_error().error(convertor_pos, rdo::format("Неверный статус конвертора: %s", value.c_str())); + return rdo::runtime::RDOResource::ConvertStatus::KEEP; } void RDOPATPattern::beforeRelRensert(const RDOParserSrcInfo& rel_info) { - if (findRelevantResource(rel_info.src_text())) - { - parser::g_error().error(rel_info, rdo::format("Релевантный ресурс '%s' уже определен", rel_info.src_text().c_str())); - } + if (findRelevantResource(rel_info.src_text())) + { + parser::g_error().error(rel_info, rdo::format("Релевантный ресурс '%s' уже определен", rel_info.src_text().c_str())); + } } void RDOPATPattern::rel_res_insert(const LPRDORelevantResource& pRelevantResource) { - ASSERT(pRelevantResource); + ASSERT(pRelevantResource); - switch (getType()) - { - case PT_Event : getPatRuntime()->addConvertorStatus (pRelevantResource->m_statusBegin); break; - case PT_Rule : getPatRuntime()->addConvertorStatus (pRelevantResource->m_statusBegin); break; - case PT_Operation: getPatRuntime()->addConvertorBeginStatus(pRelevantResource->m_statusBegin); break; - case PT_Keyboard : getPatRuntime()->addConvertorBeginStatus(pRelevantResource->m_statusBegin); break; - default : parser::g_error().error(src_info(), "Неизвестный тип образца"); - } - m_relResList.push_back(pRelevantResource); + switch (getType()) + { + case Type::EVENT : getPatRuntime()->addConvertorStatus (pRelevantResource->m_statusBegin); break; + case Type::RULE : getPatRuntime()->addConvertorStatus (pRelevantResource->m_statusBegin); break; + case Type::OPERATION: getPatRuntime()->addConvertorBeginStatus(pRelevantResource->m_statusBegin); break; + case Type::KEYBOARD : getPatRuntime()->addConvertorBeginStatus(pRelevantResource->m_statusBegin); break; + default: parser::g_error().error(src_info(), "Неизвестный тип образца"); + } + m_relResList.push_back(pRelevantResource); } void RDOPATPattern::addRelResConvert(bool trace, const LPExpression& pStatementList, const YYLTYPE& convertor_pos, const YYLTYPE& trace_pos, rdo::runtime::RDOResource::ConvertStatus status) { - ASSERT(pStatementList); - ASSERT(m_pCurrRelRes ); - - if (status == rdo::runtime::RDOResource::CS_NoChange || status == rdo::runtime::RDOResource::CS_NonExist) - { - parser::g_error().error(convertor_pos, getErrorMessage_NotNeedConvertor(m_pCurrRelRes->name(), status)); - } - - if (status == rdo::runtime::RDOResource::CS_Create) - { - addParamSetCalc(createRelRes(trace)); - } - else - { - if (trace) - { - parser::g_error().error(trace_pos, "Признак трассировки в данном месте возможен только для создаваемого ресурса"); - } - } - rdo::runtime::LPRDOCalcBaseStatementList pBaseStatementList = pStatementList->calc().object_dynamic_cast(); - ASSERT(pBaseStatementList); - - rdo::runtime::RDOCalc::RDOCalcList pCalcList = pBaseStatementList->statementList(); - ASSERT(!pCalcList.empty()); - - for (const auto& calc: pCalcList) - { - ASSERT(calc); - rdo::runtime::LPRDOCalcStatementList pStatementList = calc.object_dynamic_cast(); - if (pStatementList) - { - if (pStatementList->statementList().empty() && status == rdo::runtime::RDOResource::CS_Keep) - { - parser::g_error().warning(convertor_pos, getWarningMessage_EmptyConvertor(m_pCurrRelRes->name(), status)); - } - } - } - - addParamSetCalc(pStatementList->calc()); + ASSERT(pStatementList); + ASSERT(m_pCurrRelRes ); + + if (status == rdo::runtime::RDOResource::ConvertStatus::NOCHANGE || status == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + parser::g_error().error(convertor_pos, getErrorMessage_NotNeedConvertor(m_pCurrRelRes->name(), status)); + } + + if (status == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + addParamSetCalc(createRelRes(trace)); + } + else + { + if (trace) + { + parser::g_error().error(trace_pos, "Признак трассировки в данном месте возможен только для создаваемого ресурса"); + } + } + rdo::runtime::LPRDOCalcBaseStatementList pBaseStatementList = pStatementList->calc().object_dynamic_cast(); + ASSERT(pBaseStatementList); + + rdo::runtime::RDOCalc::RDOCalcList pCalcList = pBaseStatementList->statementList(); + ASSERT(!pCalcList.empty()); + + for (const auto& calc: pCalcList) + { + ASSERT(calc); + rdo::runtime::LPRDOCalcStatementList pStatementList = calc.object_dynamic_cast(); + if (pStatementList) + { + if (pStatementList->statementList().empty() && status == rdo::runtime::RDOResource::ConvertStatus::KEEP) + { + parser::g_error().warning(convertor_pos, getWarningMessage_EmptyConvertor(m_pCurrRelRes->name(), status)); + } + } + } + + addParamSetCalc(pStatementList->calc()); } void RDOPATPattern::addParamSetCalc(const rdo::runtime::LPRDOCalc& pCalc) { - switch (getType()) - { - case PT_Event : getPatRuntime()->addConvertorCalc(pCalc); break; - case PT_Rule : getPatRuntime()->addConvertorCalc(pCalc); break; - case PT_Operation: NEVER_REACH_HERE; - case PT_Keyboard : NEVER_REACH_HERE; - default : parser::g_error().error(src_info(), "Неизвестный тип образца"); - } + switch (getType()) + { + case Type::EVENT : getPatRuntime()->addConvertorCalc(pCalc); break; + case Type::RULE : getPatRuntime()->addConvertorCalc(pCalc); break; + case Type::OPERATION: NEVER_REACH_HERE; + case Type::KEYBOARD : NEVER_REACH_HERE; + default: parser::g_error().error(src_info(), "Неизвестный тип образца"); + } } std::vector RDOPATPattern::createParamsCalcs(const std::vector& params) const { - std::vector result; - result.reserve(m_paramList.size()); - - std::size_t currParam = 0; - for (const LPRDOFUNArithm& pParam: params) - { - ASSERT(pParam); - if (currParam < m_paramList.size()) - { - rdo::runtime::LPRDOCalc pParamValueCalc; - LPRDOParam pPatternParam = m_paramList[currParam]; - ASSERT(pPatternParam); - if (pParam->typeInfo()->src_info().src_text() == "*") - { - if (!pPatternParam->getDefault()->defined()) - { - RDOParser::s_parser()->error().push_only(pPatternParam->src_info(), rdo::format("Нет значения по умолчанию для параметра '%s'", pPatternParam->src_text().c_str())); - RDOParser::s_parser()->error().push_only(pPatternParam->src_info(), rdo::format("См. параметр '%s', тип '%s'", pPatternParam->src_text().c_str(), pPatternParam->getTypeInfo()->src_info().src_text().c_str())); - RDOParser::s_parser()->error().push_done(); - } - rdo::runtime::RDOValue value = pPatternParam->getDefault()->value(); - ASSERT(value); - pParamValueCalc = rdo::Factory::create(value); - } - else - { - LPTypeInfo pTypeInfo = pPatternParam->getTypeInfo(); - ASSERT(pTypeInfo); - pParamValueCalc = pParam->createCalc(pTypeInfo); - } - ASSERT(pParamValueCalc); - result.push_back(pParamValueCalc); - ++currParam; - } - else - { - RDOParser::s_parser()->error().error(pParam->src_info(), rdo::format("Слишком много параметров для события '%s'", name().c_str())); - } - } - - return result; + std::vector result; + result.reserve(m_paramList.size()); + + std::size_t currParam = 0; + for (const LPRDOFUNArithm& pParam: params) + { + ASSERT(pParam); + if (currParam < m_paramList.size()) + { + rdo::runtime::LPRDOCalc pParamValueCalc; + LPRDOParam pPatternParam = m_paramList[currParam]; + ASSERT(pPatternParam); + if (pParam->typeInfo()->src_info().src_text() == "*") + { + if (!pPatternParam->getDefault()->defined()) + { + RDOParser::s_parser()->error().push_only(pPatternParam->src_info(), rdo::format("Нет значения по умолчанию для параметра '%s'", pPatternParam->src_text().c_str())); + RDOParser::s_parser()->error().push_only(pPatternParam->src_info(), rdo::format("См. параметр '%s', тип '%s'", pPatternParam->src_text().c_str(), pPatternParam->getTypeInfo()->src_info().src_text().c_str())); + RDOParser::s_parser()->error().push_done(); + } + rdo::runtime::RDOValue value = pPatternParam->getDefault()->value(); + ASSERT(value); + pParamValueCalc = rdo::Factory::create(value); + } + else + { + LPTypeInfo pTypeInfo = pPatternParam->getTypeInfo(); + ASSERT(pTypeInfo); + pParamValueCalc = pParam->createCalc(pTypeInfo); + } + ASSERT(pParamValueCalc); + result.push_back(pParamValueCalc); + ++currParam; + } + else + { + RDOParser::s_parser()->error().error(pParam->src_info(), rdo::format("Слишком много параметров для события '%s'", name().c_str())); + } + } + + return result; } std::string RDOPATPattern::getPatternId() const { - return m_pPatRuntime->traceId(); + return m_pPatRuntime->traceId(); } void RDOPATPattern::writeModelStructure(std::ostream& stream) const { - stream << getPatternId() << " " << name() << " " << getModelStructureLetter() << " " << m_relResList.size(); - for (const auto& resource: m_relResList) - stream << " " << resource->getType()->getNumber(); + stream << getPatternId() << " " << name() << " " << getModelStructureLetter() << " " << m_relResList.size(); + for (const auto& resource: m_relResList) + stream << " " << resource->getType()->getNumber(); - stream << std::endl; + stream << std::endl; } LPRDOParam RDOPATPattern::findPATPatternParam(const std::string& paramName) const { - ParamList::const_iterator it = std::find_if(m_paramList.begin(), m_paramList.end(), compareName(paramName)); - return it != m_paramList.end() ? (*it) : LPRDOParam(NULL); + ParamList::const_iterator it = std::find_if(m_paramList.begin(), m_paramList.end(), compareName(paramName)); + return it != m_paramList.end() ? (*it) : LPRDOParam(NULL); } LPRDORelevantResource RDOPATPattern::findRelevantResource(const std::string& resName) const { - RelResList::const_iterator it = std::find_if(m_relResList.begin(), m_relResList.end(), compareName(resName)); - return it != m_relResList.end() ? (*it) : LPRDORelevantResource(NULL); + RelResList::const_iterator it = std::find_if(m_relResList.begin(), m_relResList.end(), compareName(resName)); + return it != m_relResList.end() ? (*it) : LPRDORelevantResource(NULL); } int RDOPATPattern::findPATPatternParamNum(const std::string& paramName) const { - ParamList::const_iterator it = std::find_if(m_paramList.begin(), m_paramList.end(), compareName(paramName)); - return it != m_paramList.end() ? it - m_paramList.begin() : -1; + ParamList::const_iterator it = std::find_if(m_paramList.begin(), m_paramList.end(), compareName(paramName)); + return it != m_paramList.end() ? it - m_paramList.begin() : -1; } std::size_t RDOPATPattern::findRelevantResourceNum(const std::string& resName) const { - RelResList::const_iterator it = std::find_if(m_relResList.begin(), m_relResList.end(), compareName(resName)); - return it != m_relResList.end() ? it - m_relResList.begin() : std::size_t(~0); + RelResList::const_iterator it = std::find_if(m_relResList.begin(), m_relResList.end(), compareName(resName)); + return it != m_relResList.end() ? it - m_relResList.begin() : std::size_t(~0); } void RDOPATPattern::add(const LPRDOParam& pParam) { - ASSERT(pParam); + ASSERT(pParam); - LPRDOParam pParamExist = findPATPatternParam(pParam->name()); - if (pParamExist) - { - parser::g_error().push_only(pParam->src_info(), rdo::format("Параметр '%s' уже определен", pParam->src_text().c_str())); - parser::g_error().push_only(pParamExist->src_info(), "См. первое определение"); - parser::g_error().push_done(); - } - m_paramList.push_back(pParam); + LPRDOParam pParamExist = findPATPatternParam(pParam->name()); + if (pParamExist) + { + parser::g_error().push_only(pParam->src_info(), rdo::format("Параметр '%s' уже определен", pParam->src_text().c_str())); + parser::g_error().push_only(pParamExist->src_info(), "См. первое определение"); + parser::g_error().push_done(); + } + m_paramList.push_back(pParam); } void RDOPATPattern::setCommonChoiceFirst() { - m_useCommonChoice = true; - m_pCommonChoice = NULL; -// parser::g_error().error("Вызывать нельзя, т.к. в сообщениях об ошибках используется m_pCommonChoice"); + m_useCommonChoice = true; + m_pCommonChoice = NULL; +// parser::g_error().error("Вызывать нельзя, т.к. в сообщениях об ошибках используется m_pCommonChoice"); } void RDOPATPattern::setCommonChoiceWithMin(const LPRDOFUNArithm& arithm) { - m_useCommonChoice = true; - m_useCommonWithMax = false; - m_pCommonChoice = arithm; + m_useCommonChoice = true; + m_useCommonWithMax = false; + m_pCommonChoice = arithm; } void RDOPATPattern::setCommonChoiceWithMax(const LPRDOFUNArithm& arithm) { - m_useCommonChoice = true; - m_useCommonWithMax = true; - m_pCommonChoice = arithm; + m_useCommonChoice = true; + m_useCommonWithMax = true; + m_pCommonChoice = arithm; } void RDOPATPattern::setTime(LPRDOFUNArithm& arithm) { - switch (getType()) - { - case PT_Operation: getPatRuntime()->setTime(arithm->createCalc(NULL)); break; - case PT_Keyboard : getPatRuntime()->setTime(arithm->createCalc(NULL)); break; - default : parser::g_error().error(src_info(), rdo::format("Для образца типа %s недопустимо использование выражения времени", typeToString(getType()).c_str())); - } + switch (getType()) + { + case Type::OPERATION: getPatRuntime()->setTime(arithm->createCalc(NULL)); break; + case Type::KEYBOARD : getPatRuntime()->setTime(arithm->createCalc(NULL)); break; + default: parser::g_error().error(src_info(), rdo::format("Для образца типа %s недопустимо использование выражения времени", typeToString(getType()).c_str())); + } } void RDOPATPattern::addChoiceFromCalc(const rdo::runtime::LPRDOCalc& pCalc) { - switch (getType()) - { - case PT_Event : getPatRuntime()->addPreSelectRelRes(pCalc); break; - case PT_Rule : getPatRuntime()->addChoiceFromCalc (pCalc); break; - case PT_Operation: getPatRuntime()->addChoiceFromCalc (pCalc); break; - case PT_Keyboard : getPatRuntime()->addChoiceFromCalc (pCalc); break; - default : parser::g_error().error(src_info(), rdo::format("Для образца типа %s недопустимо использование условния выбора", typeToString(getType()).c_str())); - } + switch (getType()) + { + case Type::EVENT : getPatRuntime()->addPreSelectRelRes(pCalc); break; + case Type::RULE : getPatRuntime()->addChoiceFromCalc (pCalc); break; + case Type::OPERATION: getPatRuntime()->addChoiceFromCalc (pCalc); break; + case Type::KEYBOARD : getPatRuntime()->addChoiceFromCalc (pCalc); break; + default: parser::g_error().error(src_info(), rdo::format("Для образца типа %s недопустимо использование условния выбора", typeToString(getType()).c_str())); + } } void RDOPATPattern::addRelResBody(const RDOParserSrcInfo& body_name) { - RelResList::const_iterator it = std::find_if(m_relResList.begin(), m_relResList.end(), compareName(body_name.src_text())); - if (it == m_relResList.end()) - { - parser::g_error().error(body_name.src_info(), rdo::format("Неизвестный релевантный ресурс: %s", body_name.src_text().c_str())); - } - if (findRelevantResourceNum(body_name.src_text()) != m_currentRelResIndex) - { - const std::string rel_res_waiting = m_currentRelResIndex < m_relResList.size() ? m_relResList[m_currentRelResIndex]->name().c_str() : ""; - parser::g_error().error(body_name.src_info(), rdo::format("Ожидается описание релевантного ресурса '%s', вместо него найдено: %s", rel_res_waiting.c_str(), body_name.src_text().c_str())); - } - if ((*it)->m_alreadyHaveConverter) - { - parser::g_error().error(body_name.src_info(), rdo::format("Релевантный ресурс уже используется: %s", body_name.src_text().c_str())); - } - m_pCurrRelRes = (*it); - m_pCurrRelRes->m_bodySrcInfo = body_name; - m_pCurrRelRes->m_alreadyHaveConverter = true; - m_currentRelResIndex++; - - popRelevantResourceContext(); - pushRelevantResourceContext(m_pCurrRelRes); + RelResList::const_iterator it = std::find_if(m_relResList.begin(), m_relResList.end(), compareName(body_name.src_text())); + if (it == m_relResList.end()) + { + parser::g_error().error(body_name.src_info(), rdo::format("Неизвестный релевантный ресурс: %s", body_name.src_text().c_str())); + } + if (findRelevantResourceNum(body_name.src_text()) != m_currentRelResIndex) + { + const std::string rel_res_waiting = m_currentRelResIndex < m_relResList.size() ? m_relResList[m_currentRelResIndex]->name().c_str() : ""; + parser::g_error().error(body_name.src_info(), rdo::format("Ожидается описание релевантного ресурса '%s', вместо него найдено: %s", rel_res_waiting.c_str(), body_name.src_text().c_str())); + } + if ((*it)->m_alreadyHaveConverter) + { + parser::g_error().error(body_name.src_info(), rdo::format("Релевантный ресурс уже используется: %s", body_name.src_text().c_str())); + } + m_pCurrRelRes = (*it); + m_pCurrRelRes->m_bodySrcInfo = body_name; + m_pCurrRelRes->m_alreadyHaveConverter = true; + m_currentRelResIndex++; + + popRelevantResourceContext(); + pushRelevantResourceContext(m_pCurrRelRes); } void RDOPATPattern::addRelResUsage(const LPRDOPATChoiceFrom& pChoiceFrom, const LPRDOPATChoiceOrder& pChoiceOrder) { - if (!m_useCommonChoice) - { - if (pChoiceOrder->m_type == rdo::runtime::RDOSelectResourceCalc::order_empty) - { - if ((m_pCurrRelRes->m_statusBegin != rdo::runtime::RDOResource::CS_Create) && (m_pCurrRelRes->m_statusEnd != rdo::runtime::RDOResource::CS_Create)) - { -// pChoiceOrder->m_type = rdo::runtime::RDOSelectResourceCalc::order_first; - } - } - else if (m_pCurrRelRes->isDirect()) - { - parser::g_error().warning(pChoiceOrder->src_info(), rdo::format("Правило выбора '%s' релевантного ресурса '%s' не имеет смысла, т.к. релевантный ресурс определен через имя, а не тип, и не может быть связан с каким-либо другим ресурсом", pChoiceOrder->src_text().c_str(), m_pCurrRelRes->name().c_str())); - } - } - else - { - if (pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::order_empty) - { - parser::g_error().push_only(pChoiceOrder->src_info(), "Нельзя указать способ выбора релевантного ресурса, т.к. используется единый для всех релевантных ресурсов способ, указанный до ключевого слова $Body"); - if (m_pCommonChoice) - { - parser::g_error().push_only(m_pCommonChoice->src_info(), rdo::format("См. '%s'", m_pCommonChoice->src_text().c_str())); - } - parser::g_error().push_done(); - } - } - - if ((m_pCurrRelRes->m_statusBegin == rdo::runtime::RDOResource::CS_Create) || (m_pCurrRelRes->m_statusEnd == rdo::runtime::RDOResource::CS_Create)) - { - if (pChoiceFrom->m_type != RDOPATChoiceFrom::ch_empty) - { - parser::g_error().error(pChoiceFrom->src_info(), "Релевантный ресурс создается, для него нельзя использовать Choice from или Choice NoCheck"); - } - if (pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::order_empty) - { - parser::g_error().error(pChoiceOrder->src_info(), rdo::format("Релевантный ресурс создается, для него нельзя использовать правило выбора '%s'", pChoiceOrder->asString().c_str())); - } - } - - m_pCurrRelRes->m_pChoiceFrom = pChoiceFrom; - m_pCurrRelRes->m_pChoiceOrder = pChoiceOrder; + if (!m_useCommonChoice) + { + if (pChoiceOrder->m_type == rdo::runtime::RDOSelectResourceCalc::Type::EMPTY) + { + if ((m_pCurrRelRes->m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::CREATE) && (m_pCurrRelRes->m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::CREATE)) + { +// pChoiceOrder->m_type = rdo::runtime::RDOSelectResourceCalc::Type::FIRST; + } + } + else if (m_pCurrRelRes->isDirect()) + { + parser::g_error().warning(pChoiceOrder->src_info(), rdo::format("Правило выбора '%s' релевантного ресурса '%s' не имеет смысла, т.к. релевантный ресурс определен через имя, а не тип, и не может быть связан с каким-либо другим ресурсом", pChoiceOrder->src_text().c_str(), m_pCurrRelRes->name().c_str())); + } + } + else + { + if (pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::Type::EMPTY) + { + parser::g_error().push_only(pChoiceOrder->src_info(), "Нельзя указать способ выбора релевантного ресурса, т.к. используется единый для всех релевантных ресурсов способ, указанный до ключевого слова $Body"); + if (m_pCommonChoice) + { + parser::g_error().push_only(m_pCommonChoice->src_info(), rdo::format("См. '%s'", m_pCommonChoice->src_text().c_str())); + } + parser::g_error().push_done(); + } + } + + if ((m_pCurrRelRes->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::CREATE) || (m_pCurrRelRes->m_statusEnd == rdo::runtime::RDOResource::ConvertStatus::CREATE)) + { + if (pChoiceFrom->m_type != RDOPATChoiceFrom::Type::EMPTY) + { + parser::g_error().error(pChoiceFrom->src_info(), "Релевантный ресурс создается, для него нельзя использовать Choice from или Choice NoCheck"); + } + if (pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::Type::EMPTY) + { + parser::g_error().error(pChoiceOrder->src_info(), rdo::format("Релевантный ресурс создается, для него нельзя использовать правило выбора '%s'", pChoiceOrder->asString().c_str())); + } + } + + m_pCurrRelRes->m_pChoiceFrom = pChoiceFrom; + m_pCurrRelRes->m_pChoiceOrder = pChoiceOrder; } void RDOPATPattern::end() { - popRelevantResourceContext(); - - int size = m_relResList.size(); - for (int i = 0; i < size; i++) - { - LPRDORelevantResource pCurrRelRes = m_relResList.at(i); - if (!pCurrRelRes->m_alreadyHaveConverter) - { - /// @todo А почему нельзя сделать warning ? Возможно, есть жесткое требование недопустить пустого рел. ресурса. - parser::g_error().error(pCurrRelRes->src_info(), rdo::format("Релевантный ресурс '%s' не используется в образце '%s'", pCurrRelRes->name().c_str(), name().c_str())); - } - m_pPatRuntime->addPreSelectRelRes(pCurrRelRes->createPreSelectRelResCalc()); - } - - if (m_useCommonChoice) - { - //! first - //! Работает неправильно, а как обыкновенный first - if (!m_pCommonChoice) - { - //! first - std::vector resSelectors; - for (int i = 0; i < size; i++) - { - if (m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::CS_Keep || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::CS_Erase || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::CS_NoChange) - { - resSelectors.push_back(m_relResList.at(i)->createSelectResourceCommonChoiceCalc()); - } - } - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(resSelectors, m_useCommonWithMax, rdo::runtime::LPRDOCalc(NULL)); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText("first"); - pCalc->setSrcInfo(srcInfo); - addChoiceFromCalc(pCalc); - } - else - { - //! with_min/with_max - std::vector resSelectors; - for (int i = 0; i < size; i++) - { - if (m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::CS_Keep || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::CS_Erase || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::CS_NoChange) - { - resSelectors.push_back(m_relResList.at(i)->createSelectResourceCommonChoiceCalc()); - } - } - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(resSelectors, m_useCommonWithMax, m_pCommonChoice->createCalc()); - pCalc->setSrcInfo(m_pCommonChoice->src_info()); - addChoiceFromCalc(pCalc); - } - } - else - { - for (int i = 0; i < size; i++) - { - rdo::runtime::LPRDOCalc pCalc = m_relResList.at(i)->createSelectResourceChoiceCalc(); - addChoiceFromCalc(pCalc); - } - } + popRelevantResourceContext(); + + int size = m_relResList.size(); + for (int i = 0; i < size; i++) + { + LPRDORelevantResource pCurrRelRes = m_relResList.at(i); + if (!pCurrRelRes->m_alreadyHaveConverter) + { + // TODO А почему нельзя сделать warning ? Возможно, есть жесткое требование недопустить пустого рел. ресурса. + parser::g_error().error(pCurrRelRes->src_info(), rdo::format("Релевантный ресурс '%s' не используется в образце '%s'", pCurrRelRes->name().c_str(), name().c_str())); + } + m_pPatRuntime->addPreSelectRelRes(pCurrRelRes->createPreSelectRelResCalc()); + } + + if (m_useCommonChoice) + { + // first + // Работает неправильно, а как обыкновенный first + if (!m_pCommonChoice) + { + // first + std::vector resSelectors; + for (int i = 0; i < size; i++) + { + if (m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::KEEP || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + { + resSelectors.push_back(m_relResList.at(i)->createSelectResourceCommonChoiceCalc()); + } + } + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(resSelectors, m_useCommonWithMax, rdo::runtime::LPRDOCalc(NULL)); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText("first"); + pCalc->setSrcInfo(srcInfo); + addChoiceFromCalc(pCalc); + } + else + { + // with_min/with_max + std::vector resSelectors; + for (int i = 0; i < size; i++) + { + if (m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::KEEP || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE || m_relResList.at(i)->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + { + resSelectors.push_back(m_relResList.at(i)->createSelectResourceCommonChoiceCalc()); + } + } + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(resSelectors, m_useCommonWithMax, m_pCommonChoice->createCalc()); + pCalc->setSrcInfo(m_pCommonChoice->src_info()); + addChoiceFromCalc(pCalc); + } + } + else + { + for (int i = 0; i < size; i++) + { + rdo::runtime::LPRDOCalc pCalc = m_relResList.at(i)->createSelectResourceChoiceCalc(); + addChoiceFromCalc(pCalc); + } + } } // -------------------------------------------------------------------------------- // -------------------- RDOPatternEvent // -------------------------------------------------------------------------------- RDOPatternEvent::RDOPatternEvent(const RDOParserSrcInfo& name_src_info, bool trace) - : RDOPATPattern(name_src_info) + : RDOPATPattern(name_src_info) { - m_pPatRuntime = rdo::Factory::create(trace); - ASSERT(m_pPatRuntime); - m_pPatRuntime->setTraceID(RDOParser::s_parser()->getPAT_id()); + m_pPatRuntime = rdo::Factory::create(trace); + ASSERT(m_pPatRuntime); + m_pPatRuntime->setTraceID(RDOParser::s_parser()->getPAT_id()); - m_pRuntimeEvent = getPatRuntime()->createActivity( - RDOParser::s_parser()->runtime()->m_pMetaLogic, - RDOParser::s_parser()->runtime(), - name() - ).object_dynamic_cast(); - ASSERT(m_pRuntimeEvent); + m_pRuntimeEvent = getPatRuntime()->createActivity( + RDOParser::s_parser()->runtime()->m_pMetaLogic, + RDOParser::s_parser()->runtime(), + name() + ).object_dynamic_cast(); + ASSERT(m_pRuntimeEvent); } void RDOPatternEvent::addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos) { - beforeRelRensert(rel_info); - if (beg == rdo::runtime::RDOResource::CS_NonExist || beg == rdo::runtime::RDOResource::CS_NoChange) - { - parser::g_error().error(convertor_pos, "Статусы конверторов NonExist и NoChange не могут быть использованы в событии"); - } - - LPRDORelevantResource pRelevantResource; - LPRDORSSResource res = RDOParser::s_parser()->findRSSResource(type_info.src_text()); - if (res) - { - switch (beg) - { - case rdo::runtime::RDOResource::CS_Create: parser::g_error().error(type_info, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); break; - case rdo::runtime::RDOResource::CS_Erase : parser::g_error().error(convertor_pos, "Удалять ресурсы в событии нельзя"); break; - default: break; - } - pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), res, beg); - ASSERT(pRelevantResource); - rel_res_insert(pRelevantResource); - } - else - { - LPRDORTPResType pResType = RDOParser::s_parser()->findRTPResType(type_info.src_text()); - if (!pResType) - { - parser::g_error().error(type_info, rdo::format("Неизвестный тип ресурса: %s", type_info.src_text().c_str())); - } - switch (beg) - { - case rdo::runtime::RDOResource::CS_Create: if (!pResType->isTemporary()) parser::g_error().error(type_info, rdo::format("Тип ресурса '%s' постоянный. Динамически создавать от него ресурсы нельзя", type_info.src_text().c_str())); break; - case rdo::runtime::RDOResource::CS_Keep : - case rdo::runtime::RDOResource::CS_Erase : parser::g_error().error(convertor_pos, "Статусы конверторов Keep и Erase могут быть использованы в событии с описателем в виде ресурса, но не типа ресурса"); break; - default: break; - } - pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), pResType, beg); - ASSERT(pRelevantResource); - rel_res_insert(pRelevantResource); - } - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Erase) - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(rel_info); - srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - getPatRuntime()->addEraseCalc(pCalc); - } + beforeRelRensert(rel_info); + if (beg == rdo::runtime::RDOResource::ConvertStatus::NONEXIST || beg == rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + { + parser::g_error().error(convertor_pos, "Статусы конверторов NonExist и NoChange не могут быть использованы в событии"); + } + + LPRDORelevantResource pRelevantResource; + LPRDORSSResource res = RDOParser::s_parser()->findRSSResource(type_info.src_text()); + if (res) + { + switch (beg) + { + case rdo::runtime::RDOResource::ConvertStatus::CREATE: parser::g_error().error(type_info, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); break; + case rdo::runtime::RDOResource::ConvertStatus::ERASE : parser::g_error().error(convertor_pos, "Удалять ресурсы в событии нельзя"); break; + default: break; + } + pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), res, beg); + ASSERT(pRelevantResource); + rel_res_insert(pRelevantResource); + } + else + { + LPRDORTPResType pResType = RDOParser::s_parser()->findRTPResType(type_info.src_text()); + if (!pResType) + { + parser::g_error().error(type_info, rdo::format("Неизвестный тип ресурса: %s", type_info.src_text().c_str())); + } + switch (beg) + { + case rdo::runtime::RDOResource::ConvertStatus::CREATE: if (!pResType->isTemporary()) parser::g_error().error(type_info, rdo::format("Тип ресурса '%s' постоянный. Динамически создавать от него ресурсы нельзя", type_info.src_text().c_str())); break; + case rdo::runtime::RDOResource::ConvertStatus::KEEP : + case rdo::runtime::RDOResource::ConvertStatus::ERASE : parser::g_error().error(convertor_pos, "Статусы конверторов Keep и Erase могут быть использованы в событии с описателем в виде ресурса, но не типа ресурса"); break; + default: break; + } + pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), pResType, beg); + ASSERT(pRelevantResource); + rel_res_insert(pRelevantResource); + } + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE) + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(rel_info); + srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + getPatRuntime()->addEraseCalc(pCalc); + } } void RDOPatternEvent::addRelResUsage(const LPRDOPATChoiceFrom& pChoiceFrom, const LPRDOPATChoiceOrder& pChoiceOrder) { - if (pChoiceFrom->m_type != RDOPATChoiceFrom::ch_empty) - { - parser::g_error().error(pChoiceFrom->src_info(), "Релевантные ресурсы события нельзя выбирать с помощью Choice from или Choice NoCheck"); - } - if (pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::order_empty) - { - parser::g_error().error(pChoiceFrom->src_info(), rdo::format("Для релевантных ресурсов события нельзя использовать правило выбора '%s'", pChoiceOrder->asString().c_str())); - } + if (pChoiceFrom->m_type != RDOPATChoiceFrom::Type::EMPTY) + { + parser::g_error().error(pChoiceFrom->src_info(), "Релевантные ресурсы события нельзя выбирать с помощью Choice from или Choice NoCheck"); + } + if (pChoiceOrder->m_type != rdo::runtime::RDOSelectResourceCalc::Type::EMPTY) + { + parser::g_error().error(pChoiceFrom->src_info(), rdo::format("Для релевантных ресурсов события нельзя использовать правило выбора '%s'", pChoiceOrder->asString().c_str())); + } - m_pCurrRelRes->m_pChoiceFrom = pChoiceFrom; - m_pCurrRelRes->m_pChoiceOrder = pChoiceOrder; + m_pCurrRelRes->m_pChoiceFrom = pChoiceFrom; + m_pCurrRelRes->m_pChoiceOrder = pChoiceOrder; } namespace @@ -720,375 +720,375 @@ namespace std::vector fillDefaultParams(LPRDORTPResType pType, RDOParserSrcInfo srcInfo) { - std::vector params_default; - for (const auto& param: pType->getParams()) - { - LPRDORTPResType pResType = param->getTypeInfo()->itype().object_dynamic_cast(); - if (pResType) - { - std::vector nested_default_params = fillDefaultParams(pResType, srcInfo); - rdo::runtime::LPRDOCalc pResCalc = rdo::Factory::create( - pResType->getNumber(), - nested_default_params, - false/** @todo задавать такую же трассировку, как у родительского ресурса */, - false/** @todo проверить, что ресурс временный */, - true /* ресурс является вложенным */ - ); - ASSERT(pResCalc); - params_default.push_back(pResCalc); - } - else - { - if (!param->getDefault()->defined()) - { - params_default.push_back(rdo::Factory::create(rdo::runtime::RDOValue(0))); - if (!param->getDefined()) - { - parser::g_error().error(srcInfo, rdo::format("При создании ресурса необходимо определить все его параметры. Не найдено определение параметра: %s", param->name().c_str())); - } - } - else - { - params_default.push_back(rdo::Factory::create((param->getDefault()->value()))); - } - } - } - return params_default; + std::vector params_default; + for (const auto& param: pType->getParams()) + { + LPRDORTPResType pResType = param->getTypeInfo()->itype().object_dynamic_cast(); + if (pResType) + { + std::vector nested_default_params = fillDefaultParams(pResType, srcInfo); + rdo::runtime::LPRDOCalc pResCalc = rdo::Factory::create( + pResType->getNumber(), + nested_default_params, + false, // TODO задавать такую же трассировку, как у родительского ресурса + false, // TODO проверить, что ресурс временный + true // ресурс является вложенным + ); + ASSERT(pResCalc); + params_default.push_back(pResCalc); + } + else + { + if (!param->getDefault()->defined()) + { + params_default.push_back(rdo::Factory::create(rdo::runtime::RDOValue(0))); + if (!param->getDefined()) + { + parser::g_error().error(srcInfo, rdo::format("При создании ресурса необходимо определить все его параметры. Не найдено определение параметра: %s", param->name().c_str())); + } + } + else + { + params_default.push_back(rdo::Factory::create((param->getDefault()->value()))); + } + } + } + return params_default; } } rdo::runtime::LPRDOCalc RDOPATPattern::createRelRes(bool trace) const { - std::vector params_default = fillDefaultParams(m_pCurrRelRes->getType(), m_pCurrRelRes->src_info()); + std::vector params_default = fillDefaultParams(m_pCurrRelRes->getType(), m_pCurrRelRes->src_info()); - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create( - m_pCurrRelRes->getType()->getNumber(), - params_default, - trace, - false/** @todo проверить, что ресурс временный */, - false/* релеватный ресурс не может быть вложенным */, - m_pCurrRelRes->m_relResID - ); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(m_pCurrRelRes->src_info()); - srcInfo.setSrcText(rdo::format("Создание временного ресурса %s", m_pCurrRelRes->name().c_str())); - pCalc->setSrcInfo(srcInfo); - return pCalc; + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create( + m_pCurrRelRes->getType()->getNumber(), + params_default, + trace, + false, // TODO проверить, что ресурс временный + false, // релеватный ресурс не может быть вложенным + m_pCurrRelRes->m_relResID + ); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(m_pCurrRelRes->src_info()); + srcInfo.setSrcText(rdo::format("Создание временного ресурса %s", m_pCurrRelRes->name().c_str())); + pCalc->setSrcInfo(srcInfo); + return pCalc; } std::string RDOPatternEvent::getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) { - return rdo::format("Для релевантного ресурса '%s' не требуется конвертор (Convert_event), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); + return rdo::format("Для релевантного ресурса '%s' не требуется конвертор (Convert_event), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); } std::string RDOPatternEvent::getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) { - return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор (Convert_event), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); + return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор (Convert_event), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); } rdo::runtime::LPRDOCalc RDOPatternEvent::getBeforeStartModelPlaning() const { - return m_beforeStartModelPlaning; + return m_beforeStartModelPlaning; } void RDOPatternEvent::setBeforeStartModelPlaning(const rdo::runtime::LPRDOCalc& beforeStartModelPlaning) { - ASSERT(beforeStartModelPlaning); - m_beforeStartModelPlaning = beforeStartModelPlaning; + ASSERT(beforeStartModelPlaning); + m_beforeStartModelPlaning = beforeStartModelPlaning; } runtime::LPRDOCalcEventPlan RDOPatternEvent::planning(const runtime::LPRDOCalc& time, const LPArithmContainer& params) const { - return rdo::Factory::create( - m_pRuntimeEvent.object_dynamic_cast(), - time, - createParamsCalcs(params->getContainer()) - ); + return rdo::Factory::create( + m_pRuntimeEvent.object_dynamic_cast(), + time, + createParamsCalcs(params->getContainer()) + ); } runtime::LPRDOCalcEventStop RDOPatternEvent::stoping() const { - return rdo::Factory::create(m_pRuntimeEvent.object_dynamic_cast()); + return rdo::Factory::create(m_pRuntimeEvent.object_dynamic_cast()); } // -------------------------------------------------------------------------------- // -------------------- RDOPatternRule // -------------------------------------------------------------------------------- RDOPatternRule::RDOPatternRule(const RDOParserSrcInfo& name_src_info, bool trace) - : RDOPATPattern(name_src_info) + : RDOPATPattern(name_src_info) { -// RDOParser::s_parser()->runtime()->addRuntimeRule((RDOPatternRule *)(m_pPatRuntime = new RDOPatternRule(RDOParser::s_parser()->runtime(), _trace))); - m_pPatRuntime = rdo::Factory::create(trace); - ASSERT(m_pPatRuntime); - m_pPatRuntime->setTraceID(RDOParser::s_parser()->getPAT_id()); +// RDOParser::s_parser()->runtime()->addRuntimeRule((RDOPatternRule *)(m_pPatRuntime = new RDOPatternRule(RDOParser::s_parser()->runtime(), _trace))); + m_pPatRuntime = rdo::Factory::create(trace); + ASSERT(m_pPatRuntime); + m_pPatRuntime->setTraceID(RDOParser::s_parser()->getPAT_id()); } void RDOPatternRule::addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos) { - beforeRelRensert(rel_info); - if (beg == rdo::runtime::RDOResource::CS_NonExist) - { - parser::g_error().error(convertor_pos, rdo::format("Нельзя использовать статус конвертора '%s' в продукционном правиле", RDOPATPattern::StatusToStr(beg).c_str())); - } - - LPRDORelevantResource pRelevantResource; - LPRDORSSResource res = RDOParser::s_parser()->findRSSResource(type_info.src_text()); - if (res) - { - if (beg == rdo::runtime::RDOResource::CS_Create) - { - parser::g_error().error(type_info, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); - } - if (beg == rdo::runtime::RDOResource::CS_Erase) - { - parser::g_error().error(convertor_pos, rdo::format("Недопустимый статус конвертора для ресурса: %s", RDOPATPattern::StatusToStr(beg).c_str())); - } - pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), res, beg); - ASSERT(pRelevantResource); - rel_res_insert(pRelevantResource); - } - else - { - LPRDORTPResType pResType = RDOParser::s_parser()->findRTPResType(type_info.src_text()); - if (!pResType) - { - parser::g_error().error(type_info, rdo::format("Неизвестный тип ресурса: %s", type_info.src_text().c_str())); - } - if (!pResType->isTemporary() && (beg == rdo::runtime::RDOResource::CS_Create || beg == rdo::runtime::RDOResource::CS_Erase)) - { - parser::g_error().error(type_info, rdo::format("Для создании или удалении ресурса его тип должен быть временным (temporary), а не постоянным (permanent), как у '%s'", type_info.src_text().c_str())); - } - pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), pResType, beg); - ASSERT(pRelevantResource); - rel_res_insert(pRelevantResource); - } - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Erase) - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(rel_info); - srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - getPatRuntime()->addEraseCalc(pCalc); - } + beforeRelRensert(rel_info); + if (beg == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + parser::g_error().error(convertor_pos, rdo::format("Нельзя использовать статус конвертора '%s' в продукционном правиле", RDOPATPattern::StatusToStr(beg).c_str())); + } + + LPRDORelevantResource pRelevantResource; + LPRDORSSResource res = RDOParser::s_parser()->findRSSResource(type_info.src_text()); + if (res) + { + if (beg == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + parser::g_error().error(type_info, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); + } + if (beg == rdo::runtime::RDOResource::ConvertStatus::ERASE) + { + parser::g_error().error(convertor_pos, rdo::format("Недопустимый статус конвертора для ресурса: %s", RDOPATPattern::StatusToStr(beg).c_str())); + } + pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), res, beg); + ASSERT(pRelevantResource); + rel_res_insert(pRelevantResource); + } + else + { + LPRDORTPResType pResType = RDOParser::s_parser()->findRTPResType(type_info.src_text()); + if (!pResType) + { + parser::g_error().error(type_info, rdo::format("Неизвестный тип ресурса: %s", type_info.src_text().c_str())); + } + if (!pResType->isTemporary() && (beg == rdo::runtime::RDOResource::ConvertStatus::CREATE || beg == rdo::runtime::RDOResource::ConvertStatus::ERASE)) + { + parser::g_error().error(type_info, rdo::format("Для создании или удалении ресурса его тип должен быть временным (temporary), а не постоянным (permanent), как у '%s'", type_info.src_text().c_str())); + } + pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), pResType, beg); + ASSERT(pRelevantResource); + rel_res_insert(pRelevantResource); + } + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE) + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(rel_info); + srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + getPatRuntime()->addEraseCalc(pCalc); + } } std::string RDOPatternRule::getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) { - return rdo::format("Для релевантного ресурса '%s' не требуется конвертор (Convert_rule), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); + return rdo::format("Для релевантного ресурса '%s' не требуется конвертор (Convert_rule), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); } std::string RDOPatternRule::getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) { - return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор (Convert_rule), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); + return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор (Convert_rule), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); } // -------------------------------------------------------------------------------- // -------------------- RDOPatternOperation // -------------------------------------------------------------------------------- RDOPatternOperation::RDOPatternOperation(const RDOParserSrcInfo& name_src_info, bool trace) - : RDOPATPattern (name_src_info ) - , m_convertorType(convert_unknow) + : RDOPATPattern (name_src_info) + , m_convertorType(ConvertorType::UNKNOW) { - m_pPatRuntime = rdo::Factory::create(trace); - ASSERT(m_pPatRuntime); - m_pPatRuntime->setTraceID(RDOParser::s_parser()->getPAT_id()); + m_pPatRuntime = rdo::Factory::create(trace); + ASSERT(m_pPatRuntime); + m_pPatRuntime->setTraceID(RDOParser::s_parser()->getPAT_id()); } RDOPatternOperation::RDOPatternOperation(bool /*trace*/, const RDOParserSrcInfo& name_src_info) - : RDOPATPattern (name_src_info ) - , m_convertorType(convert_unknow) + : RDOPATPattern (name_src_info) + , m_convertorType(ConvertorType::UNKNOW) {} void RDOPatternOperation::rel_res_insert(const LPRDORelevantResource& pRelevantResource) { - ASSERT(pRelevantResource); - RDOPATPattern::rel_res_insert(pRelevantResource); - getPatRuntime()->addConvertorEndStatus(pRelevantResource->m_statusEnd); + ASSERT(pRelevantResource); + RDOPATPattern::rel_res_insert(pRelevantResource); + getPatRuntime()->addConvertorEndStatus(pRelevantResource->m_statusEnd); } void RDOPatternOperation::addRelRes(const RDOParserSrcInfo& /*rel_info*/, const RDOParserSrcInfo& /*type_info*/, rdo::runtime::RDOResource::ConvertStatus /*beg*/, const YYLTYPE& convertor_pos) { - parser::g_error().error(convertor_pos, "Внутренняя ошибка парсера"); + parser::g_error().error(convertor_pos, "Внутренняя ошибка парсера"); } void RDOPatternOperation::addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, rdo::runtime::RDOResource::ConvertStatus end, const YYLTYPE& convertor_begin_pos, const YYLTYPE& convertor_end_pos) { - beforeRelRensert(rel_info); - switch (beg) - { - case rdo::runtime::RDOResource::CS_Keep: - if (end != rdo::runtime::RDOResource::CS_Keep && end != rdo::runtime::RDOResource::CS_Erase && end != rdo::runtime::RDOResource::CS_NoChange) - { - parser::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); - } - break; - case rdo::runtime::RDOResource::CS_Create: - if (end != rdo::runtime::RDOResource::CS_Keep && end != rdo::runtime::RDOResource::CS_Erase && end != rdo::runtime::RDOResource::CS_NoChange) - { - parser::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); - } - break; - case rdo::runtime::RDOResource::CS_Erase: - if (end != rdo::runtime::RDOResource::CS_NonExist) - { - parser::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); - } - break; - case rdo::runtime::RDOResource::CS_NonExist: - if (end != rdo::runtime::RDOResource::CS_Create) - { - parser::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); - } - break; - case rdo::runtime::RDOResource::CS_NoChange: - if (end != rdo::runtime::RDOResource::CS_Keep && end != rdo::runtime::RDOResource::CS_Erase && end != rdo::runtime::RDOResource::CS_NoChange) - { - parser::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); - } - break; - default: - break; - }; - - LPRDORelevantResource pRelevantResource; - LPRDORSSResource res = RDOParser::s_parser()->findRSSResource(type_info.src_text()); - if (res) - { - if (beg == rdo::runtime::RDOResource::CS_Create) - { - parser::g_error().error(convertor_begin_pos, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); - } - if (end == rdo::runtime::RDOResource::CS_Create) - { - parser::g_error().error(convertor_end_pos, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); - } - if (beg == rdo::runtime::RDOResource::CS_Erase || beg == rdo::runtime::RDOResource::CS_NonExist) - { - parser::g_error().error(convertor_begin_pos, rdo::format("Недопустимый статус конвертора начала для ресурса: %s", RDOPATPattern::StatusToStr(beg).c_str())); - } - if (end == rdo::runtime::RDOResource::CS_Erase || end == rdo::runtime::RDOResource::CS_NonExist) - { - parser::g_error().error(convertor_end_pos, rdo::format("Недопустимый статус конвертора конца для ресурса: %s", RDOPATPattern::StatusToStr(end).c_str())); - } - pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), res, beg, end); - ASSERT(pRelevantResource); - rel_res_insert(pRelevantResource); - } - else - { - LPRDORTPResType pResType = RDOParser::s_parser()->findRTPResType(type_info.src_text()); - if (!pResType) - { - parser::g_error().error(type_info, rdo::format("Неизвестный тип ресурса: %s", type_info.src_text().c_str())); - } - if (pResType->isPermanent()) - { - if (beg == rdo::runtime::RDOResource::CS_Create || beg == rdo::runtime::RDOResource::CS_Erase || beg == rdo::runtime::RDOResource::CS_NonExist) - { - parser::g_error().error(convertor_begin_pos, rdo::format("Недопустимый статус конвертора начала для постоянного типа: %s", RDOPATPattern::StatusToStr(beg).c_str())); - } - if (end == rdo::runtime::RDOResource::CS_Create || end == rdo::runtime::RDOResource::CS_Erase || end == rdo::runtime::RDOResource::CS_NonExist) - { - parser::g_error().error(convertor_end_pos, rdo::format("Недопустимый статус конвертора конца для постоянного типа: %s", RDOPATPattern::StatusToStr(end).c_str())); - } - } - pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), pResType, beg, end); - ASSERT(pRelevantResource); - rel_res_insert(pRelevantResource); - } - if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::CS_Erase) - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(rel_info); - srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - getPatRuntime()->addEraseBeginCalc(pCalc); - } - if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::CS_Erase) - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(rel_info); - srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - getPatRuntime()->addEraseEndCalc(pCalc); - } + beforeRelRensert(rel_info); + switch (beg) + { + case rdo::runtime::RDOResource::ConvertStatus::KEEP: + if (end != rdo::runtime::RDOResource::ConvertStatus::KEEP && end != rdo::runtime::RDOResource::ConvertStatus::ERASE && end != rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + { + parser::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); + } + break; + case rdo::runtime::RDOResource::ConvertStatus::CREATE: + if (end != rdo::runtime::RDOResource::ConvertStatus::KEEP && end != rdo::runtime::RDOResource::ConvertStatus::ERASE && end != rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + { + parser::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); + } + break; + case rdo::runtime::RDOResource::ConvertStatus::ERASE: + if (end != rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + parser::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); + } + break; + case rdo::runtime::RDOResource::ConvertStatus::NONEXIST: + if (end != rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + parser::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); + } + break; + case rdo::runtime::RDOResource::ConvertStatus::NOCHANGE: + if (end != rdo::runtime::RDOResource::ConvertStatus::KEEP && end != rdo::runtime::RDOResource::ConvertStatus::ERASE && end != rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + { + parser::g_error().error(convertor_end_pos, rdo::format("Статус конвертора конца несовместим со статусом конвертора начала: %s и %s", RDOPATPattern::StatusToStr(beg).c_str(), RDOPATPattern::StatusToStr(end).c_str())); + } + break; + default: + break; + }; + + LPRDORelevantResource pRelevantResource; + LPRDORSSResource res = RDOParser::s_parser()->findRSSResource(type_info.src_text()); + if (res) + { + if (beg == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + parser::g_error().error(convertor_begin_pos, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); + } + if (end == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + parser::g_error().error(convertor_end_pos, rdo::format("При создания ресурса '%s' требуется указать его тип, но указан просто ресурс (%s)", rel_info.src_text().c_str(), type_info.src_text().c_str())); + } + if (beg == rdo::runtime::RDOResource::ConvertStatus::ERASE || beg == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + parser::g_error().error(convertor_begin_pos, rdo::format("Недопустимый статус конвертора начала для ресурса: %s", RDOPATPattern::StatusToStr(beg).c_str())); + } + if (end == rdo::runtime::RDOResource::ConvertStatus::ERASE || end == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + parser::g_error().error(convertor_end_pos, rdo::format("Недопустимый статус конвертора конца для ресурса: %s", RDOPATPattern::StatusToStr(end).c_str())); + } + pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), res, beg, end); + ASSERT(pRelevantResource); + rel_res_insert(pRelevantResource); + } + else + { + LPRDORTPResType pResType = RDOParser::s_parser()->findRTPResType(type_info.src_text()); + if (!pResType) + { + parser::g_error().error(type_info, rdo::format("Неизвестный тип ресурса: %s", type_info.src_text().c_str())); + } + if (pResType->isPermanent()) + { + if (beg == rdo::runtime::RDOResource::ConvertStatus::CREATE || beg == rdo::runtime::RDOResource::ConvertStatus::ERASE || beg == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + parser::g_error().error(convertor_begin_pos, rdo::format("Недопустимый статус конвертора начала для постоянного типа: %s", RDOPATPattern::StatusToStr(beg).c_str())); + } + if (end == rdo::runtime::RDOResource::ConvertStatus::CREATE || end == rdo::runtime::RDOResource::ConvertStatus::ERASE || end == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + parser::g_error().error(convertor_end_pos, rdo::format("Недопустимый статус конвертора конца для постоянного типа: %s", RDOPATPattern::StatusToStr(end).c_str())); + } + } + pRelevantResource = rdo::Factory::create(rel_info, rel_res_count(), pResType, beg, end); + ASSERT(pRelevantResource); + rel_res_insert(pRelevantResource); + } + if (pRelevantResource->m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::ERASE) + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(rel_info); + srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + getPatRuntime()->addEraseBeginCalc(pCalc); + } + if (pRelevantResource->m_statusEnd == rdo::runtime::RDOResource::ConvertStatus::ERASE) + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(pRelevantResource->m_relResID, pRelevantResource->name()); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(rel_info); + srcInfo.setSrcText(rdo::format("Удаление временного ресурса %s", rel_info.src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + getPatRuntime()->addEraseEndCalc(pCalc); + } } void RDOPatternOperation::addRelResConvertBeginEnd(bool trace_begin, const LPExpression& pBeginStatementList, bool trace_end, const LPExpression& pEndStatementList, const YYLTYPE& convertor_begin_pos, const YYLTYPE& convertor_end_pos, const YYLTYPE& trace_begin_pos, const YYLTYPE& trace_end_pos) { - if (pBeginStatementList) - { - m_convertorType = convert_begin; - ASSERT(m_pCurrRelRes); - addRelResConvert(trace_begin, pBeginStatementList, convertor_begin_pos, trace_begin_pos, m_pCurrRelRes->m_statusBegin); - m_convertorType = convert_unknow; - } - if (pEndStatementList) - { - m_convertorType = convert_end; - ASSERT(m_pCurrRelRes); - addRelResConvert(trace_end, pEndStatementList, convertor_end_pos, trace_end_pos, m_pCurrRelRes->m_statusEnd); - m_convertorType = convert_unknow; - } + if (pBeginStatementList) + { + m_convertorType = ConvertorType::CONVERT_BEGIN; + ASSERT(m_pCurrRelRes); + addRelResConvert(trace_begin, pBeginStatementList, convertor_begin_pos, trace_begin_pos, m_pCurrRelRes->m_statusBegin); + m_convertorType = ConvertorType::UNKNOW; + } + if (pEndStatementList) + { + m_convertorType = ConvertorType::CONVERT_END; + ASSERT(m_pCurrRelRes); + addRelResConvert(trace_end, pEndStatementList, convertor_end_pos, trace_end_pos, m_pCurrRelRes->m_statusEnd); + m_convertorType = ConvertorType::UNKNOW; + } } void RDOPatternOperation::addParamSetCalc(const rdo::runtime::LPRDOCalc& pCalc) { - switch (m_convertorType) - { - case convert_begin: getPatRuntime()->addConvertorBeginCalc(pCalc); break; - case convert_end : getPatRuntime()->addConvertorEndCalc (pCalc); break; - default : NEVER_REACH_HERE; - } + switch (m_convertorType) + { + case ConvertorType::CONVERT_BEGIN: getPatRuntime()->addConvertorBeginCalc(pCalc); break; + case ConvertorType::CONVERT_END : getPatRuntime()->addConvertorEndCalc (pCalc); break; + default: NEVER_REACH_HERE; + } } std::string RDOPatternOperation::getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) { - switch (m_convertorType) - { - case convert_begin: return rdo::format("Для релевантного ресурса '%s' не требуется конвертор начала (Convert_begin), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; - case convert_end : return rdo::format("Для релевантного ресурса '%s' не требуется конвертор конца (Convert_end), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; - default : NEVER_REACH_HERE; - } - return std::string(); + switch (m_convertorType) + { + case ConvertorType::CONVERT_BEGIN: return rdo::format("Для релевантного ресурса '%s' не требуется конвертор начала (Convert_begin), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; + case ConvertorType::CONVERT_END : return rdo::format("Для релевантного ресурса '%s' не требуется конвертор конца (Convert_end), т.к. его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; + default: NEVER_REACH_HERE; + } + return std::string(); } std::string RDOPatternOperation::getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) { - switch (m_convertorType) - { - case convert_begin: return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор начала (Convert_begin), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; - case convert_end : return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор конца (Convert_end), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; - default : NEVER_REACH_HERE; - } - return std::string(); + switch (m_convertorType) + { + case ConvertorType::CONVERT_BEGIN: return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор начала (Convert_begin), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; + case ConvertorType::CONVERT_END : return rdo::format("Для релевантного ресурса '%s' указан пустой конвертор конца (Convert_end), хотя его статус: %s", name.c_str(), RDOPATPattern::StatusToStr(status).c_str()); break; + default: NEVER_REACH_HERE; + } + return std::string(); } // -------------------------------------------------------------------------------- // -------------------- RDOPatternKeyboard // -------------------------------------------------------------------------------- RDOPatternKeyboard::RDOPatternKeyboard(const RDOParserSrcInfo& name_src_info, bool trace) - : RDOPatternOperation(trace, name_src_info) + : RDOPatternOperation(trace, name_src_info) { - m_pPatRuntime = rdo::Factory::create(trace); - ASSERT(m_pPatRuntime); - m_pPatRuntime->setTraceID(RDOParser::s_parser()->getPAT_id()); + m_pPatRuntime = rdo::Factory::create(trace); + ASSERT(m_pPatRuntime); + m_pPatRuntime->setTraceID(RDOParser::s_parser()->getPAT_id()); } // -------------------------------------------------------------------------------- // -------------------- RDORelevantResource // -------------------------------------------------------------------------------- RDORelevantResource::RDORelevantResource(const RDOParserSrcInfo& src_info, const int relResID, const rdo::runtime::RDOResource::ConvertStatus statusBegin, const rdo::runtime::RDOResource::ConvertStatus statusEnd) - : RDOParserSrcInfo (src_info ) - , m_relResID (relResID ) - , m_alreadyHaveConverter(false ) - , m_statusBegin (statusBegin) - , m_statusEnd (statusEnd ) - , m_currentState (stateNone ) + : RDOParserSrcInfo (src_info) + , m_relResID (relResID) + , m_alreadyHaveConverter(false) + , m_statusBegin (statusBegin) + , m_statusEnd (statusEnd) + , m_currentState (State::NONE) {} RDORelevantResource::~RDORelevantResource() @@ -1099,141 +1099,141 @@ namespace LPExpression contextGetRelevantResource(const LPRDORelevantResource& relevantResource, const RDOParserSrcInfo& srcInfo) { - return rdo::Factory::create( - rdo::Factory::create(relevantResource->getType(), srcInfo), - rdo::Factory::create(relevantResource->m_relResID), - srcInfo - ); + return rdo::Factory::create( + rdo::Factory::create(relevantResource->getType(), srcInfo), + rdo::Factory::create(relevantResource->m_relResID), + srcInfo + ); } } Context::LPFindResult RDORelevantResource::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const { - if (method == Context::METHOD_GET) - { - const std::string paramName = params.identifier(); - - if (paramName == name()) - { - LPRDORelevantResource pThis(const_cast(this)); - return rdo::Factory::create(CreateExpression(boost::bind(&contextGetRelevantResource, pThis, srcInfo))); - } - - const std::size_t parNumb = getType()->getRTPParamNumber(paramName); - if (parNumb == RDORTPResType::UNDEFINED_PARAM) - return rdo::Factory::create(); - //! Проверяем использование еще не инициализированного (только для Create) параметра рел. ресурса в его же конверторе - LPRDORTPParam pParam = getType()->findRTPParam(paramName); - ASSERT(pParam); - //! В конверторе начала - if (m_currentState == RDORelevantResource::convertBegin && m_statusBegin == rdo::runtime::RDOResource::CS_Create) - { - if (!pParam->getDefined()) - { - if (!pParam->getDefault()->defined()) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Параметр '%s' еще не определен, ему необходимо присвоить значение в текущем конверторе или указать значение по умолчанию в типе ресурса", paramName.c_str())); - } - } - } - //! В конверторе конца - if (m_currentState == RDORelevantResource::convertEnd && m_statusEnd == rdo::runtime::RDOResource::CS_Create) - { - if (!pParam->getDefined()) - { - if (!pParam->getDefault()->defined()) - { - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Параметр '%s' еще не определен, ему необходимо присвоить значение в текущем конверторе или указать значение по умолчанию в типе ресурса", paramName.c_str())); - } - } - } - - Context::Params params_; - params_[RDORSSResource::GET_RESOURCE] = params.get(RDORSSResource::GET_RESOURCE); - params_[RDOParam::CONTEXT_PARAM_PARAM_ID] = parNumb; - - return pParam->find(Context::METHOD_GET, params_, srcInfo); - } - - if (method == Context::METHOD_OPERATOR_DOT) - { - const std::string paramName = params.identifier(); - - const std::size_t parNumb = getType()->getRTPParamNumber(paramName); - if (parNumb == RDORTPResType::UNDEFINED_PARAM) - return rdo::Factory::create(); - - RDOParserSrcInfo srcInfo_(srcInfo); - srcInfo_.setSrcText(rdo::format("%s.%s", src_text().c_str(), params.identifier().c_str())); - - const rdo::runtime::LPRDOCalc resourceCalc = rdo::Factory::create(m_relResID); - const LPExpression resourceExpression = rdo::Factory::create( - rdo::Factory::create(getType(), srcInfo), - resourceCalc, - srcInfo - ); - - Context::Params params_; - params_[Context::Params::IDENTIFIER] = paramName; - params_[RDORSSResource::GET_RESOURCE] = resourceExpression; - - return getType()->find(Context::METHOD_OPERATOR_DOT, params_, srcInfo_); - } - - if (method == Context::METHOD_SET) - { - LPRDORTPParam pParam = getType()->findRTPParam(params.identifier()); - if (pParam) - { - RDOParserSrcInfo srcInfo_(srcInfo); - srcInfo_.setSrcText(rdo::format("%s.%s", src_text().c_str(), pParam->name().c_str())); - - const rdo::runtime::LPRDOCalc resourceCalc = rdo::Factory::create(m_relResID); - const LPExpression resourceExpression = rdo::Factory::create( - rdo::Factory::create(getType(), srcInfo_), - resourceCalc, - srcInfo_ - ); - - Context::Params params_; - params_[RDOParam::CONTEXT_PARAM_PARAM_ID] = getType()->getRTPParamNumber(params.identifier()); - params_[RDORSSResource::GET_RESOURCE] = resourceExpression; - params_[Expression::CONTEXT_PARAM_SET_OPERATION_TYPE] = params.get(Expression::CONTEXT_PARAM_SET_OPERATION_TYPE); - - if (params.exists(Expression::CONTEXT_PARAM_SET_EXPRESSION)) - params_[Expression::CONTEXT_PARAM_SET_EXPRESSION] = params.get(Expression::CONTEXT_PARAM_SET_EXPRESSION); - if (params.exists(RDOFUNArithm::CONTEXT_PARAM_SET_ARITHM)) - params_[RDOFUNArithm::CONTEXT_PARAM_SET_ARITHM] = params.get(RDOFUNArithm::CONTEXT_PARAM_SET_ARITHM); - - return pParam->find(Context::METHOD_SET, params_, srcInfo_); - } - } - - return rdo::Factory::create(); + if (method == Context::METHOD_GET) + { + const std::string paramName = params.identifier(); + + if (paramName == name()) + { + LPRDORelevantResource pThis(const_cast(this)); + return rdo::Factory::create(CreateExpression(boost::bind(&contextGetRelevantResource, pThis, srcInfo))); + } + + const std::size_t parNumb = getType()->getRTPParamNumber(paramName); + if (parNumb == RDORTPResType::UNDEFINED_PARAM) + return rdo::Factory::create(); + // Проверяем использование еще не инициализированного (только для Create) параметра рел. ресурса в его же конверторе + LPRDORTPParam pParam = getType()->findRTPParam(paramName); + ASSERT(pParam); + // В конверторе начала + if (m_currentState == RDORelevantResource::State::CONVERT_BEGIN && m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + if (!pParam->getDefined()) + { + if (!pParam->getDefault()->defined()) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Параметр '%s' еще не определен, ему необходимо присвоить значение в текущем конверторе или указать значение по умолчанию в типе ресурса", paramName.c_str())); + } + } + } + // В конверторе конца + if (m_currentState == RDORelevantResource::State::CONVERT_END && m_statusEnd == rdo::runtime::RDOResource::ConvertStatus::CREATE) + { + if (!pParam->getDefined()) + { + if (!pParam->getDefault()->defined()) + { + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Параметр '%s' еще не определен, ему необходимо присвоить значение в текущем конверторе или указать значение по умолчанию в типе ресурса", paramName.c_str())); + } + } + } + + Context::Params params_; + params_[RDORSSResource::GET_RESOURCE] = params.get(RDORSSResource::GET_RESOURCE); + params_[RDOParam::CONTEXT_PARAM_PARAM_ID] = parNumb; + + return pParam->find(Context::METHOD_GET, params_, srcInfo); + } + + if (method == Context::METHOD_OPERATOR_DOT) + { + const std::string paramName = params.identifier(); + + const std::size_t parNumb = getType()->getRTPParamNumber(paramName); + if (parNumb == RDORTPResType::UNDEFINED_PARAM) + return rdo::Factory::create(); + + RDOParserSrcInfo srcInfo_(srcInfo); + srcInfo_.setSrcText(rdo::format("%s.%s", src_text().c_str(), params.identifier().c_str())); + + const rdo::runtime::LPRDOCalc resourceCalc = rdo::Factory::create(m_relResID); + const LPExpression resourceExpression = rdo::Factory::create( + rdo::Factory::create(getType(), srcInfo), + resourceCalc, + srcInfo + ); + + Context::Params params_; + params_[Context::Params::IDENTIFIER] = paramName; + params_[RDORSSResource::GET_RESOURCE] = resourceExpression; + + return getType()->find(Context::METHOD_OPERATOR_DOT, params_, srcInfo_); + } + + if (method == Context::METHOD_SET) + { + LPRDORTPParam pParam = getType()->findRTPParam(params.identifier()); + if (pParam) + { + RDOParserSrcInfo srcInfo_(srcInfo); + srcInfo_.setSrcText(rdo::format("%s.%s", src_text().c_str(), pParam->name().c_str())); + + const rdo::runtime::LPRDOCalc resourceCalc = rdo::Factory::create(m_relResID); + const LPExpression resourceExpression = rdo::Factory::create( + rdo::Factory::create(getType(), srcInfo_), + resourceCalc, + srcInfo_ + ); + + Context::Params params_; + params_[RDOParam::CONTEXT_PARAM_PARAM_ID] = getType()->getRTPParamNumber(params.identifier()); + params_[RDORSSResource::GET_RESOURCE] = resourceExpression; + params_[Expression::CONTEXT_PARAM_SET_OPERATION_TYPE] = params.get(Expression::CONTEXT_PARAM_SET_OPERATION_TYPE); + + if (params.exists(Expression::CONTEXT_PARAM_SET_EXPRESSION)) + params_[Expression::CONTEXT_PARAM_SET_EXPRESSION] = params.get(Expression::CONTEXT_PARAM_SET_EXPRESSION); + if (params.exists(RDOFUNArithm::CONTEXT_PARAM_SET_ARITHM)) + params_[RDOFUNArithm::CONTEXT_PARAM_SET_ARITHM] = params.get(RDOFUNArithm::CONTEXT_PARAM_SET_ARITHM); + + return pParam->find(Context::METHOD_SET, params_, srcInfo_); + } + } + + return rdo::Factory::create(); } rdo::runtime::LPRDOCalc RDORelevantResource::getChoiceCalc() { - if (m_pChoiceFrom && m_pChoiceFrom->m_type == RDOPATChoiceFrom::ch_from) - { - return m_pChoiceFrom->m_pLogic->getCalc(rdo::runtime::RDOType::t_int); - } - return NULL; + if (m_pChoiceFrom && m_pChoiceFrom->m_type == RDOPATChoiceFrom::Type::FROM) + { + return m_pChoiceFrom->m_pLogic->getCalc(rdo::runtime::RDOType::Type::INT); + } + return NULL; } rdo::runtime::LPRDOCalc RDORelevantResource::getSelectCalc() { - if (m_pChoiceOrder && m_pChoiceOrder->m_pArithm) - { - return m_pChoiceOrder->m_pArithm->createCalc(NULL); - } - return NULL; + if (m_pChoiceOrder && m_pChoiceOrder->m_pArithm) + { + return m_pChoiceOrder->m_pArithm->createCalc(NULL); + } + return NULL; } rdo::runtime::RDOSelectResourceCalc::Type RDORelevantResource::getSelectType() const { - return m_pChoiceOrder ? m_pChoiceOrder->m_type : rdo::runtime::RDOSelectResourceCalc::order_empty; + return m_pChoiceOrder ? m_pChoiceOrder->m_type : rdo::runtime::RDOSelectResourceCalc::Type::EMPTY; } // -------------------------------------------------------------------------------- @@ -1241,37 +1241,37 @@ rdo::runtime::RDOSelectResourceCalc::Type RDORelevantResource::getSelectType() c // -------------------------------------------------------------------------------- rdo::runtime::LPRDOCalc RDORelevantResourceDirect::createPreSelectRelResCalc() { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResource->getID()); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText(rdo::format("Предварительный выбор рел. ресурса %s", src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - return pCalc; + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResource->getID()); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText(rdo::format("Предварительный выбор рел. ресурса %s", src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + return pCalc; } rdo::runtime::LPRDOCalc RDORelevantResourceDirect::createSelectResourceChoiceCalc() { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResource->getID(), getChoiceCalc(), getSelectCalc(), getSelectType()); - pCalc->setSrcInfo(m_pChoiceFrom->src_info()); - return pCalc; + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResource->getID(), getChoiceCalc(), getSelectCalc(), getSelectType()); + pCalc->setSrcInfo(m_pChoiceFrom->src_info()); + return pCalc; } rdo::runtime::LPRDOCalc RDORelevantResourceDirect::createSelectFirstResourceChoiceCalc() { - return rdo::Factory::create(m_relResID, m_pResource->getID(), getChoiceCalc()); + return rdo::Factory::create(m_relResID, m_pResource->getID(), getChoiceCalc()); } rdo::runtime::LPIRDOSelectResourceCommon RDORelevantResourceDirect::createSelectResourceCommonChoiceCalc() { - rdo::runtime::LPRDOSelectResourceDirectCommonCalc pDirectCommonCalc = rdo::Factory::create(m_relResID, m_pResource->getID(), getChoiceCalc()); - rdo::runtime::LPIRDOSelectResourceCommon pSelectResourceCommon = pDirectCommonCalc.interface_cast(); - ASSERT(pSelectResourceCommon); - return pSelectResourceCommon; + rdo::runtime::LPRDOSelectResourceDirectCommonCalc pDirectCommonCalc = rdo::Factory::create(m_relResID, m_pResource->getID(), getChoiceCalc()); + rdo::runtime::LPIRDOSelectResourceCommon pSelectResourceCommon = pDirectCommonCalc.interface_cast(); + ASSERT(pSelectResourceCommon); + return pSelectResourceCommon; } LPRDORTPResType RDORelevantResourceDirect::getType() const { - return m_pResource->getType(); + return m_pResource->getType(); } // -------------------------------------------------------------------------------- @@ -1279,84 +1279,84 @@ LPRDORTPResType RDORelevantResourceDirect::getType() const // -------------------------------------------------------------------------------- rdo::runtime::LPRDOCalc RDORelevantResourceByType::createPreSelectRelResCalc() { - if ((m_statusBegin != rdo::runtime::RDOResource::CS_Create) && (m_statusEnd != rdo::runtime::RDOResource::CS_Create)) - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResType->getNumber()); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText(rdo::format("Предварительный выбор рел. ресурса %s", src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - return pCalc; - } - else - { - if (m_statusBegin == rdo::runtime::RDOResource::CS_NonExist) - { - return rdo::Factory::create(m_relResID); - } - else - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(1); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText(rdo::format("Предварительный выбор рел. ресурса перед созданием %s", src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - return pCalc; - } - } + if ((m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::CREATE) && (m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::CREATE)) + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResType->getNumber()); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText(rdo::format("Предварительный выбор рел. ресурса %s", src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + return pCalc; + } + else + { + if (m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + return rdo::Factory::create(m_relResID); + } + else + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(1); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText(rdo::format("Предварительный выбор рел. ресурса перед созданием %s", src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + return pCalc; + } + } } rdo::runtime::LPRDOCalc RDORelevantResourceByType::createSelectResourceChoiceCalc() { - if ((m_statusBegin != rdo::runtime::RDOResource::CS_Create) && (m_statusEnd != rdo::runtime::RDOResource::CS_Create)) - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResType->getNumber(), getChoiceCalc(), getSelectCalc(), getSelectType()); - pCalc->setSrcInfo(m_pChoiceFrom->src_info()); - return pCalc; - } - else - { - if (m_statusBegin == rdo::runtime::RDOResource::CS_NonExist) - { - return rdo::Factory::create(m_relResID); - } - else - { - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(1); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText(rdo::format("Перед созданием рел. ресурса %s", src_text().c_str())); - pCalc->setSrcInfo(srcInfo); - return pCalc; - } - } + if ((m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::CREATE) && (m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::CREATE)) + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(m_relResID, m_pResType->getNumber(), getChoiceCalc(), getSelectCalc(), getSelectType()); + pCalc->setSrcInfo(m_pChoiceFrom->src_info()); + return pCalc; + } + else + { + if (m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + return rdo::Factory::create(m_relResID); + } + else + { + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(1); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText(rdo::format("Перед созданием рел. ресурса %s", src_text().c_str())); + pCalc->setSrcInfo(srcInfo); + return pCalc; + } + } } rdo::runtime::LPRDOCalc RDORelevantResourceByType::createSelectFirstResourceChoiceCalc() { - if ((m_statusBegin != rdo::runtime::RDOResource::CS_Create) && (m_statusEnd != rdo::runtime::RDOResource::CS_Create)) - { - return rdo::Factory::create(m_relResID, m_pResType->getNumber(), getChoiceCalc()); - } - else - { - if (m_statusBegin == rdo::runtime::RDOResource::CS_NonExist) - { - return rdo::Factory::create(m_relResID); - } - else - { - return rdo::Factory::create(1); - } - } + if ((m_statusBegin != rdo::runtime::RDOResource::ConvertStatus::CREATE) && (m_statusEnd != rdo::runtime::RDOResource::ConvertStatus::CREATE)) + { + return rdo::Factory::create(m_relResID, m_pResType->getNumber(), getChoiceCalc()); + } + else + { + if (m_statusBegin == rdo::runtime::RDOResource::ConvertStatus::NONEXIST) + { + return rdo::Factory::create(m_relResID); + } + else + { + return rdo::Factory::create(1); + } + } } rdo::runtime::LPIRDOSelectResourceCommon RDORelevantResourceByType::createSelectResourceCommonChoiceCalc() { - rdo::runtime::LPRDOSelectResourceByTypeCommonCalc pByTypeCommonCalc = rdo::Factory::create(m_relResID, m_pResType->getNumber(), getChoiceCalc()); - rdo::runtime::LPIRDOSelectResourceCommon pSelectResourceCommon = pByTypeCommonCalc.interface_cast(); - ASSERT(pSelectResourceCommon); - return pSelectResourceCommon; + rdo::runtime::LPRDOSelectResourceByTypeCommonCalc pByTypeCommonCalc = rdo::Factory::create(m_relResID, m_pResType->getNumber(), getChoiceCalc()); + rdo::runtime::LPIRDOSelectResourceCommon pSelectResourceCommon = pByTypeCommonCalc.interface_cast(); + ASSERT(pSelectResourceCommon); + return pSelectResourceCommon; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdopat.h b/simulator/compiler/parser/rdopat.h index 922aaab38..48482548c 100644 --- a/simulator/compiler/parser/rdopat.h +++ b/simulator/compiler/parser/rdopat.h @@ -1,5 +1,4 @@ -#ifndef _RDOPAT_H_ -#define _RDOPAT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -43,102 +42,102 @@ PREDECLARE_POINTER(RDOPATChoiceOrder); PREDECLARE_POINTER(RDORelevantResource); class RDOPATPattern - : public RDOParserSrcInfo - , public Context - , public IContextFind + : public RDOParserSrcInfo + , public Context + , public IContextFind { DECLARE_FACTORY(RDOPATPattern) friend class RDOOPROperation; friend class RDODPTActivity; public: - enum PatType - { - PT_Event, - PT_Rule, - PT_Operation, - PT_Keyboard - }; - virtual PatType getType() const = 0; - - typedef std::vector RelResList; - - bool isHaveConvertEnd() const { return getType() == PT_Operation || getType() == PT_Keyboard; } - - const rdo::runtime::LPRDOPattern& getPatRuntime() const { return m_pPatRuntime; } - template - rdo::intrusive_ptr getPatRuntime() const - { - rdo::intrusive_ptr pPatRuntime = m_pPatRuntime.object_dynamic_cast(); - ASSERT(pPatRuntime); - return pPatRuntime; - } - - static std::string StatusToStr(rdo::runtime::RDOResource::ConvertStatus value); - rdo::runtime::RDOResource::ConvertStatus StrToStatus(const std::string& value, const YYLTYPE& convertor_pos); - - RelResList::const_iterator rel_res_begin () const { return m_relResList.begin(); } - RelResList::const_iterator rel_res_end () const { return m_relResList.end(); } - int rel_res_count () const { return m_relResList.size(); } - virtual void rel_res_insert(const LPRDORelevantResource& pRelevantResource); - - void beforeRelRensert(const RDOParserSrcInfo& rel_info); - - LPRDORelevantResource m_pCurrRelRes; - - void add(const LPRDOParam& pParam); - LPRDOParam findPATPatternParam(const std::string& paramName) const; - int findPATPatternParamNum(const std::string& paramName) const; - LPRDORelevantResource findRelevantResource(const std::string& resName) const; - std::size_t findRelevantResourceNum(const std::string& resName) const; - virtual void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos) = 0; - - const std::string& name() const { return src_text(); } - - void setCommonChoiceFirst(); - void setCommonChoiceWithMin(const LPRDOFUNArithm& arithm); - void setCommonChoiceWithMax(const LPRDOFUNArithm& arithm); - void setTime(LPRDOFUNArithm& arithm); - void addRelResBody(const RDOParserSrcInfo& body_name); - virtual void addRelResUsage(const LPRDOPATChoiceFrom& pChoiceFrom, const LPRDOPATChoiceOrder& pChoiceOrder); - void addRelResConvert(bool trace, const LPExpression& pStatementList, const YYLTYPE& convertor_pos, const YYLTYPE& trace_pos, rdo::runtime::RDOResource::ConvertStatus status); - void end(); - - void writeModelStructure(std::ostream& stream) const; - virtual char getModelStructureLetter() const = 0; - std::string getPatternId() const; - - void pushContext(); - void popContext (); + enum class Type + { + EVENT, + RULE, + OPERATION, + KEYBOARD + }; + virtual Type getType() const = 0; + + typedef std::vector RelResList; + + bool isHaveConvertEnd() const { return getType() == Type::OPERATION || getType() == Type::KEYBOARD; } + + const rdo::runtime::LPRDOPattern& getPatRuntime() const { return m_pPatRuntime; } + template + rdo::intrusive_ptr getPatRuntime() const + { + rdo::intrusive_ptr pPatRuntime = m_pPatRuntime.object_dynamic_cast(); + ASSERT(pPatRuntime); + return pPatRuntime; + } + + static std::string StatusToStr(rdo::runtime::RDOResource::ConvertStatus value); + rdo::runtime::RDOResource::ConvertStatus StrToStatus(const std::string& value, const YYLTYPE& convertor_pos); + + RelResList::const_iterator rel_res_begin () const { return m_relResList.begin(); } + RelResList::const_iterator rel_res_end () const { return m_relResList.end(); } + int rel_res_count () const { return m_relResList.size(); } + virtual void rel_res_insert(const LPRDORelevantResource& pRelevantResource); + + void beforeRelRensert(const RDOParserSrcInfo& rel_info); + + LPRDORelevantResource m_pCurrRelRes; + + void add(const LPRDOParam& pParam); + LPRDOParam findPATPatternParam(const std::string& paramName) const; + int findPATPatternParamNum(const std::string& paramName) const; + LPRDORelevantResource findRelevantResource(const std::string& resName) const; + std::size_t findRelevantResourceNum(const std::string& resName) const; + virtual void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos) = 0; + + const std::string& name() const { return src_text(); } + + void setCommonChoiceFirst(); + void setCommonChoiceWithMin(const LPRDOFUNArithm& arithm); + void setCommonChoiceWithMax(const LPRDOFUNArithm& arithm); + void setTime(LPRDOFUNArithm& arithm); + void addRelResBody(const RDOParserSrcInfo& body_name); + virtual void addRelResUsage(const LPRDOPATChoiceFrom& pChoiceFrom, const LPRDOPATChoiceOrder& pChoiceOrder); + void addRelResConvert(bool trace, const LPExpression& pStatementList, const YYLTYPE& convertor_pos, const YYLTYPE& trace_pos, rdo::runtime::RDOResource::ConvertStatus status); + void end(); + + void writeModelStructure(std::ostream& stream) const; + virtual char getModelStructureLetter() const = 0; + std::string getPatternId() const; + + void pushContext(); + void popContext (); protected: - RDOPATPattern(const RDOParserSrcInfo& name_src_info); - virtual ~RDOPATPattern(); + RDOPATPattern(const RDOParserSrcInfo& name_src_info); + virtual ~RDOPATPattern(); - typedef std::vector ParamList; - ParamList m_paramList; - rdo::runtime::LPRDOPattern m_pPatRuntime; + typedef std::vector ParamList; + ParamList m_paramList; + rdo::runtime::LPRDOPattern m_pPatRuntime; - rdo::runtime::LPRDOCalc createRelRes(bool trace) const; - virtual void addParamSetCalc(const rdo::runtime::LPRDOCalc& pCalc); - std::vector createParamsCalcs(const std::vector& params) const; + rdo::runtime::LPRDOCalc createRelRes(bool trace) const; + virtual void addParamSetCalc(const rdo::runtime::LPRDOCalc& pCalc); + std::vector createParamsCalcs(const std::vector& params) const; - virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) = 0; - virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) = 0; + virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) = 0; + virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status) = 0; private: - RelResList m_relResList; - bool m_useCommonChoice; - bool m_useCommonWithMax; - LPRDOFUNArithm m_pCommonChoice; - std::size_t m_currentRelResIndex; - LPContextMemory m_pContextMemory; - - std::string typeToString(PatType type) const; - void addChoiceFromCalc(const rdo::runtime::LPRDOCalc& pCalc); - LPRDORelevantResource findRelRes(const std::string& identifier, const RDOParserSrcInfo& srcInfo) const; - - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + RelResList m_relResList; + bool m_useCommonChoice; + bool m_useCommonWithMax; + LPRDOFUNArithm m_pCommonChoice; + std::size_t m_currentRelResIndex; + LPContextMemory m_pContextMemory; + + static std::string typeToString(Type type); + void addChoiceFromCalc(const rdo::runtime::LPRDOCalc& pCalc); + LPRDORelevantResource findRelRes(const std::string& identifier, const RDOParserSrcInfo& srcInfo) const; + + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; DECLARE_POINTER(RDOPATPattern); @@ -149,32 +148,32 @@ class RDOPatternEvent: public RDOPATPattern { DECLARE_FACTORY(RDOPatternEvent) public: - virtual void addRelRes (const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos); - virtual void addRelResUsage(const LPRDOPATChoiceFrom& pChoiceFrom, const LPRDOPATChoiceOrder& pChoiceOrder); - - virtual char getModelStructureLetter() const - { - return 'I'; - } - virtual PatType getType() const - { - return PT_Event; - } - - rdo::runtime::LPRDOCalc getBeforeStartModelPlaning() const; - void setBeforeStartModelPlaning(const rdo::runtime::LPRDOCalc& beforeStartModelPlaning); - runtime::LPRDOCalcEventPlan planning(const runtime::LPRDOCalc& time, const LPArithmContainer& params) const; - runtime::LPRDOCalcEventStop stoping () const; + virtual void addRelRes (const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos); + virtual void addRelResUsage(const LPRDOPATChoiceFrom& pChoiceFrom, const LPRDOPATChoiceOrder& pChoiceOrder); + + virtual char getModelStructureLetter() const + { + return 'I'; + } + virtual Type getType() const + { + return Type::EVENT; + } + + rdo::runtime::LPRDOCalc getBeforeStartModelPlaning() const; + void setBeforeStartModelPlaning(const rdo::runtime::LPRDOCalc& beforeStartModelPlaning); + runtime::LPRDOCalcEventPlan planning(const runtime::LPRDOCalc& time, const LPArithmContainer& params) const; + runtime::LPRDOCalcEventStop stoping () const; protected: - virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); - virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); + virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); + virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); private: - RDOPatternEvent(const RDOParserSrcInfo& name_src_info, bool trace); + RDOPatternEvent(const RDOParserSrcInfo& name_src_info, bool trace); - rdo::runtime::LPRDOCalc m_beforeStartModelPlaning; - LPIBaseOperation m_pRuntimeEvent; + rdo::runtime::LPRDOCalc m_beforeStartModelPlaning; + LPIBaseOperation m_pRuntimeEvent; }; DECLARE_POINTER(RDOPatternEvent); @@ -185,23 +184,23 @@ class RDOPatternRule: public RDOPATPattern { DECLARE_FACTORY(RDOPatternRule) public: - virtual void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos); + virtual void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos); - virtual char getModelStructureLetter() const - { - return 'R'; - }; - virtual PatType getType() const - { - return PT_Rule; - } + virtual char getModelStructureLetter() const + { + return 'R'; + }; + virtual Type getType() const + { + return Type::RULE; + } protected: - virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); - virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); + virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); + virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); private: - RDOPatternRule(const RDOParserSrcInfo& name_src_info, bool trace); + RDOPatternRule(const RDOParserSrcInfo& name_src_info, bool trace); }; // -------------------------------------------------------------------------------- @@ -211,39 +210,38 @@ class RDOPatternOperation: public RDOPATPattern { DECLARE_FACTORY(RDOPatternOperation) public: - virtual void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos); - void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, rdo::runtime::RDOResource::ConvertStatus end, const YYLTYPE& convertor_begin_pos, const YYLTYPE& convertor_end_pos); - void addRelResConvertBeginEnd(bool trace_begin, const LPExpression& pBeginStatementList, bool trace_end, const LPExpression& pEndStatementList, const YYLTYPE& convertor_begin_pos, const YYLTYPE& convertor_end_pos, const YYLTYPE& trace_begin_pos, const YYLTYPE& trace_end_pos); - - virtual char getModelStructureLetter() const - { - return 'A'; - }; - virtual PatType getType() const - { - return PT_Operation; - } + virtual void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, const YYLTYPE& convertor_pos); + void addRelRes(const RDOParserSrcInfo& rel_info, const RDOParserSrcInfo& type_info, rdo::runtime::RDOResource::ConvertStatus beg, rdo::runtime::RDOResource::ConvertStatus end, const YYLTYPE& convertor_begin_pos, const YYLTYPE& convertor_end_pos); + void addRelResConvertBeginEnd(bool trace_begin, const LPExpression& pBeginStatementList, bool trace_end, const LPExpression& pEndStatementList, const YYLTYPE& convertor_begin_pos, const YYLTYPE& convertor_end_pos, const YYLTYPE& trace_begin_pos, const YYLTYPE& trace_end_pos); + + virtual char getModelStructureLetter() const + { + return 'A'; + }; + virtual Type getType() const + { + return Type::OPERATION; + } protected: - //! Конструктор вызывается из RDOPatternKeyboard - RDOPatternOperation(bool trace, const RDOParserSrcInfo& name_src_info); + RDOPatternOperation(bool trace, const RDOParserSrcInfo& name_src_info); - virtual void rel_res_insert (const LPRDORelevantResource& pRelevantResource); - virtual void addParamSetCalc(const rdo::runtime::LPRDOCalc& pCalc ); + virtual void rel_res_insert (const LPRDORelevantResource& pRelevantResource); + virtual void addParamSetCalc(const rdo::runtime::LPRDOCalc& pCalc ); - virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); - virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); + virtual std::string getErrorMessage_NotNeedConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); + virtual std::string getWarningMessage_EmptyConvertor(const std::string& name, rdo::runtime::RDOResource::ConvertStatus status); private: - RDOPatternOperation(const RDOParserSrcInfo& name_src_info, bool trace); - - enum ConvertorType - { - convert_unknow, - convert_begin, - convert_end - }; - ConvertorType m_convertorType; + RDOPatternOperation(const RDOParserSrcInfo& name_src_info, bool trace); + + enum class ConvertorType + { + UNKNOW, + CONVERT_BEGIN, + CONVERT_END + }; + ConvertorType m_convertorType; }; // -------------------------------------------------------------------------------- @@ -253,74 +251,79 @@ class RDOPatternKeyboard: public RDOPatternOperation { DECLARE_FACTORY(RDOPatternKeyboard) public: - virtual char getModelStructureLetter() const - { - return 'K'; - }; - virtual PatType getType() const - { - return PT_Keyboard; - } + virtual char getModelStructureLetter() const + { + return 'K'; + }; + virtual Type getType() const + { + return Type::KEYBOARD; + } private: - RDOPatternKeyboard(const RDOParserSrcInfo& name_src_info, bool trace); + RDOPatternKeyboard(const RDOParserSrcInfo& name_src_info, bool trace); }; // -------------------------------------------------------------------------------- // -------------------- RDORelevantResource // -------------------------------------------------------------------------------- class RDORelevantResource - : public RDOParserSrcInfo - , public boost::noncopyable - , public Context - , public IContextFind + : public RDOParserSrcInfo + , private boost::noncopyable + , public Context + , public IContextFind { DECLARE_FACTORY(RDORelevantResource) public: - int m_relResID; - bool m_alreadyHaveConverter; - LPRDOPATChoiceFrom m_pChoiceFrom; - LPRDOPATChoiceOrder m_pChoiceOrder; - RDOParserSrcInfo m_bodySrcInfo; - - const rdo::runtime::RDOResource::ConvertStatus m_statusBegin; - const rdo::runtime::RDOResource::ConvertStatus m_statusEnd; - - enum - { - stateNone = 0, - choiceEmpty, - choiceNoCheck, - choiceFrom, - choiceOrderEmpty, - choiceOrderFirst, - choiceOrderWithMin, - choiceOrderWithMax, - convertBegin, - convertEnd - } m_currentState; - bool isChoiceFromState() const { return m_currentState == choiceEmpty || m_currentState == choiceNoCheck || m_currentState == choiceFrom; } - - const std::string& name() const { return src_text(); }; - virtual LPRDORTPResType getType() const = 0; - - virtual rdo::runtime::LPRDOCalc createPreSelectRelResCalc () = 0; //! Предварительный выбор ресурсов в самом списке рел. ресурсов - virtual rdo::runtime::LPRDOCalc createSelectResourceChoiceCalc () = 0; //! Самый обыкновенный choice from + first/with_min/with_max - virtual rdo::runtime::LPRDOCalc createSelectFirstResourceChoiceCalc () = 0; //! common first, который не пашет - virtual rdo::runtime::LPIRDOSelectResourceCommon createSelectResourceCommonChoiceCalc() = 0; //! common with_min/with_max - - virtual bool isDirect() const = 0; + int m_relResID; + bool m_alreadyHaveConverter; + LPRDOPATChoiceFrom m_pChoiceFrom; + LPRDOPATChoiceOrder m_pChoiceOrder; + RDOParserSrcInfo m_bodySrcInfo; + + const rdo::runtime::RDOResource::ConvertStatus m_statusBegin; + const rdo::runtime::RDOResource::ConvertStatus m_statusEnd; + + enum class State + { + NONE = 0, + EMPTY, + CHOICE_NOCHECK, + CHOICE_FROM, + CHOICE_ORDER_EMPTY, + CHOICE_ORDER_FIRST, + CHOICE_ORDER_WITH_MIN, + CHOICE_ORDER_WITH_MAX, + CONVERT_BEGIN, + CONVERT_END + }; + State m_currentState; + + bool isChoiceFromState() const + { + return m_currentState == State::EMPTY || m_currentState == State::CHOICE_NOCHECK || m_currentState == State::CHOICE_FROM; + } + + const std::string& name() const { return src_text(); } + virtual LPRDORTPResType getType() const = 0; + + virtual rdo::runtime::LPRDOCalc createPreSelectRelResCalc () = 0; // Предварительный выбор ресурсов в самом списке рел. ресурсов + virtual rdo::runtime::LPRDOCalc createSelectResourceChoiceCalc () = 0; // Самый обыкновенный choice from + first/with_min/with_max + virtual rdo::runtime::LPRDOCalc createSelectFirstResourceChoiceCalc () = 0; // common first, который не пашет + virtual rdo::runtime::LPIRDOSelectResourceCommon createSelectResourceCommonChoiceCalc() = 0; // common with_min/with_max + + virtual bool isDirect() const = 0; protected: - RDORelevantResource(const RDOParserSrcInfo& src_info, const int relResID, const rdo::runtime::RDOResource::ConvertStatus statusBegin, const rdo::runtime::RDOResource::ConvertStatus statusEnd); - virtual ~RDORelevantResource(); + RDORelevantResource(const RDOParserSrcInfo& src_info, const int relResID, const rdo::runtime::RDOResource::ConvertStatus statusBegin, const rdo::runtime::RDOResource::ConvertStatus statusEnd); + virtual ~RDORelevantResource(); - rdo::runtime::LPRDOCalc getChoiceCalc(); - rdo::runtime::LPRDOCalc getSelectCalc(); - rdo::runtime::RDOSelectResourceCalc::Type getSelectType() const; + rdo::runtime::LPRDOCalc getChoiceCalc(); + rdo::runtime::LPRDOCalc getSelectCalc(); + rdo::runtime::RDOSelectResourceCalc::Type getSelectType() const; private: - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; DECLARE_POINTER(RDORelevantResource); @@ -329,26 +332,27 @@ DECLARE_POINTER(RDORelevantResource); // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOPATChoiceFrom); class RDOPATChoiceFrom - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOPATChoiceFrom) public: - enum Type - { - ch_empty = 0, - ch_nocheck, - ch_from - } m_type; + enum class Type + { + EMPTY = 0, + NOCHECK, + FROM + }; + Type m_type; - LPRDOFUNLogic m_pLogic; + LPRDOFUNLogic m_pLogic; private: - RDOPATChoiceFrom(const RDOParserSrcInfo& src_info, Type type, const LPRDOFUNLogic& pLogic = NULL) - : RDOParserSrcInfo(src_info) - , m_type (type ) - , m_pLogic (pLogic ) - {} + RDOPATChoiceFrom(const RDOParserSrcInfo& src_info, Type type, const LPRDOFUNLogic& pLogic = NULL) + : RDOParserSrcInfo(src_info) + , m_type (type ) + , m_pLogic (pLogic ) + {} }; // -------------------------------------------------------------------------------- @@ -356,34 +360,34 @@ DECLARE_FACTORY(RDOPATChoiceFrom) // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOPATChoiceOrder); class RDOPATChoiceOrder - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOPATChoiceOrder) public: - rdo::runtime::RDOSelectResourceCalc::Type m_type; - - LPRDOFUNArithm m_pArithm; - - std::string asString() const - { - switch (m_type) - { - case rdo::runtime::RDOSelectResourceCalc::order_empty : return "<правило_выбора_не_указано>"; - case rdo::runtime::RDOSelectResourceCalc::order_first : return "first"; - case rdo::runtime::RDOSelectResourceCalc::order_with_min: return "with_min"; - case rdo::runtime::RDOSelectResourceCalc::order_with_max: return "with_max"; - default : NEVER_REACH_HERE; - } - return std::string(); - } + rdo::runtime::RDOSelectResourceCalc::Type m_type; + + LPRDOFUNArithm m_pArithm; + + std::string asString() const + { + switch (m_type) + { + case rdo::runtime::RDOSelectResourceCalc::Type::EMPTY : return "<правило_выбора_не_указано>"; + case rdo::runtime::RDOSelectResourceCalc::Type::FIRST : return "first"; + case rdo::runtime::RDOSelectResourceCalc::Type::WITH_MIN: return "with_min"; + case rdo::runtime::RDOSelectResourceCalc::Type::WITH_MAX: return "with_max"; + default : NEVER_REACH_HERE; + } + return std::string(); + } private: - RDOPATChoiceOrder(const RDOParserSrcInfo& src_info, rdo::runtime::RDOSelectResourceCalc::Type type, const LPRDOFUNArithm& pArithm = NULL) - : RDOParserSrcInfo(src_info) - , m_type (type ) - , m_pArithm (pArithm ) - {} + RDOPATChoiceOrder(const RDOParserSrcInfo& src_info, rdo::runtime::RDOSelectResourceCalc::Type type, const LPRDOFUNArithm& pArithm = NULL) + : RDOParserSrcInfo(src_info) + , m_type (type ) + , m_pArithm (pArithm ) + {} }; // -------------------------------------------------------------------------------- @@ -393,22 +397,22 @@ class RDORelevantResourceDirect: public RDORelevantResource { DECLARE_FACTORY(RDORelevantResourceDirect) public: - LPRDORSSResource getResource() const { return m_pResource; } + LPRDORSSResource getResource() const { return m_pResource; } - virtual LPRDORTPResType getType () const; - virtual rdo::runtime::LPRDOCalc createPreSelectRelResCalc (); - virtual rdo::runtime::LPRDOCalc createSelectFirstResourceChoiceCalc (); - virtual rdo::runtime::LPRDOCalc createSelectResourceChoiceCalc (); - virtual rdo::runtime::LPIRDOSelectResourceCommon createSelectResourceCommonChoiceCalc(); - virtual bool isDirect() const { return true; } + virtual LPRDORTPResType getType () const; + virtual rdo::runtime::LPRDOCalc createPreSelectRelResCalc (); + virtual rdo::runtime::LPRDOCalc createSelectFirstResourceChoiceCalc (); + virtual rdo::runtime::LPRDOCalc createSelectResourceChoiceCalc (); + virtual rdo::runtime::LPIRDOSelectResourceCommon createSelectResourceCommonChoiceCalc(); + virtual bool isDirect() const { return true; } private: - RDORelevantResourceDirect(const RDOParserSrcInfo& src_info, const int relResID, const LPRDORSSResource& pResource, const rdo::runtime::RDOResource::ConvertStatus statusBegin, const rdo::runtime::RDOResource::ConvertStatus statusEnd = rdo::runtime::RDOResource::CS_NoChange) - : RDORelevantResource(src_info, relResID, statusBegin, statusEnd) - , m_pResource (pResource) - {} + RDORelevantResourceDirect(const RDOParserSrcInfo& src_info, const int relResID, const LPRDORSSResource& pResource, const rdo::runtime::RDOResource::ConvertStatus statusBegin, const rdo::runtime::RDOResource::ConvertStatus statusEnd = rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + : RDORelevantResource(src_info, relResID, statusBegin, statusEnd) + , m_pResource (pResource) + {} - LPRDORSSResource m_pResource; + LPRDORSSResource m_pResource; }; // -------------------------------------------------------------------------------- @@ -418,25 +422,23 @@ class RDORelevantResourceByType: public RDORelevantResource { DECLARE_FACTORY(RDORelevantResourceByType) public: - virtual LPRDORTPResType getType() const - { - return m_pResType; - } - virtual rdo::runtime::LPRDOCalc createPreSelectRelResCalc (); - virtual rdo::runtime::LPRDOCalc createSelectFirstResourceChoiceCalc (); - virtual rdo::runtime::LPRDOCalc createSelectResourceChoiceCalc (); - virtual rdo::runtime::LPIRDOSelectResourceCommon createSelectResourceCommonChoiceCalc(); - virtual bool isDirect() const { return false; } + virtual LPRDORTPResType getType() const + { + return m_pResType; + } + virtual rdo::runtime::LPRDOCalc createPreSelectRelResCalc (); + virtual rdo::runtime::LPRDOCalc createSelectFirstResourceChoiceCalc (); + virtual rdo::runtime::LPRDOCalc createSelectResourceChoiceCalc (); + virtual rdo::runtime::LPIRDOSelectResourceCommon createSelectResourceCommonChoiceCalc(); + virtual bool isDirect() const { return false; } private: - RDORelevantResourceByType(const RDOParserSrcInfo& src_info, const int relResID, LPRDORTPResType pResType, const rdo::runtime::RDOResource::ConvertStatus statusBegin, const rdo::runtime::RDOResource::ConvertStatus statusEnd = rdo::runtime::RDOResource::CS_NoChange) - : RDORelevantResource(src_info, relResID, statusBegin, statusEnd) - , m_pResType (pResType) - {} + RDORelevantResourceByType(const RDOParserSrcInfo& src_info, const int relResID, LPRDORTPResType pResType, const rdo::runtime::RDOResource::ConvertStatus statusBegin, const rdo::runtime::RDOResource::ConvertStatus statusEnd = rdo::runtime::RDOResource::ConvertStatus::NOCHANGE) + : RDORelevantResource(src_info, relResID, statusBegin, statusEnd) + , m_pResType (pResType) + {} - LPRDORTPResType m_pResType; + LPRDORTPResType m_pResType; }; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPAT_H_ diff --git a/simulator/compiler/parser/rdopmd.cpp b/simulator/compiler/parser/rdopmd.cpp index 3b60e21be..9b96c5cd8 100644 --- a/simulator/compiler/parser/rdopmd.cpp +++ b/simulator/compiler/parser/rdopmd.cpp @@ -17,9 +17,9 @@ OPEN_RDO_PARSER_NAMESPACE int pmdlex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void pmderror(YYLTYPE* /*llocp*/, void* /*lexer*/, YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -29,7 +29,7 @@ void pmderror(YYLTYPE* /*llocp*/, void* /*lexer*/, YYLTYPE* /*llocp*/, void* /*l // -------------------- RDOPMDResult // -------------------------------------------------------------------------------- RDOPMDResult::RDOPMDResult(const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info) + : RDOParserSrcInfo(src_info) {} RDOPMDResult::~RDOPMDResult() @@ -37,34 +37,32 @@ RDOPMDResult::~RDOPMDResult() void RDOPMDResult::endOfCreation(const LPIResult& pResult) { - ASSERT(pResult); - - LPContext pContext = RDOParser::s_parser()->context(); - ASSERT(pContext); - - LPRDOResultGroup pResultGroup = pContext->cast(); - if (!pResultGroup) - { - //! Показатель создаётся не в контексте группы - //! Такое может быть из rdoproc_rss.y - pResultGroup = RDOParser::s_parser()->findResultGroup(""); - if (!pResultGroup) - { - //! Нет даже группы по умолчанию - pResultGroup = rdo::Factory::create(); - ASSERT(pResultGroup); - pResultGroup->init(RDOParserSrcInfo()); - } - } - - m_pResult = pResult; - pResultGroup->append(this); - - LPITrace pTrace = m_pResult.object_dynamic_cast(); - if (pTrace) - { - pTrace->setTraceID(RDOParser::s_parser()->getPMD_id()); - } + ASSERT(pResult); + + LPContext pContext = RDOParser::s_parser()->context(); + ASSERT(pContext); + + LPRDOResultGroup pResultGroup = pContext->cast(); + if (!pResultGroup) + { + // Показатель создаётся не в контексте группы + // Такое может быть из rdoproc_rss.y + pResultGroup = RDOParser::s_parser()->findResultGroup(""); + if (!pResultGroup) + { + // Нет даже группы по умолчанию + pResultGroup = rdo::Factory::create(); + ASSERT(pResultGroup); + pResultGroup->init(RDOParserSrcInfo()); + } + } + + m_pResult = pResult; + pResultGroup->append(this); + + LPITrace pTrace = m_pResult.object_dynamic_cast(); + if (pTrace) + pTrace->setTraceID(RDOParser::s_parser()->getPMD_id()); } // -------------------------------------------------------------------------------- @@ -78,63 +76,61 @@ RDOResultGroup::~RDOResultGroup() void RDOResultGroup::init(const RDOParserSrcInfo& src_info) { - setSrcInfo(src_info); - - LPRDOResultGroup pResultGroupFound = RDOParser::s_parser()->findResultGroup(name()); - if (pResultGroupFound) - { - RDOParser::s_parser()->error().push_only(src_info, rdo::format("Группа показателей '%s' уже существует", src_text().c_str())); - RDOParser::s_parser()->error().push_only(pResultGroupFound->src_info(), "См. первое определение"); - RDOParser::s_parser()->error().push_done(); - } - RDOParser::s_parser()->insertResultGroup(this); - m_pResultGroup = rdo::Factory::create(name()); - ASSERT(m_pResultGroup); - RDOParser::s_parser()->runtime()->addRuntimeResult(m_pResultGroup.object_dynamic_cast()); + setSrcInfo(src_info); + + LPRDOResultGroup pResultGroupFound = RDOParser::s_parser()->findResultGroup(name()); + if (pResultGroupFound) + { + RDOParser::s_parser()->error().push_only(src_info, rdo::format("Группа показателей '%s' уже существует", src_text().c_str())); + RDOParser::s_parser()->error().push_only(pResultGroupFound->src_info(), "См. первое определение"); + RDOParser::s_parser()->error().push_done(); + } + RDOParser::s_parser()->insertResultGroup(this); + m_pResultGroup = rdo::Factory::create(name()); + ASSERT(m_pResultGroup); + RDOParser::s_parser()->runtime()->addRuntimeResult(m_pResultGroup.object_dynamic_cast()); } const std::string& RDOResultGroup::name() const { - return src_text(); + return src_text(); } const LPIResultGroup& RDOResultGroup::getRuntime() const { - return m_pResultGroup; + return m_pResultGroup; } void RDOResultGroup::append(const LPRDOPMDResult& pResult) { - ASSERT(pResult); - LPRDOPMDResult pResultFound = find(pResult->name()); - if (pResultFound) - { - RDOParser::s_parser()->error().push_only(pResult->src_info(), rdo::format("Показатель '%s' уже существует", pResult->src_text().c_str())); - RDOParser::s_parser()->error().push_only(pResultFound->src_info(), "См. первое определение"); - RDOParser::s_parser()->error().push_done(); - } - m_resultList.push_back(pResult); - m_pResultGroup->onAppend(pResult->getRuntime()); - RDOParser::s_parser()->runtime()->addRuntimeResult(pResult->getRuntime()); + ASSERT(pResult); + LPRDOPMDResult pResultFound = find(pResult->name()); + if (pResultFound) + { + RDOParser::s_parser()->error().push_only(pResult->src_info(), rdo::format("Показатель '%s' уже существует", pResult->src_text().c_str())); + RDOParser::s_parser()->error().push_only(pResultFound->src_info(), "См. первое определение"); + RDOParser::s_parser()->error().push_done(); + } + m_resultList.push_back(pResult); + m_pResultGroup->onAppend(pResult->getRuntime()); + RDOParser::s_parser()->runtime()->addRuntimeResult(pResult->getRuntime()); } LPRDOPMDResult RDOResultGroup::find(const std::string& resultName) const { - for (const auto& result: m_resultList) - { - if (result->name() == resultName) - { - return result; - } - } - return NULL; + for (const auto& result: m_resultList) + { + if (result->name() == resultName) + return result; + } + return NULL; } // -------------------------------------------------------------------------------- // -------------------- RDOPMDWatchPar // -------------------------------------------------------------------------------- RDOPMDWatchPar::RDOPMDWatchPar(const RDOParserSrcInfo& src_info) - : RDOPMDResult(src_info) + : RDOPMDResult(src_info) {} RDOPMDWatchPar::~RDOPMDWatchPar() @@ -142,75 +138,73 @@ RDOPMDWatchPar::~RDOPMDWatchPar() void RDOPMDWatchPar::init(bool trace, const RDOParserSrcInfo& res_src_info, const RDOParserSrcInfo& par_src_info) { - LPRDORSSResource pResource = RDOParser::s_parser()->findRSSResource(res_src_info.src_text()); - if (!pResource) - { - RDOParser::s_parser()->error().error(res_src_info, rdo::format("Ресурс '%s' не найден", res_src_info.src_text().c_str())); - } + LPRDORSSResource pResource = RDOParser::s_parser()->findRSSResource(res_src_info.src_text()); + if (!pResource) + { + RDOParser::s_parser()->error().error(res_src_info, rdo::format("Ресурс '%s' не найден", res_src_info.src_text().c_str())); + } /* - if (!pResource->getType()->isPermanent()) - { - RDOParser::s_parser()->error().push_only(res_src_info, "Наблюдать (watch_par) можно только за параметром постоянного ресурса"); - RDOParser::s_parser()->error().push_only(pResource->getType()->src_info(), "См. тип ресурса"); - RDOParser::s_parser()->error().push_done(); - } + if (!pResource->getType()->isPermanent()) + { + RDOParser::s_parser()->error().push_only(res_src_info, "Наблюдать (watch_par) можно только за параметром постоянного ресурса"); + RDOParser::s_parser()->error().push_only(pResource->getType()->src_info(), "См. тип ресурса"); + RDOParser::s_parser()->error().push_done(); + } */ - LPRDORTPParam pParam = pResource->getType()->findRTPParam(par_src_info.src_text()); - if (!pParam) - { - RDOParser::s_parser()->error().push_only(par_src_info, rdo::format("Параметр '%s' не найден", par_src_info.src_text().c_str())); - RDOParser::s_parser()->error().push_only(pResource->src_info(), "См. ресурс"); - RDOParser::s_parser()->error().push_only(pResource->getType()->src_info(), "См. тип ресурса"); - RDOParser::s_parser()->error().push_done(); - } - checkParam(pParam); - - rdo::runtime::LPRDOCalc pResCalc = - rdo::Factory::create(pResource->getID()); - endOfCreation(rdo::Factory::create( - RDOParser::s_parser()->runtime(), - src_text(), - trace, - res_src_info.src_text(), - par_src_info.src_text(), - pResCalc, - pResource->getType()->getRTPParamNumber(par_src_info.src_text()) - )); + LPRDORTPParam pParam = pResource->getType()->findRTPParam(par_src_info.src_text()); + if (!pParam) + { + RDOParser::s_parser()->error().push_only(par_src_info, rdo::format("Параметр '%s' не найден", par_src_info.src_text().c_str())); + RDOParser::s_parser()->error().push_only(pResource->src_info(), "См. ресурс"); + RDOParser::s_parser()->error().push_only(pResource->getType()->src_info(), "См. тип ресурса"); + RDOParser::s_parser()->error().push_done(); + } + checkParam(pParam); + + rdo::runtime::LPRDOCalc pResCalc = + rdo::Factory::create(pResource->getID()); + endOfCreation(rdo::Factory::create( + RDOParser::s_parser()->runtime(), + src_text(), + trace, + res_src_info.src_text(), + par_src_info.src_text(), + pResCalc, + pResource->getType()->getRTPParamNumber(par_src_info.src_text()))); } void RDOPMDWatchPar::initFromParam(bool trace, const LPRDORTPParam& pParam, const rdo::runtime::LPRDOCalc& pResCalc, const std::size_t paramNum) { - const std::string resName; - endOfCreation(rdo::Factory::create( - RDOParser::s_parser()->runtime(), - src_text(), - trace, - resName, - pParam->src_info().src_text(), - pResCalc, - paramNum - )); + const std::string resName; + endOfCreation(rdo::Factory::create( + RDOParser::s_parser()->runtime(), + src_text(), + trace, + resName, + pParam->src_info().src_text(), + pResCalc, + paramNum)); } void RDOPMDWatchPar::checkParam(const LPRDORTPParam& pParam) { - const rdo::runtime::RDOType::TypeID typeID = pParam->getTypeInfo()->typeID(); - if (typeID != rdo::runtime::RDOType::t_int && typeID != rdo::runtime::RDOType::t_real) - { - RDOParser::s_parser()->error().push_only( - pParam->src_info(), - "Наблюдать можно только за параметром целого или вещественного типа" - ); - RDOParser::s_parser()->error().push_only(pParam->getTypeInfo()->src_info(), "См. тип параметра"); - RDOParser::s_parser()->error().push_done(); - } + const rdo::runtime::RDOType::Type typeID = pParam->getTypeInfo()->typeID(); + if (typeID != rdo::runtime::RDOType::Type::INT && typeID != rdo::runtime::RDOType::Type::REAL) + { + RDOParser::s_parser()->error().push_only( + pParam->src_info(), + "Наблюдать можно только за параметром целого или вещественного типа" + ); + RDOParser::s_parser()->error().push_only(pParam->getTypeInfo()->src_info(), "См. тип параметра"); + RDOParser::s_parser()->error().push_done(); + } } // -------------------------------------------------------------------------------- // -------------------- RDOPMDWatchState // -------------------------------------------------------------------------------- RDOPMDWatchState::RDOPMDWatchState(const RDOParserSrcInfo& src_info) - : RDOPMDResult(src_info) + : RDOPMDResult(src_info) {} RDOPMDWatchState::~RDOPMDWatchState() @@ -218,26 +212,33 @@ RDOPMDWatchState::~RDOPMDWatchState() void RDOPMDWatchState::init(bool trace, LPRDOFUNLogic pLogic) { - endOfCreation(rdo::Factory::create(RDOParser::s_parser()->runtime(), src_text(), trace, pLogic->getCalc())); + endOfCreation( + rdo::Factory::create(RDOParser::s_parser()->runtime(), + src_text(), + trace, + pLogic->getCalc())); } // -------------------------------------------------------------------------------- // -------------------- RDOPMDWatchTemp // -------------------------------------------------------------------------------- RDOPMDWatchTemp::RDOPMDWatchTemp(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& res_type_src_info) - : RDOPMDResult(src_info) + : RDOPMDResult(src_info) { - LPRDORTPResType pResType = RDOParser::s_parser()->findRTPResType(res_type_src_info.src_text()); - if (!pResType) - { - RDOParser::s_parser()->error().error(res_type_src_info, rdo::format("Тип ресурса '%s' не найден", res_type_src_info.src_text().c_str())); - } - if (!pResType->isTemporary()) - { - RDOParser::s_parser()->error().push_only(res_type_src_info, "Показатель собирает информацию по временным ресурсам (temporary)"); - RDOParser::s_parser()->error().push_only(pResType->src_info(), "См. тип ресурса"); - RDOParser::s_parser()->error().push_done(); - } + LPRDORTPResType pResType = RDOParser::s_parser()->findRTPResType(res_type_src_info.src_text()); + if (!pResType) + { + RDOParser::s_parser()->error().error( + res_type_src_info, + rdo::format("Тип ресурса '%s' не найден", res_type_src_info.src_text().c_str())); + } + + if (!pResType->isTemporary()) + { + RDOParser::s_parser()->error().push_only(res_type_src_info, "Показатель собирает информацию по временным ресурсам (temporary)"); + RDOParser::s_parser()->error().push_only(pResType->src_info(), "См. тип ресурса"); + RDOParser::s_parser()->error().push_done(); + } } RDOPMDWatchTemp::~RDOPMDWatchTemp() @@ -247,7 +248,7 @@ RDOPMDWatchTemp::~RDOPMDWatchTemp() // -------------------- RDOPMDWatchQuant // -------------------------------------------------------------------------------- RDOPMDWatchQuant::RDOPMDWatchQuant(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& res_type_src_info) - : RDOPMDWatchTemp(src_info, res_type_src_info) + : RDOPMDWatchTemp(src_info, res_type_src_info) {} RDOPMDWatchQuant::~RDOPMDWatchQuant() @@ -255,32 +256,39 @@ RDOPMDWatchQuant::~RDOPMDWatchQuant() void RDOPMDWatchQuant::init(bool trace, const RDOParserSrcInfo& res_type_src_info) { - m_pGroupLogic = rdo::Factory::create(RDOFUNGroupLogic::fgt_unknow, RDOParserSrcInfo(res_type_src_info.src_text())); - ASSERT(m_pGroupLogic); - endOfCreation(rdo::Factory::create(RDOParser::s_parser()->runtime(), src_text(), trace, res_type_src_info.src_text(), m_pGroupLogic->getResType()->getNumber())); + m_pGroupLogic = rdo::Factory::create( + RDOFUNGroupLogic::Type::UNKNOW, + RDOParserSrcInfo(res_type_src_info.src_text())); + ASSERT(m_pGroupLogic); + endOfCreation( + rdo::Factory::create(RDOParser::s_parser()->runtime(), + src_text(), + trace, + res_type_src_info.src_text(), + m_pGroupLogic->getResType()->getNumber())); } void RDOPMDWatchQuant::setLogic(LPRDOFUNLogic& pLogic) { - LPIResultWatchQuant pQuant = m_pResult.object_dynamic_cast(); - ASSERT(pQuant); - pQuant->setLogicCalc(pLogic->getCalc()); - m_pGroupLogic->end(); + LPIResultWatchQuant pQuant = m_pResult.object_dynamic_cast(); + ASSERT(pQuant); + pQuant->setLogicCalc(pLogic->getCalc()); + m_pGroupLogic->end(); } void RDOPMDWatchQuant::setLogicNoCheck() { - LPIResultWatchQuant pQuant = m_pResult.object_dynamic_cast(); - ASSERT(pQuant); - pQuant->setLogicCalc(rdo::Factory::create(1)); - m_pGroupLogic->end(); + LPIResultWatchQuant pQuant = m_pResult.object_dynamic_cast(); + ASSERT(pQuant); + pQuant->setLogicCalc(rdo::Factory::create(1)); + m_pGroupLogic->end(); } // -------------------------------------------------------------------------------- // -------------------- RDOPMDWatchValue // -------------------------------------------------------------------------------- RDOPMDWatchValue::RDOPMDWatchValue(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& res_type_src_info) - : RDOPMDWatchTemp(src_info, res_type_src_info) + : RDOPMDWatchTemp(src_info, res_type_src_info) {} RDOPMDWatchValue::~RDOPMDWatchValue() @@ -288,34 +296,42 @@ RDOPMDWatchValue::~RDOPMDWatchValue() void RDOPMDWatchValue::init(bool trace, const RDOParserSrcInfo& res_type_src_info) { - m_pGroupLogic = rdo::Factory::create(RDOFUNGroupLogic::fgt_unknow, RDOParserSrcInfo(res_type_src_info.src_text())); - ASSERT(m_pGroupLogic); - endOfCreation(rdo::Factory::create(RDOParser::s_parser()->runtime(), src_text(), trace, res_type_src_info.src_text(), m_pGroupLogic->getResType()->getNumber())); + m_pGroupLogic = rdo::Factory::create( + RDOFUNGroupLogic::Type::UNKNOW, + RDOParserSrcInfo(res_type_src_info.src_text())); + ASSERT(m_pGroupLogic); + + endOfCreation( + rdo::Factory::create(RDOParser::s_parser()->runtime(), + src_text(), + trace, + res_type_src_info.src_text(), + m_pGroupLogic->getResType()->getNumber())); } void RDOPMDWatchValue::setLogic(LPRDOFUNLogic& pLogic, LPRDOFUNArithm& pArithm) { - LPIResultWatchValue pWatch = m_pResult.object_dynamic_cast(); - ASSERT(pWatch); - pWatch->setLogicCalc (pLogic->getCalc() ); - pWatch->setArithmCalc(pArithm->createCalc()); - m_pGroupLogic->end(); + LPIResultWatchValue pWatch = m_pResult.object_dynamic_cast(); + ASSERT(pWatch); + pWatch->setLogicCalc(pLogic->getCalc()); + pWatch->setArithmCalc(pArithm->createCalc()); + m_pGroupLogic->end(); } void RDOPMDWatchValue::setLogicNoCheck(LPRDOFUNArithm& pArithm) { - LPIResultWatchValue pWatch = m_pResult.object_dynamic_cast(); - ASSERT(pWatch); - pWatch->setLogicCalc (rdo::Factory::create(1)); - pWatch->setArithmCalc(pArithm->createCalc()); - m_pGroupLogic->end(); + LPIResultWatchValue pWatch = m_pResult.object_dynamic_cast(); + ASSERT(pWatch); + pWatch->setLogicCalc(rdo::Factory::create(1)); + pWatch->setArithmCalc(pArithm->createCalc()); + m_pGroupLogic->end(); } // -------------------------------------------------------------------------------- // -------------------- RDOPMDGetValue // -------------------------------------------------------------------------------- RDOPMDGetValue::RDOPMDGetValue(const RDOParserSrcInfo& src_info) - : RDOPMDResult(src_info) + : RDOPMDResult(src_info) {} RDOPMDGetValue::~RDOPMDGetValue() @@ -323,7 +339,10 @@ RDOPMDGetValue::~RDOPMDGetValue() void RDOPMDGetValue::init(LPRDOFUNArithm pArithm) { - endOfCreation(rdo::Factory::create(RDOParser::s_parser()->runtime(), src_text(), pArithm->createCalc())); + endOfCreation( + rdo::Factory::create(RDOParser::s_parser()->runtime(), + src_text(), + pArithm->createCalc())); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdopmd.h b/simulator/compiler/parser/rdopmd.h index c7df2e59c..063be730f 100644 --- a/simulator/compiler/parser/rdopmd.h +++ b/simulator/compiler/parser/rdopmd.h @@ -1,5 +1,4 @@ -#ifndef _RDOPMD_PMD_H_ -#define _RDOPMD_PMD_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -17,46 +16,46 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOPMDResult); class RDOPMDResult - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOPMDResult); public: - const std::string& name() const { return src_text(); } - const LPIResult& getRuntime() const { return m_pResult; } + const std::string& name() const { return src_text(); } + const LPIResult& getRuntime() const { return m_pResult; } protected: - RDOPMDResult(const RDOParserSrcInfo& src_info); - virtual ~RDOPMDResult(); + RDOPMDResult(const RDOParserSrcInfo& src_info); + virtual ~RDOPMDResult(); - void endOfCreation(const LPIResult& pResult); + void endOfCreation(const LPIResult& pResult); - LPIResult m_pResult; + LPIResult m_pResult; }; // -------------------------------------------------------------------------------- // -------------------- RDOResultGroup // -------------------------------------------------------------------------------- class RDOResultGroup - : public RDOParserSrcInfo - , public Context + : public RDOParserSrcInfo + , public Context { DECLARE_FACTORY(RDOResultGroup); public: - void init(const RDOParserSrcInfo& src_info); - const std::string& name() const; - const LPIResultGroup& getRuntime() const; - void append(const LPRDOPMDResult& pResult); - LPRDOPMDResult find(const std::string& resultName) const; + void init(const RDOParserSrcInfo& src_info); + const std::string& name() const; + const LPIResultGroup& getRuntime() const; + void append(const LPRDOPMDResult& pResult); + LPRDOPMDResult find(const std::string& resultName) const; private: - RDOResultGroup(); - virtual ~RDOResultGroup(); + RDOResultGroup(); + virtual ~RDOResultGroup(); - typedef std::list ResultList; + typedef std::list ResultList; - ResultList m_resultList; - LPIResultGroup m_pResultGroup; + ResultList m_resultList; + LPIResultGroup m_pResultGroup; }; DECLARE_POINTER(RDOResultGroup); @@ -67,13 +66,13 @@ class RDOPMDWatchPar: public RDOPMDResult { DECLARE_FACTORY(RDOPMDWatchPar); public: - void init(bool trace, const RDOParserSrcInfo& res_src_info, const RDOParserSrcInfo& par_src_info); - void initFromParam(bool trace, const LPRDORTPParam& pParam, const rdo::runtime::LPRDOCalc& pResCalc, const std::size_t paramNum); - void checkParam(const LPRDORTPParam& pParam); + void init(bool trace, const RDOParserSrcInfo& res_src_info, const RDOParserSrcInfo& par_src_info); + void initFromParam(bool trace, const LPRDORTPParam& pParam, const rdo::runtime::LPRDOCalc& pResCalc, const std::size_t paramNum); + void checkParam(const LPRDORTPParam& pParam); private: - RDOPMDWatchPar(const RDOParserSrcInfo& src_info); - virtual ~RDOPMDWatchPar(); + RDOPMDWatchPar(const RDOParserSrcInfo& src_info); + virtual ~RDOPMDWatchPar(); }; DECLARE_POINTER(RDOPMDWatchPar); @@ -84,11 +83,11 @@ class RDOPMDWatchState: public RDOPMDResult { DECLARE_FACTORY(RDOPMDWatchState); public: - void init(bool trace, LPRDOFUNLogic pLogic); + void init(bool trace, LPRDOFUNLogic pLogic); private: - RDOPMDWatchState(const RDOParserSrcInfo& src_info); - virtual ~RDOPMDWatchState(); + RDOPMDWatchState(const RDOParserSrcInfo& src_info); + virtual ~RDOPMDWatchState(); }; DECLARE_POINTER(RDOPMDWatchState); @@ -98,8 +97,8 @@ DECLARE_POINTER(RDOPMDWatchState); class RDOPMDWatchTemp: public RDOPMDResult { protected: - RDOPMDWatchTemp(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& res_type_src_info); - virtual ~RDOPMDWatchTemp(); + RDOPMDWatchTemp(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& res_type_src_info); + virtual ~RDOPMDWatchTemp(); }; // -------------------------------------------------------------------------------- @@ -109,15 +108,15 @@ class RDOPMDWatchQuant: public RDOPMDWatchTemp { DECLARE_FACTORY(RDOPMDWatchQuant); public: - void init (bool trace, const RDOParserSrcInfo& res_type_src_info); - void setLogic (LPRDOFUNLogic& pLogic); - void setLogicNoCheck(); + void init (bool trace, const RDOParserSrcInfo& res_type_src_info); + void setLogic (LPRDOFUNLogic& pLogic); + void setLogicNoCheck(); private: - RDOPMDWatchQuant(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& res_type_src_info); - virtual ~RDOPMDWatchQuant(); + RDOPMDWatchQuant(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& res_type_src_info); + virtual ~RDOPMDWatchQuant(); - LPRDOFUNGroupLogic m_pGroupLogic; + LPRDOFUNGroupLogic m_pGroupLogic; }; DECLARE_POINTER(RDOPMDWatchQuant); @@ -128,15 +127,15 @@ class RDOPMDWatchValue: public RDOPMDWatchTemp { DECLARE_FACTORY(RDOPMDWatchValue); public: - void init (bool trace, const RDOParserSrcInfo& res_type_src_info); - void setLogic (LPRDOFUNLogic& pLogic, LPRDOFUNArithm& pArithm); - void setLogicNoCheck(LPRDOFUNArithm& pArithm); + void init (bool trace, const RDOParserSrcInfo& res_type_src_info); + void setLogic (LPRDOFUNLogic& pLogic, LPRDOFUNArithm& pArithm); + void setLogicNoCheck(LPRDOFUNArithm& pArithm); private: - RDOPMDWatchValue(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& res_type_src_info); - virtual ~RDOPMDWatchValue(); + RDOPMDWatchValue(const RDOParserSrcInfo& src_info, const RDOParserSrcInfo& res_type_src_info); + virtual ~RDOPMDWatchValue(); - LPRDOFUNGroupLogic m_pGroupLogic; + LPRDOFUNGroupLogic m_pGroupLogic; }; DECLARE_POINTER(RDOPMDWatchValue); @@ -147,14 +146,12 @@ class RDOPMDGetValue: public RDOPMDResult { DECLARE_FACTORY(RDOPMDGetValue); public: - void init(LPRDOFUNArithm pArithm); + void init(LPRDOFUNArithm pArithm); private: - RDOPMDGetValue(const RDOParserSrcInfo& src_info); - virtual ~RDOPMDGetValue(); + RDOPMDGetValue(const RDOParserSrcInfo& src_info); + virtual ~RDOPMDGetValue(); }; DECLARE_POINTER(RDOPMDGetValue); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPMD_PMD_H_ diff --git a/simulator/compiler/parser/rdoprocess.cpp b/simulator/compiler/parser/rdoprocess.cpp index ba1fca96a..155b1c383 100644 --- a/simulator/compiler/parser/rdoprocess.cpp +++ b/simulator/compiler/parser/rdoprocess.cpp @@ -16,9 +16,9 @@ OPEN_RDO_PARSER_NAMESPACE int proc_rtp_lex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void proc_rtp_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -26,9 +26,9 @@ void proc_rtp_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/ int proc_rss_lex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void proc_rss_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -36,9 +36,9 @@ void proc_rss_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/ int proc_opr_lex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void proc_opr_error(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -50,69 +50,69 @@ std::string RDOPROCProcess::s_name_prefix = ""; std::string RDOPROCProcess::s_name_sufix = "s"; RDOPROCProcess::RDOPROCProcess(const RDOParserSrcInfo& info, const std::string& name, LPRDORTPResType transactType) - : RDOParserSrcInfo(info ) - , m_closed (false ) - , m_name (name ) - , m_transactType (transactType) + : RDOParserSrcInfo(info ) + , m_closed (false ) + , m_name (name ) + , m_transactType (transactType) { - RDOParser::s_parser()->insertPROCProcess(this); - m_pRuntime = rdo::Factory::create(info.src_text(), RDOParser::s_parser()->runtime()); - ASSERT(m_pRuntime); - m_pRuntime.object_dynamic_cast()->init(RDOParser::s_parser()->runtime()); + RDOParser::s_parser()->insertPROCProcess(this); + m_pRuntime = rdo::Factory::create(info.src_text(), RDOParser::s_parser()->runtime()); + ASSERT(m_pRuntime); + m_pRuntime.object_dynamic_cast()->init(RDOParser::s_parser()->runtime()); } bool RDOPROCProcess::setPrior(LPRDOFUNArithm& pPrior) { - LPILogic pRuntimeLogic = getRunTime(); - LPIPriority pPriority = pRuntimeLogic.object_dynamic_cast(); - if (pPriority) - { - return pPriority->setPrior(pPrior->createCalc()); - } - return false; + LPILogic pRuntimeLogic = getRunTime(); + LPIPriority pPriority = pRuntimeLogic.object_dynamic_cast(); + if (pPriority) + { + return pPriority->setPrior(pPrior->createCalc()); + } + return false; } void RDOPROCProcess::end() { - m_closed = true; - if (getConditon()) - { - getRunTime()->setCondition(getConditon()->getCalc()); - } + m_closed = true; + if (getConditon()) + { + getRunTime()->setCondition(getConditon()->getCalc()); + } } void RDOPROCProcess::insertBlock(const LPRDOPROCOperator& pBlock) { - ASSERT(pBlock); - m_blockList.push_back(pBlock); + ASSERT(pBlock); + m_blockList.push_back(pBlock); } void RDOPROCProcess::insertChild(LPRDOPROCProcess& pProcess) { - ASSERT(pProcess); - m_childProcessList.push_back(pProcess); - pProcess->m_pParentProcess = this; + ASSERT(pProcess); + m_childProcessList.push_back(pProcess); + pProcess->m_pParentProcess = this; } bool RDOPROCProcess::checkTransactType(const std::string& name) const { - return (name == m_transactType->name()); + return (name == m_transactType->name()); } -Context::LPFindResult RDOPROCProcess::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const +Context::LPFindResult RDOPROCProcess::onFindContext(const std::string& /*method*/, const Context::Params& /*params*/, const RDOParserSrcInfo& /*srcInfo*/) const { - return rdo::Factory::create(); + return rdo::Factory::create(); } // -------------------------------------------------------------------------------- // -------------------- RDOPROCOperator // -------------------------------------------------------------------------------- RDOPROCOperator::RDOPROCOperator(const LPRDOPROCProcess& pProcess, const std::string& name) - : m_name (name ) - , m_pProcess(pProcess) + : m_name (name ) + , m_pProcess(pProcess) { - ASSERT(pProcess); - m_pProcess->insertBlock(this); + ASSERT(pProcess); + m_pProcess->insertBlock(this); } RDOPROCOperator::~RDOPROCOperator() @@ -122,238 +122,238 @@ RDOPROCOperator::~RDOPROCOperator() // -------------------- RDOPROCGenerate // -------------------------------------------------------------------------------- RDOPROCGenerate::RDOPROCGenerate(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pTimeCalc, const rdo::runtime::LPRDOCalc& pCreateAndGoOnTransactCalc) - : RDOPROCOperator(pProcess, name) + : RDOPROCOperator(pProcess, name) { - m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pTimeCalc, pCreateAndGoOnTransactCalc).object_dynamic_cast(); - ASSERT(m_pRuntime); + m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pTimeCalc, pCreateAndGoOnTransactCalc).object_dynamic_cast(); + ASSERT(m_pRuntime); } // -------------------------------------------------------------------------------- // -------------------- RDOPROCBlockForQueue // -------------------------------------------------------------------------------- RDOPROCBlockForQueue::RDOPROCBlockForQueue(const LPRDOPROCProcess& pProcess, const std::string& name) - : RDOPROCOperator(pProcess, name) + : RDOPROCOperator(pProcess, name) {} // -------------------------------------------------------------------------------- // -------------------- RDOPROCQueue // -------------------------------------------------------------------------------- RDOPROCQueue::RDOPROCQueue(const LPRDOPROCProcess& pProcess, const std::string& name) - : RDOPROCBlockForQueue(pProcess, name) + : RDOPROCBlockForQueue(pProcess, name) {} void RDOPROCQueue::createRuntime() { - LPRDORSSResource pResource = RDOParser::s_parser()->findRSSResource(m_resourceName); - if (pResource) - { - const std::string res_name = pResource->name(); - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(RDOParser::s_parser()); - //! Создадим тип ресурса - rdo::compiler::mbuilder::RDOResType rtp = rssList[res_name].getType(); - //! "длина_очереди" - const std::string rtp_param_name = rdo::runtime::RDOPROCQueue::getQueueParamName(); - m_parserForRuntime.Id_res = pResource->getID(); - m_parserForRuntime.Id_param = rtp.m_params[rtp_param_name].id(); - } - else - { - RDOParser::s_parser()->error().error(RDOParserSrcInfo(), rdo::format("Внутренняя ошибка RDOPROCQueue: не нашли parser-ресурс '%s'", m_resourceName.c_str())); - } - m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), m_parserForRuntime).object_dynamic_cast(); - ASSERT(m_pRuntime); + LPRDORSSResource pResource = RDOParser::s_parser()->findRSSResource(m_resourceName); + if (pResource) + { + const std::string res_name = pResource->name(); + // Получили список всех ресурсов + rdo::compiler::mbuilder::RDOResourceList rssList(RDOParser::s_parser()); + // Создадим тип ресурса + rdo::compiler::mbuilder::RDOResType rtp = rssList[res_name].getType(); + // "длина_очереди" + const std::string rtp_param_name = rdo::runtime::RDOPROCQueue::getQueueParamName(); + m_parserForRuntime.Id_res = pResource->getID(); + m_parserForRuntime.Id_param = rtp.m_params[rtp_param_name].id(); + } + else + { + RDOParser::s_parser()->error().error(RDOParserSrcInfo(), rdo::format("Внутренняя ошибка RDOPROCQueue: не нашли parser-ресурс '%s'", m_resourceName.c_str())); + } + m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), m_parserForRuntime).object_dynamic_cast(); + ASSERT(m_pRuntime); } void RDOPROCQueue::setResource(const std::string& name) { - ASSERT(!name.empty()); - ASSERT(m_resourceName.empty()); + ASSERT(!name.empty()); + ASSERT(m_resourceName.empty()); - m_resourceName = name; + m_resourceName = name; } // -------------------------------------------------------------------------------- // -------------------- RDOPROCDepart // -------------------------------------------------------------------------------- RDOPROCDepart::RDOPROCDepart(const LPRDOPROCProcess& pProcess, const std::string& name) - : RDOPROCBlockForQueue(pProcess, name) + : RDOPROCBlockForQueue(pProcess, name) {} void RDOPROCDepart::createRuntime() { - LPRDORSSResource pResource = RDOParser::s_parser()->findRSSResource(m_resourceName); - if (pResource) - { - const std::string res_name = pResource->name(); - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(RDOParser::s_parser()); - //! Создадим тип ресурса - rdo::compiler::mbuilder::RDOResType rtp = rssList[res_name].getType(); - //! "длина_очереди" - const std::string rtp_param_name = rdo::runtime::RDOPROCDepart::getDepartParamName(); - m_parserForRuntime.Id_res = pResource->getID(); - m_parserForRuntime.Id_param = rtp.m_params[rtp_param_name].id(); - } - else - { - RDOParser::s_parser()->error().error(RDOParserSrcInfo(), rdo::format("Внутренняя ошибка RDOPROCQueue: не нашли parser-ресурс '%s'", m_resourceName.c_str())); - } - m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), m_parserForRuntime).object_dynamic_cast(); - ASSERT(m_pRuntime); + LPRDORSSResource pResource = RDOParser::s_parser()->findRSSResource(m_resourceName); + if (pResource) + { + const std::string res_name = pResource->name(); + // Получили список всех ресурсов + rdo::compiler::mbuilder::RDOResourceList rssList(RDOParser::s_parser()); + // Создадим тип ресурса + rdo::compiler::mbuilder::RDOResType rtp = rssList[res_name].getType(); + // "длина_очереди" + const std::string rtp_param_name = rdo::runtime::RDOPROCDepart::getDepartParamName(); + m_parserForRuntime.Id_res = pResource->getID(); + m_parserForRuntime.Id_param = rtp.m_params[rtp_param_name].id(); + } + else + { + RDOParser::s_parser()->error().error(RDOParserSrcInfo(), rdo::format("Внутренняя ошибка RDOPROCQueue: не нашли parser-ресурс '%s'", m_resourceName.c_str())); + } + m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), m_parserForRuntime).object_dynamic_cast(); + ASSERT(m_pRuntime); } void RDOPROCDepart::setResource(const std::string& name) { - ASSERT(!name.empty()); - ASSERT(m_resourceName.empty()); + ASSERT(!name.empty()); + ASSERT(m_resourceName.empty()); - m_resourceName = name; + m_resourceName = name; } // -------------------------------------------------------------------------------- // -------------------- RDOPROCBlockForSeize // -------------------------------------------------------------------------------- RDOPROCBlockForSeize::RDOPROCBlockForSeize(const LPRDOPROCProcess& pProcess, const std::string& name) - : RDOPROCOperator(pProcess, name) + : RDOPROCOperator(pProcess, name) {} // -------------------------------------------------------------------------------- // -------------------- RDOPROCSeize // -------------------------------------------------------------------------------- RDOPROCSeize::RDOPROCSeize(const LPRDOPROCProcess& pProcess, const std::string& name) - : RDOPROCBlockForSeize(pProcess, name) + : RDOPROCBlockForSeize(pProcess, name) {} void RDOPROCSeize::createRuntime() { - for (const auto& resource: m_resourceList) - { - LPRDORSSResource pResource = RDOParser::s_parser()->findRSSResource(resource); - if (pResource) - { - const std::string res_name = pResource->name(); - // Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(RDOParser::s_parser()); - // Создадим тип ресурса - rdo::compiler::mbuilder::RDOResType rtp = rssList[res_name].getType(); - // "Состояние" - const std::string rtp_param_name = rdo::runtime::RDOPROCBlockForSeize::getStateParamName(); - // проверим его на наличие перечислимого параметра - if (!rtp.m_params[rtp_param_name].exist()) - { - RDOParser::s_parser()->error().error(rtp.src_info(), rdo::format("У типа ресурса '%s' нет параметра перечислимого типа '%s'", rtp.name().c_str(), rtp_param_name.c_str())); - } - rdo::runtime::parser_for_Seize bbb; - bbb.Id_res = pResource->getID(); - bbb.Id_param = rtp.m_params[rtp_param_name].id(); - m_parserForRuntime.push_back(bbb); - } - else - { - RDOParser::s_parser()->error().error(RDOParserSrcInfo(), rdo::format("Внутренняя ошибка RDOPROCSeize: не нашли parser-ресурс '%s'", resource.c_str())); - } - } - - if (!m_parserForRuntime.empty()) - { - m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), m_parserForRuntime).object_dynamic_cast(); - ASSERT(m_pRuntime); - } - else - { - RDOParser::s_parser()->error().error(RDOParserSrcInfo(), "Внутренняя ошибка: блок Seize не содержит ресурсов"); - } + for (const auto& resource: m_resourceList) + { + LPRDORSSResource pResource = RDOParser::s_parser()->findRSSResource(resource); + if (pResource) + { + const std::string res_name = pResource->name(); + // Получили список всех ресурсов + rdo::compiler::mbuilder::RDOResourceList rssList(RDOParser::s_parser()); + // Создадим тип ресурса + rdo::compiler::mbuilder::RDOResType rtp = rssList[res_name].getType(); + // "Состояние" + const std::string rtp_param_name = rdo::runtime::RDOPROCBlockForSeize::getStateParamName(); + // проверим его на наличие перечислимого параметра + if (!rtp.m_params[rtp_param_name].exist()) + { + RDOParser::s_parser()->error().error(rtp.src_info(), rdo::format("У типа ресурса '%s' нет параметра перечислимого типа '%s'", rtp.name().c_str(), rtp_param_name.c_str())); + } + rdo::runtime::parser_for_Seize bbb; + bbb.Id_res = pResource->getID(); + bbb.Id_param = rtp.m_params[rtp_param_name].id(); + m_parserForRuntime.push_back(bbb); + } + else + { + RDOParser::s_parser()->error().error(RDOParserSrcInfo(), rdo::format("Внутренняя ошибка RDOPROCSeize: не нашли parser-ресурс '%s'", resource.c_str())); + } + } + + if (!m_parserForRuntime.empty()) + { + m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), m_parserForRuntime).object_dynamic_cast(); + ASSERT(m_pRuntime); + } + else + { + RDOParser::s_parser()->error().error(RDOParserSrcInfo(), "Внутренняя ошибка: блок Seize не содержит ресурсов"); + } } void RDOPROCSeize::addResource(const std::string& name) { - ASSERT(!name.empty()); - m_resourceList.push_back(name); + ASSERT(!name.empty()); + m_resourceList.push_back(name); } // -------------------------------------------------------------------------------- // -------------------- RDOPROCRelease // -------------------------------------------------------------------------------- RDOPROCRelease::RDOPROCRelease(const LPRDOPROCProcess& pProcess, const std::string& name) - : RDOPROCBlockForSeize(pProcess, name) + : RDOPROCBlockForSeize(pProcess, name) {} void RDOPROCRelease::createRuntime() { - for (const auto& resource: m_resourceList) - { - LPRDORSSResource pResource = RDOParser::s_parser()->findRSSResource(resource); - if (pResource) - { - const std::string res_name = pResource->name(); - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(RDOParser::s_parser()); - //! Создадим тип ресурса - rdo::compiler::mbuilder::RDOResType rtp = rssList[res_name].getType(); - //! "Состояние" - const std::string rtp_param_name = rdo::runtime::RDOPROCBlockForSeize::getStateParamName(); - //! проверим его на наличие перечислимого параметра - if (!rtp.m_params[rtp_param_name].exist()) - { - RDOParser::s_parser()->error().error(rtp.src_info(), rdo::format("У типа ресурса '%s' нет параметра перечислимого типа '%s'", rtp.name().c_str(), rtp_param_name.c_str())); - } - rdo::runtime::parser_for_Seize bbb; - bbb.Id_res = pResource->getID(); - bbb.Id_param = rtp.m_params[rtp_param_name].id(); - m_parserForRuntime.push_back(bbb); - } - else - { - RDOParser::s_parser()->error().error(RDOParserSrcInfo(), rdo::format("Внутренняя ошибка RDOPROCRelease: не нашли parser-ресурс '%s'", resource.c_str())); - } - } - - if (!m_parserForRuntime.empty()) - { - m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), m_parserForRuntime).object_dynamic_cast(); - ASSERT(m_pRuntime); - } - else - { - RDOParser::s_parser()->error().error(RDOParserSrcInfo(), "Внутренняя ошибка: блок Release не содержит ресурсов"); - } + for (const auto& resource: m_resourceList) + { + LPRDORSSResource pResource = RDOParser::s_parser()->findRSSResource(resource); + if (pResource) + { + const std::string res_name = pResource->name(); + // Получили список всех ресурсов + rdo::compiler::mbuilder::RDOResourceList rssList(RDOParser::s_parser()); + // Создадим тип ресурса + rdo::compiler::mbuilder::RDOResType rtp = rssList[res_name].getType(); + // "Состояние" + const std::string rtp_param_name = rdo::runtime::RDOPROCBlockForSeize::getStateParamName(); + // проверим его на наличие перечислимого параметра + if (!rtp.m_params[rtp_param_name].exist()) + { + RDOParser::s_parser()->error().error(rtp.src_info(), rdo::format("У типа ресурса '%s' нет параметра перечислимого типа '%s'", rtp.name().c_str(), rtp_param_name.c_str())); + } + rdo::runtime::parser_for_Seize bbb; + bbb.Id_res = pResource->getID(); + bbb.Id_param = rtp.m_params[rtp_param_name].id(); + m_parserForRuntime.push_back(bbb); + } + else + { + RDOParser::s_parser()->error().error(RDOParserSrcInfo(), rdo::format("Внутренняя ошибка RDOPROCRelease: не нашли parser-ресурс '%s'", resource.c_str())); + } + } + + if (!m_parserForRuntime.empty()) + { + m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), m_parserForRuntime).object_dynamic_cast(); + ASSERT(m_pRuntime); + } + else + { + RDOParser::s_parser()->error().error(RDOParserSrcInfo(), "Внутренняя ошибка: блок Release не содержит ресурсов"); + } } void RDOPROCRelease::addResource(const std::string& name) { - ASSERT(!name.empty()); - m_resourceList.push_back(name); + ASSERT(!name.empty()); + m_resourceList.push_back(name); } // -------------------------------------------------------------------------------- // -------------------- RDOPROCAdvance // -------------------------------------------------------------------------------- RDOPROCAdvance::RDOPROCAdvance(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pTimeCalc) - : RDOPROCOperator(pProcess, name) + : RDOPROCOperator(pProcess, name) { - m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pTimeCalc).object_dynamic_cast(); - ASSERT(m_pRuntime); + m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pTimeCalc).object_dynamic_cast(); + ASSERT(m_pRuntime); } // -------------------------------------------------------------------------------- // -------------------- RDOPROCTerminate // -------------------------------------------------------------------------------- RDOPROCTerminate::RDOPROCTerminate(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pCalc) - : RDOPROCOperator(pProcess, name) + : RDOPROCOperator(pProcess, name) { - m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pCalc).object_dynamic_cast(); - ASSERT(m_pRuntime); + m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pCalc).object_dynamic_cast(); + ASSERT(m_pRuntime); } // -------------------------------------------------------------------------------- // -------------------- RDOPROCAssign // -------------------------------------------------------------------------------- RDOPROCAssign::RDOPROCAssign(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pCalc) - : RDOPROCOperator(pProcess, name) + : RDOPROCOperator(pProcess, name) { - m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pCalc).object_dynamic_cast(); - ASSERT(m_pRuntime); + m_pRuntime = rdo::Factory::create(RDOParser::s_parser()->getLastPROCProcess()->getRunTime().object_dynamic_cast(), pCalc).object_dynamic_cast(); + ASSERT(m_pRuntime); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdoprocess.h b/simulator/compiler/parser/rdoprocess.h index 3cf16f63a..5936f9d39 100644 --- a/simulator/compiler/parser/rdoprocess.h +++ b/simulator/compiler/parser/rdoprocess.h @@ -1,5 +1,4 @@ -#ifndef _LIB_PARSER_PROCESS_H_ -#define _LIB_PARSER_PROCESS_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -45,51 +44,51 @@ PREDECLARE_POINTER(RDOPROCOperator); PREDECLARE_POINTER(RDOPROCProcess); class RDOPROCProcess - : public RDOParserSrcInfo - , public Context - , public IContextFind + : public RDOParserSrcInfo + , public Context + , public IContextFind { DECLARE_FACTORY(RDOPROCProcess); public: - typedef std::list ProcessList; - typedef std::list BlockList; + typedef std::list ProcessList; + typedef std::list BlockList; - static std::string s_name_prefix; - static std::string s_name_sufix; + static std::string s_name_prefix; + static std::string s_name_sufix; - std::string name() const { return m_name; } + std::string name() const { return m_name; } - void end(); - bool closed() const { return m_closed; } + void end(); + bool closed() const { return m_closed; } - void setCondition(const LPRDOFUNLogic& pConditon = NULL) { m_pConditon = pConditon; } - LPRDOFUNLogic getConditon () const { return m_pConditon; } - const BlockList& getBlockList() const { return m_blockList; } - LPRDORTPResType getTransacType() { return m_transactType; } + void setCondition(const LPRDOFUNLogic& pConditon = NULL) { m_pConditon = pConditon; } + LPRDOFUNLogic getConditon () const { return m_pConditon; } + const BlockList& getBlockList() const { return m_blockList; } + LPRDORTPResType getTransacType() { return m_transactType; } - bool checkTransactType(const std::string& name) const; + bool checkTransactType(const std::string& name) const; - bool setPrior(LPRDOFUNArithm& pPrior); - void insertBlock(const LPRDOPROCOperator& pBlock); - void insertChild(LPRDOPROCProcess& pProcess); + bool setPrior(LPRDOFUNArithm& pPrior); + void insertBlock(const LPRDOPROCOperator& pBlock); + void insertChild(LPRDOPROCProcess& pProcess); - LPILogic getRunTime () const { return m_pRuntime; } + LPILogic getRunTime () const { return m_pRuntime; } protected: - bool m_closed; - LPRDOPROCProcess m_pParentProcess; - ProcessList m_childProcessList; - BlockList m_blockList; - LPILogic m_pRuntime; + bool m_closed; + LPRDOPROCProcess m_pParentProcess; + ProcessList m_childProcessList; + BlockList m_blockList; + LPILogic m_pRuntime; private: - RDOPROCProcess(const RDOParserSrcInfo& info, const std::string& name, LPRDORTPResType transactType); + RDOPROCProcess(const RDOParserSrcInfo& info, const std::string& name, LPRDORTPResType transactType); - LPRDOFUNLogic m_pConditon; - std::string m_name; - LPRDORTPResType m_transactType; + LPRDOFUNLogic m_pConditon; + std::string m_name; + LPRDORTPResType m_transactType; - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; // -------------------------------------------------------------------------------- @@ -100,13 +99,13 @@ class RDOPROCOperator: public rdo::counter_reference { DECLARE_FACTORY(RDOPROCOperator); public: - virtual LPIPROCBlock getRuntimeBlock() const = 0; + virtual LPIPROCBlock getRuntimeBlock() const = 0; protected: - std::string m_name; - LPRDOPROCProcess m_pProcess; + std::string m_name; + LPRDOPROCProcess m_pProcess; - RDOPROCOperator(const LPRDOPROCProcess& pProcess, const std::string& name); - virtual ~RDOPROCOperator(); + RDOPROCOperator(const LPRDOPROCProcess& pProcess, const std::string& name); + virtual ~RDOPROCOperator(); }; // -------------------------------------------------------------------------------- @@ -116,12 +115,12 @@ class RDOPROCGenerate: public RDOPROCOperator { DECLARE_FACTORY(RDOPROCGenerate); public: - LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } + LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } protected: - LPIPROCBlock m_pRuntime; + LPIPROCBlock m_pRuntime; private: - RDOPROCGenerate(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pTimeCalc, const rdo::runtime::LPRDOCalc& pCreateAndGoOnTransactCalc); + RDOPROCGenerate(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pTimeCalc, const rdo::runtime::LPRDOCalc& pCreateAndGoOnTransactCalc); }; DECLARE_POINTER(RDOPROCGenerate); @@ -131,10 +130,10 @@ DECLARE_POINTER(RDOPROCGenerate); class RDOPROCBlockForQueue: public RDOPROCOperator { protected: - RDOPROCBlockForQueue(const LPRDOPROCProcess& pProcess, const std::string& name); + RDOPROCBlockForQueue(const LPRDOPROCProcess& pProcess, const std::string& name); - //! m_parserForRuntime служит для передачи информации о параметре "Состояние" ресурса - rdo::runtime::parser_for_Queue m_parserForRuntime; + // m_parserForRuntime служит для передачи информации о параметре "Состояние" ресурса + rdo::runtime::parser_for_Queue m_parserForRuntime; }; // -------------------------------------------------------------------------------- @@ -144,16 +143,16 @@ class RDOPROCQueue: public RDOPROCBlockForQueue { DECLARE_FACTORY(RDOPROCQueue); public: - LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } - void createRuntime(); - void setResource (const std::string& name); + LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } + void createRuntime(); + void setResource (const std::string& name); protected: - std::string m_resourceName; - LPIPROCBlock m_pRuntime; + std::string m_resourceName; + LPIPROCBlock m_pRuntime; private: - RDOPROCQueue(const LPRDOPROCProcess& pProcess, const std::string& name); + RDOPROCQueue(const LPRDOPROCProcess& pProcess, const std::string& name); }; DECLARE_POINTER(RDOPROCQueue); @@ -164,16 +163,16 @@ class RDOPROCDepart: public RDOPROCBlockForQueue { DECLARE_FACTORY(RDOPROCDepart); public: - LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } - void createRuntime(); - void setResource(const std::string& name); + LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } + void createRuntime(); + void setResource(const std::string& name); protected: - std::string m_resourceName; - LPIPROCBlock m_pRuntime; + std::string m_resourceName; + LPIPROCBlock m_pRuntime; private: - RDOPROCDepart(const LPRDOPROCProcess& pProcess, const std::string& name); + RDOPROCDepart(const LPRDOPROCProcess& pProcess, const std::string& name); }; DECLARE_POINTER(RDOPROCDepart); @@ -183,10 +182,10 @@ DECLARE_POINTER(RDOPROCDepart); class RDOPROCBlockForSeize: public RDOPROCOperator { protected: - RDOPROCBlockForSeize(const LPRDOPROCProcess& pProcess, const std::string& name); + RDOPROCBlockForSeize(const LPRDOPROCProcess& pProcess, const std::string& name); - //! m_parserForRuntime служит для передачи информации о параметре "Состояние" ресурса - rdo::runtime::parser_for_Seize m_parserForRuntime; + // m_parserForRuntime служит для передачи информации о параметре "Состояние" ресурса + rdo::runtime::parser_for_Seize m_parserForRuntime; }; // -------------------------------------------------------------------------------- @@ -196,20 +195,20 @@ class RDOPROCSeize: public RDOPROCBlockForSeize { DECLARE_FACTORY(RDOPROCSeize); public: - LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } - void createRuntime(); - void addResource(const std::string& name); + LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } + void createRuntime(); + void addResource(const std::string& name); protected: - typedef std::list ResourceList; - typedef std::vector ParserForRuntime; + typedef std::list ResourceList; + typedef std::vector ParserForRuntime; - ResourceList m_resourceList; - ParserForRuntime m_parserForRuntime; - LPIPROCBlock m_pRuntime; + ResourceList m_resourceList; + ParserForRuntime m_parserForRuntime; + LPIPROCBlock m_pRuntime; private: - RDOPROCSeize(const LPRDOPROCProcess& pProcess, const std::string& name); + RDOPROCSeize(const LPRDOPROCProcess& pProcess, const std::string& name); }; DECLARE_POINTER(RDOPROCSeize); @@ -220,20 +219,20 @@ class RDOPROCRelease: public RDOPROCBlockForSeize { DECLARE_FACTORY(RDOPROCRelease); public: - LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } - void createRuntime(); - void addResource(const std::string& name); + LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } + void createRuntime(); + void addResource(const std::string& name); protected: - typedef std::list ResourceList; - typedef std::vector ParserForRuntime; + typedef std::list ResourceList; + typedef std::vector ParserForRuntime; - ResourceList m_resourceList; - ParserForRuntime m_parserForRuntime; - LPIPROCBlock m_pRuntime; + ResourceList m_resourceList; + ParserForRuntime m_parserForRuntime; + LPIPROCBlock m_pRuntime; private: - RDOPROCRelease(const LPRDOPROCProcess& pProcess, const std::string& name); + RDOPROCRelease(const LPRDOPROCProcess& pProcess, const std::string& name); }; DECLARE_POINTER(RDOPROCRelease); @@ -244,12 +243,12 @@ class RDOPROCAdvance: public RDOPROCOperator { DECLARE_FACTORY(RDOPROCAdvance); public: - LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } + LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } protected: - LPIPROCBlock m_pRuntime; + LPIPROCBlock m_pRuntime; private: - RDOPROCAdvance(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pTimeCalc); + RDOPROCAdvance(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pTimeCalc); }; // -------------------------------------------------------------------------------- @@ -260,12 +259,12 @@ class RDOPROCTerminate: public RDOPROCOperator DECLARE_FACTORY(RDOPROCTerminate); public: - LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } + LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } protected: - LPIPROCBlock m_pRuntime; + LPIPROCBlock m_pRuntime; private: - RDOPROCTerminate(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pCalc); + RDOPROCTerminate(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pCalc); }; // -------------------------------------------------------------------------------- @@ -275,14 +274,12 @@ class RDOPROCAssign: public RDOPROCOperator { DECLARE_FACTORY(RDOPROCAssign); public: - LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } + LPIPROCBlock getRuntimeBlock() const { return m_pRuntime; } protected: - LPIPROCBlock m_pRuntime; + LPIPROCBlock m_pRuntime; private: - RDOPROCAssign(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pCalc); + RDOPROCAssign(const LPRDOPROCProcess& pProcess, const std::string& name, const rdo::runtime::LPRDOCalc& pCalc); }; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _LIB_PARSER_PROCESS_H_ diff --git a/simulator/compiler/parser/rdorss.cpp b/simulator/compiler/parser/rdorss.cpp index 75ff20a6d..9a9129533 100644 --- a/simulator/compiler/parser/rdorss.cpp +++ b/simulator/compiler/parser/rdorss.cpp @@ -19,15 +19,15 @@ OPEN_RDO_PARSER_NAMESPACE const std::string RDORSSResource::GET_RESOURCE = "resource_expression"; RDORSSResource::RDORSSResource(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info, const LPRDORTPResType& pResType, std::size_t id) - : RDOParserSrcInfo(src_info ) - , m_pResType (pResType ) - , m_id (id == UNDEFINED_ID ? pParser->getRSS_id() : id) - , trace (false ) - , isNested (false ) + : RDOParserSrcInfo(src_info ) + , m_pResType (pResType ) + , m_id (id == UNDEFINED_ID ? pParser->getRSS_id() : id) + , trace (false ) + , isNested (false ) { - ASSERT(m_pResType); - m_currParam = m_pResType->getParams().begin(); - RDOParser::s_parser()->contextStack()->push(this); + ASSERT(m_pResType); + m_currParam = m_pResType->getParams().begin(); + RDOParser::s_parser()->contextStack()->push(this); } RDORSSResource::~RDORSSResource() @@ -35,7 +35,7 @@ RDORSSResource::~RDORSSResource() void RDORSSResource::end() { - RDOParser::s_parser()->contextStack()->pop(); + RDOParser::s_parser()->contextStack()->pop(); } namespace @@ -43,199 +43,199 @@ namespace LPExpression contextSetTrace(const rdo::runtime::LPRDOCalc& getResource, bool traceValue, const RDOParserSrcInfo& srcInfo) { - return rdo::Factory::create( - rdo::Factory::delegate(srcInfo), - rdo::Factory::create(getResource, traceValue), - srcInfo - ); + return rdo::Factory::create( + rdo::Factory::delegate(srcInfo), + rdo::Factory::create(getResource, traceValue), + srcInfo + ); } LPExpression contextGetResource(const LPRDORSSResource& resource, const RDOParserSrcInfo& srcInfo) { - return resource->createGetResourceExpression(srcInfo); + return resource->createGetResourceExpression(srcInfo); } } Context::LPFindResult RDORSSResource::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const { - if (method == Context::METHOD_OPERATOR_DOT) - { - const std::string paramName = params.identifier(); - - const std::size_t parNumb = getType()->getRTPParamNumber(paramName); - if (parNumb == RDORTPResType::UNDEFINED_PARAM) - { - return rdo::Factory::create(); - } - - Context::Params params_; - params_[Context::Params::IDENTIFIER] = paramName; - params_[RDORSSResource::GET_RESOURCE] = createGetResourceExpression(srcInfo); - - return getType()->find(Context::METHOD_OPERATOR_DOT, params_, srcInfo); - } - - if (method == Context::METHOD_GET) - { - const std::string paramName = params.identifier(); - - if (paramName == name()) - { - LPRDORSSResource pThis(const_cast(this)); - return rdo::Factory::create(CreateExpression(boost::bind(&contextGetResource, pThis, srcInfo))); - } - } - - if (method == "trace()") - { - rdo::runtime::LPRDOCalc getResource = rdo::Factory::create(getID()); - const bool traceValue = params.get("traceValue"); - return rdo::Factory::create(CreateExpression(boost::bind(&contextSetTrace, getResource, traceValue, srcInfo))); - } - - return rdo::Factory::create(); + if (method == Context::METHOD_OPERATOR_DOT) + { + const std::string paramName = params.identifier(); + + const std::size_t parNumb = getType()->getRTPParamNumber(paramName); + if (parNumb == RDORTPResType::UNDEFINED_PARAM) + { + return rdo::Factory::create(); + } + + Context::Params params_; + params_[Context::Params::IDENTIFIER] = paramName; + params_[RDORSSResource::GET_RESOURCE] = createGetResourceExpression(srcInfo); + + return getType()->find(Context::METHOD_OPERATOR_DOT, params_, srcInfo); + } + + if (method == Context::METHOD_GET) + { + const std::string paramName = params.identifier(); + + if (paramName == name()) + { + LPRDORSSResource pThis(const_cast(this)); + return rdo::Factory::create(CreateExpression(boost::bind(&contextGetResource, pThis, srcInfo))); + } + } + + if (method == "trace()") + { + rdo::runtime::LPRDOCalc getResource = rdo::Factory::create(getID()); + const bool traceValue = params.get("traceValue"); + return rdo::Factory::create(CreateExpression(boost::bind(&contextSetTrace, getResource, traceValue, srcInfo))); + } + + return rdo::Factory::create(); } LPExpression RDORSSResource::createGetResourceExpression(const RDOParserSrcInfo& srcInfo) const { - return rdo::Factory::create( - rdo::Factory::create(getType(), getType()->src_info()), - rdo::Factory::create(getID()), - srcInfo - ); + return rdo::Factory::create( + rdo::Factory::create(getType(), getType()->src_info()), + rdo::Factory::create(getID()), + srcInfo + ); } void RDORSSResource::writeModelStructure(std::ostream& stream) const { - stream << (getID() + 1) << " " << name() << " " << getType()->getNumber() << std::endl; + stream << (getID() + 1) << " " << name() << " " << getType()->getNumber() << std::endl; } void RDORSSResource::addParam(const LPRDOValue& pParam) { - ASSERT(pParam); - - LPRDOValue pAddParamValue; - LPExpression pAddParam; - - if (m_currParam == getType()->getParams().end()) - { - RDOParser::s_parser()->error().push_only(pParam->src_info(), "Слишком много параметров"); - RDOParser::s_parser()->error().push_only(getType()->src_info(), "См. тип ресурса"); - RDOParser::s_parser()->error().push_done(); - } - - try - { - if (pParam->value().getAsString() == "*") - { - if (!(*m_currParam)->getDefault()->defined()) - { - RDOParser::s_parser()->error().push_only(pParam->src_info(), "Невозможно использовать '*', к.т. отсутствует значение по умолчанию"); - /// @todo src_info() без параметра RDOParserSrcInfo() - RDOParser::s_parser()->error().push_only((*m_currParam)->getTypeInfo()->src_info(RDOParserSrcInfo()), "См. описание параметра"); - RDOParser::s_parser()->error().push_done(); - } - pAddParamValue = (*m_currParam)->getDefault(); - } - else if (pParam->value().getAsString() == "#") - { - pAddParamValue = (*m_currParam)->getDefault()->defined() - ? (*m_currParam)->getDefault() - : rdo::Factory::create( - (*m_currParam)->getTypeInfo()->itype()->get_default(), - (*m_currParam)->getTypeInfo()->src_info(RDOParserSrcInfo()), - (*m_currParam)->getTypeInfo() - ); - ASSERT(pAddParamValue); - pAddParamValue->value().setUndefined(true); - } - else - { - pAddParamValue = (*m_currParam)->getTypeInfo()->value_cast(pParam); - } - } - catch(const RDOSyntaxException&) - { - RDOParser::s_parser()->error().modify(rdo::format("Для параметра '%s': ", (*m_currParam)->name().c_str())); - } - - ASSERT(pAddParamValue); - try - { - if (pAddParamValue->value().type().object_dynamic_cast()) - { - LPRDORSSResource pResourceValue = pAddParamValue->value().getPointerByType(); - ASSERT(pResourceValue); - - pResourceValue->setSrcInfo(pParam->src_info()); - pResourceValue->setSrcText(std::to_string(getID()) + '_' + (*m_currParam)->name()); - - rdo::runtime::LPRDOCalc pCalc = pResourceValue->createCalc(); - - pAddParam = rdo::Factory::create( - rdo::Factory::create(pAddParamValue->typeInfo()), - pCalc, - pAddParamValue->src_info() - ); - } - else - pAddParam = rdo::Factory::create( - rdo::Factory::create(pAddParamValue->typeInfo()), - rdo::Factory::create(pAddParamValue->value().clone()), - pAddParamValue->src_info() - ); - } - catch (const rdo::runtime::RDOValueException& e) - { - RDOParser::s_parser()->error().error(pParam->src_info(), rdo::format("Для параметра '%s': %s", (*m_currParam)->name().c_str(), e.message().c_str())); - } - m_paramList.push_back(Param(pAddParam)); - m_currParam++; + ASSERT(pParam); + + LPRDOValue pAddParamValue; + LPExpression pAddParam; + + if (m_currParam == getType()->getParams().end()) + { + RDOParser::s_parser()->error().push_only(pParam->src_info(), "Слишком много параметров"); + RDOParser::s_parser()->error().push_only(getType()->src_info(), "См. тип ресурса"); + RDOParser::s_parser()->error().push_done(); + } + + try + { + if (pParam->value().getAsString() == "*") + { + if (!(*m_currParam)->getDefault()->defined()) + { + RDOParser::s_parser()->error().push_only(pParam->src_info(), "Невозможно использовать '*', к.т. отсутствует значение по умолчанию"); + // TODO src_info() без параметра RDOParserSrcInfo() + RDOParser::s_parser()->error().push_only((*m_currParam)->getTypeInfo()->src_info(RDOParserSrcInfo()), "См. описание параметра"); + RDOParser::s_parser()->error().push_done(); + } + pAddParamValue = (*m_currParam)->getDefault(); + } + else if (pParam->value().getAsString() == "#") + { + pAddParamValue = (*m_currParam)->getDefault()->defined() + ? (*m_currParam)->getDefault() + : rdo::Factory::create( + (*m_currParam)->getTypeInfo()->itype()->get_default(), + (*m_currParam)->getTypeInfo()->src_info(RDOParserSrcInfo()), + (*m_currParam)->getTypeInfo() + ); + ASSERT(pAddParamValue); + pAddParamValue->value().setUndefined(true); + } + else + { + pAddParamValue = (*m_currParam)->getTypeInfo()->value_cast(pParam); + } + } + catch(const RDOSyntaxException&) + { + RDOParser::s_parser()->error().modify(rdo::format("Для параметра '%s': ", (*m_currParam)->name().c_str())); + } + + ASSERT(pAddParamValue); + try + { + if (pAddParamValue->value().type().object_dynamic_cast()) + { + LPRDORSSResource pResourceValue = pAddParamValue->value().getPointerByType(); + ASSERT(pResourceValue); + + pResourceValue->setSrcInfo(pParam->src_info()); + pResourceValue->setSrcText(std::to_string(getID()) + '_' + (*m_currParam)->name()); + + rdo::runtime::LPRDOCalc pCalc = pResourceValue->createCalc(); + + pAddParam = rdo::Factory::create( + rdo::Factory::create(pAddParamValue->typeInfo()), + pCalc, + pAddParamValue->src_info() + ); + } + else + pAddParam = rdo::Factory::create( + rdo::Factory::create(pAddParamValue->typeInfo()), + rdo::Factory::create(pAddParamValue->value().clone()), + pAddParamValue->src_info() + ); + } + catch (const rdo::runtime::RDOValueException& e) + { + RDOParser::s_parser()->error().error(pParam->src_info(), rdo::format("Для параметра '%s': %s", (*m_currParam)->name().c_str(), e.message().c_str())); + } + m_paramList.push_back(Param(pAddParam)); + m_currParam++; } bool RDORSSResource::defined() const { - return m_currParam == getType()->getParams().end(); + return m_currParam == getType()->getParams().end(); } rdo::runtime::LPRDOCalc RDORSSResource::createCalc() const { - std::vector paramList; - for (const auto& param: params()) - paramList.push_back(param.param()->calc()); - - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create( - getType()->getNumber(), - paramList, - getTrace(), - getType()->isPermanent(), - isNested, - ~0, - getID() - ); - ASSERT(pCalc); - rdo::runtime::RDOSrcInfo srcInfo(src_info()); - srcInfo.setSrcText("Создание ресурса " + src_text()); - pCalc->setSrcInfo(srcInfo); - - return pCalc; + std::vector paramList; + for (const auto& param: params()) + paramList.push_back(param.param()->calc()); + + rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create( + getType()->getNumber(), + paramList, + getTrace(), + getType()->isPermanent(), + isNested, + ~0, + getID() + ); + ASSERT(pCalc); + rdo::runtime::RDOSrcInfo srcInfo(src_info()); + srcInfo.setSrcText("Создание ресурса " + src_text()); + pCalc->setSrcInfo(srcInfo); + + return pCalc; } std::vector RDORSSResource::createCalcList() const { - std::vector calcList; - rdo::runtime::LPRDOCalc pCalc = createCalc(); - calcList.push_back(pCalc); - if (m_traceCalc) - calcList.push_back(m_traceCalc); + std::vector calcList; + rdo::runtime::LPRDOCalc pCalc = createCalc(); + calcList.push_back(pCalc); + if (m_traceCalc) + calcList.push_back(m_traceCalc); - return calcList; + return calcList; } std::string RDORSSResource::asString() const { - return name(); + return name(); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdorss.h b/simulator/compiler/parser/rdorss.h index b5cfe2c44..4882b9805 100644 --- a/simulator/compiler/parser/rdorss.h +++ b/simulator/compiler/parser/rdorss.h @@ -1,5 +1,4 @@ -#ifndef _RDORSS_RSS_H_ -#define _RDORSS_RSS_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -23,86 +22,84 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- RDORSSResource // -------------------------------------------------------------------------------- class RDORSSResource - : public RDOParserSrcInfo - , public boost::noncopyable - , public Context - , public IContextFind - , public rdo::runtime::IAsString + : public RDOParserSrcInfo + , private boost::noncopyable + , public Context + , public IContextFind + , public rdo::runtime::IAsString { DECLARE_FACTORY(RDORSSResource); public: - static const std::string GET_RESOURCE; + static const std::string GET_RESOURCE; - class Param - { - public: - explicit Param(const LPExpression& pValue) - : m_pValue(pValue) - {} + class Param + { + public: + explicit Param(const LPExpression& pValue) + : m_pValue(pValue) + {} - const LPExpression& param() const - { - return m_pValue; - } + const LPExpression& param() const + { + return m_pValue; + } - LPExpression& param() - { - return m_pValue; - } + LPExpression& param() + { + return m_pValue; + } - private: - LPExpression m_pValue; - }; - typedef std::vector ParamList; - static const std::size_t UNDEFINED_ID = std::size_t(~0); + private: + LPExpression m_pValue; + }; + typedef std::vector ParamList; + static const std::size_t UNDEFINED_ID = std::size_t(~0); - virtual rdo::runtime::LPRDOCalc createCalc() const; - virtual std::vector createCalcList() const; + virtual rdo::runtime::LPRDOCalc createCalc() const; + virtual std::vector createCalcList() const; - const std::string& name() const { return src_info().src_text(); } - LPRDORTPResType getType() const { return m_pResType; } + const std::string& name() const { return src_info().src_text(); } + LPRDORTPResType getType() const { return m_pResType; } - std::size_t getID() const { return m_id; } + std::size_t getID() const { return m_id; } - const ParamList& params () const { return m_paramList; } + const ParamList& params () const { return m_paramList; } - void addParam(const LPRDOValue& pParam); - bool getTrace() const { return trace; } - void setTrace(bool value) { trace = value; } - bool defined() const; - void end(); - void setIsNested(bool nested) { isNested = nested; } - bool getIsNested() { return isNested; } + void addParam(const LPRDOValue& pParam); + bool getTrace() const { return trace; } + void setTrace(bool value) { trace = value; } + bool defined() const; + void end(); + void setIsNested(bool nested) { isNested = nested; } + bool getIsNested() { return isNested; } - void writeModelStructure(std::ostream& stream) const; + void writeModelStructure(std::ostream& stream) const; - LPExpression createGetResourceExpression(const RDOParserSrcInfo& srcInfo) const; + LPExpression createGetResourceExpression(const RDOParserSrcInfo& srcInfo) const; - void setTraceCalc (const rdo::runtime::LPRDOCalc& pTraceCalc) - { - m_traceCalc = pTraceCalc; - } + void setTraceCalc (const rdo::runtime::LPRDOCalc& pTraceCalc) + { + m_traceCalc = pTraceCalc; + } - DECLARE_IAsString; + DECLARE_IAsString; protected: - RDORSSResource(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info, const LPRDORTPResType& pResType, std::size_t id = UNDEFINED_ID); - virtual ~RDORSSResource(); + RDORSSResource(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info, const LPRDORTPResType& pResType, std::size_t id = UNDEFINED_ID); + virtual ~RDORSSResource(); - LPRDORTPResType m_pResType; - std::size_t m_id; //! in system - ParamList m_paramList; - bool trace; - bool isNested; + LPRDORTPResType m_pResType; + std::size_t m_id; // in system + ParamList m_paramList; + bool trace; + bool isNested; private: - RDORTPResType::ParamList::const_iterator m_currParam; - rdo::runtime::LPRDOCalc m_traceCalc; + RDORTPResType::ParamList::const_iterator m_currParam; + rdo::runtime::LPRDOCalc m_traceCalc; - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; DECLARE_POINTER(RDORSSResource); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDORSS_RSS_H_ diff --git a/simulator/compiler/parser/rdortp.cpp b/simulator/compiler/parser/rdortp.cpp index 7391c195a..2e3e04688 100644 --- a/simulator/compiler/parser/rdortp.cpp +++ b/simulator/compiler/parser/rdortp.cpp @@ -15,49 +15,49 @@ namespace { rdo::runtime::LPRDOResource createSimpleResource( - const rdo::runtime::LPRDORuntime runtime, - const rdo::runtime::RDOResource::ParamList& params, - const rdo::runtime::LPIResourceType& type, - std::size_t resource_id, - std::size_t type_id, - bool trace, - bool temporary, - bool isNested) + const rdo::runtime::LPRDORuntime runtime, + const rdo::runtime::RDOResource::ParamList& params, + const rdo::runtime::LPIResourceType& type, + std::size_t resource_id, + std::size_t type_id, + bool trace, + bool temporary, + bool isNested) { - return rdo::Factory::create(runtime, params, type, resource_id, type_id, trace, temporary, isNested); + return rdo::Factory::create(runtime, params, type, resource_id, type_id, trace, temporary, isNested); } rdo::runtime::LPRDOPROCResource createProcessResource( - const rdo::runtime::LPRDORuntime runtime, - const rdo::runtime::RDOResource::ParamList& params, - const rdo::runtime::LPIResourceType& type, - std::size_t resource_id, - std::size_t type_id, - bool trace, - bool temporary) + const rdo::runtime::LPRDORuntime runtime, + const rdo::runtime::RDOResource::ParamList& params, + const rdo::runtime::LPIResourceType& type, + std::size_t resource_id, + std::size_t type_id, + bool trace, + bool temporary) { - return rdo::Factory::create(runtime, params, type, resource_id, type_id, trace, temporary); + return rdo::Factory::create(runtime, params, type, resource_id, type_id, trace, temporary); } rdo::runtime::LPRDOPROCTransact createProcessTransact( - const rdo::runtime::LPRDORuntime runtime, - const rdo::runtime::RDOResource::ParamList& params, - const rdo::runtime::LPIResourceType& type, - std::size_t resource_id, - std::size_t type_id, - bool trace, - bool temporary) + const rdo::runtime::LPRDORuntime runtime, + const rdo::runtime::RDOResource::ParamList& params, + const rdo::runtime::LPIResourceType& type, + std::size_t resource_id, + std::size_t type_id, + bool trace, + bool temporary) { - return rdo::Factory::create(runtime, params, type, resource_id, type_id, trace, temporary); + return rdo::Factory::create(runtime, params, type, resource_id, type_id, trace, temporary); } } int rtplex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void rtperror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -67,12 +67,12 @@ void rtperror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) // -------------------- RDORTPResType // -------------------------------------------------------------------------------- RDORTPResType::RDORTPResType(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info, bool permanent) - : RDOParserSrcInfo(src_info) - , RDOResourceTypeList(pParser->getRTP_id(), pParser->runtime()) - , m_number(pParser->getRTP_id()) // TODO кажется ненужным - , m_permanent(permanent) + : RDOParserSrcInfo(src_info) + , RDOResourceTypeList(pParser->getRTP_id(), pParser->runtime()) + , m_number(pParser->getRTP_id()) // TODO кажется ненужным + , m_permanent(permanent) { - pParser->insertRTPResType(LPRDORTPResType(this)); + pParser->insertRTPResType(LPRDORTPResType(this)); } RDORTPResType::~RDORTPResType() @@ -80,142 +80,142 @@ RDORTPResType::~RDORTPResType() int RDORTPResType::getNumber() const { - return m_number; + return m_number; } bool RDORTPResType::isPermanent() const { - return m_permanent; + return m_permanent; } bool RDORTPResType::isTemporary() const { - return !m_permanent; + return !m_permanent; } const RDORTPResType::ParamList& RDORTPResType::getParams() const { - return m_params; + return m_params; } -runtime::RDOType::TypeID RDORTPResType::typeID() const +runtime::RDOType::Type RDORTPResType::typeID() const { - return runtime::RDOType::t_pointer; + return runtime::RDOType::Type::POINTER; } LPRDORSSResource RDORTPResType::createRes(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info) { - return rdo::Factory::create(pParser, src_info, this); + return rdo::Factory::create(pParser, src_info, this); } void RDORTPResType::addParam(const LPRDORTPParam& param) { - if (findRTPParam(param->name())) - { - RDOParser::s_parser()->error().error(param->src_info(), rdo::format("Параметр уже существует: %s", param->name().c_str())); - } - m_params.push_back(param); + if (findRTPParam(param->name())) + { + RDOParser::s_parser()->error().error(param->src_info(), rdo::format("Параметр уже существует: %s", param->name().c_str())); + } + m_params.push_back(param); } -void RDORTPResType::addParam(const std::string& /*param_name*/, rdo::runtime::RDOType::TypeID /*param_typeID*/) +void RDORTPResType::addParam(const std::string& /*param_name*/, rdo::runtime::RDOType::Type /*param_typeID*/) {} LPRDORTPParam RDORTPResType::findRTPParam(const std::string& paramName) const { - ParamList::const_iterator it = std::find_if(m_params.begin(), m_params.end(), compareName(paramName)); - return it != m_params.end() ? *it : LPRDORTPParam(); + ParamList::const_iterator it = std::find_if(m_params.begin(), m_params.end(), compareName(paramName)); + return it != m_params.end() ? *it : LPRDORTPParam(); } std::size_t RDORTPResType::getRTPParamNumber(const std::string& paramName) const { - ParamList::const_iterator it = std::find_if(m_params.begin(), m_params.end(), compareName(paramName)); - return it != m_params.end() ? it - m_params.begin() : UNDEFINED_PARAM; + ParamList::const_iterator it = std::find_if(m_params.begin(), m_params.end(), compareName(paramName)); + return it != m_params.end() ? it - m_params.begin() : UNDEFINED_PARAM; } void RDORTPResType::writeModelStructure(std::ostream& stream) const { - stream << getNumber() << " " << name() << " " << getParams().size() << std::endl; - for (std::size_t i = 0; i < getParams().size(); i++) - { - stream << " " << (i+1) << " "; - getParams().at(i)->writeModelStructure(stream); - } + stream << getNumber() << " " << name() << " " << getParams().size() << std::endl; + for (std::size_t i = 0; i < getParams().size(); i++) + { + stream << " " << (i+1) << " "; + getParams().at(i)->writeModelStructure(stream); + } } std::string RDORTPResType::name() const { - static std::string s_name; - s_name = src_text(); - return s_name; + static std::string s_name; + s_name = src_text(); + return s_name; } LPIType RDORTPResType::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - switch (pFrom.object_dynamic_cast()->typeID()) - { - case rdo::runtime::RDOType::t_pointer: - { - LPIType pThisRTPType(const_cast(this)); - - //! Это один и тот же тип - if (pThisRTPType == pFrom) - return pThisRTPType; - - //! Типы разные, сгенерим ошибку - parser::g_error().push_only(src_info, "Несоответствие типов ресурсов"); - parser::g_error().push_only(to_src_info, to_src_info.src_text()); - parser::g_error().push_done(); - break; - } - default: - { - parser::g_error().push_only(src_info, rdo::format("Ожидается тип ресурса, найдено: %s", from_src_info.src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - break; - } - } - - return LPIType(NULL); + switch (pFrom.object_dynamic_cast()->typeID()) + { + case rdo::runtime::RDOType::Type::POINTER: + { + LPIType pThisRTPType(const_cast(this)); + + // Это один и тот же тип + if (pThisRTPType == pFrom) + return pThisRTPType; + + // Типы разные, сгенерим ошибку + parser::g_error().push_only(src_info, "Несоответствие типов ресурсов"); + parser::g_error().push_only(to_src_info, to_src_info.src_text()); + parser::g_error().push_done(); + break; + } + default: + { + parser::g_error().push_only(src_info, rdo::format("Ожидается тип ресурса, найдено: %s", from_src_info.src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + break; + } + } + + return LPIType(NULL); } LPRDOValue RDORTPResType::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); - - LPRDORTPResType pRTPResType = pFrom->typeInfo()->itype().object_dynamic_cast(); - if (pRTPResType) - { - LPIType pThisType = const_cast(this); - - //! Это один и тот же тип - if (pThisType == pRTPResType.object_dynamic_cast()) - return pFrom; - - //! Типы разные, сгенерим ошибку - parser::g_error().push_only(src_info, "Несоответствие типов ресурсов"); - parser::g_error().push_only(to_src_info, rdo::format( "Ожидается: %s", to_src_info.src_text().c_str())); - parser::g_error().push_only(src_info, rdo::format( "Пришел: %s", pFrom->src_text().c_str())); - parser::g_error().push_only(to_src_info, to_src_info.src_text()); - parser::g_error().push_done(); - } - parser::g_error().push_only(src_info, rdo::format("Ожидается ресурс, найдено: %s", pFrom->src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - - return LPRDOValue(NULL); + ASSERT(pFrom); + + LPRDORTPResType pRTPResType = pFrom->typeInfo()->itype().object_dynamic_cast(); + if (pRTPResType) + { + LPIType pThisType = const_cast(this); + + // Это один и тот же тип + if (pThisType == pRTPResType.object_dynamic_cast()) + return pFrom; + + // Типы разные, сгенерим ошибку + parser::g_error().push_only(src_info, "Несоответствие типов ресурсов"); + parser::g_error().push_only(to_src_info, rdo::format( "Ожидается: %s", to_src_info.src_text().c_str())); + parser::g_error().push_only(src_info, rdo::format( "Пришел: %s", pFrom->src_text().c_str())); + parser::g_error().push_only(to_src_info, to_src_info.src_text()); + parser::g_error().push_done(); + } + parser::g_error().push_only(src_info, rdo::format("Ожидается ресурс, найдено: %s", pFrom->src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + + return LPRDOValue(NULL); } -rdo::runtime::LPRDOCalc RDORTPResType::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const +rdo::runtime::LPRDOCalc RDORTPResType::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& /*pType*/) const { - return pCalc; + return pCalc; } rdo::runtime::RDOValue RDORTPResType::get_default() const { - NEVER_REACH_HERE; - return rdo::runtime::RDOValue(); - //return rdo::runtime::RDOValue (pResourceType,pResource); + NEVER_REACH_HERE; + return rdo::runtime::RDOValue(); + //return rdo::runtime::RDOValue (pResourceType,pResource); } namespace @@ -223,94 +223,94 @@ namespace LPExpression contextTypeOfResourceType(const LPRDORTPResType& resourceType, const RDOParserSrcInfo& srcInfo) { - return rdo::Factory::create( - rdo::Factory::create(resourceType, srcInfo), - rdo::runtime::LPRDOCalc(NULL), - srcInfo - ); + return rdo::Factory::create( + rdo::Factory::create(resourceType, srcInfo), + rdo::runtime::LPRDOCalc(NULL), + srcInfo + ); } } Context::LPFindResult RDORTPResType::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const { - if (method == Context::METHOD_GET || method == Context::METHOD_SET) - { - RDOParser::s_parser()->error().error( - srcInfo, rdo::format("Присваивание ресурсов не разрешено")); - } + if (method == Context::METHOD_GET || method == Context::METHOD_SET) + { + RDOParser::s_parser()->error().error( + srcInfo, rdo::format("Присваивание ресурсов не разрешено")); + } - if (method == Context::METHOD_OPERATOR_DOT) - { - const std::string paramName = params.identifier(); + if (method == Context::METHOD_OPERATOR_DOT) + { + const std::string paramName = params.identifier(); - const std::size_t parNumb = getRTPParamNumber(paramName); - if (parNumb == RDORTPResType::UNDEFINED_PARAM) - return rdo::Factory::create(); + const std::size_t parNumb = getRTPParamNumber(paramName); + if (parNumb == RDORTPResType::UNDEFINED_PARAM) + return rdo::Factory::create(); - if (!params.exists(RDORSSResource::GET_RESOURCE)) - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Ожидается имя ресурса")); + if (!params.exists(RDORSSResource::GET_RESOURCE)) + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Ожидается имя ресурса")); - LPRDOParam pParam = findRTPParam(paramName); - ASSERT(pParam); + LPRDOParam pParam = findRTPParam(paramName); + ASSERT(pParam); - Context::Params params_; - params_[RDORSSResource::GET_RESOURCE] = params.get(RDORSSResource::GET_RESOURCE); - params_[RDOParam::CONTEXT_PARAM_PARAM_ID] = parNumb; - params_[Context::Params::IDENTIFIER] = paramName; + Context::Params params_; + params_[RDORSSResource::GET_RESOURCE] = params.get(RDORSSResource::GET_RESOURCE); + params_[RDOParam::CONTEXT_PARAM_PARAM_ID] = parNumb; + params_[Context::Params::IDENTIFIER] = paramName; - LPRDORTPResType pParamType = - pParam->getTypeInfo()->itype().object_dynamic_cast(); + LPRDORTPResType pParamType = + pParam->getTypeInfo()->itype().object_dynamic_cast(); - if (!pParamType) - return rdo::Factory::create(SwitchContext(pParam, params_)); + if (!pParamType) + return rdo::Factory::create(SwitchContext(pParam, params_)); - Context::LPFindResult result = pParam->find(Context::METHOD_GET, params_, srcInfo); - LPExpression pNestedResource = result->getCreateExpression()(); + Context::LPFindResult result = pParam->find(Context::METHOD_GET, params_, srcInfo); + LPExpression pNestedResource = result->getCreateExpression()(); - Context::Params params__; - params__[RDORSSResource::GET_RESOURCE] = pNestedResource; + Context::Params params__; + params__[RDORSSResource::GET_RESOURCE] = pNestedResource; - return rdo::Factory::create(SwitchContext(pParamType, params__)); - } + return rdo::Factory::create(SwitchContext(pParamType, params__)); + } - if (method == Context::METHOD_TYPE_OF) - { - LPRDORTPResType pThis(const_cast(this)); - return rdo::Factory::create(CreateExpression(boost::bind(&contextTypeOfResourceType, pThis, srcInfo))); - } + if (method == Context::METHOD_TYPE_OF) + { + LPRDORTPResType pThis(const_cast(this)); + return rdo::Factory::create(CreateExpression(boost::bind(&contextTypeOfResourceType, pThis, srcInfo))); + } - return rdo::Factory::create(); + return rdo::Factory::create(); } void RDORTPResType::setSubtype(Subtype type) { - ASSERT(!m_subtype.is_initialized() || m_subtype.get() == type); - m_subtype = type; + ASSERT(!m_subtype.is_initialized() || m_subtype.get() == type); + m_subtype = type; } void RDORTPResType::setupRuntimeFactory() { - Subtype subtype = m_subtype.is_initialized() - ? m_subtype.get() - : RT_SIMPLE; - - runtime::RDOResourceTypeList::Create create; - switch (subtype) - { - case RT_SIMPLE: - create = boost::bind(&createSimpleResource, _1, _2, _3, _4, _5, _6, _7, _8); - break; - case RT_PROCESS_RESOURCE: - create = boost::bind(&createProcessResource, _1, _2, _3, _4, _5, _6, _7); - break; - case RT_PROCESS_TRANSACT: - create = boost::bind(&createProcessTransact, _1, _2, _3, _4, _5, _6, _7); - break; - default: - NEVER_REACH_HERE; - } - setFactoryMethod(create); + Subtype subtype = m_subtype.is_initialized() + ? m_subtype.get() + : Subtype::SIMPLE; + + runtime::RDOResourceTypeList::Create create; + switch (subtype) + { + case Subtype::SIMPLE: + create = boost::bind(&createSimpleResource, _1, _2, _3, _4, _5, _6, _7, _8); + break; + case Subtype::PROCESS_RESOURCE: + create = boost::bind(&createProcessResource, _1, _2, _3, _4, _5, _6, _7); + break; + case Subtype::PROCESS_TRANSACT: + create = boost::bind(&createProcessTransact, _1, _2, _3, _4, _5, _6, _7); + break; + default: + NEVER_REACH_HERE; + } + setFactoryMethod(create); } /* @@ -318,25 +318,25 @@ void RDORTPResType::setupRuntimeFactory() // -------------------- RDORTPFuzzyMembershiftFun - ф-ия принадлежности нечеткого терма // -------------------------------------------------------------------------------- RDORTPFuzzyMembershiftFun::RDORTPFuzzyMembershiftFun(const LPRDOParser& pParser): - RDOParserObject(pParser) + RDOParserObject(pParser) { - for (std::size_t i = 0; i < m_points.size(); i++) - { -// double x = m_points[i]->getX(); - } - - Items::iterator it = m_points.begin(); - while (it != m_points.end()) - { - double x = (*it)->getX(); - it++; - } + for (std::size_t i = 0; i < m_points.size(); i++) + { +// double x = m_points[i]->getX(); + } + + Items::iterator it = m_points.begin(); + while (it != m_points.end()) + { + double x = (*it)->getX(); + it++; + } } // -------------------------------------------------------------------------------- // -------------------- RDORTPFuzzyTerm - нечеткий термин // -------------------------------------------------------------------------------- RDORTPFuzzyTerm::RDORTPFuzzyTerm(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info, RDORTPFuzzyMembershiftFun* pMembersfift_fun): - RDOParserObject(pParser) + RDOParserObject(pParser) { }*/ diff --git a/simulator/compiler/parser/rdortp.h b/simulator/compiler/parser/rdortp.h index c01c2be62..1eab9d368 100644 --- a/simulator/compiler/parser/rdortp.h +++ b/simulator/compiler/parser/rdortp.h @@ -1,5 +1,4 @@ -#ifndef _RDORTP_H_ -#define _RDORTP_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -26,60 +25,60 @@ PREDECLARE_POINTER(RDOParser); PREDECLARE_POINTER(RDORSSResource); class RDORTPResType - : public RDOParserSrcInfo - , public boost::noncopyable - , public rdo::runtime::RDOResourceTypeList - , public IType - , public IModelStructure - , public Context - , public IContextFind - , public virtual rdo::counter_reference + : public RDOParserSrcInfo + , private boost::noncopyable + , public rdo::runtime::RDOResourceTypeList + , public IType + , public IModelStructure + , public Context + , public IContextFind + , public virtual rdo::counter_reference { DECLARE_FACTORY(RDORTPResType); public: - typedef std::vector ParamList; - typedef RDORSSResource value_type; + typedef std::vector ParamList; + typedef RDORSSResource value_type; - enum Subtype - { - RT_SIMPLE, - RT_PROCESS_RESOURCE, - RT_PROCESS_TRANSACT - }; - static const std::size_t UNDEFINED_PARAM = std::size_t(~0); + enum class Subtype + { + SIMPLE, + PROCESS_RESOURCE, + PROCESS_TRANSACT + }; + static const std::size_t UNDEFINED_PARAM = std::size_t(~0); - int getNumber() const; - bool isPermanent() const; - bool isTemporary() const; + int getNumber() const; + bool isPermanent() const; + bool isTemporary() const; - LPRDORSSResource createRes(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info); + LPRDORSSResource createRes(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info); - void addParam(const LPRDORTPParam& param); - void addParam(const std::string& param_name, rdo::runtime::RDOType::TypeID param_typeID); - LPRDORTPParam findRTPParam(const std::string& paramName) const; + void addParam(const LPRDORTPParam& param); + void addParam(const std::string& param_name, rdo::runtime::RDOType::Type param_typeID); + LPRDORTPParam findRTPParam(const std::string& paramName) const; - std::size_t getRTPParamNumber(const std::string& paramName) const; - const ParamList& getParams() const; + std::size_t getRTPParamNumber(const std::string& paramName) const; + const ParamList& getParams() const; - void setSubtype(Subtype subtype); + void setSubtype(Subtype subtype); - void setupRuntimeFactory(); + void setupRuntimeFactory(); - void writeModelStructure(std::ostream& stream) const; + void writeModelStructure(std::ostream& stream) const; - DECLARE_IType; + DECLARE_IType; private: - RDORTPResType(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info, bool permanent); - virtual ~RDORTPResType(); + RDORTPResType(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info, bool permanent); + virtual ~RDORTPResType(); - const std::size_t m_number; - const bool m_permanent; - boost::optional m_subtype; - ParamList m_params; + const std::size_t m_number; + const bool m_permanent; + boost::optional m_subtype; + ParamList m_params; - virtual runtime::RDOType::TypeID typeID() const; - virtual LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual runtime::RDOType::Type typeID() const; + virtual LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; DECLARE_POINTER(RDORTPResType); @@ -93,21 +92,21 @@ DECLARE_POINTER(RDORTPResType); //class RDORTPFuzzyMembershiftPoint: public RDOParserObject, public RDOParserSrcInfo //{ //public: -// RDORTPFuzzyMembershiftPoint(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info, double x_value, double y_value): -// RDOParserObject(pParser), -// RDOParserSrcInfo(src_info), -// m_x_value(x_value), -// m_y_value(y_value) -// { -// } -// virtual ~RDORTPFuzzyMembershiftPoint() {} +// RDORTPFuzzyMembershiftPoint(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info, double x_value, double y_value): +// RDOParserObject(pParser), +// RDOParserSrcInfo(src_info), +// m_x_value(x_value), +// m_y_value(y_value) +// { +// } +// virtual ~RDORTPFuzzyMembershiftPoint() {} // -// double getX() const { return m_x_value; } -// double getY() const { return m_y_value; } +// double getX() const { return m_x_value; } +// double getY() const { return m_y_value; } // //private: -// double m_x_value; -// double m_y_value; +// double m_x_value; +// double m_y_value; //}; // //// -------------------------------------------------------------------------------- @@ -116,27 +115,27 @@ DECLARE_POINTER(RDORTPResType); //class RDORTPFuzzyMembershiftFun: public RDOParserObject, public RDOParserSrcInfo //{ //public: -// RDORTPFuzzyMembershiftFun(const LPRDOParser& pParser): -// RDOParserObject(pParser) -// { -// } -// virtual ~RDORTPFuzzyMembershiftFun() {} +// RDORTPFuzzyMembershiftFun(const LPRDOParser& pParser): +// RDOParserObject(pParser) +// { +// } +// virtual ~RDORTPFuzzyMembershiftFun() {} // -// typedef RDORTPFuzzyMembershiftPoint* Item; -// typedef std::vector Items; +// typedef RDORTPFuzzyMembershiftPoint* Item; +// typedef std::vector Items; // -// void add(Item point) -// { -// m_points.push_back(point); -// } -// double getVal() const -// { -// return m_value; -// } +// void add(Item point) +// { +// m_points.push_back(point); +// } +// double getVal() const +// { +// return m_value; +// } // //private: -// Items m_points; // точки, определяющие ф-ию принадлежности -// double m_value; // значение ф-ии принадлежности для конкретного четкого значения +// Items m_points; // точки, определяющие ф-ию принадлежности +// double m_value; // значение ф-ии принадлежности для конкретного четкого значения //}; //// -------------------------------------------------------------------------------- //// -------------------- RDORTPFuzzyTerm - нечеткий термин @@ -144,19 +143,19 @@ DECLARE_POINTER(RDORTPResType); //class RDORTPFuzzyTerm: public RDOParserObject, public RDOParserSrcInfo //{ //public: -// RDORTPFuzzyTerm(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info, RDORTPFuzzyMembershiftFun* pMembersfift_fun): -// RDOParserObject(pParser), -// RDOParserSrcInfo(src_info), -// m_fun (pMembersfift_fun) -// { -// } -// virtual ~RDORTPFuzzyTerm() {} +// RDORTPFuzzyTerm(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info, RDORTPFuzzyMembershiftFun* pMembersfift_fun): +// RDOParserObject(pParser), +// RDOParserSrcInfo(src_info), +// m_fun (pMembersfift_fun) +// { +// } +// virtual ~RDORTPFuzzyTerm() {} // -// const std::string& name () const { return src_info().src_text(); } -// double MemberShift() const { return m_fun->getVal(); } +// const std::string& name () const { return src_info().src_text(); } +// double MemberShift() const { return m_fun->getVal(); } // //private: -// RDORTPFuzzyMembershiftFun* m_fun; +// RDORTPFuzzyMembershiftFun* m_fun; //}; //// -------------------------------------------------------------------------------- //// -------------------- RDORTPFuzzyTermsSet - набор терминов одного параметра @@ -164,26 +163,26 @@ DECLARE_POINTER(RDORTPResType); //class RDORTPFuzzyTermsSet: public RDOParserObject, public RDOParserSrcInfo //{ //public: -// RDORTPFuzzyTermsSet(const LPRDOParser& pParser) -// : RDOParserObject(pParser) -// { -// } -// virtual ~RDORTPFuzzyTermsSet() {} +// RDORTPFuzzyTermsSet(const LPRDOParser& pParser) +// : RDOParserObject(pParser) +// { +// } +// virtual ~RDORTPFuzzyTermsSet() {} // -// typedef RDORTPFuzzyTerm* Item; -// typedef std::vector Items; +// typedef RDORTPFuzzyTerm* Item; +// typedef std::vector Items; // -// void add(Item term) -// { -// m_terms.push_back(term); -// } -// bool empty() const -// { -// return m_terms.empty(); -// } +// void add(Item term) +// { +// m_terms.push_back(term); +// } +// bool empty() const +// { +// return m_terms.empty(); +// } // //private: -// Items m_terms; // набор терминов одного параметра +// Items m_terms; // набор терминов одного параметра //}; // //// -------------------------------------------------------------------------------- @@ -192,20 +191,18 @@ DECLARE_POINTER(RDORTPResType); //class RDORTPFuzzyParam : public RDOParserObject, public RDOParserSrcInfo //{ //public: -// RDORTPFuzzyParam(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info, RDORTPFuzzyTermsSet* terms_set): -// RDOParserObject(pParser), -// RDOParserSrcInfo(src_info), -// m_set (terms_set) -// { -// } -// virtual ~RDORTPFuzzyParam() {} +// RDORTPFuzzyParam(const LPRDOParser& pParser, const RDOParserSrcInfo& src_info, RDORTPFuzzyTermsSet* terms_set): +// RDOParserObject(pParser), +// RDOParserSrcInfo(src_info), +// m_set (terms_set) +// { +// } +// virtual ~RDORTPFuzzyParam() {} // -// const std::string& name() const { return src_info().src_text(); } +// const std::string& name() const { return src_info().src_text(); } // //private: -// RDORTPFuzzyTermsSet* m_set; // набор терминов параметра +// RDORTPFuzzyTermsSet* m_set; // набор терминов параметра //}; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDORTP_H_ diff --git a/simulator/compiler/parser/rdortp_param.cpp b/simulator/compiler/parser/rdortp_param.cpp index 5fb60c901..ca1cc9df1 100644 --- a/simulator/compiler/parser/rdortp_param.cpp +++ b/simulator/compiler/parser/rdortp_param.cpp @@ -13,7 +13,7 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- RDORTPParam // -------------------------------------------------------------------------------- RDORTPParam::RDORTPParam(const LPTypeInfo& pType, const LPRDOValue& pDefault, const RDOParserSrcInfo& src_info) - : RDOParam(src_info, pType, pDefault) + : RDOParam(src_info, pType, pDefault) {} RDORTPParam::~RDORTPParam() @@ -21,13 +21,13 @@ RDORTPParam::~RDORTPParam() const std::string& RDORTPParam::name() const { - return RDOParam::name(); + return RDOParam::name(); } void RDORTPParam::writeModelStructure(std::ostream& stream) const { - stream << name() << " "; - dynamic_cast(getTypeInfo()->type().get())->writeModelStructure(stream); + stream << name() << " "; + dynamic_cast(getTypeInfo()->type().get())->writeModelStructure(stream); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdortp_param.h b/simulator/compiler/parser/rdortp_param.h index 38daf29e1..ec0efa94f 100644 --- a/simulator/compiler/parser/rdortp_param.h +++ b/simulator/compiler/parser/rdortp_param.h @@ -1,5 +1,4 @@ -#ifndef _RDORTP_PARAM_H_ -#define _RDORTP_PARAM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,21 +15,19 @@ OPEN_RDO_PARSER_NAMESPACE PREDECLARE_POINTER(RDORTPResType); class RDORTPParam - : public RDOParam - , public IModelStructure - , public IName + : public RDOParam + , public IModelStructure + , public IName { DECLARE_FACTORY(RDORTPParam); public: - DECLARE_IModelStructure; - DECLARE_IName; + DECLARE_IModelStructure; + DECLARE_IName; private: - RDORTPParam(const LPTypeInfo& pType, const LPRDOValue& pDefault, const RDOParserSrcInfo& src_info); - virtual ~RDORTPParam(); + RDORTPParam(const LPTypeInfo& pType, const LPRDOValue& pDefault, const RDOParserSrcInfo& src_info); + virtual ~RDORTPParam(); }; DECLARE_POINTER(RDORTPParam); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDORTP_PARAM_H_ diff --git a/simulator/compiler/parser/rdosmr.cpp b/simulator/compiler/parser/rdosmr.cpp index b9382f663..a25e2d61c 100644 --- a/simulator/compiler/parser/rdosmr.cpp +++ b/simulator/compiler/parser/rdosmr.cpp @@ -16,163 +16,163 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- RDOSMR // -------------------------------------------------------------------------------- RDOSMR::RDOSMR() - : m_showMode (rdo::service::simulation::SM_NoShow) - , m_frameNumber (1 ) - , m_showRate (60) - , m_runStartTime (0 ) - , m_traceStartTime(rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME) - , m_traceEndTime (rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME) + : m_showMode (rdo::service::simulation::ShowMode::NoShow) + , m_frameNumber (1 ) + , m_showRate (60) + , m_runStartTime (0 ) + , m_traceStartTime(rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME) + , m_traceEndTime (rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME) {} void RDOSMR::setShowMode(rdo::service::simulation::ShowMode showMode) { - m_showMode = showMode; + m_showMode = showMode; } void RDOSMR::setFrameNumber(int value, const YYLTYPE& pos) { - if (value <= 0) - { - RDOParser::s_parser()->error().error(pos, "Номер кадра должен быть больше нуля"); - } - if (RDOParser::s_parser()->runtime()->m_frameList.size() + 1 <= (std::size_t)value) - { - RDOParser::s_parser()->error().error(pos, rdo::format("Несуществующий кадр: %d", value)); - } - m_frameNumber = value; + if (value <= 0) + { + RDOParser::s_parser()->error().error(pos, "Номер кадра должен быть больше нуля"); + } + if (RDOParser::s_parser()->runtime()->m_frameList.size() + 1 <= (std::size_t)value) + { + RDOParser::s_parser()->error().error(pos, rdo::format("Несуществующий кадр: %d", value)); + } + m_frameNumber = value; } void RDOSMR::setShowRate(double value, const YYLTYPE& pos) { - if (value < 0) - { - RDOParser::s_parser()->error().error(pos, "Масштаб должен быть больше нуля"); - } - m_showRate = value; + if (value < 0) + { + RDOParser::s_parser()->error().error(pos, "Масштаб должен быть больше нуля"); + } + m_showRate = value; } void RDOSMR::setRunStartTime(double value, const YYLTYPE& pos) { - if (value < 0) - { - RDOParser::s_parser()->error().error(pos, "Начальное модельное время должно быть больше нуля"); - } - m_runStartTime = value; + if (value < 0) + { + RDOParser::s_parser()->error().error(pos, "Начальное модельное время должно быть больше нуля"); + } + m_runStartTime = value; } void RDOSMR::setTraceStartTime(double value, const YYLTYPE& pos) { - if (value < 0) - { - RDOParser::s_parser()->error().error(pos, "Начальное время трассировки должно быть больше нуля"); - } - if (getTraceEndTime() != rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME && getTraceEndTime() <= value) - { - RDOParser::s_parser()->error().push_only(pos, "Начальное время трассировки должно быть меньше конечного"); - RDOParser::s_parser()->error().push_only(m_traceEndTime_pos, "См. конечное время трассировки"); - RDOParser::s_parser()->error().push_done(); - } - m_traceStartTime = value; - m_traceStartTime_pos = pos; + if (value < 0) + { + RDOParser::s_parser()->error().error(pos, "Начальное время трассировки должно быть больше нуля"); + } + if (getTraceEndTime() != rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME && getTraceEndTime() <= value) + { + RDOParser::s_parser()->error().push_only(pos, "Начальное время трассировки должно быть меньше конечного"); + RDOParser::s_parser()->error().push_only(m_traceEndTime_pos, "См. конечное время трассировки"); + RDOParser::s_parser()->error().push_done(); + } + m_traceStartTime = value; + m_traceStartTime_pos = pos; } void RDOSMR::setTraceEndTime(double value, const YYLTYPE& pos) { - if (value < 0) - { - RDOParser::s_parser()->error().error(pos, "Конечное время трассировки должно быть больше нуля"); - } - if (getTraceStartTime() != rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME && getTraceStartTime() >= value) - { - RDOParser::s_parser()->error().push_only(pos, "Конечное время трассировки должно быть больше начального"); - RDOParser::s_parser()->error().push_only(m_traceStartTime_pos, "См. начальное время трассировки"); - RDOParser::s_parser()->error().push_done(); - } - m_traceEndTime = value; - m_traceEndTime_pos = pos; + if (value < 0) + { + RDOParser::s_parser()->error().error(pos, "Конечное время трассировки должно быть больше нуля"); + } + if (getTraceStartTime() != rdo::runtime::RDOSimulatorTrace::UNDEFINE_TIME && getTraceStartTime() >= value) + { + RDOParser::s_parser()->error().push_only(pos, "Конечное время трассировки должно быть больше начального"); + RDOParser::s_parser()->error().push_only(m_traceStartTime_pos, "См. начальное время трассировки"); + RDOParser::s_parser()->error().push_done(); + } + m_traceEndTime = value; + m_traceEndTime_pos = pos; } void RDOSMR::setTerminateIf(LPRDOFUNLogic& pLogic) { - if (m_pTerminateIf) - { - RDOParser::s_parser()->error().push_only(pLogic->src_info(), "Terminate_if уже определен"); - RDOParser::s_parser()->error().push_only(m_pTerminateIf->src_info(), "См. первое определение"); - RDOParser::s_parser()->error().push_done(); - } - m_pTerminateIf = pLogic; - RDOParser::s_parser()->runtime()->setTerminateIf(pLogic->getCalc()); + if (m_pTerminateIf) + { + RDOParser::s_parser()->error().push_only(pLogic->src_info(), "Terminate_if уже определен"); + RDOParser::s_parser()->error().push_only(m_pTerminateIf->src_info(), "См. первое определение"); + RDOParser::s_parser()->error().push_done(); + } + m_pTerminateIf = pLogic; + RDOParser::s_parser()->runtime()->setTerminateIf(pLogic->getCalc()); } void RDOSMR::setConstValue(const RDOParserSrcInfo& const_info, LPRDOFUNArithm& pArithm) { - LPRDOFUNConstant pConstant = RDOParser::s_parser()->findFUNConstant(const_info.src_text()); - if (!pConstant) - { - RDOParser::s_parser()->error().error(const_info, rdo::format("Константа '%s' не найдена", const_info.src_text().c_str())); - } - ASSERT(pArithm); - pArithm->checkParamType(pConstant->getTypeInfo()); - rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(pConstant->getTypeInfo()); - this->addCalc(rdo::Factory::create(pConstant->getNumber(), pCalc)); - RDOParser::s_parser()->insertChanges(pConstant->src_text(), pArithm->src_text()); + LPRDOFUNConstant pConstant = RDOParser::s_parser()->findFUNConstant(const_info.src_text()); + if (!pConstant) + { + RDOParser::s_parser()->error().error(const_info, rdo::format("Константа '%s' не найдена", const_info.src_text().c_str())); + } + ASSERT(pArithm); + pArithm->checkParamType(pConstant->getTypeInfo()); + rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(pConstant->getTypeInfo()); + this->addCalc(rdo::Factory::create(pConstant->getNumber(), pCalc)); + RDOParser::s_parser()->insertChanges(pConstant->src_text(), pArithm->src_text()); } void RDOSMR::setResParValue(const RDOParserSrcInfo& res_info, const RDOParserSrcInfo& par_info, LPRDOFUNArithm& pArithm) { - LPRDORSSResource pResource = RDOParser::s_parser()->findRSSResource(res_info.src_text()); - if (!pResource) - { - RDOParser::s_parser()->error().error(res_info.src_info(), rdo::format("Ресурс '%s' не найден", res_info.src_text().c_str())); - } - LPRDORTPParam pParam = pResource->getType()->findRTPParam(par_info.src_text()); - if (!pParam) - { - RDOParser::s_parser()->error().push_only(par_info.src_info(), rdo::format("Параметр '%s' не найден", par_info.src_text().c_str())); - RDOParser::s_parser()->error().push_only(pResource->src_info(), "См. ресурс"); - RDOParser::s_parser()->error().push_only(pResource->getType()->src_info(), "См. тип ресурса"); - RDOParser::s_parser()->error().push_done(); - } - ASSERT(pArithm); - pArithm->checkParamType(pParam->getTypeInfo()); - const std::size_t parNumb = pResource->getType()->getRTPParamNumber(par_info.src_text()); - rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(pParam->getTypeInfo()); - this->addCalc(rdo::Factory::create(pResource->getID(), parNumb, pCalc)); - RDOParser::s_parser()->insertChanges(res_info.src_text() + "." + par_info.src_text(), pArithm->src_text()); + LPRDORSSResource pResource = RDOParser::s_parser()->findRSSResource(res_info.src_text()); + if (!pResource) + { + RDOParser::s_parser()->error().error(res_info.src_info(), rdo::format("Ресурс '%s' не найден", res_info.src_text().c_str())); + } + LPRDORTPParam pParam = pResource->getType()->findRTPParam(par_info.src_text()); + if (!pParam) + { + RDOParser::s_parser()->error().push_only(par_info.src_info(), rdo::format("Параметр '%s' не найден", par_info.src_text().c_str())); + RDOParser::s_parser()->error().push_only(pResource->src_info(), "См. ресурс"); + RDOParser::s_parser()->error().push_only(pResource->getType()->src_info(), "См. тип ресурса"); + RDOParser::s_parser()->error().push_done(); + } + ASSERT(pArithm); + pArithm->checkParamType(pParam->getTypeInfo()); + const std::size_t parNumb = pResource->getType()->getRTPParamNumber(par_info.src_text()); + rdo::runtime::LPRDOCalc pCalc = pArithm->createCalc(pParam->getTypeInfo()); + this->addCalc(rdo::Factory::create(pResource->getID(), parNumb, pCalc)); + RDOParser::s_parser()->insertChanges(res_info.src_text() + "." + par_info.src_text(), pArithm->src_text()); } void RDOSMR::setSeed(const RDOParserSrcInfo& seq_info, int base) { - LPRDOFUNSequence pSequence = RDOParser::s_parser()->findFUNSequence(seq_info.src_text()); - if (!pSequence) - { - RDOParser::s_parser()->error().error(seq_info, rdo::format("Последовательность '%s' не найдена", seq_info.src_text().c_str())); - } - pSequence->getInitCalc()->setBase(base); - RDOParser::s_parser()->insertChanges(pSequence->src_text() + ".Seed", rdo::format("%d", base)); + LPRDOFUNSequence pSequence = RDOParser::s_parser()->findFUNSequence(seq_info.src_text()); + if (!pSequence) + { + RDOParser::s_parser()->error().error(seq_info, rdo::format("Последовательность '%s' не найдена", seq_info.src_text().c_str())); + } + pSequence->getInitCalc()->setBase(base); + RDOParser::s_parser()->insertChanges(pSequence->src_text() + ".Seed", rdo::format("%d", base)); } void RDOSMR::insertBreakPoint(const RDOParserSrcInfo& src_info, LPRDOFUNLogic& pLogic) { - for (const auto& breakPoint: m_breakPointList) - { - if (breakPoint->src_text() == src_info.src_text()) - { - RDOParser::s_parser()->error().push_only(src_info, rdo::format("Точка останова с именем '%s' уже существует", src_info.src_text().c_str())); - RDOParser::s_parser()->error().push_only(breakPoint->src_info(), "См. первое определение"); - RDOParser::s_parser()->error().push_done(); - } - } - LPBreakPoint pBreakPoint = rdo::Factory::create(src_info, pLogic); - ASSERT(pBreakPoint); - m_breakPointList.push_back(pBreakPoint); + for (const auto& breakPoint: m_breakPointList) + { + if (breakPoint->src_text() == src_info.src_text()) + { + RDOParser::s_parser()->error().push_only(src_info, rdo::format("Точка останова с именем '%s' уже существует", src_info.src_text().c_str())); + RDOParser::s_parser()->error().push_only(breakPoint->src_info(), "См. первое определение"); + RDOParser::s_parser()->error().push_done(); + } + } + LPBreakPoint pBreakPoint = rdo::Factory::create(src_info, pLogic); + ASSERT(pBreakPoint); + m_breakPointList.push_back(pBreakPoint); } RDOSMR::BreakPoint::BreakPoint(const RDOParserSrcInfo& src_info, LPRDOFUNLogic pLogic) - : RDOParserSrcInfo(src_info) + : RDOParserSrcInfo(src_info) { - ASSERT(pLogic); - RDOParser::s_parser()->runtime()->insertBreakPoint(src_text(), pLogic->getCalc()); + ASSERT(pLogic); + RDOParser::s_parser()->runtime()->insertBreakPoint(src_text(), pLogic->getCalc()); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/rdosmr.h b/simulator/compiler/parser/rdosmr.h index fc6107136..92a33fe16 100644 --- a/simulator/compiler/parser/rdosmr.h +++ b/simulator/compiler/parser/rdosmr.h @@ -1,5 +1,4 @@ -#ifndef _RDOSMR_H_ -#define _RDOSMR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -24,75 +23,73 @@ class RDOSMR: public rdo::counter_reference { DECLARE_FACTORY(RDOSMR); public: - typedef std::map StringTable; - - void setExternalModelName(const std::string& alias, const std::string& modelID) - { - m_extModelList[alias] = modelID; - } - std::string getExternalModelName(const std::string& alias) const - { - StringTable::const_iterator it = m_extModelList.find(alias); - return it != m_extModelList.end() ? it->second : ""; - } - const StringTable& getExternalModelList() const - { - return m_extModelList; - } - - rdo::service::simulation::ShowMode getShowMode () const { return m_showMode; } - int getFrameNumber () const { return m_frameNumber; } - double getShowRate () const { return m_showRate; } - double getRunStartTime () const { return m_runStartTime; } - double getTraceStartTime() const { return m_traceStartTime; } - double getTraceEndTime () const { return m_traceEndTime; } - - void setShowMode (rdo::service::simulation::ShowMode showMode); - void setFrameNumber (int value, const YYLTYPE& pos); - void setShowRate (double value, const YYLTYPE& pos); - void setRunStartTime (double value, const YYLTYPE& pos); - void setTraceStartTime(double value, const YYLTYPE& pos); - void setTraceEndTime (double value, const YYLTYPE& pos); - - void setTerminateIf (LPRDOFUNLogic& pLogic); - void setConstValue (const RDOParserSrcInfo& const_info, LPRDOFUNArithm& pArithm); - void setResParValue (const RDOParserSrcInfo& res_info, const RDOParserSrcInfo& par_info, LPRDOFUNArithm& pArithm); - void setSeed (const RDOParserSrcInfo& seq_info, int base); - void insertBreakPoint(const RDOParserSrcInfo& src_info, LPRDOFUNLogic& pLogic); - - std::vector getCalcList() const { return m_SMRCalcList; } + typedef std::map StringTable; + + void setExternalModelName(const std::string& alias, const std::string& modelID) + { + m_extModelList[alias] = modelID; + } + std::string getExternalModelName(const std::string& alias) const + { + StringTable::const_iterator it = m_extModelList.find(alias); + return it != m_extModelList.end() ? it->second : ""; + } + const StringTable& getExternalModelList() const + { + return m_extModelList; + } + + rdo::service::simulation::ShowMode getShowMode () const { return m_showMode; } + int getFrameNumber () const { return m_frameNumber; } + double getShowRate () const { return m_showRate; } + double getRunStartTime () const { return m_runStartTime; } + double getTraceStartTime() const { return m_traceStartTime; } + double getTraceEndTime () const { return m_traceEndTime; } + + void setShowMode (rdo::service::simulation::ShowMode showMode); + void setFrameNumber (int value, const YYLTYPE& pos); + void setShowRate (double value, const YYLTYPE& pos); + void setRunStartTime (double value, const YYLTYPE& pos); + void setTraceStartTime(double value, const YYLTYPE& pos); + void setTraceEndTime (double value, const YYLTYPE& pos); + + void setTerminateIf (LPRDOFUNLogic& pLogic); + void setConstValue (const RDOParserSrcInfo& const_info, LPRDOFUNArithm& pArithm); + void setResParValue (const RDOParserSrcInfo& res_info, const RDOParserSrcInfo& par_info, LPRDOFUNArithm& pArithm); + void setSeed (const RDOParserSrcInfo& seq_info, int base); + void insertBreakPoint(const RDOParserSrcInfo& src_info, LPRDOFUNLogic& pLogic); + + std::vector getCalcList() const { return m_SMRCalcList; } private: - RDOSMR(); - - PREDECLARE_POINTER(BreakPoint); - class BreakPoint - : public rdo::counter_reference - , public RDOParserSrcInfo - { - DECLARE_FACTORY(BreakPoint); - private: - BreakPoint(const RDOParserSrcInfo& src_info, LPRDOFUNLogic pLogic); - }; - typedef std::vector BreakPointList; - - StringTable m_extModelList; - rdo::service::simulation::ShowMode m_showMode; - int m_frameNumber; - double m_showRate; - double m_runStartTime; - double m_traceStartTime; - double m_traceEndTime; - YYLTYPE m_traceStartTime_pos; - YYLTYPE m_traceEndTime_pos; - LPRDOFUNLogic m_pTerminateIf; - BreakPointList m_breakPointList; - - void addCalc(const rdo::runtime::LPRDOCalc pCalc) { m_SMRCalcList.push_back(pCalc); } - - std::vector m_SMRCalcList; + RDOSMR(); + + PREDECLARE_POINTER(BreakPoint); + class BreakPoint + : public rdo::counter_reference + , public RDOParserSrcInfo + { + DECLARE_FACTORY(BreakPoint); + private: + BreakPoint(const RDOParserSrcInfo& src_info, LPRDOFUNLogic pLogic); + }; + typedef std::vector BreakPointList; + + StringTable m_extModelList; + rdo::service::simulation::ShowMode m_showMode; + int m_frameNumber; + double m_showRate; + double m_runStartTime; + double m_traceStartTime; + double m_traceEndTime; + YYLTYPE m_traceStartTime_pos; + YYLTYPE m_traceEndTime_pos; + LPRDOFUNLogic m_pTerminateIf; + BreakPointList m_breakPointList; + + void addCalc(const rdo::runtime::LPRDOCalc pCalc) { m_SMRCalcList.push_back(pCalc); } + + std::vector m_SMRCalcList; }; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOSMR_H_ diff --git a/simulator/compiler/parser/src/animation/animation_base.cpp b/simulator/compiler/parser/src/animation/animation_base.cpp index b88c0aae3..6024b424e 100644 --- a/simulator/compiler/parser/src/animation/animation_base.cpp +++ b/simulator/compiler/parser/src/animation/animation_base.cpp @@ -12,15 +12,15 @@ OPEN_RDO_PARSER_NAMESPACE RDOFRMCommandList::RDOFRMCommandList(const RDOParserSrcInfo& srcInfo) { - m_pFunction = rdo::Factory::create( - rdo::Factory::delegate(srcInfo), - srcInfo - ); - ASSERT(m_pFunction); - - RDOParser::s_parser()->insertFRMCommandList(this); - RDOParser::s_parser()->contextStack()->push(this); - m_pFunction->pushContext(); + m_pFunction = rdo::Factory::create( + rdo::Factory::delegate(srcInfo), + srcInfo + ); + ASSERT(m_pFunction); + + RDOParser::s_parser()->insertFRMCommandList(this); + RDOParser::s_parser()->contextStack()->push(this); + m_pFunction->pushContext(); } RDOFRMCommandList::~RDOFRMCommandList() @@ -28,17 +28,17 @@ RDOFRMCommandList::~RDOFRMCommandList() const std::string& RDOFRMCommandList::name() const { - return m_pFunction->src_text(); + return m_pFunction->src_text(); } LPExpression RDOFRMCommandList::expression() const { - return m_pFunction->expression(); + return m_pFunction->expression(); } const LPFunction& RDOFRMCommandList::function() const { - return m_pFunction; + return m_pFunction; } namespace @@ -46,42 +46,42 @@ namespace LPExpression sprite(const LPRDOFRMSprite& sprite) { - return sprite->expression(); + return sprite->expression(); } } Context::LPFindResult RDOFRMCommandList::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& /*srcInfo*/) const { - if (method == Context::METHOD_GET) - { - LPRDOFRMSprite pSprite = RDOParser::s_parser()->findFRMSprite(params.identifier()); - return pSprite - ? rdo::Factory::create(CreateExpression(boost::bind(&sprite, pSprite))) - : rdo::Factory::create(); - } - - return rdo::Factory::create(); + if (method == Context::METHOD_GET) + { + LPRDOFRMSprite pSprite = RDOParser::s_parser()->findFRMSprite(params.identifier()); + return pSprite + ? rdo::Factory::create(CreateExpression(boost::bind(&sprite, pSprite))) + : rdo::Factory::create(); + } + + return rdo::Factory::create(); } void RDOFRMCommandList::end() { - m_pFunction->popContext(); - RDOParser::s_parser()->contextStack()->pop(); - list()->setSpriteCalc(expression()->calc()); + m_pFunction->popContext(); + RDOParser::s_parser()->contextStack()->pop(); + list()->setSpriteCalc(expression()->calc()); } LPExpression RDOFRMCommandList::generateExpression(const rdo::runtime::LPRDOCalc& pCalc, const RDOParserSrcInfo& srcInfo) { - ASSERT(pCalc); + ASSERT(pCalc); - LPTypeInfo pType = rdo::Factory::delegate(srcInfo); - ASSERT(pType); + LPTypeInfo pType = rdo::Factory::delegate(srcInfo); + ASSERT(pType); - LPExpression pExpression = rdo::Factory::create(pType, pCalc, srcInfo); - ASSERT(pExpression); + LPExpression pExpression = rdo::Factory::create(pType, pCalc, srcInfo); + ASSERT(pExpression); - return pExpression; + return pExpression; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/src/animation/animation_base.h b/simulator/compiler/parser/src/animation/animation_base.h index aeb28ee51..d3104bb5d 100644 --- a/simulator/compiler/parser/src/animation/animation_base.h +++ b/simulator/compiler/parser/src/animation/animation_base.h @@ -1,5 +1,4 @@ -#ifndef _SIMULATOR_COMPILER_PARSER_ANIMATION_BASE_H_ -#define _SIMULATOR_COMPILER_PARSER_ANIMATION_BASE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,32 +12,30 @@ OPEN_RDO_PARSER_NAMESPACE class RDOFRMCommandList - : public Context - , public IContextFind + : public Context + , public IContextFind { DECLARE_FACTORY(RDOFRMCommandList); public: - const std::string& name() const; - LPExpression expression() const; - void end(); + const std::string& name() const; + LPExpression expression() const; + void end(); - virtual rdo::runtime::LPRDOFRMSprite list() const = 0; + virtual rdo::runtime::LPRDOFRMSprite list() const = 0; - static LPExpression generateExpression(const rdo::runtime::LPRDOCalc& pCalc, const RDOParserSrcInfo& srcInfo); + static LPExpression generateExpression(const rdo::runtime::LPRDOCalc& pCalc, const RDOParserSrcInfo& srcInfo); protected: - RDOFRMCommandList(const RDOParserSrcInfo& srcInfo); - virtual ~RDOFRMCommandList(); + RDOFRMCommandList(const RDOParserSrcInfo& srcInfo); + virtual ~RDOFRMCommandList(); - const LPFunction& function() const; + const LPFunction& function() const; private: - LPFunction m_pFunction; + LPFunction m_pFunction; - DECLARE_IContextFind; + DECLARE_IContextFind; }; DECLARE_POINTER(RDOFRMCommandList); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _SIMULATOR_COMPILER_PARSER_ANIMATION_BASE_H_ diff --git a/simulator/compiler/parser/src/animation/animation_frame.cpp b/simulator/compiler/parser/src/animation/animation_frame.cpp index e0718fa1e..1626d538a 100644 --- a/simulator/compiler/parser/src/animation/animation_frame.cpp +++ b/simulator/compiler/parser/src/animation/animation_frame.cpp @@ -12,9 +12,9 @@ OPEN_RDO_PARSER_NAMESPACE int frmlex(YYSTYPE* lpval, YYLTYPE* llocp, void* lexer) { - LEXER->m_lpval = lpval; - LEXER->m_lploc = llocp; - return LEXER->yylex(); + LEXER->m_lpval = lpval; + LEXER->m_lploc = llocp; + return LEXER->yylex(); } void frmerror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) @@ -24,13 +24,13 @@ void frmerror(YYLTYPE* /*llocp*/, void* /*lexer*/, const char* /*message*/) // -------------------- RDOFRMFrame // -------------------------------------------------------------------------------- RDOFRMFrame::RDOFRMFrame(const RDOParserSrcInfo& srcInfo) - : RDOFRMCommandList(srcInfo) + : RDOFRMCommandList(srcInfo) { - m_pFrame = rdo::Factory::create(function()->src_info()); - ASSERT(m_pFrame) - RDOParser::s_parser()->runtime()->addRuntimeFrame(m_pFrame); + m_pFrame = rdo::Factory::create(function()->src_info()); + ASSERT(m_pFrame) + RDOParser::s_parser()->runtime()->addRuntimeFrame(m_pFrame); - RDOParser::s_parser()->insertFRMFrame(this); + RDOParser::s_parser()->insertFRMFrame(this); } RDOFRMFrame::~RDOFRMFrame() @@ -38,12 +38,12 @@ RDOFRMFrame::~RDOFRMFrame() const rdo::runtime::LPRDOFRMFrame& RDOFRMFrame::frame() const { - return m_pFrame; + return m_pFrame; } rdo::runtime::LPRDOFRMSprite RDOFRMFrame::list() const { - return m_pFrame; + return m_pFrame; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/src/animation/animation_frame.h b/simulator/compiler/parser/src/animation/animation_frame.h index 0e341223f..7c8871fba 100644 --- a/simulator/compiler/parser/src/animation/animation_frame.h +++ b/simulator/compiler/parser/src/animation/animation_frame.h @@ -1,5 +1,4 @@ -#ifndef _SIMULATOR_COMPILER_PARSER_ANIMATION_FRAME_H_ -#define _SIMULATOR_COMPILER_PARSER_ANIMATION_FRAME_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -15,18 +14,16 @@ class RDOFRMFrame: public RDOFRMCommandList { DECLARE_FACTORY(RDOFRMFrame); public: - const rdo::runtime::LPRDOFRMFrame& frame() const; + const rdo::runtime::LPRDOFRMFrame& frame() const; private: - RDOFRMFrame(const RDOParserSrcInfo& srcInfo); - virtual ~RDOFRMFrame(); + RDOFRMFrame(const RDOParserSrcInfo& srcInfo); + virtual ~RDOFRMFrame(); - rdo::runtime::LPRDOFRMFrame m_pFrame; + rdo::runtime::LPRDOFRMFrame m_pFrame; - rdo::runtime::LPRDOFRMSprite list() const; + rdo::runtime::LPRDOFRMSprite list() const; }; DECLARE_POINTER(RDOFRMFrame); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _SIMULATOR_COMPILER_PARSER_ANIMATION_FRAME_H_ diff --git a/simulator/compiler/parser/src/animation/animation_sprite.cpp b/simulator/compiler/parser/src/animation/animation_sprite.cpp index 2a070904a..a188af1ed 100644 --- a/simulator/compiler/parser/src/animation/animation_sprite.cpp +++ b/simulator/compiler/parser/src/animation/animation_sprite.cpp @@ -9,12 +9,12 @@ OPEN_RDO_PARSER_NAMESPACE RDOFRMSprite::RDOFRMSprite(const RDOParserSrcInfo& src_info) - : RDOFRMCommandList(src_info) + : RDOFRMCommandList(src_info) { - m_pSprite = rdo::Factory::create(function()->src_info()); - ASSERT(m_pSprite) + m_pSprite = rdo::Factory::create(function()->src_info()); + ASSERT(m_pSprite) - RDOParser::s_parser()->insertFRMSprite(this); + RDOParser::s_parser()->insertFRMSprite(this); } RDOFRMSprite::~RDOFRMSprite() @@ -22,7 +22,7 @@ RDOFRMSprite::~RDOFRMSprite() rdo::runtime::LPRDOFRMSprite RDOFRMSprite::list() const { - return m_pSprite; + return m_pSprite; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/src/animation/animation_sprite.h b/simulator/compiler/parser/src/animation/animation_sprite.h index 6b8e1ce6a..1fa72b277 100644 --- a/simulator/compiler/parser/src/animation/animation_sprite.h +++ b/simulator/compiler/parser/src/animation/animation_sprite.h @@ -1,5 +1,4 @@ -#ifndef _SIMULATOR_COMPILER_PARSER_ANIMATION_SPRITE_H_ -#define _SIMULATOR_COMPILER_PARSER_ANIMATION_SPRITE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -12,15 +11,13 @@ class RDOFRMSprite: public RDOFRMCommandList { DECLARE_FACTORY(RDOFRMSprite); private: - RDOFRMSprite(const RDOParserSrcInfo& src_info); - virtual ~RDOFRMSprite(); + RDOFRMSprite(const RDOParserSrcInfo& src_info); + virtual ~RDOFRMSprite(); - rdo::runtime::LPRDOFRMSprite m_pSprite; + rdo::runtime::LPRDOFRMSprite m_pSprite; - rdo::runtime::LPRDOFRMSprite list() const; + rdo::runtime::LPRDOFRMSprite list() const; }; DECLARE_POINTER(RDOFRMSprite); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _SIMULATOR_COMPILER_PARSER_ANIMATION_SPRITE_H_ diff --git a/simulator/compiler/parser/src/function/function.cpp b/simulator/compiler/parser/src/function/function.cpp index bbfb2705a..a9213bdd5 100644 --- a/simulator/compiler/parser/src/function/function.cpp +++ b/simulator/compiler/parser/src/function/function.cpp @@ -15,10 +15,10 @@ OPEN_RDO_PARSER_NAMESPACE Function::Function(const LPTypeInfo& pReturnType, const RDOParserSrcInfo& srcInfo) - : RDOParserSrcInfo(srcInfo) - , m_pReturnType(pReturnType) + : RDOParserSrcInfo(srcInfo) + , m_pReturnType(pReturnType) { - ASSERT(m_pReturnType); + ASSERT(m_pReturnType); } Function::~Function() @@ -26,189 +26,189 @@ Function::~Function() LPExpression Function::expression() const { - ASSERT(m_pBody); - LPExpression pExpression = rdo::Factory::create( - rdo::Factory::create(m_pFunctionType, m_pFunctionType->src_info()), - m_pBody, - src_info() - ); - ASSERT(pExpression); - return pExpression; + ASSERT(m_pBody); + LPExpression pExpression = rdo::Factory::create( + rdo::Factory::create(m_pFunctionType, m_pFunctionType->src_info()), + m_pBody, + src_info() + ); + ASSERT(pExpression); + return pExpression; } void Function::pushContext() { - RDOParser::s_parser()->contextStack()->push(this); + RDOParser::s_parser()->contextStack()->push(this); } void Function::popContext() { - RDOParser::s_parser()->contextStack()->pop(); + RDOParser::s_parser()->contextStack()->pop(); } void Function::pushParamDefinitionContext() { - LPContextParamDefinition pContextParamDefinition = rdo::Factory::create( - boost::bind(&Function::onPushParam, this, _1) - ); - ASSERT(pContextParamDefinition); - RDOParser::s_parser()->contextStack()->push(pContextParamDefinition); + LPContextParamDefinition pContextParamDefinition = rdo::Factory::create( + boost::bind(&Function::onPushParam, this, _1) + ); + ASSERT(pContextParamDefinition); + RDOParser::s_parser()->contextStack()->push(pContextParamDefinition); } void Function::popParamDefinitionContext() { - RDOParser::s_parser()->contextStack()->pop(); + RDOParser::s_parser()->contextStack()->pop(); - m_pFunctionType = generateType(); - ASSERT(m_pFunctionType); + m_pFunctionType = generateType(); + ASSERT(m_pFunctionType); } void Function::onPushParam(const LPRDOParam& pParam) { - ASSERT(pParam); - LPRDOParam pParamPrev = findParam(pParam->name()); - if (pParamPrev) - { - RDOParser::s_parser()->error().push_only(pParam->src_info(), rdo::format("Параметр уже определён: %s", pParam->name().c_str())); - RDOParser::s_parser()->error().push_only(pParamPrev->src_info(), "См. первое определение"); - RDOParser::s_parser()->error().push_done(); - } - m_paramList.push_back(pParam); + ASSERT(pParam); + LPRDOParam pParamPrev = findParam(pParam->name()); + if (pParamPrev) + { + RDOParser::s_parser()->error().push_only(pParam->src_info(), rdo::format("Параметр уже определён: %s", pParam->name().c_str())); + RDOParser::s_parser()->error().push_only(pParamPrev->src_info(), "См. первое определение"); + RDOParser::s_parser()->error().push_done(); + } + m_paramList.push_back(pParam); } LPRDOParam Function::findParam(const std::string& paramName) const { - ParamList::const_iterator it = find(paramName); + ParamList::const_iterator it = find(paramName); - return it != m_paramList.end() - ? *it - : LPRDOParam(NULL); + return it != m_paramList.end() + ? *it + : LPRDOParam(NULL); } Function::ParamID Function::findParamID(const std::string& paramName) const { - ParamList::const_iterator it = find(paramName); + ParamList::const_iterator it = find(paramName); - return it != m_paramList.end() - ? it - m_paramList.begin() - : ParamID(); + return it != m_paramList.end() + ? it - m_paramList.begin() + : ParamID(); } Function::ParamList::const_iterator Function::find(const std::string& paramName) const { - return boost::range::find_if(m_paramList, compareName(paramName)); + return boost::range::find_if(m_paramList, compareName(paramName)); } const Function::ParamList& Function::getParams() const { - return m_paramList; + return m_paramList; } LPFunctionType Function::generateType() const { - ASSERT(m_pReturnType); + ASSERT(m_pReturnType); - FunctionParamType::ParamList paramTypeList; - for (const LPRDOParam& pParam: m_paramList) - { - paramTypeList.push_back(pParam->getTypeInfo()); - } + FunctionParamType::ParamList paramTypeList; + for (const LPRDOParam& pParam: m_paramList) + { + paramTypeList.push_back(pParam->getTypeInfo()); + } - if (paramTypeList.empty()) - { - paramTypeList.push_back( - rdo::Factory::delegate(src_info()) - ); - } + if (paramTypeList.empty()) + { + paramTypeList.push_back( + rdo::Factory::delegate(src_info()) + ); + } - LPFunctionParamType pParamType = rdo::Factory::create(paramTypeList, src_info()); - ASSERT(pParamType); + LPFunctionParamType pParamType = rdo::Factory::create(paramTypeList, src_info()); + ASSERT(pParamType); - return rdo::Factory::create(m_pReturnType, pParamType, src_info()); + return rdo::Factory::create(m_pReturnType, pParamType, src_info()); } void Function::pushFunctionBodyContext() { - ASSERT(!m_pContextFunctionBody); - m_pContextFunctionBody = rdo::Factory::create( - boost::bind(&Function::setBody, this, _1) - ); - ASSERT(m_pContextFunctionBody); - RDOParser::s_parser()->contextStack()->push(m_pContextFunctionBody); - m_pContextFunctionBody->pushContext(); + ASSERT(!m_pContextFunctionBody); + m_pContextFunctionBody = rdo::Factory::create( + boost::bind(&Function::setBody, this, _1) + ); + ASSERT(m_pContextFunctionBody); + RDOParser::s_parser()->contextStack()->push(m_pContextFunctionBody); + m_pContextFunctionBody->pushContext(); } void Function::popFunctionBodyContext() { - ASSERT(m_pContextFunctionBody); - - if (m_pReturnType->typeID() != rdo::runtime::RDOType::t_void) - { - if (!m_pContextFunctionBody->getReturnFlag()) - { - RDOParser::s_parser()->error().warning( - src_info(), - rdo::format("Возможно, не все ветки функции '%s' могут вернуть значение.", src_text().c_str()) - ); - } - } - - m_pContextFunctionBody->popContext(); - RDOParser::s_parser()->contextStack()->pop(); - m_pContextFunctionBody = NULL; + ASSERT(m_pContextFunctionBody); + + if (m_pReturnType->typeID() != rdo::runtime::RDOType::Type::EMPTY) + { + if (!m_pContextFunctionBody->getReturnFlag()) + { + RDOParser::s_parser()->error().warning( + src_info(), + rdo::format("Возможно, не все ветки функции '%s' могут вернуть значение.", src_text().c_str()) + ); + } + } + + m_pContextFunctionBody->popContext(); + RDOParser::s_parser()->contextStack()->pop(); + m_pContextFunctionBody = NULL; } void Function::setBody(const rdo::runtime::LPRDOCalc& pBody) { - ASSERT(!m_pBody); - ASSERT(pBody); - - rdo::runtime::LPRDOCalcBaseStatementList pCalcStatementList = - rdo::Factory::create(); - ASSERT(pCalcStatementList); - - rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); - ASSERT(pCalcOpenBrace); - - rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); - ASSERT(pCalcCloseBrace); - - pCalcStatementList->addCalcStatement(pCalcOpenBrace); - pCalcStatementList->addCalcStatement(pBody); - pCalcStatementList->addCalcStatement(pCalcCloseBrace); - - if (m_pReturnType->typeID() != rdo::runtime::RDOType::t_void && !m_pContextFunctionBody->getReturnFlag()) - { - rdo::runtime::LPRDOCalc pCalcDefault = m_pDefaultValue; - if (!pCalcDefault) - { - //! Присвоить автоматическое значение по умолчанию, если оно не задано в явном виде - pCalcDefault = rdo::Factory::create(m_pReturnType->itype()->get_default()); - ASSERT(pCalcDefault); - pCalcDefault->setSrcInfo(m_pReturnType->src_info()); - } - rdo::runtime::LPRDOCalc pCalcReturn = rdo::Factory::create(pCalcDefault); - ASSERT(pCalcReturn); - - rdo::runtime::LPRDOCalcBaseStatementList pBodyStatementList = - pBody.object_dynamic_cast(); - ASSERT(pBodyStatementList); - pBodyStatementList->addCalcStatement(pCalcReturn); - } - - rdo::runtime::LPRDOCalcReturnCatch pCalcReturnCatch = - rdo::Factory::create(); - ASSERT(pCalcReturnCatch); - pCalcReturnCatch->setTryCalc(pCalcStatementList); - - m_pBody = pCalcReturnCatch; + ASSERT(!m_pBody); + ASSERT(pBody); + + rdo::runtime::LPRDOCalcBaseStatementList pCalcStatementList = + rdo::Factory::create(); + ASSERT(pCalcStatementList); + + rdo::runtime::LPRDOCalcOpenBrace pCalcOpenBrace = rdo::Factory::create(); + ASSERT(pCalcOpenBrace); + + rdo::runtime::LPRDOCalcCloseBrace pCalcCloseBrace = rdo::Factory::create(); + ASSERT(pCalcCloseBrace); + + pCalcStatementList->addCalcStatement(pCalcOpenBrace); + pCalcStatementList->addCalcStatement(pBody); + pCalcStatementList->addCalcStatement(pCalcCloseBrace); + + if (m_pReturnType->typeID() != rdo::runtime::RDOType::Type::EMPTY && !m_pContextFunctionBody->getReturnFlag()) + { + rdo::runtime::LPRDOCalc pCalcDefault = m_pDefaultValue; + if (!pCalcDefault) + { + // Присвоить автоматическое значение по умолчанию, если оно не задано в явном виде + pCalcDefault = rdo::Factory::create(m_pReturnType->itype()->get_default()); + ASSERT(pCalcDefault); + pCalcDefault->setSrcInfo(m_pReturnType->src_info()); + } + rdo::runtime::LPRDOCalc pCalcReturn = rdo::Factory::create(pCalcDefault); + ASSERT(pCalcReturn); + + rdo::runtime::LPRDOCalcBaseStatementList pBodyStatementList = + pBody.object_dynamic_cast(); + ASSERT(pBodyStatementList); + pBodyStatementList->addCalcStatement(pCalcReturn); + } + + rdo::runtime::LPRDOCalcReturnCatch pCalcReturnCatch = + rdo::Factory::create(); + ASSERT(pCalcReturnCatch); + pCalcReturnCatch->setTryCalc(pCalcStatementList); + + m_pBody = pCalcReturnCatch; } void Function::setDefaultCalc(const rdo::runtime::LPRDOCalc& pDefaultValue) { - ASSERT(pDefaultValue); - ASSERT(!m_pDefaultValue); - m_pDefaultValue = pDefaultValue; + ASSERT(pDefaultValue); + ASSERT(!m_pDefaultValue); + m_pDefaultValue = pDefaultValue; } namespace @@ -216,66 +216,66 @@ namespace LPExpression contextParameter(const LPRDOParam& param, std::size_t paramID, const RDOParserSrcInfo& srcInfo) { - return rdo::Factory::create( - param->getTypeInfo(), - rdo::Factory::create(paramID, param->src_info()), - srcInfo - ); + return rdo::Factory::create( + param->getTypeInfo(), + rdo::Factory::create(paramID, param->src_info()), + srcInfo + ); } } Context::LPFindResult Function::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const { - if (method == Context::METHOD_GET || method == Context::METHOD_SET || method == Context::METHOD_OPERATOR_DOT) - { - const std::string identifier = params.identifier(); - - LPRDOParam pParam = findParam(identifier); - if (pParam) - { - rdo::runtime::RDOType::TypeID typeID = pParam->getTypeInfo()->typeID(); - if (typeID == rdo::runtime::RDOType::t_identificator || typeID == rdo::runtime::RDOType::t_unknow) - { - RDOParser::s_parser()->error().push_only( - srcInfo, - rdo::format("Тип параметра '%s' определён неверно", identifier.c_str()) - ); - RDOParser::s_parser()->error().push_only(pParam->getTypeInfo()->src_info(), "См. описание типа"); - RDOParser::s_parser()->error().push_done(); - } - ParamID paramID = findParamID(identifier); - ASSERT(paramID.is_initialized()); - - if (method == Context::METHOD_GET) - { - return rdo::Factory::create(CreateExpression(boost::bind(&contextParameter, pParam, *paramID, srcInfo))); - } - else if (method == Context::METHOD_OPERATOR_DOT) - { - LPRDORTPResType resourceType = pParam->getTypeInfo()->itype().object_dynamic_cast(); - if (resourceType) - { - Context::Params params_; - params_[RDORSSResource::GET_RESOURCE] = contextParameter(pParam, *paramID, srcInfo); - params_[Context::Params::IDENTIFIER] = identifier; - return rdo::Factory::create(SwitchContext(resourceType, params_)); - } - else - { - LPFunction pThis(const_cast(this)); - return rdo::Factory::create(SwitchContext(pThis, params)); - } - } - else - { - ASSERT(method == Context::METHOD_SET); - RDOParser::s_parser()->error().error(srcInfo, rdo::format("Функция не может изменить свой параметр: %s", identifier.c_str())); - } - } - } - - return rdo::Factory::create(); + if (method == Context::METHOD_GET || method == Context::METHOD_SET || method == Context::METHOD_OPERATOR_DOT) + { + const std::string identifier = params.identifier(); + + LPRDOParam pParam = findParam(identifier); + if (pParam) + { + rdo::runtime::RDOType::Type typeID = pParam->getTypeInfo()->typeID(); + if (typeID == rdo::runtime::RDOType::Type::IDENTIFICATOR || typeID == rdo::runtime::RDOType::Type::UNKNOW) + { + RDOParser::s_parser()->error().push_only( + srcInfo, + rdo::format("Тип параметра '%s' определён неверно", identifier.c_str()) + ); + RDOParser::s_parser()->error().push_only(pParam->getTypeInfo()->src_info(), "См. описание типа"); + RDOParser::s_parser()->error().push_done(); + } + ParamID paramID = findParamID(identifier); + ASSERT(paramID.is_initialized()); + + if (method == Context::METHOD_GET) + { + return rdo::Factory::create(CreateExpression(boost::bind(&contextParameter, pParam, *paramID, srcInfo))); + } + else if (method == Context::METHOD_OPERATOR_DOT) + { + LPRDORTPResType resourceType = pParam->getTypeInfo()->itype().object_dynamic_cast(); + if (resourceType) + { + Context::Params params_; + params_[RDORSSResource::GET_RESOURCE] = contextParameter(pParam, *paramID, srcInfo); + params_[Context::Params::IDENTIFIER] = identifier; + return rdo::Factory::create(SwitchContext(resourceType, params_)); + } + else + { + LPFunction pThis(const_cast(this)); + return rdo::Factory::create(SwitchContext(pThis, params)); + } + } + else + { + ASSERT(method == Context::METHOD_SET); + RDOParser::s_parser()->error().error(srcInfo, rdo::format("Функция не может изменить свой параметр: %s", identifier.c_str())); + } + } + } + + return rdo::Factory::create(); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/src/function/function.h b/simulator/compiler/parser/src/function/function.h index 0a418af18..eef7ebf9a 100644 --- a/simulator/compiler/parser/src/function/function.h +++ b/simulator/compiler/parser/src/function/function.h @@ -1,5 +1,4 @@ -#ifndef _SIMULATOR_COMPILER_PARSER_FUNCTION_H_ -#define _SIMULATOR_COMPILER_PARSER_FUNCTION_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -15,55 +14,53 @@ OPEN_RDO_PARSER_NAMESPACE class Function - : public IContextParamDefinitionManager - , public IContextFunctionBodyManager - , public Context - , public IContextFind - , public RDOParserSrcInfo + : public IContextParamDefinitionManager + , public IContextFunctionBodyManager + , public Context + , public IContextFind + , public RDOParserSrcInfo { DECLARE_FACTORY(Function); public: - typedef boost::optional ParamID; - typedef std::vector ParamList; + typedef boost::optional ParamID; + typedef std::vector ParamList; - void pushContext(); - void popContext (); + void pushContext(); + void popContext (); - LPRDOParam findParam(const std::string& paramName) const; - ParamID findParamID(const std::string& paramName) const; + LPRDOParam findParam(const std::string& paramName) const; + ParamID findParamID(const std::string& paramName) const; - const ParamList& getParams() const; + const ParamList& getParams() const; - LPExpression expression() const; + LPExpression expression() const; protected: - Function(const LPTypeInfo& pReturnType, const RDOParserSrcInfo& srcInfo); - virtual ~Function(); + Function(const LPTypeInfo& pReturnType, const RDOParserSrcInfo& srcInfo); + virtual ~Function(); - //! @todo Для передачи значения по умолчанию алгоритмической функции. В идеале, это надо переложить на конвертор. - void setDefaultCalc(const rdo::runtime::LPRDOCalc& pDefaultValue); + // TODO Для передачи значения по умолчанию алгоритмической функции. В идеале, это надо переложить на конвертор. + void setDefaultCalc(const rdo::runtime::LPRDOCalc& pDefaultValue); - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; private: - LPFunctionType m_pFunctionType; - LPTypeInfo m_pReturnType; - ParamList m_paramList; - LPContextFunctionBody m_pContextFunctionBody; - rdo::runtime::LPRDOCalc m_pBody; - rdo::runtime::LPRDOCalc m_pDefaultValue; + LPFunctionType m_pFunctionType; + LPTypeInfo m_pReturnType; + ParamList m_paramList; + LPContextFunctionBody m_pContextFunctionBody; + rdo::runtime::LPRDOCalc m_pBody; + rdo::runtime::LPRDOCalc m_pDefaultValue; - void onPushParam(const LPRDOParam& pParam); - void setBody (const rdo::runtime::LPRDOCalc& pBody); + void onPushParam(const LPRDOParam& pParam); + void setBody (const rdo::runtime::LPRDOCalc& pBody); - ParamList::const_iterator find(const std::string& paramName) const; - LPFunctionType generateType() const; + ParamList::const_iterator find(const std::string& paramName) const; + LPFunctionType generateType() const; - DECLARE_IContextParamDefinitionManager; - DECLARE_IContextFunctionBodyManager; + DECLARE_IContextParamDefinitionManager; + DECLARE_IContextFunctionBodyManager; }; DECLARE_POINTER(Function); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _SIMULATOR_COMPILER_PARSER_FUNCTION_H_ diff --git a/simulator/compiler/parser/src/function/local_variable/local_variable.cpp b/simulator/compiler/parser/src/function/local_variable/local_variable.cpp index dc1331699..5014951e7 100644 --- a/simulator/compiler/parser/src/function/local_variable/local_variable.cpp +++ b/simulator/compiler/parser/src/function/local_variable/local_variable.cpp @@ -19,16 +19,16 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- LocalVariable // -------------------------------------------------------------------------------- LocalVariable::LocalVariable(const LPRDOValue& pName, const LPExpression& pExpression) - : m_pName (pName ) - , m_pExpression(pExpression) + : m_pName (pName ) + , m_pExpression(pExpression) { - ASSERT(m_pName ); - ASSERT(m_pExpression); + ASSERT(m_pName ); + ASSERT(m_pExpression); - if (m_pExpression->typeInfo()->typeID() == rdo::runtime::RDOType::t_unknow) - { - parser::g_error().error(m_pExpression->typeInfo()->src_info(), "У данного типа нет значения поумолчанию"); - } + if (m_pExpression->typeInfo()->typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + parser::g_error().error(m_pExpression->typeInfo()->src_info(), "У данного типа нет значения поумолчанию"); + } } LocalVariable::~LocalVariable() @@ -36,27 +36,27 @@ LocalVariable::~LocalVariable() const std::string& LocalVariable::getName() const { - return m_pName->value().getIdentificator(); + return m_pName->value().getIdentificator(); } const RDOParserSrcInfo& LocalVariable::getSrcInfo() const { - return *m_pName; + return *m_pName; } const LPExpression& LocalVariable::getExpression() const { - return m_pExpression; + return m_pExpression; } const LPTypeInfo& LocalVariable::getTypeInfo() const { - return m_pExpression->typeInfo(); + return m_pExpression->typeInfo(); } rdo::runtime::RDOValue LocalVariable::getDefaultValue() const { - return m_pExpression->typeInfo()->itype()->get_default(); + return m_pExpression->typeInfo()->itype()->get_default(); } namespace @@ -64,81 +64,81 @@ namespace LPExpression contextGetLocalVariable(const LPLocalVariable& pLocalVariable, const RDOParserSrcInfo& srcInfo) { - return rdo::Factory::create( - pLocalVariable->getExpression()->typeInfo(), - rdo::Factory::create(pLocalVariable->getName()), - srcInfo - ); + return rdo::Factory::create( + pLocalVariable->getExpression()->typeInfo(), + rdo::Factory::create(pLocalVariable->getName()), + srcInfo + ); } LPExpression contextSetLocalVariable(const LPLocalVariable& pLocalVariable, const rdo::runtime::LPRDOCalc& rightValue, const RDOParserSrcInfo& srcInfo) { - return rdo::Factory::create( - pLocalVariable->getTypeInfo(), - rdo::Factory::create(pLocalVariable->getName(), rightValue), - srcInfo - ); + return rdo::Factory::create( + pLocalVariable->getTypeInfo(), + rdo::Factory::create(pLocalVariable->getName(), rightValue), + srcInfo + ); } } Context::LPFindResult LocalVariable::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const { - if (method == Context::METHOD_GET) - { - LPLocalVariable pThis(const_cast(this)); - return rdo::Factory::create(CreateExpression(boost::bind(&contextGetLocalVariable, pThis, srcInfo))); - } - - if (method == Context::METHOD_SET) - { - LPLocalVariable pThis(const_cast(this)); - - using namespace rdo::runtime; - - const LPRDOCalc localVariableValue = rdo::Factory::create(CreateExpression - (boost::bind(&contextGetLocalVariable, pThis, srcInfo)) - )->getCreateExpression()()->calc(); - - const LPRDOCalc rightValue = params.exists(Expression::CONTEXT_PARAM_SET_EXPRESSION) - ? params.get(Expression::CONTEXT_PARAM_SET_EXPRESSION)->calc() - : params.get(RDOFUNArithm::CONTEXT_PARAM_SET_ARITHM)->createCalc(getTypeInfo()); - - LPRDOCalc operationResult; - - switch (params.get(Expression::CONTEXT_PARAM_SET_OPERATION_TYPE)) - { - case SetOperationType::NOCHANGE: - RDOParser::s_parser()->error().error(srcInfo, "Недопустимый тип операции: NOCHANGE"); - break; - case SetOperationType::SET : - operationResult = rightValue; - break; - case SetOperationType::ADDITION : - operationResult = rdo::Factory::create(localVariableValue, rightValue); - break; - case SetOperationType::SUBTRACTION: - operationResult = rdo::Factory::create(localVariableValue, rightValue); - break; - case SetOperationType::MULTIPLY : - operationResult = rdo::Factory::create(localVariableValue, rightValue); - break; - case SetOperationType::DIVIDE : - operationResult = rdo::Factory::create(localVariableValue, rightValue); - break; - case SetOperationType::INCREMENT : - operationResult = rdo::Factory::create(localVariableValue, rdo::Factory::create(1)); - break; - case SetOperationType::DECRIMENT : - operationResult = rdo::Factory::create(localVariableValue, rdo::Factory::create(1)); - break; - } - - ASSERT(operationResult); - return rdo::Factory::create(CreateExpression(boost::bind(&contextSetLocalVariable, pThis, operationResult, srcInfo))); - } - - return rdo::Factory::create(); + if (method == Context::METHOD_GET) + { + LPLocalVariable pThis(const_cast(this)); + return rdo::Factory::create(CreateExpression(boost::bind(&contextGetLocalVariable, pThis, srcInfo))); + } + + if (method == Context::METHOD_SET) + { + LPLocalVariable pThis(const_cast(this)); + + using namespace rdo::runtime; + + const LPRDOCalc localVariableValue = rdo::Factory::create(CreateExpression + (boost::bind(&contextGetLocalVariable, pThis, srcInfo)) + )->getCreateExpression()()->calc(); + + const LPRDOCalc rightValue = params.exists(Expression::CONTEXT_PARAM_SET_EXPRESSION) + ? params.get(Expression::CONTEXT_PARAM_SET_EXPRESSION)->calc() + : params.get(RDOFUNArithm::CONTEXT_PARAM_SET_ARITHM)->createCalc(getTypeInfo()); + + LPRDOCalc operationResult; + + switch (params.get(Expression::CONTEXT_PARAM_SET_OPERATION_TYPE)) + { + case SetOperation::Type::NOCHANGE: + RDOParser::s_parser()->error().error(srcInfo, "Недопустимый тип операции: NOCHANGE"); + break; + case SetOperation::Type::SET : + operationResult = rightValue; + break; + case SetOperation::Type::ADDITION : + operationResult = rdo::Factory::create(localVariableValue, rightValue); + break; + case SetOperation::Type::SUBTRACTION: + operationResult = rdo::Factory::create(localVariableValue, rightValue); + break; + case SetOperation::Type::MULTIPLY : + operationResult = rdo::Factory::create(localVariableValue, rightValue); + break; + case SetOperation::Type::DIVIDE : + operationResult = rdo::Factory::create(localVariableValue, rightValue); + break; + case SetOperation::Type::INCREMENT : + operationResult = rdo::Factory::create(localVariableValue, rdo::Factory::create(1)); + break; + case SetOperation::Type::DECRIMENT : + operationResult = rdo::Factory::create(localVariableValue, rdo::Factory::create(1)); + break; + } + + ASSERT(operationResult); + return rdo::Factory::create(CreateExpression(boost::bind(&contextSetLocalVariable, pThis, operationResult, srcInfo))); + } + + return rdo::Factory::create(); } // -------------------------------------------------------------------------------- @@ -152,24 +152,24 @@ LocalVariableList::~LocalVariableList() void LocalVariableList::append(const LPLocalVariable& pVariable) { - ASSERT(pVariable); + ASSERT(pVariable); - LPLocalVariable pExistItem = findLocalVariable(pVariable->getName()); + LPLocalVariable pExistItem = findLocalVariable(pVariable->getName()); - if (pExistItem) - { - parser::g_error().push_only(pVariable->getSrcInfo(), rdo::format("Переменная %s уже объявлена", pVariable->getName().c_str())); - parser::g_error().push_only(pExistItem->getSrcInfo(), "См. первое описание"); - parser::g_error().push_done(); - } + if (pExistItem) + { + parser::g_error().push_only(pVariable->getSrcInfo(), rdo::format("Переменная %s уже объявлена", pVariable->getName().c_str())); + parser::g_error().push_only(pExistItem->getSrcInfo(), "См. первое описание"); + parser::g_error().push_done(); + } - m_variableList.insert(VariableList::value_type(pVariable->getName(), pVariable)); + m_variableList.insert(VariableList::value_type(pVariable->getName(), pVariable)); } LPLocalVariable LocalVariableList::findLocalVariable(const std::string& name) const { - VariableList::const_iterator it = m_variableList.find(name); - return it != m_variableList.end() ? it->second : LPLocalVariable(NULL); + VariableList::const_iterator it = m_variableList.find(name); + return it != m_variableList.end() ? it->second : LPLocalVariable(NULL); } // -------------------------------------------------------------------------------- @@ -180,31 +180,31 @@ LocalVariableListStack::LocalVariableListStack() void LocalVariableListStack::push(const LPLocalVariableList& pVariableList) { - m_pVariableListStack.push_back(pVariableList); + m_pVariableListStack.push_back(pVariableList); } void LocalVariableListStack::pop() { - ASSERT(!m_pVariableListStack.empty()); - m_pVariableListStack.pop_back(); + ASSERT(!m_pVariableListStack.empty()); + m_pVariableListStack.pop_back(); } LPLocalVariableList LocalVariableListStack::top() const { - ASSERT(!m_pVariableListStack.empty()); - return m_pVariableListStack.back(); + ASSERT(!m_pVariableListStack.empty()); + return m_pVariableListStack.back(); } LPLocalVariable LocalVariableListStack::findLocalVariable(const std::string& name) const { - for (const auto& stack: m_pVariableListStack) - { - if (stack->findLocalVariable(name)) - { - return stack->findLocalVariable(name); - } - } - return NULL; + for (const auto& stack: m_pVariableListStack) + { + if (stack->findLocalVariable(name)) + { + return stack->findLocalVariable(name); + } + } + return NULL; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/src/function/local_variable/local_variable.h b/simulator/compiler/parser/src/function/local_variable/local_variable.h index ea01059b3..6d8d73508 100644 --- a/simulator/compiler/parser/src/function/local_variable/local_variable.h +++ b/simulator/compiler/parser/src/function/local_variable/local_variable.h @@ -1,5 +1,4 @@ -#ifndef _SIMULATOR_COMPILER_PARSER_FUNCTION_LOCAL_VARIABLE_H_ -#define _SIMULATOR_COMPILER_PARSER_FUNCTION_LOCAL_VARIABLE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -20,24 +19,24 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------------------------------------------------------------------- PREDECLARE_POINTER(LocalVariable); class LocalVariable - : public Context - , public IContextFind + : public Context + , public IContextFind { DECLARE_FACTORY(LocalVariable); public: - const std::string& getName() const; - const RDOParserSrcInfo& getSrcInfo() const; - const LPExpression& getExpression() const; - const LPTypeInfo& getTypeInfo() const; - rdo::runtime::RDOValue getDefaultValue() const; + const std::string& getName() const; + const RDOParserSrcInfo& getSrcInfo() const; + const LPExpression& getExpression() const; + const LPTypeInfo& getTypeInfo() const; + rdo::runtime::RDOValue getDefaultValue() const; private: - LocalVariable(const LPRDOValue& pName, const LPExpression& pExpression); - virtual ~LocalVariable(); - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + LocalVariable(const LPRDOValue& pName, const LPExpression& pExpression); + virtual ~LocalVariable(); + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; - LPRDOValue m_pName; - LPExpression m_pExpression; + LPRDOValue m_pName; + LPExpression m_pExpression; }; // -------------------------------------------------------------------------------- @@ -48,16 +47,16 @@ class LocalVariableList: public rdo::counter_reference { DECLARE_FACTORY(LocalVariableList); public: - typedef std::map VariableList; + typedef std::map VariableList; - void append(const LPLocalVariable& pVariable); - LPLocalVariable findLocalVariable(const std::string& name) const; + void append(const LPLocalVariable& pVariable); + LPLocalVariable findLocalVariable(const std::string& name) const; private: - LocalVariableList(); - virtual ~LocalVariableList(); + LocalVariableList(); + virtual ~LocalVariableList(); - VariableList m_variableList; + VariableList m_variableList; }; // -------------------------------------------------------------------------------- @@ -68,20 +67,18 @@ class LocalVariableListStack: public rdo::counter_reference { DECLARE_FACTORY(LocalVariableListStack); public: - typedef std::list VariableListStack; + typedef std::list VariableListStack; - void push(const LPLocalVariableList& pVariableList); - void pop (); - LPLocalVariableList top() const; + void push(const LPLocalVariableList& pVariableList); + void pop (); + LPLocalVariableList top() const; - LPLocalVariable findLocalVariable(const std::string& name) const; + LPLocalVariable findLocalVariable(const std::string& name) const; private: - LocalVariableListStack(); + LocalVariableListStack(); - VariableListStack m_pVariableListStack; + VariableListStack m_pVariableListStack; }; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _SIMULATOR_COMPILER_PARSER_FUNCTION_LOCAL_VARIABLE_H_ diff --git a/simulator/compiler/parser/src/function/local_variable/local_variable_context.cpp b/simulator/compiler/parser/src/function/local_variable/local_variable_context.cpp index 34eb9995b..d6114d535 100644 --- a/simulator/compiler/parser/src/function/local_variable/local_variable_context.cpp +++ b/simulator/compiler/parser/src/function/local_variable/local_variable_context.cpp @@ -8,10 +8,10 @@ OPEN_RDO_PARSER_NAMESPACE ContextLocalVariable::ContextLocalVariable(const OnPushLocalVariable& onPushLocalVariable) - : m_onPushLocalVariable(onPushLocalVariable) + : m_onPushLocalVariable(onPushLocalVariable) { - m_pCalcLocalVariableList = rdo::Factory::create(); - ASSERT(m_pCalcLocalVariableList); + m_pCalcLocalVariableList = rdo::Factory::create(); + ASSERT(m_pCalcLocalVariableList); } ContextLocalVariable::~ContextLocalVariable() @@ -19,20 +19,20 @@ ContextLocalVariable::~ContextLocalVariable() void ContextLocalVariable::pushLocalVariable(const LPLocalVariable& pLocalVariable) { - rdo::runtime::LPRDOCalcCreateLocalVariable pCalcCreateLocalVariable = - rdo::Factory::create( - pLocalVariable->getName(), - pLocalVariable->getExpression()->calc() - ); - ASSERT(pCalcCreateLocalVariable); - m_pCalcLocalVariableList->addCalcLocalVariable(pCalcCreateLocalVariable); + rdo::runtime::LPRDOCalcCreateLocalVariable pCalcCreateLocalVariable = + rdo::Factory::create( + pLocalVariable->getName(), + pLocalVariable->getExpression()->calc() + ); + ASSERT(pCalcCreateLocalVariable); + m_pCalcLocalVariableList->addCalcLocalVariable(pCalcCreateLocalVariable); - m_onPushLocalVariable(pLocalVariable); + m_onPushLocalVariable(pLocalVariable); } const rdo::runtime::LPRDOCalcLocalVariableList& ContextLocalVariable::calc() const { - return m_pCalcLocalVariableList; + return m_pCalcLocalVariableList; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/src/function/local_variable/local_variable_context.h b/simulator/compiler/parser/src/function/local_variable/local_variable_context.h index 4da676f78..1d3036a68 100644 --- a/simulator/compiler/parser/src/function/local_variable/local_variable_context.h +++ b/simulator/compiler/parser/src/function/local_variable/local_variable_context.h @@ -1,5 +1,4 @@ -#ifndef _SIMULATOR_COMPILER_PARSER_FUNCTION_LOCAL_VARIABLE_CONTEXT_H_ -#define _SIMULATOR_COMPILER_PARSER_FUNCTION_LOCAL_VARIABLE_CONTEXT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -15,20 +14,18 @@ class ContextLocalVariable: public Context { DECLARE_FACTORY(ContextLocalVariable) public: - void pushLocalVariable(const LPLocalVariable& pLocalVariable); - const rdo::runtime::LPRDOCalcLocalVariableList& calc() const; + void pushLocalVariable(const LPLocalVariable& pLocalVariable); + const rdo::runtime::LPRDOCalcLocalVariableList& calc() const; private: - typedef boost::function OnPushLocalVariable; + typedef boost::function OnPushLocalVariable; - ContextLocalVariable(const OnPushLocalVariable& onPushLocalVariable); - virtual ~ContextLocalVariable(); + ContextLocalVariable(const OnPushLocalVariable& onPushLocalVariable); + virtual ~ContextLocalVariable(); - OnPushLocalVariable m_onPushLocalVariable; - rdo::runtime::LPRDOCalcLocalVariableList m_pCalcLocalVariableList; + OnPushLocalVariable m_onPushLocalVariable; + rdo::runtime::LPRDOCalcLocalVariableList m_pCalcLocalVariableList; }; DECLARE_POINTER(ContextLocalVariable); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _SIMULATOR_COMPILER_PARSER_FUNCTION_LOCAL_VARIABLE_CONTEXT_H_ diff --git a/simulator/compiler/parser/test/type/main.cpp b/simulator/compiler/parser/test/type/main.cpp index 8fb9a9901..48b48a913 100644 --- a/simulator/compiler/parser/test/type/main.cpp +++ b/simulator/compiler/parser/test/type/main.cpp @@ -14,22 +14,22 @@ BOOST_AUTO_TEST_SUITE(RDOParserType_Test) BOOST_AUTO_TEST_CASE(RDOParserType_Test_int) { - rdo::compiler::parser::LPIType pType = rdo::Factory::create(); - BOOST_CHECK(pType); + rdo::compiler::parser::LPIType pType = rdo::Factory::create(); + BOOST_CHECK(pType); } BOOST_AUTO_TEST_CASE(RDOParserType_RTP_RDOValue) { - using namespace rdo::compiler::parser; - const LPRDOParser parser = rdo::Factory::create(); - BOOST_CHECK(parser); - parser->init(); - const LPRDORTPResType rtp = rdo::Factory::create(parser, RDOParserSrcInfo(), true); - BOOST_CHECK(rtp); - const LPRDORSSResource resource = rdo::Factory::create(parser, RDOParserSrcInfo(), rtp); - BOOST_CHECK(resource); - const rdo::runtime::RDOValue value(rtp, resource); - BOOST_CHECK(value.getPointerByType() == resource); + using namespace rdo::compiler::parser; + const LPRDOParser parser = rdo::Factory::create(); + BOOST_CHECK(parser); + parser->init(); + const LPRDORTPResType rtp = rdo::Factory::create(parser, RDOParserSrcInfo(), true); + BOOST_CHECK(rtp); + const LPRDORSSResource resource = rdo::Factory::create(parser, RDOParserSrcInfo(), rtp); + BOOST_CHECK(resource); + const rdo::runtime::RDOValue value(rtp, resource); + BOOST_CHECK(value.getPointerByType() == resource); } BOOST_AUTO_TEST_SUITE_END() diff --git a/simulator/compiler/parser/type/array.cpp b/simulator/compiler/parser/type/array.cpp index d255ff7a3..1c51ee5e4 100644 --- a/simulator/compiler/parser/type/array.cpp +++ b/simulator/compiler/parser/type/array.cpp @@ -14,12 +14,12 @@ OPEN_RDO_PARSER_NAMESPACE //---------- RDOArrayType //---------------------------------------------------------------------------- RDOArrayType::RDOArrayType(const LPTypeInfo& pItemType, const RDOParserSrcInfo& src_info) - : rdo::runtime::RDOArrayType(pItemType->type()) - , RDOParserSrcInfo(src_info) - , m_pItemType(pItemType) // TODO кажется лишним + : rdo::runtime::RDOArrayType(pItemType->type()) + , RDOParserSrcInfo(src_info) + , m_pItemType(pItemType) // TODO кажется лишним { - ASSERT(pItemType); - setSrcText(name()); + ASSERT(pItemType); + setSrcText(name()); } RDOArrayType::~RDOArrayType() @@ -27,96 +27,96 @@ RDOArrayType::~RDOArrayType() std::string RDOArrayType::name() const { - return rdo::format("array<%s>", m_pItemType->itype()->name().c_str()); + return rdo::format("array<%s>", m_pItemType->itype()->name().c_str()); } LPIType RDOArrayType::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); + ASSERT(pFrom); - LPRDOArrayType pFromArrayType = pFrom.object_dynamic_cast(); - if (pFromArrayType) - { - LPRDOArrayType pThisArrayType(const_cast(this)); + LPRDOArrayType pFromArrayType = pFrom.object_dynamic_cast(); + if (pFromArrayType) + { + LPRDOArrayType pThisArrayType(const_cast(this)); - if (pThisArrayType->getItemType()->itype()->type_cast(pFromArrayType->getItemType()->itype(), pFromArrayType->src_info(), pThisArrayType->src_info(), pFromArrayType->src_info())) - { - //! Это один и тот же тип - return pThisArrayType; - } + if (pThisArrayType->getItemType()->itype()->type_cast(pFromArrayType->getItemType()->itype(), pFromArrayType->src_info(), pThisArrayType->src_info(), pFromArrayType->src_info())) + { + // Это один и тот же тип + return pThisArrayType; + } - parser::g_error().push_only(src_info, rdo::format("Несоответствие размерности массива")); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - } + parser::g_error().push_only(src_info, rdo::format("Несоответствие размерности массива")); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + } - parser::g_error().push_only(src_info, rdo::format("Ожидается тип массива, найдено: %s", from_src_info.src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); + parser::g_error().push_only(src_info, rdo::format("Ожидается тип массива, найдено: %s", from_src_info.src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); - return NULL; + return NULL; } LPRDOValue RDOArrayType::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); - - LPRDOArrayType pFromArrayType = pFrom->typeInfo()->itype().object_dynamic_cast(); - if (pFromArrayType) - { - LPRDOArrayType pThisArrayType(const_cast(this)); - LPRDOArrayValue pThisArrayValue = rdo::Factory::create(pThisArrayType); - ASSERT(pThisArrayValue); - - rdo::runtime::LPRDOArrayValue pFromArrayValue = pFrom->get()->createRuntimeValue(); - ASSERT(pFromArrayValue); - - for (rdo::runtime::LPRDOArrayIterator it = pFromArrayValue->begin(); !it->equal(pFromArrayValue->end()); it->next()) - { - LPRDOValue pItemValue = rdo::Factory::create(it->getValue(), src_info, pThisArrayType->getItemType()); - ASSERT(pItemValue); - pThisArrayValue->insertItem(pThisArrayType->getItemType()->itype()->value_cast(pItemValue, to_src_info, src_info)); - } - return rdo::Factory::create(pThisArrayType->typeInfo(), pThisArrayValue, pFrom->src_info()); - } - - parser::g_error().push_only(src_info, rdo::format("Ожидается массив, найдено: %s", pFrom->src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - - return NULL; + ASSERT(pFrom); + + LPRDOArrayType pFromArrayType = pFrom->typeInfo()->itype().object_dynamic_cast(); + if (pFromArrayType) + { + LPRDOArrayType pThisArrayType(const_cast(this)); + LPRDOArrayValue pThisArrayValue = rdo::Factory::create(pThisArrayType); + ASSERT(pThisArrayValue); + + rdo::runtime::LPRDOArrayValue pFromArrayValue = pFrom->get()->createRuntimeValue(); + ASSERT(pFromArrayValue); + + for (rdo::runtime::LPRDOArrayIterator it = pFromArrayValue->begin(); !it->equal(pFromArrayValue->end()); it->next()) + { + LPRDOValue pItemValue = rdo::Factory::create(it->getValue(), src_info, pThisArrayType->getItemType()); + ASSERT(pItemValue); + pThisArrayValue->insertItem(pThisArrayType->getItemType()->itype()->value_cast(pItemValue, to_src_info, src_info)); + } + return rdo::Factory::create(pThisArrayType->typeInfo(), pThisArrayValue, pFrom->src_info()); + } + + parser::g_error().push_only(src_info, rdo::format("Ожидается массив, найдено: %s", pFrom->src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + + return NULL; } -rdo::runtime::LPRDOCalc RDOArrayType::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const +rdo::runtime::LPRDOCalc RDOArrayType::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& /*pType*/) const { - return pCalc; + return pCalc; } rdo::runtime::RDOValue RDOArrayType::get_default() const { - const rdo::runtime::LPRDOArrayType pThis(const_cast(this)); - return rdo::runtime::RDOValue(pThis, rdo::Factory::create(pThis)); + const rdo::runtime::LPRDOArrayType pThis(const_cast(this)); + return rdo::runtime::RDOValue(pThis, rdo::Factory::create(pThis)); } void RDOArrayType::writeModelStructure(std::ostream& stream) const { - stream << "A "; - dynamic_cast(m_pItemType->type().get())->writeModelStructure(stream); + stream << "A "; + dynamic_cast(m_pItemType->type().get())->writeModelStructure(stream); } const LPTypeInfo& RDOArrayType::getItemType() const { - return m_pItemType; + return m_pItemType; } LPTypeInfo RDOArrayType::typeInfo() const { - LPTypeInfo pType = rdo::Factory::create( - const_cast(this), - src_info() - ); - ASSERT(pType); - return pType; + LPTypeInfo pType = rdo::Factory::create( + const_cast(this), + src_info() + ); + ASSERT(pType); + return pType; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/type/array.h b/simulator/compiler/parser/type/array.h index fc05f2dfd..3f7d7793e 100644 --- a/simulator/compiler/parser/type/array.h +++ b/simulator/compiler/parser/type/array.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_TYPE_ARRAY_H_ -#define _RDOPARSER_TYPE_ARRAY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -14,27 +13,25 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- RDOArrayType // -------------------------------------------------------------------------------- class RDOArrayType - : public rdo::runtime::RDOArrayType - , public IType - , public IModelStructure - , public RDOParserSrcInfo + : public rdo::runtime::RDOArrayType + , public IType + , public IModelStructure + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOArrayType); public: - const LPTypeInfo& getItemType() const; - LPTypeInfo typeInfo() const; + const LPTypeInfo& getItemType() const; + LPTypeInfo typeInfo() const; private: - RDOArrayType(const LPTypeInfo& pItemType, const RDOParserSrcInfo& src_info); - virtual ~RDOArrayType(); + RDOArrayType(const LPTypeInfo& pItemType, const RDOParserSrcInfo& src_info); + virtual ~RDOArrayType(); - LPTypeInfo m_pItemType; + LPTypeInfo m_pItemType; - DECLARE_IType; - DECLARE_IModelStructure; + DECLARE_IType; + DECLARE_IModelStructure; }; DECLARE_POINTER(RDOArrayType) CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_TYPE_ARRAY_H_ diff --git a/simulator/compiler/parser/type/atom.cpp b/simulator/compiler/parser/type/atom.cpp index 6b6ce281b..5d0de393d 100644 --- a/simulator/compiler/parser/type/atom.cpp +++ b/simulator/compiler/parser/type/atom.cpp @@ -18,388 +18,388 @@ OPEN_RDO_PARSER_NAMESPACE #define DECLARE_ATOM_TYPE_PARSER(Type, TypeName) \ std::string RDOType__##Type::name() const \ { \ - return TypeName; \ + return TypeName; \ } -DECLARE_ATOM_TYPE_PARSER(unknow, "unknow" ); -DECLARE_ATOM_TYPE_PARSER(void, "void" ); -DECLARE_ATOM_TYPE_PARSER(identificator, "identificator"); -DECLARE_ATOM_TYPE_PARSER(int, "integer" ); -DECLARE_ATOM_TYPE_PARSER(real, "real" ); -DECLARE_ATOM_TYPE_PARSER(bool, "bool" ); -DECLARE_ATOM_TYPE_PARSER(string, "string" ); +DECLARE_ATOM_TYPE_PARSER(UNKNOW, "unknow" ); +DECLARE_ATOM_TYPE_PARSER(EMPTY, "void" ); +DECLARE_ATOM_TYPE_PARSER(IDENTIFICATOR, "identificator"); +DECLARE_ATOM_TYPE_PARSER(INT, "integer" ); +DECLARE_ATOM_TYPE_PARSER(REAL, "real" ); +DECLARE_ATOM_TYPE_PARSER(BOOL, "bool" ); +DECLARE_ATOM_TYPE_PARSER(STRING, "string" ); // -------------------------------------------------------------------------------- -// -------------------- RDOType__unknow +// -------------------- RDOType__UNKNOW // -------------------------------------------------------------------------------- -LPIType RDOType__unknow::type_cast(const LPIType& /*pFrom*/, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& /*to_src_info*/, const RDOParserSrcInfo& src_info) const +LPIType RDOType__UNKNOW::type_cast(const LPIType& /*pFrom*/, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& /*to_src_info*/, const RDOParserSrcInfo& src_info) const { - parser::g_error().error(src_info, rdo::format("Внутренная ошибка парсера. Невозможно преобразовать тип '%s' к неизвестному типу", from_src_info.src_text().c_str())); - return NULL; + parser::g_error().error(src_info, rdo::format("Внутренняя ошибка парсера. Невозможно преобразовать тип '%s' к неизвестному типу", from_src_info.src_text().c_str())); + return NULL; } -LPRDOValue RDOType__unknow::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPRDOValue RDOType__UNKNOW::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); + ASSERT(pFrom); - parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к неизвестному типу", pFrom->src_info().src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - return LPRDOValue(NULL); + parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к неизвестному типу", pFrom->src_info().src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + return LPRDOValue(NULL); } -rdo::runtime::LPRDOCalc RDOType__unknow::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const +rdo::runtime::LPRDOCalc RDOType__UNKNOW::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& /*pType*/) const { - return pCalc; + return pCalc; } -rdo::runtime::RDOValue RDOType__unknow::get_default() const +rdo::runtime::RDOValue RDOType__UNKNOW::get_default() const { - return rdo::runtime::RDOValue(); + return rdo::runtime::RDOValue(); } -void RDOType__unknow::writeModelStructure(std::ostream& /*stream*/) const +void RDOType__UNKNOW::writeModelStructure(std::ostream& /*stream*/) const { - parser::g_error().error(RDOParserSrcInfo(), "Внутренная ошибка парсера. Невозможно записать неизвестный тип в отчет"); - NEVER_REACH_HERE; + parser::g_error().error(RDOParserSrcInfo(), "Внутренняя ошибка парсера. Невозможно записать неизвестный тип в отчет"); + NEVER_REACH_HERE; } // -------------------------------------------------------------------------------- -// -------------------- RDOType__void +// -------------------- RDOType__EMPTY // -------------------------------------------------------------------------------- -LPIType RDOType__void::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& /*to_src_info*/, const RDOParserSrcInfo& src_info) const +LPIType RDOType__EMPTY::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& /*to_src_info*/, const RDOParserSrcInfo& src_info) const { - if (pFrom.object_dynamic_cast()->typeID() == rdo::runtime::RDOType::t_void) - { - return rdo::Factory::create(); - } - parser::g_error().error(src_info, rdo::format("Невозможно преобразовать '%s' к void", from_src_info.src_text().c_str())); - return NULL; + if (pFrom.object_dynamic_cast()->typeID() == rdo::runtime::RDOType::Type::EMPTY) + { + return rdo::Factory::create(); + } + parser::g_error().error(src_info, rdo::format("Невозможно преобразовать '%s' к void", from_src_info.src_text().c_str())); + return NULL; } -LPRDOValue RDOType__void::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPRDOValue RDOType__EMPTY::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); + ASSERT(pFrom); - if (pFrom->value().type()->typeID() == rdo::runtime::RDOType::t_void) - { - return rdo::Factory::create(pFrom); - } + if (pFrom->value().type()->typeID() == rdo::runtime::RDOType::Type::EMPTY) + { + return rdo::Factory::create(pFrom); + } - parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к void-типу", pFrom->src_info().src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - return LPRDOValue(NULL); + parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к void-типу", pFrom->src_info().src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + return LPRDOValue(NULL); } -rdo::runtime::LPRDOCalc RDOType__void::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const +rdo::runtime::LPRDOCalc RDOType__EMPTY::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& /*pType*/) const { - return pCalc; + return pCalc; } -rdo::runtime::RDOValue RDOType__void::get_default() const +rdo::runtime::RDOValue RDOType__EMPTY::get_default() const { - return rdo::runtime::RDOValue(); + return rdo::runtime::RDOValue(); } -void RDOType__void::writeModelStructure(std::ostream& /*stream*/) const +void RDOType__EMPTY::writeModelStructure(std::ostream& /*stream*/) const { - parser::g_error().error(RDOParserSrcInfo(), "Внутренная ошибка парсера. Невозможно записать void-тип в отчет"); - NEVER_REACH_HERE; + parser::g_error().error(RDOParserSrcInfo(), "Внутренняя ошибка парсера. Невозможно записать void-тип в отчет"); + NEVER_REACH_HERE; } // -------------------------------------------------------------------------------- -// -------------------- RDOType__int +// -------------------- RDOType__INT // -------------------------------------------------------------------------------- -LPIType RDOType__int::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPIType RDOType__INT::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); + ASSERT(pFrom); - switch (pFrom.object_dynamic_cast()->typeID()) - { - case rdo::runtime::RDOType::t_int : - return rdo::Factory::create(); - case rdo::runtime::RDOType::t_real: - parser::g_error().warning(src_info, rdo::format("Преобразование '%s' в '%s', возможна потеря данных", pFrom->name().c_str(), name().c_str())); - return rdo::Factory::create(); - default: - if (!from_src_info.src_text().empty()) - { - parser::g_error().push_only(src_info, rdo::format("Ожидается целочисленное значение, найдено: %s", from_src_info.src_text().c_str())); - } - else - { - parser::g_error().push_only(from_src_info, rdo::format("Ожидается целочисленное значение, найдено: %s", pFrom->name().c_str())); - } - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - } - return NULL; + switch (pFrom.object_dynamic_cast()->typeID()) + { + case rdo::runtime::RDOType::Type::INT : + return rdo::Factory::create(); + case rdo::runtime::RDOType::Type::REAL: + parser::g_error().warning(src_info, rdo::format("Преобразование '%s' в '%s', возможна потеря данных", pFrom->name().c_str(), name().c_str())); + return rdo::Factory::create(); + default: + if (!from_src_info.src_text().empty()) + { + parser::g_error().push_only(src_info, rdo::format("Ожидается целочисленное значение, найдено: %s", from_src_info.src_text().c_str())); + } + else + { + parser::g_error().push_only(from_src_info, rdo::format("Ожидается целочисленное значение, найдено: %s", pFrom->name().c_str())); + } + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + } + return NULL; } -LPRDOValue RDOType__int::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPRDOValue RDOType__INT::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); + ASSERT(pFrom); - LPRDOValue pToValue; - try - { - LPTypeInfo pType = rdo::Factory::create(const_cast(this), pFrom->src_info()); - ASSERT(pType); - pToValue = rdo::Factory::create(pFrom->value().getInt(), pFrom->src_info(), pType); - ASSERT(pToValue); - } - catch (const rdo::runtime::RDOValueException&) - {} + LPRDOValue pToValue; + try + { + LPTypeInfo pType = rdo::Factory::create(const_cast(this), pFrom->src_info()); + ASSERT(pType); + pToValue = rdo::Factory::create(pFrom->value().getInt(), pFrom->src_info(), pType); + ASSERT(pToValue); + } + catch (const rdo::runtime::RDOValueException&) + {} - if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::t_unknow) - { - parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к целому типу", pFrom->src_info().src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - } - return pToValue; + if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к целому типу", pFrom->src_info().src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + } + return pToValue; } -rdo::runtime::LPRDOCalc RDOType__int::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const +rdo::runtime::LPRDOCalc RDOType__INT::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const { - if (pType.object_dynamic_cast()->typeID() == rdo::runtime::RDOType::t_real) - { - return rdo::Factory::create(pCalc->srcInfo().src_pos(), pCalc); - } - return pCalc; + if (pType.object_dynamic_cast()->typeID() == rdo::runtime::RDOType::Type::REAL) + { + return rdo::Factory::create(pCalc->srcInfo().src_pos(), pCalc); + } + return pCalc; } -rdo::runtime::RDOValue RDOType__int::get_default() const +rdo::runtime::RDOValue RDOType__INT::get_default() const { - return rdo::runtime::RDOValue(0); + return rdo::runtime::RDOValue(0); } -void RDOType__int::writeModelStructure(std::ostream& stream) const +void RDOType__INT::writeModelStructure(std::ostream& stream) const { - stream << "I" << std::endl; + stream << "I" << std::endl; } // -------------------------------------------------------------------------------- -// -------------------- RDOType__real +// -------------------- RDOType__REAL // -------------------------------------------------------------------------------- -LPIType RDOType__real::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPIType RDOType__REAL::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); + ASSERT(pFrom); - switch (pFrom.object_dynamic_cast()->typeID()) - { - case rdo::runtime::RDOType::t_int : - case rdo::runtime::RDOType::t_real: - return rdo::Factory::create(); - default: - parser::g_error().push_only(src_info, rdo::format("Ожидается вещественное значение, найдено: %s", from_src_info.src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - } - return NULL; + switch (pFrom.object_dynamic_cast()->typeID()) + { + case rdo::runtime::RDOType::Type::INT : + case rdo::runtime::RDOType::Type::REAL: + return rdo::Factory::create(); + default: + parser::g_error().push_only(src_info, rdo::format("Ожидается вещественное значение, найдено: %s", from_src_info.src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + } + return NULL; } -LPRDOValue RDOType__real::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPRDOValue RDOType__REAL::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); + ASSERT(pFrom); - LPRDOValue pToValue; - try - { - LPTypeInfo pType = rdo::Factory::create(const_cast(this), pFrom->src_info()); - ASSERT(pType); - pToValue = rdo::Factory::create(pFrom->value().getDouble(), pFrom->src_info(), pType); - ASSERT(pToValue); - } - catch (const rdo::runtime::RDOValueException&) - {} + LPRDOValue pToValue; + try + { + LPTypeInfo pType = rdo::Factory::create(const_cast(this), pFrom->src_info()); + ASSERT(pType); + pToValue = rdo::Factory::create(pFrom->value().getDouble(), pFrom->src_info(), pType); + ASSERT(pToValue); + } + catch (const rdo::runtime::RDOValueException&) + {} - if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::t_unknow) - { - parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к вещественному типу", pFrom->src_info().src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - } - return pToValue; + if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к вещественному типу", pFrom->src_info().src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + } + return pToValue; } -rdo::runtime::LPRDOCalc RDOType__real::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const +rdo::runtime::LPRDOCalc RDOType__REAL::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& /*pType*/) const { - return pCalc; + return pCalc; } -rdo::runtime::RDOValue RDOType__real::get_default() const +rdo::runtime::RDOValue RDOType__REAL::get_default() const { - return rdo::runtime::RDOValue(0.0); + return rdo::runtime::RDOValue(0.0); } -void RDOType__real::writeModelStructure(std::ostream& stream) const +void RDOType__REAL::writeModelStructure(std::ostream& stream) const { - stream << "R" << std::endl; + stream << "R" << std::endl; } // -------------------------------------------------------------------------------- -// -------------------- RDOType__string +// -------------------- RDOType__STRING // -------------------------------------------------------------------------------- -LPIType RDOType__string::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPIType RDOType__STRING::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); + ASSERT(pFrom); - switch (pFrom.object_dynamic_cast()->typeID()) - { - case rdo::runtime::RDOType::t_string: - return rdo::Factory::create(); - default: - parser::g_error().push_only(src_info, rdo::format("Ожидается строковое значение, найдено: %s", from_src_info.src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - } - return NULL; + switch (pFrom.object_dynamic_cast()->typeID()) + { + case rdo::runtime::RDOType::Type::STRING: + return rdo::Factory::create(); + default: + parser::g_error().push_only(src_info, rdo::format("Ожидается строковое значение, найдено: %s", from_src_info.src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + } + return NULL; } -LPRDOValue RDOType__string::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPRDOValue RDOType__STRING::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); + ASSERT(pFrom); - LPRDOValue pToValue; - try - { - LPTypeInfo pType = rdo::Factory::create(const_cast(this), pFrom->src_info()); - ASSERT(pType); - pToValue = rdo::Factory::create(pFrom->value().getString(), pFrom->src_info(), pType); - ASSERT(pToValue); - } - catch (const rdo::runtime::RDOValueException&) - {} + LPRDOValue pToValue; + try + { + LPTypeInfo pType = rdo::Factory::create(const_cast(this), pFrom->src_info()); + ASSERT(pType); + pToValue = rdo::Factory::create(pFrom->value().getString(), pFrom->src_info(), pType); + ASSERT(pToValue); + } + catch (const rdo::runtime::RDOValueException&) + {} - if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::t_unknow) - { - parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к строковому типу", pFrom->src_info().src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - } - return pToValue; + if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к строковому типу", pFrom->src_info().src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + } + return pToValue; } -rdo::runtime::LPRDOCalc RDOType__string::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const +rdo::runtime::LPRDOCalc RDOType__STRING::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& /*pType*/) const { - return pCalc; + return pCalc; } -rdo::runtime::RDOValue RDOType__string::get_default() const +rdo::runtime::RDOValue RDOType__STRING::get_default() const { - return rdo::runtime::RDOValue(""); + return rdo::runtime::RDOValue(""); } -void RDOType__string::writeModelStructure(std::ostream& stream) const +void RDOType__STRING::writeModelStructure(std::ostream& stream) const { - stream << "S" << std::endl; + stream << "S" << std::endl; } // -------------------------------------------------------------------------------- -// -------------------- RDOType__identificator +// -------------------- RDOType__IDENTIFICATOR // -------------------------------------------------------------------------------- -LPIType RDOType__identificator::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& /*to_src_info*/, const RDOParserSrcInfo& src_info) const +LPIType RDOType__IDENTIFICATOR::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& /*to_src_info*/, const RDOParserSrcInfo& src_info) const { - switch (pFrom.object_dynamic_cast()->typeID()) - { - case rdo::runtime::RDOType::t_identificator: - return rdo::Factory::create(); - default: - parser::g_error().error(src_info, rdo::format("Внутренная ошибка парсера. Невозможно преобразовать тип '%s' к идентификатору", from_src_info.src_text().c_str())); - } - return NULL; + switch (pFrom.object_dynamic_cast()->typeID()) + { + case rdo::runtime::RDOType::Type::IDENTIFICATOR: + return rdo::Factory::create(); + default: + parser::g_error().error(src_info, rdo::format("Внутренняя ошибка парсера. Невозможно преобразовать тип '%s' к идентификатору", from_src_info.src_text().c_str())); + } + return NULL; } -LPRDOValue RDOType__identificator::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPRDOValue RDOType__IDENTIFICATOR::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); + ASSERT(pFrom); - switch (pFrom->typeID()) - { - case rdo::runtime::RDOType::t_identificator: - return rdo::Factory::create(pFrom); - default: - parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к типу идентификатор", pFrom->src_info().src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - } - return LPRDOValue(NULL); + switch (pFrom->typeID()) + { + case rdo::runtime::RDOType::Type::IDENTIFICATOR: + return rdo::Factory::create(pFrom); + default: + parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к типу идентификатор", pFrom->src_info().src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + } + return LPRDOValue(NULL); } -rdo::runtime::LPRDOCalc RDOType__identificator::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const +rdo::runtime::LPRDOCalc RDOType__IDENTIFICATOR::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& /*pType*/) const { - return pCalc; + return pCalc; } -rdo::runtime::RDOValue RDOType__identificator::get_default() const +rdo::runtime::RDOValue RDOType__IDENTIFICATOR::get_default() const { - return rdo::runtime::RDOValue("", rdo::runtime::g_identificator); + return rdo::runtime::RDOValue("", rdo::runtime::g_IDENTIFICATOR); } -void RDOType__identificator::writeModelStructure(std::ostream& /*stream*/) const +void RDOType__IDENTIFICATOR::writeModelStructure(std::ostream& /*stream*/) const { - parser::g_error().error(RDOParserSrcInfo(), "Внутренная ошибка парсера. Невозможно записать тип идектификатор в отчет"); - NEVER_REACH_HERE; + parser::g_error().error(RDOParserSrcInfo(), "Внутренняя ошибка парсера. Невозможно записать тип идектификатор в отчет"); + NEVER_REACH_HERE; } // -------------------------------------------------------------------------------- -// -------------------- RDOType__bool +// -------------------- RDOType__BOOL // -------------------------------------------------------------------------------- -LPIType RDOType__bool::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPIType RDOType__BOOL::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); + ASSERT(pFrom); - switch (pFrom.object_dynamic_cast()->typeID()) - { - case rdo::runtime::RDOType::t_bool: - return rdo::Factory::create(); - default: - parser::g_error().push_only(src_info, rdo::format("Ожидается булевское значение, найдено: %s", from_src_info.src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - } - return NULL; + switch (pFrom.object_dynamic_cast()->typeID()) + { + case rdo::runtime::RDOType::Type::BOOL: + return rdo::Factory::create(); + default: + parser::g_error().push_only(src_info, rdo::format("Ожидается булевское значение, найдено: %s", from_src_info.src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + } + return NULL; } -LPRDOValue RDOType__bool::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const +LPRDOValue RDOType__BOOL::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); + ASSERT(pFrom); - LPRDOValue pToValue; - try - { - LPTypeInfo pType = rdo::Factory::create(const_cast(this), pFrom->src_info()); - ASSERT(pType); - pToValue = rdo::Factory::create(pFrom->value().getBool(), pFrom->src_info(), pType); - ASSERT(pToValue); - } - catch (const rdo::runtime::RDOValueException&) - {} + LPRDOValue pToValue; + try + { + LPTypeInfo pType = rdo::Factory::create(const_cast(this), pFrom->src_info()); + ASSERT(pType); + pToValue = rdo::Factory::create(pFrom->value().getBool(), pFrom->src_info(), pType); + ASSERT(pToValue); + } + catch (const rdo::runtime::RDOValueException&) + {} - if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::t_unknow) - { - parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к булевскому типу", pFrom->src_info().src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - } - return pToValue; + if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + parser::g_error().push_only(src_info, rdo::format("Невозможно преобразовать значение '%s' к булевскому типу", pFrom->src_info().src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + } + return pToValue; } -rdo::runtime::LPRDOCalc RDOType__bool::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const +rdo::runtime::LPRDOCalc RDOType__BOOL::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& /*pType*/) const { - return pCalc; + return pCalc; } -rdo::runtime::RDOValue RDOType__bool::get_default() const +rdo::runtime::RDOValue RDOType__BOOL::get_default() const { - return rdo::runtime::RDOValue(false); + return rdo::runtime::RDOValue(false); } -void RDOType__bool::writeModelStructure(std::ostream& stream) const +void RDOType__BOOL::writeModelStructure(std::ostream& stream) const { - stream << "B" << std::endl; + stream << "B" << std::endl; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/type/atom.h b/simulator/compiler/parser/type/atom.h index 6ba13733e..c6d1365d1 100644 --- a/simulator/compiler/parser/type/atom.h +++ b/simulator/compiler/parser/type/atom.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_TYPE_ATOM_H_ -#define _RDOPARSER_TYPE_ATOM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -15,24 +14,22 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------------------------------------------------------------------- #define DEFINE_ATOM_TYPE_PARSER(Type) \ class RDOType__##Type \ - : public rdo::runtime::RDOType__##Type \ - , public IType \ - , public IModelStructure \ + : public rdo::runtime::RDOType__##Type \ + , public IType \ + , public IModelStructure \ { \ public: \ - DECLARE_IType; \ - DECLARE_IModelStructure; \ + DECLARE_IType; \ + DECLARE_IModelStructure; \ }; \ DECLARE_POINTER(RDOType__##Type); -DEFINE_ATOM_TYPE_PARSER(unknow ); -DEFINE_ATOM_TYPE_PARSER(identificator); -DEFINE_ATOM_TYPE_PARSER(int ); -DEFINE_ATOM_TYPE_PARSER(real ); -DEFINE_ATOM_TYPE_PARSER(bool ); -DEFINE_ATOM_TYPE_PARSER(string ); -DEFINE_ATOM_TYPE_PARSER(void ); +DEFINE_ATOM_TYPE_PARSER(UNKNOW); +DEFINE_ATOM_TYPE_PARSER(IDENTIFICATOR); +DEFINE_ATOM_TYPE_PARSER(INT); +DEFINE_ATOM_TYPE_PARSER(REAL); +DEFINE_ATOM_TYPE_PARSER(BOOL); +DEFINE_ATOM_TYPE_PARSER(STRING); +DEFINE_ATOM_TYPE_PARSER(EMPTY); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_TYPE_ATOM_H_ diff --git a/simulator/compiler/parser/type/enum.cpp b/simulator/compiler/parser/type/enum.cpp index 4d856f92f..ca8bed112 100644 --- a/simulator/compiler/parser/type/enum.cpp +++ b/simulator/compiler/parser/type/enum.cpp @@ -21,187 +21,187 @@ RDOEnumType::~RDOEnumType() std::string RDOEnumType::name() const { - std::string str = "("; - rdo::runtime::RDOEnumType::const_iterator it = begin(); - while (it != end()) - { - str += *it; - ++it; - if (it != end()) - { - str += ", "; - } - } - str += ")"; - return str; + std::string str = "("; + rdo::runtime::RDOEnumType::const_iterator it = begin(); + while (it != end()) + { + str += *it; + ++it; + if (it != end()) + { + str += ", "; + } + } + str += ")"; + return str; } LPIType RDOEnumType::type_cast(const LPIType& from, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - switch (from.object_dynamic_cast()->typeID()) - { - case rdo::runtime::RDOType__int::t_enum: - { - LPRDOEnumType pEnum(const_cast(this)); - //! Это один и тот же тип - if (pEnum == from) - return pEnum; - - //! Типы разные, сгенерим ошибку - if (pEnum.compare(from.object_static_cast())) - { - parser::g_error().push_only(src_info, "Используются различные перечислимые типы с одинаковыми значениями"); - parser::g_error().push_only(to_src_info, to_src_info.src_text()); - parser::g_error().push_only(src_info, "и"); - parser::g_error().push_only(from_src_info, from_src_info.src_text()); - parser::g_error().push_only(src_info, "Возможно, удобнее использовать первый из них как перечислимый, а второй как such_as на него, тогда параметры можно будет сравнивать и присваивать"); - } - else - { - parser::g_error().push_only(src_info, "Несоответствие перечислимых типов"); - parser::g_error().push_only(to_src_info, to_src_info.src_text()); - parser::g_error().push_only(src_info, "и"); - parser::g_error().push_only(from_src_info, from_src_info.src_text()); - } - parser::g_error().push_done(); - break; - } - case rdo::runtime::RDOType::t_string : - case rdo::runtime::RDOType::t_identificator: - { - if (exist(from_src_info.src_text())) - { - LPRDOEnumType pEnum(const_cast(this)); - return pEnum; - } - parser::g_error().error(src_info, rdo::format("Значение '%s' не является элементом перечислимого типа %s", from_src_info.src_text().c_str(), to_src_info.src_text().c_str())); - break; - } - default: - parser::g_error().push_only(src_info, rdo::format("Ожидается значение перечислимого типа, найдено: %s", from_src_info.src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - break; - } - return NULL; + switch (from.object_dynamic_cast()->typeID()) + { + case rdo::runtime::RDOType::Type::ENUM: + { + LPRDOEnumType pEnum(const_cast(this)); + // Это один и тот же тип + if (pEnum == from) + return pEnum; + + // Типы разные, сгенерим ошибку + if (pEnum.compare(from.object_static_cast())) + { + parser::g_error().push_only(src_info, "Используются различные перечислимые типы с одинаковыми значениями"); + parser::g_error().push_only(to_src_info, to_src_info.src_text()); + parser::g_error().push_only(src_info, "и"); + parser::g_error().push_only(from_src_info, from_src_info.src_text()); + parser::g_error().push_only(src_info, "Возможно, удобнее использовать первый из них как перечислимый, а второй как such_as на него, тогда параметры можно будет сравнивать и присваивать"); + } + else + { + parser::g_error().push_only(src_info, "Несоответствие перечислимых типов"); + parser::g_error().push_only(to_src_info, to_src_info.src_text()); + parser::g_error().push_only(src_info, "и"); + parser::g_error().push_only(from_src_info, from_src_info.src_text()); + } + parser::g_error().push_done(); + break; + } + case rdo::runtime::RDOType::Type::STRING : + case rdo::runtime::RDOType::Type::IDENTIFICATOR: + { + if (exist(from_src_info.src_text())) + { + LPRDOEnumType pEnum(const_cast(this)); + return pEnum; + } + parser::g_error().error(src_info, rdo::format("Значение '%s' не является элементом перечислимого типа %s", from_src_info.src_text().c_str(), to_src_info.src_text().c_str())); + break; + } + default: + parser::g_error().push_only(src_info, rdo::format("Ожидается значение перечислимого типа, найдено: %s", from_src_info.src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + break; + } + return NULL; } LPRDOValue RDOEnumType::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - ASSERT(pFrom); - - LPRDOValue pToValue; - LPRDOEnumType pEnum(const_cast(this)); - try - { - switch (pFrom->typeID()) - { - case rdo::runtime::RDOType::t_identificator: - if (findEnum(pFrom->value().getIdentificator()) != rdo::runtime::RDOEnumType::END) - { - LPTypeInfo pType = rdo::Factory::create(pEnum, to_src_info); - ASSERT(pType); - pToValue = rdo::Factory::create(rdo::runtime::RDOValue(pEnum, pFrom->value().getIdentificator()), pFrom->src_info(), pType); - ASSERT(pToValue); - } - else - { - pToValue = RDOValue::getUnknow(pFrom->src_info()); - ASSERT(pToValue); - } - break; - - case rdo::runtime::RDOType::t_string: - if (findEnum(pFrom->value().getAsString()) != rdo::runtime::RDOEnumType::END) - { - LPTypeInfo pType = rdo::Factory::create(pEnum, to_src_info); - ASSERT(pType); - pToValue = rdo::Factory::create(rdo::runtime::RDOValue(pEnum, pFrom->value().getAsString()), pFrom->src_info(), pType); - ASSERT(pToValue); - } - else - { - pToValue = RDOValue::getUnknow(pFrom->src_info()); - ASSERT(pToValue); - } - break; - - case rdo::runtime::RDOType::t_enum: - if (pEnum == pFrom->typeInfo()->itype()) - pToValue = rdo::Factory::create(pFrom); - break; - - default: - break; - } - } - catch (const rdo::runtime::RDOValueException&) - {} - - if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::t_unknow) - { - parser::g_error().push_only(src_info, rdo::format("Неверное значение параметра перечислимого типа: %s", pFrom->src_info().src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("Возможные значения: %s", name().c_str())); - parser::g_error().push_done(); - } - return pToValue; + ASSERT(pFrom); + + LPRDOValue pToValue; + LPRDOEnumType pEnum(const_cast(this)); + try + { + switch (pFrom->typeID()) + { + case rdo::runtime::RDOType::Type::IDENTIFICATOR: + if (findEnum(pFrom->value().getIdentificator()) != rdo::runtime::RDOEnumType::END) + { + LPTypeInfo pType = rdo::Factory::create(pEnum, to_src_info); + ASSERT(pType); + pToValue = rdo::Factory::create(rdo::runtime::RDOValue(pEnum, pFrom->value().getIdentificator()), pFrom->src_info(), pType); + ASSERT(pToValue); + } + else + { + pToValue = RDOValue::getUnknow(pFrom->src_info()); + ASSERT(pToValue); + } + break; + + case rdo::runtime::RDOType::Type::STRING: + if (findEnum(pFrom->value().getAsString()) != rdo::runtime::RDOEnumType::END) + { + LPTypeInfo pType = rdo::Factory::create(pEnum, to_src_info); + ASSERT(pType); + pToValue = rdo::Factory::create(rdo::runtime::RDOValue(pEnum, pFrom->value().getAsString()), pFrom->src_info(), pType); + ASSERT(pToValue); + } + else + { + pToValue = RDOValue::getUnknow(pFrom->src_info()); + ASSERT(pToValue); + } + break; + + case rdo::runtime::RDOType::Type::ENUM: + if (pEnum == pFrom->typeInfo()->itype()) + pToValue = rdo::Factory::create(pFrom); + break; + + default: + break; + } + } + catch (const rdo::runtime::RDOValueException&) + {} + + if (!pToValue || pToValue->typeID() == rdo::runtime::RDOType::Type::UNKNOW) + { + parser::g_error().push_only(src_info, rdo::format("Неверное значение параметра перечислимого типа: %s", pFrom->src_info().src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("Возможные значения: %s", name().c_str())); + parser::g_error().push_done(); + } + return pToValue; } -rdo::runtime::LPRDOCalc RDOEnumType::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const +rdo::runtime::LPRDOCalc RDOEnumType::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& /*pType*/) const { - return pCalc; + return pCalc; } rdo::runtime::RDOValue RDOEnumType::get_default() const { - return rdo::runtime::RDOValue(rdo::runtime::LPRDOEnumType(const_cast(this)), 0); + return rdo::runtime::RDOValue(rdo::runtime::LPRDOEnumType(const_cast(this)), 0); } void RDOEnumType::writeModelStructure(std::ostream& stream) const { - stream << "E " << getValues().size() << std::endl; - for (std::size_t i = 0; i < getValues().size(); i++) - { - stream << " " << i << " " << getValues().at(i) << std::endl; - } + stream << "E " << getValues().size() << std::endl; + for (std::size_t i = 0; i < getValues().size(); i++) + { + stream << " " << i << " " << getValues().at(i) << std::endl; + } } void RDOEnumType::add(const LPRDOValue& pNext) { - ASSERT(pNext); + ASSERT(pNext); - if (findEnum(pNext->value().getAsString()) != rdo::runtime::RDOEnumType::END) - { - parser::g_error().error(pNext->src_info(), rdo::format("Значение перечислимого типа уже существует: %s", pNext->src_text().c_str())); - } - rdo::runtime::RDOEnumType::add(pNext->value().getAsString()); + if (findEnum(pNext->value().getAsString()) != rdo::runtime::RDOEnumType::END) + { + parser::g_error().error(pNext->src_info(), rdo::format("Значение перечислимого типа уже существует: %s", pNext->src_text().c_str())); + } + rdo::runtime::RDOEnumType::add(pNext->value().getAsString()); } namespace { -LPExpression contextUnknownEnum(const RDOEnumType::EnumItem& enumValue, std::size_t index, const RDOParserSrcInfo& srcInfo) +LPExpression contextUnknownEnum(const std::string& enumValue, std::size_t /*index*/, const RDOParserSrcInfo& srcInfo) { - LPTypeInfo typeInfo = rdo::Factory::delegate(srcInfo); - return rdo::Factory::create( - typeInfo, - rdo::Factory::create(rdo::runtime::RDOValue(enumValue, typeInfo->type())), - srcInfo - ); + LPTypeInfo typeInfo = rdo::Factory::delegate(srcInfo); + return rdo::Factory::create( + typeInfo, + rdo::Factory::create(rdo::runtime::RDOValue(enumValue, typeInfo->type())), + srcInfo + ); } } Context::LPFindResult RDOEnumType::onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const { - if (method == Context::METHOD_GET) - { - std::size_t index = findEnum(params.identifier()); - EnumItem enumValue = getValues()[index]; - return rdo::Factory::create(CreateExpression(boost::bind(&contextUnknownEnum, enumValue, index, srcInfo))); - } - - return rdo::Factory::create(); + if (method == Context::METHOD_GET) + { + std::size_t index = findEnum(params.identifier()); + const auto enumValue = getValues()[index]; + return rdo::Factory::create(CreateExpression(boost::bind(&contextUnknownEnum, enumValue, index, srcInfo))); + } + + return rdo::Factory::create(); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/type/enum.h b/simulator/compiler/parser/type/enum.h index 74c3fdbc3..394f64149 100644 --- a/simulator/compiler/parser/type/enum.h +++ b/simulator/compiler/parser/type/enum.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_TYPE_ENUM_H_ -#define _RDOPARSER_TYPE_ENUM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -18,35 +17,33 @@ OPEN_RDO_PARSER_NAMESPACE PREDECLARE_POINTER(RDOEnumType); class RDOEnumType - : public rdo::runtime::RDOEnumType - , public IType - , public IModelStructure - , public Context - , public IContextFind + : public rdo::runtime::RDOEnumType + , public IType + , public IModelStructure + , public Context + , public IContextFind { DECLARE_FACTORY(RDOEnumType); public: - void add(const LPRDOValue& pNext); + void add(const LPRDOValue& pNext); - bool operator== (const RDOEnumType& other) const - { - return getValues() == other.getValues(); - } - bool operator!= (const RDOEnumType& other) const - { - return !operator==(other); - } + bool operator== (const RDOEnumType& other) const + { + return getValues() == other.getValues(); + } + bool operator!= (const RDOEnumType& other) const + { + return !operator==(other); + } - DECLARE_IType; - DECLARE_IModelStructure; + DECLARE_IType; + DECLARE_IModelStructure; private: - RDOEnumType(); - virtual ~RDOEnumType(); + RDOEnumType(); + virtual ~RDOEnumType(); - virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; + virtual Context::LPFindResult onFindContext(const std::string& method, const Context::Params& params, const RDOParserSrcInfo& srcInfo) const; }; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_TYPE_ENUM_H_ diff --git a/simulator/compiler/parser/type/function_type.cpp b/simulator/compiler/parser/type/function_type.cpp index 432c04e7b..332cabe0d 100644 --- a/simulator/compiler/parser/type/function_type.cpp +++ b/simulator/compiler/parser/type/function_type.cpp @@ -13,16 +13,16 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- FunctionParamType // -------------------------------------------------------------------------------- FunctionParamType::FunctionParamType(const ParamList& paramList, const RDOParserSrcInfo& srcInfo) - : RDOType(t_unknow) - , RDOParserSrcInfo(srcInfo) - , m_paramList(paramList) + : RDOType(Type::UNKNOW) + , RDOParserSrcInfo(srcInfo) + , m_paramList(paramList) { - if (m_paramList.empty()) - { - LPTypeInfo pType = rdo::Factory::delegate(srcInfo); - ASSERT(pType); - m_paramList.push_back(pType); - } + if (m_paramList.empty()) + { + LPTypeInfo pType = rdo::Factory::delegate(srcInfo); + ASSERT(pType); + m_paramList.push_back(pType); + } } FunctionParamType::~FunctionParamType() @@ -30,90 +30,90 @@ FunctionParamType::~FunctionParamType() const FunctionParamType::ParamList& FunctionParamType::paramList() const { - return m_paramList; + return m_paramList; } const rdo::runtime::LPRDOType& FunctionParamType::type() const { - NEVER_REACH_HERE; - static rdo::runtime::LPRDOType s_Type; - return s_Type; + NEVER_REACH_HERE; + static rdo::runtime::LPRDOType s_Type; + return s_Type; } -rdo::runtime::RDOType::TypeID FunctionParamType::typeID() const +rdo::runtime::RDOType::Type FunctionParamType::typeID() const { - NEVER_REACH_HERE; - return rdo::runtime::RDOType::t_unknow; + NEVER_REACH_HERE; + return rdo::runtime::RDOType::Type::UNKNOW; } std::string FunctionParamType::name() const { - return src_text(); + return src_text(); } LPIType FunctionParamType::type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - LPFunctionParamType pFromParamType = pFrom.object_dynamic_cast(); - if (!pFromParamType) - { - parser::g_error().push_only(src_info, rdo::format("Ожидаеются параметры вызова, найдено: %s", from_src_info.src_text().c_str())); - parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); - parser::g_error().push_done(); - } + LPFunctionParamType pFromParamType = pFrom.object_dynamic_cast(); + if (!pFromParamType) + { + parser::g_error().push_only(src_info, rdo::format("Ожидаеются параметры вызова, найдено: %s", from_src_info.src_text().c_str())); + parser::g_error().push_only(to_src_info, rdo::format("См. тип: %s", to_src_info.src_text().c_str())); + parser::g_error().push_done(); + } - if (paramList().size() != pFromParamType->paramList().size()) - { - RDOParser::s_parser()->error().error( - src_info, - rdo::format("Неверное количество параметров: %s", from_src_info.src_text().c_str()) - ); - } + if (paramList().size() != pFromParamType->paramList().size()) + { + RDOParser::s_parser()->error().error( + src_info, + rdo::format("Неверное количество параметров: %s", from_src_info.src_text().c_str()) + ); + } - ParamList::const_iterator paramFromIt = pFromParamType->paramList().begin(); - for (const LPTypeInfo& pParamType: paramList()) - { - pParamType->type_cast(*paramFromIt, src_info); - ++paramFromIt; - } + ParamList::const_iterator paramFromIt = pFromParamType->paramList().begin(); + for (const LPTypeInfo& pParamType: paramList()) + { + pParamType->type_cast(*paramFromIt, src_info); + ++paramFromIt; + } - return const_cast(this); + return const_cast(this); } LPRDOValue FunctionParamType::value_cast(const LPRDOValue& /*pFrom*/, const RDOParserSrcInfo& /*to_src_info*/, const RDOParserSrcInfo& /*src_info*/) const { - NEVER_REACH_HERE; - return LPRDOValue(); + NEVER_REACH_HERE; + return LPRDOValue(); } rdo::runtime::LPRDOCalc FunctionParamType::calc_cast(const rdo::runtime::LPRDOCalc& /*pCalc*/, const LPIType& /*pType*/) const { - NEVER_REACH_HERE; - return rdo::runtime::LPRDOCalc(); + NEVER_REACH_HERE; + return rdo::runtime::LPRDOCalc(); } rdo::runtime::RDOValue FunctionParamType::get_default() const { - NEVER_REACH_HERE; - return rdo::runtime::RDOValue(); + NEVER_REACH_HERE; + return rdo::runtime::RDOValue(); } void FunctionParamType::writeModelStructure(std::ostream& stream) const { - stream << "F " << std::endl; - NEVER_REACH_HERE; + stream << "F " << std::endl; + NEVER_REACH_HERE; } // -------------------------------------------------------------------------------- // -------------------- FunctionType // -------------------------------------------------------------------------------- FunctionType::FunctionType(const LPTypeInfo& pReturnType, const LPFunctionParamType& pParamType, const RDOParserSrcInfo& srcInfo) - : RDOType(pReturnType->typeID()) - , RDOParserSrcInfo(srcInfo ) - , m_pReturnType (pReturnType) - , m_pParamType (pParamType ) + : RDOType(pReturnType->typeID()) + , RDOParserSrcInfo(srcInfo) + , m_pReturnType(pReturnType) + , m_pParamType(pParamType) { - ASSERT(m_pReturnType); - ASSERT(m_pParamType ); + ASSERT(m_pReturnType); + ASSERT(m_pParamType); } FunctionType::~FunctionType() @@ -121,57 +121,57 @@ FunctionType::~FunctionType() rdo::runtime::LPRDOType FunctionType::type() const { - return m_pReturnType->type(); + return m_pReturnType->type(); } -rdo::runtime::RDOType::TypeID FunctionType::typeID() const +rdo::runtime::RDOType::Type FunctionType::typeID() const { - return m_pReturnType->typeID(); + return m_pReturnType->typeID(); } const LPTypeInfo& FunctionType::returnType() const { - return m_pReturnType; + return m_pReturnType; } const LPFunctionParamType& FunctionType::paramType() const { - return m_pParamType; + return m_pParamType; } std::string FunctionType::name() const { - return src_text(); + return src_text(); } LPIType FunctionType::type_cast(const LPIType& /*pFrom*/, const RDOParserSrcInfo& /*from_src_info*/, const RDOParserSrcInfo& /*to_src_info*/, const RDOParserSrcInfo& /*src_info*/) const { - NEVER_REACH_HERE; - return LPIType(); + NEVER_REACH_HERE; + return LPIType(); } LPRDOValue FunctionType::value_cast(const LPRDOValue& /*pFrom*/, const RDOParserSrcInfo& /*to_src_info*/, const RDOParserSrcInfo& /*src_info*/) const { - NEVER_REACH_HERE; - return LPRDOValue(); + NEVER_REACH_HERE; + return LPRDOValue(); } rdo::runtime::LPRDOCalc FunctionType::calc_cast(const rdo::runtime::LPRDOCalc& /*pCalc*/, const LPIType& /*pType*/) const { - NEVER_REACH_HERE; - return rdo::runtime::LPRDOCalc(); + NEVER_REACH_HERE; + return rdo::runtime::LPRDOCalc(); } rdo::runtime::RDOValue FunctionType::get_default() const { - NEVER_REACH_HERE; - return rdo::runtime::RDOValue(); + NEVER_REACH_HERE; + return rdo::runtime::RDOValue(); } void FunctionType::writeModelStructure(std::ostream& stream) const { - stream << "F " << std::endl; - NEVER_REACH_HERE; + stream << "F " << std::endl; + NEVER_REACH_HERE; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/type/function_type.h b/simulator/compiler/parser/type/function_type.h index 58ac92a29..b1919165b 100644 --- a/simulator/compiler/parser/type/function_type.h +++ b/simulator/compiler/parser/type/function_type.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_TYPE_FUNCTION_TYPE_H_ -#define _RDOPARSER_TYPE_FUNCTION_TYPE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -16,28 +15,28 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- FunctionParamType // -------------------------------------------------------------------------------- class FunctionParamType - : public rdo::runtime::RDOType - , public IType - , public IModelStructure - , public RDOParserSrcInfo + : public rdo::runtime::RDOType + , public IType + , public IModelStructure + , public RDOParserSrcInfo { DECLARE_FACTORY(FunctionParamType); public: - typedef std::list ParamList; + typedef std::list ParamList; - const ParamList& paramList() const; + const ParamList& paramList() const; private: - FunctionParamType(const ParamList& paramList, const RDOParserSrcInfo& srcInfo); - virtual ~FunctionParamType(); + FunctionParamType(const ParamList& paramList, const RDOParserSrcInfo& srcInfo); + virtual ~FunctionParamType(); - ParamList m_paramList; + ParamList m_paramList; - virtual const rdo::runtime::LPRDOType& type() const; - virtual rdo::runtime::RDOType::TypeID typeID() const; + virtual const rdo::runtime::LPRDOType& type() const; + virtual rdo::runtime::RDOType::Type typeID() const; - DECLARE_IType; - DECLARE_IModelStructure; + DECLARE_IType; + DECLARE_IModelStructure; }; DECLARE_POINTER(FunctionParamType); @@ -45,31 +44,29 @@ DECLARE_POINTER(FunctionParamType); // -------------------- FunctionType // -------------------------------------------------------------------------------- class FunctionType - : public rdo::runtime::RDOType - , public IType - , public IModelStructure - , public RDOParserSrcInfo + : public rdo::runtime::RDOType + , public IType + , public IModelStructure + , public RDOParserSrcInfo { DECLARE_FACTORY(FunctionType); public: - const LPTypeInfo& returnType() const; - const LPFunctionParamType& paramType () const; + const LPTypeInfo& returnType() const; + const LPFunctionParamType& paramType () const; private: - FunctionType(const LPTypeInfo& pReturnType, const LPFunctionParamType& pParamType, const RDOParserSrcInfo& srcInfo); - virtual ~FunctionType(); + FunctionType(const LPTypeInfo& pReturnType, const LPFunctionParamType& pParamType, const RDOParserSrcInfo& srcInfo); + virtual ~FunctionType(); - LPTypeInfo m_pReturnType; - LPFunctionParamType m_pParamType; + LPTypeInfo m_pReturnType; + LPFunctionParamType m_pParamType; - virtual rdo::runtime::LPRDOType type() const; - virtual rdo::runtime::RDOType::TypeID typeID() const; + virtual rdo::runtime::LPRDOType type() const; + virtual rdo::runtime::RDOType::Type typeID() const; - DECLARE_IType; - DECLARE_IModelStructure; + DECLARE_IType; + DECLARE_IModelStructure; }; DECLARE_POINTER(FunctionType); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_TYPE_FUNCTION_TYPE_H_ diff --git a/simulator/compiler/parser/type/info-inl.h b/simulator/compiler/parser/type/info-inl.h index af5f86733..7aa1274d8 100644 --- a/simulator/compiler/parser/type/info-inl.h +++ b/simulator/compiler/parser/type/info-inl.h @@ -10,13 +10,13 @@ OPEN_RDO_PARSER_NAMESPACE template inline LPTypeInfo TypeInfo::create(const RDOParserSrcInfo& srcInfo) { - rdo::runtime::LPRDOType pType = rdo::Factory::create(); - ASSERT(pType); + rdo::runtime::LPRDOType pType = rdo::Factory::create(); + ASSERT(pType); - LPTypeInfo pTypeInfo = rdo::Factory::create(pType.object_dynamic_cast(), srcInfo); - ASSERT(pTypeInfo); + LPTypeInfo pTypeInfo = rdo::Factory::create(pType.object_dynamic_cast(), srcInfo); + ASSERT(pTypeInfo); - return pTypeInfo; + return pTypeInfo; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/type/info.cpp b/simulator/compiler/parser/type/info.cpp index 9ec022665..e7e8e11ef 100644 --- a/simulator/compiler/parser/type/info.cpp +++ b/simulator/compiler/parser/type/info.cpp @@ -14,21 +14,21 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- TypeInfo // -------------------------------------------------------------------------------- TypeInfo::TypeInfo(const LPTypeInfo& pTypeInfo) - : m_pType(pTypeInfo->m_pType) - , m_srcInfo(pTypeInfo->m_srcInfo) + : m_pType(pTypeInfo->m_pType) + , m_srcInfo(pTypeInfo->m_srcInfo) { - init(); + init(); } TypeInfo::TypeInfo(const LPIType& pType, const RDOParserSrcInfo& srcInfo) - : m_pType (pType) - , m_srcInfo(srcInfo) + : m_pType (pType) + , m_srcInfo(srcInfo) { - if (m_srcInfo->src_text().empty()) - { - m_srcInfo->setSrcText(itype()->name()); - } - init(); + if (m_srcInfo->src_text().empty()) + { + m_srcInfo->setSrcText(itype()->name()); + } + init(); } TypeInfo::~TypeInfo() @@ -36,54 +36,54 @@ TypeInfo::~TypeInfo() RDOParserSrcInfo TypeInfo::src_info() const { - return m_srcInfo - ? m_srcInfo.get() - : RDOParserSrcInfo(); + return m_srcInfo + ? m_srcInfo.get() + : RDOParserSrcInfo(); } const RDOParserSrcInfo& TypeInfo::src_info(const RDOParserSrcInfo& srcInfo) const { - return m_srcInfo - ? m_srcInfo.get() - : srcInfo; + return m_srcInfo + ? m_srcInfo.get() + : srcInfo; } void TypeInfo::init() { - if (m_pType.object_dynamic_cast()) - { - RDOParser::s_parser()->insertPreCastType(this); - } + if (m_pType.object_dynamic_cast()) + { + RDOParser::s_parser()->insertPreCastType(this); + } } rdo::runtime::LPRDOType TypeInfo::type() const { - return m_pType.object_dynamic_cast(); + return m_pType.object_dynamic_cast(); } -rdo::runtime::RDOType::TypeID TypeInfo::typeID() const +rdo::runtime::RDOType::Type TypeInfo::typeID() const { - return type()->typeID(); + return type()->typeID(); } const LPIType& TypeInfo::itype() const { - return m_pType; + return m_pType; } LPTypeInfo TypeInfo::type_cast(const LPTypeInfo& pFrom, const RDOParserSrcInfo& src_info) const { - /// @todo TypeInfo убрать параметр из src_info() - LPIType pType = itype()->type_cast(pFrom->itype(), pFrom->src_info(src_info), this->src_info(src_info), src_info); - ASSERT(pType); - LPTypeInfo pTypeInfo = rdo::Factory::create(pType, this->src_info(src_info)); - ASSERT(pTypeInfo); - return pTypeInfo; + // TODO TypeInfo убрать параметр из src_info() + LPIType pType = itype()->type_cast(pFrom->itype(), pFrom->src_info(src_info), this->src_info(src_info), src_info); + ASSERT(pType); + LPTypeInfo pTypeInfo = rdo::Factory::create(pType, this->src_info(src_info)); + ASSERT(pTypeInfo); + return pTypeInfo; } LPRDOValue TypeInfo::value_cast(const LPRDOValue& pValue) const { - return itype()->value_cast(pValue, m_srcInfo.get(), pValue->src_info()); + return itype()->value_cast(pValue, m_srcInfo.get(), pValue->src_info()); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/type/info.h b/simulator/compiler/parser/type/info.h index 4fd4aab24..bb6050bde 100644 --- a/simulator/compiler/parser/type/info.h +++ b/simulator/compiler/parser/type/info.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_TYPE_INFO_H_ -#define _RDOPARSER_TYPE_INFO_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -17,32 +16,32 @@ class TypeInfo: public rdo::counter_reference { DECLARE_FACTORY(TypeInfo) public: - rdo::runtime::LPRDOType type() const; - rdo::runtime::RDOType::TypeID typeID() const; - const LPIType& itype() const; - RDOParserSrcInfo src_info() const; - const RDOParserSrcInfo& src_info(const RDOParserSrcInfo& srcInfo) const; - LPTypeInfo type_cast(const LPTypeInfo& pFrom, const RDOParserSrcInfo& src_info) const; - LPRDOValue value_cast(const LPRDOValue& pValue) const; + rdo::runtime::LPRDOType type() const; + rdo::runtime::RDOType::Type typeID() const; + const LPIType& itype() const; + RDOParserSrcInfo src_info() const; + const RDOParserSrcInfo& src_info(const RDOParserSrcInfo& srcInfo) const; + LPTypeInfo type_cast(const LPTypeInfo& pFrom, const RDOParserSrcInfo& src_info) const; + LPRDOValue value_cast(const LPRDOValue& pValue) const; protected: - TypeInfo(const LPTypeInfo& pTypeInfo); - virtual ~TypeInfo(); + TypeInfo(const LPTypeInfo& pTypeInfo); + virtual ~TypeInfo(); private: - TypeInfo(const LPIType& pType, const RDOParserSrcInfo& srcInfo); + TypeInfo(const LPIType& pType, const RDOParserSrcInfo& srcInfo); - template - static LPTypeInfo create(const RDOParserSrcInfo& srcInfo); + TypeInfo& operator=(const TypeInfo&); - const LPIType m_pType; - boost::optional m_srcInfo; + template + static LPTypeInfo create(const RDOParserSrcInfo& srcInfo); - void init(); + const LPIType m_pType; + boost::optional m_srcInfo; + + void init(); }; CLOSE_RDO_PARSER_NAMESPACE #include "simulator/compiler/parser/type/info-inl.h" - -#endif // _RDOPARSER_TYPE_INFO_H_ diff --git a/simulator/compiler/parser/type/range-inl.h b/simulator/compiler/parser/type/range-inl.h index 56fe5101c..6c8cae712 100644 --- a/simulator/compiler/parser/type/range-inl.h +++ b/simulator/compiler/parser/type/range-inl.h @@ -7,10 +7,10 @@ OPEN_RDO_PARSER_NAMESPACE template inline RDOTypeRange::RDOTypeRange(const LPRDOTypeRangeRange& range) - : T ( ) - , m_range(range) + : T ( ) + , m_range(range) { - ASSERT(m_range); + ASSERT(m_range); } template @@ -20,40 +20,40 @@ inline RDOTypeRange::~RDOTypeRange() template inline std::string RDOTypeRange::name() const { - return rdo::format("%s %s", T::name().c_str(), m_range->src_text().c_str()); + return rdo::format("%s %s", T::name().c_str(), m_range->src_text().c_str()); } template inline LPIType RDOTypeRange::type_cast(const LPIType& from, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - return parent_type::type_cast(from, from_src_info, to_src_info, src_info); + return parent_type::type_cast(from, from_src_info, to_src_info, src_info); } template inline LPRDOValue RDOTypeRange::value_cast(const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const { - LPRDOValue pToValue = T::value_cast(pFrom, to_src_info, src_info); - ASSERT(pToValue); - m_range->checkValue(pToValue); - return pToValue; + LPRDOValue pToValue = T::value_cast(pFrom, to_src_info, src_info); + ASSERT(pToValue); + m_range->checkValue(pToValue); + return pToValue; } template inline rdo::runtime::LPRDOCalc RDOTypeRange::calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const { - return rdo::Factory::create(range()->getMin()->value(), range()->getMax()->value(), T::calc_cast(pCalc, pType)); + return rdo::Factory::create(range()->getMin()->value(), range()->getMax()->value(), T::calc_cast(pCalc, pType)); } template inline const LPRDOTypeRangeRange& RDOTypeRange::range() const { - return m_range; + return m_range; } template inline rdo::runtime::RDOValue RDOTypeRange::get_default() const { - return m_range->getMin()->value(); + return m_range->getMin()->value(); } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/type/range.cpp b/simulator/compiler/parser/type/range.cpp index e893cb48c..1d36bc864 100644 --- a/simulator/compiler/parser/type/range.cpp +++ b/simulator/compiler/parser/type/range.cpp @@ -9,13 +9,13 @@ OPEN_RDO_PARSER_NAMESPACE RDOTypeRangeRange::RDOTypeRangeRange(const LPRDOValue& pMinValue, const LPRDOValue& pMaxValue, const RDOParserSrcInfo& src_info) - : RDOParserSrcInfo(src_info ) - , m_pMinValue (pMinValue) - , m_pMaxValue (pMaxValue) + : RDOParserSrcInfo(src_info ) + , m_pMinValue (pMinValue) + , m_pMaxValue (pMaxValue) { - ASSERT(m_pMinValue->defined()); - ASSERT(m_pMaxValue->defined()); - setSrcText(rdo::format("[%s..%s]", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str())); + ASSERT(m_pMinValue->defined()); + ASSERT(m_pMaxValue->defined()); + setSrcText(rdo::format("[%s..%s]", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str())); } RDOTypeRangeRange::~RDOTypeRangeRange() @@ -23,43 +23,43 @@ RDOTypeRangeRange::~RDOTypeRangeRange() void RDOTypeRangeRange::checkRange() const { - if (m_pMinValue->typeID() != m_pMaxValue->typeID()) - { - parser::g_error().error(m_pMaxValue->src_info(), rdo::format("Границы диапазона должны быть одного типа, найдено: [%s] .. [%s]", m_pMinValue->typeInfo()->itype()->name().c_str(), m_pMaxValue->typeInfo()->itype()->name().c_str())); - } - if (m_pMinValue->value() > m_pMaxValue->value()) - { - parser::g_error().error(m_pMaxValue->src_info(), "Левая граница диапазона должна быть меньше правой"); - } + if (m_pMinValue->typeID() != m_pMaxValue->typeID()) + { + parser::g_error().error(m_pMaxValue->src_info(), rdo::format("Границы диапазона должны быть одного типа, найдено: [%s] .. [%s]", m_pMinValue->typeInfo()->itype()->name().c_str(), m_pMaxValue->typeInfo()->itype()->name().c_str())); + } + if (m_pMinValue->value() > m_pMaxValue->value()) + { + parser::g_error().error(m_pMaxValue->src_info(), "Левая граница диапазона должна быть меньше правой"); + } } void RDOTypeRangeRange::checkValue(const LPRDOValue& pValue) const { - ASSERT(pValue); + ASSERT(pValue); - if (pValue->value() < m_pMinValue->value() || pValue->value() > m_pMaxValue->value()) - { - if (pValue->src_filetype() == src_filetype() && pValue->src_pos().m_last_line == src_pos().m_last_line) - { - parser::g_error().error(pValue->src_info(), rdo::format("Значение выходит за допустимый диапазон [%s..%s]: %s", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str(), pValue->value().getAsString().c_str())); - } - else - { - parser::g_error().push_only(pValue->src_info(), rdo::format("Значение выходит за допустимый диапазон [%s..%s]: %s", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str(), pValue->value().getAsString().c_str())); - parser::g_error().push_only(src_info(), rdo::format("См. описание диапазона")); - parser::g_error().push_done(); - } - } + if (pValue->value() < m_pMinValue->value() || pValue->value() > m_pMaxValue->value()) + { + if (pValue->src_filetype() == src_filetype() && pValue->src_pos().m_last_line == src_pos().m_last_line) + { + parser::g_error().error(pValue->src_info(), rdo::format("Значение выходит за допустимый диапазон [%s..%s]: %s", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str(), pValue->value().getAsString().c_str())); + } + else + { + parser::g_error().push_only(pValue->src_info(), rdo::format("Значение выходит за допустимый диапазон [%s..%s]: %s", m_pMinValue->value().getAsString().c_str(), m_pMaxValue->value().getAsString().c_str(), pValue->value().getAsString().c_str())); + parser::g_error().push_only(src_info(), rdo::format("См. описание диапазона")); + parser::g_error().push_done(); + } + } } const LPRDOValue& RDOTypeRangeRange::getMin() const { - return m_pMinValue; + return m_pMinValue; } const LPRDOValue& RDOTypeRangeRange::getMax() const { - return m_pMaxValue; + return m_pMaxValue; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/type/range.h b/simulator/compiler/parser/type/range.h index 2efb7e837..befe9cb82 100644 --- a/simulator/compiler/parser/type/range.h +++ b/simulator/compiler/parser/type/range.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_TYPE_RANGE_H_ -#define _RDOPARSER_TYPE_RANGE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -15,22 +14,22 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOTypeRangeRange); class RDOTypeRangeRange - : public rdo::counter_reference - , public RDOParserSrcInfo + : public rdo::counter_reference + , public RDOParserSrcInfo { DECLARE_FACTORY(RDOTypeRangeRange); public: - void checkRange() const; - void checkValue(const LPRDOValue& pValue) const; - const LPRDOValue& getMin () const; - const LPRDOValue& getMax () const; + void checkRange() const; + void checkValue(const LPRDOValue& pValue) const; + const LPRDOValue& getMin () const; + const LPRDOValue& getMax () const; private: - RDOTypeRangeRange(const LPRDOValue& pMinValue, const LPRDOValue& pMaxValue, const RDOParserSrcInfo& src_info); - virtual ~RDOTypeRangeRange(); + RDOTypeRangeRange(const LPRDOValue& pMinValue, const LPRDOValue& pMaxValue, const RDOParserSrcInfo& src_info); + virtual ~RDOTypeRangeRange(); - LPRDOValue m_pMinValue; - LPRDOValue m_pMaxValue; + LPRDOValue m_pMinValue; + LPRDOValue m_pMaxValue; }; DECLARE_POINTER(RDOTypeRangeRange); @@ -42,25 +41,23 @@ class RDOTypeRange: public T { DECLARE_FACTORY(RDOTypeRange); public: - const LPRDOTypeRangeRange& range() const; + const LPRDOTypeRangeRange& range() const; private: - typedef T parent_type; + typedef T parent_type; - RDOTypeRange(const LPRDOTypeRangeRange& range); - virtual ~RDOTypeRange(); + RDOTypeRange(const LPRDOTypeRangeRange& range); + virtual ~RDOTypeRange(); - LPRDOTypeRangeRange m_range; + LPRDOTypeRangeRange m_range; - DECLARE_IType; + DECLARE_IType; }; -typedef RDOTypeRange RDOTypeIntRange; -typedef RDOTypeRange RDOTypeRealRange; +typedef RDOTypeRange RDOTypeIntRange; +typedef RDOTypeRange RDOTypeRealRange; DECLARE_POINTER(RDOTypeIntRange); DECLARE_POINTER(RDOTypeRealRange); CLOSE_RDO_PARSER_NAMESPACE #include "simulator/compiler/parser/type/range-inl.h" - -#endif // _RDOPARSER_TYPE_RANGE_H_ diff --git a/simulator/compiler/parser/type/such_as.cpp b/simulator/compiler/parser/type/such_as.cpp index ea98dac5b..69095003c 100644 --- a/simulator/compiler/parser/type/such_as.cpp +++ b/simulator/compiler/parser/type/such_as.cpp @@ -12,8 +12,8 @@ OPEN_RDO_PARSER_NAMESPACE // -------------------- RDOTypeParamSuchAs // -------------------------------------------------------------------------------- RDOTypeParamSuchAs::RDOTypeParamSuchAs(const LPRDOParam& pParam) - : TypeInfo(pParam->getTypeInfo()) - , m_pParam(pParam ) + : TypeInfo(pParam->getTypeInfo()) + , m_pParam(pParam ) {} RDOTypeParamSuchAs::~RDOTypeParamSuchAs() @@ -21,7 +21,7 @@ RDOTypeParamSuchAs::~RDOTypeParamSuchAs() const LPRDOParam& RDOTypeParamSuchAs::getParam() const { - return m_pParam; + return m_pParam; } CLOSE_RDO_PARSER_NAMESPACE diff --git a/simulator/compiler/parser/type/such_as.h b/simulator/compiler/parser/type/such_as.h index 3557aafbb..f372d08c4 100644 --- a/simulator/compiler/parser/type/such_as.h +++ b/simulator/compiler/parser/type/such_as.h @@ -1,5 +1,4 @@ -#ifndef _RDOPARSER_TYPE_SUCH_AS_H_ -#define _RDOPARSER_TYPE_SUCH_AS_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,16 +15,14 @@ class RDOTypeParamSuchAs: public TypeInfo { DECLARE_FACTORY(RDOTypeParamSuchAs); public: - const LPRDOParam& getParam() const; + const LPRDOParam& getParam() const; private: - RDOTypeParamSuchAs(const LPRDOParam& pParam); - virtual ~RDOTypeParamSuchAs(); + RDOTypeParamSuchAs(const LPRDOParam& pParam); + virtual ~RDOTypeParamSuchAs(); - LPRDOParam m_pParam; + LPRDOParam m_pParam; }; DECLARE_POINTER(RDOTypeParamSuchAs); CLOSE_RDO_PARSER_NAMESPACE - -#endif // _RDOPARSER_TYPE_SUCH_AS_H_ diff --git a/simulator/compiler/parser/type/type_i.h b/simulator/compiler/parser/type/type_i.h index 9de330784..8ab4ed3f9 100644 --- a/simulator/compiler/parser/type/type_i.h +++ b/simulator/compiler/parser/type/type_i.h @@ -1,5 +1,4 @@ -#ifndef _SIMULATOR_COMPILER_PARSER_TYPE_I_H_ -#define _SIMULATOR_COMPILER_PARSER_TYPE_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -19,35 +18,33 @@ PREDECLARE_POINTER(IType); class IType: public virtual rdo::counter_reference { public: - virtual std::string name() const = 0; - virtual LPIType type_cast( - const LPIType& pFrom, - const RDOParserSrcInfo& from_src_info, - const RDOParserSrcInfo& to_src_info, - const RDOParserSrcInfo& src_info - ) const = 0; - virtual LPRDOValue value_cast( - const LPRDOValue& pFrom, - const RDOParserSrcInfo& to_src_info, - const RDOParserSrcInfo& src_info - ) const = 0; - //! calc_cast вызывается строго после type_cast, поэтому никаких RDOParserSrcInfo не передается - virtual rdo::runtime::LPRDOCalc calc_cast( - const rdo::runtime::LPRDOCalc& pCalc, - const LPIType& pType - ) const = 0; - virtual rdo::runtime::RDOValue get_default() const = 0; + virtual std::string name() const = 0; + virtual LPIType type_cast( + const LPIType& pFrom, + const RDOParserSrcInfo& from_src_info, + const RDOParserSrcInfo& to_src_info, + const RDOParserSrcInfo& src_info + ) const = 0; + virtual LPRDOValue value_cast( + const LPRDOValue& pFrom, + const RDOParserSrcInfo& to_src_info, + const RDOParserSrcInfo& src_info + ) const = 0; + // calc_cast вызывается строго после type_cast, поэтому никаких RDOParserSrcInfo не передается + virtual rdo::runtime::LPRDOCalc calc_cast( + const rdo::runtime::LPRDOCalc& pCalc, + const LPIType& pType + ) const = 0; + virtual rdo::runtime::RDOValue get_default() const = 0; - virtual ~IType() - {} + virtual ~IType() + {} }; #define DECLARE_IType \ - virtual std::string name() const; \ - virtual LPIType type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const; \ - virtual LPRDOValue value_cast (const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const; \ - virtual rdo::runtime::LPRDOCalc calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const; \ - virtual rdo::runtime::RDOValue get_default() const; + virtual std::string name() const; \ + virtual LPIType type_cast(const LPIType& pFrom, const RDOParserSrcInfo& from_src_info, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const; \ + virtual LPRDOValue value_cast (const LPRDOValue& pFrom, const RDOParserSrcInfo& to_src_info, const RDOParserSrcInfo& src_info) const; \ + virtual rdo::runtime::LPRDOCalc calc_cast(const rdo::runtime::LPRDOCalc& pCalc, const LPIType& pType) const; \ + virtual rdo::runtime::RDOValue get_default() const; CLOSE_RDO_PARSER_NAMESPACE - -#endif // _SIMULATOR_COMPILER_PARSER_TYPE_I_H_ diff --git a/simulator/compiler/procgui/CMakeLists.txt b/simulator/compiler/procgui/CMakeLists.txt deleted file mode 100644 index a2c629990..000000000 --- a/simulator/compiler/procgui/CMakeLists.txt +++ /dev/null @@ -1,67 +0,0 @@ -#============================================================================== -# Copyright (c) 2012 Evgeny Proydakov , -# 2013 Andrey Urusov -#============================================================================== - -MESSAGE(STATUS "CREATE PROCGUI LIBRARY") - -FIND_PACKAGE(Boost) -LINK_DIRECTORIES(${Boost_LIBRARY_DIRS}) -INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) - -INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) - -SET(COMMON_FILES - namespace.h -) - -SET(PCH_FILES - pch.h - pch.cpp -) - -SET(PROCGUI_FILES - procgui.cpp - procgui.h - procgui_datablock.cpp - procgui_datablock.h -) - -SET(SOURCE_FILES - ${PCH_FILES} - ${COMMON_FILES} - ${PROCGUI_FILES} -) - -SET(NO_PCH_FILES - ${PCH_FILES} -) - -ADD_LIBRARY(rdo_procgui STATIC ${SOURCE_FILES}) -INCLUDE(${PROJECT_SOURCE_DIR}/simulator/compiler/compiler.cmake) -SET_TARGET_PROPERTIES(rdo_procgui PROPERTIES FOLDER ${PROJECT_FOLDER}) - -ADD_DEPENDENCIES(rdo_procgui rdo_utils) - -TARGET_LINK_LIBRARIES(rdo_procgui rdo_utils) - -INSTALL(TARGETS rdo_procgui DESTINATION lib) - -IF(MSVC_IDE) # options for windows # - - INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) - ADD_PCH("${SOURCE_FILES}" "${NO_PCH_FILES}" simulator/compiler/procgui ./ pch) - - SOURCE_GROUP(".common" FILES - ${COMMON_FILES} - ) - - SOURCE_GROUP(".pch" FILES - ${PCH_FILES} - ) - - SOURCE_GROUP(".procgui" FILES - ${PROCGUI_FILES} - ) - -ENDIF() diff --git a/simulator/compiler/procgui/namespace.h b/simulator/compiler/procgui/namespace.h deleted file mode 100644 index e692b108c..000000000 --- a/simulator/compiler/procgui/namespace.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef _SIMULATOR_COMPILER_GUI_NAMESPACE_H_ -#define _SIMULATOR_COMPILER_GUI_NAMESPACE_H_ - -// ----------------------------------------------------------------------- INCLUDES -// ----------------------------------------------------------------------- SYNOPSIS -// -------------------------------------------------------------------------------- - -//! \namespace rdo::compiler::gui -//! \brief Пространство имен rdo::compiler::gui -#define OPEN_COMPILER_GUI_NAMESPACE namespace rdo { namespace compiler { namespace gui { -#define CLOSE_COMPILER_GUI_NAMESPACE }}}; - -#endif // _SIMULATOR_COMPILER_GUI_NAMESPACE_H_ diff --git a/simulator/compiler/procgui/pch.cpp b/simulator/compiler/procgui/pch.cpp deleted file mode 100644 index 0ffff1e00..000000000 --- a/simulator/compiler/procgui/pch.cpp +++ /dev/null @@ -1,5 +0,0 @@ -// ---------------------------------------------------------------------------- PCH -#include "simulator/compiler/procgui/pch.h" -// ----------------------------------------------------------------------- INCLUDES -// ----------------------------------------------------------------------- SYNOPSIS -// -------------------------------------------------------------------------------- diff --git a/simulator/compiler/procgui/pch.h b/simulator/compiler/procgui/pch.h deleted file mode 100644 index 658e7859a..000000000 --- a/simulator/compiler/procgui/pch.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef _PROCGUI_PCH_H_ -#define _PROCGUI_PCH_H_ - -// ----------------------------------------------------------------------- PLATFORM -#include "utils/src/common/platform.h" - -#ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable: 4786) -#endif // COMPILER_VISUAL_STUDIO - -#ifndef WINVER //! Allow use of features specific to Windows XP or later. - #define WINVER 0x0501 //! Change this to the appropriate value to target other versions of Windows. -#endif -// ----------------------------------------------------------------------- INCLUDES -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -// ----------------------------------------------------------------------- SYNOPSIS -#include "utils/src/common/rdocommon.h" -#include "utils/src/debug/rdodebug.h" -// -------------------------------------------------------------------------------- - -#endif // _PROCGUI_PCH_H_ diff --git a/simulator/compiler/procgui/procgui.cpp b/simulator/compiler/procgui/procgui.cpp deleted file mode 100644 index ab213ac31..000000000 --- a/simulator/compiler/procgui/procgui.cpp +++ /dev/null @@ -1,757 +0,0 @@ -// ---------------------------------------------------------------------------- PCH -#include "simulator/compiler/procgui/pch.h" -// ----------------------------------------------------------------------- INCLUDES -// ----------------------------------------------------------------------- SYNOPSIS -#include "simulator/compiler/procgui/procgui.h" -#include "simulator/compiler/mbuilder/rdo_resources.h" -#include "simulator/compiler/mbuilder/process.h" -// -------------------------------------------------------------------------------- - -OPEN_COMPILER_GUI_NAMESPACE - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUICalc -// -------------------------------------------------------------------------------- -ProcGUICalc::ProcGUICalc(const rdo::runtime::LPRDORuntime& pRuntime, const LPRPShapeDataBlock& pParams) - : m_pRuntime(pRuntime) - , m_pParams (pParams ) -{ - ASSERT(m_pRuntime); - ASSERT(m_pParams ); - switch(pParams->getZakon()) - { - case RPShapeDataBlock::Const: // константа - { - m_pCalc = static_cast(getConstCalc(pParams->getExp())); - break; - } - case RPShapeDataBlock::Normal: // нормальный - { - m_pCalc = static_cast(getNormalCalc(pParams->getBase(), pParams->getExp(), pParams->getDisp())); - break; - } - case RPShapeDataBlock::Uniform: // равномерный закон - { - m_pCalc = static_cast(getUniformCalc(pParams->getBase(), pParams->getExp(), pParams->getDisp())); - break; - } - case RPShapeDataBlock::Exp: // экспоненциальный - { - m_pCalc = static_cast(getExpCalc(pParams->getBase(), pParams->getExp())); - break; - } - case RPShapeDataBlock::Triangular: // треугольный закон - { - m_pCalc = static_cast(getTriangularCalc(pParams->getBase(), pParams->getExp(), pParams->getDisp(), pParams->getMax())); - break; - } - } -} - -ProcGUICalc::~ProcGUICalc() -{} - -rdo::runtime::LPRDOCalcConst ProcGUICalc::getConstCalc(double arg) -{ - rdo::runtime::LPRDOCalcConst pCalc = rdo::Factory::create(arg); - ASSERT(pCalc); - return pCalc; -} - -rdo::runtime::LPRDOCalc ProcGUICalc::getCalc() -{ - return m_pCalc; -} - -rdo::runtime::LPRDOCalcFunctionCaller ProcGUICalc::getNormalCalc(std::size_t base, double arg1, double arg2) -{ - rdo::runtime::RandGeneratorNormal* pGenerator = new rdo::runtime::RandGeneratorNormal(); - ASSERT(pGenerator); - rdo::runtime::LPRDOCalcSeqInit pInitCalc = rdo::Factory::create(base, pGenerator); - ASSERT(pInitCalc); - m_pRuntime->addInitCalc(pInitCalc); - rdo::runtime::LPRDOCalcSeqNext pNextCalc = rdo::Factory::create(pGenerator); - ASSERT(pNextCalc); - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(pNextCalc); - ASSERT(pFuctionCall); - rdo::runtime::LPRDOCalcConst pArg1 = rdo::Factory::create(arg1); - rdo::runtime::LPRDOCalcConst pArg2 = rdo::Factory::create(arg2); - ASSERT(pArg1); - ASSERT(pArg2); - pFuctionCall->addParameter(pArg1); - pFuctionCall->addParameter(pArg2); - return pFuctionCall; -} - -rdo::runtime::LPRDOCalcFunctionCaller ProcGUICalc::getUniformCalc(std::size_t base, double arg1, double arg2) -{ - rdo::runtime::RandGeneratorUniform* pGenerator = new rdo::runtime::RandGeneratorUniform(); - ASSERT(pGenerator); - rdo::runtime::LPRDOCalcSeqInit pInitCalc = rdo::Factory::create(base, pGenerator); - ASSERT(pInitCalc); - m_pRuntime->addInitCalc(pInitCalc); - rdo::runtime::LPRDOCalcSeqNext pNextCalc = rdo::Factory::create(pGenerator); - ASSERT(pNextCalc); - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(pNextCalc); - ASSERT(pFuctionCall); - rdo::runtime::LPRDOCalcConst pArg1 = rdo::Factory::create(arg1); - rdo::runtime::LPRDOCalcConst pArg2 = rdo::Factory::create(arg2); - ASSERT(pArg1); - ASSERT(pArg2); - pFuctionCall->addParameter(pArg1); - pFuctionCall->addParameter(pArg2); - return pFuctionCall; -} - -rdo::runtime::LPRDOCalcFunctionCaller ProcGUICalc::getExpCalc(std::size_t base, double arg) -{ - rdo::runtime::RandGeneratorExponential* pGenerator = new rdo::runtime::RandGeneratorExponential(); - ASSERT(pGenerator); - rdo::runtime::LPRDOCalcSeqInit pInitCalc = rdo::Factory::create(base, pGenerator); - ASSERT(pInitCalc); - m_pRuntime->addInitCalc(pInitCalc); - rdo::runtime::LPRDOCalcSeqNext pNextCalc = rdo::Factory::create(pGenerator); - ASSERT(pNextCalc); - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(pNextCalc); - ASSERT(pFuctionCall); - rdo::runtime::LPRDOCalcConst pArg = rdo::Factory::create(arg); - ASSERT(pArg); - pFuctionCall->addParameter(pArg); - return pFuctionCall; -} - -rdo::runtime::LPRDOCalcFunctionCaller ProcGUICalc::getTriangularCalc(std::size_t base, double arg1, double arg2, double arg3) -{ - rdo::runtime::RandGeneratorTriangular* pGenerator = new rdo::runtime::RandGeneratorTriangular(); - rdo::runtime::LPRDOCalcSeqInit pInitCalc = rdo::Factory::create(base, pGenerator); - ASSERT(pInitCalc); - m_pRuntime->addInitCalc(pInitCalc); - rdo::runtime::LPRDOCalcSeqNext pNextCalc = rdo::Factory::create(pGenerator); - ASSERT(pNextCalc); - rdo::runtime::LPRDOCalcFunctionCaller pFuctionCall = rdo::Factory::create(pNextCalc); - ASSERT(pFuctionCall); - rdo::runtime::LPRDOCalcConst pArg1 = rdo::Factory::create(arg1); - rdo::runtime::LPRDOCalcConst pArg2 = rdo::Factory::create(arg2); - rdo::runtime::LPRDOCalcConst pArg3 = rdo::Factory::create(arg3); - pFuctionCall->addParameter(pArg1); - pFuctionCall->addParameter(pArg2); - pFuctionCall->addParameter(pArg3); - return pFuctionCall; -} - -// -------------------------------------------------------------------- -// ---------- ProcGUIProcess -// -------------------------------------------------------------------- -std::string ProcGUIProcess::s_namePrefix = ""; -std::string ProcGUIProcess::s_nameSufix = "s"; - -ProcGUIProcess::ProcGUIProcess(const rdo::runtime::LPRDORuntime& pRuntime) - : m_pRuntime(pRuntime) -{ - ASSERT(m_pRuntime); - m_pProcess = rdo::Factory::create("GuiProcess", m_pRuntime); - ASSERT(m_pProcess); - m_pProcess.object_dynamic_cast()->init(m_pRuntime); -} - -ProcGUIProcess::~ProcGUIProcess() -{} - -void ProcGUIProcess::clear() -{ - m_pProcess = NULL; - m_blockList.clear(); -} - -void ProcGUIProcess::insertBlock(const LPProcGUIBlock& pBlock) -{ - ASSERT(pBlock); - m_blockList.push_back(pBlock); -} - -void ProcGUIProcess::initResources(const parser::LPRDOParser& pParser) -{ - for (const auto& name: m_resNameList) - { - parser::LPRDORSSResource pResource = pParser->findRSSResource(name); - ASSERT(pResource); - const rdo::runtime::LPRDOCalc pCalc = pResource->createCalc(); - ASSERT(pCalc); - pParser->runtime()->addInitCalc(pCalc); - } -} - -void ProcGUIProcess::addResNameToBlock(const std::string& name) -{ - ASSERT(!name.empty()); - - ResNameList::const_iterator it = std::find(m_resNameList.begin(), m_resNameList.end(), name); - if (it == m_resNameList.end()) - { - m_resNameList.push_back(name); - } -} - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIBlock -// -------------------------------------------------------------------------------- -ProcGUIBlock::ProcGUIBlock(const LPProcGUIProcess& pProcess, const std::string& name) - : m_name(name) -{ - ASSERT(pProcess); - pProcess->insertBlock(this); -} - -ProcGUIBlock::~ProcGUIBlock() -{} - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIBlockGenerate -// -------------------------------------------------------------------------------- -ProcGUIBlockGenerate::ProcGUIBlockGenerate(const LPProcGUIProcess& pProcess, const rdo::runtime::LPRDORuntime& pRuntime, const parser::LPRDOParser& pParser, const LPRPShapeDataBlockCreate& pParams) - : ProcGUIBlock(pProcess, pParams->getName()) - , ProcGUICalc (pRuntime, pParams ) - , m_pParams (pParams ) -{ - ASSERT(pProcess ); - ASSERT(pRuntime ); - ASSERT(pParser ); - ASSERT(m_pParams); - - const std::string rtpName = "Транзакты"; - const std::string rtpParamName = "Время_создания"; - - //! Получили список всех типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(pParser); - //! Найти тип ресурса, если его нет, то создать - if (!rtpList[rtpName].exist()) - { - //! Создадим тип ресурса - rdo::compiler::mbuilder::RDOResType rtp(rtpName); - //! Добавим параметр Время_создания - rdo::compiler::mbuilder::RDOResType::Param param(rtpParamName, rdo::Factory::create()); - rtp.m_params.append(param); - //! Добавим тип ресурса - if (!rtpList.append(rtp)) - { - pParser->error().error(parser::RDOParserSrcInfo(), rdo::format("Ошибка создания типа ресурса: %s", rtpName.c_str())); - } - } - - parser::LPRDORTPResType pResType = parser::RDOParser::s_parser()->findRTPResType(rtpName); - ASSERT(pResType); - pResType->setSubtype(parser::RDORTPResType::RT_PROCESS_TRANSACT); - - std::vector paramList; - paramList.push_back(rdo::Factory::create(rdo::runtime::RDOValue(0))); - - rdo::runtime::LPRDOCalc pCreateTransactCalc = rdo::Factory::create( - pResType->getNumber(), - paramList, - true, - pResType->isPermanent() - ); - ASSERT(pCreateTransactCalc); - - rdo::runtime::LPRDOCalc pTimeCalc = getCalc(); - ASSERT(pTimeCalc); - - m_pBlock = rdo::Factory::create( - pProcess->getProcess().object_dynamic_cast(), - pTimeCalc, - pCreateTransactCalc, - m_pParams->getAmount() - ); - ASSERT(m_pBlock); - - LPIInternalStatisticsManager pStatisticsManager = m_pBlock.object_dynamic_cast(); - ASSERT(pStatisticsManager); - - pStatisticsManager->setStatistics(m_pParams->getStatistics()); -} - -ProcGUIBlockGenerate::~ProcGUIBlockGenerate() -{} - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIBlockTerminate -// -------------------------------------------------------------------------------- -ProcGUIBlockTerminate::ProcGUIBlockTerminate(const LPProcGUIProcess& pProcess, const LPRPShapeDataBlockTerminate& pParams) - : ProcGUIBlock(pProcess, pParams->getName()) - , m_pParams (pParams ) -{ - ASSERT(pProcess ); - ASSERT(m_pParams); - - //! \todo добавить поддержку арифметических выражений - rdo::runtime::LPRDOCalc pCalc = rdo::Factory::create(rdo::runtime::RDOValue(static_cast(m_pParams->getTermInc()))); - ASSERT(pCalc); - m_pBlock = rdo::Factory::create(pProcess->getProcess().object_dynamic_cast(), pCalc); - ASSERT(m_pBlock); - - LPIInternalStatisticsManager pStatisticsManagerDel = m_pBlock.object_dynamic_cast(); - ASSERT(pStatisticsManagerDel); - - pStatisticsManagerDel->setStatistics(m_pParams->getStatistics()); -} - -ProcGUIBlockTerminate::~ProcGUIBlockTerminate() -{} - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIBlockProcess -// -------------------------------------------------------------------------------- -ProcGUIBlockProcess::ProcGUIBlockProcess(const LPProcGUIProcess& pProcess, const rdo::runtime::LPRDORuntime& pRuntime, const parser::LPRDOParser& pParser, const LPRPShapeDataBlockProcess& pParams) - : ProcGUIBlock(pProcess, pParams->getName()) - , m_pParams (pParams ) -{ - ASSERT(pProcess ); - ASSERT(pRuntime ); - ASSERT(pParser ); - ASSERT(m_pParams); - - const RPShapeDataBlockProcess::ActionList& actionList = m_pParams->getActionList(); - for (const auto action: actionList) - { - switch (action) - { - case RPShapeDataBlockProcess::A_SEIZE: - { - LPProcGUIQueue pQueue = rdo::Factory::create(pProcess, pParser, m_pParams->getName()); - ASSERT(pQueue); - pQueue->createRuntime(pProcess, pParser); - - LPProcGUISeize pSeize = rdo::Factory::create(pProcess, pParser, m_pParams); - ASSERT(pSeize); - pSeize->createRuntime(pProcess, pParser); - - LPProcGUIDepart pDepart = rdo::Factory::create(pProcess, pParser, m_pParams->getName()); - ASSERT(pDepart); - pDepart->createRuntime(pProcess, pParser); - - break; - } - case RPShapeDataBlockProcess::A_ADVANCE: - { - LPProcGUIAdvance pAdvance = rdo::Factory::create(pProcess, pRuntime, m_pParams); - ASSERT(pAdvance); - break; - } - case RPShapeDataBlockProcess::A_RELEASE: - { - LPProcGUIRelease pRelease = rdo::Factory::create(pProcess, pParser, m_pParams); - ASSERT(pRelease); - pRelease->createRuntime(pProcess, pParser); - break; - } - } - } - pProcess->initResources(pParser); -} - -ProcGUIBlockProcess::~ProcGUIBlockProcess() -{} - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIAdvance -// -------------------------------------------------------------------------------- -ProcGUIAdvance::ProcGUIAdvance(const LPProcGUIProcess& pProcess, const rdo::runtime::LPRDORuntime& pRuntime, const LPRPShapeDataBlockProcess& pParams) - : ProcGUIBlock(pProcess, rdo::format("%s Advance", pParams->getName().c_str())) - , ProcGUICalc (pRuntime, pParams) - , m_pParams (pParams) -{ - ASSERT(pProcess ); - ASSERT(pRuntime ); - ASSERT(m_pParams); - - m_pBlock = rdo::Factory::create(pProcess->getProcess().object_dynamic_cast(), getCalc()); - ASSERT(m_pBlock); - - LPIInternalStatisticsManager pStatisticsManagerProc = m_pBlock.object_dynamic_cast(); - ASSERT(pStatisticsManagerProc); - - pStatisticsManagerProc->setStatistics(m_pParams->getStatistics()); -} - -ProcGUIAdvance::~ProcGUIAdvance() -{} - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUISeize -// -------------------------------------------------------------------------------- -ProcGUISeize::ProcGUISeize(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser, const LPRPShapeDataBlockProcess& pParams) - : ProcGUIBlock(pProcess, rdo::format("%s Seize", pParams->getName().c_str())) - , m_pParams (pParams) -{ - ASSERT(pProcess ); - ASSERT(pParser ); - ASSERT(m_pParams); - - const RPShapeDataBlockProcess::ResNameList& resNameList = m_pParams->getResNameList(); - for (const auto& name: resNameList) - { - addResourceName(name); - pProcess->addResNameToBlock(name); - const std::string resName = name; - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(pParser); - rdo::compiler::mbuilder::RDOResType rtp; - //! Если ресурс существует, берем его тип и проверяем - if (rssList[resName].exist()) - { - rtp = rssList[resName].getType(); - if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp, parser::RDOParserSrcInfo())) - { - //! \todo переделать - if (!rssList[resName].checkParserResourceType(pParser)) - { - rdo::compiler::mbuilder::BlockForSeize::reobjectRes(rtp, resName); - } - } - } - else - { - //! Ресурс не найден, сформировать имя типа по имени ресурса - //! Сформировать имя типа по имени ресурса - const std::string rtpName(ProcGUIProcess::s_namePrefix + resName + ProcGUIProcess::s_nameSufix); - //! Получили список всех типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(pParser); - //! Нашли тип ресурса - if (rtpList[rtpName].exist()) - { - rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtpName]; - if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp_, parser::RDOParserSrcInfo())) - { - rdo::compiler::mbuilder::BlockForSeize::createRes(rtp_, resName); - } - } - else - { - rtp = rdo::compiler::mbuilder::BlockForSeize::createType(rtpName, parser::RDOParserSrcInfo()); - rdo::compiler::mbuilder::BlockForSeize::createRes(rtp, resName); - } - } - } -} - -ProcGUISeize::~ProcGUISeize() -{} - -void ProcGUISeize::createRuntime(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser) -{ - ASSERT(pProcess); - ASSERT(pParser ); - - for (const auto& name: m_resNameList) - { - parser::LPRDORSSResource pResource = pParser->findRSSResource(name); - if (pResource) - { - const std::string resName = pResource->name(); - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(pParser); - //! Создадим тип ресурса - rdo::compiler::mbuilder::RDOResType rtp = rssList[resName].getType(); - //! "Состояние" - const std::string rtpParamName = rdo::runtime::RDOPROCBlockForSeize::getStateParamName(); - //! проверим его на наличие перечислимого параметра - if (!rtp.m_params[rtpParamName].exist()) - { - pParser->error().error(rtp.src_info(), rdo::format("У типа ресурса '%s' нет параметра перечислимого типа '%s'", rtp.name().c_str(), rtpParamName.c_str())); - } - rdo::runtime::parser_for_Seize bbb; - bbb.Id_res = pResource->getID(); - bbb.Id_param = rtp.m_params[rtpParamName].id(); - m_parserForRuntime.push_back(bbb); - } - else - { - pParser->error().error(parser::RDOParserSrcInfo(), rdo::format("Внутренняя ошибка ProcGUISeize: не нашли parser-ресурс '%s'", name.c_str())); - } - } - if (!m_parserForRuntime.empty()) - { - m_pBlock = rdo::Factory::create(pProcess->getProcess().object_dynamic_cast(), m_parserForRuntime); - ASSERT(m_pBlock); - } - else - { - pParser->error().error(parser::RDOParserSrcInfo(), "Внутренняя ошибка: блок Seize не содержит ресурсов"); - } -} - -void ProcGUISeize::addResourceName(const std::string& name) -{ - ASSERT(!name.empty()); - m_resNameList.push_back(name); -} - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIRelease -// -------------------------------------------------------------------------------- -ProcGUIRelease::ProcGUIRelease(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser, const LPRPShapeDataBlockProcess& pParams) - : ProcGUIBlock(pProcess, rdo::format("%s Release", pParams->getName().c_str())) - , m_pParams (pParams) -{ - ASSERT(pProcess ); - ASSERT(pParser ); - ASSERT(m_pParams); - - const RPShapeDataBlockProcess::ResNameList& resNameList = m_pParams->getResNameList(); - for (const auto& name: resNameList) - { - addResourceName(name); - pProcess->addResNameToBlock(name); - const std::string resName = name; - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(pParser); - rdo::compiler::mbuilder::RDOResType rtp; - //! Если ресурс существует, берем его тип и проверяем - if (rssList[resName].exist()) - { - rtp = rssList[resName].getType(); - if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp, parser::RDOParserSrcInfo())) - { - //! \todo переделать - if (!rssList[resName].checkParserResourceType(pParser)) - { - rdo::compiler::mbuilder::BlockForSeize::reobjectRes(rtp, resName); - } - } - } - else - { - //! Ресурс не найден, сформировать имя типа по имени ресурса - //! Сформировать имя типа по имени ресурса - const std::string rtpName(ProcGUIProcess::s_namePrefix + resName + ProcGUIProcess::s_nameSufix); - //! Получили список всех типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(pParser); - //! Нашли тип ресурса - if (rtpList[rtpName].exist()) - { - rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtpName]; - if (rdo::compiler::mbuilder::BlockForSeize::checkType(rtp_, parser::RDOParserSrcInfo())) - { - rdo::compiler::mbuilder::BlockForSeize::createRes(rtp_, resName); - } - } - else - { - rtp = rdo::compiler::mbuilder::BlockForSeize::createType(rtpName, parser::RDOParserSrcInfo()); - rdo::compiler::mbuilder::BlockForSeize::createRes(rtp, resName); - } - } - } -} - -ProcGUIRelease::~ProcGUIRelease() -{} - -void ProcGUIRelease::createRuntime(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser) -{ - ASSERT(pProcess); - ASSERT(pParser ); - - for (const auto& name: m_resNameList) - { - parser::LPRDORSSResource pResource = pParser->findRSSResource(name); - if (pResource) - { - const std::string resName = pResource->name(); - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(pParser); - //! Создадим тип ресурса - rdo::compiler::mbuilder::RDOResType rtp = rssList[resName].getType(); - //! "Состояние" - const std::string rtpParamName = rdo::runtime::RDOPROCBlockForSeize::getStateParamName(); - //! проверим его на наличие перечислимого параметра - if (!rtp.m_params[rtpParamName].exist()) - { - pParser->error().error(rtp.src_info(), rdo::format("У типа ресурса '%s' нет параметра перечислимого типа '%s'", rtp.name().c_str(), rtpParamName.c_str())); - } - rdo::runtime::parser_for_Seize bbb; - bbb.Id_res = pResource->getID(); - bbb.Id_param = rtp.m_params[rtpParamName].id(); - m_parserForRuntime.push_back(bbb); - } - else - { - pParser->error().error(parser::RDOParserSrcInfo(), rdo::format("Внутренняя ошибка ProcGUIRelease: не нашли parser-ресурс '%s'", name.c_str())); - } - } - if (!m_parserForRuntime.empty()) - { - m_pBlock = rdo::Factory::create(pProcess->getProcess().object_dynamic_cast(), m_parserForRuntime); - ASSERT(m_pBlock); - } - else - { - pParser->error().error(parser::RDOParserSrcInfo(), "Внутренняя ошибка: блок Release не содержит ресурсов"); - } -} - -void ProcGUIRelease::addResourceName(const std::string& name) -{ - ASSERT(!name.empty()); - m_resNameList.push_back(name); -} - -// -------------------------------------------------------------------------------- -// -------------------- RDOPROCQueue -// -------------------------------------------------------------------------------- -ProcGUIQueue::ProcGUIQueue(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser, const std::string& name) - : ProcGUIBlock (pProcess, rdo::format("%s Queue", name.c_str())) - , m_resourceName(name) -{ - ASSERT(pProcess); - ASSERT(pParser ); - - pProcess->addResNameToBlock(m_resourceName); - // Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(pParser); - //! Получили список всех типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(pParser); - rdo::compiler::mbuilder::RDOResType rtp; - const std::string rtpName = "QDEPART"; - const std::string queueName = "Очередь_" + m_resourceName; - //! Если ресурс существует, берем его тип и проверяем - if (rssList[m_resourceName].exist()) - { - rtp = rssList[m_resourceName].getType(); - rdo::compiler::mbuilder::BlockForQueue::checkType(rtp, parser::RDOParserSrcInfo()); - parser::LPRDOPMDWatchPar pResult = rdo::Factory::create(parser::RDOParserSrcInfo(queueName)); - ASSERT(pResult); - pResult->init(false, parser::RDOParserSrcInfo(m_resourceName), parser::RDOParserSrcInfo(std::string("длина_очереди"))); - } - else - { - //! Если тип "QDEPART" существует - if (rtpList[rtpName].exist()) - { - rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtpName]; - if (rdo::compiler::mbuilder::BlockForQueue::checkType(rtp_, parser::RDOParserSrcInfo())) - { - rdo::compiler::mbuilder::BlockForQueue::createRes(rtp_, m_resourceName); - parser::LPRDOPMDWatchPar pResult = rdo::Factory::create(parser::RDOParserSrcInfo(queueName)); - ASSERT(pResult); - pResult->init(false, parser::RDOParserSrcInfo(m_resourceName), parser::RDOParserSrcInfo(std::string("длина_очереди"))); - } - } - else - { - rdo::compiler::mbuilder::RDOResType rtp_ = rdo::compiler::mbuilder::BlockForQueue::createType(rtpName, parser::RDOParserSrcInfo()); - if (rdo::compiler::mbuilder::BlockForQueue::checkType(rtp_, parser::RDOParserSrcInfo())) - { - rdo::compiler::mbuilder::BlockForQueue::createRes(rtp_, m_resourceName); - parser::LPRDOPMDWatchPar pResult = rdo::Factory::create(parser::RDOParserSrcInfo(queueName)); - ASSERT(pResult); - pResult->init(false, parser::RDOParserSrcInfo(m_resourceName), parser::RDOParserSrcInfo(std::string("длина_очереди"))); - } - } - } -} - -ProcGUIQueue::~ProcGUIQueue() -{} - -void ProcGUIQueue::createRuntime(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser) -{ - ASSERT(pProcess); - ASSERT(pParser ); - - parser::LPRDORSSResource pResource = pParser->findRSSResource(m_resourceName); - if (pResource) - { - const std::string resName = pResource->name(); - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(pParser); - //! Создадим тип ресурса - rdo::compiler::mbuilder::RDOResType rtp = rssList[resName].getType(); - //! "длина_очереди" - const std::string rtpParamName = rdo::runtime::RDOPROCQueue::getQueueParamName(); - m_parserForRuntime.Id_res = pResource->getID(); - m_parserForRuntime.Id_param = rtp.m_params[rtpParamName].id(); - } - else - { - pParser->error().error(parser::RDOParserSrcInfo(), rdo::format("Внутренняя ошибка ProcGUIQueue: не нашли parser-ресурс '%s'", m_resourceName.c_str())); - } - m_pBlock = rdo::Factory::create(pProcess->getProcess().object_dynamic_cast(), m_parserForRuntime); - ASSERT(m_pBlock); -} - - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIDepart -// -------------------------------------------------------------------------------- -ProcGUIDepart::ProcGUIDepart(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser, const std::string& name) - : ProcGUIBlock (pProcess, rdo::format("%s Depart", name.c_str())) - , m_resourceName(name) -{ - ASSERT(pProcess); - ASSERT(pParser ); - - pProcess->addResNameToBlock(m_resourceName); - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(pParser); - //! Получили список всех типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList rtpList(pParser); - rdo::compiler::mbuilder::RDOResType rtp; - const std::string rtpName = "QDEPART"; - //! Если ресурс существует, берем его тип и проверяем - if (rssList[m_resourceName].exist()) - { - rtp = rssList[m_resourceName].getType(); - rdo::compiler::mbuilder::BlockForQueue::checkType(rtp, parser::RDOParserSrcInfo()); - } - else - { - if (rtpList[rtpName].exist()) - { - rdo::compiler::mbuilder::RDOResType rtp_ = rtpList[rtpName]; - if (rdo::compiler::mbuilder::BlockForQueue::checkType(rtp_, parser::RDOParserSrcInfo())) - { - rdo::compiler::mbuilder::BlockForQueue::createRes(rtp_, m_resourceName); - } - } - else - { - rdo::compiler::mbuilder::RDOResType rtp_ = rdo::compiler::mbuilder::BlockForQueue::createType(rtpName, parser::RDOParserSrcInfo()); - if (rdo::compiler::mbuilder::BlockForQueue::checkType(rtp_, parser::RDOParserSrcInfo())) - { - rdo::compiler::mbuilder::BlockForQueue::createRes(rtp_, m_resourceName); - } - } - } -} - -ProcGUIDepart::~ProcGUIDepart() -{} - -void ProcGUIDepart::createRuntime(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser) -{ - ASSERT(pProcess); - ASSERT(pParser ); - - parser::LPRDORSSResource pResource = pParser->findRSSResource(m_resourceName); - if (pResource) - { - const std::string resName = pResource->name(); - //! Получили список всех ресурсов - rdo::compiler::mbuilder::RDOResourceList rssList(pParser); - //! Создадим тип ресурса - rdo::compiler::mbuilder::RDOResType rtp = rssList[resName].getType(); - //! "длина_очереди" - const std::string rtpParamName = rdo::runtime::RDOPROCDepart::getDepartParamName(); - m_parserForRuntime.Id_res = pResource->getID(); - m_parserForRuntime.Id_param = rtp.m_params[rtpParamName].id(); - } - else - { - pParser->error().error(parser::RDOParserSrcInfo(), rdo::format("Внутренняя ошибка ProcGUIDepart: не нашли parser-ресурс '%s'", m_resourceName.c_str())); - } - m_pBlock = rdo::Factory::create(pProcess->getProcess().object_dynamic_cast(), m_parserForRuntime); - ASSERT(m_pBlock); -} - -CLOSE_COMPILER_GUI_NAMESPACE diff --git a/simulator/compiler/procgui/procgui.h b/simulator/compiler/procgui/procgui.h deleted file mode 100644 index d85a7eda9..000000000 --- a/simulator/compiler/procgui/procgui.h +++ /dev/null @@ -1,238 +0,0 @@ -#ifndef _SIMULATOR_COMPILER_GUI_PROCGUI_H_ -#define _SIMULATOR_COMPILER_GUI_PROCGUI_H_ - -// ----------------------------------------------------------------------- INCLUDES -// ----------------------------------------------------------------------- SYNOPSIS -#include "simulator/runtime/rdo_runtime.h" -#include "simulator/compiler/parser/rdoparser.h" -#include "simulator/compiler/procgui/namespace.h" -#include "simulator/compiler/procgui/procgui_datablock.h" -// -------------------------------------------------------------------------------- - -OPEN_COMPILER_GUI_NAMESPACE - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUICalc -// -------------------------------------------------------------------------------- -class ProcGUICalc -{ -public: - rdo::runtime::LPRDOCalcConst getConstCalc(double arg); - rdo::runtime::LPRDOCalcFunctionCaller getNormalCalc(std::size_t base, double arg1, double arg2); - rdo::runtime::LPRDOCalcFunctionCaller getUniformCalc(std::size_t base, double arg1, double arg2); - rdo::runtime::LPRDOCalcFunctionCaller getExpCalc(std::size_t base, double arg); - rdo::runtime::LPRDOCalcFunctionCaller getTriangularCalc(std::size_t base, double arg1, double arg2, double arg3); - rdo::runtime::LPRDOCalc getCalc(); - -protected: - ProcGUICalc(const rdo::runtime::LPRDORuntime& pRuntime, const LPRPShapeDataBlock& pParams); - virtual ~ProcGUICalc(); - -private: - rdo::runtime::LPRDORuntime m_pRuntime; - LPRPShapeDataBlock m_pParams; - rdo::runtime::LPRDOCalc m_pCalc; -}; - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIProcess -// -------------------------------------------------------------------------------- -PREDECLARE_POINTER(ProcGUIBlock); - -PREDECLARE_POINTER(ProcGUIProcess); -class ProcGUIProcess: public rdo::counter_reference -{ -DECLARE_FACTORY(ProcGUIProcess); -public: - typedef std::list BlockList; - typedef std::list ResNameList; - - static std::string s_namePrefix; - static std::string s_nameSufix; - - void clear(); - void insertBlock(const LPProcGUIBlock& pBlock ); - void initResources(const parser::LPRDOParser& pParser); - void addResNameToBlock(const std::string& name); - const LPILogic& getProcess () const { return m_pProcess; } - -private: - ProcGUIProcess(const rdo::runtime::LPRDORuntime& pRuntime); - virtual ~ProcGUIProcess(); - - rdo::runtime::LPRDORuntime m_pRuntime; - LPILogic m_pProcess; - BlockList m_blockList; - ResNameList m_resNameList; -}; - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIBlock -// -------------------------------------------------------------------------------- -PREDECLARE_POINTER(ProcGUIBlock); -class ProcGUIBlock: public rdo::counter_reference -{ -DECLARE_FACTORY(ProcGUIBlock); -protected: - ProcGUIBlock(const LPProcGUIProcess& pProcess, const std::string& name); - virtual ~ProcGUIBlock(); - -private: - std::string m_name; -}; - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIBlockGenerate -// -------------------------------------------------------------------------------- -PREDECLARE_POINTER(ProcGUIBlockGenerate); -class ProcGUIBlockGenerate - : public ProcGUIBlock - , public ProcGUICalc -{ -DECLARE_FACTORY(ProcGUIBlockGenerate); -private: - ProcGUIBlockGenerate(const LPProcGUIProcess& pProcess, const rdo::runtime::LPRDORuntime& pRuntime, const parser::LPRDOParser& pParser, const LPRPShapeDataBlockCreate& pParams); - virtual ~ProcGUIBlockGenerate(); - - LPIPROCBlock m_pBlock; - LPRPShapeDataBlockCreate m_pParams; -}; - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIBlockTerminate -// -------------------------------------------------------------------------------- -PREDECLARE_POINTER(ProcGUIBlockTerminate); -class ProcGUIBlockTerminate: public ProcGUIBlock -{ -DECLARE_FACTORY(ProcGUIBlockTerminate); -private: - ProcGUIBlockTerminate(const LPProcGUIProcess& pProcess, const LPRPShapeDataBlockTerminate& pParams); - virtual ~ProcGUIBlockTerminate(); - - LPIPROCBlock m_pBlock; - LPRPShapeDataBlockTerminate m_pParams; -}; - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIBlockProcess -// -------------------------------------------------------------------------------- -PREDECLARE_POINTER(ProcGUIBlockProcess); -class ProcGUIBlockProcess: public ProcGUIBlock -{ -DECLARE_FACTORY(ProcGUIBlockProcess); -private: - ProcGUIBlockProcess(const LPProcGUIProcess& pProcess, const rdo::runtime::LPRDORuntime& pRuntime, const parser::LPRDOParser& pParser, const LPRPShapeDataBlockProcess& pParams); - virtual ~ProcGUIBlockProcess(); - - LPProcGUIBlock m_pBlock; - LPRPShapeDataBlockProcess m_pParams; -}; - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIAdvance -// -------------------------------------------------------------------------------- -PREDECLARE_POINTER(ProcGUIAdvance); -class ProcGUIAdvance - : public ProcGUIBlock - , public ProcGUICalc -{ -DECLARE_FACTORY(ProcGUIAdvance); -private: - ProcGUIAdvance(const LPProcGUIProcess& pProcess, const rdo::runtime::LPRDORuntime& pRuntime, const LPRPShapeDataBlockProcess& pParams); - virtual ~ProcGUIAdvance(); - - LPIPROCBlock m_pBlock; - LPRPShapeDataBlockProcess m_pParams; -}; - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUISeize -// -------------------------------------------------------------------------------- -PREDECLARE_POINTER(ProcGUISeize); -class ProcGUISeize: public ProcGUIBlock -{ -DECLARE_FACTORY(ProcGUISeize); -public: - void createRuntime(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser); - void addResourceName(const std::string& name); - -private: - ProcGUISeize(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser, const LPRPShapeDataBlockProcess& pParams); - virtual ~ProcGUISeize(); - - typedef std::list ResNameList; - typedef std::vector TODO_parser_for_Seize; - - LPIPROCBlock m_pBlock; - LPRPShapeDataBlockProcess m_pParams; - ResNameList m_resNameList; - TODO_parser_for_Seize m_parserForRuntime; -}; - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIRelease -// -------------------------------------------------------------------------------- -PREDECLARE_POINTER(ProcGUIRelease); -class ProcGUIRelease: public ProcGUIBlock -{ -DECLARE_FACTORY(ProcGUIRelease); -public: - void createRuntime(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser); - void addResourceName(const std::string& name); - -private: - ProcGUIRelease(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser, const LPRPShapeDataBlockProcess& pParams); - virtual ~ProcGUIRelease(); - - typedef std::list ResNameList; - typedef std::vector TODO_parser_for_Seize; - - LPIPROCBlock m_pBlock; - LPRPShapeDataBlockProcess m_pParams; - ResNameList m_resNameList; - TODO_parser_for_Seize m_parserForRuntime; -}; - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIQueue -// -------------------------------------------------------------------------------- -PREDECLARE_POINTER(ProcGUIQueue); -class ProcGUIQueue: public ProcGUIBlock -{ -DECLARE_FACTORY(ProcGUIQueue); -public: - void createRuntime(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser); - void setResource(const std::string& name); - -private: - ProcGUIQueue(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser, const std::string& name); - virtual ~ProcGUIQueue(); - - std::string m_resourceName; - LPIPROCBlock m_pBlock; - rdo::runtime::parser_for_Queue m_parserForRuntime; -}; - -// -------------------------------------------------------------------------------- -// -------------------- ProcGUIDepart -// -------------------------------------------------------------------------------- -PREDECLARE_POINTER(ProcGUIDepart); -class ProcGUIDepart: public ProcGUIBlock -{ -DECLARE_FACTORY(ProcGUIDepart); -public: - void createRuntime(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser); - void setResource(const std::string& name); - -private: - ProcGUIDepart(const LPProcGUIProcess& pProcess, const parser::LPRDOParser& pParser, const std::string& name); - virtual ~ProcGUIDepart(); - - std::string m_resourceName; - LPIPROCBlock m_pBlock; - rdo::runtime::parser_for_Queue m_parserForRuntime; -}; - -CLOSE_COMPILER_GUI_NAMESPACE - -#endif // _SIMULATOR_COMPILER_GUI_PROCGUI_H_ diff --git a/simulator/compiler/procgui/procgui_datablock.cpp b/simulator/compiler/procgui/procgui_datablock.cpp deleted file mode 100644 index baa6c7e16..000000000 --- a/simulator/compiler/procgui/procgui_datablock.cpp +++ /dev/null @@ -1,116 +0,0 @@ -// ---------------------------------------------------------------------------- PCH -#include "simulator/compiler/procgui/pch.h" -// ----------------------------------------------------------------------- INCLUDES -#include -// ----------------------------------------------------------------------- SYNOPSIS -#include "simulator/compiler/procgui/procgui_datablock.h" -// -------------------------------------------------------------------------------- - -OPEN_COMPILER_GUI_NAMESPACE - -// -------------------------------------------------------------------------------- -// -------------------- RPShapeDataBlock -// -------------------------------------------------------------------------------- -RPShapeDataBlock::RPShapeDataBlock(RPShapeDataBlock::zakonRaspr zakon, const std::string& name) - : m_zakon(zakon) - , m_name (name ) -{} - -void RPShapeDataBlock::setDisp(double disp) -{ - m_disp=disp; -} - -void RPShapeDataBlock::setExp(double exp) -{ - m_exp=exp; -} - -void RPShapeDataBlock::setBase(int base) -{ - m_base=base; -} - -void RPShapeDataBlock::setMax(double max) -{ - m_max=max; -} - -// -------------------------------------------------------------------------------- -// -------------------- RPShapeDataBlockCreate -// -------------------------------------------------------------------------------- -RPShapeDataBlockCreate::RPShapeDataBlockCreate(RPShapeDataBlock::zakonRaspr zakon, const std::string& name) - : RPShapeDataBlock(zakon, name) -{} - -RPShapeDataBlockCreate::~RPShapeDataBlockCreate() -{} - -void RPShapeDataBlockCreate::setAmount(boost::optional amount) -{ - m_amount = amount; -} - -void RPShapeDataBlockCreate::setStatistics(const rdo::runtime::LPIInternalStatistics& pStatistics) -{ - m_pStatistics = pStatistics; -} - -// -------------------------------------------------------------------------------- -// -------------------- RPShapeDataBlockTerminate -// -------------------------------------------------------------------------------- -RPShapeDataBlockTerminate::RPShapeDataBlockTerminate(const std::string& name) - :m_name(name) -{} - -RPShapeDataBlockTerminate::~RPShapeDataBlockTerminate() -{} - -void RPShapeDataBlockTerminate::setTermInc(int term_inc) -{ - m_term_inc = term_inc; -} - -void RPShapeDataBlockTerminate::setStatistics(const rdo::runtime::LPIInternalStatistics& pStatistics) -{ - m_pStatistics = pStatistics; -} - -// -------------------------------------------------------------------------------- -// -------------------- RPShapeDataBlockProcess -// -------------------------------------------------------------------------------- -RPShapeDataBlockProcess::RPShapeDataBlockProcess(RPShapeDataBlock::zakonRaspr zakon, const std::string& name) - : RPShapeDataBlock(zakon,name) -{} - -RPShapeDataBlockProcess::~RPShapeDataBlockProcess() -{} - -void RPShapeDataBlockProcess::addAction(RPShapeDataBlockProcess::Action action) -{ - m_actionList.push_back(action); -} - -void RPShapeDataBlockProcess::addRes(const std::string& resName) -{ - ASSERT(std::find(m_resNameList.begin(), m_resNameList.end(), resName) == m_resNameList.end()); - - m_resNameList.push_back(resName); -} - -const RPShapeDataBlockProcess::ActionList& RPShapeDataBlockProcess::getActionList() const -{ - return m_actionList; -} - -const RPShapeDataBlockProcess::ResNameList& RPShapeDataBlockProcess::getResNameList() const -{ - return m_resNameList; -} - -void RPShapeDataBlockProcess::setStatistics(const rdo::runtime::LPIInternalStatistics& pStatistics) -{ - m_pStatistics = pStatistics; -} - -CLOSE_COMPILER_GUI_NAMESPACE diff --git a/simulator/compiler/procgui/procgui_datablock.h b/simulator/compiler/procgui/procgui_datablock.h deleted file mode 100644 index a4439671b..000000000 --- a/simulator/compiler/procgui/procgui_datablock.h +++ /dev/null @@ -1,141 +0,0 @@ -#ifndef _SIMULATOR_COMPILER_GUI_DATABLOCK_H_ -#define _SIMULATOR_COMPILER_GUI_DATABLOCK_H_ - -// ----------------------------------------------------------------------- INCLUDES -#include -#include -// ----------------------------------------------------------------------- SYNOPSIS -#include "utils/src/smart_ptr/intrusive_ptr/intrusive_ptr.h" -#include "simulator/compiler/procgui/namespace.h" -#include "simulator/runtime/process/generate.h" -// -------------------------------------------------------------------------------- - -OPEN_COMPILER_GUI_NAMESPACE - -// -------------------------------------------------------------------------------- -// -------------------- RPShapeDataBlock -// -------------------------------------------------------------------------------- -PREDECLARE_POINTER(RPShapeDataBlock); -class RPShapeDataBlock: public rdo::counter_reference -{ -DECLARE_FACTORY(RPShapeDataBlock); -public: - enum zakonRaspr - { - Const, - Normal, - Uniform, - Exp, - Triangular - }; - - void setBase(int base); - void setDisp(double disp); - void setExp(double exp); - void setMax(double max); - - zakonRaspr getZakon() const { return m_zakon; } - const std::string& getName () const { return m_name; } - int getBase() const { return m_base; } - double getDisp() const { return m_disp; } - double getExp() const { return m_exp; } - double getMax() const { return m_max; } - -protected: - RPShapeDataBlock(zakonRaspr zakon, const std::string& name); - virtual ~RPShapeDataBlock() {} - - zakonRaspr m_zakon; - std::string m_name; - int m_base; - double m_exp; - double m_disp; - double m_max; -}; - -// -------------------------------------------------------------------------------- -// -------------------- RPShapeDataBlockCreate -// -------------------------------------------------------------------------------- -class RPShapeDataBlockCreate: public RPShapeDataBlock -{ -DECLARE_FACTORY(RPShapeDataBlockCreate) -public: - boost::optional getAmount() const { return m_amount; } - void setAmount(boost::optional amount); - - const rdo::runtime::LPIInternalStatistics& getStatistics() const { return m_pStatistics; } - void setStatistics(const rdo::runtime::LPIInternalStatistics& pStatistics); - -private: - RPShapeDataBlockCreate(RPShapeDataBlock::zakonRaspr zakon, const std::string& name); - virtual ~RPShapeDataBlockCreate(); - - boost::optional m_amount; - rdo::runtime::LPIInternalStatistics m_pStatistics; -}; -DECLARE_POINTER(RPShapeDataBlockCreate); - -// -------------------------------------------------------------------------------- -// -------------------- RPShapeDataBlockTerminate -// -------------------------------------------------------------------------------- -PREDECLARE_POINTER(RPShapeDataBlockTerminate); -class RPShapeDataBlockTerminate: public rdo::counter_reference -{ -DECLARE_FACTORY(RPShapeDataBlockTerminate) -public: - void setTermInc(int term_inc); - int getTermInc() const { return m_term_inc; } - std::string getName() const { return m_name; } - - const rdo::runtime::LPIInternalStatistics& getStatistics() const { return m_pStatistics; } - void setStatistics(const rdo::runtime::LPIInternalStatistics& pStatistics); - -private: - RPShapeDataBlockTerminate(const std::string& name); - virtual ~RPShapeDataBlockTerminate(); - - int m_term_inc; - std::string m_name; - rdo::runtime::LPIInternalStatistics m_pStatistics; -}; - -// -------------------------------------------------------------------------------- -// -------------------- RPShapeDataBlockProcess -// -------------------------------------------------------------------------------- -class RPShapeDataBlockProcess: public RPShapeDataBlock -{ -DECLARE_FACTORY(RPShapeDataBlockProcess) -public: - enum Action - { - A_ADVANCE, - A_SEIZE, - A_RELEASE - }; - - typedef std::list ActionList; - typedef std::list ResNameList; - - void addAction(Action action); - void addRes(const std::string& res); - - const ActionList& getActionList () const; - const ResNameList& getResNameList() const; - - const rdo::runtime::LPIInternalStatistics& getStatistics() const { return m_pStatistics; } - void setStatistics(const rdo::runtime::LPIInternalStatistics& pStatistics); - -private: - RPShapeDataBlockProcess(RPShapeDataBlock::zakonRaspr zakon, const std::string& name); - virtual ~RPShapeDataBlockProcess(); - - ActionList m_actionList; - ResNameList m_resNameList; - - rdo::runtime::LPIInternalStatistics m_pStatistics; -}; -DECLARE_POINTER(RPShapeDataBlockProcess); - -CLOSE_COMPILER_GUI_NAMESPACE - -#endif // _SIMULATOR_COMPILER_GUI_DATABLOCK_H_ diff --git a/simulator/report/CMakeLists.txt b/simulator/report/CMakeLists.txt index 0b19b1a00..4d143cd3b 100644 --- a/simulator/report/CMakeLists.txt +++ b/simulator/report/CMakeLists.txt @@ -10,7 +10,7 @@ INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) -FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/*.cpp) +FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/*.cpp src/*.h) ADD_LIBRARY(rdo_simulator_report STATIC ${SOURCE_FILES}) INCLUDE(${PROJECT_SOURCE_DIR}/simulator/simulator.cmake) diff --git a/simulator/report/src/build_edit_line_info.cpp b/simulator/report/src/build_edit_line_info.cpp index 27e6c9040..6a72772f3 100644 --- a/simulator/report/src/build_edit_line_info.cpp +++ b/simulator/report/src/build_edit_line_info.cpp @@ -11,20 +11,20 @@ namespace report { namespace { - const std::string WARNING_STRING("предупреждение"); - const std::string ERROR_STRING("ошибка"); + const std::string WARNING_STRING("предупреждение"); + const std::string ERROR_STRING("ошибка"); } -BuildEditLineInfo::BuildEditLineInfo(const std::string& text, rdo::model::FileType file, std::size_t line, std::size_t pos, Type type) - : LogEditLineInfo(text, file, line, pos, type) +BuildEditLineInfo::BuildEditLineInfo(const std::string& text, rdo::FileType file, std::size_t line, std::size_t pos, Type type) + : LogEditLineInfo(text, file, line, pos, type) {} BuildEditLineInfo::BuildEditLineInfo(const FileMessage& message) - : LogEditLineInfo(message) + : LogEditLineInfo(message) {} BuildEditLineInfo::BuildEditLineInfo(const std::string& message) - : LogEditLineInfo(message) + : LogEditLineInfo(message) {} BuildEditLineInfo::~BuildEditLineInfo() @@ -32,17 +32,17 @@ BuildEditLineInfo::~BuildEditLineInfo() std::string BuildEditLineInfo::getMessage() const { - if (isSimpleTextMessage()) - { - return getText(); - } - else - { - const std::string file = rdo::model::getFileTypeString(getFileType()); - const std::string error = (getType() == FileMessage::MT_WARNING) ? WARNING_STRING : ERROR_STRING; - const std::string text = rdo::format("%s (%d): %s: %s", file.c_str(), getLineNumber() + 1, error.c_str(), getText().c_str()); - return text; - } + if (isSimpleTextMessage()) + { + return getText(); + } + else + { + const std::string file = rdo::getFileTypeString(getFileType()); + const std::string error = (getType() == FileMessage::Type::MESSAGE_WARNING) ? WARNING_STRING : ERROR_STRING; + const std::string text = rdo::format("%s (%d): %s: %s", file.c_str(), getLineNumber() + 1, error.c_str(), getText().c_str()); + return text; + } } }}} // namespace rdo::simulation::report diff --git a/simulator/report/src/build_edit_line_info.h b/simulator/report/src/build_edit_line_info.h index 3038c95f4..5bb14066e 100644 --- a/simulator/report/src/build_edit_line_info.h +++ b/simulator/report/src/build_edit_line_info.h @@ -1,5 +1,4 @@ -#ifndef _BUILD_EDIT_LINE_INFO_H_ -#define _BUILD_EDIT_LINE_INFO_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -14,14 +13,12 @@ namespace report { class BuildEditLineInfo: public LogEditLineInfo { public: - BuildEditLineInfo(const std::string& text, rdo::model::FileType file, std::size_t line, std::size_t pos, Type type); - explicit BuildEditLineInfo(const FileMessage& message); - explicit BuildEditLineInfo(const std::string& message); - virtual ~BuildEditLineInfo(); + BuildEditLineInfo(const std::string& text, rdo::FileType file, std::size_t line, std::size_t pos, Type type); + explicit BuildEditLineInfo(const FileMessage& message); + explicit BuildEditLineInfo(const std::string& message); + virtual ~BuildEditLineInfo(); - virtual std::string getMessage() const; + virtual std::string getMessage() const; }; }}} // namespace rdo::simulation::report - -#endif // _BUILD_EDIT_LINE_INFO_H_ diff --git a/simulator/report/src/error_code.h b/simulator/report/src/error_code.h index 779daf9ca..320326c19 100644 --- a/simulator/report/src/error_code.h +++ b/simulator/report/src/error_code.h @@ -1,5 +1,4 @@ -#ifndef _SIMULATOR_REPORT_ERROR_CODE_H_ -#define _SIMULATOR_REPORT_ERROR_CODE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,17 +8,14 @@ namespace rdo { namespace simulation { namespace report { -//! Код окончания компиляции или прогона модели -enum RDOExitCode +enum class ExitCode { - EC_OK = 0, //!< Модель скомпилировалась или завершилась без ошибок - EC_ParserError, //!< Компиляция завершилась с ошибкой - EC_RunTimeError, //!< Прогон модели завершился с ошибкой - EC_UserBreak, //!< Модель остановлена пользователем - EC_ModelNotFound, //!< Файл прогона модели не найден - EC_NoMoreEvents //!< Модель завершилась потому, что больше нечего моделировать + OK = 0, + PARSER_ERROR, + RUNTIME_ERROR, + USER_BREAK, + MODEL_NOTFOUND, + NOMORE_EVENTS }; }}} // namespace rdo::simulation::report - -#endif // _SIMULATOR_REPORT_ERROR_CODE_H_ diff --git a/simulator/report/src/file_message.cpp b/simulator/report/src/file_message.cpp index 1698a338f..344705dc6 100644 --- a/simulator/report/src/file_message.cpp +++ b/simulator/report/src/file_message.cpp @@ -7,42 +7,42 @@ namespace rdo { namespace simulation { namespace report { -FileMessage::FileMessage(const std::string& text, rdo::model::FileType file, std::size_t line, std::size_t pos, Type type) - : m_text(text) - , m_file(file) - , m_line(line) - , m_pos (pos ) - , m_type(type) +FileMessage::FileMessage(const std::string& text, rdo::FileType file, std::size_t line, std::size_t pos, Type type) + : m_text(text) + , m_file(file) + , m_line(line) + , m_pos (pos ) + , m_type(type) {} std::string FileMessage::getText() const { - return m_text; + return m_text; } -rdo::model::FileType FileMessage::getFileType() const +rdo::FileType FileMessage::getFileType() const { - return m_file; + return m_file; } std::size_t FileMessage::getLineNumber() const { - return m_line; + return m_line; } std::size_t FileMessage::getPosInLine() const { - return m_pos; + return m_pos; } FileMessage::Type FileMessage::getType() const { - return m_type; + return m_type; } void FileMessage::setText(const std::string& text) { - m_text = text; + m_text = text; } }}} // namespace rdo::simulation::report diff --git a/simulator/report/src/file_message.h b/simulator/report/src/file_message.h index de9e78fe1..c19183237 100644 --- a/simulator/report/src/file_message.h +++ b/simulator/report/src/file_message.h @@ -1,5 +1,4 @@ -#ifndef _SIMULATOR_REPORT_FILE_MESSAGE_H_ -#define _SIMULATOR_REPORT_FILE_MESSAGE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -11,40 +10,31 @@ namespace rdo { namespace simulation { namespace report { -//! Файловое сообщение class FileMessage { public: - enum Type - { - MT_ERROR = 0, - MT_WARNING - }; - - //! Конструктор сообщения - //! \param message - текст сообщение - //! \param file - файл, в котором найдена ошибка - //! \param line - номер строки с ошибкой - //! \param pos - позиция ошибки в строке - //! \param type - тип сообщения. Значение по умолчанию \b MT_ERROR - FileMessage(const std::string& text, rdo::model::FileType file, std::size_t line, std::size_t pos, Type type = MT_ERROR); - - std::string getText() const; - rdo::model::FileType getFileType() const; - std::size_t getLineNumber() const; - std::size_t getPosInLine() const; - Type getType () const; - - void setText(const std::string& text); + enum class Type + { + MESSAGE_ERROR = 0, + MESSAGE_WARNING + }; + + FileMessage(const std::string& text, rdo::FileType file, std::size_t line, std::size_t pos, Type type = Type::MESSAGE_ERROR); + + std::string getText() const; + rdo::FileType getFileType() const; + std::size_t getLineNumber() const; + std::size_t getPosInLine() const; + Type getType() const; + + void setText(const std::string& text); private: - std::string m_text; //!< Текст сообщения - rdo::model::FileType m_file; //!< Файл с ошибкой - std::size_t m_line; //!< Номер строки с ошибкой - std::size_t m_pos; //!< Позиция ошибки в строке - Type m_type; //!< Тип сообщения + std::string m_text; + rdo::FileType m_file; + std::size_t m_line; + std::size_t m_pos; + Type m_type; }; }}} // namespace rdo::simulation::report - -#endif // _SIMULATOR_REPORT_FILE_MESSAGE_H_ diff --git a/simulator/report/src/log_edit_line_info.cpp b/simulator/report/src/log_edit_line_info.cpp index ddef6aa65..130689ffd 100644 --- a/simulator/report/src/log_edit_line_info.cpp +++ b/simulator/report/src/log_edit_line_info.cpp @@ -8,22 +8,22 @@ namespace rdo { namespace simulation { namespace report { -LogEditLineInfo::LogEditLineInfo(const std::string& text, rdo::model::FileType file, std::size_t line, std::size_t pos, Type type) - : FileMessage(text, file, line, pos, type) - , m_posInLog(0) - , m_simpleTextMessage(false) +LogEditLineInfo::LogEditLineInfo(const std::string& text, rdo::FileType file, std::size_t line, std::size_t pos, Type type) + : FileMessage(text, file, line, pos, type) + , m_posInLog(0) + , m_simpleTextMessage(false) {} LogEditLineInfo::LogEditLineInfo(const FileMessage& message) - : FileMessage(message) - , m_posInLog(0) - , m_simpleTextMessage(false) + : FileMessage(message) + , m_posInLog(0) + , m_simpleTextMessage(false) {} LogEditLineInfo::LogEditLineInfo(const std::string& message) - : FileMessage(message, rdo::model::PAT, 0, 0) - , m_posInLog(0) - , m_simpleTextMessage(true) + : FileMessage(message, rdo::FileType::PAT, 0, 0) + , m_posInLog(0) + , m_simpleTextMessage(true) {} LogEditLineInfo::~LogEditLineInfo() @@ -31,31 +31,31 @@ LogEditLineInfo::~LogEditLineInfo() std::string LogEditLineInfo::getMessage() const { - if (m_simpleTextMessage) - { - return getText(); - } - else - { - const std::string file = rdo::model::getFileTypeString(getFileType()); - const std::string text = rdo::format("%s (%d): %s", file.c_str(), getLineNumber() + 1, getText().c_str()); - return text; - } + if (m_simpleTextMessage) + { + return getText(); + } + else + { + const std::string file = rdo::getFileTypeString(getFileType()); + const std::string text = rdo::format("%s (%d): %s", file.c_str(), getLineNumber() + 1, getText().c_str()); + return text; + } } bool LogEditLineInfo::isSimpleTextMessage() const { - return m_simpleTextMessage; + return m_simpleTextMessage; } std::size_t LogEditLineInfo::getPosInLog() const { - return m_posInLog; + return m_posInLog; } void LogEditLineInfo::setPosInLog(int posInLog) { - m_posInLog = posInLog; + m_posInLog = posInLog; } }}} // namespace rdo::simulation::report diff --git a/simulator/report/src/log_edit_line_info.h b/simulator/report/src/log_edit_line_info.h index fc965a8b0..83634e2d8 100644 --- a/simulator/report/src/log_edit_line_info.h +++ b/simulator/report/src/log_edit_line_info.h @@ -1,5 +1,4 @@ -#ifndef _LOG_EDIT_LINE_INFO_H_ -#define _LOG_EDIT_LINE_INFO_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,22 +12,20 @@ namespace report { class LogEditLineInfo : public FileMessage { public: - LogEditLineInfo(const std::string& text, rdo::model::FileType file, std::size_t line, std::size_t pos, Type type); - explicit LogEditLineInfo(const FileMessage& message); - explicit LogEditLineInfo(const std::string& message); - virtual ~LogEditLineInfo(); + LogEditLineInfo(const std::string& text, rdo::FileType file, std::size_t line, std::size_t pos, Type type); + explicit LogEditLineInfo(const FileMessage& message); + explicit LogEditLineInfo(const std::string& message); + virtual ~LogEditLineInfo(); - virtual std::string getMessage() const; - bool isSimpleTextMessage() const; + virtual std::string getMessage() const; + bool isSimpleTextMessage() const; - std::size_t getPosInLog() const; - void setPosInLog(int posInLog); + std::size_t getPosInLog() const; + void setPosInLog(int posInLog); private: - std::size_t m_posInLog; - bool m_simpleTextMessage; + std::size_t m_posInLog; + bool m_simpleTextMessage; }; }}} // namespace rdo::simulation::report - -#endif // _LOG_EDIT_LINE_INFO_H_ diff --git a/simulator/runtime/CMakeLists.txt b/simulator/runtime/CMakeLists.txt index 1aad28000..e2b3a522c 100644 --- a/simulator/runtime/CMakeLists.txt +++ b/simulator/runtime/CMakeLists.txt @@ -10,329 +10,330 @@ LINK_DIRECTORIES(${Boost_LIBRARY_DIRS}) INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) SET(CALC_FILES - calc/calc_array.cpp - calc/calc_array.h - calc/calc_base.cpp - calc/calc_base.h - calc/calc_event.cpp - calc/calc_event.h - calc/calc_pattern.cpp - calc/calc_pattern.h - calc/calc_process.h - calc/calc_process.cpp - calc/calc_sequence.cpp - calc/calc_sequence.h - calc/calc_sequence-inl.h - calc/calc_watch.cpp - calc/calc_watch.h + calc/calc_array.cpp + calc/calc_array.h + calc/calc_base.cpp + calc/calc_base.h + calc/calc_event.cpp + calc/calc_event.h + calc/calc_pattern.cpp + calc/calc_pattern.h + calc/calc_process.h + calc/calc_process.cpp + calc/calc_sequence.cpp + calc/calc_sequence.h + calc/calc_sequence-inl.h + calc/calc_watch.cpp + calc/calc_watch.h ) SET(CALC_FUNCTION_FILES - calc/function/calc_function.cpp - calc/function/calc_function.h - calc/function/calc_function_internal.cpp - calc/function/calc_function_internal.h - calc/function/calc_function_internal-inl.h - calc/function/calc_function_system.cpp - calc/function/calc_function_system.h + calc/function/calc_function.cpp + calc/function/calc_function.h + calc/function/calc_function_internal.cpp + calc/function/calc_function_internal.h + calc/function/calc_function_internal-inl.h + calc/function/calc_function_system.cpp + calc/function/calc_function_system.h ) SET(CALC_OPERATION_FILES - calc/operation/calc_arithm.cpp - calc/operation/calc_arithm.h - calc/operation/calc_binary.cpp - calc/operation/calc_binary.h - calc/operation/calc_binary-inl.h - calc/operation/calc_logic.cpp - calc/operation/calc_logic.h - calc/operation/calc_unary.cpp - calc/operation/calc_unary.h - calc/operation/calc_unary-inl.h - calc/operation/operation_name.h - calc/operation/operation_name-inl.h - calc/operation/operation_type.h - calc/operation/operation_type-inl.h + calc/operation/calc_arithm.cpp + calc/operation/calc_arithm.h + calc/operation/calc_binary.cpp + calc/operation/calc_binary.h + calc/operation/calc_binary-inl.h + calc/operation/calc_logic.cpp + calc/operation/calc_logic.h + calc/operation/calc_unary.cpp + calc/operation/calc_unary.h + calc/operation/calc_unary-inl.h + calc/operation/operation_name.h + calc/operation/operation_name-inl.h + calc/operation/operation_type.h + calc/operation/operation_type-inl.h ) SET(CALC_PROCEDURAL_FILES - calc/procedural/calc_braces.cpp - calc/procedural/calc_braces.h - calc/procedural/calc_const.cpp - calc/procedural/calc_const.h - calc/procedural/calc_locvar.cpp - calc/procedural/calc_locvar.h - calc/procedural/calc_nop.cpp - calc/procedural/calc_nop.h - calc/procedural/calc_range.cpp - calc/procedural/calc_range.h - calc/procedural/calc_statement.cpp - calc/procedural/calc_statement.h + calc/procedural/calc_braces.cpp + calc/procedural/calc_braces.h + calc/procedural/calc_const.cpp + calc/procedural/calc_const.h + calc/procedural/calc_locvar.cpp + calc/procedural/calc_locvar.h + calc/procedural/calc_nop.cpp + calc/procedural/calc_nop.h + calc/procedural/calc_range.cpp + calc/procedural/calc_range.h + calc/procedural/calc_statement.cpp + calc/procedural/calc_statement.h ) SET(CALC_RESOURCE_FILES - calc/resource/calc_choice_from.cpp - calc/resource/calc_choice_from.h - calc/resource/calc_create_resource.cpp - calc/resource/calc_create_resource.h - calc/resource/calc_group.cpp - calc/resource/calc_group.h - calc/resource/calc_relevant.cpp - calc/resource/calc_relevant.h - calc/resource/calc_resource.cpp - calc/resource/calc_resource.h - calc/resource/calc_resource-inl.h - calc/resource/calc_select.cpp - calc/resource/calc_select.h + calc/resource/calc_choice_from.cpp + calc/resource/calc_choice_from.h + calc/resource/calc_create_resource.cpp + calc/resource/calc_create_resource.h + calc/resource/calc_group.cpp + calc/resource/calc_group.h + calc/resource/calc_relevant.cpp + calc/resource/calc_relevant.h + calc/resource/calc_resource.cpp + calc/resource/calc_resource.h + calc/resource/calc_resource-inl.h + calc/resource/calc_select.cpp + calc/resource/calc_select.h ) SET(COMMON_FILES - namespace.h - mode.h - set_operation_type.cpp - set_operation_type.h + namespace.h + mode.h + set_operation_type.cpp + set_operation_type.h ) SET(FRAME_FILES - rdoframe.cpp - rdoframe.h + rdoframe.cpp + rdoframe.h ) SET(FUN_FILES - rdo_random_distribution.h - rdo_random_distribution.cpp + rdo_random_distribution.h + rdo_random_distribution.cpp ) SET(INTERFACES_FILES - rdo_model_i.h + rdo_model_i.h + rdo_as_string_i.h ) SET(PCH_FILES - pch/stdpch.cpp - pch/stdpch.h + pch/stdpch.cpp + pch/stdpch.h ) SET(RESULT_FILES - result/result.cpp - result/result.h - result/result_group.cpp - result/result_group.h - result/result_group_i.h - result/result_i.h + result/result.cpp + result/result.h + result/result_group.cpp + result/result_group.h + result/result_group_i.h + result/result_i.h ) SET(SIMULATOR_FILES - keyboard.h - rdo_exception.cpp - rdo_exception.h - rdo_memory.cpp - rdo_memory.h - rdo_object.cpp - rdo_object.h - rdo_runtime.cpp - rdo_runtime.h - rdo_runtime-inl.h - rdo_simulator.cpp - rdo_simulator.h - rdobase.cpp - rdobase.h - simtrace.cpp - simtrace.h - thread_proxy_i.h + keyboard.h + rdo_exception.cpp + rdo_exception.h + rdo_memory.cpp + rdo_memory.h + rdo_object.cpp + rdo_object.h + rdo_runtime.cpp + rdo_runtime.h + rdo_runtime-inl.h + rdo_simulator.cpp + rdo_simulator.h + rdobase.cpp + rdobase.h + simtrace.cpp + simtrace.h + thread_proxy_i.h ) SET(SIMULATOR_ERROR_FILES - error.cpp - error.h + error.cpp + error.h ) SET(SIMULATOR_HOTKEY_FILES - hotkey.cpp - hotkey.h + hotkey.cpp + hotkey.h ) SET(SIMULATOR_NOTIFY_FILES - notify.cpp - notify.h - notify_i.h + notify.cpp + notify.h + notify_i.h ) SET(SIMULATOR_DB_FILES - rdo_res_type.cpp - rdo_res_type.h - rdo_res_type_i.h - rdo_resource.cpp - rdo_resource.h + rdo_res_type.cpp + rdo_res_type.h + rdo_res_type_i.h + rdo_resource.cpp + rdo_resource.h ) SET(SIMULATOR_KB_LOGIC_BASE_FILES - rdo_logic.cpp - rdo_logic.h - rdo_logic-inl.h - rdo_logic_i.h + rdo_logic.cpp + rdo_logic.h + rdo_logic-inl.h + rdo_logic_i.h ) SET(SIMULATOR_KB_LOGIC_DPTSOME_FILES - rdo_logic_dptsome.cpp - rdo_logic_dptsome.h + rdo_logic_dptsome.cpp + rdo_logic_dptsome.h ) SET(SIMULATOR_KB_LOGIC_DPTPRIOR_FILES - rdo_logic_dptprior.cpp - rdo_logic_dptprior.h + rdo_logic_dptprior.cpp + rdo_logic_dptprior.h ) SET(SIMULATOR_KB_LOGIC_DPTSEARCH_FILES - rdo_logic_dptsearch.cpp - rdo_logic_dptsearch.h - rdo_logic_dptsearch_i.h - rdodptrtime.cpp - rdodptrtime.h - searchtrace.cpp - searchtrace.h - searchtrace_i.h - searchtree.cpp - searchtree.h + rdo_logic_dptsearch.cpp + rdo_logic_dptsearch.h + rdo_logic_dptsearch_i.h + rdodptrtime.cpp + rdodptrtime.h + searchtrace.cpp + searchtrace.h + searchtrace_i.h + searchtree.cpp + searchtree.h ) SET(SIMULATOR_KB_LOGIC_PROCESS_FILES - process/advance.cpp - process/advance.h - process/assign.cpp - process/assign.h - process/generate.cpp - process/generate.h - process/queue_depart.cpp - process/queue_depart.h - process/rdoprocess.cpp - process/rdoprocess.h - process/rdoprocess_i.h - process/seize_release.cpp - process/seize_release.h - process/terminate.cpp - process/terminate.h + process/advance.cpp + process/advance.h + process/assign.cpp + process/assign.h + process/generate.cpp + process/generate.h + process/queue_depart.cpp + process/queue_depart.h + process/rdoprocess.cpp + process/rdoprocess.h + process/rdoprocess_i.h + process/seize_release.cpp + process/seize_release.h + process/terminate.cpp + process/terminate.h ) SET(SIMULATOR_KB_OPERATIONS_BASE_FILES - rdo.cpp - rdo.h - rdo_activity.cpp - rdo_activity.h - rdo_activity-inl.h - rdo_activity_i.h - rdo_param_i.h - rdo_pattern.cpp - rdo_pattern.h - rdo_priority.cpp - rdo_priority.h - rdo_priority_i.h + rdo.cpp + rdo.h + rdo_activity.cpp + rdo_activity.h + rdo_activity-inl.h + rdo_activity_i.h + rdo_param_i.h + rdo_pattern.cpp + rdo_pattern.h + rdo_priority.cpp + rdo_priority.h + rdo_priority_i.h ) SET(SIMULATOR_KB_OPERATIONS_EVENT_FILES - rdo_event.cpp - rdo_event.h - rdo_event_i.h + rdo_event.cpp + rdo_event.h + rdo_event_i.h ) SET(SIMULATOR_KB_OPERATIONS_RULE_FILES - rdo_rule.cpp - rdo_rule.h - rdo_rule_i.h + rdo_rule.cpp + rdo_rule.h + rdo_rule_i.h ) SET(SIMULATOR_KB_OPERATIONS_OPERATION_FILES - rdo_operation.cpp - rdo_operation.h - rdo_operation_i.h + rdo_operation.cpp + rdo_operation.h + rdo_operation_i.h ) SET(SIMULATOR_KB_OPERATIONS_KEYBOARD_FILES - rdo_keyboard.cpp - rdo_keyboard.h - rdo_keyboard_i.h + rdo_keyboard.cpp + rdo_keyboard.h + rdo_keyboard_i.h ) SET(SIMULATOR_KB_OPERATIONS_DPTSEARCH_ACTIVITY_FILES - rdo_dptsearch_activity.cpp - rdo_dptsearch_activity.h - rdo_dptsearch_activity_i.h + rdo_dptsearch_activity.cpp + rdo_dptsearch_activity.h + rdo_dptsearch_activity_i.h ) SET(TRACE_FILES - rdotrace.cpp - rdotrace.h - rdotrace_i.h + rdotrace.cpp + rdotrace.h + rdotrace_i.h ) SET(TYPE_FILES - rdo_type.cpp - rdo_type.h + rdo_type.cpp + rdo_type.h ) SET(TYPE_ARRAY_FILES - rdo_array.cpp - rdo_array.h + rdo_array.cpp + rdo_array.h ) SET(TYPE_ENUM_FILES - rdo_enum.cpp - rdo_enum.h + rdo_enum.cpp + rdo_enum.h ) SET(TYPE_FUZZY_FILES - rdo_fuzzy.cpp - rdo_fuzzy.h + rdo_fuzzy.cpp + rdo_fuzzy.h ) SET(TYPE_MATRIX_FILES - rdo_matrix.cpp - rdo_matrix.h + rdo_matrix.cpp + rdo_matrix.h ) SET(VALUE_FILES - rdo_value.cpp - rdo_value.h - rdo_value-inl.h + rdo_value.cpp + rdo_value.h + rdo_value-inl.h ) SET(SOURCE_FILES - ${PCH_FILES} - ${CALC_FILES} - ${CALC_FUNCTION_FILES} - ${CALC_OPERATION_FILES} - ${CALC_PROCEDURAL_FILES} - ${CALC_RESOURCE_FILES} - ${COMMON_FILES} - ${FRAME_FILES} - ${FUN_FILES} - ${INTERFACES_FILES} - ${RESULT_FILES} - ${SIMULATOR_FILES} - ${SIMULATOR_ERROR_FILES} - ${SIMULATOR_HOTKEY_FILES} - ${SIMULATOR_NOTIFY_FILES} - ${SIMULATOR_DB_FILES} - ${SIMULATOR_KB_LOGIC_BASE_FILES} - ${SIMULATOR_KB_LOGIC_DPTSOME_FILES} - ${SIMULATOR_KB_LOGIC_DPTPRIOR_FILES} - ${SIMULATOR_KB_LOGIC_DPTSEARCH_FILES} - ${SIMULATOR_KB_LOGIC_PROCESS_FILES} - ${SIMULATOR_KB_OPERATIONS_BASE_FILES} - ${SIMULATOR_KB_OPERATIONS_EVENT_FILES} - ${SIMULATOR_KB_OPERATIONS_RULE_FILES} - ${SIMULATOR_KB_OPERATIONS_OPERATION_FILES} - ${SIMULATOR_KB_OPERATIONS_KEYBOARD_FILES} - ${SIMULATOR_KB_OPERATIONS_DPTSEARCH_ACTIVITY_FILES} - ${TRACE_FILES} - ${TYPE_FILES} - ${TYPE_ARRAY_FILES} - ${TYPE_ENUM_FILES} - ${TYPE_FUZZY_FILES} - ${TYPE_MATRIX_FILES} - ${VALUE_FILES} + ${PCH_FILES} + ${CALC_FILES} + ${CALC_FUNCTION_FILES} + ${CALC_OPERATION_FILES} + ${CALC_PROCEDURAL_FILES} + ${CALC_RESOURCE_FILES} + ${COMMON_FILES} + ${FRAME_FILES} + ${FUN_FILES} + ${INTERFACES_FILES} + ${RESULT_FILES} + ${SIMULATOR_FILES} + ${SIMULATOR_ERROR_FILES} + ${SIMULATOR_HOTKEY_FILES} + ${SIMULATOR_NOTIFY_FILES} + ${SIMULATOR_DB_FILES} + ${SIMULATOR_KB_LOGIC_BASE_FILES} + ${SIMULATOR_KB_LOGIC_DPTSOME_FILES} + ${SIMULATOR_KB_LOGIC_DPTPRIOR_FILES} + ${SIMULATOR_KB_LOGIC_DPTSEARCH_FILES} + ${SIMULATOR_KB_LOGIC_PROCESS_FILES} + ${SIMULATOR_KB_OPERATIONS_BASE_FILES} + ${SIMULATOR_KB_OPERATIONS_EVENT_FILES} + ${SIMULATOR_KB_OPERATIONS_RULE_FILES} + ${SIMULATOR_KB_OPERATIONS_OPERATION_FILES} + ${SIMULATOR_KB_OPERATIONS_KEYBOARD_FILES} + ${SIMULATOR_KB_OPERATIONS_DPTSEARCH_ACTIVITY_FILES} + ${TRACE_FILES} + ${TYPE_FILES} + ${TYPE_ARRAY_FILES} + ${TYPE_ENUM_FILES} + ${TYPE_FUZZY_FILES} + ${TYPE_MATRIX_FILES} + ${VALUE_FILES} ) SET(NO_PCH_FILES - ${PCH_FILES} + ${PCH_FILES} ) ADD_LIBRARY(rdo_runtime STATIC ${SOURCE_FILES}) @@ -355,143 +356,143 @@ ADD_SUBDIRECTORY(${RDO_RUNTIME_TEST_PATH}) IF(MSVC_IDE) # options for windows # - INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) - ADD_PCH("${SOURCE_FILES}" "${NO_PCH_FILES}" simulator/runtime pch stdpch) + INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) + ADD_PCH("${SOURCE_FILES}" "${NO_PCH_FILES}" simulator/runtime pch stdpch) - SOURCE_GROUP(".calc" FILES - ${CALC_FILES} - ) + SOURCE_GROUP(".calc" FILES + ${CALC_FILES} + ) - SOURCE_GROUP(".calc\\.function" FILES - ${CALC_FUNCTION_FILES} - ) + SOURCE_GROUP(".calc\\.function" FILES + ${CALC_FUNCTION_FILES} + ) - SOURCE_GROUP(".calc\\.operation" FILES - ${CALC_OPERATION_FILES} - ) + SOURCE_GROUP(".calc\\.operation" FILES + ${CALC_OPERATION_FILES} + ) - SOURCE_GROUP(".calc\\.procedural" FILES - ${CALC_PROCEDURAL_FILES} - ) + SOURCE_GROUP(".calc\\.procedural" FILES + ${CALC_PROCEDURAL_FILES} + ) - SOURCE_GROUP(".calc\\.resource" FILES - ${CALC_RESOURCE_FILES} - ) + SOURCE_GROUP(".calc\\.resource" FILES + ${CALC_RESOURCE_FILES} + ) - SOURCE_GROUP(".common" FILES - ${COMMON_FILES} - ) + SOURCE_GROUP(".common" FILES + ${COMMON_FILES} + ) - SOURCE_GROUP(".frame" FILES - ${FRAME_FILES} - ) + SOURCE_GROUP(".frame" FILES + ${FRAME_FILES} + ) - SOURCE_GROUP(".fun" FILES - ${FUN_FILES} - ) + SOURCE_GROUP(".fun" FILES + ${FUN_FILES} + ) - SOURCE_GROUP(".interfaces" FILES - ${INTERFACES_FILES} - ) + SOURCE_GROUP(".interfaces" FILES + ${INTERFACES_FILES} + ) - SOURCE_GROUP(".pch" FILES - ${PCH_FILES} - ) + SOURCE_GROUP(".pch" FILES + ${PCH_FILES} + ) - SOURCE_GROUP(".result" FILES - ${RESULT_FILES} - ) + SOURCE_GROUP(".result" FILES + ${RESULT_FILES} + ) - SOURCE_GROUP(".simulator" FILES - ${SIMULATOR_FILES} - ) + SOURCE_GROUP(".simulator" FILES + ${SIMULATOR_FILES} + ) - SOURCE_GROUP(".simulator\\.error" FILES - ${SIMULATOR_ERROR_FILES} - ) + SOURCE_GROUP(".simulator\\.error" FILES + ${SIMULATOR_ERROR_FILES} + ) - SOURCE_GROUP(".simulator\\.hotkey" FILES - ${SIMULATOR_HOTKEY_FILES} - ) + SOURCE_GROUP(".simulator\\.hotkey" FILES + ${SIMULATOR_HOTKEY_FILES} + ) - SOURCE_GROUP(".simulator\\.notify" FILES - ${SIMULATOR_NOTIFY_FILES} - ) + SOURCE_GROUP(".simulator\\.notify" FILES + ${SIMULATOR_NOTIFY_FILES} + ) - SOURCE_GROUP(".simulator\\.rdo_db" FILES - ${SIMULATOR_DB_FILES} - ) + SOURCE_GROUP(".simulator\\.rdo_db" FILES + ${SIMULATOR_DB_FILES} + ) - SOURCE_GROUP(".simulator\\.rdo_kb\\.logic\\1. base" FILES - ${SIMULATOR_KB_LOGIC_BASE_FILES} - ) + SOURCE_GROUP(".simulator\\.rdo_kb\\.logic\\1. base" FILES + ${SIMULATOR_KB_LOGIC_BASE_FILES} + ) - SOURCE_GROUP(".simulator\\.rdo_kb\\.logic\\2. dpt_some" FILES - ${SIMULATOR_KB_LOGIC_DPTSOME_FILES} - ) + SOURCE_GROUP(".simulator\\.rdo_kb\\.logic\\2. dpt_some" FILES + ${SIMULATOR_KB_LOGIC_DPTSOME_FILES} + ) - SOURCE_GROUP(".simulator\\.rdo_kb\\.logic\\3. dpt_prior" FILES - ${SIMULATOR_KB_LOGIC_DPTPRIOR_FILES} - ) + SOURCE_GROUP(".simulator\\.rdo_kb\\.logic\\3. dpt_prior" FILES + ${SIMULATOR_KB_LOGIC_DPTPRIOR_FILES} + ) - SOURCE_GROUP(".simulator\\.rdo_kb\\.logic\\4. dpt_search" FILES - ${SIMULATOR_KB_LOGIC_DPTSEARCH_FILES} - ) + SOURCE_GROUP(".simulator\\.rdo_kb\\.logic\\4. dpt_search" FILES + ${SIMULATOR_KB_LOGIC_DPTSEARCH_FILES} + ) - SOURCE_GROUP(".simulator\\.rdo_kb\\.logic\\5. process" FILES - ${SIMULATOR_KB_LOGIC_PROCESS_FILES} - ) + SOURCE_GROUP(".simulator\\.rdo_kb\\.logic\\5. process" FILES + ${SIMULATOR_KB_LOGIC_PROCESS_FILES} + ) - SOURCE_GROUP(".simulator\\.rdo_kb\\.operations\\1. base" FILES - ${SIMULATOR_KB_OPERATIONS_BASE_FILES} - ) + SOURCE_GROUP(".simulator\\.rdo_kb\\.operations\\1. base" FILES + ${SIMULATOR_KB_OPERATIONS_BASE_FILES} + ) - SOURCE_GROUP(".simulator\\.rdo_kb\\.operations\\2. event" FILES - ${SIMULATOR_KB_OPERATIONS_EVENT_FILES} - ) + SOURCE_GROUP(".simulator\\.rdo_kb\\.operations\\2. event" FILES + ${SIMULATOR_KB_OPERATIONS_EVENT_FILES} + ) - SOURCE_GROUP(".simulator\\.rdo_kb\\.operations\\3. rule" FILES - ${SIMULATOR_KB_OPERATIONS_RULE_FILES} - ) + SOURCE_GROUP(".simulator\\.rdo_kb\\.operations\\3. rule" FILES + ${SIMULATOR_KB_OPERATIONS_RULE_FILES} + ) - SOURCE_GROUP(".simulator\\.rdo_kb\\.operations\\4. operation" FILES - ${SIMULATOR_KB_OPERATIONS_OPERATION_FILES} - ) + SOURCE_GROUP(".simulator\\.rdo_kb\\.operations\\4. operation" FILES + ${SIMULATOR_KB_OPERATIONS_OPERATION_FILES} + ) - SOURCE_GROUP(".simulator\\.rdo_kb\\.operations\\5. keyboard" FILES - ${SIMULATOR_KB_OPERATIONS_KEYBOARD_FILES} - ) + SOURCE_GROUP(".simulator\\.rdo_kb\\.operations\\5. keyboard" FILES + ${SIMULATOR_KB_OPERATIONS_KEYBOARD_FILES} + ) - SOURCE_GROUP(".simulator\\.rdo_kb\\.operations\\6. dptsearch_activity" FILES - ${SIMULATOR_KB_OPERATIONS_DPTSEARCH_ACTIVITY_FILES} - ) + SOURCE_GROUP(".simulator\\.rdo_kb\\.operations\\6. dptsearch_activity" FILES + ${SIMULATOR_KB_OPERATIONS_DPTSEARCH_ACTIVITY_FILES} + ) - SOURCE_GROUP(".trace" FILES - ${TRACE_FILES} - ) + SOURCE_GROUP(".trace" FILES + ${TRACE_FILES} + ) - SOURCE_GROUP(".type" FILES - ${TYPE_FILES} - ) + SOURCE_GROUP(".type" FILES + ${TYPE_FILES} + ) - SOURCE_GROUP(".type\\.array" FILES - ${TYPE_ARRAY_FILES} - ) + SOURCE_GROUP(".type\\.array" FILES + ${TYPE_ARRAY_FILES} + ) - SOURCE_GROUP(".type\\.enum" FILES - ${TYPE_ENUM_FILES} - ) + SOURCE_GROUP(".type\\.enum" FILES + ${TYPE_ENUM_FILES} + ) - SOURCE_GROUP(".type\\.fuzzy" FILES - ${TYPE_FUZZY_FILES} - ) + SOURCE_GROUP(".type\\.fuzzy" FILES + ${TYPE_FUZZY_FILES} + ) - SOURCE_GROUP(".type\\.matrix" FILES - ${TYPE_MATRIX_FILES} - ) + SOURCE_GROUP(".type\\.matrix" FILES + ${TYPE_MATRIX_FILES} + ) - SOURCE_GROUP(".value" FILES - ${VALUE_FILES} - ) + SOURCE_GROUP(".value" FILES + ${VALUE_FILES} + ) ENDIF() diff --git a/simulator/runtime/calc/calc_array.cpp b/simulator/runtime/calc/calc_array.cpp index 9f52f26eb..c7bb5b30c 100644 --- a/simulator/runtime/calc/calc_array.cpp +++ b/simulator/runtime/calc/calc_array.cpp @@ -12,64 +12,64 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcArraySize // -------------------------------------------------------------------------------- RDOCalcArraySize::RDOCalcArraySize(const LPRDOCalc& pCalc) - : m_pCalc(pCalc) + : m_pCalc(pCalc) {} RDOValue RDOCalcArraySize::doCalc(const LPRDORuntime& pRuntime) { - RDOValue value = m_pCalc->calcValue(pRuntime); - const LPRDOArrayValue& pArrayValue = value.getPointerByType(); - ASSERT(pArrayValue); - return pArrayValue->size(); + RDOValue value = m_pCalc->calcValue(pRuntime); + const LPRDOArrayValue& pArrayValue = value.getPointerByType(); + ASSERT(pArrayValue); + return pArrayValue->size(); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcArrayItem // -------------------------------------------------------------------------------- RDOCalcArrayItem::RDOCalcArrayItem(const LPRDOCalc& pArray, const LPRDOCalc& pArrayInd) - : m_pArray (pArray ) - , m_pArrayInd(pArrayInd) + : m_pArray (pArray ) + , m_pArrayInd(pArrayInd) { - ASSERT(m_pArray ); - ASSERT(m_pArrayInd); + ASSERT(m_pArray ); + ASSERT(m_pArrayInd); - setSrcInfo(m_pArrayInd->srcInfo()); + setSrcInfo(m_pArrayInd->srcInfo()); } RDOValue RDOCalcArrayItem::doCalc(const LPRDORuntime& pRuntime) { - RDOValue value = m_pArray->calcValue(pRuntime); + RDOValue value = m_pArray->calcValue(pRuntime); - const LPRDOArrayValue& pArrayValue = value.getPointerByType(); - ASSERT(pArrayValue); + const LPRDOArrayValue& pArrayValue = value.getPointerByType(); + ASSERT(pArrayValue); - return pArrayValue->getItem(m_pArrayInd->calcValue(pRuntime)); + return pArrayValue->getItem(m_pArrayInd->calcValue(pRuntime)); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcSetArrayItem // -------------------------------------------------------------------------------- RDOCalcSetArrayItem::RDOCalcSetArrayItem(const LPRDOCalc& pArray, const LPRDOCalc& pArrayInd, const LPRDOCalc& pSetItem) - : m_pArray (pArray ) - , m_pArrayInd(pArrayInd) - , m_pSetItem (pSetItem ) + : m_pArray (pArray ) + , m_pArrayInd(pArrayInd) + , m_pSetItem (pSetItem ) { - ASSERT(m_pArray ); - ASSERT(m_pArrayInd); - ASSERT(m_pSetItem ); + ASSERT(m_pArray ); + ASSERT(m_pArrayInd); + ASSERT(m_pSetItem ); - setSrcInfo(m_pArrayInd->srcInfo()); + setSrcInfo(m_pArrayInd->srcInfo()); } RDOValue RDOCalcSetArrayItem::doCalc(const LPRDORuntime& pRuntime) { - RDOValue value = m_pArray->calcValue(pRuntime); + RDOValue value = m_pArray->calcValue(pRuntime); - const LPRDOArrayValue& pArrayValue = value.getPointerByType(); - ASSERT(pArrayValue); - pArrayValue->setItem(m_pArrayInd->calcValue(pRuntime), m_pSetItem->calcValue(pRuntime)); + const LPRDOArrayValue& pArrayValue = value.getPointerByType(); + ASSERT(pArrayValue); + pArrayValue->setItem(m_pArrayInd->calcValue(pRuntime), m_pSetItem->calcValue(pRuntime)); - return value; + return value; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/calc_array.h b/simulator/runtime/calc/calc_array.h index 9ff83ac5e..8b024f107 100644 --- a/simulator/runtime/calc/calc_array.h +++ b/simulator/runtime/calc/calc_array.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_ARRAY_H_ -#define _LIB_RUNTIME_CALC_ARRAY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,48 +8,43 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Размер массива PREDECLARE_POINTER(RDOCalcArraySize); class RDOCalcArraySize: public RDOCalc { DECLARE_FACTORY(RDOCalcArraySize) private: - RDOCalcArraySize(const LPRDOCalc& pCalc); + RDOCalcArraySize(const LPRDOCalc& pCalc); - LPRDOCalc m_pCalc; + LPRDOCalc m_pCalc; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Возвращает элемент массива PREDECLARE_POINTER(RDOCalcArrayItem); class RDOCalcArrayItem: public RDOCalc { DECLARE_FACTORY(RDOCalcArrayItem) private: - RDOCalcArrayItem(const LPRDOCalc& pArray, const LPRDOCalc& pArrayInd); + RDOCalcArrayItem(const LPRDOCalc& pArray, const LPRDOCalc& pArrayInd); - LPRDOCalc m_pArray; - LPRDOCalc m_pArrayInd; + LPRDOCalc m_pArray; + LPRDOCalc m_pArrayInd; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Устанавливает элемент массива PREDECLARE_POINTER(RDOCalcSetArrayItem); class RDOCalcSetArrayItem: public RDOCalc { - DECLARE_FACTORY(RDOCalcSetArrayItem) + DECLARE_FACTORY(RDOCalcSetArrayItem) private: - RDOCalcSetArrayItem(const LPRDOCalc& pArray, const LPRDOCalc& pArrayInd, const LPRDOCalc& pSetItem); + RDOCalcSetArrayItem(const LPRDOCalc& pArray, const LPRDOCalc& pArrayInd, const LPRDOCalc& pSetItem); - LPRDOCalc m_pArray; - LPRDOCalc m_pArrayInd; - LPRDOCalc m_pSetItem; + LPRDOCalc m_pArray; + LPRDOCalc m_pArrayInd; + LPRDOCalc m_pSetItem; - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_ARRAY_H_ diff --git a/simulator/runtime/calc/calc_base.cpp b/simulator/runtime/calc/calc_base.cpp index 42a55e157..5886fe941 100644 --- a/simulator/runtime/calc/calc_base.cpp +++ b/simulator/runtime/calc/calc_base.cpp @@ -20,67 +20,67 @@ RDOCalc::~RDOCalc() RDOValue RDOCalc::calcValue(const LPRDORuntime& pRuntime) { - try - { + try + { #ifdef _DEBUG /* - if (src_text().empty()) - { - TRACE("%d\n", sizeof(std::string)); - } - else if (src_text().length() < 500) - { - TRACE("calc: %s\n", src_text().c_str()); - if (src_text() == "класс") - { - TRACE("calc: %s\n", src_text().c_str()); - } - } - else - { - std::string str = src_text(); - str.resize(500); - TRACE("calc: %s\n", str.c_str()); - } + if (src_text().empty()) + { + TRACE("%d\n", sizeof(std::string)); + } + else if (src_text().length() < 500) + { + TRACE("calc: %s\n", src_text().c_str()); + if (src_text() == "класс") + { + TRACE("calc: %s\n", src_text().c_str()); + } + } + else + { + std::string str = src_text(); + str.resize(500); + TRACE("calc: %s\n", str.c_str()); + } */ #endif - return doCalc(pRuntime); - } - catch (const RDOUndefinedException& ex) - { - throw ex; - } - catch (const RDORuntimeException& ex) - { - std::string message = rdo::format("<Модельное время: %f>, '%s'", pRuntime->getTimeNow(), m_srcInfo.src_text().c_str()); - if (!ex.message().empty()) - { - message = rdo::format("%s: %s", message.c_str(), ex.message().c_str()); - } - rdo::simulation::report::FileMessage error( - message, - m_srcInfo.src_filetype(), - m_srcInfo.src_pos().m_last_line, - m_srcInfo.src_pos().m_last_pos - ); - pRuntime->error().push(error); - } - return RDOValue(); + return doCalc(pRuntime); + } + catch (const RDOUndefinedException& ex) + { + throw ex; + } + catch (const RDORuntimeException& ex) + { + std::string message = rdo::format("<Модельное время: %f>, '%s'", pRuntime->getTimeNow(), m_srcInfo.src_text().c_str()); + if (!ex.message().empty()) + { + message = rdo::format("%s: %s", message.c_str(), ex.message().c_str()); + } + rdo::simulation::report::FileMessage error( + message, + m_srcInfo.src_filetype(), + m_srcInfo.src_pos().m_last_line, + m_srcInfo.src_pos().m_last_pos + ); + pRuntime->error().push(error); + } + return RDOValue(); } bool RDOCalc::compare(const LPRDOCalc& /*pCalc*/) const { - return false; + return false; } const RDOSrcInfo& RDOCalc::srcInfo() const { - return m_srcInfo; + return m_srcInfo; } void RDOCalc::setSrcInfo(const RDOSrcInfo& srcInfo) { - m_srcInfo = srcInfo; + m_srcInfo = srcInfo; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/calc_base.h b/simulator/runtime/calc/calc_base.h index 1a6d8ae53..282503c69 100644 --- a/simulator/runtime/calc/calc_base.h +++ b/simulator/runtime/calc/calc_base.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_BASE_H_ -#define _LIB_RUNTIME_CALC_BASE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -14,56 +13,33 @@ OPEN_RDO_RUNTIME_NAMESPACE PREDECLARE_POINTER(RDORuntime); -//! \defgroup calc Общая группа калков -//! \defgroup calc_base Абстрактный калк - PREDECLARE_POINTER(RDOCalc); class RDOCalc: public rdo::counter_reference { -//! \details Фабрика для автоматического удаления калка DECLARE_FACTORY(RDOCalc) public: - //! Расчет значение калка. Является публичным методом, через который у калка запрашивается значение - //! \param pRuntime - указатель на объект runtime'а. - //! Используется для доступа к БД модели, системному времени, генерации ошибок и др. - //! \result Вычесленное калком значение - RDOValue calcValue(const LPRDORuntime& pRuntime); + RDOValue calcValue(const LPRDORuntime& pRuntime); - //! Сравнение двух калков как объектов (результаты калков в сравнении не используются). - //! Реализовывать этот метод в новых калках необязательно. - //! \param pCalc - калк, с которым проводит сравнение текущий - //! \result true, если калки одинаковые. Значение по умолчанию false - virtual bool compare(const LPRDOCalc& pCalc) const; + virtual bool compare(const LPRDOCalc& pCalc) const; - //! Узнать привязку калка к исходникам - const RDOSrcInfo& srcInfo () const; - //! Привязать калк к исходникам - void setSrcInfo(const RDOSrcInfo& srcInfo); + const RDOSrcInfo& srcInfo() const; + void setSrcInfo(const RDOSrcInfo& srcInfo); - typedef std::vector RDOCalcList; + typedef std::vector RDOCalcList; protected: - RDOCalc(); - virtual ~RDOCalc(); + RDOCalc(); + virtual ~RDOCalc(); - //! Абстрактное действие калка. - //! Метод должен быть реализован в потомках (реальных калках). - //! \param pRuntime - указатель на объект runtime'а. - //! Используется для доступа к БД модели, системному времени, генерации ошибок и др. - //! \exception RDORuntimeException - //! \result Вычесленное калком значение - virtual RDOValue doCalc(const LPRDORuntime& pRuntime) = 0; + virtual RDOValue doCalc(const LPRDORuntime& pRuntime) = 0; private: - //! Привязка калка к исходникам - RDOSrcInfo m_srcInfo; + RDOSrcInfo m_srcInfo; }; #define DECLARE_ICalc \ private: \ - RDOValue doCalc(const LPRDORuntime& pRuntime); + RDOValue doCalc(const LPRDORuntime& pRuntime); CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_BASE_H_ diff --git a/simulator/runtime/calc/calc_event.cpp b/simulator/runtime/calc/calc_event.cpp index a3a3df89b..3a9286d42 100644 --- a/simulator/runtime/calc/calc_event.cpp +++ b/simulator/runtime/calc/calc_event.cpp @@ -13,52 +13,52 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcEvent // -------------------------------------------------------------------------------- RDOCalcEvent::RDOCalcEvent(const LPIEvent& event) - : m_pEvent(event) + : m_pEvent(event) { - ASSERT(m_pEvent); + ASSERT(m_pEvent); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcEventPlan // -------------------------------------------------------------------------------- RDOCalcEventPlan::RDOCalcEventPlan(const LPIEvent& event, const LPRDOCalc& pTimeCalc, const std::vector& params) - : RDOCalcEvent(event) - , m_pTimeCalc (pTimeCalc) - , m_params (params) + : RDOCalcEvent(event) + , m_pTimeCalc (pTimeCalc) + , m_params (params) { - ASSERT(m_pTimeCalc); + ASSERT(m_pTimeCalc); } RDOValue RDOCalcEventPlan::doCalc(const LPRDORuntime& pRuntime) { - RDOValue time = m_pTimeCalc->calcValue(pRuntime); + RDOValue time = m_pTimeCalc->calcValue(pRuntime); - std::vector params; - params.reserve(m_params.size()); - for (const LPRDOCalc& param: m_params) - { - params.push_back(param->calcValue(pRuntime)); - } + std::vector params; + params.reserve(m_params.size()); + for (const LPRDOCalc& param: m_params) + { + params.push_back(param->calcValue(pRuntime)); + } - pRuntime->addTimePoint( - time.getDouble(), - m_pEvent.object_dynamic_cast(), - boost::bind(&IEvent::onMakePlaned, m_pEvent.get(), pRuntime, params) - ); - return time; + pRuntime->addTimePoint( + time.getDouble(), + m_pEvent.object_dynamic_cast(), + boost::bind(&IEvent::onMakePlaned, m_pEvent.get(), pRuntime, params) + ); + return time; } // -------------------------------------------------------------------------------- // -------------------- RDOCalcEventStop // -------------------------------------------------------------------------------- RDOCalcEventStop::RDOCalcEventStop(const LPIEvent& event) - : RDOCalcEvent(event) + : RDOCalcEvent(event) {} RDOValue RDOCalcEventStop::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->removeTimePoint(m_pEvent.object_dynamic_cast()); - return RDOValue(); + pRuntime->removeTimePoint(m_pEvent.object_dynamic_cast()); + return RDOValue(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/calc_event.h b/simulator/runtime/calc/calc_event.h index cbc501d45..cf9198cc4 100644 --- a/simulator/runtime/calc/calc_event.h +++ b/simulator/runtime/calc/calc_event.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_EVENT_H_ -#define _LIB_RUNTIME_CALC_EVENT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,43 +8,38 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Базовая калка для управления событиями PREDECLARE_POINTER(RDOCalcEvent); class RDOCalcEvent: public RDOCalc { DECLARE_FACTORY(RDOCalcEvent) protected: - RDOCalcEvent(const LPIEvent& event); + RDOCalcEvent(const LPIEvent& event); - LPIEvent m_pEvent; + LPIEvent m_pEvent; }; -//! Планирование события PREDECLARE_POINTER(RDOCalcEventPlan); class RDOCalcEventPlan: public RDOCalcEvent { DECLARE_FACTORY(RDOCalcEventPlan) private: - RDOCalcEventPlan(const LPIEvent& event, const LPRDOCalc& pTimeCalc, const std::vector& params); + RDOCalcEventPlan(const LPIEvent& event, const LPRDOCalc& pTimeCalc, const std::vector& params); - LPRDOCalc m_pTimeCalc; - std::vector m_params; + LPRDOCalc m_pTimeCalc; + std::vector m_params; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Остановка события PREDECLARE_POINTER(RDOCalcEventStop); class RDOCalcEventStop: public RDOCalcEvent { DECLARE_FACTORY(RDOCalcEventStop) private: - RDOCalcEventStop(const LPIEvent& event); + RDOCalcEventStop(const LPIEvent& event); - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_EVENT_H_ diff --git a/simulator/runtime/calc/calc_pattern.cpp b/simulator/runtime/calc/calc_pattern.cpp index b3645c6e5..6cad3b6d8 100644 --- a/simulator/runtime/calc/calc_pattern.cpp +++ b/simulator/runtime/calc/calc_pattern.cpp @@ -12,12 +12,12 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcPatParam // -------------------------------------------------------------------------------- RDOCalcPatParam::RDOCalcPatParam(std::size_t paramID) - : m_paramID(paramID) + : m_paramID(paramID) {} RDOValue RDOCalcPatParam::doCalc(const LPRDORuntime& pRuntime) { - return pRuntime->getPatternParameter(m_paramID); + return pRuntime->getPatternParameter(m_paramID); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/calc_pattern.h b/simulator/runtime/calc/calc_pattern.h index 9e1e42da4..16888fbde 100644 --- a/simulator/runtime/calc/calc_pattern.h +++ b/simulator/runtime/calc/calc_pattern.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_PATTERN_H_ -#define _LIB_RUNTIME_CALC_PATTERN_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,19 +7,16 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Получение параметра паттерна PREDECLARE_POINTER(RDOCalcPatParam); class RDOCalcPatParam: public RDOCalc { DECLARE_FACTORY(RDOCalcPatParam) private: - RDOCalcPatParam(std::size_t paramID); + RDOCalcPatParam(std::size_t paramID); - std::size_t m_paramID; + std::size_t m_paramID; - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_PATTERN_H_ diff --git a/simulator/runtime/calc/calc_process.cpp b/simulator/runtime/calc/calc_process.cpp index ead27aa6b..3229cb5d7 100644 --- a/simulator/runtime/calc/calc_process.cpp +++ b/simulator/runtime/calc/calc_process.cpp @@ -14,50 +14,50 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcProcessControl // -------------------------------------------------------------------------------- RDOCalcProcessControl::RDOCalcProcessControl(LPIPROCBlock pBlock, int relResNum) - : m_Block (pBlock ) - , m_relResNum(relResNum) + : m_Block (pBlock ) + , m_relResNum(relResNum) {} RDOValue RDOCalcProcessControl::doCalc(const LPRDORuntime& pRuntime) { - //по m_relResNum нужно найти ресурс (m_Transact) и передать его в процесс - const std::size_t resID = pRuntime->getCurrentActivity()->getResByRelRes(m_relResNum); - LPRDOResource pResource = pRuntime->getResourceByID(resID); - /// @todo проверить, можно ли перенести проверку в парсер, чтобы сделать object_static_cast вместо object_dynamic_cast - LPRDOPROCTransact pTransact = pResource.object_dynamic_cast(); - if (pTransact) - { - pTransact->setBlock(m_Block); - // Записываем в конец списка этого блока перемещаемый транзакт - m_Block.object_dynamic_cast()->transactGoIn(pTransact); - } + //по m_relResNum нужно найти ресурс (m_Transact) и передать его в процесс + const std::size_t resID = pRuntime->getCurrentActivity()->getResByRelRes(m_relResNum); + LPRDOResource pResource = pRuntime->getResourceByID(resID); + // TODO проверить, можно ли перенести проверку в парсер, чтобы сделать object_static_cast вместо object_dynamic_cast + LPRDOPROCTransact pTransact = pResource.object_dynamic_cast(); + if (pTransact) + { + pTransact->setBlock(m_Block); + // Записываем в конец списка этого блока перемещаемый транзакт + m_Block.object_dynamic_cast()->transactGoIn(pTransact); + } - return RDOValue(); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcProcAssign // -------------------------------------------------------------------------------- RDOCalcProcAssign::RDOCalcProcAssign(const LPRDOCalc& pCalc, std::size_t res, std::size_t param) - : m_pCalc(pCalc) - , m_res (res ) - , m_param(param) + : m_pCalc(pCalc) + , m_res (res ) + , m_param(param) { - ASSERT(m_pCalc); - ASSERT(m_res != ~0); - ASSERT(m_param != ~0); + ASSERT(m_pCalc); + ASSERT(m_res != ~0); + ASSERT(m_param != ~0); } RDOValue RDOCalcProcAssign::doCalc(const LPRDORuntime& pRuntime) { - LPRDOResource pRes = pRuntime->getResourceByID(m_res); - ASSERT(pRes); + LPRDOResource pRes = pRuntime->getResourceByID(m_res); + ASSERT(pRes); - RDOValue value = m_pCalc->calcValue(pRuntime); + RDOValue value = m_pCalc->calcValue(pRuntime); - pRes->setParam(m_param, value); + pRes->setParam(m_param, value); - return value; + return value; } // -------------------------------------------------------------------------------- @@ -65,7 +65,7 @@ RDOValue RDOCalcProcAssign::doCalc(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOCalcGetTermNow::doCalc(const LPRDORuntime& pRuntime) { - return pRuntime->getCurrentTerm(); + return pRuntime->getCurrentTerm(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/calc_process.h b/simulator/runtime/calc/calc_process.h index 3262df6cd..a434e9c18 100644 --- a/simulator/runtime/calc/calc_process.h +++ b/simulator/runtime/calc/calc_process.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_PROCESS_H_ -#define _LIB_RUNTIME_CALC_PROCESS_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,35 +12,32 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Передача транзакта в процесс и его запуск PREDECLARE_POINTER(RDOCalcProcessControl); class RDOCalcProcessControl: public RDOCalc { DECLARE_FACTORY(RDOCalcProcessControl) public: protected: - RDOCalcProcessControl(LPIPROCBlock pBlock, int relResNum); - DECLARE_ICalc; + RDOCalcProcessControl(LPIPROCBlock pBlock, int relResNum); + DECLARE_ICalc; private: - LPIPROCBlock m_Block; - int m_relResNum; + LPIPROCBlock m_Block; + int m_relResNum; }; -//! Выполнение блока ASSIGN в процессе PREDECLARE_POINTER(RDOCalcProcAssign); class RDOCalcProcAssign: public RDOCalc { DECLARE_FACTORY(RDOCalcProcAssign) protected: - RDOCalcProcAssign(const LPRDOCalc& pCalc, std::size_t res, std::size_t param); - DECLARE_ICalc; + RDOCalcProcAssign(const LPRDOCalc& pCalc, std::size_t res, std::size_t param); + DECLARE_ICalc; private: - LPRDOCalc m_pCalc; - std::size_t m_res; - std::size_t m_param; + LPRDOCalc m_pCalc; + std::size_t m_res; + std::size_t m_param; }; -//! Получение значения терминального счетчика PREDECLARE_POINTER(RDOCalcGetTermNow); class RDOCalcGetTermNow: public RDOCalc { @@ -50,5 +46,3 @@ DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_PROCESS_H_ diff --git a/simulator/runtime/calc/calc_sequence-inl.h b/simulator/runtime/calc/calc_sequence-inl.h index 8a1b1925a..6ffd1dc79 100644 --- a/simulator/runtime/calc/calc_sequence-inl.h +++ b/simulator/runtime/calc/calc_sequence-inl.h @@ -10,62 +10,62 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- template inline RDOCalcRandomDistribution::RDOCalcRandomDistribution(T* gen) - : m_gen(gen) + : m_gen(gen) {} template inline RDOCalcRandomDistribution::~RDOCalcRandomDistribution() { - delete m_gen; + delete m_gen; } template inline RDOValue RDOCalcRandomDistribution::doCalc(const LPRDORuntime& pRuntime) { - RDOValue res = getNextValue(pRuntime); - if (m_range) - { - if (res < m_range.get().m_min) - { - return m_res_real - ? m_range.get().m_min - : RDOValue(m_range.get().m_min > 0 - ? m_range.get().m_min + 0.5 - : m_range.get().m_min - 0.5 - ).getInt(); - } - if (res > m_range.get().m_max) - { - return m_res_real - ? m_range.get().m_max - : RDOValue(m_range.get().m_max > 0 - ? m_range.get().m_max + 0.5 - : m_range.get().m_max - 0.5 - ).getInt(); - } - return m_res_real - ? res - : RDOValue(res > 0 - ? res + 0.5 - : res - 0.5 - ).getInt(); - // В новом РДО была сделана попытка выбирать новое случайное число, если текущее вышло за диапазон. Но при этом смешается среднее (оно и в другом случае может смещаться imho). Для совместимости оставим первый вариант. -// for ( int i = 0; i < 1000; i++ ) { -// if ( res >= m_range.get().m_min && res <= m_range.get().m_max ) return res_real ? res : static_cast(res > 0 ? res + 0.5 : res - 0.5); -// res = gen->next( pRuntime->getFuncArgument(0), pRuntime->getFuncArgument(1) ); -// } -// pRuntime->error().push("Не удается получить значение, попадающее в назначенный диапазон", this); -// return res_real ? m_range.get().m_min : static_cast(m_range.get().m_min); - } - else - { - return m_res_real - ? res - : RDOValue(res > 0 - ? res + 0.5 - : res - 0.5 - ).getInt(); - } + RDOValue res = getNextValue(pRuntime); + if (m_range) + { + if (res < m_range.get().m_min) + { + return m_res_real + ? m_range.get().m_min + : RDOValue(m_range.get().m_min > 0 + ? m_range.get().m_min + 0.5 + : m_range.get().m_min - 0.5 + ).getInt(); + } + if (res > m_range.get().m_max) + { + return m_res_real + ? m_range.get().m_max + : RDOValue(m_range.get().m_max > 0 + ? m_range.get().m_max + 0.5 + : m_range.get().m_max - 0.5 + ).getInt(); + } + return m_res_real + ? res + : RDOValue(res > 0 + ? res + 0.5 + : res - 0.5 + ).getInt(); + // В новом РДО была сделана попытка выбирать новое случайное число, если текущее вышло за диапазон. Но при этом смешается среднее (оно и в другом случае может смещаться imho). Для совместимости оставим первый вариант. +// for ( int i = 0; i < 1000; i++ ) { +// if ( res >= m_range.get().m_min && res <= m_range.get().m_max ) return res_real ? res : static_cast(res > 0 ? res + 0.5 : res - 0.5); +// res = gen->next( pRuntime->getFuncArgument(0), pRuntime->getFuncArgument(1) ); +// } +// pRuntime->error().push("Не удается получить значение, попадающее в назначенный диапазон", this); +// return res_real ? m_range.get().m_min : static_cast(m_range.get().m_min); + } + else + { + return m_res_real + ? res + : RDOValue(res > 0 + ? res + 0.5 + : res - 0.5 + ).getInt(); + } } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/calc_sequence.cpp b/simulator/runtime/calc/calc_sequence.cpp index eaf09744e..f600aea38 100644 --- a/simulator/runtime/calc/calc_sequence.cpp +++ b/simulator/runtime/calc/calc_sequence.cpp @@ -12,41 +12,41 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcSeqInit // -------------------------------------------------------------------------------- RDOCalcSeqInit::RDOCalcSeqInit(int base, RandGenerator* gen) - : m_base(base) - , m_gen (gen ) + : m_base(base) + , m_gen (gen ) {} void RDOCalcSeqInit::setBase(int base) { - m_base = base; + m_base = base; } RDOValue RDOCalcSeqInit::doCalc(const LPRDORuntime& /*pRuntime*/) { - m_gen->setSeed(m_base); - return RDOValue(); + m_gen->setSeed(m_base); + return RDOValue(); } RDOCalcSeqInit::~RDOCalcSeqInit() { -// delete m_gen; +// delete m_gen; } // -------------------------------------------------------------------------------- // -------------------- RDOCalcSeqNext // -------------------------------------------------------------------------------- RDOCalcSeqNext::Range::Range() - : m_min(0) - , m_max(0) + : m_min(0) + , m_max(0) {} RDOCalcSeqNext::Range::Range(const double& min, const double& max) - : m_min(min) - , m_max(max) + : m_min(min) + , m_max(max) {} RDOCalcSeqNext::RDOCalcSeqNext() - : m_res_real(true ) + : m_res_real(true ) {} // -------------------------------------------------------------------------------- @@ -54,18 +54,18 @@ RDOCalcSeqNext::RDOCalcSeqNext() // -------------------------------------------------------------------------------- RDOValue RDOCalcSeqNextUniform::getNextValue(const LPRDORuntime& pRuntime) { - RDOValue from = pRuntime->getFuncArgument(0); - RDOValue to = pRuntime->getFuncArgument(1); - if (from > to) - { - pRuntime->error().push( - rdo::format("Для последовательности типа uniform нижняя граница диапазона должна быть меньше либо равна верхней, текущие значения: %s..%s" - , from.getAsString().c_str() - , to .getAsString().c_str()) - , srcInfo() - ); - } - return m_gen->next(from.getDouble(), to.getDouble()); + RDOValue from = pRuntime->getFuncArgument(0); + RDOValue to = pRuntime->getFuncArgument(1); + if (from > to) + { + pRuntime->error().push( + rdo::format("Для последовательности типа uniform нижняя граница диапазона должна быть меньше либо равна верхней, текущие значения: %s..%s" + , from.getAsString().c_str() + , to .getAsString().c_str()) + , srcInfo() + ); + } + return m_gen->next(from.getDouble(), to.getDouble()); } // -------------------------------------------------------------------------------- @@ -73,7 +73,7 @@ RDOValue RDOCalcSeqNextUniform::getNextValue(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOCalcSeqNextNormal::getNextValue(const LPRDORuntime& pRuntime) { - return m_gen->next(pRuntime->getFuncArgument(0).getDouble(), pRuntime->getFuncArgument(1).getDouble()); + return m_gen->next(pRuntime->getFuncArgument(0).getDouble(), pRuntime->getFuncArgument(1).getDouble()); } // -------------------------------------------------------------------------------- @@ -81,7 +81,7 @@ RDOValue RDOCalcSeqNextNormal::getNextValue(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOCalcSeqNextExponential::getNextValue(const LPRDORuntime& pRuntime) { - return m_gen->next(pRuntime->getFuncArgument(0).getDouble()); + return m_gen->next(pRuntime->getFuncArgument(0).getDouble()); } // -------------------------------------------------------------------------------- @@ -89,20 +89,20 @@ RDOValue RDOCalcSeqNextExponential::getNextValue(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOCalcSeqNextTriangular::getNextValue(const LPRDORuntime& pRuntime) { - RDOValue from = pRuntime->getFuncArgument(0); - RDOValue top = pRuntime->getFuncArgument(1); - RDOValue to = pRuntime->getFuncArgument(2); - if ((from > top) || (top > to)) - { - pRuntime->error().push( - rdo::format("Для треуголного закона распределения нужно указать левую границу, точку под высотой треугольника, правую границу: %s, %s, %s" - , from.getAsString().c_str() - , top.getAsString().c_str() - , to.getAsString().c_str()) - , srcInfo() - ); - } - return m_gen->next(from.getDouble(), top.getDouble(), to.getDouble()); + RDOValue from = pRuntime->getFuncArgument(0); + RDOValue top = pRuntime->getFuncArgument(1); + RDOValue to = pRuntime->getFuncArgument(2); + if ((from > top) || (top > to)) + { + pRuntime->error().push( + rdo::format("Для треуголного закона распределения нужно указать левую границу, точку под высотой треугольника, правую границу: %s, %s, %s" + , from.getAsString().c_str() + , top.getAsString().c_str() + , to.getAsString().c_str()) + , srcInfo() + ); + } + return m_gen->next(from.getDouble(), top.getDouble(), to.getDouble()); } // -------------------------------------------------------------------------------- @@ -110,7 +110,7 @@ RDOValue RDOCalcSeqNextTriangular::getNextValue(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOCalcSeqNextByHist::getNextValue(const LPRDORuntime& /*pRuntime*/) { - return m_gen->next(); + return m_gen->next(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/calc_sequence.h b/simulator/runtime/calc/calc_sequence.h index a17d0fbaa..cabaaa883 100644 --- a/simulator/runtime/calc/calc_sequence.h +++ b/simulator/runtime/calc/calc_sequence.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_SEQUENCE_H_ -#define _LIB_RUNTIME_CALC_SEQUENCE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -10,58 +9,55 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Инициализация последовательности псевдослучайных чисел PREDECLARE_POINTER(RDOCalcSeqInit); class RDOCalcSeqInit: public RDOCalc { DECLARE_FACTORY(RDOCalcSeqInit) public: - void setBase(int base); + void setBase(int base); private: - RDOCalcSeqInit(int base, RandGenerator* gen); - virtual ~RDOCalcSeqInit(); + RDOCalcSeqInit(int base, RandGenerator* gen); + virtual ~RDOCalcSeqInit(); - int m_base; - RandGenerator* m_gen; + int m_base; + RandGenerator* m_gen; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Вычисляет следующее значение последовательности псевдослучайных чисел PREDECLARE_POINTER(RDOCalcSeqNext); class RDOCalcSeqNext: public RDOFunCalc { public: - struct Range - { - double m_min; - double m_max; + struct Range + { + double m_min; + double m_max; - Range(); - Range(const double& min, const double& max); - }; + Range(); + Range(const double& min, const double& max); + }; - bool m_res_real; - boost::optional m_range; + bool m_res_real; + boost::optional m_range; protected: - RDOCalcSeqNext(); + RDOCalcSeqNext(); - virtual RDOValue getNextValue(const LPRDORuntime& pRuntime) = 0; + virtual RDOValue getNextValue(const LPRDORuntime& pRuntime) = 0; }; -//! Псевдослучайное распределение template class RDOCalcRandomDistribution: public RDOCalcSeqNext { protected: - RDOCalcRandomDistribution(T* gen); - virtual ~RDOCalcRandomDistribution(); - T* m_gen; + RDOCalcRandomDistribution(T* gen); + virtual ~RDOCalcRandomDistribution(); + T* m_gen; private: - DECLARE_ICalc; + DECLARE_ICalc; }; #define DEFINE_RANDON_DISTRIBUTION(CalcName, Distribution) \ @@ -70,11 +66,11 @@ class RDOCalcSeqNext##CalcName: public RDOCalcRandomDistribution \ { \ DECLARE_FACTORY(RDOCalcSeqNext##CalcName) \ private: \ - RDOCalcSeqNext##CalcName(Distribution* gen) \ - : RDOCalcRandomDistribution(gen) \ - {} \ - \ - virtual RDOValue getNextValue(const LPRDORuntime& pRuntime); \ + RDOCalcSeqNext##CalcName(Distribution* gen) \ + : RDOCalcRandomDistribution(gen) \ + {} \ + \ + virtual RDOValue getNextValue(const LPRDORuntime& pRuntime); \ }; DEFINE_RANDON_DISTRIBUTION(Uniform, RandGeneratorUniform); @@ -90,5 +86,3 @@ DEFINE_RANDON_DISTRIBUTION(ByHist, RandGeneratorCommonNext); CLOSE_RDO_RUNTIME_NAMESPACE #include "simulator/runtime/calc/calc_sequence-inl.h" - -#endif // _LIB_RUNTIME_CALC_SEQUENCE_H_ diff --git a/simulator/runtime/calc/calc_watch.cpp b/simulator/runtime/calc/calc_watch.cpp index c4429220f..f07979e11 100644 --- a/simulator/runtime/calc/calc_watch.cpp +++ b/simulator/runtime/calc/calc_watch.cpp @@ -12,7 +12,7 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcWatchGroupStart // -------------------------------------------------------------------------------- RDOCalcWatchGroupStart::RDOCalcWatchGroupStart(const LPIResultGroup& pResultGroup) - : m_pResultGroup(pResultGroup) + : m_pResultGroup(pResultGroup) {} RDOCalcWatchGroupStart::~RDOCalcWatchGroupStart() @@ -20,16 +20,16 @@ RDOCalcWatchGroupStart::~RDOCalcWatchGroupStart() RDOValue RDOCalcWatchGroupStart::doCalc(const LPRDORuntime& pRuntime) { - ASSERT(m_pResultGroup); - m_pResultGroup->onStart(pRuntime); - return RDOValue(); + ASSERT(m_pResultGroup); + m_pResultGroup->onStart(pRuntime); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcWatchGroupStop // -------------------------------------------------------------------------------- RDOCalcWatchGroupStop::RDOCalcWatchGroupStop(const LPIResultGroup& pResultGroup) - : m_pResultGroup(pResultGroup) + : m_pResultGroup(pResultGroup) {} RDOCalcWatchGroupStop::~RDOCalcWatchGroupStop() @@ -37,9 +37,9 @@ RDOCalcWatchGroupStop::~RDOCalcWatchGroupStop() RDOValue RDOCalcWatchGroupStop::doCalc(const LPRDORuntime& pRuntime) { - ASSERT(m_pResultGroup); - m_pResultGroup->onStop(pRuntime); - return RDOValue(); + ASSERT(m_pResultGroup); + m_pResultGroup->onStop(pRuntime); + return RDOValue(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/calc_watch.h b/simulator/runtime/calc/calc_watch.h index 069868b70..1c13c3f73 100644 --- a/simulator/runtime/calc/calc_watch.h +++ b/simulator/runtime/calc/calc_watch.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_WATCH_H_ -#define _LIB_RUNTIME_CALC_WATCH_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,34 +8,30 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Начало сбора статистики по группе показателей PREDECLARE_POINTER(RDOCalcWatchGroupStart); class RDOCalcWatchGroupStart: public RDOCalc { DECLARE_FACTORY(RDOCalcWatchGroupStart) protected: - RDOCalcWatchGroupStart(const LPIResultGroup& pResultGroup); - virtual ~RDOCalcWatchGroupStart(); + RDOCalcWatchGroupStart(const LPIResultGroup& pResultGroup); + virtual ~RDOCalcWatchGroupStart(); - LPIResultGroup m_pResultGroup; + LPIResultGroup m_pResultGroup; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Окончание сбора статистики по группе показателей PREDECLARE_POINTER(RDOCalcWatchGroupStop); class RDOCalcWatchGroupStop: public RDOCalc { DECLARE_FACTORY(RDOCalcWatchGroupStop) protected: - RDOCalcWatchGroupStop(const LPIResultGroup& pResultGroup); - virtual ~RDOCalcWatchGroupStop(); + RDOCalcWatchGroupStop(const LPIResultGroup& pResultGroup); + virtual ~RDOCalcWatchGroupStop(); - LPIResultGroup m_pResultGroup; + LPIResultGroup m_pResultGroup; - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_WATCH_H_ diff --git a/simulator/runtime/calc/function/calc_function.cpp b/simulator/runtime/calc/function/calc_function.cpp index 216de1e7f..b2b2e674e 100644 --- a/simulator/runtime/calc/function/calc_function.cpp +++ b/simulator/runtime/calc/function/calc_function.cpp @@ -23,20 +23,20 @@ void RDOFunCalc::addRetCalc(const LPRDOCalc& /*pCalc*/) // Функция типа таблица // -------------------------------------------------------------------------------- RDOFuncTableCalc::RDOFuncTableCalc(const LPRDOCalc& pArgument) - : m_pArgument(pArgument) + : m_pArgument(pArgument) { - ASSERT(m_pArgument); + ASSERT(m_pArgument); } void RDOFuncTableCalc::addResultCalc(const LPRDOCalcConst& pResult) { - m_pResultList.push_back(pResult); + m_pResultList.push_back(pResult); } RDOValue RDOFuncTableCalc::doCalc(const LPRDORuntime& pRuntime) { - const std::size_t index = m_pArgument->calcValue(pRuntime).getUInt(); - return m_pResultList[index]->calcValue(pRuntime); + const std::size_t index = m_pArgument->calcValue(pRuntime).getUInt(); + return m_pResultList[index]->calcValue(pRuntime); } // -------------------------------------------------------------------------------- @@ -45,30 +45,30 @@ RDOValue RDOFuncTableCalc::doCalc(const LPRDORuntime& pRuntime) // Функция типа список // -------------------------------------------------------------------------------- RDOFunListCalc::RDOFunListCalc(const LPRDOCalcConst& pDefaultValue) - : m_pDefaultValue(pDefaultValue) + : m_pDefaultValue(pDefaultValue) {} void RDOFunListCalc::addCase(const LPRDOCalc& pCase, const LPRDOCalcConst& pResult) { - ASSERT(pCase ); - ASSERT(pResult); + ASSERT(pCase ); + ASSERT(pResult); - m_caseList .push_back(pCase ); - m_resultList.push_back(pResult); + m_caseList .push_back(pCase ); + m_resultList.push_back(pResult); } RDOValue RDOFunListCalc::doCalc(const LPRDORuntime& pRuntime) { - ResultList::const_iterator resultIt = m_resultList.begin(); - for (const auto& calc: m_caseList) - { - if (calc->calcValue(pRuntime).getAsBool()) - { - return (*resultIt)->calcValue(pRuntime); - } - ++resultIt; - } - return m_pDefaultValue->calcValue(pRuntime); + ResultList::const_iterator resultIt = m_resultList.begin(); + for (const auto& calc: m_caseList) + { + if (calc->calcValue(pRuntime).getAsBool()) + { + return (*resultIt)->calcValue(pRuntime); + } + ++resultIt; + } + return m_pDefaultValue->calcValue(pRuntime); } // -------------------------------------------------------------------------------- @@ -79,115 +79,115 @@ RDOFunAlgorithmicCalc::RDOFunAlgorithmicCalc() void RDOFunAlgorithmicCalc::addCalcIf(const LPRDOCalc& pCondition, const LPRDOCalc& pAction) { - ASSERT(pCondition); - ASSERT(pAction ); + ASSERT(pCondition); + ASSERT(pAction ); - m_conditionList.push_back(pCondition); - m_actionList .push_back(pAction ); + m_conditionList.push_back(pCondition); + m_actionList .push_back(pAction ); } RDOValue RDOFunAlgorithmicCalc::doCalc(const LPRDORuntime& pRuntime) { - RDOCalcList::const_iterator actionIt = m_actionList.begin(); - for (const auto& condition: m_conditionList) - { - if (condition->calcValue(pRuntime).getAsBool()) - { - return (*actionIt)->calcValue(pRuntime); - } - ++actionIt; - } + RDOCalcList::const_iterator actionIt = m_actionList.begin(); + for (const auto& condition: m_conditionList) + { + if (condition->calcValue(pRuntime).getAsBool()) + { + return (*actionIt)->calcValue(pRuntime); + } + ++actionIt; + } - // До сюда дело дойти не должно, т.к. последний conditions должен быть значением по молчанию - pRuntime->error().push("Внутренная ошибка, RDOFunAlgorithmicCalc", srcInfo()); - return RDOValue(); + // До сюда дело дойти не должно, т.к. последний conditions должен быть значением по молчанию + pRuntime->error().push("Внутренняя ошибка, RDOFunAlgorithmicCalc", srcInfo()); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcFuncParam // -------------------------------------------------------------------------------- RDOCalcFuncParam::RDOCalcFuncParam(std::size_t paramID, const RDOSrcInfo& src_info) - : m_paramID(paramID) + : m_paramID(paramID) { - setSrcInfo(src_info); + setSrcInfo(src_info); } RDOValue RDOCalcFuncParam::doCalc(const LPRDORuntime& pRuntime) { - return pRuntime->getFuncArgument(m_paramID); + return pRuntime->getFuncArgument(m_paramID); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcGetConst // -------------------------------------------------------------------------------- RDOCalcGetConst::RDOCalcGetConst(std::size_t constantID) - : m_constantID(constantID) + : m_constantID(constantID) {} RDOValue RDOCalcGetConst::doCalc(const LPRDORuntime& pRuntime) { - return pRuntime->getConstValue(m_constantID); + return pRuntime->getConstValue(m_constantID); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcSetConst // -------------------------------------------------------------------------------- RDOCalcSetConst::RDOCalcSetConst(std::size_t constantID, const LPRDOCalc& pCalc) - : m_constantID(constantID) - , m_pCalc (pCalc ) + : m_constantID(constantID) + , m_pCalc (pCalc ) { - if (m_pCalc) - { - setSrcInfo(m_pCalc->srcInfo()); - } + if (m_pCalc) + { + setSrcInfo(m_pCalc->srcInfo()); + } } RDOValue RDOCalcSetConst::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->setConstValue(m_constantID, m_pCalc->calcValue(pRuntime)); - return RDOValue(); + pRuntime->setConstValue(m_constantID, m_pCalc->calcValue(pRuntime)); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcFunctionCaller // -------------------------------------------------------------------------------- RDOCalcFunctionCaller::RDOCalcFunctionCaller(const LPRDOCalc& pFunction) - : m_pFunction(pFunction) + : m_pFunction(pFunction) {} void RDOCalcFunctionCaller::addParameter(const LPRDOCalc& pParam) { - m_paramList.push_back(pParam); + m_paramList.push_back(pParam); } void RDOCalcFunctionCaller::setFunctionCalc(const LPRDOCalc& pFunction) { - m_pFunction = pFunction; + m_pFunction = pFunction; } const LPRDOCalc& RDOCalcFunctionCaller::function() const { - return m_pFunction; + return m_pFunction; } RDOValue RDOCalcFunctionCaller::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->pushFuncTop(); - for (const auto& param: m_paramList) - { - pRuntime->pushFuncArgument(param->calcValue(pRuntime)); - } - pRuntime->resetFuncTop(m_paramList.size()); + pRuntime->pushFuncTop(); + for (const auto& param: m_paramList) + { + pRuntime->pushFuncArgument(param->calcValue(pRuntime)); + } + pRuntime->resetFuncTop(m_paramList.size()); - RDOValue value = m_pFunction->calcValue(pRuntime); + RDOValue value = m_pFunction->calcValue(pRuntime); - for (const auto& param: m_paramList) - { - pRuntime->popFuncArgument(); - } - pRuntime->popFuncTop(); + for (std::size_t i = 0; i < m_paramList.size(); ++i) + { + pRuntime->popFuncArgument(); + } + pRuntime->popFuncTop(); - return value; + return value; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/function/calc_function.h b/simulator/runtime/calc/function/calc_function.h index 5ff37d8a3..4a0c51c4f 100644 --- a/simulator/runtime/calc/function/calc_function.h +++ b/simulator/runtime/calc/function/calc_function.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_FUNCTION_H_ -#define _LIB_RUNTIME_CALC_FUNCTION_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,133 +7,123 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Базовый файл функций с закладки FUN PREDECLARE_POINTER(RDOFunCalc); class RDOFunCalc: public RDOCalc { public: - virtual void addRetCalc(const LPRDOCalc& pCalc); + virtual void addRetCalc(const LPRDOCalc& pCalc); protected: - RDOFunCalc(); + RDOFunCalc(); }; -//! Табличная функция PREDECLARE_POINTER(RDOFuncTableCalc); class RDOFuncTableCalc: public RDOFunCalc { DECLARE_FACTORY(RDOFuncTableCalc) public: - void addResultCalc(const LPRDOCalcConst& pResult); + void addResultCalc(const LPRDOCalcConst& pResult); private: - RDOFuncTableCalc(const LPRDOCalc& pArgument); + RDOFuncTableCalc(const LPRDOCalc& pArgument); - typedef std::vector ResultList; + typedef std::vector ResultList; - ResultList m_pResultList; - LPRDOCalc m_pArgument; + ResultList m_pResultList; + LPRDOCalc m_pArgument; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Функция типа список PREDECLARE_POINTER(RDOFunListCalc); class RDOFunListCalc: public RDOFunCalc { DECLARE_FACTORY(RDOFunListCalc) public: - void addCase(const LPRDOCalc& pCase, const LPRDOCalcConst& pResult); + void addCase(const LPRDOCalc& pCase, const LPRDOCalcConst& pResult); private: - RDOFunListCalc(const LPRDOCalcConst& pDefaultValue); + RDOFunListCalc(const LPRDOCalcConst& pDefaultValue); - typedef std::vector ResultList; + typedef std::vector ResultList; - RDOCalcList m_caseList; - ResultList m_resultList; - LPRDOCalcConst m_pDefaultValue; + RDOCalcList m_caseList; + ResultList m_resultList; + LPRDOCalcConst m_pDefaultValue; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Алгоритмическая функция PREDECLARE_POINTER(RDOFunAlgorithmicCalc); class RDOFunAlgorithmicCalc: public RDOFunCalc { DECLARE_FACTORY(RDOFunAlgorithmicCalc) public: - void addCalcIf(const LPRDOCalc& pCondition, const LPRDOCalc& pAction); + void addCalcIf(const LPRDOCalc& pCondition, const LPRDOCalc& pAction); protected: - RDOFunAlgorithmicCalc(); + RDOFunAlgorithmicCalc(); - RDOCalcList m_conditionList; - RDOCalcList m_actionList; + RDOCalcList m_conditionList; + RDOCalcList m_actionList; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Параметр функции PREDECLARE_POINTER(RDOCalcFuncParam); class RDOCalcFuncParam: public RDOCalc { DECLARE_FACTORY(RDOCalcFuncParam) private: - RDOCalcFuncParam(std::size_t paramID, const RDOSrcInfo& src_info); + RDOCalcFuncParam(std::size_t paramID, const RDOSrcInfo& src_info); - std::size_t m_paramID; + std::size_t m_paramID; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Получение константы с закладки FUN PREDECLARE_POINTER(RDOCalcGetConst); class RDOCalcGetConst: public RDOCalc { DECLARE_FACTORY(RDOCalcGetConst) private: - RDOCalcGetConst(std::size_t constantID); + RDOCalcGetConst(std::size_t constantID); - std::size_t m_constantID; + std::size_t m_constantID; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Инициализация константы PREDECLARE_POINTER(RDOCalcSetConst); class RDOCalcSetConst: public RDOCalc { DECLARE_FACTORY(RDOCalcSetConst) private: - RDOCalcSetConst(std::size_t constantID, const LPRDOCalc& pCalc); + RDOCalcSetConst(std::size_t constantID, const LPRDOCalc& pCalc); - std::size_t m_constantID; - LPRDOCalc m_pCalc; + std::size_t m_constantID; + LPRDOCalc m_pCalc; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Вызов функции (function-caller) PREDECLARE_POINTER(RDOCalcFunctionCaller); class RDOCalcFunctionCaller: public RDOCalc { DECLARE_FACTORY(RDOCalcFunctionCaller) public: - void addParameter (const LPRDOCalc& pParam ); - void setFunctionCalc(const LPRDOCalc& pFunction); + void addParameter (const LPRDOCalc& pParam ); + void setFunctionCalc(const LPRDOCalc& pFunction); - const LPRDOCalc& function() const; + const LPRDOCalc& function() const; private: - RDOCalcFunctionCaller(const LPRDOCalc& pFunction); + RDOCalcFunctionCaller(const LPRDOCalc& pFunction); - RDOCalcList m_paramList; - LPRDOCalc m_pFunction; + RDOCalcList m_paramList; + LPRDOCalc m_pFunction; - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_FUNCTION_H_ diff --git a/simulator/runtime/calc/function/calc_function_internal-inl.h b/simulator/runtime/calc/function/calc_function_internal-inl.h index a491a0323..c33f3451a 100644 --- a/simulator/runtime/calc/function/calc_function_internal-inl.h +++ b/simulator/runtime/calc/function/calc_function_internal-inl.h @@ -11,30 +11,30 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- template inline RDOFunCalcStd::RDOFunCalcStd(function_type pFunction) - : m_pFunction(pFunction) + : m_pFunction(pFunction) {} template inline RDOValue RDOFunCalcStd::doCalc(const LPRDORuntime& pRuntime) { - return calc(pRuntime, typename F::param_count()); + return calc(pRuntime, typename F::param_count()); } template inline RDOValue RDOFunCalcStd::calc(const LPRDORuntime& pRuntime, std_fun_one_param) { - return m_pFunction( - GetParam::getParam(pRuntime, 0) - ); + return m_pFunction( + GetParam::getParam(pRuntime, 0) + ); } template inline RDOValue RDOFunCalcStd::calc(const LPRDORuntime& pRuntime, std_fun_two_param) { - return m_pFunction( - GetParam::getParam(pRuntime, 0), - GetParam::getParam(pRuntime, 1) - ); + return m_pFunction( + GetParam::getParam(pRuntime, 0), + GetParam::getParam(pRuntime, 1) + ); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/function/calc_function_internal.cpp b/simulator/runtime/calc/function/calc_function_internal.cpp index aa8a98046..b49f096ea 100644 --- a/simulator/runtime/calc/function/calc_function_internal.cpp +++ b/simulator/runtime/calc/function/calc_function_internal.cpp @@ -10,12 +10,12 @@ OPEN_RDO_RUNTIME_NAMESPACE double GetParam::getParam(const LPRDORuntime& pRuntime, std::size_t paramNumber) { - return pRuntime->getFuncArgument(paramNumber).getDouble(); + return pRuntime->getFuncArgument(paramNumber).getDouble(); } int GetParam::getParam(const LPRDORuntime& pRuntime, std::size_t paramNumber) { - return pRuntime->getFuncArgument(paramNumber).getInt(); + return pRuntime->getFuncArgument(paramNumber).getInt(); } diff --git a/simulator/runtime/calc/function/calc_function_internal.h b/simulator/runtime/calc/function/calc_function_internal.h index b7bb2142d..cb5853a87 100644 --- a/simulator/runtime/calc/function/calc_function_internal.h +++ b/simulator/runtime/calc/function/calc_function_internal.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_FUNCTION_INTERNAL_H_ -#define _LIB_RUNTIME_CALC_FUNCTION_INTERNAL_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,27 +12,25 @@ OPEN_RDO_RUNTIME_NAMESPACE class std_fun_one_param {}; class std_fun_two_param {}; -//! Функция с одним параметром template class std_fun1 { public: - typedef RT return_type; - typedef P1 arg1_type; - typedef RT (*function_type)(P1); - typedef std_fun_one_param param_count; + typedef RT return_type; + typedef P1 arg1_type; + typedef RT (*function_type)(P1); + typedef std_fun_one_param param_count; }; -//! Функция с двумя параметрами template class std_fun2 { public: - typedef RT return_type; - typedef P1 arg1_type; - typedef P2 arg2_type; - typedef RT (*function_type)(P1, P2); - typedef std_fun_two_param param_count; + typedef RT return_type; + typedef P1 arg1_type; + typedef P2 arg2_type; + typedef RT (*function_type)(P1, P2); + typedef std_fun_two_param param_count; }; template @@ -45,26 +42,23 @@ struct GetParam { static double getParam(const LPRDORuntime& pRuntime, s template <> struct GetParam { static int getParam(const LPRDORuntime& pRuntime, std::size_t paramNumber); }; -//! Функции из пространства имен std C++ template class RDOFunCalcStd: public RDOFunCalc { public: - typedef typename F::function_type function_type; + typedef typename F::function_type function_type; - RDOFunCalcStd(function_type pFunction); + RDOFunCalcStd(function_type pFunction); private: - function_type m_pFunction; + function_type m_pFunction; - RDOValue calc(const LPRDORuntime& pRuntime, std_fun_one_param); - RDOValue calc(const LPRDORuntime& pRuntime, std_fun_two_param); + RDOValue calc(const LPRDORuntime& pRuntime, std_fun_one_param); + RDOValue calc(const LPRDORuntime& pRuntime, std_fun_two_param); - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE #include "simulator/runtime/calc/function/calc_function_internal-inl.h" - -#endif // _LIB_RUNTIME_CALC_FUNCTION_INTERNAL_H_ diff --git a/simulator/runtime/calc/function/calc_function_system.cpp b/simulator/runtime/calc/function/calc_function_system.cpp index fa7d8b5b8..26ce2b3f2 100644 --- a/simulator/runtime/calc/function/calc_function_system.cpp +++ b/simulator/runtime/calc/function/calc_function_system.cpp @@ -13,7 +13,7 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- RDOValue RDOCalcGetTimeNow::doCalc(const LPRDORuntime& pRuntime) { - return pRuntime->getTimeNow(); + return pRuntime->getTimeNow(); } // -------------------------------------------------------------------------------- @@ -21,7 +21,7 @@ RDOValue RDOCalcGetTimeNow::doCalc(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOCalcGetSeconds::doCalc(const LPRDORuntime& pRuntime) { - return pRuntime->getSeconds(); + return pRuntime->getSeconds(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/function/calc_function_system.h b/simulator/runtime/calc/function/calc_function_system.h index 64de97640..8edf2cbc3 100644 --- a/simulator/runtime/calc/function/calc_function_system.h +++ b/simulator/runtime/calc/function/calc_function_system.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_FUNCTION_SYSTEM_H_ -#define _LIB_RUNTIME_CALC_FUNCTION_SYSTEM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,7 +7,6 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Получение текущего модельного времени PREDECLARE_POINTER(RDOCalcGetTimeNow); class RDOCalcGetTimeNow: public RDOCalc { @@ -16,7 +14,6 @@ DECLARE_FACTORY(RDOCalcGetTimeNow) DECLARE_ICalc; }; -//! Получение реального времени работы модели PREDECLARE_POINTER(RDOCalcGetSeconds); class RDOCalcGetSeconds: public RDOCalc { @@ -25,5 +22,3 @@ DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_FUNCTION_SYSTEM_H_ diff --git a/simulator/runtime/calc/operation/calc_arithm.cpp b/simulator/runtime/calc/operation/calc_arithm.cpp index 71b9ea006..6ca940b98 100644 --- a/simulator/runtime/calc/operation/calc_arithm.cpp +++ b/simulator/runtime/calc/operation/calc_arithm.cpp @@ -13,44 +13,44 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcDiv // -------------------------------------------------------------------------------- RDOCalcDiv::RDOCalcDiv(const LPRDOCalc& pLeft, const LPRDOCalc& pRight) - : parent_type(pLeft, pRight) + : parent_type(pLeft, pRight) {} RDOValue RDOCalcDiv::doCalc(const LPRDORuntime& pRuntime) { - ++OperatorType::getCalcCounter(); - RDOValue right = m_pRight->calcValue(pRuntime); - if (right == 0) - { - pRuntime->error().push("Деление на ноль", srcInfo()); - } - return m_pLeft->calcValue(pRuntime) / right; + ++OperatorType::getCalcCounter(); + RDOValue right = m_pRight->calcValue(pRuntime); + if (right == 0) + { + pRuntime->error().push("Деление на ноль", srcInfo()); + } + return m_pLeft->calcValue(pRuntime) / right; } // -------------------------------------------------------------------------------- // -------------------- RDOCalcPlusEnumSafe // -------------------------------------------------------------------------------- RDOCalcPlusEnumSafe::RDOCalcPlusEnumSafe(const LPRDOCalc& pLeft, const LPRDOCalc& pRight) - : RDOCalcPlus(pLeft, pRight) + : RDOCalcPlus(pLeft, pRight) {} RDOValue RDOCalcPlusEnumSafe::doCalc(const LPRDORuntime& pRuntime) { - ++OperatorType::getCalcCounter(); - return m_pLeft->calcValue(pRuntime).getEnumAsInt() + m_pRight->calcValue(pRuntime).getEnumAsInt(); + ++OperatorType::getCalcCounter(); + return m_pLeft->calcValue(pRuntime).getEnumAsInt() + m_pRight->calcValue(pRuntime).getEnumAsInt(); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcMultEnumSafe // -------------------------------------------------------------------------------- RDOCalcMultEnumSafe::RDOCalcMultEnumSafe(const LPRDOCalc& pLeft, const LPRDOCalc& pRight) - : RDOCalcMult(pLeft, pRight) + : RDOCalcMult(pLeft, pRight) {} RDOValue RDOCalcMultEnumSafe::doCalc(const LPRDORuntime& pRuntime) { - ++OperatorType::getCalcCounter(); - return m_pLeft->calcValue(pRuntime).getEnumAsInt() * m_pRight->calcValue(pRuntime).getEnumAsInt(); + ++OperatorType::getCalcCounter(); + return m_pLeft->calcValue(pRuntime).getEnumAsInt() * m_pRight->calcValue(pRuntime).getEnumAsInt(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/operation/calc_arithm.h b/simulator/runtime/calc/operation/calc_arithm.h index c2ca5622a..c08fa7c53 100644 --- a/simulator/runtime/calc/operation/calc_arithm.h +++ b/simulator/runtime/calc/operation/calc_arithm.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_OPERATION_ARITHM_H_ -#define _LIB_RUNTIME_CALC_OPERATION_ARITHM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,53 +7,44 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Оператор присваивания -typedef RDOCalcBinary, OperatorType::OT_ARITHM> RDOCalcSet; DECLARE_POINTER(RDOCalcSet); +typedef RDOCalcBinary, OperatorType::Type::ARITHM> RDOCalcSet; DECLARE_POINTER(RDOCalcSet); -//! Бинарный оператор плюс -typedef RDOCalcBinary, OperatorType::OT_ARITHM> RDOCalcPlus; DECLARE_POINTER(RDOCalcPlus); +typedef RDOCalcBinary, OperatorType::Type::ARITHM> RDOCalcPlus; DECLARE_POINTER(RDOCalcPlus); -//! Бинарный оператор минус -typedef RDOCalcBinary, OperatorType::OT_ARITHM> RDOCalcMinus; DECLARE_POINTER(RDOCalcMinus); +typedef RDOCalcBinary, OperatorType::Type::ARITHM> RDOCalcMinus; DECLARE_POINTER(RDOCalcMinus); -//! Бинарный оператор умножить -typedef RDOCalcBinary, OperatorType::OT_ARITHM> RDOCalcMult; DECLARE_POINTER(RDOCalcMult); +typedef RDOCalcBinary, OperatorType::Type::ARITHM> RDOCalcMult; DECLARE_POINTER(RDOCalcMult); -//! Бинарный оператор разделить -class RDOCalcDiv: public RDOCalcBinary, OperatorType::OT_ARITHM> +class RDOCalcDiv: public RDOCalcBinary, OperatorType::Type::ARITHM> { DECLARE_FACTORY(RDOCalcDiv); private: - typedef RDOCalcBinary, OperatorType::OT_ARITHM> parent_type; + typedef RDOCalcBinary, OperatorType::Type::ARITHM> parent_type; - RDOCalcDiv(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); + RDOCalcDiv(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); - DECLARE_ICalc; + DECLARE_ICalc; }; DECLARE_POINTER(RDOCalcDiv); -//! Бинарный оператор сложения по перечислению PREDECLARE_POINTER(RDOCalcPlusEnumSafe); class RDOCalcPlusEnumSafe: public RDOCalcPlus { DECLARE_FACTORY(RDOCalcPlusEnumSafe) private: - RDOCalcPlusEnumSafe(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); + RDOCalcPlusEnumSafe(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Бинарный оператор умножить по перечислению PREDECLARE_POINTER(RDOCalcMultEnumSafe); class RDOCalcMultEnumSafe: public RDOCalcMult { DECLARE_FACTORY(RDOCalcMultEnumSafe) private: - RDOCalcMultEnumSafe(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); + RDOCalcMultEnumSafe(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_OPERATION_ARITHM_H_ diff --git a/simulator/runtime/calc/operation/calc_binary-inl.h b/simulator/runtime/calc/operation/calc_binary-inl.h index 275d8da68..a2edb5e94 100644 --- a/simulator/runtime/calc/operation/calc_binary-inl.h +++ b/simulator/runtime/calc/operation/calc_binary-inl.h @@ -11,23 +11,23 @@ OPEN_RDO_RUNTIME_NAMESPACE template inline LPRDOCalc RDOCalcBinaryBase::generateCalc(const LPRDOCalc& pFirst, const LPRDOCalc& pSecond) { - ASSERT(pFirst ); - ASSERT(pSecond); + ASSERT(pFirst ); + ASSERT(pSecond); - LPRDOCalcConst pConstCalc1 = pFirst.object_dynamic_cast(); - LPRDOCalcConst pConstCalc2 = pSecond.object_dynamic_cast(); - LPRDOCalc pCalc; - if (pConstCalc1 && pConstCalc2) - { - pCalc = rdo::Factory::create((pConstCalc1->getValue().*T::caller_type::method())(pConstCalc2->getValue())); - pCalc->setSrcInfo(T::getStaticSrcInfo(pConstCalc1, pConstCalc2)); - } - else - { - pCalc = rdo::Factory::create(pFirst, pSecond); - } - ASSERT(pCalc); - return pCalc; + LPRDOCalcConst pConstCalc1 = pFirst.object_dynamic_cast(); + LPRDOCalcConst pConstCalc2 = pSecond.object_dynamic_cast(); + LPRDOCalc pCalc; + if (pConstCalc1 && pConstCalc2) + { + pCalc = rdo::Factory::create((pConstCalc1->getValue().*T::caller_type::method())(pConstCalc2->getValue())); + pCalc->setSrcInfo(T::getStaticSrcInfo(pConstCalc1, pConstCalc2)); + } + else + { + pCalc = rdo::Factory::create(pFirst, pSecond); + } + ASSERT(pCalc); + return pCalc; } // -------------------------------------------------------------------------------- @@ -36,7 +36,7 @@ inline LPRDOCalc RDOCalcBinaryBase::generateCalc(const LPRDOCalc& pFirst, const template inline typename BinaryOperatorConstP1::method_type BinaryOperatorConstP1::method() { - return pMethod; + return pMethod; } // -------------------------------------------------------------------------------- @@ -45,7 +45,7 @@ inline typename BinaryOperatorConstP1::method_type BinaryOper template inline typename BinaryOperatorNonConstP1::method_type BinaryOperatorNonConstP1::method() { - return pMethod; + return pMethod; } // -------------------------------------------------------------------------------- @@ -53,42 +53,42 @@ inline typename BinaryOperatorNonConstP1::method_type BinaryO // -------------------------------------------------------------------------------- template inline RDOCalcBinary::RDOCalcBinary(const LPRDOCalc& pLeft, const LPRDOCalc& pRight) - : RDOCalcBinaryBase(pLeft, pRight) + : RDOCalcBinaryBase(pLeft, pRight) { - setSrcInfo(getStaticSrcInfo(m_pLeft, m_pRight)); + setSrcInfo(getStaticSrcInfo(m_pLeft, m_pRight)); } template inline LPRDOCalc RDOCalcBinary::getLeft() const { - return m_pLeft; + return m_pLeft; } template inline LPRDOCalcConst RDOCalcBinary::getRightAsConst() const { - return m_pRight.object_static_cast(); + return m_pRight.object_static_cast(); } template inline void RDOCalcBinary::setRight(const LPRDOCalc& pRight) { - m_pRight = pRight; + m_pRight = pRight; } template inline RDOSrcInfo RDOCalcBinary::getStaticSrcInfo(const LPRDOCalc& pLeft, const LPRDOCalc& pRight) { - RDOSrcInfo srcInfo; - srcInfo.setSrcInfo(pLeft->srcInfo(), rdo::format(" %s ", OperatorName::name(F::method()).c_str()), pRight->srcInfo()); - return srcInfo; + RDOSrcInfo srcInfo; + srcInfo.setSrcInfo(pLeft->srcInfo(), rdo::format(" %s ", OperatorName::name(F::method()).c_str()), pRight->srcInfo()); + return srcInfo; } template inline RDOValue RDOCalcBinary::doCalc(const LPRDORuntime& pRuntime) { - ++OperatorType::getCalcCounter(); - return (m_pLeft->calcValue(pRuntime).*F::method())(m_pRight->calcValue(pRuntime)); + ++OperatorType::getCalcCounter(); + return (m_pLeft->calcValue(pRuntime).*F::method())(m_pRight->calcValue(pRuntime)); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/operation/calc_binary.cpp b/simulator/runtime/calc/operation/calc_binary.cpp index f5914b1ed..2c8af205d 100644 --- a/simulator/runtime/calc/operation/calc_binary.cpp +++ b/simulator/runtime/calc/operation/calc_binary.cpp @@ -11,11 +11,11 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcBinaryBase // -------------------------------------------------------------------------------- RDOCalcBinaryBase::RDOCalcBinaryBase(const LPRDOCalc& pLeft, const LPRDOCalc& pRight) - : m_pLeft (pLeft ) - , m_pRight(pRight) + : m_pLeft (pLeft ) + , m_pRight(pRight) { - ASSERT(m_pLeft ); - ASSERT(m_pRight); + ASSERT(m_pLeft ); + ASSERT(m_pRight); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/operation/calc_binary.h b/simulator/runtime/calc/operation/calc_binary.h index 9f58cdecb..52036ec5e 100644 --- a/simulator/runtime/calc/operation/calc_binary.h +++ b/simulator/runtime/calc/operation/calc_binary.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_OPERATION_BINARY_H_ -#define _LIB_RUNTIME_CALC_OPERATION_BINARY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,66 +8,59 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Базовый класс для бинарных операторов class RDOCalcBinaryBase: public RDOCalc { public: - template - static LPRDOCalc generateCalc(const LPRDOCalc& pFirst, const LPRDOCalc& pSecond); + template + static LPRDOCalc generateCalc(const LPRDOCalc& pFirst, const LPRDOCalc& pSecond); protected: - RDOCalcBinaryBase(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); + RDOCalcBinaryBase(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); - LPRDOCalc m_pLeft; - LPRDOCalc m_pRight; + LPRDOCalc m_pLeft; + LPRDOCalc m_pRight; }; -//! Константный бинарный оператор RDOValue template struct BinaryOperatorConstP1 { - typedef ret_type (RDOValue::*method_type)(const RDOValue&) const; + typedef ret_type (RDOValue::*method_type)(const RDOValue&) const; - static method_type method(); + static method_type method(); }; -//! Неконстантный бинарный оператор RDOValue template struct BinaryOperatorNonConstP1 { - typedef ret_type (RDOValue::*method_type)(const RDOValue&); + typedef ret_type (RDOValue::*method_type)(const RDOValue&); - static method_type method(); + static method_type method(); }; template class RDOCalcBinary: public RDOCalcBinaryBase { -friend class rdo::Factory >; +friend class rdo::Factory>; public: - enum { calc_type = CalcType }; - typedef F caller_type; + enum class Type + { + calc_type = CalcType + }; + typedef F caller_type; - LPRDOCalc getLeft () const; - LPRDOCalcConst getRightAsConst() const; - void setRight (const LPRDOCalc& pRight); + LPRDOCalc getLeft () const; + LPRDOCalcConst getRightAsConst() const; + void setRight (const LPRDOCalc& pRight); - static RDOSrcInfo getStaticSrcInfo(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); + static RDOSrcInfo getStaticSrcInfo(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); protected: - RDOCalcBinary(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); + RDOCalcBinary(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); private: - //! Выполняет бинарную операцию \ref value_operator над \ref m_pLeft и \ref m_pRight - //! \param pRuntime - указатель на объект runtime'а. - //! Используется для доступа к БД модели, системному времени, генерации ошибок и др. - //! \exception RDORuntimeException - //! \result Вычесленное калком значение - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE #include "simulator/runtime/calc/operation/calc_binary-inl.h" - -#endif // _LIB_RUNTIME_CALC_OPERATION_BINARY_H_ diff --git a/simulator/runtime/calc/operation/calc_logic.cpp b/simulator/runtime/calc/operation/calc_logic.cpp index a3c2c3113..ada728d94 100644 --- a/simulator/runtime/calc/operation/calc_logic.cpp +++ b/simulator/runtime/calc/operation/calc_logic.cpp @@ -12,46 +12,46 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcAnd // -------------------------------------------------------------------------------- RDOCalcAnd::RDOCalcAnd(const LPRDOCalc& pLeft, const LPRDOCalc& pRight) - : parent_type(pLeft, pRight) + : parent_type(pLeft, pRight) { - m_value_true = 1; - m_value_false = 0; + m_value_true = 1; + m_value_false = 0; } RDOValue RDOCalcAnd::doCalc(const LPRDORuntime& pRuntime) { - ++OperatorType::getCalcCounter(); + ++OperatorType::getCalcCounter(); - if (!m_pLeft->calcValue(pRuntime).getAsBool()) - return m_value_false; + if (!m_pLeft->calcValue(pRuntime).getAsBool()) + return m_value_false; - if (!m_pRight->calcValue(pRuntime).getAsBool()) - return m_value_false; + if (!m_pRight->calcValue(pRuntime).getAsBool()) + return m_value_false; - return m_value_true; + return m_value_true; } // -------------------------------------------------------------------------------- // -------------------- RDOCalcAnd // -------------------------------------------------------------------------------- RDOCalcOr::RDOCalcOr(const LPRDOCalc& pLeft, const LPRDOCalc& pRight) - : parent_type(pLeft, pRight) + : parent_type(pLeft, pRight) { - m_value_true = 1; - m_value_false = 0; + m_value_true = 1; + m_value_false = 0; } RDOValue RDOCalcOr::doCalc(const LPRDORuntime& pRuntime) { - ++OperatorType::getCalcCounter(); + ++OperatorType::getCalcCounter(); - if (m_pLeft->calcValue(pRuntime).getAsBool()) - return m_value_true; + if (m_pLeft->calcValue(pRuntime).getAsBool()) + return m_value_true; - if (m_pRight->calcValue(pRuntime).getAsBool()) - return m_value_true; + if (m_pRight->calcValue(pRuntime).getAsBool()) + return m_value_true; - return m_value_false; + return m_value_false; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/operation/calc_logic.h b/simulator/runtime/calc/operation/calc_logic.h index 41c6e71c6..b11798f03 100644 --- a/simulator/runtime/calc/operation/calc_logic.h +++ b/simulator/runtime/calc/operation/calc_logic.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_OPERATION_LOGIC_H_ -#define _LIB_RUNTIME_CALC_OPERATION_LOGIC_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,92 +8,81 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Оператор логическое И -class RDOCalcAnd: public RDOCalcBinary, OperatorType::OT_LOGIC> +class RDOCalcAnd: public RDOCalcBinary, OperatorType::Type::LOGIC> { DECLARE_FACTORY(RDOCalcAnd) private: - typedef RDOCalcBinary, OperatorType::OT_LOGIC> parent_type; + typedef RDOCalcBinary, OperatorType::Type::LOGIC> parent_type; - RDOCalcAnd(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); + RDOCalcAnd(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); - RDOValue m_value_true; - RDOValue m_value_false; + RDOValue m_value_true; + RDOValue m_value_false; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Оператор логическое ИЛИ -class RDOCalcOr: public RDOCalcBinary, OperatorType::OT_LOGIC> +class RDOCalcOr: public RDOCalcBinary, OperatorType::Type::LOGIC> { DECLARE_FACTORY(RDOCalcOr) private: - typedef RDOCalcBinary, OperatorType::OT_LOGIC> parent_type; + typedef RDOCalcBinary, OperatorType::Type::LOGIC> parent_type; - RDOCalcOr(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); + RDOCalcOr(const LPRDOCalc& pLeft, const LPRDOCalc& pRight); - RDOValue m_value_true; - RDOValue m_value_false; + RDOValue m_value_true; + RDOValue m_value_false; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Оператор отрицания #ifdef COMPILER_VISUAL_STUDIO - typedef RDOCalcUnary RDOCalcNot; DECLARE_POINTER(RDOCalcNot); + typedef RDOCalcUnary RDOCalcNot; DECLARE_POINTER(RDOCalcNot); #endif #ifdef COMPILER_GCC - typedef RDOCalcUnary RDOCalcNot; DECLARE_POINTER(RDOCalcNot); + typedef RDOCalcUnary RDOCalcNot; DECLARE_POINTER(RDOCalcNot); #endif -//! Оператор равенства #ifdef COMPILER_VISUAL_STUDIO - typedef RDOCalcBinary, OperatorType::OT_LOGIC> RDOCalcIsEqual; DECLARE_POINTER(RDOCalcIsEqual); + typedef RDOCalcBinary, OperatorType::Type::LOGIC> RDOCalcIsEqual; DECLARE_POINTER(RDOCalcIsEqual); #endif #ifdef COMPILER_GCC - typedef RDOCalcBinary, OperatorType::OT_LOGIC> RDOCalcIsEqual; DECLARE_POINTER(RDOCalcIsEqual); + typedef RDOCalcBinary, OperatorType::Type::LOGIC> RDOCalcIsEqual; DECLARE_POINTER(RDOCalcIsEqual); #endif -//! Оператор неравенства #ifdef COMPILER_VISUAL_STUDIO - typedef RDOCalcBinary, OperatorType::OT_LOGIC> RDOCalcIsNotEqual; DECLARE_POINTER(RDOCalcIsNotEqual); + typedef RDOCalcBinary, OperatorType::Type::LOGIC> RDOCalcIsNotEqual; DECLARE_POINTER(RDOCalcIsNotEqual); #endif #ifdef COMPILER_GCC - typedef RDOCalcBinary, OperatorType::OT_LOGIC> RDOCalcIsNotEqual; DECLARE_POINTER(RDOCalcIsNotEqual); + typedef RDOCalcBinary, OperatorType::Type::LOGIC> RDOCalcIsNotEqual; DECLARE_POINTER(RDOCalcIsNotEqual); #endif -//! Оператор меньше #ifdef COMPILER_VISUAL_STUDIO - typedef RDOCalcBinary, OperatorType::OT_LOGIC> RDOCalcIsLess; DECLARE_POINTER(RDOCalcIsLess); + typedef RDOCalcBinary, OperatorType::Type::LOGIC> RDOCalcIsLess; DECLARE_POINTER(RDOCalcIsLess); #endif #ifdef COMPILER_GCC - typedef RDOCalcBinary, OperatorType::OT_LOGIC> RDOCalcIsLess; DECLARE_POINTER(RDOCalcIsLess); + typedef RDOCalcBinary, OperatorType::Type::LOGIC> RDOCalcIsLess; DECLARE_POINTER(RDOCalcIsLess); #endif -//! Оператор больше #ifdef COMPILER_VISUAL_STUDIO - typedef RDOCalcBinary) >, OperatorType::OT_LOGIC> RDOCalcIsGreater; DECLARE_POINTER(RDOCalcIsGreater); + typedef RDOCalcBinary) >, OperatorType::Type::LOGIC> RDOCalcIsGreater; DECLARE_POINTER(RDOCalcIsGreater); #endif #ifdef COMPILER_GCC - typedef RDOCalcBinary >, OperatorType::OT_LOGIC> RDOCalcIsGreater; DECLARE_POINTER(RDOCalcIsGreater); + typedef RDOCalcBinary >, OperatorType::Type::LOGIC> RDOCalcIsGreater; DECLARE_POINTER(RDOCalcIsGreater); #endif -//! Оператор меньше или равно #ifdef COMPILER_VISUAL_STUDIO - typedef RDOCalcBinary, OperatorType::OT_LOGIC> RDOCalcIsLEQ; DECLARE_POINTER(RDOCalcIsLEQ); + typedef RDOCalcBinary, OperatorType::Type::LOGIC> RDOCalcIsLEQ; DECLARE_POINTER(RDOCalcIsLEQ); #endif #ifdef COMPILER_GCC - typedef RDOCalcBinary, OperatorType::OT_LOGIC> RDOCalcIsLEQ; DECLARE_POINTER(RDOCalcIsLEQ); + typedef RDOCalcBinary, OperatorType::Type::LOGIC> RDOCalcIsLEQ; DECLARE_POINTER(RDOCalcIsLEQ); #endif -//! Оператор больше или равно #ifdef COMPILER_VISUAL_STUDIO - typedef RDOCalcBinary=) >, OperatorType::OT_LOGIC> RDOCalcIsGEQ; DECLARE_POINTER(RDOCalcIsGEQ); + typedef RDOCalcBinary=) >, OperatorType::Type::LOGIC> RDOCalcIsGEQ; DECLARE_POINTER(RDOCalcIsGEQ); #endif #ifdef COMPILER_GCC - typedef RDOCalcBinary= >, OperatorType::OT_LOGIC> RDOCalcIsGEQ; DECLARE_POINTER(RDOCalcIsGEQ); + typedef RDOCalcBinary= >, OperatorType::Type::LOGIC> RDOCalcIsGEQ; DECLARE_POINTER(RDOCalcIsGEQ); #endif CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_OPERATION_LOGIC_H_ diff --git a/simulator/runtime/calc/operation/calc_unary-inl.h b/simulator/runtime/calc/operation/calc_unary-inl.h index 251e634b4..fea14215e 100644 --- a/simulator/runtime/calc/operation/calc_unary-inl.h +++ b/simulator/runtime/calc/operation/calc_unary-inl.h @@ -12,22 +12,22 @@ OPEN_RDO_RUNTIME_NAMESPACE template LPRDOCalc RDOCalcUnaryBase::generateCalc(const RDOSrcInfo::Position& position, const LPRDOCalc& pUnaryCalc) { - ASSERT(pUnaryCalc); + ASSERT(pUnaryCalc); - LPRDOCalcConst pConstCalc = pUnaryCalc.object_dynamic_cast(); - LPRDOCalc pCalc; - if (pConstCalc) - { - typename T::value_operator pOperation = T::getOperation(); - pCalc = rdo::Factory::create((pConstCalc->calcValue(NULL).*pOperation)()); - pCalc->setSrcInfo(T::getStaticSrcInfo(position, pConstCalc)); - } - else - { - pCalc = rdo::Factory::create(position, pUnaryCalc); - } - ASSERT(pCalc); - return pCalc; + LPRDOCalcConst pConstCalc = pUnaryCalc.object_dynamic_cast(); + LPRDOCalc pCalc; + if (pConstCalc) + { + typename T::value_operator pOperation = T::getOperation(); + pCalc = rdo::Factory::create((pConstCalc->calcValue(NULL).*pOperation)()); + pCalc->setSrcInfo(T::getStaticSrcInfo(position, pConstCalc)); + } + else + { + pCalc = rdo::Factory::create(position, pUnaryCalc); + } + ASSERT(pCalc); + return pCalc; } // -------------------------------------------------------------------------------- @@ -35,31 +35,31 @@ LPRDOCalc RDOCalcUnaryBase::generateCalc(const RDOSrcInfo::Position& position, c // -------------------------------------------------------------------------------- template inline RDOCalcUnary::RDOCalcUnary(const RDOSrcInfo::Position& position, const LPRDOCalc& pOperation) - : RDOCalcUnaryBase(pOperation) + : RDOCalcUnaryBase(pOperation) { - setSrcInfo(getStaticSrcInfo(position, m_pOperation)); + setSrcInfo(getStaticSrcInfo(position, m_pOperation)); } template inline RDOSrcInfo RDOCalcUnary::getStaticSrcInfo(const RDOSrcInfo::Position& position, const LPRDOCalc& pUnaryCalc) { - RDOSrcInfo srcInfo(pUnaryCalc->srcInfo()); - srcInfo.setSrcPos (position); - srcInfo.setSrcText(rdo::format("%s(%s)", OperatorName::name(pOperator).c_str(), pUnaryCalc->srcInfo().src_text().c_str())); - return srcInfo; + RDOSrcInfo srcInfo(pUnaryCalc->srcInfo()); + srcInfo.setSrcPos (position); + srcInfo.setSrcText(rdo::format("%s(%s)", OperatorName::name(pOperator).c_str(), pUnaryCalc->srcInfo().src_text().c_str())); + return srcInfo; } template inline typename RDOCalcUnary::value_operator RDOCalcUnary::getOperation() { - return pOperator; + return pOperator; } template inline RDOValue RDOCalcUnary::doCalc(const LPRDORuntime& pRuntime) { - ++OperatorType::getCalcCounter(); - return (m_pOperation->calcValue(pRuntime).*pOperator)(); + ++OperatorType::getCalcCounter(); + return (m_pOperation->calcValue(pRuntime).*pOperator)(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/operation/calc_unary.cpp b/simulator/runtime/calc/operation/calc_unary.cpp index 6152f0faa..c2a81c18e 100644 --- a/simulator/runtime/calc/operation/calc_unary.cpp +++ b/simulator/runtime/calc/operation/calc_unary.cpp @@ -12,45 +12,45 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcUnaryBase // -------------------------------------------------------------------------------- RDOCalcUnaryBase::RDOCalcUnaryBase(const LPRDOCalc& pOperation) - : m_pOperation(pOperation) + : m_pOperation(pOperation) { - ASSERT(m_pOperation); + ASSERT(m_pOperation); } // -------------------------------------------------------------------------------- // -------------------- Унарные операции // -------------------------------------------------------------------------------- RDOCalcDoubleToIntByResult::RDOCalcDoubleToIntByResult(const LPRDOCalc& pOper) - : m_round (false) - , m_pOperation(pOper) + : m_round (false) + , m_pOperation(pOper) {} RDOValue RDOCalcDoubleToIntByResult::doCalc(const LPRDORuntime& pRuntime) { - RDOValue value = m_pOperation->calcValue(pRuntime); - return m_round - ? value.getInt() - : value; + RDOValue value = m_pOperation->calcValue(pRuntime); + return m_round + ? value.getInt() + : value; } void RDOCalcDoubleToIntByResult::needRound() { - m_round = true; + m_round = true; } // -------------------------------------------------------------------------------- // -------------------- RDOCalcInt (приведение к целому) // -------------------------------------------------------------------------------- RDOCalcInt::RDOCalcInt(const LPRDOCalc& pOperation) - : m_pOperation(pOperation) + : m_pOperation(pOperation) {} RDOValue RDOCalcInt::doCalc(const LPRDORuntime& pRuntime) { - RDOValue res = m_pOperation->calcValue(pRuntime); - return res > 0 - ? RDOValue((int)(res.getDouble() + 0.5)) - : RDOValue((int)(res.getDouble() - 0.5)); + RDOValue res = m_pOperation->calcValue(pRuntime); + return res > 0 + ? RDOValue((int)(res.getDouble() + 0.5)) + : RDOValue((int)(res.getDouble() - 0.5)); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/operation/calc_unary.h b/simulator/runtime/calc/operation/calc_unary.h index 7eddd8e66..a7479221b 100644 --- a/simulator/runtime/calc/operation/calc_unary.h +++ b/simulator/runtime/calc/operation/calc_unary.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_OPERATION_UNARY_H_ -#define _LIB_RUNTIME_CALC_OPERATION_UNARY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,75 +8,68 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Базовый класс для унарного оператора class RDOCalcUnaryBase: public RDOCalc { public: - template - static LPRDOCalc generateCalc(const RDOSrcInfo::Position& position, const LPRDOCalc& pUnaryCalc); + template + static LPRDOCalc generateCalc(const RDOSrcInfo::Position& position, const LPRDOCalc& pUnaryCalc); protected: - RDOCalcUnaryBase(const LPRDOCalc& pOperation); + RDOCalcUnaryBase(const LPRDOCalc& pOperation); - LPRDOCalc m_pOperation; + LPRDOCalc m_pOperation; }; template class RDOCalcUnary: public RDOCalcUnaryBase { -friend class rdo::Factory >; +friend class rdo::Factory>; public: - enum { calc_type = CalcType }; - typedef ret_type (RDOValue::*value_operator)() const; + static const auto calc_type = CalcType; + typedef ret_type (RDOValue::*value_operator)() const; - static RDOSrcInfo getStaticSrcInfo(const RDOSrcInfo::Position& position, const LPRDOCalc& pUnaryCalc); - static value_operator getOperation (); + static RDOSrcInfo getStaticSrcInfo(const RDOSrcInfo::Position& position, const LPRDOCalc& pUnaryCalc); + static value_operator getOperation (); protected: - RDOCalcUnary(const RDOSrcInfo::Position& position, const LPRDOCalc& pOperation); + RDOCalcUnary(const RDOSrcInfo::Position& position, const LPRDOCalc& pOperation); private: - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Унарный оператор плюс -typedef RDOCalcUnary RDOCalcUMinus; +typedef RDOCalcUnary RDOCalcUMinus; -//! Оператор праобразования вещественного числа в целое -typedef RDOCalcUnary RDOCalcDoubleToInt; +typedef RDOCalcUnary RDOCalcDoubleToInt; -//! Преобразование вещественного в целое по типу lvalue PREDECLARE_POINTER(RDOCalcDoubleToIntByResult); class RDOCalcDoubleToIntByResult: public RDOCalc { DECLARE_FACTORY(RDOCalcDoubleToIntByResult) public: - void needRound(); + void needRound(); private: - RDOCalcDoubleToIntByResult(const LPRDOCalc& pOper); + RDOCalcDoubleToIntByResult(const LPRDOCalc& pOper); - bool m_round; - LPRDOCalc m_pOperation; + bool m_round; + LPRDOCalc m_pOperation; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Приведение к целому PREDECLARE_POINTER(RDOCalcInt); class RDOCalcInt: public RDOCalc { DECLARE_FACTORY(RDOCalcInt) private: - RDOCalcInt(const LPRDOCalc& pOperation); + RDOCalcInt(const LPRDOCalc& pOperation); - LPRDOCalc m_pOperation; + LPRDOCalc m_pOperation; - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE #include "simulator/runtime/calc/operation/calc_unary-inl.h" - -#endif // _LIB_RUNTIME_CALC_OPERATION_UNARY_H_ diff --git a/simulator/runtime/calc/operation/operation_name-inl.h b/simulator/runtime/calc/operation/operation_name-inl.h index ea2468690..0bc30619c 100644 --- a/simulator/runtime/calc/operation/operation_name-inl.h +++ b/simulator/runtime/calc/operation/operation_name-inl.h @@ -12,86 +12,86 @@ OPEN_RDO_RUNTIME_NAMESPACE template inline std::string OperatorName::name(const opr_type& pOperator) { - const auto it = std::find(getList().begin(), getList().end(), pOperator); - ASSERT(it != getList().end()); - return it->m_name; + const auto it = std::find(getList().begin(), getList().end(), pOperator); + ASSERT(it != getList().end()); + return it->m_name; } template inline OperatorName::OprItem::OprItem(const opr_type& pOperator, const std::string& name) - : m_pOperator(pOperator) - , m_name(name) + : m_pOperator(pOperator) + , m_name(name) {} template inline bool OperatorName::OprItem::operator== (const opr_type& pOperator) const { - return m_pOperator == pOperator; + return m_pOperator == pOperator; } template <> inline const OperatorName::NameList& OperatorName::getList() { - static NameList s_nameList; - if (s_nameList.empty()) - { - s_nameList.push_back(OprItem(&RDOValue::operator+, "+")); - s_nameList.push_back(OprItem(&RDOValue::operator-, "-")); - s_nameList.push_back(OprItem(&RDOValue::operator*, "*")); - s_nameList.push_back(OprItem(&RDOValue::operator/, "/")); - s_nameList.push_back(OprItem(&RDOValue::operator&&, "and")); - s_nameList.push_back(OprItem(&RDOValue::operator||, "or")); - } - return s_nameList; + static NameList s_nameList; + if (s_nameList.empty()) + { + s_nameList.push_back(OprItem(&RDOValue::operator+, "+")); + s_nameList.push_back(OprItem(&RDOValue::operator-, "-")); + s_nameList.push_back(OprItem(&RDOValue::operator*, "*")); + s_nameList.push_back(OprItem(&RDOValue::operator/, "/")); + s_nameList.push_back(OprItem(&RDOValue::operator&&, "and")); + s_nameList.push_back(OprItem(&RDOValue::operator||, "or")); + } + return s_nameList; } template <> inline const OperatorName::NameList& OperatorName::getList() { - static NameList s_nameList; - if (s_nameList.empty()) - { - s_nameList.push_back(OprItem(&RDOValue::operator==, "==")); - s_nameList.push_back(OprItem(&RDOValue::operator!=, "<>")); - s_nameList.push_back(OprItem(&RDOValue::operator<, "<")); - s_nameList.push_back(OprItem(&RDOValue::operator>, ">")); - s_nameList.push_back(OprItem(&RDOValue::operator<=, "<=")); - s_nameList.push_back(OprItem(&RDOValue::operator>=, ">=")); - } - return s_nameList; + static NameList s_nameList; + if (s_nameList.empty()) + { + s_nameList.push_back(OprItem(&RDOValue::operator==, "==")); + s_nameList.push_back(OprItem(&RDOValue::operator!=, "<>")); + s_nameList.push_back(OprItem(&RDOValue::operator<, "<")); + s_nameList.push_back(OprItem(&RDOValue::operator>, ">")); + s_nameList.push_back(OprItem(&RDOValue::operator<=, "<=")); + s_nameList.push_back(OprItem(&RDOValue::operator>=, ">=")); + } + return s_nameList; } template <> inline const OperatorName::NameList& OperatorName::getList() { - static NameList s_nameList; - if (s_nameList.empty()) - { - s_nameList.push_back(OprItem(&RDOValue::operator!, "!")); - } - return s_nameList; + static NameList s_nameList; + if (s_nameList.empty()) + { + s_nameList.push_back(OprItem(&RDOValue::operator!, "!")); + } + return s_nameList; } template <> inline const OperatorName::NameList& OperatorName::getList() { - static NameList s_nameList; - if (s_nameList.empty()) - { - s_nameList.push_back(OprItem(&RDOValue::operator-, "-")); - } - return s_nameList; + static NameList s_nameList; + if (s_nameList.empty()) + { + s_nameList.push_back(OprItem(&RDOValue::operator-, "-")); + } + return s_nameList; } template <> inline const OperatorName::NameList& OperatorName::getList() { - static NameList s_nameList; - if (s_nameList.empty()) - { - s_nameList.push_back(OprItem(&RDOValue::getInt, "getInt")); - } - return s_nameList; + static NameList s_nameList; + if (s_nameList.empty()) + { + s_nameList.push_back(OprItem(&RDOValue::getInt, "getInt")); + } + return s_nameList; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/operation/operation_name.h b/simulator/runtime/calc/operation/operation_name.h index 5fdfd993c..e3d08786b 100644 --- a/simulator/runtime/calc/operation/operation_name.h +++ b/simulator/runtime/calc/operation/operation_name.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_OPERATION_NAME_H_ -#define _LIB_RUNTIME_CALC_OPERATION_NAME_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -13,25 +12,23 @@ template class OperatorName { public: - static std::string name(const opr_type& pOperator); + static std::string name(const opr_type& pOperator); private: - struct OprItem - { - opr_type m_pOperator; - std::string m_name; + struct OprItem + { + opr_type m_pOperator; + std::string m_name; - OprItem(const opr_type& pOperator, const std::string& name); + OprItem(const opr_type& pOperator, const std::string& name); - bool operator== (const opr_type& pOperator) const; - }; - typedef std::list NameList; + bool operator== (const opr_type& pOperator) const; + }; + typedef std::list NameList; - static const NameList& getList(); + static const NameList& getList(); }; CLOSE_RDO_RUNTIME_NAMESPACE #include "simulator/runtime/calc/operation/operation_name-inl.h" - -#endif // _LIB_RUNTIME_CALC_OPERATION_NAME_H_ diff --git a/simulator/runtime/calc/operation/operation_type-inl.h b/simulator/runtime/calc/operation/operation_type-inl.h index 435c40888..fe9684fe0 100644 --- a/simulator/runtime/calc/operation/operation_type-inl.h +++ b/simulator/runtime/calc/operation/operation_type-inl.h @@ -11,8 +11,8 @@ OPEN_RDO_RUNTIME_NAMESPACE template inline std::size_t& OperatorType::getCalcCounter() { - static std::size_t s_counter = 0; - return s_counter; + static std::size_t s_counter = 0; + return s_counter; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/operation/operation_type.h b/simulator/runtime/calc/operation/operation_type.h index ca5c73153..863539630 100644 --- a/simulator/runtime/calc/operation/operation_type.h +++ b/simulator/runtime/calc/operation/operation_type.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_OPERATION_TYPE_H_ -#define _LIB_RUNTIME_CALC_OPERATION_TYPE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -11,19 +10,16 @@ OPEN_RDO_RUNTIME_NAMESPACE class OperatorType { public: - //! Тип операции в РДО - enum Type - { - OT_ARITHM, //!< Арифметическое выражение - OT_LOGIC //!< Логическое выражение - }; + enum class Type + { + ARITHM, + LOGIC + }; - template - static std::size_t& getCalcCounter(); + template + static std::size_t& getCalcCounter(); }; CLOSE_RDO_RUNTIME_NAMESPACE #include "simulator/runtime/calc/operation/operation_type-inl.h" - -#endif // _LIB_RUNTIME_CALC_OPERATION_TYPE_H_ diff --git a/simulator/runtime/calc/procedural/calc_braces.cpp b/simulator/runtime/calc/procedural/calc_braces.cpp index 084121168..c5e285392 100644 --- a/simulator/runtime/calc/procedural/calc_braces.cpp +++ b/simulator/runtime/calc/procedural/calc_braces.cpp @@ -17,9 +17,9 @@ RDOCalcOpenBrace::RDOCalcOpenBrace() RDOValue RDOCalcOpenBrace::doCalc(const LPRDORuntime& pRuntime) { - LPRDOMemory pLocalMemory = rdo::Factory::create(); - pRuntime->getMemoryStack()->push(pLocalMemory); - return RDOValue(); + LPRDOMemory pLocalMemory = rdo::Factory::create(); + pRuntime->getMemoryStack()->push(pLocalMemory); + return RDOValue(); } // -------------------------------------------------------------------------------- @@ -30,8 +30,8 @@ RDOCalcCloseBrace::RDOCalcCloseBrace() RDOValue RDOCalcCloseBrace::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->getMemoryStack()->pop(); - return RDOValue(); + pRuntime->getMemoryStack()->pop(); + return RDOValue(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/procedural/calc_braces.h b/simulator/runtime/calc/procedural/calc_braces.h index 173b7d9f7..017d4f44c 100644 --- a/simulator/runtime/calc/procedural/calc_braces.h +++ b/simulator/runtime/calc/procedural/calc_braces.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_PROCEDURAL_BRACES_H_ -#define _LIB_RUNTIME_CALC_PROCEDURAL_BRACES_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,39 +7,34 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Открывающая скобка PREDECLARE_POINTER(RDOCalcOpenBrace); class RDOCalcOpenBrace: public RDOCalc { DECLARE_FACTORY(RDOCalcOpenBrace) private: - RDOCalcOpenBrace(); + RDOCalcOpenBrace(); - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Закрывающая скобка PREDECLARE_POINTER(RDOCalcCloseBrace); class RDOCalcCloseBrace: public RDOCalc { DECLARE_FACTORY(RDOCalcCloseBrace) private: - RDOCalcCloseBrace(); + RDOCalcCloseBrace(); - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Окончание функции PREDECLARE_POINTER(RDOCalcFunEnd); class RDOCalcFunEnd: public RDOCalc { DECLARE_FACTORY(RDOCalcFunEnd) private: - RDOCalcFunEnd(); + RDOCalcFunEnd(); - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_PROCEDURAL_BRACES_H_ diff --git a/simulator/runtime/calc/procedural/calc_const.cpp b/simulator/runtime/calc/procedural/calc_const.cpp index e9c7cb242..662486dd7 100644 --- a/simulator/runtime/calc/procedural/calc_const.cpp +++ b/simulator/runtime/calc/procedural/calc_const.cpp @@ -11,19 +11,19 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcConst // -------------------------------------------------------------------------------- RDOCalcConst::RDOCalcConst(const RDOValue& value) - : m_value(value) + : m_value(value) { - ASSERT(m_value.typeID() != RDOType::t_unknow); + ASSERT(m_value.typeID() != RDOType::Type::UNKNOW); } const RDOValue& RDOCalcConst::getValue() const { - return m_value; + return m_value; } RDOValue RDOCalcConst::doCalc(const LPRDORuntime& /*pRuntime*/) { - return m_value; + return m_value; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/procedural/calc_const.h b/simulator/runtime/calc/procedural/calc_const.h index eed746285..188cd4621 100644 --- a/simulator/runtime/calc/procedural/calc_const.h +++ b/simulator/runtime/calc/procedural/calc_const.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_PROCEDURAL_CONST_H_ -#define _LIB_RUNTIME_CALC_PROCEDURAL_CONST_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,23 +12,14 @@ class RDOCalcConst: public RDOCalc { DECLARE_FACTORY(RDOCalcConst) public: - //! Возвращает хранимую константу, может быть использован в parser-time - //! \result Значение константы - const RDOValue& getValue() const; + const RDOValue& getValue() const; private: - //! Инициализируется указанным значением переменную базового класса \ref RDOCalc::m_value - //! \param value - Значение константы - RDOCalcConst(const RDOValue& value); + RDOCalcConst(const RDOValue& value); - RDOValue m_value; + RDOValue m_value; - //! Возвращает значение константы - //! \param pRuntime - Не используется - //! \result Значение константы - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_PROCEDURAL_CONST_H_ diff --git a/simulator/runtime/calc/procedural/calc_locvar.cpp b/simulator/runtime/calc/procedural/calc_locvar.cpp index b25887b01..540b0905a 100644 --- a/simulator/runtime/calc/procedural/calc_locvar.cpp +++ b/simulator/runtime/calc/procedural/calc_locvar.cpp @@ -13,29 +13,29 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcCreateLocalVariable // -------------------------------------------------------------------------------- RDOCalcCreateLocalVariable::RDOCalcCreateLocalVariable(const std::string& name, const LPRDOCalc& pValueCalc) - : m_name (name ) - , m_pValueCalc(pValueCalc) + : m_name (name ) + , m_pValueCalc(pValueCalc) { - ASSERT(m_pValueCalc); + ASSERT(m_pValueCalc); } RDOValue RDOCalcCreateLocalVariable::doCalc(const LPRDORuntime& pRuntime) { - RDOValue value = m_pValueCalc->calcValue(pRuntime); - pRuntime->getMemoryStack()->create(m_name, value); - return value; + RDOValue value = m_pValueCalc->calcValue(pRuntime); + pRuntime->getMemoryStack()->create(m_name, value); + return value; } // -------------------------------------------------------------------------------- // -------------------- RDOCalcGetLocalVariable // -------------------------------------------------------------------------------- RDOCalcGetLocalVariable::RDOCalcGetLocalVariable(const std::string& name) - : m_name(name) + : m_name(name) {} RDOValue RDOCalcGetLocalVariable::doCalc(const LPRDORuntime& pRuntime) { - return pRuntime->getMemoryStack()->get(m_name); + return pRuntime->getMemoryStack()->get(m_name); } // -------------------------------------------------------------------------------- @@ -46,25 +46,25 @@ RDOCalcLocalVariableList::RDOCalcLocalVariableList() void RDOCalcLocalVariableList::addCalcLocalVariable(const LPRDOCalc& pCalc) { - ASSERT(pCalc); - m_calcLocalVariableList.push_back(pCalc); + ASSERT(pCalc); + m_calcLocalVariableList.push_back(pCalc); } RDOValue RDOCalcLocalVariableList::doCalc(const LPRDORuntime& pRuntime) { - for (const auto& calc: m_calcLocalVariableList) - { - calc->calcValue(pRuntime); - } - return RDOValue(); + for (const auto& calc: m_calcLocalVariableList) + { + calc->calcValue(pRuntime); + } + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcSetLocalVariable // -------------------------------------------------------------------------------- RDOCalcSetLocalVariable::RDOCalcSetLocalVariable(const std::string& name, LPRDOCalc pCalc) - : m_name (name ) - , m_pCalc(pCalc) + : m_name (name ) + , m_pCalc(pCalc) {} RDOCalcSetLocalVariable::~RDOCalcSetLocalVariable() @@ -72,8 +72,8 @@ RDOCalcSetLocalVariable::~RDOCalcSetLocalVariable() RDOValue RDOCalcSetLocalVariable::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->getMemoryStack()->set(m_name, m_pCalc->calcValue(pRuntime)); - return RDOValue(); + pRuntime->getMemoryStack()->set(m_name, m_pCalc->calcValue(pRuntime)); + return RDOValue(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/procedural/calc_locvar.h b/simulator/runtime/calc/procedural/calc_locvar.h index 1eba01f5c..97f2e8261 100644 --- a/simulator/runtime/calc/procedural/calc_locvar.h +++ b/simulator/runtime/calc/procedural/calc_locvar.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_PROCEDURAL_LOCVAR_H_ -#define _LIB_RUNTIME_CALC_PROCEDURAL_LOCVAR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,65 +8,59 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Создание локальной переменной PREDECLARE_POINTER(RDOCalcCreateLocalVariable); class RDOCalcCreateLocalVariable: public RDOCalc { DECLARE_FACTORY(RDOCalcCreateLocalVariable) private: - RDOCalcCreateLocalVariable(const std::string& name, const LPRDOCalc& pValueCalc); + RDOCalcCreateLocalVariable(const std::string& name, const LPRDOCalc& pValueCalc); - std::string m_name; - LPRDOCalc m_pValueCalc; + std::string m_name; + LPRDOCalc m_pValueCalc; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Получение значения локальной переменной PREDECLARE_POINTER(RDOCalcGetLocalVariable); class RDOCalcGetLocalVariable: public RDOCalc { DECLARE_FACTORY(RDOCalcGetLocalVariable) private: - RDOCalcGetLocalVariable(const std::string& name); + RDOCalcGetLocalVariable(const std::string& name); - std::string m_name; + std::string m_name; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Установка значения локальной переменной class RDOCalcSetLocalVariable: public RDOCalc { DECLARE_FACTORY(RDOCalcSetLocalVariable) private: - RDOCalcSetLocalVariable(const std::string& name, LPRDOCalc pCalc = NULL); - virtual ~RDOCalcSetLocalVariable(); + RDOCalcSetLocalVariable(const std::string& name, LPRDOCalc pCalc = NULL); + virtual ~RDOCalcSetLocalVariable(); - std::string m_name; - LPRDOCalc m_pCalc; + std::string m_name; + LPRDOCalc m_pCalc; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Список локальных переменных PREDECLARE_POINTER(RDOCalcLocalVariableList); class RDOCalcLocalVariableList: public RDOCalc { DECLARE_FACTORY(RDOCalcLocalVariableList) public: - typedef std::vector CalcLocalVariableList; + typedef std::vector CalcLocalVariableList; - void addCalcLocalVariable(const LPRDOCalc& pCalc); + void addCalcLocalVariable(const LPRDOCalc& pCalc); private: - RDOCalcLocalVariableList(); + RDOCalcLocalVariableList(); - CalcLocalVariableList m_calcLocalVariableList; + CalcLocalVariableList m_calcLocalVariableList; - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_PROCEDURAL_LOCVAR_H_ diff --git a/simulator/runtime/calc/procedural/calc_nop.cpp b/simulator/runtime/calc/procedural/calc_nop.cpp index 5763539b2..2492e5f67 100644 --- a/simulator/runtime/calc/procedural/calc_nop.cpp +++ b/simulator/runtime/calc/procedural/calc_nop.cpp @@ -18,7 +18,7 @@ RDOCalcNop::~RDOCalcNop() RDOValue RDOCalcNop::doCalc(const LPRDORuntime& /*pRuntime*/) { - return RDOValue(); + return RDOValue(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/procedural/calc_nop.h b/simulator/runtime/calc/procedural/calc_nop.h index 85e56d604..176040404 100644 --- a/simulator/runtime/calc/procedural/calc_nop.h +++ b/simulator/runtime/calc/procedural/calc_nop.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_PROCEDURAL_NOP_H_ -#define _LIB_RUNTIME_CALC_PROCEDURAL_NOP_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,18 +7,15 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Пустая операция PREDECLARE_POINTER(RDOCalcNop); class RDOCalcNop: public RDOCalc { DECLARE_FACTORY(RDOCalcNop) private: - RDOCalcNop(); - virtual ~RDOCalcNop(); + RDOCalcNop(); + virtual ~RDOCalcNop(); - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_PROCEDURAL_NOP_H_ diff --git a/simulator/runtime/calc/procedural/calc_range.cpp b/simulator/runtime/calc/procedural/calc_range.cpp index 7ac794fd6..aa2e0ff47 100644 --- a/simulator/runtime/calc/procedural/calc_range.cpp +++ b/simulator/runtime/calc/procedural/calc_range.cpp @@ -12,24 +12,24 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcCheckRange // -------------------------------------------------------------------------------- RDOCalcCheckRange::RDOCalcCheckRange(const RDOValue& minValue, const RDOValue& maxValue, const LPRDOCalc& pCalc) - : m_minValue(minValue) - , m_maxValue(maxValue) - , m_pCalc (pCalc ) + : m_minValue(minValue) + , m_maxValue(maxValue) + , m_pCalc (pCalc ) { - if (m_pCalc) - { - setSrcInfo(m_pCalc->srcInfo()); - } + if (m_pCalc) + { + setSrcInfo(m_pCalc->srcInfo()); + } } RDOValue RDOCalcCheckRange::doCalc(const LPRDORuntime& pRuntime) { - RDOValue value = m_pCalc->calcValue(pRuntime); - if (value < m_minValue || value > m_maxValue) - { - pRuntime->error().push(rdo::format("Значение выходит за допустимый диапазон [%s..%s]: %s", m_minValue.getAsString().c_str(), m_maxValue.getAsString().c_str(), value.getAsString().c_str()), srcInfo()); - } - return value; + RDOValue value = m_pCalc->calcValue(pRuntime); + if (value < m_minValue || value > m_maxValue) + { + pRuntime->error().push(rdo::format("Значение выходит за допустимый диапазон [%s..%s]: %s", m_minValue.getAsString().c_str(), m_maxValue.getAsString().c_str(), value.getAsString().c_str()), srcInfo()); + } + return value; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/procedural/calc_range.h b/simulator/runtime/calc/procedural/calc_range.h index fad72475c..786a25b87 100644 --- a/simulator/runtime/calc/procedural/calc_range.h +++ b/simulator/runtime/calc/procedural/calc_range.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_PROCEDURAL_RANGE_H_ -#define _LIB_RUNTIME_CALC_PROCEDURAL_RANGE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,21 +7,18 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Проверка на диапазон PREDECLARE_POINTER(RDOCalcCheckRange); class RDOCalcCheckRange: public RDOCalc { DECLARE_FACTORY(RDOCalcCheckRange) private: - RDOCalcCheckRange(const RDOValue& minValue, const RDOValue& maxValue, const LPRDOCalc& pCalc); + RDOCalcCheckRange(const RDOValue& minValue, const RDOValue& maxValue, const LPRDOCalc& pCalc); - RDOValue m_minValue; - RDOValue m_maxValue; - LPRDOCalc m_pCalc; + RDOValue m_minValue; + RDOValue m_maxValue; + LPRDOCalc m_pCalc; - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_PROCEDURAL_RANGE_H_ diff --git a/simulator/runtime/calc/procedural/calc_statement.cpp b/simulator/runtime/calc/procedural/calc_statement.cpp index 4443b73f0..377f9234a 100644 --- a/simulator/runtime/calc/procedural/calc_statement.cpp +++ b/simulator/runtime/calc/procedural/calc_statement.cpp @@ -15,95 +15,95 @@ RDOCalcNoChange::RDOCalcNoChange() RDOValue RDOCalcNoChange::doCalc(const LPRDORuntime& /*pRuntime*/) { - return RDOValue(); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcIf // -------------------------------------------------------------------------------- RDOCalcIf::RDOCalcIf(const LPRDOCalc& pCondition) - : m_pCondition(pCondition) + : m_pCondition(pCondition) { - ASSERT(m_pCondition); + ASSERT(m_pCondition); } void RDOCalcIf::setThenStatement(const LPRDOCalc& pStatement) { - ASSERT(pStatement); - m_statements.first = pStatement; + ASSERT(pStatement); + m_statements.first = pStatement; } void RDOCalcIf::setElseStatement(const LPRDOCalc& pStatement) { - ASSERT(pStatement); - m_statements.second = pStatement; + ASSERT(pStatement); + m_statements.second = pStatement; } bool RDOCalcIf::hasElse() const { - return m_statements.second; + return m_statements.second; } RDOValue RDOCalcIf::doCalc(const LPRDORuntime& pRuntime) { - return m_pCondition->calcValue(pRuntime).getAsBool() - ? m_statements.first->calcValue(pRuntime) - : hasElse() - ? m_statements.second->calcValue(pRuntime) - : RDOValue(false); + return m_pCondition->calcValue(pRuntime).getAsBool() + ? m_statements.first->calcValue(pRuntime) + : hasElse() + ? m_statements.second->calcValue(pRuntime) + : RDOValue(false); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcFor // -------------------------------------------------------------------------------- RDOCalcFor::RDOCalcFor(const LPRDOCalc& pDeclaration, const LPRDOCalc& pCondition, const LPRDOCalc& pExpression) - : m_pDeclaration(pDeclaration) - , m_pCondition (pCondition ) - , m_pExpression (pExpression ) + : m_pDeclaration(pDeclaration) + , m_pCondition (pCondition ) + , m_pExpression (pExpression ) { - ASSERT(m_pDeclaration); - ASSERT(m_pCondition ); - ASSERT(m_pExpression ); + ASSERT(m_pDeclaration); + ASSERT(m_pCondition ); + ASSERT(m_pExpression ); } void RDOCalcFor::setStatement(const LPRDOCalc& pStatement) { - ASSERT(pStatement); - m_pStatement = pStatement; + ASSERT(pStatement); + m_pStatement = pStatement; } RDOValue RDOCalcFor::doCalc(const LPRDORuntime& pRuntime) { - RDOValue value = RDOValue(0); + RDOValue value = RDOValue(0); - m_pDeclaration->calcValue(pRuntime); - while (m_pCondition->calcValue(pRuntime).getAsBool()) - { - value = m_pStatement->calcValue(pRuntime); - if (pRuntime->getFunBreakFlag() != RDORuntime::FBF_NONE) - { - break; - } - m_pExpression->calcValue(pRuntime); - } + m_pDeclaration->calcValue(pRuntime); + while (m_pCondition->calcValue(pRuntime).getAsBool()) + { + value = m_pStatement->calcValue(pRuntime); + if (pRuntime->getFunctionExitStatus() != RDORuntime::FunctionExitStatus::NONE) + { + break; + } + m_pExpression->calcValue(pRuntime); + } - return value; + return value; } // -------------------------------------------------------------------------------- // -------------------- RDOCalcFunReturn // -------------------------------------------------------------------------------- RDOCalcFunReturn::RDOCalcFunReturn(const LPRDOCalc& pReturn) - : m_pReturn(pReturn) + : m_pReturn(pReturn) {} RDOValue RDOCalcFunReturn::doCalc(const LPRDORuntime& pRuntime) { - ASSERT(m_pReturn); + ASSERT(m_pReturn); - RDOValue value = m_pReturn->calcValue(pRuntime); - pRuntime->setFunBreakFlag(RDORuntime::FBF_RETURN); - return value; + RDOValue value = m_pReturn->calcValue(pRuntime); + pRuntime->setFunctionExitStatus(RDORuntime::FunctionExitStatus::RETURN); + return value; } // -------------------------------------------------------------------------------- @@ -114,8 +114,8 @@ RDOCalcFunBreak::RDOCalcFunBreak() RDOValue RDOCalcFunBreak::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->setFunBreakFlag(RDORuntime::FBF_BREAK); - return RDOValue(); + pRuntime->setFunctionExitStatus(RDORuntime::FunctionExitStatus::BREAK); + return RDOValue(); } // -------------------------------------------------------------------------------- @@ -126,27 +126,27 @@ RDOCalcBaseStatementList::RDOCalcBaseStatementList() void RDOCalcBaseStatementList::addCalcStatement(const LPRDOCalc& pStatement) { - ASSERT(pStatement); - m_calcStatementList.push_back(pStatement); + ASSERT(pStatement); + m_calcStatementList.push_back(pStatement); } RDOCalc::RDOCalcList RDOCalcBaseStatementList::statementList() { - return m_calcStatementList; + return m_calcStatementList; } RDOValue RDOCalcBaseStatementList::doCalc(const LPRDORuntime& pRuntime) { - RDOValue value; - for (const auto& calc: m_calcStatementList) - { - RDOValue tempValue = calc->calcValue(pRuntime); - if (tempValue.typeID() != RDOType::t_unknow) - { - value = tempValue; - } - } - return value; + RDOValue value; + for (const auto& calc: m_calcStatementList) + { + RDOValue tempValue = calc->calcValue(pRuntime); + if (tempValue.typeID() != RDOType::Type::UNKNOW) + { + value = tempValue; + } + } + return value; } // -------------------------------------------------------------------------------- @@ -157,17 +157,17 @@ RDOCalcStatementList::RDOCalcStatementList() RDOValue RDOCalcStatementList::doCalc(const LPRDORuntime& pRuntime) { - RDOValue value; - for (const auto& calc: m_calcStatementList) - { - value = calc->calcValue(pRuntime); + RDOValue value; + for (const auto& calc: m_calcStatementList) + { + value = calc->calcValue(pRuntime); - if (pRuntime->getFunBreakFlag() != RDORuntime::FBF_NONE) - { - break; - } - } - return value; + if (pRuntime->getFunctionExitStatus() != RDORuntime::FunctionExitStatus::NONE) + { + break; + } + } + return value; } // -------------------------------------------------------------------------------- @@ -178,22 +178,22 @@ RDOCalcBreakCatch::RDOCalcBreakCatch() void RDOCalcBreakCatch::addStatementList(const LPRDOCalc& pStatementList) { - ASSERT(pStatementList); - m_pStatementList = pStatementList; + ASSERT(pStatementList); + m_pStatementList = pStatementList; } RDOValue RDOCalcBreakCatch::doCalc(const LPRDORuntime& pRuntime) { - ASSERT(m_pStatementList); + ASSERT(m_pStatementList); - m_pStatementList->calcValue(pRuntime); + m_pStatementList->calcValue(pRuntime); - if (pRuntime->getFunBreakFlag() == RDORuntime::FBF_BREAK) - { - pRuntime->setFunBreakFlag(RDORuntime::FBF_NONE); - } + if (pRuntime->getFunctionExitStatus() == RDORuntime::FunctionExitStatus::BREAK) + { + pRuntime->setFunctionExitStatus(RDORuntime::FunctionExitStatus::NONE); + } - return RDOValue(); + return RDOValue(); } // -------------------------------------------------------------------------------- @@ -204,22 +204,22 @@ RDOCalcReturnCatch::RDOCalcReturnCatch() void RDOCalcReturnCatch::setTryCalc(const LPRDOCalc& pTryCalc) { - ASSERT(pTryCalc); - m_pTryCalc = pTryCalc; + ASSERT(pTryCalc); + m_pTryCalc = pTryCalc; } RDOValue RDOCalcReturnCatch::doCalc(const LPRDORuntime& pRuntime) { - ASSERT(m_pTryCalc); + ASSERT(m_pTryCalc); - RDOValue value = m_pTryCalc->calcValue(pRuntime); + RDOValue value = m_pTryCalc->calcValue(pRuntime); - if (pRuntime->getFunBreakFlag() == RDORuntime::FBF_RETURN) - { - pRuntime->setFunBreakFlag(RDORuntime::FBF_NONE); - } + if (pRuntime->getFunctionExitStatus() == RDORuntime::FunctionExitStatus::RETURN) + { + pRuntime->setFunctionExitStatus(RDORuntime::FunctionExitStatus::NONE); + } - return value; + return value; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/procedural/calc_statement.h b/simulator/runtime/calc/procedural/calc_statement.h index 5d21bd83e..643fefa66 100644 --- a/simulator/runtime/calc/procedural/calc_statement.h +++ b/simulator/runtime/calc/procedural/calc_statement.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_PROCEDURAL_STATEMENT_H_ -#define _LIB_RUNTIME_CALC_PROCEDURAL_STATEMENT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,141 +8,130 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Пустая операция -//! @todo заменить на CalcNop ? +// TODO заменить на CalcNop ? PREDECLARE_POINTER(RDOCalcNoChange); class RDOCalcNoChange: public RDOCalc { DECLARE_FACTORY(RDOCalcNoChange) private: - RDOCalcNoChange(); - DECLARE_ICalc; + RDOCalcNoChange(); + DECLARE_ICalc; }; -//! Условный оператор if () then {} PREDECLARE_POINTER(RDOCalcIf); class RDOCalcIf: public RDOCalc { DECLARE_FACTORY(RDOCalcIf) public: - void setThenStatement(const LPRDOCalc& pStatement); - void setElseStatement(const LPRDOCalc& pStatement); + void setThenStatement(const LPRDOCalc& pStatement); + void setElseStatement(const LPRDOCalc& pStatement); - bool hasElse() const; + bool hasElse() const; private: - typedef std::pair Statements; + typedef std::pair Statements; - RDOCalcIf(const LPRDOCalc& pCondition); + RDOCalcIf(const LPRDOCalc& pCondition); - LPRDOCalc m_pCondition; - Statements m_statements; + LPRDOCalc m_pCondition; + Statements m_statements; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Оператор цикла for PREDECLARE_POINTER(RDOCalcFor); class RDOCalcFor: public RDOCalc { DECLARE_FACTORY(RDOCalcFor) public: - void setStatement(const LPRDOCalc& pStatement); + void setStatement(const LPRDOCalc& pStatement); private: - RDOCalcFor(const LPRDOCalc& pDeclaration, const LPRDOCalc& pCondition, const LPRDOCalc& pExpression); + RDOCalcFor(const LPRDOCalc& pDeclaration, const LPRDOCalc& pCondition, const LPRDOCalc& pExpression); - LPRDOCalc m_pDeclaration; - LPRDOCalc m_pCondition; - LPRDOCalc m_pExpression; - LPRDOCalc m_pStatement; + LPRDOCalc m_pDeclaration; + LPRDOCalc m_pCondition; + LPRDOCalc m_pExpression; + LPRDOCalc m_pStatement; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Оператор возврата return PREDECLARE_POINTER(RDOCalcFunReturn); class RDOCalcFunReturn: public RDOCalc { DECLARE_FACTORY(RDOCalcFunReturn) private: - RDOCalcFunReturn(const LPRDOCalc& pReturn); + RDOCalcFunReturn(const LPRDOCalc& pReturn); - LPRDOCalc m_pReturn; - DECLARE_ICalc; + LPRDOCalc m_pReturn; + DECLARE_ICalc; }; -//! Оператор возврата break PREDECLARE_POINTER(RDOCalcFunBreak); class RDOCalcFunBreak: public RDOCalc { DECLARE_FACTORY(RDOCalcFunBreak) private: - RDOCalcFunBreak(); + RDOCalcFunBreak(); - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Простой список операторов PREDECLARE_POINTER(RDOCalcBaseStatementList); class RDOCalcBaseStatementList: public RDOCalc { DECLARE_FACTORY(RDOCalcBaseStatementList) public: - void addCalcStatement(const LPRDOCalc& pStatement); - RDOCalcList statementList(); + void addCalcStatement(const LPRDOCalc& pStatement); + RDOCalcList statementList(); protected: - RDOCalcBaseStatementList(); + RDOCalcBaseStatementList(); - RDOCalcList m_calcStatementList; + RDOCalcList m_calcStatementList; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Останавливаемый список операторов PREDECLARE_POINTER(RDOCalcStatementList); class RDOCalcStatementList: public RDOCalcBaseStatementList { DECLARE_FACTORY(RDOCalcStatementList) private: - RDOCalcStatementList(); + RDOCalcStatementList(); - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Ловушка для break PREDECLARE_POINTER(RDOCalcBreakCatch); class RDOCalcBreakCatch: public RDOCalc { DECLARE_FACTORY(RDOCalcBreakCatch) public: - void addStatementList(const LPRDOCalc& pStatementList); + void addStatementList(const LPRDOCalc& pStatementList); private: - RDOCalcBreakCatch(); - - LPRDOCalc m_pStatementList; + RDOCalcBreakCatch(); + + LPRDOCalc m_pStatementList; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Ловушка для return PREDECLARE_POINTER(RDOCalcReturnCatch); class RDOCalcReturnCatch: public RDOCalc { DECLARE_FACTORY(RDOCalcReturnCatch) public: - void setTryCalc(const LPRDOCalc& pTryCalc); + void setTryCalc(const LPRDOCalc& pTryCalc); private: - RDOCalcReturnCatch(); + RDOCalcReturnCatch(); - LPRDOCalc m_pTryCalc; + LPRDOCalc m_pTryCalc; - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_PROCEDURAL_STATEMENT_H_ diff --git a/simulator/runtime/calc/resource/calc_choice_from.cpp b/simulator/runtime/calc/resource/calc_choice_from.cpp index 727521404..df3842e80 100644 --- a/simulator/runtime/calc/resource/calc_choice_from.cpp +++ b/simulator/runtime/calc/resource/calc_choice_from.cpp @@ -5,7 +5,7 @@ // ----------------------------------------------------------------------- INCLUDES #include #ifdef COMPILER_GCC - #include + #include #endif // COMPILER_GCC // ----------------------------------------------------------------------- SYNOPSIS #include "simulator/runtime/calc/resource/calc_choice_from.h" @@ -20,127 +20,127 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOSelectResourceCalc // -------------------------------------------------------------------------------- RDOSelectResourceCalc::RDOSelectResourceCalc(ResourceID relResID, const LPRDOCalc& pCalcChoiceFrom, const LPRDOCalc& pCalcOrder, Type orderType) - : m_relResID (relResID ) - , m_pCalcChoiceFrom(pCalcChoiceFrom) - , m_pCalcOrder (pCalcOrder ) - , m_orderType (orderType ) + : m_relResID (relResID ) + , m_pCalcChoiceFrom(pCalcChoiceFrom) + , m_pCalcOrder (pCalcOrder ) + , m_orderType (orderType ) {} // -------------------------------------------------------------------------------- // -------------------- RDOSelectResourceNonExistCalc // -------------------------------------------------------------------------------- RDOSelectResourceNonExistCalc::RDOSelectResourceNonExistCalc(ResourceID relResID) - : RDOSelectResourceCalc(relResID, NULL, NULL) + : RDOSelectResourceCalc(relResID, NULL, NULL) {} RDOValue RDOSelectResourceNonExistCalc::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->getCurrentActivity()->setRelRes(m_relResID, std::size_t(~0)); - return RDOValue(true); + pRuntime->getCurrentActivity()->setRelRes(m_relResID, std::size_t(~0)); + return RDOValue(true); } // -------------------------------------------------------------------------------- // -------------------- RDOSelectResourceDirectCalc // -------------------------------------------------------------------------------- RDOSelectResourceDirectCalc::RDOSelectResourceDirectCalc(ResourceID relResID, ResourceID resID, const LPRDOCalc& pCalcChoiceFrom, const LPRDOCalc& pCalcOrder, Type orderType) - : RDOSelectResourceCalc(relResID, pCalcChoiceFrom, pCalcOrder, orderType) - , m_resID (resID ) + : RDOSelectResourceCalc(relResID, pCalcChoiceFrom, pCalcOrder, orderType) + , m_resID (resID ) {} bool RDOSelectResourceDirectCalc::compare(const LPRDOCalc& pCalc) const { - LPRDOSelectResourceDirectCalc pDirectCalc = pCalc.object_dynamic_cast(); - if (!pDirectCalc) - { - return false; - } - return m_relResID == pDirectCalc->m_relResID && m_resID == pDirectCalc->m_resID; + LPRDOSelectResourceDirectCalc pDirectCalc = pCalc.object_dynamic_cast(); + if (!pDirectCalc) + { + return false; + } + return m_relResID == pDirectCalc->m_relResID && m_resID == pDirectCalc->m_resID; } RDOValue RDOSelectResourceDirectCalc::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->getCurrentActivity()->setRelRes(m_relResID, m_resID); - if (m_pCalcChoiceFrom && !m_pCalcChoiceFrom->calcValue(pRuntime).getAsBool()) - { - pRuntime->getCurrentActivity()->setRelRes(m_relResID, std::size_t(~0)); - return RDOValue(0); - } - return RDOValue(1); + pRuntime->getCurrentActivity()->setRelRes(m_relResID, m_resID); + if (m_pCalcChoiceFrom && !m_pCalcChoiceFrom->calcValue(pRuntime).getAsBool()) + { + pRuntime->getCurrentActivity()->setRelRes(m_relResID, std::size_t(~0)); + return RDOValue(0); + } + return RDOValue(1); } // -------------------------------------------------------------------------------- // -------------------- RDOSelectResourceByTypeCalc // -------------------------------------------------------------------------------- RDOSelectResourceByTypeCalc::RDOSelectResourceByTypeCalc(ResourceID relResID, ResourceID resTypeID, const LPRDOCalc& pChoiceCalc, const LPRDOCalc& pOrderCalc, Type orderType) - : RDOSelectResourceCalc(relResID, pChoiceCalc, pOrderCalc, orderType) - , m_resTypeID (resTypeID ) + : RDOSelectResourceCalc(relResID, pChoiceCalc, pOrderCalc, orderType) + , m_resTypeID (resTypeID ) {} RDOValue RDOSelectResourceByTypeCalc::doCalc(const LPRDORuntime& pRuntime) { - RDOValue maxVal = -DBL_MAX; - RDOValue minVal = DBL_MAX; - ResourceID resMinMaxID = ResourceID(~0); + RDOValue maxVal = -DBL_MAX; + RDOValue minVal = DBL_MAX; + ResourceID resMinMaxID = ResourceID(~0); - RDORuntime::ResCIterator end = pRuntime->getResType(m_resTypeID)->res_end(); - for (RDORuntime::ResCIterator it = pRuntime->getResType(m_resTypeID)->res_begin(); it != end; it++) - { - ResourceID resID = (*it)->getTraceID(); + RDORuntime::ResCIterator end = pRuntime->getResType(m_resTypeID)->res_end(); + for (RDORuntime::ResCIterator it = pRuntime->getResType(m_resTypeID)->res_begin(); it != end; it++) + { + ResourceID resID = (*it)->getTraceID(); - switch (m_orderType) - { - case order_empty: - case order_first: - { - pRuntime->getCurrentActivity()->setRelRes(m_relResID, resID); - if (m_pCalcChoiceFrom && !m_pCalcChoiceFrom->calcValue(pRuntime).getAsBool()) - { - pRuntime->getCurrentActivity()->setRelRes(m_relResID, std::size_t(~0)); - continue; - } - return RDOValue(1); - } - case order_with_min: - { - pRuntime->getCurrentActivity()->setRelRes(m_relResID, resID); - if (m_pCalcChoiceFrom && !m_pCalcChoiceFrom->calcValue(pRuntime).getAsBool()) - { - pRuntime->getCurrentActivity()->setRelRes(m_relResID, std::size_t(~0)); - continue; - } - RDOValue tmp = m_pCalcOrder->calcValue(pRuntime); - if (tmp < minVal) - { - minVal = tmp; - resMinMaxID = resID; - } - break; - } - case order_with_max: - { - pRuntime->getCurrentActivity()->setRelRes(m_relResID, resID); - if (m_pCalcChoiceFrom && !m_pCalcChoiceFrom->calcValue(pRuntime).getAsBool()) - { - pRuntime->getCurrentActivity()->setRelRes(m_relResID, std::size_t(~0)); - continue; - } - RDOValue tmp = m_pCalcOrder->calcValue(pRuntime); - if (tmp > maxVal) - { - maxVal = tmp; - resMinMaxID = resID; - } - break; - } - } - } + switch (m_orderType) + { + case Type::EMPTY: + case Type::FIRST: + { + pRuntime->getCurrentActivity()->setRelRes(m_relResID, resID); + if (m_pCalcChoiceFrom && !m_pCalcChoiceFrom->calcValue(pRuntime).getAsBool()) + { + pRuntime->getCurrentActivity()->setRelRes(m_relResID, std::size_t(~0)); + continue; + } + return RDOValue(1); + } + case Type::WITH_MIN: + { + pRuntime->getCurrentActivity()->setRelRes(m_relResID, resID); + if (m_pCalcChoiceFrom && !m_pCalcChoiceFrom->calcValue(pRuntime).getAsBool()) + { + pRuntime->getCurrentActivity()->setRelRes(m_relResID, std::size_t(~0)); + continue; + } + RDOValue tmp = m_pCalcOrder->calcValue(pRuntime); + if (tmp < minVal) + { + minVal = tmp; + resMinMaxID = resID; + } + break; + } + case Type::WITH_MAX: + { + pRuntime->getCurrentActivity()->setRelRes(m_relResID, resID); + if (m_pCalcChoiceFrom && !m_pCalcChoiceFrom->calcValue(pRuntime).getAsBool()) + { + pRuntime->getCurrentActivity()->setRelRes(m_relResID, std::size_t(~0)); + continue; + } + RDOValue tmp = m_pCalcOrder->calcValue(pRuntime); + if (tmp > maxVal) + { + maxVal = tmp; + resMinMaxID = resID; + } + break; + } + } + } - if (resMinMaxID != ResourceID(~0)) - { - pRuntime->getCurrentActivity()->setRelRes(m_relResID, resMinMaxID); - return RDOValue(1); - } - return RDOValue(0); + if (resMinMaxID != ResourceID(~0)) + { + pRuntime->getCurrentActivity()->setRelRes(m_relResID, resMinMaxID); + return RDOValue(1); + } + return RDOValue(0); } // -------------------------------------------------------------------------------- @@ -156,151 +156,151 @@ IRDOSelectResourceCommon::~IRDOSelectResourceCommon() // -------------------- RDOSelectResourceCommonCalc // -------------------------------------------------------------------------------- RDOSelectResourceCommonCalc::RDOSelectResourceCommonCalc(const SelectResourceCommonList& resSelectorList, bool useCommonWithMax, const LPRDOCalc& pCalcChoiceFrom) - : m_pCalcChoiceFrom (pCalcChoiceFrom ) - , m_resSelectorList (resSelectorList ) - , m_useCommonWithMax(useCommonWithMax) + : m_pCalcChoiceFrom (pCalcChoiceFrom ) + , m_resSelectorList (resSelectorList ) + , m_useCommonWithMax(useCommonWithMax) { - if (m_pCalcChoiceFrom) - { - setSrcInfo(m_pCalcChoiceFrom->srcInfo()); - } + if (m_pCalcChoiceFrom) + { + setSrcInfo(m_pCalcChoiceFrom->srcInfo()); + } } void RDOSelectResourceCommonCalc::getBest(ResourceIDTable& allNumbs, std::size_t level, ResourceIDList& res, RDOValue& bestVal, const LPRDORuntime& pRuntime, bool& hasBest) const { - if (level >= allNumbs.size()) - { - for (std::size_t i = 0; i < m_resSelectorList.size(); i++) - { - if (!m_resSelectorList[i]->callChoice(pRuntime)) - { - return; // state not valid - } - } - RDOValue newVal = m_pCalcChoiceFrom->calcValue(pRuntime); - if (!hasBest || (m_useCommonWithMax && (newVal > bestVal)) || - (!m_useCommonWithMax && (newVal < bestVal))) // found better value - { - ASSERT(res.size() == m_resSelectorList.size()); - for (std::size_t i = 0; i < m_resSelectorList.size(); i++) - { - res[i] = pRuntime->getCurrentActivity()->getResByRelRes(i); - } - bestVal = newVal; - hasBest = true; - } - return; - } - ASSERT(level < allNumbs.size()); - ResourceIDList& ourLevel = allNumbs[level]; - for (std::size_t i = 0; i < ourLevel.size(); i++) - { - pRuntime->getCurrentActivity()->setRelRes(level, ourLevel[i]); - getBest(allNumbs, level+1, res, bestVal, pRuntime, hasBest); - } + if (level >= allNumbs.size()) + { + for (std::size_t i = 0; i < m_resSelectorList.size(); i++) + { + if (!m_resSelectorList[i]->callChoice(pRuntime)) + { + return; // state not valid + } + } + RDOValue newVal = m_pCalcChoiceFrom->calcValue(pRuntime); + if (!hasBest || (m_useCommonWithMax && (newVal > bestVal)) || + (!m_useCommonWithMax && (newVal < bestVal))) // found better value + { + ASSERT(res.size() == m_resSelectorList.size()); + for (std::size_t i = 0; i < m_resSelectorList.size(); i++) + { + res[i] = pRuntime->getCurrentActivity()->getResByRelRes(i); + } + bestVal = newVal; + hasBest = true; + } + return; + } + ASSERT(level < allNumbs.size()); + ResourceIDList& ourLevel = allNumbs[level]; + for (std::size_t i = 0; i < ourLevel.size(); i++) + { + pRuntime->getCurrentActivity()->setRelRes(level, ourLevel[i]); + getBest(allNumbs, level+1, res, bestVal, pRuntime, hasBest); + } } bool RDOSelectResourceCommonCalc::getFirst(ResourceIDTable& allNumbs, std::size_t level, const LPRDORuntime& pRuntime) const { - if (level >= allNumbs.size()) - { - for (std::size_t i = 0; i < m_resSelectorList.size(); i++) - { - if (!m_resSelectorList[i]->callChoice(pRuntime)) - { - return false; - } - } - return true; - } - ASSERT(level < allNumbs.size()); - ResourceIDList& ourLevel = allNumbs[level]; - for (std::size_t i = 0; i < ourLevel.size(); i++) - { - pRuntime->getCurrentActivity()->setRelRes(level, ourLevel[i]); - if (getFirst(allNumbs, level+1, pRuntime)) return true; - } - return false; + if (level >= allNumbs.size()) + { + for (std::size_t i = 0; i < m_resSelectorList.size(); i++) + { + if (!m_resSelectorList[i]->callChoice(pRuntime)) + { + return false; + } + } + return true; + } + ASSERT(level < allNumbs.size()); + ResourceIDList& ourLevel = allNumbs[level]; + for (std::size_t i = 0; i < ourLevel.size(); i++) + { + pRuntime->getCurrentActivity()->setRelRes(level, ourLevel[i]); + if (getFirst(allNumbs, level+1, pRuntime)) return true; + } + return false; } //bool RDOSelectResourceCommonCalc::getFirst(ResourceIDTable& allNumbs, int level,const LPRDORuntime& pRuntime) const //{ -// if (level <= 0) { -// for (std::size_t i = 0; i < m_resSelectorList.size(); i++) { -// if (!m_resSelectorList[i]->callChoice(pRuntime)) { -// return false; -// } -// } -// return true; -// } else { -// level--; -// ASSERT(level < allNumbs.size()); -// ResourceIDList& ourLevel = allNumbs[level]; -// for (std::size_t i = 0; i < ourLevel.size(); i++) { -// pRuntime->setRelRes(level, ourLevel[i]); -// if (getFirst(allNumbs, level, pRuntime)) return true; -// } -// } -// return false; +// if (level <= 0) { +// for (std::size_t i = 0; i < m_resSelectorList.size(); i++) { +// if (!m_resSelectorList[i]->callChoice(pRuntime)) { +// return false; +// } +// } +// return true; +// } else { +// level--; +// ASSERT(level < allNumbs.size()); +// ResourceIDList& ourLevel = allNumbs[level]; +// for (std::size_t i = 0; i < ourLevel.size(); i++) { +// pRuntime->setRelRes(level, ourLevel[i]); +// if (getFirst(allNumbs, level, pRuntime)) return true; +// } +// } +// return false; //} RDOValue RDOSelectResourceCommonCalc::doCalc(const LPRDORuntime& pRuntime) { - ResourceIDTable allNumbs; - ResourceIDList res; - for (std::size_t i = 0; i < m_resSelectorList.size(); i++) - { - ResourceIDList resourceIDList; - m_resSelectorList[i]->getPossibleNumbers(pRuntime, resourceIDList); - allNumbs.push_back(resourceIDList); - res.push_back(pRuntime->getCurrentActivity()->getResByRelRes(i)); - } - if (!m_pCalcChoiceFrom) - { - // first -// if (getFirst(allNumbs, allNumbs.size(), pRuntime)) { -// return true; -// } - if (getFirst(allNumbs, 0, pRuntime)) - { - return RDOValue(1); - } - } - else - { - // with_min / with_max - RDOValue bestVal = 0; - bool found = false; - getBest(allNumbs, 0, res, bestVal, pRuntime, found); - if (found) - { - for (std::size_t i = 0; i < res.size(); i++) - { - pRuntime->getCurrentActivity()->setRelRes(i, res[i]); - } - return RDOValue(1); - } - } - return RDOValue(0); + ResourceIDTable allNumbs; + ResourceIDList res; + for (std::size_t i = 0; i < m_resSelectorList.size(); i++) + { + ResourceIDList resourceIDList; + m_resSelectorList[i]->getPossibleNumbers(pRuntime, resourceIDList); + allNumbs.push_back(resourceIDList); + res.push_back(pRuntime->getCurrentActivity()->getResByRelRes(i)); + } + if (!m_pCalcChoiceFrom) + { + // first +// if (getFirst(allNumbs, allNumbs.size(), pRuntime)) { +// return true; +// } + if (getFirst(allNumbs, 0, pRuntime)) + { + return RDOValue(1); + } + } + else + { + // with_min / with_max + RDOValue bestVal = 0; + bool found = false; + getBest(allNumbs, 0, res, bestVal, pRuntime, found); + if (found) + { + for (std::size_t i = 0; i < res.size(); i++) + { + pRuntime->getCurrentActivity()->setRelRes(i, res[i]); + } + return RDOValue(1); + } + } + return RDOValue(0); } // -------------------------------------------------------------------------------- // -------------------- RDOSelectResourceDirectCommonCalc // -------------------------------------------------------------------------------- RDOSelectResourceDirectCommonCalc::RDOSelectResourceDirectCommonCalc(ResourceID relResID, ResourceID resID, const LPRDOCalc& pCalcChoiceFrom, const LPRDOCalc& pCalcOrder, Type orderType) - : RDOSelectResourceDirectCalc(relResID, resID, pCalcChoiceFrom, pCalcOrder, orderType) + : RDOSelectResourceDirectCalc(relResID, resID, pCalcChoiceFrom, pCalcOrder, orderType) {} void RDOSelectResourceDirectCommonCalc::getPossibleNumbers(const LPRDORuntime& /*pRuntime*/, ResourceIDList& resourceIDList) const { - resourceIDList.push_back(m_resID); + resourceIDList.push_back(m_resID); } bool RDOSelectResourceDirectCommonCalc::callChoice(const LPRDORuntime& pRuntime) const { - return (m_pCalcChoiceFrom && !m_pCalcChoiceFrom->calcValue(pRuntime).getAsBool()) - ? false - : true; + return (m_pCalcChoiceFrom && !m_pCalcChoiceFrom->calcValue(pRuntime).getAsBool()) + ? false + : true; } RDOSelectResourceDirectCommonCalc::~RDOSelectResourceDirectCommonCalc() @@ -310,26 +310,26 @@ RDOSelectResourceDirectCommonCalc::~RDOSelectResourceDirectCommonCalc() // -------------------- RDOSelectResourceByTypeCommonCalc // -------------------------------------------------------------------------------- RDOSelectResourceByTypeCommonCalc::RDOSelectResourceByTypeCommonCalc(ResourceID relResID, ResourceID resTypeID, const LPRDOCalc& pChoiceCalc, const LPRDOCalc& pOrderCalc, Type orderType) - : RDOSelectResourceByTypeCalc(relResID, resTypeID, pChoiceCalc, pOrderCalc, orderType) + : RDOSelectResourceByTypeCalc(relResID, resTypeID, pChoiceCalc, pOrderCalc, orderType) {} void RDOSelectResourceByTypeCommonCalc::getPossibleNumbers(const LPRDORuntime& pRuntime, ResourceIDList& resourceIDList) const { - RDORuntime::ResCIterator end = pRuntime->getResType(m_resTypeID)->res_end(); - for (RDORuntime::ResCIterator it = pRuntime->getResType(m_resTypeID)->res_begin(); it != end; it++) - { - if (*it == LPRDOResource(NULL)) - continue; + RDORuntime::ResCIterator end = pRuntime->getResType(m_resTypeID)->res_end(); + for (RDORuntime::ResCIterator it = pRuntime->getResType(m_resTypeID)->res_begin(); it != end; it++) + { + if (*it == LPRDOResource(NULL)) + continue; - resourceIDList.push_back((*it)->getTraceID()); - } + resourceIDList.push_back((*it)->getTraceID()); + } } bool RDOSelectResourceByTypeCommonCalc::callChoice(const LPRDORuntime& pRuntime) const { - return (m_pCalcChoiceFrom && !m_pCalcChoiceFrom->calcValue(pRuntime).getAsBool()) - ? false - : true; + return (m_pCalcChoiceFrom && !m_pCalcChoiceFrom->calcValue(pRuntime).getAsBool()) + ? false + : true; } RDOSelectResourceByTypeCommonCalc::~RDOSelectResourceByTypeCommonCalc() diff --git a/simulator/runtime/calc/resource/calc_choice_from.h b/simulator/runtime/calc/resource/calc_choice_from.h index 4ad7cd7fc..46e887003 100644 --- a/simulator/runtime/calc/resource/calc_choice_from.h +++ b/simulator/runtime/calc/resource/calc_choice_from.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_RESOURCE_CHOICE_FROM_H_ -#define _LIB_RUNTIME_CALC_RESOURCE_CHOICE_FROM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,140 +8,129 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Выбор ресурсов PREDECLARE_POINTER(RDOSelectResourceCalc); class RDOSelectResourceCalc: public RDOCalc { public: - //! Способ выбора релевантного ресурса - enum Type - { - order_empty = 0, //!< Способ выбора не задан - order_first, //!< Первый попавшийся (без предварительной сортировки) - order_with_min, //!< С минимальным значением выражения - order_with_max //!< С максимальным значением выражения - }; - - typedef std::size_t ResourceID; - typedef std::vector ResourceIDList; - typedef std::vector ResourceIDTable; + enum class Type + { + EMPTY = 0, + FIRST, + WITH_MIN, + WITH_MAX + }; + + typedef std::size_t ResourceID; + typedef std::vector ResourceIDList; + typedef std::vector ResourceIDTable; protected: - RDOSelectResourceCalc(ResourceID relResID, const LPRDOCalc& pCalcChoiceFrom, const LPRDOCalc& pCalcOrder, Type orderType = order_empty); + RDOSelectResourceCalc(ResourceID relResID, const LPRDOCalc& pCalcChoiceFrom, const LPRDOCalc& pCalcOrder, Type orderType = Type::EMPTY); - ResourceID m_relResID; - LPRDOCalc m_pCalcChoiceFrom; - LPRDOCalc m_pCalcOrder; - Type m_orderType; + ResourceID m_relResID; + LPRDOCalc m_pCalcChoiceFrom; + LPRDOCalc m_pCalcOrder; + Type m_orderType; }; -//! RDOCalc для оператора !Exist() PREDECLARE_POINTER(RDOSelectResourceNonExistCalc); class RDOSelectResourceNonExistCalc: public RDOSelectResourceCalc { DECLARE_FACTORY(RDOSelectResourceNonExistCalc) private: - RDOSelectResourceNonExistCalc(ResourceID relResID); - DECLARE_ICalc; + RDOSelectResourceNonExistCalc(ResourceID relResID); + DECLARE_ICalc; }; -//! Выбор релевантного ресурса по имени ресурса PREDECLARE_POINTER(RDOSelectResourceDirectCalc); class RDOSelectResourceDirectCalc: public RDOSelectResourceCalc { DECLARE_FACTORY(RDOSelectResourceDirectCalc) protected: - RDOSelectResourceDirectCalc(ResourceID relResID, ResourceID resID, const LPRDOCalc& pCalcChoiceFrom = NULL, const LPRDOCalc& pCalcOrder = NULL, Type orderType = order_empty); + RDOSelectResourceDirectCalc(ResourceID relResID, ResourceID resID, const LPRDOCalc& pCalcChoiceFrom = NULL, const LPRDOCalc& pCalcOrder = NULL, Type orderType = Type::EMPTY); - ResourceID m_resID; + ResourceID m_resID; - virtual bool compare(const LPRDOCalc& pCalc) const; + virtual bool compare(const LPRDOCalc& pCalc) const; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Выбор релевантного ресурса по типу PREDECLARE_POINTER(RDOSelectResourceByTypeCalc); class RDOSelectResourceByTypeCalc: public RDOSelectResourceCalc { DECLARE_FACTORY(RDOSelectResourceByTypeCalc) protected: - RDOSelectResourceByTypeCalc(ResourceID relResID, ResourceID resTypeID, const LPRDOCalc& pChoiceCalc = NULL, const LPRDOCalc& pOrderCalc = NULL, Type orderType = order_empty); + RDOSelectResourceByTypeCalc(ResourceID relResID, ResourceID resTypeID, const LPRDOCalc& pChoiceCalc = NULL, const LPRDOCalc& pOrderCalc = NULL, Type orderType = Type::EMPTY); - ResourceID m_resTypeID; + ResourceID m_resTypeID; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Интерфейс для выбора релевантных ресурсов PREDECLARE_OBJECT_INTERFACE(IRDOSelectResourceCommon) struct IRDOSelectResourceCommon: public rdo::RefCounter { DECLARE_FACTORY(IRDOSelectResourceCommon) public: - virtual void getPossibleNumbers(const LPRDORuntime& pRuntime, - RDOSelectResourceCalc::ResourceIDList& resourceIDList) const = 0; - virtual bool callChoice(const LPRDORuntime& pRuntime) const = 0; + virtual void getPossibleNumbers(const LPRDORuntime& pRuntime, + RDOSelectResourceCalc::ResourceIDList& resourceIDList) const = 0; + virtual bool callChoice(const LPRDORuntime& pRuntime) const = 0; protected: - IRDOSelectResourceCommon(); - virtual ~IRDOSelectResourceCommon(); + IRDOSelectResourceCommon(); + virtual ~IRDOSelectResourceCommon(); }; -//! Выбор PREDECLARE_POINTER(RDOSelectResourceCommonCalc); class RDOSelectResourceCommonCalc: public RDOCalc { DECLARE_FACTORY(RDOSelectResourceCommonCalc) private: - typedef std::vector SelectResourceCommonList; - typedef RDOSelectResourceCalc::ResourceIDList ResourceIDList; - typedef RDOSelectResourceCalc::ResourceIDTable ResourceIDTable; + typedef std::vector SelectResourceCommonList; + typedef RDOSelectResourceCalc::ResourceIDList ResourceIDList; + typedef RDOSelectResourceCalc::ResourceIDTable ResourceIDTable; - RDOSelectResourceCommonCalc(const SelectResourceCommonList& resSelectorList, bool useCommonWithMax, const LPRDOCalc& pCalcChoiceFrom); + RDOSelectResourceCommonCalc(const SelectResourceCommonList& resSelectorList, bool useCommonWithMax, const LPRDOCalc& pCalcChoiceFrom); - LPRDOCalc m_pCalcChoiceFrom; - SelectResourceCommonList m_resSelectorList; - bool m_useCommonWithMax; + LPRDOCalc m_pCalcChoiceFrom; + SelectResourceCommonList m_resSelectorList; + bool m_useCommonWithMax; - void getBest(ResourceIDTable& allNumbs, std::size_t level, ResourceIDList& res, RDOValue& bestVal, const LPRDORuntime& pRuntime, bool& hasBest) const; - bool getFirst(ResourceIDTable& allNumbs, std::size_t level, const LPRDORuntime& pRuntime) const; + void getBest(ResourceIDTable& allNumbs, std::size_t level, ResourceIDList& res, RDOValue& bestVal, const LPRDORuntime& pRuntime, bool& hasBest) const; + bool getFirst(ResourceIDTable& allNumbs, std::size_t level, const LPRDORuntime& pRuntime) const; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Выбор по имени ресурса PREDECLARE_POINTER(RDOSelectResourceDirectCommonCalc); class RDOSelectResourceDirectCommonCalc - : public RDOSelectResourceDirectCalc - , public IRDOSelectResourceCommon + : public RDOSelectResourceDirectCalc + , public IRDOSelectResourceCommon { DECLARE_FACTORY(RDOSelectResourceDirectCommonCalc) public: - virtual void getPossibleNumbers(const LPRDORuntime& pRuntime, ResourceIDList& resourceIDList) const; - virtual bool callChoice (const LPRDORuntime& pRuntime) const; + virtual void getPossibleNumbers(const LPRDORuntime& pRuntime, ResourceIDList& resourceIDList) const; + virtual bool callChoice (const LPRDORuntime& pRuntime) const; private: - RDOSelectResourceDirectCommonCalc(ResourceID relResID, ResourceID resID, const LPRDOCalc& pCalcChoiceFrom = NULL, const LPRDOCalc& pCalcOrder = NULL, Type orderType = order_empty); - virtual ~RDOSelectResourceDirectCommonCalc(); + RDOSelectResourceDirectCommonCalc(ResourceID relResID, ResourceID resID, const LPRDOCalc& pCalcChoiceFrom = NULL, const LPRDOCalc& pCalcOrder = NULL, Type orderType = Type::EMPTY); + virtual ~RDOSelectResourceDirectCommonCalc(); }; -//! Выбор по типу PREDECLARE_POINTER(RDOSelectResourceByTypeCommonCalc); class RDOSelectResourceByTypeCommonCalc - : public RDOSelectResourceByTypeCalc - , public IRDOSelectResourceCommon + : public RDOSelectResourceByTypeCalc + , public IRDOSelectResourceCommon { DECLARE_FACTORY(RDOSelectResourceByTypeCommonCalc) public: - virtual void getPossibleNumbers(const LPRDORuntime& pRuntime, ResourceIDList& resourceIDList) const; - virtual bool callChoice(const LPRDORuntime& pRuntime) const; + virtual void getPossibleNumbers(const LPRDORuntime& pRuntime, ResourceIDList& resourceIDList) const; + virtual bool callChoice(const LPRDORuntime& pRuntime) const; private: - RDOSelectResourceByTypeCommonCalc(ResourceID relResID, ResourceID resTypeID, const LPRDOCalc& pChoiceCalc = NULL, const LPRDOCalc& pOrderCalc = NULL, Type orderType = order_empty); - virtual ~RDOSelectResourceByTypeCommonCalc(); + RDOSelectResourceByTypeCommonCalc(ResourceID relResID, ResourceID resTypeID, const LPRDOCalc& pChoiceCalc = NULL, const LPRDOCalc& pOrderCalc = NULL, Type orderType = Type::EMPTY); + virtual ~RDOSelectResourceByTypeCommonCalc(); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_RESOURCE_CHOICE_FROM_H_ diff --git a/simulator/runtime/calc/resource/calc_create_resource.cpp b/simulator/runtime/calc/resource/calc_create_resource.cpp index 6d5ba41f2..a010d9217 100644 --- a/simulator/runtime/calc/resource/calc_create_resource.cpp +++ b/simulator/runtime/calc/resource/calc_create_resource.cpp @@ -13,55 +13,54 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOCalcCreateResource // -------------------------------------------------------------------------------- RDOCalcCreateResource::RDOCalcCreateResource( - std::size_t resourceTypeID, - const std::vector& rParamCalcList, - bool traceFlag, - bool permanentFlag, - bool isNested, - std::size_t relResID, - boost::optional resourceID -) - : m_resourceTypeID(resourceTypeID) - , m_traceFlag (traceFlag ) - , m_permanentFlag (permanentFlag ) - , m_isNested (isNested ) - , m_relResID (relResID ) - , m_resourceID (resourceID ) + std::size_t resourceTypeID, + const std::vector& rParamCalcList, + bool traceFlag, + bool permanentFlag, + bool isNested, + std::size_t relResID, + boost::optional resourceID) + : m_resourceID (resourceID ) + , m_resourceTypeID(resourceTypeID) + , m_traceFlag (traceFlag ) + , m_permanentFlag (permanentFlag ) + , m_relResID (relResID ) + , m_isNested (isNested ) { - m_paramCalcList.insert(m_paramCalcList.begin(), rParamCalcList.begin(), rParamCalcList.end()); - // попытка создавать постоянные ресурсы динамически - ASSERT(m_relResID == ~0 || (m_relResID != ~0 && !m_permanentFlag)); + m_paramCalcList.insert(m_paramCalcList.begin(), rParamCalcList.begin(), rParamCalcList.end()); + // попытка создавать постоянные ресурсы динамически + ASSERT(m_relResID == ~0 || (m_relResID != ~0 && !m_permanentFlag)); } RDOValue RDOCalcCreateResource::doCalc(const LPRDORuntime& pRuntime) { - const LPRDOResourceTypeList& resourceType = pRuntime->getResType(m_resourceTypeID); - std::vector paramValueList; + const LPRDOResourceTypeList& resourceType = pRuntime->getResType(m_resourceTypeID); + std::vector paramValueList; - for (const auto& calc : m_paramCalcList) - { - paramValueList.push_back(calc->calcValue(pRuntime)); - } + for (const auto& calc : m_paramCalcList) + { + paramValueList.push_back(calc->calcValue(pRuntime)); + } - const std::size_t resourceID = m_resourceID.is_initialized() - ? m_resourceID.get() - : pRuntime->getResourceId(); - pRuntime->registerResourceId(resourceID); + const std::size_t resourceID = m_resourceID.is_initialized() + ? m_resourceID.get() + : pRuntime->getResourceId(); + pRuntime->registerResourceId(resourceID); - LPRDOResource pResource = resourceType.interface_cast()->createRes( - pRuntime, resourceID, paramValueList, m_traceFlag, m_permanentFlag, m_isNested - ); - ASSERT(pResource); + LPRDOResource pResource = resourceType.interface_cast()->createRes( + pRuntime, resourceID, paramValueList, m_traceFlag, m_permanentFlag, m_isNested + ); + ASSERT(pResource); - if (m_relResID != std::size_t(~0)) - { - pRuntime->getCurrentActivity()->setRelRes(m_relResID, pResource->getTraceID()); - } + if (m_relResID != std::size_t(~0)) + { + pRuntime->getCurrentActivity()->setRelRes(m_relResID, pResource->getTraceID()); + } - LPRDOType pType = resourceType; - ASSERT(pType); + LPRDOType pType = resourceType; + ASSERT(pType); - return RDOValue(pType, pResource); + return RDOValue(pType, pResource); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/resource/calc_create_resource.h b/simulator/runtime/calc/resource/calc_create_resource.h index 74a5b610e..466947106 100644 --- a/simulator/runtime/calc/resource/calc_create_resource.h +++ b/simulator/runtime/calc/resource/calc_create_resource.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_RESOURCE_CREATE_RESOURCE_H_ -#define _LIB_RUNTIME_CALC_RESOURCE_CREATE_RESOURCE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -10,35 +9,30 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Создание нового ресурса PREDECLARE_POINTER(RDOCalcCreateResource); class RDOCalcCreateResource: public RDOCalc { DECLARE_FACTORY(RDOCalcCreateResource) private: - //! relResID == ~0 для ресурсов, создаваемых при инициализации модели - RDOCalcCreateResource( - std::size_t resourceTypeID, - const std::vector& rParamCalcList, - bool traceFlag, bool permanentFlag, - bool isNested = 0, - std::size_t relResID = ~0, - boost::optional resourceID = boost::optional() - ); - - boost::optional m_resourceID; - std::size_t m_resourceTypeID; - std::vector m_paramCalcList; - bool m_traceFlag; - bool m_permanentFlag; - std::size_t m_relResID; - bool m_isNested; - - DECLARE_ICalc; + // relResID == ~0 для ресурсов, создаваемых при инициализации модели + RDOCalcCreateResource( + std::size_t resourceTypeID, + const std::vector& rParamCalcList, + bool traceFlag, bool permanentFlag, + bool isNested = 0, + std::size_t relResID = ~0, + boost::optional resourceID = boost::optional() + ); + + boost::optional m_resourceID; + std::size_t m_resourceTypeID; + std::vector m_paramCalcList; + bool m_traceFlag; + bool m_permanentFlag; + std::size_t m_relResID; + bool m_isNested; + + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -//#include "simulator/runtime/calc/resource/calc_choice_from-inl.h" - -#endif // _LIB_RUNTIME_CALC_RESOURCE_CREATE_RESOURCE_H_ diff --git a/simulator/runtime/calc/resource/calc_group.cpp b/simulator/runtime/calc/resource/calc_group.cpp index dd2528d5c..d5182b898 100644 --- a/simulator/runtime/calc/resource/calc_group.cpp +++ b/simulator/runtime/calc/resource/calc_group.cpp @@ -13,8 +13,8 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOFunCalcGroup // -------------------------------------------------------------------------------- RDOFunCalcGroup::RDOFunCalcGroup(int nResType, const LPRDOCalc& pCondition) - : m_nResType (nResType ) - , m_pCondition(pCondition) + : m_nResType (nResType ) + , m_pCondition(pCondition) {} // -------------------------------------------------------------------------------- @@ -22,19 +22,19 @@ RDOFunCalcGroup::RDOFunCalcGroup(int nResType, const LPRDOCalc& pCondition) // -------------------------------------------------------------------------------- RDOValue RDOFunCalcExist::doCalc(const LPRDORuntime& pRuntime) { - bool res = false; - RDORuntime::ResCIterator end = pRuntime->getResType(m_nResType)->res_end(); - for (RDORuntime::ResCIterator it = pRuntime->getResType(m_nResType)->res_begin(); it != end && !res; ++it) - { - if (*it == LPRDOResource(NULL)) - continue; + bool res = false; + RDORuntime::ResCIterator end = pRuntime->getResType(m_nResType)->res_end(); + for (RDORuntime::ResCIterator it = pRuntime->getResType(m_nResType)->res_begin(); it != end && !res; ++it) + { + if (*it == LPRDOResource(NULL)) + continue; - pRuntime->pushGroupFunc(*it); - if (m_pCondition->calcValue(pRuntime).getAsBool()) - res = true; - pRuntime->popGroupFunc(); - } - return RDOValue(res); + pRuntime->pushGroupFunc(*it); + if (m_pCondition->calcValue(pRuntime).getAsBool()) + res = true; + pRuntime->popGroupFunc(); + } + return RDOValue(res); } // -------------------------------------------------------------------------------- @@ -42,19 +42,19 @@ RDOValue RDOFunCalcExist::doCalc(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOFunCalcNotExist::doCalc(const LPRDORuntime& pRuntime) { - bool res = true; - RDORuntime::ResCIterator end = pRuntime->getResType(m_nResType)->res_end(); - for (RDORuntime::ResCIterator it = pRuntime->getResType(m_nResType)->res_begin(); it != end && res; it++) - { - if (*it == LPRDOResource(NULL)) - continue; + bool res = true; + RDORuntime::ResCIterator end = pRuntime->getResType(m_nResType)->res_end(); + for (RDORuntime::ResCIterator it = pRuntime->getResType(m_nResType)->res_begin(); it != end && res; it++) + { + if (*it == LPRDOResource(NULL)) + continue; - pRuntime->pushGroupFunc(*it); - if (m_pCondition->calcValue(pRuntime).getAsBool()) - res = false; - pRuntime->popGroupFunc(); - } - return RDOValue(res); + pRuntime->pushGroupFunc(*it); + if (m_pCondition->calcValue(pRuntime).getAsBool()) + res = false; + pRuntime->popGroupFunc(); + } + return RDOValue(res); } // -------------------------------------------------------------------------------- @@ -62,26 +62,26 @@ RDOValue RDOFunCalcNotExist::doCalc(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOFunCalcForAll::doCalc(const LPRDORuntime& pRuntime) { - bool first_found = false; - bool res = true; - RDORuntime::ResCIterator end = pRuntime->getResType(m_nResType)->res_end(); - for (RDORuntime::ResCIterator it = pRuntime->getResType(m_nResType)->res_begin(); it != end && res; it++) - { - if (*it == LPRDOResource(NULL)) - continue; + bool first_found = false; + bool res = true; + RDORuntime::ResCIterator end = pRuntime->getResType(m_nResType)->res_end(); + for (RDORuntime::ResCIterator it = pRuntime->getResType(m_nResType)->res_begin(); it != end && res; it++) + { + if (*it == LPRDOResource(NULL)) + continue; - pRuntime->pushGroupFunc(*it); - if (!m_pCondition->calcValue(pRuntime).getAsBool()) - { - res = false; - } - else if (!first_found) - { - first_found = true; - } - pRuntime->popGroupFunc(); - } - return RDOValue(first_found ? res : false); + pRuntime->pushGroupFunc(*it); + if (!m_pCondition->calcValue(pRuntime).getAsBool()) + { + res = false; + } + else if (!first_found) + { + first_found = true; + } + pRuntime->popGroupFunc(); + } + return RDOValue(first_found ? res : false); } // -------------------------------------------------------------------------------- @@ -89,19 +89,19 @@ RDOValue RDOFunCalcForAll::doCalc(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOFunCalcNotForAll::doCalc(const LPRDORuntime& pRuntime) { - bool res = false; - RDORuntime::ResCIterator end = pRuntime->getResType(m_nResType)->res_end(); - for (RDORuntime::ResCIterator it = pRuntime->getResType(m_nResType)->res_begin(); it != end && !res; it++) - { - if (*it == LPRDOResource(NULL)) - continue; + bool res = false; + RDORuntime::ResCIterator end = pRuntime->getResType(m_nResType)->res_end(); + for (RDORuntime::ResCIterator it = pRuntime->getResType(m_nResType)->res_begin(); it != end && !res; it++) + { + if (*it == LPRDOResource(NULL)) + continue; - pRuntime->pushGroupFunc(*it); - if (!m_pCondition->calcValue(pRuntime).getAsBool()) - res = true; - pRuntime->popGroupFunc(); - } - return RDOValue(res); + pRuntime->pushGroupFunc(*it); + if (!m_pCondition->calcValue(pRuntime).getAsBool()) + res = true; + pRuntime->popGroupFunc(); + } + return RDOValue(res); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/resource/calc_group.h b/simulator/runtime/calc/resource/calc_group.h index b109605c9..03b6ac279 100644 --- a/simulator/runtime/calc/resource/calc_group.h +++ b/simulator/runtime/calc/resource/calc_group.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_RESOURCE_GROUP_H_ -#define _LIB_RUNTIME_CALC_RESOURCE_GROUP_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,15 +7,14 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Базовый класс для групповых калков PREDECLARE_POINTER(RDOFunCalcGroup); class RDOFunCalcGroup: public RDOFunCalc { protected: - int m_nResType; - LPRDOCalc m_pCondition; + int m_nResType; + LPRDOCalc m_pCondition; - RDOFunCalcGroup(int nResType, const LPRDOCalc& pCondition); + RDOFunCalcGroup(int nResType, const LPRDOCalc& pCondition); }; #define DEFINE_CALC_GROUP(CalcName) \ @@ -25,10 +23,10 @@ class RDOFunCalc##CalcName: public RDOFunCalcGroup \ { \ DECLARE_FACTORY(RDOFunCalc##CalcName) \ private: \ - RDOFunCalc##CalcName(int nResType, const LPRDOCalc& pCondition) \ - : RDOFunCalcGroup(nResType, pCondition) \ - {} \ - DECLARE_ICalc; \ + RDOFunCalc##CalcName(int nResType, const LPRDOCalc& pCondition) \ + : RDOFunCalcGroup(nResType, pCondition) \ + {} \ + DECLARE_ICalc; \ }; DEFINE_CALC_GROUP(Exist); @@ -40,5 +38,3 @@ DEFINE_CALC_GROUP(ForAll); DEFINE_CALC_GROUP(NotForAll); CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_RESOURCE_GROUP_H_ diff --git a/simulator/runtime/calc/resource/calc_relevant.cpp b/simulator/runtime/calc/resource/calc_relevant.cpp index c91066b89..ceb0bef45 100644 --- a/simulator/runtime/calc/resource/calc_relevant.cpp +++ b/simulator/runtime/calc/resource/calc_relevant.cpp @@ -15,38 +15,38 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOGetResourceByRelevantResourceID // -------------------------------------------------------------------------------- RDOGetResourceByRelevantResourceID::RDOGetResourceByRelevantResourceID(std::size_t relevantResourceID) - : m_relevantResourceID(relevantResourceID) + : m_relevantResourceID(relevantResourceID) {} RDOValue RDOGetResourceByRelevantResourceID::doCalc(const LPRDORuntime& pRuntime) { - RDOValue value; - if (!RDOCalcGetResourceHelper::getResource(pRuntime, pRuntime->getCurrentActivity()->getResByRelRes(m_relevantResourceID), value)) - { - pRuntime->error().push("Не найден ресурс", srcInfo()); - } - return value; + RDOValue value; + if (!RDOCalcGetResourceHelper::getResource(pRuntime, pRuntime->getCurrentActivity()->getResByRelRes(m_relevantResourceID), value)) + { + pRuntime->error().push("Не найден ресурс", srcInfo()); + } + return value; } // -------------------------------------------------------------------------------- // -------------------- RDOEraseResRelCalc // -------------------------------------------------------------------------------- RDOEraseResRelCalc::RDOEraseResRelCalc(std::size_t relResID, const std::string& relResName) - : m_relResID (relResID ) - , m_relResName(relResName) + : m_relResID (relResID ) + , m_relResName(relResName) {} RDOValue RDOEraseResRelCalc::doCalc(const LPRDORuntime& pRuntime) { - std::size_t resId = pRuntime->getCurrentActivity()->getResByRelRes(m_relResID); - LPRDOResource pResource = pRuntime->getResourceByID(resId); - pResource->onDestroy(pRuntime, this); - return RDOValue(); + std::size_t resId = pRuntime->getCurrentActivity()->getResByRelRes(m_relResID); + LPRDOResource pResource = pRuntime->getResourceByID(resId); + pResource->onDestroy(pRuntime, this); + return RDOValue(); } const std::string& RDOEraseResRelCalc::getName() const { - return m_relResName; + return m_relResName; } // -------------------------------------------------------------------------------- @@ -57,13 +57,13 @@ RDOCalcGetGroupFunctionResource::RDOCalcGetGroupFunctionResource() RDOValue RDOCalcGetGroupFunctionResource::doCalc(const LPRDORuntime& pRuntime) { - LPRDOResource pResource = pRuntime->getGroupFuncRes(); - ASSERT(pResource); + LPRDOResource pResource = pRuntime->getGroupFuncRes(); + ASSERT(pResource); - LPRDOType pType(pResource->getResType()); - ASSERT(pType); + LPRDOType pType(pResource->getResType()); + ASSERT(pType); - return RDOValue(pType, pResource); + return RDOValue(pType, pResource); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/resource/calc_relevant.h b/simulator/runtime/calc/resource/calc_relevant.h index d40ff4023..46ded6f28 100644 --- a/simulator/runtime/calc/resource/calc_relevant.h +++ b/simulator/runtime/calc/resource/calc_relevant.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_RESOURCE_RELEVANT_H_ -#define _LIB_RUNTIME_CALC_RESOURCE_RELEVANT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,47 +8,42 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Получить ресурс по ID релевантного ресурса PREDECLARE_POINTER(RDOGetResourceByRelevantResourceID); class RDOGetResourceByRelevantResourceID: public RDOCalc { DECLARE_FACTORY(RDOGetResourceByRelevantResourceID) private: - RDOGetResourceByRelevantResourceID(std::size_t relevantResourceID); + RDOGetResourceByRelevantResourceID(std::size_t relevantResourceID); - std::size_t m_relevantResourceID; + std::size_t m_relevantResourceID; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Удаление релевантного ресурса PREDECLARE_POINTER(RDOEraseResRelCalc); class RDOEraseResRelCalc: public RDOCalc { DECLARE_FACTORY(RDOEraseResRelCalc) public: - const std::string& getName() const; + const std::string& getName() const; private: - RDOEraseResRelCalc(std::size_t relResID, const std::string& relResName); + RDOEraseResRelCalc(std::size_t relResID, const std::string& relResName); - std::size_t m_relResID; - std::string m_relResName; + std::size_t m_relResID; + std::string m_relResName; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Возвращает ресурс групповой функции PREDECLARE_POINTER(RDOCalcGetGroupFunctionResource); class RDOCalcGetGroupFunctionResource: public RDOCalc { DECLARE_FACTORY(RDOCalcGetGroupFunctionResource) private: - RDOCalcGetGroupFunctionResource(); + RDOCalcGetGroupFunctionResource(); - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_RESOURCE_RELEVANT_H_ diff --git a/simulator/runtime/calc/resource/calc_resource-inl.h b/simulator/runtime/calc/resource/calc_resource-inl.h index 871219513..7cbe49009 100644 --- a/simulator/runtime/calc/resource/calc_resource-inl.h +++ b/simulator/runtime/calc/resource/calc_resource-inl.h @@ -8,39 +8,39 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- // -------------------- RDOSetResourceParam // -------------------------------------------------------------------------------- -template +template inline RDOSetResourceParam::RDOSetResourceParam(const LPRDOCalc& getResource, const std::size_t paramID, const LPRDOCalc& pCalc) - : m_getResource (getResource) - , m_paramID (paramID ) - , m_pCalc (pCalc ) + : m_getResource (getResource) + , m_paramID (paramID ) + , m_pCalc (pCalc ) { - if (m_pCalc) - { - setSrcInfo(m_pCalc->srcInfo()); - } + if (m_pCalc) + { + setSrcInfo(m_pCalc->srcInfo()); + } } -template +template inline RDOSetResourceParam::~RDOSetResourceParam() {} template <> -inline RDOValue RDOSetResourceParam::doCalc(const LPRDORuntime& pRuntime) +inline RDOValue RDOSetResourceParam::doCalc(const LPRDORuntime& pRuntime) { - LPRDOResource pResource = m_getResource->calcValue(pRuntime).getPointerByInterface(); - ASSERT(pResource); - RDOValue value(true); - return value; + LPRDOResource pResource = m_getResource->calcValue(pRuntime).getPointerByInterface(); + ASSERT(pResource); + RDOValue value(true); + return value; } template <> -inline RDOValue RDOSetResourceParam::doCalc(const LPRDORuntime& pRuntime) +inline RDOValue RDOSetResourceParam::doCalc(const LPRDORuntime& pRuntime) { - LPRDOResource pResource = m_getResource->calcValue(pRuntime).getPointerByInterface(); - ASSERT(pResource); - RDOValue value = m_pCalc->calcValue(pRuntime); - pResource->setParam(m_paramID, value); - return value; + LPRDOResource pResource = m_getResource->calcValue(pRuntime).getPointerByInterface(); + ASSERT(pResource); + RDOValue value = m_pCalc->calcValue(pRuntime); + pResource->setParam(m_paramID, value); + return value; } CLOSE_RDO_RUNTIME_NAMESPACE \ No newline at end of file diff --git a/simulator/runtime/calc/resource/calc_resource.cpp b/simulator/runtime/calc/resource/calc_resource.cpp index e32fe5d18..919ca2723 100644 --- a/simulator/runtime/calc/resource/calc_resource.cpp +++ b/simulator/runtime/calc/resource/calc_resource.cpp @@ -15,100 +15,100 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- bool RDOCalcGetResourceHelper::getResource(const LPRDORuntime& pRuntime, std::size_t resourceID, RDOValue& result) { - LPRDOResource pResource = pRuntime->getResourceByID(resourceID); - if (!pResource) - return false; + LPRDOResource pResource = pRuntime->getResourceByID(resourceID); + if (!pResource) + return false; - LPRDOType pType(pResource->getResType()); - ASSERT(pType); + LPRDOType pType(pResource->getResType()); + ASSERT(pType); - result = RDOValue(pType, pResource); - return true; + result = RDOValue(pType, pResource); + return true; } // -------------------------------------------------------------------------------- // -------------------- RDOCalcGetResourceByID // -------------------------------------------------------------------------------- RDOCalcGetResourceByID::RDOCalcGetResourceByID(const std::size_t& resourceID) - : m_resourceID(resourceID) + : m_resourceID(resourceID) {} RDOValue RDOCalcGetResourceByID::doCalc(const LPRDORuntime& pRuntime) { - RDOValue value; - if (!RDOCalcGetResourceHelper::getResource(pRuntime, m_resourceID, value)) - { - pRuntime->error().push("Не найден ресурс", srcInfo()); - } - return value; + RDOValue value; + if (!RDOCalcGetResourceHelper::getResource(pRuntime, m_resourceID, value)) + { + pRuntime->error().push("Не найден ресурс", srcInfo()); + } + return value; } // -------------------------------------------------------------------------------- // -------------------- RDOCalcGetResourceParam // -------------------------------------------------------------------------------- RDOCalcGetResourceParam::RDOCalcGetResourceParam(const LPRDOCalc& pResource, std::size_t paramID) - : m_pResource(pResource) - , m_paramID (paramID ) + : m_pResource(pResource) + , m_paramID (paramID ) { - ASSERT(m_pResource); + ASSERT(m_pResource); } RDOValue RDOCalcGetResourceParam::doCalc(const LPRDORuntime& pRuntime) { - LPRDOResource pResource = m_pResource->calcValue(pRuntime).getPointerByInterface(); - ASSERT(pResource); - return pResource->getParam(m_paramID); + LPRDOResource pResource = m_pResource->calcValue(pRuntime).getPointerByInterface(); + ASSERT(pResource); + return pResource->getParam(m_paramID); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcGetUnknowResParam // -------------------------------------------------------------------------------- RDOCalcGetUnknowResParam::RDOCalcGetUnknowResParam(const std::string& resName, const std::string& parName) - : m_resName(resName) - , m_parName(parName) + : m_resName(resName) + , m_parName(parName) {} RDOValue RDOCalcGetUnknowResParam::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->error().push(rdo::format("Попытка использовать несуществующий ресурс: %s.%s", m_resName.c_str(), m_parName.c_str()), srcInfo()); - return RDOValue(); + pRuntime->error().push(rdo::format("Попытка использовать несуществующий ресурс: %s.%s", m_resName.c_str(), m_parName.c_str()), srcInfo()); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOSetResourceParamCalc // -------------------------------------------------------------------------------- RDOSetResourceParamCalc::RDOSetResourceParamCalc(std::size_t resourceID, std::size_t paramID, const LPRDOCalc& pCalc) - : m_resourceID(resourceID) - , m_paramID (paramID ) - , m_pCalc (pCalc ) + : m_resourceID(resourceID) + , m_paramID (paramID ) + , m_pCalc (pCalc ) { - if (m_pCalc) - { - setSrcInfo(m_pCalc->srcInfo()); - } + if (m_pCalc) + { + setSrcInfo(m_pCalc->srcInfo()); + } } RDOValue RDOSetResourceParamCalc::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->setResParamVal(m_resourceID, m_paramID, m_pCalc->calcValue(pRuntime)); - return RDOValue(); + pRuntime->setResParamVal(m_resourceID, m_paramID, m_pCalc->calcValue(pRuntime)); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOCalcSetResourceTrace // -------------------------------------------------------------------------------- RDOCalcSetResourceTrace::RDOCalcSetResourceTrace(const LPRDOCalc& getResource, bool traceValue) - : m_getResource(getResource) - , m_traceValue(traceValue) + : m_getResource(getResource) + , m_traceValue(traceValue) {} RDOValue RDOCalcSetResourceTrace::doCalc(const LPRDORuntime& pRuntime) { - RDOValue value = 0; - LPRDOResource pResource = m_getResource->calcValue(pRuntime).getPointerByInterface(); - ASSERT(pResource); - pResource->setTrace(m_traceValue); - return value; + RDOValue value = 0; + LPRDOResource pResource = m_getResource->calcValue(pRuntime).getPointerByInterface(); + ASSERT(pResource); + pResource->setTrace(m_traceValue); + return value; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/resource/calc_resource.h b/simulator/runtime/calc/resource/calc_resource.h index a6d389b61..2b2585c12 100644 --- a/simulator/runtime/calc/resource/calc_resource.h +++ b/simulator/runtime/calc/resource/calc_resource.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_RESOURCE_H_ -#define _LIB_RUNTIME_CALC_RESOURCE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,67 +8,62 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Вспомогательный класс для вытаскивания ресурса по ID и оборачивания его в RDOValue class RDOCalcGetResourceHelper { public: - static bool getResource(const LPRDORuntime& pRuntime, std::size_t resourceID, RDOValue& result); + static bool getResource(const LPRDORuntime& pRuntime, std::size_t resourceID, RDOValue& result); }; -//! Получение ресурса по ID PREDECLARE_POINTER(RDOCalcGetResourceByID); class RDOCalcGetResourceByID: public RDOCalc { DECLARE_FACTORY(RDOCalcGetResourceByID) private: - RDOCalcGetResourceByID(const std::size_t& resourceID); + RDOCalcGetResourceByID(const std::size_t& resourceID); - std::size_t m_resourceID; + std::size_t m_resourceID; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Получение параметр ресурса по калку ресурса и ID параметра PREDECLARE_POINTER(RDOCalcGetResourceParam); class RDOCalcGetResourceParam: public RDOCalc { DECLARE_FACTORY(RDOCalcGetResourceParam) private: - RDOCalcGetResourceParam(const LPRDOCalc& pResource, std::size_t paramID); + RDOCalcGetResourceParam(const LPRDOCalc& pResource, std::size_t paramID); - LPRDOCalc m_pResource; - int m_paramID; + LPRDOCalc m_pResource; + int m_paramID; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Параметры несуществующего ресурса PREDECLARE_POINTER(RDOCalcGetUnknowResParam); class RDOCalcGetUnknowResParam: public RDOCalc { DECLARE_FACTORY(RDOCalcGetUnknowResParam) private: - RDOCalcGetUnknowResParam(const std::string& resName, const std::string& parName); + RDOCalcGetUnknowResParam(const std::string& resName, const std::string& parName); - std::string m_resName; - std::string m_parName; + std::string m_resName; + std::string m_parName; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Установка значения параметра ресурса перед моделированием из SMR PREDECLARE_POINTER(RDOSetResourceParamCalc); class RDOSetResourceParamCalc: public RDOCalc { DECLARE_FACTORY(RDOSetResourceParamCalc) private: - RDOSetResourceParamCalc(std::size_t resourceID, std::size_t paramID, const LPRDOCalc& pCalc); + RDOSetResourceParamCalc(std::size_t resourceID, std::size_t paramID, const LPRDOCalc& pCalc); - std::size_t m_resourceID; - std::size_t m_paramID; - LPRDOCalc m_pCalc; + std::size_t m_resourceID; + std::size_t m_paramID; + LPRDOCalc m_pCalc; - DECLARE_ICalc; + DECLARE_ICalc; }; PREDECLARE_POINTER(RDOCalcSetResourceTrace); @@ -77,31 +71,29 @@ class RDOCalcSetResourceTrace: public RDOCalc { DECLARE_FACTORY(RDOCalcSetResourceTrace) private: - RDOCalcSetResourceTrace(const LPRDOCalc& getResource, bool traceValue); + RDOCalcSetResourceTrace(const LPRDOCalc& getResource, bool traceValue); - LPRDOCalc m_getResource; - bool m_traceValue; + LPRDOCalc m_getResource; + bool m_traceValue; - DECLARE_ICalc; + DECLARE_ICalc; }; -template +template class RDOSetResourceParam: public RDOCalc { public: - RDOSetResourceParam(const LPRDOCalc& getResource, const std::size_t paramID, const LPRDOCalc& pCalc = NULL); - virtual ~RDOSetResourceParam(); + RDOSetResourceParam(const LPRDOCalc& getResource, const std::size_t paramID, const LPRDOCalc& pCalc = NULL); + virtual ~RDOSetResourceParam(); protected: - LPRDOCalc m_getResource; - std::size_t m_paramID; - LPRDOCalc m_pCalc; + LPRDOCalc m_getResource; + std::size_t m_paramID; + LPRDOCalc m_pCalc; - DECLARE_ICalc; + DECLARE_ICalc; }; CLOSE_RDO_RUNTIME_NAMESPACE #include "simulator/runtime/calc/resource/calc_resource-inl.h" - -#endif // _LIB_RUNTIME_CALC_RESOURCE_H_ diff --git a/simulator/runtime/calc/resource/calc_select.cpp b/simulator/runtime/calc/resource/calc_select.cpp index 6babe622c..0f38f1fae 100644 --- a/simulator/runtime/calc/resource/calc_select.cpp +++ b/simulator/runtime/calc/resource/calc_select.cpp @@ -13,44 +13,44 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOFunCalcSelect // -------------------------------------------------------------------------------- RDOFunCalcSelect::RDOFunCalcSelect(const LPIResourceType& pResType, int nResType, const LPRDOCalc& pCondition) - : RDOFunCalcGroup(nResType, pCondition) + : RDOFunCalcGroup(nResType, pCondition) { - m_pResType = pResType; + m_pResType = pResType; } void RDOFunCalcSelect::prepare(const LPRDORuntime& pRuntime) { - res_list.clear(); - RDORuntime::ResCIterator end = pRuntime->getResType(m_nResType)->res_end(); - for (RDORuntime::ResCIterator it = pRuntime->getResType(m_nResType)->res_begin(); it != end; it++) - { - if (*it == LPRDOResource(NULL)) - continue; + res_list.clear(); + RDORuntime::ResCIterator end = pRuntime->getResType(m_nResType)->res_end(); + for (RDORuntime::ResCIterator it = pRuntime->getResType(m_nResType)->res_begin(); it != end; it++) + { + if (*it == LPRDOResource(NULL)) + continue; - pRuntime->pushGroupFunc(*it); - if (m_pCondition->calcValue(pRuntime).getAsBool()) - res_list.push_back(*it); - pRuntime->popGroupFunc(); - } + pRuntime->pushGroupFunc(*it); + if (m_pCondition->calcValue(pRuntime).getAsBool()) + res_list.push_back(*it); + pRuntime->popGroupFunc(); + } } RDOValue RDOFunCalcSelect::doCalc(const LPRDORuntime& pRuntime) { - prepare(pRuntime); - return RDOValue(); + prepare(pRuntime); + return RDOValue(); } const LPIResourceType& RDOFunCalcSelect::getResType() { - return m_pResType; + return m_pResType; } // -------------------------------------------------------------------------------- // -------------------- RDOFunCalcSelectBase // -------------------------------------------------------------------------------- RDOFunCalcSelectBase::RDOFunCalcSelectBase(const LPRDOFunCalcSelect& pSelect, const LPRDOCalc& pCondition) - : m_pSelect (pSelect ) - , m_pCondition(pCondition) + : m_pSelect (pSelect ) + , m_pCondition(pCondition) {} // -------------------------------------------------------------------------------- @@ -58,19 +58,19 @@ RDOFunCalcSelectBase::RDOFunCalcSelectBase(const LPRDOFunCalcSelect& pSelect, co // -------------------------------------------------------------------------------- RDOValue RDOFunCalcSelectExist::doCalc(const LPRDORuntime& pRuntime) { - m_pSelect->prepare(pRuntime); - bool res = false; - std::list::iterator it = m_pSelect->res_list.begin(); - std::list::iterator end = m_pSelect->res_list.end(); - while (it != end && !res) - { - pRuntime->pushGroupFunc(*it); - if (m_pCondition->calcValue(pRuntime).getAsBool()) - res = true; - pRuntime->popGroupFunc(); - ++it; - } - return RDOValue(res); + m_pSelect->prepare(pRuntime); + bool res = false; + std::list::iterator it = m_pSelect->res_list.begin(); + std::list::iterator end = m_pSelect->res_list.end(); + while (it != end && !res) + { + pRuntime->pushGroupFunc(*it); + if (m_pCondition->calcValue(pRuntime).getAsBool()) + res = true; + pRuntime->popGroupFunc(); + ++it; + } + return RDOValue(res); } // -------------------------------------------------------------------------------- @@ -78,19 +78,19 @@ RDOValue RDOFunCalcSelectExist::doCalc(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOFunCalcSelectNotExist::doCalc(const LPRDORuntime& pRuntime) { - m_pSelect->prepare(pRuntime); - bool res = true; - std::list::iterator it = m_pSelect->res_list.begin(); - std::list::iterator end = m_pSelect->res_list.end(); - while (it != end && res) - { - pRuntime->pushGroupFunc(*it); - if (m_pCondition->calcValue(pRuntime).getAsBool()) - res = false; - pRuntime->popGroupFunc(); - ++it; - } - return RDOValue(res); + m_pSelect->prepare(pRuntime); + bool res = true; + std::list::iterator it = m_pSelect->res_list.begin(); + std::list::iterator end = m_pSelect->res_list.end(); + while (it != end && res) + { + pRuntime->pushGroupFunc(*it); + if (m_pCondition->calcValue(pRuntime).getAsBool()) + res = false; + pRuntime->popGroupFunc(); + ++it; + } + return RDOValue(res); } // -------------------------------------------------------------------------------- @@ -98,23 +98,23 @@ RDOValue RDOFunCalcSelectNotExist::doCalc(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOFunCalcSelectForAll::doCalc(const LPRDORuntime& pRuntime) { - m_pSelect->prepare(pRuntime); - if (m_pSelect->res_list.empty()) - { - return RDOValue(false); - } - bool res = true; - std::list::iterator it = m_pSelect->res_list.begin(); - std::list::iterator end = m_pSelect->res_list.end(); - while (it != end && res) - { - pRuntime->pushGroupFunc(*it); - if (!m_pCondition->calcValue(pRuntime).getAsBool()) - res = false; - pRuntime->popGroupFunc(); - ++it; - } - return RDOValue(res); + m_pSelect->prepare(pRuntime); + if (m_pSelect->res_list.empty()) + { + return RDOValue(false); + } + bool res = true; + std::list::iterator it = m_pSelect->res_list.begin(); + std::list::iterator end = m_pSelect->res_list.end(); + while (it != end && res) + { + pRuntime->pushGroupFunc(*it); + if (!m_pCondition->calcValue(pRuntime).getAsBool()) + res = false; + pRuntime->popGroupFunc(); + ++it; + } + return RDOValue(res); } // -------------------------------------------------------------------------------- @@ -122,19 +122,19 @@ RDOValue RDOFunCalcSelectForAll::doCalc(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOFunCalcSelectNotForAll::doCalc(const LPRDORuntime& pRuntime) { - m_pSelect->prepare(pRuntime); - bool res = false; - std::list::iterator it = m_pSelect->res_list.begin(); - std::list::iterator end = m_pSelect->res_list.end(); - while (it != end && !res) - { - pRuntime->pushGroupFunc(*it); - if (!m_pCondition->calcValue(pRuntime).getAsBool()) - res = true; - pRuntime->popGroupFunc(); - ++it; - } - return RDOValue(res); + m_pSelect->prepare(pRuntime); + bool res = false; + std::list::iterator it = m_pSelect->res_list.begin(); + std::list::iterator end = m_pSelect->res_list.end(); + while (it != end && !res) + { + pRuntime->pushGroupFunc(*it); + if (!m_pCondition->calcValue(pRuntime).getAsBool()) + res = true; + pRuntime->popGroupFunc(); + ++it; + } + return RDOValue(res); } // -------------------------------------------------------------------------------- @@ -142,8 +142,8 @@ RDOValue RDOFunCalcSelectNotForAll::doCalc(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOFunCalcSelectSize::doCalc(const LPRDORuntime& pRuntime) { - m_pSelect->prepare(pRuntime); - return RDOValue(static_cast(m_pSelect->res_list.size())); + m_pSelect->prepare(pRuntime); + return RDOValue(static_cast(m_pSelect->res_list.size())); } // -------------------------------------------------------------------------------- @@ -151,8 +151,8 @@ RDOValue RDOFunCalcSelectSize::doCalc(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOFunCalcSelectEmpty::doCalc(const LPRDORuntime& pRuntime) { - m_pSelect->prepare(pRuntime); - return m_pSelect->res_list.empty(); + m_pSelect->prepare(pRuntime); + return m_pSelect->res_list.empty(); } // -------------------------------------------------------------------------------- @@ -160,18 +160,18 @@ RDOValue RDOFunCalcSelectEmpty::doCalc(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- RDOValue RDOFunCalcSelectArray::doCalc(const LPRDORuntime& pRuntime) { - m_pSelect->prepare(pRuntime); - std::list::iterator it = m_pSelect->res_list.begin(); - std::list::iterator end = m_pSelect->res_list.end (); - rdo::runtime::LPRDOArrayType pType = rdo::Factory::create(m_pSelect->getResType()); - ASSERT(pType); - rdo::runtime::LPRDOArrayValue pValue = rdo::Factory::create(pType); - ASSERT(pValue); - while (it != end) - { - pValue->push_back(rdo::runtime::RDOValue(m_pSelect->getResType(), *(it++))); - } - return RDOValue(pType, pValue); + m_pSelect->prepare(pRuntime); + std::list::iterator it = m_pSelect->res_list.begin(); + std::list::iterator end = m_pSelect->res_list.end (); + rdo::runtime::LPRDOArrayType pType = rdo::Factory::create(m_pSelect->getResType()); + ASSERT(pType); + rdo::runtime::LPRDOArrayValue pValue = rdo::Factory::create(pType); + ASSERT(pValue); + while (it != end) + { + pValue->push_back(rdo::runtime::RDOValue(m_pSelect->getResType(), *(it++))); + } + return RDOValue(pType, pValue); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/calc/resource/calc_select.h b/simulator/runtime/calc/resource/calc_select.h index 0f4c9a858..b60754124 100644 --- a/simulator/runtime/calc/resource/calc_select.h +++ b/simulator/runtime/calc/resource/calc_select.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_CALC_RESOURCE_SELECT_H_ -#define _LIB_RUNTIME_CALC_RESOURCE_SELECT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -11,34 +10,32 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Базовая групповая функция PREDECLARE_POINTER(RDOFunCalcSelect); class RDOFunCalcSelect: public RDOFunCalcGroup { DECLARE_FACTORY(RDOFunCalcSelect) public: - mutable std::list res_list; - void prepare(const LPRDORuntime& pRuntime); + mutable std::list res_list; + void prepare(const LPRDORuntime& pRuntime); - const LPIResourceType& getResType(); + const LPIResourceType& getResType(); private: - RDOFunCalcSelect(const LPIResourceType& pResType, int nResType, const LPRDOCalc& pCondition); + RDOFunCalcSelect(const LPIResourceType& pResType, int nResType, const LPRDOCalc& pCondition); - LPIResourceType m_pResType; + LPIResourceType m_pResType; - DECLARE_ICalc; + DECLARE_ICalc; }; -//! Базовая класс для операторов Select PREDECLARE_POINTER(RDOFunCalcSelectBase); class RDOFunCalcSelectBase: public RDOFunCalc { protected: - RDOFunCalcSelectBase(const LPRDOFunCalcSelect& pSelect, const LPRDOCalc& pCondition); + RDOFunCalcSelectBase(const LPRDOFunCalcSelect& pSelect, const LPRDOCalc& pCondition); - LPRDOFunCalcSelect m_pSelect; - LPRDOCalc m_pCondition; + LPRDOFunCalcSelect m_pSelect; + LPRDOCalc m_pCondition; }; #define DEFINE_CALC_SELECT_GROUP(CalcName) \ @@ -47,10 +44,10 @@ class RDOFunCalcSelect##CalcName: public RDOFunCalcSelectBase \ { \ DECLARE_FACTORY(RDOFunCalcSelect##CalcName) \ private: \ - RDOFunCalcSelect##CalcName(const LPRDOFunCalcSelect& pSelect, const LPRDOCalc& pCondition) \ - : RDOFunCalcSelectBase(pSelect, pCondition) \ - {} \ - DECLARE_ICalc; \ + RDOFunCalcSelect##CalcName(const LPRDOFunCalcSelect& pSelect, const LPRDOCalc& pCondition) \ + : RDOFunCalcSelectBase(pSelect, pCondition) \ + {} \ + DECLARE_ICalc; \ }; #define DEFINE_CALC_SELECT_METHOD(CalcName) \ @@ -59,10 +56,10 @@ class RDOFunCalcSelect##CalcName: public RDOFunCalcSelectBase \ { \ DECLARE_FACTORY(RDOFunCalcSelect##CalcName) \ private: \ - RDOFunCalcSelect##CalcName(const LPRDOFunCalcSelect& pSelect) \ - : RDOFunCalcSelectBase(pSelect, NULL) \ - {} \ - DECLARE_ICalc; \ + RDOFunCalcSelect##CalcName(const LPRDOFunCalcSelect& pSelect) \ + : RDOFunCalcSelectBase(pSelect, NULL) \ + {} \ + DECLARE_ICalc; \ }; DEFINE_CALC_SELECT_GROUP(Exist); @@ -80,5 +77,3 @@ DEFINE_CALC_SELECT_METHOD(Size ); DEFINE_CALC_SELECT_METHOD(Array ); CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_CALC_RESOURCE_SELECT_H_ diff --git a/simulator/runtime/error.cpp b/simulator/runtime/error.cpp index 0721c5afb..04dd4a72f 100644 --- a/simulator/runtime/error.cpp +++ b/simulator/runtime/error.cpp @@ -12,28 +12,28 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- // -------------------- Error // -------------------------------------------------------------------------------- -void Error::push(const RDOSyntaxMessage& message) +void Error::push(const SyntaxMessage& message) { - m_errorList.push_back(message); - throw RDORuntimeException(""); + m_errorList.push_back(message); + throw RDORuntimeException(""); } void Error::push(const std::string& message, const RDOSrcInfo& srcInfo) { - ASSERT(!message.empty()); + ASSERT(!message.empty()); - RDOSyntaxMessage error( - message, - srcInfo.src_filetype(), - srcInfo.src_pos().m_last_line, - srcInfo.src_pos().m_last_pos - ); - push(error); + SyntaxMessage error( + message, + srcInfo.src_filetype(), + srcInfo.src_pos().m_last_line, + srcInfo.src_pos().m_last_pos + ); + push(error); } const Error::ErrorList& Error::list() const { - return m_errorList; + return m_errorList; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/error.h b/simulator/runtime/error.h index 6f6e99d37..819e61da5 100644 --- a/simulator/runtime/error.h +++ b/simulator/runtime/error.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_ERROR_H_ -#define _LIB_RUNTIME_ERROR_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM // ----------------------------------------------------------------------- INCLUDES @@ -14,18 +13,16 @@ OPEN_RDO_RUNTIME_NAMESPACE class Error { public: - typedef std::vector ErrorList; + typedef std::vector ErrorList; - void push(const rdo::simulation::report::FileMessage& error); - void push(const std::string& message, const RDOSrcInfo& srcInfo); - const ErrorList& list() const; + void push(const rdo::simulation::report::FileMessage& error); + void push(const std::string& message, const RDOSrcInfo& srcInfo); + const ErrorList& list() const; private: - typedef rdo::simulation::report::FileMessage RDOSyntaxMessage; + typedef rdo::simulation::report::FileMessage SyntaxMessage; - ErrorList m_errorList; + ErrorList m_errorList; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_ERROR_H_ diff --git a/simulator/runtime/hotkey.cpp b/simulator/runtime/hotkey.cpp index b2bc20ba2..b177c53c8 100644 --- a/simulator/runtime/hotkey.cpp +++ b/simulator/runtime/hotkey.cpp @@ -15,61 +15,61 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- RDOHotKey::Toolkit::Toolkit() { - m_keyList.insert(KeySet::value_type("ESCAPE", VK_ESCAPE)); - m_keyList.insert(KeySet::value_type("TAB", VK_TAB)); - m_keyList.insert(KeySet::value_type("SHIFT", VK_SHIFT)); - m_keyList.insert(KeySet::value_type("CONTROL", VK_CONTROL)); - m_keyList.insert(KeySet::value_type("BACK", VK_BACK)); - m_keyList.insert(KeySet::value_type("RETURN", VK_RETURN)); - m_keyList.insert(KeySet::value_type("INSERT", VK_INSERT)); - m_keyList.insert(KeySet::value_type("HOME", VK_HOME)); - m_keyList.insert(KeySet::value_type("PRIOR", VK_PRIOR)); - m_keyList.insert(KeySet::value_type("DELETE", VK_DELETE)); - m_keyList.insert(KeySet::value_type("END", VK_END)); - m_keyList.insert(KeySet::value_type("NEXT", VK_NEXT)); - m_keyList.insert(KeySet::value_type("UP", VK_UP)); - m_keyList.insert(KeySet::value_type("LEFT", VK_LEFT)); - m_keyList.insert(KeySet::value_type("DOWN", VK_DOWN)); - m_keyList.insert(KeySet::value_type("RIGHT", VK_RIGHT)); - m_keyList.insert(KeySet::value_type("DIVIDE", VK_DIVIDE)); - m_keyList.insert(KeySet::value_type("MULTIPLY", VK_MULTIPLY)); - m_keyList.insert(KeySet::value_type("SUBTRACT", VK_SUBTRACT)); - m_keyList.insert(KeySet::value_type("ADD", VK_ADD)); - m_keyList.insert(KeySet::value_type("CLEAR", VK_CLEAR)); - m_keyList.insert(KeySet::value_type("SPACE", VK_SPACE)); - m_keyList.insert(KeySet::value_type("DECIMAL", VK_DECIMAL)); - m_keyList.insert(KeySet::value_type("F2", VK_F2)); - m_keyList.insert(KeySet::value_type("F3", VK_F3)); - m_keyList.insert(KeySet::value_type("F4", VK_F4)); - m_keyList.insert(KeySet::value_type("F5", VK_F5)); - m_keyList.insert(KeySet::value_type("F6", VK_F6)); - m_keyList.insert(KeySet::value_type("F7", VK_F7)); - m_keyList.insert(KeySet::value_type("F8", VK_F8)); - m_keyList.insert(KeySet::value_type("F9", VK_F9)); - m_keyList.insert(KeySet::value_type("F10", VK_F10)); - m_keyList.insert(KeySet::value_type("F11", VK_F11)); - m_keyList.insert(KeySet::value_type("F12", VK_F12)); - m_keyList.insert(KeySet::value_type("NUMPAD0", VK_NUMPAD0)); - m_keyList.insert(KeySet::value_type("NUMPAD1", VK_NUMPAD1)); - m_keyList.insert(KeySet::value_type("NUMPAD2", VK_NUMPAD2)); - m_keyList.insert(KeySet::value_type("NUMPAD3", VK_NUMPAD3)); - m_keyList.insert(KeySet::value_type("NUMPAD4", VK_NUMPAD4)); - m_keyList.insert(KeySet::value_type("NUMPAD5", VK_NUMPAD5)); - m_keyList.insert(KeySet::value_type("NUMPAD6", VK_NUMPAD6)); - m_keyList.insert(KeySet::value_type("NUMPAD7", VK_NUMPAD7)); - m_keyList.insert(KeySet::value_type("NUMPAD8", VK_NUMPAD8)); - m_keyList.insert(KeySet::value_type("NUMPAD9", VK_NUMPAD9)); - m_keyList.insert(KeySet::value_type("NOKEY", 0)); + m_keyList.insert(KeySet::value_type("ESCAPE", VK_ESCAPE)); + m_keyList.insert(KeySet::value_type("TAB", VK_TAB)); + m_keyList.insert(KeySet::value_type("SHIFT", VK_SHIFT)); + m_keyList.insert(KeySet::value_type("CONTROL", VK_CONTROL)); + m_keyList.insert(KeySet::value_type("BACK", VK_BACK)); + m_keyList.insert(KeySet::value_type("RETURN", VK_RETURN)); + m_keyList.insert(KeySet::value_type("INSERT", VK_INSERT)); + m_keyList.insert(KeySet::value_type("HOME", VK_HOME)); + m_keyList.insert(KeySet::value_type("PRIOR", VK_PRIOR)); + m_keyList.insert(KeySet::value_type("DELETE", VK_DELETE)); + m_keyList.insert(KeySet::value_type("END", VK_END)); + m_keyList.insert(KeySet::value_type("NEXT", VK_NEXT)); + m_keyList.insert(KeySet::value_type("UP", VK_UP)); + m_keyList.insert(KeySet::value_type("LEFT", VK_LEFT)); + m_keyList.insert(KeySet::value_type("DOWN", VK_DOWN)); + m_keyList.insert(KeySet::value_type("RIGHT", VK_RIGHT)); + m_keyList.insert(KeySet::value_type("DIVIDE", VK_DIVIDE)); + m_keyList.insert(KeySet::value_type("MULTIPLY", VK_MULTIPLY)); + m_keyList.insert(KeySet::value_type("SUBTRACT", VK_SUBTRACT)); + m_keyList.insert(KeySet::value_type("ADD", VK_ADD)); + m_keyList.insert(KeySet::value_type("CLEAR", VK_CLEAR)); + m_keyList.insert(KeySet::value_type("SPACE", VK_SPACE)); + m_keyList.insert(KeySet::value_type("DECIMAL", VK_DECIMAL)); + m_keyList.insert(KeySet::value_type("F2", VK_F2)); + m_keyList.insert(KeySet::value_type("F3", VK_F3)); + m_keyList.insert(KeySet::value_type("F4", VK_F4)); + m_keyList.insert(KeySet::value_type("F5", VK_F5)); + m_keyList.insert(KeySet::value_type("F6", VK_F6)); + m_keyList.insert(KeySet::value_type("F7", VK_F7)); + m_keyList.insert(KeySet::value_type("F8", VK_F8)); + m_keyList.insert(KeySet::value_type("F9", VK_F9)); + m_keyList.insert(KeySet::value_type("F10", VK_F10)); + m_keyList.insert(KeySet::value_type("F11", VK_F11)); + m_keyList.insert(KeySet::value_type("F12", VK_F12)); + m_keyList.insert(KeySet::value_type("NUMPAD0", VK_NUMPAD0)); + m_keyList.insert(KeySet::value_type("NUMPAD1", VK_NUMPAD1)); + m_keyList.insert(KeySet::value_type("NUMPAD2", VK_NUMPAD2)); + m_keyList.insert(KeySet::value_type("NUMPAD3", VK_NUMPAD3)); + m_keyList.insert(KeySet::value_type("NUMPAD4", VK_NUMPAD4)); + m_keyList.insert(KeySet::value_type("NUMPAD5", VK_NUMPAD5)); + m_keyList.insert(KeySet::value_type("NUMPAD6", VK_NUMPAD6)); + m_keyList.insert(KeySet::value_type("NUMPAD7", VK_NUMPAD7)); + m_keyList.insert(KeySet::value_type("NUMPAD8", VK_NUMPAD8)); + m_keyList.insert(KeySet::value_type("NUMPAD9", VK_NUMPAD9)); + m_keyList.insert(KeySet::value_type("NOKEY", 0)); - for (char i = '0'; i <= '9'; ++i) - { - m_keyList.insert(KeySet::value_type(std::string(1, i), (KeyCode)i)); - } + for (char i = '0'; i <= '9'; ++i) + { + m_keyList.insert(KeySet::value_type(std::string(1, i), (KeyCode)i)); + } - for (char i = 'A'; i <= 'Z'; ++i) - { - m_keyList.insert(KeySet::value_type(std::string(1, i), (KeyCode)i)); - } + for (char i = 'A'; i <= 'Z'; ++i) + { + m_keyList.insert(KeySet::value_type(std::string(1, i), (KeyCode)i)); + } } RDOHotKey::Toolkit::~Toolkit() @@ -77,8 +77,8 @@ RDOHotKey::Toolkit::~Toolkit() RDOHotKey::KeyCode RDOHotKey::Toolkit::codeFromString(const std::string& keyName) const { - KeySet::const_iterator it = m_keyList.find(keyName); - return it == m_keyList.end() ? KeyCode(UNDEFINED_KEY) : it->second; + KeySet::const_iterator it = m_keyList.find(keyName); + return it == m_keyList.end() ? KeyCode(UNDEFINED_KEY) : it->second; } // -------------------------------------------------------------------------------- @@ -86,24 +86,24 @@ RDOHotKey::KeyCode RDOHotKey::Toolkit::codeFromString(const std::string& keyName // -------------------------------------------------------------------------------- bool RDOHotKey::KeyInModelList::insert(const KeyCode& keyCode) { - if (check(keyCode)) - { - return false; - } - m_keyList.push_back(keyCode); - return true; + if (check(keyCode)) + { + return false; + } + m_keyList.push_back(keyCode); + return true; } bool RDOHotKey::KeyInModelList::check(const KeyCode& keyCode) const { - return boost::find(m_keyList, keyCode) != m_keyList.end(); + return boost::find(m_keyList, keyCode) != m_keyList.end(); } // -------------------------------------------------------------------------------- // -------------------- RDOHotKey::KeyDownList // -------------------------------------------------------------------------------- RDOHotKey::KeyDownList::KeyDownList() - : m_keyFound(false) + : m_keyFound(false) {} RDOHotKey::KeyDownList::~KeyDownList() @@ -111,111 +111,111 @@ RDOHotKey::KeyDownList::~KeyDownList() bool RDOHotKey::KeyDownList::down(const KeyCode& keyCode) { - // Если нажаты VK_SHIFT или VK_CONTROL, то сбросим буфер клавиатуры - if (keyCode == VK_SHIFT || keyCode == VK_CONTROL) - { - KeyList::iterator it = m_keyList.begin(); - while (it != m_keyList.end()) - { - if (*it != VK_SHIFT && *it != VK_CONTROL) - { - it = m_keyList.erase(it); - } - else - { - ++it; - } - } - } - // Подсчитаем сколько раз клавиша уже в буфере - int cnt = 0; - KeyList::iterator it = m_keyList.begin(); - while (it != m_keyList.end()) - { - if (*it == keyCode) - { - ++cnt; - } - ++it; - } - // Добавим клавишу в буфер - if (cnt < 4) - { - m_keyList.push_back(keyCode); - } - if (cnt == 0) m_keyFound = true; - return cnt > 0; + // Если нажаты VK_SHIFT или VK_CONTROL, то сбросим буфер клавиатуры + if (keyCode == VK_SHIFT || keyCode == VK_CONTROL) + { + KeyList::iterator it = m_keyList.begin(); + while (it != m_keyList.end()) + { + if (*it != VK_SHIFT && *it != VK_CONTROL) + { + it = m_keyList.erase(it); + } + else + { + ++it; + } + } + } + // Подсчитаем сколько раз клавиша уже в буфере + int cnt = 0; + KeyList::iterator it = m_keyList.begin(); + while (it != m_keyList.end()) + { + if (*it == keyCode) + { + ++cnt; + } + ++it; + } + // Добавим клавишу в буфер + if (cnt < 4) + { + m_keyList.push_back(keyCode); + } + if (cnt == 0) m_keyFound = true; + return cnt > 0; } void RDOHotKey::KeyDownList::up(const KeyCode& keyCode) { - // Если отжаты VK_SHIFT или VK_CONTROL, то сбросим удалим их из буфера - //if (keyCode == VK_SHIFT || keyCode == VK_CONTROL) - //{ - KeyList::iterator it = m_keyList.begin(); - while (it != m_keyList.end()) - { - if (*it == keyCode) - { - it = m_keyList.erase(it); - } - else - { - ++it; - } - } - //} + // Если отжаты VK_SHIFT или VK_CONTROL, то сбросим удалим их из буфера + //if (keyCode == VK_SHIFT || keyCode == VK_CONTROL) + //{ + KeyList::iterator it = m_keyList.begin(); + while (it != m_keyList.end()) + { + if (*it == keyCode) + { + it = m_keyList.erase(it); + } + else + { + ++it; + } + } + //} } bool RDOHotKey::KeyDownList::isPressed(const KeyCode& keyCode, bool shift, bool control) { - if (keyCode == 0) return false; - bool shift_found = false; - bool control_found = false; - // Найдем VK_SHIFT и/или VK_CONTROL в буфере - KeyList::iterator it = m_keyList.begin(); - while (it != m_keyList.end()) - { - if (*it == VK_SHIFT) - { - shift_found = true; - if (shift_found && control_found) break; - } - if (*it == VK_CONTROL) - { - control_found = true; - if (shift_found && control_found) break; - } - ++it; - } - // Теперь найдем саму клавишу в буфере - // Удалим её из буфера перед выходом - if (shift_found == shift && control_found == control) - { - KeyList::iterator it = m_keyList.begin(); - while (it != m_keyList.end()) - { - if (*it == keyCode) - { - m_keyList.erase(it); - m_keyFound = true; - return true; - } - ++it; - } - } - m_keyFound = false; - return false; + if (keyCode == 0) return false; + bool shift_found = false; + bool control_found = false; + // Найдем VK_SHIFT и/или VK_CONTROL в буфере + KeyList::iterator it = m_keyList.begin(); + while (it != m_keyList.end()) + { + if (*it == VK_SHIFT) + { + shift_found = true; + if (shift_found && control_found) break; + } + if (*it == VK_CONTROL) + { + control_found = true; + if (shift_found && control_found) break; + } + ++it; + } + // Теперь найдем саму клавишу в буфере + // Удалим её из буфера перед выходом + if (shift_found == shift && control_found == control) + { + KeyList::iterator it = m_keyList.begin(); + while (it != m_keyList.end()) + { + if (*it == keyCode) + { + m_keyList.erase(it); + m_keyFound = true; + return true; + } + ++it; + } + } + m_keyFound = false; + return false; } bool RDOHotKey::KeyDownList::isFound() const { - return m_keyFound; + return m_keyFound; } void RDOHotKey::KeyDownList::clear() { - m_keyList.clear(); + m_keyList.clear(); } // -------------------------------------------------------------------------------- @@ -223,31 +223,31 @@ void RDOHotKey::KeyDownList::clear() // -------------------------------------------------------------------------------- void RDOHotKey::AreaList::click(const std::string& areaName) { - if (boost::find(m_activeAreasMouseClicked, areaName) != m_activeAreasMouseClicked.end()) - return; + if (boost::find(m_activeAreasMouseClicked, areaName) != m_activeAreasMouseClicked.end()) + return; - m_activeAreasMouseClicked.push_back(areaName); + m_activeAreasMouseClicked.push_back(areaName); } bool RDOHotKey::AreaList::check(const std::string& areaName) { - NameList::iterator it = boost::find(m_activeAreasMouseClicked, areaName); - if (it == m_activeAreasMouseClicked.end()) - { - return false; - } - m_activeAreasMouseClicked.erase(it); - return true; + NameList::iterator it = boost::find(m_activeAreasMouseClicked, areaName); + if (it == m_activeAreasMouseClicked.end()) + { + return false; + } + m_activeAreasMouseClicked.erase(it); + return true; } bool RDOHotKey::AreaList::empty() const { - return m_activeAreasMouseClicked.empty(); + return m_activeAreasMouseClicked.empty(); } void RDOHotKey::AreaList::clear() { - m_activeAreasMouseClicked.clear(); + m_activeAreasMouseClicked.clear(); } // -------------------------------------------------------------------------------- @@ -261,33 +261,33 @@ RDOHotKey::~RDOHotKey() void RDOHotKey::clear() { - m_keyDown .clear(); - m_areaList.clear(); + m_keyDown .clear(); + m_areaList.clear(); } bool RDOHotKey::isKeyDown() const { - return m_keyDown.isFound() || !m_areaList.empty(); + return m_keyDown.isFound() || !m_areaList.empty(); } const RDOHotKey::Toolkit& RDOHotKey::toolkit() const { - return m_toolkit; + return m_toolkit; } RDOHotKey::KeyInModelList& RDOHotKey::keyInModel() { - return m_keyInModel; + return m_keyInModel; } RDOHotKey::KeyDownList& RDOHotKey::keyDown() { - return m_keyDown; + return m_keyDown; } RDOHotKey::AreaList& RDOHotKey::areaList() { - return m_areaList; + return m_areaList; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/hotkey.h b/simulator/runtime/hotkey.h index 151ca2b75..d74279174 100644 --- a/simulator/runtime/hotkey.h +++ b/simulator/runtime/hotkey.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_HOTKEY_H_ -#define _LIB_RUNTIME_HOTKEY_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM // ----------------------------------------------------------------------- INCLUDES @@ -12,147 +11,90 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Горячие клавиши class RDOHotKey { public: - typedef std::size_t KeyCode; + typedef std::size_t KeyCode; private: - typedef std::list KeyList; + typedef std::list KeyList; public: - static const std::size_t UNDEFINED_KEY = std::size_t(~0); - - //! Вспомогательный класс - class Toolkit - { - public: - //! Конструктор, заполняет таблицу клавиш - Toolkit(); - virtual ~Toolkit(); - - //! Переводит имя клавиши в код клавиши - //! @param keyName - имя клавиши - //! @result код клавиши в операционной системе - KeyCode codeFromString(const std::string& keyName) const; - - private: - typedef std::map KeySet; - KeySet m_keyList; - }; - - //! Используемые в моделе клавиши, список формируется в момент компиляции - class KeyInModelList - { - public: - //! Добавляет используемую в моделе клавишу - //! @param keyCode - код клавиши - //! @result true, если код добавлен успешно - bool insert(const KeyCode& keyCode); - - //! Проверяет наличие клавиши - //! @param keyCode - код клавиши - //! @result true, если код найден в списке - bool check(const KeyCode& keyCode) const; - - private: - KeyList m_keyList; - }; - - //! Список текущих нажатых клавиш - class KeyDownList - { - public: - KeyDownList(); - virtual ~KeyDownList(); - - //! Фиксирует нажатие клавиши - //! @param keyCode - код клавиши - //! @result true, если клавиша добавлена в список нажатых - bool down(const KeyCode& keyCode); - - //! Фиксирует отжатие клавиши - //! @param keyCode - код клавиши - void up(const KeyCode& keyCode); - - //! Проверяет, есть ли клавиша в списке нажатых - //! @param keyCode - код клавиши - //! @param shift - признак нажатого Shift'а - //! @param control - признак нажатого Ctrl'а - //! @result true, если клавиша есть в списке нажатых - bool isPressed(const KeyCode& keyCode, bool shift, bool control); - - //! Результат других методов - //! @result true, если \ref down или \ref isPressed вернули true в момент совего вызова - bool isFound() const; - - //! Очищает список текущих нажатых клавиш - void clear(); - - private: - KeyList m_keyList; - bool m_keyFound; - }; - - //! Обрабатывает клики мышкой на активные области, содержит только список текущих нажатых - class AreaList - { - public: - //! Фиксирует нажатие на область - //! @param areaName - имя области - void click(const std::string& areaName); - - //! Проверяет было ли нажатие на область - //! @param areaName - имя области - //! @result true, если было нажатие - bool check(const std::string& areaName); - - //! Проверяет было ли нажатие хотя бы на одну область - //! @result true, если было нажатие - bool empty() const; - - //! Очищает список - void clear(); - - private: - typedef std::list NameList; - NameList m_activeAreasMouseClicked; - }; - - RDOHotKey(); - virtual ~RDOHotKey(); - - //! Очищает нажатые клавиши и активные области - void clear(); - - //! Возвращает вспомогательный класс - //! @result вспомогательный класс - const Toolkit& toolkit() const; - - //! Возвращает используемые в моделе клавиши - //! @result используемые в моделе клавиши - KeyInModelList& keyInModel(); - - //! Возвращает список текущих нажатых клавиш - //! @result список текущих нажатых клавиш - KeyDownList& keyDown(); - - //! Возвращает список текущий нажатых активных областей - //! @result список текущий нажатых активных областей - AreaList& areaList(); - - //! Проверяет факт нажатия клавиши или выбора активной области - //! @result true, если была нажата клавиша или активная область - bool isKeyDown() const; + static const std::size_t UNDEFINED_KEY = std::size_t(~0); + + class Toolkit + { + public: + Toolkit(); + virtual ~Toolkit(); + + KeyCode codeFromString(const std::string& keyName) const; + + private: + typedef std::map KeySet; + KeySet m_keyList; + }; + + class KeyInModelList + { + public: + bool insert(const KeyCode& keyCode); + + bool check(const KeyCode& keyCode) const; + + private: + KeyList m_keyList; + }; + + class KeyDownList + { + public: + KeyDownList(); + virtual ~KeyDownList(); + + bool down(const KeyCode& keyCode); + void up(const KeyCode& keyCode); + + bool isPressed(const KeyCode& keyCode, bool shift, bool control); + bool isFound() const; + void clear(); + + private: + KeyList m_keyList; + bool m_keyFound; + }; + + class AreaList + { + public: + void click(const std::string& areaName); + + bool check(const std::string& areaName); + bool empty() const; + void clear(); + + private: + typedef std::list NameList; + NameList m_activeAreasMouseClicked; + }; + + RDOHotKey(); + virtual ~RDOHotKey(); + + void clear(); + + const Toolkit& toolkit() const; + KeyInModelList& keyInModel(); + KeyDownList& keyDown(); + AreaList& areaList(); + + bool isKeyDown() const; private: - Toolkit m_toolkit; - KeyInModelList m_keyInModel; - KeyDownList m_keyDown; - AreaList m_areaList; + Toolkit m_toolkit; + KeyInModelList m_keyInModel; + KeyDownList m_keyDown; + AreaList m_areaList; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_HOTKEY_H_ diff --git a/simulator/runtime/keyboard.h b/simulator/runtime/keyboard.h index 9e096e4ce..879b6a2b4 100644 --- a/simulator/runtime/keyboard.h +++ b/simulator/runtime/keyboard.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_KEYBOARD_REDEFINE_H_ -#define _LIB_RUNTIME_KEYBOARD_REDEFINE_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM #include "utils/src/common/platform.h" @@ -56,5 +55,3 @@ #define VK_NUMPAD9 0x69 #endif // not COMPILER_VISUAL_STUDIO - -#endif // _LIB_RUNTIME_KEYBOARD_REDEFINE_H_ diff --git a/simulator/runtime/mode.h b/simulator/runtime/mode.h index 7ef2e4df4..f1fe56972 100644 --- a/simulator/runtime/mode.h +++ b/simulator/runtime/mode.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_NAMESPACE_MODE_H_ -#define _LIB_RUNTIME_NAMESPACE_MODE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,16 +7,13 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Режимы моделирования -enum RunTimeMode +enum class RunTimeMode { - RTM_MaxSpeed, //!< Максимальная производительность - RTM_Jump, //!< Дискретная имитация - RTM_Sync, //!< Синхронная имитация - RTM_Pause, //!< Режим паузы - RTM_BreakPoint //!< Режим точки остановки + MAX_SPEED, + JUMP, + SYNC, + PAUSE, + BREAKPOINT }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_NAMESPACE_MODE_H_ diff --git a/simulator/runtime/namespace.h b/simulator/runtime/namespace.h index 95a80a477..254cbddf7 100644 --- a/simulator/runtime/namespace.h +++ b/simulator/runtime/namespace.h @@ -1,13 +1,8 @@ -#ifndef _LIB_RUNTIME_NAMESPACE_H_ -#define _LIB_RUNTIME_NAMESPACE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS // -------------------------------------------------------------------------------- -//! \namespace rdo::runtime -//! \brief Пространство имён рантайма #define OPEN_RDO_RUNTIME_NAMESPACE namespace rdo { namespace runtime { #define CLOSE_RDO_RUNTIME_NAMESPACE }}; - -#endif // _LIB_RUNTIME_NAMESPACE_H_ diff --git a/simulator/runtime/notify.cpp b/simulator/runtime/notify.cpp index d1450ed79..062937d21 100644 --- a/simulator/runtime/notify.cpp +++ b/simulator/runtime/notify.cpp @@ -11,55 +11,54 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- // -------------------- Notify // -------------------------------------------------------------------------------- -void Notify::connect(INotify* pTo, std::size_t message) +void Notify::connect(INotify* pTo, Message message) { - Connected::iterator it = m_connected.find(message); - while (it != m_connected.end()) - { - if (it->second == pTo) - break; - ++it; - } - if (it == m_connected.end()) - { - m_connected.insert(Connected::value_type(message, pTo)); - } + Connected::iterator it = m_connected.find(message); + while (it != m_connected.end()) + { + if (it->second == pTo) + break; + ++it; + } + + if (it == m_connected.end()) + m_connected.insert(Connected::value_type(message, pTo)); } void Notify::disconnect(Connected::iterator it, INotify* pTo) { - while (it != m_connected.end()) - { - if (it->second == pTo) - { - m_connected.erase(it++); - if (it == m_connected.end()) - { - break; - } - } - ++it; - } + while (it != m_connected.end()) + { + if (it->second == pTo) + { + m_connected.erase(it++); + if (it == m_connected.end()) + { + break; + } + } + ++it; + } } void Notify::disconnect(INotify* pTo) { - disconnect(m_connected.begin(), pTo); + disconnect(m_connected.begin(), pTo); } -void Notify::disconnect(INotify* pTo, std::size_t message) +void Notify::disconnect(INotify* pTo, Message message) { - disconnect(m_connected.find(message), pTo); + disconnect(m_connected.find(message), pTo); } -void Notify::fireMessage(std::size_t message, void* pParam) const +void Notify::fireMessage(Message message, void* pParam) const { - Connected::const_iterator it = m_connected.find(message); - while (it != m_connected.end()) - { - it->second->notify(message, pParam); - ++it; - } + Connected::const_iterator it = m_connected.find(message); + while (it != m_connected.end()) + { + it->second->notify(static_cast(message), pParam); + ++it; + } } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/notify.h b/simulator/runtime/notify.h index ab3c65a52..498cc64ff 100644 --- a/simulator/runtime/notify.h +++ b/simulator/runtime/notify.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_NOTIFY_H_ -#define _LIB_RUNTIME_NOTIFY_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM // ----------------------------------------------------------------------- INCLUDES @@ -11,28 +10,24 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Передача сообщений между объектами class Notify { public: - //! Типы сообщений - enum Type - { - RO_BEFOREDELETE = 0 - }; + enum class Message + { + BEFORE_DELETE = 0 + }; - void connect(INotify* pTo, std::size_t message); - void disconnect(INotify* pTo); - void disconnect(INotify* pTo, std::size_t message); - void fireMessage(std::size_t message, void* pParam) const; + void connect(INotify* pTo, Message message); + void disconnect(INotify* pTo); + void disconnect(INotify* pTo, Message message); + void fireMessage(Message message, void* pParam) const; private: - typedef std::multimap Connected; - Connected m_connected; + typedef std::multimap Connected; + Connected m_connected; - void disconnect(Connected::iterator it, INotify* pTo); + void disconnect(Connected::iterator it, INotify* pTo); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_NOTIFY_H_ diff --git a/simulator/runtime/notify_i.h b/simulator/runtime/notify_i.h index e7f4ac998..6da10d92d 100644 --- a/simulator/runtime/notify_i.h +++ b/simulator/runtime/notify_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_NOTIFY_I_H_ -#define _LIB_RUNTIME_NOTIFY_I_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM // ----------------------------------------------------------------------- INCLUDES @@ -7,13 +6,10 @@ #include "utils/src/smart_ptr/ref_counter/counter_reference.h" // -------------------------------------------------------------------------------- -//! Получения уведомлений по подписке class INotify: public virtual rdo::counter_reference { public: - virtual void notify(std::size_t message, void* pParam) = 0; + virtual void notify(std::size_t message, void* pParam) = 0; }; #define DECLARE_INotify \ - virtual void notify(std::size_t message, void* pParam); - -#endif // _LIB_RUNTIME_NOTIFY_I_H_ + virtual void notify(std::size_t message, void* pParam); diff --git a/simulator/runtime/pch/stdpch.h b/simulator/runtime/pch/stdpch.h index ead319b7d..01e4cdda5 100644 --- a/simulator/runtime/pch/stdpch.h +++ b/simulator/runtime/pch/stdpch.h @@ -2,16 +2,11 @@ #include "utils/src/common/platform.h" // ----------------------------------------------------------------------- INCLUDES #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable : 4786) - #ifndef WINVER // Allow use of features specific to Windows XP or later. - #define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. - #endif - - #ifdef RDO_MT - #include - #else - #include - #endif + #pragma warning(disable : 4786) + #ifndef WINVER // Allow use of features specific to Windows XP or later. + #define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. + #endif + #include #endif // COMPILER_VISUAL_STUDIO #include diff --git a/simulator/runtime/process/advance.cpp b/simulator/runtime/process/advance.cpp index ca49e0e4e..9811986f8 100644 --- a/simulator/runtime/process/advance.cpp +++ b/simulator/runtime/process/advance.cpp @@ -14,60 +14,60 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOPROCAdvance // -------------------------------------------------------------------------------- RDOPROCAdvance::RDOPROCAdvance(LPIPROCProcess process, const LPRDOCalc& _pDelayCalc) - : RDOPROCBlock(process ) - , pDelayCalc (_pDelayCalc) + : RDOPROCBlock(process ) + , pDelayCalc (_pDelayCalc) {} RDOPROCAdvance::LeaveTr::LeaveTr(const LPRDOPROCTransact& _transact, double _timeLeave) - : transact (_transact ) - , timeLeave(_timeLeave) + : transact (_transact ) + , timeLeave(_timeLeave) {} bool RDOPROCAdvance::onCheckCondition(const LPRDORuntime& pRuntime) { - if (!m_transacts.empty()) - { - return true; - } - else - { - if (!leave_list.empty()) - { - double tnow = pRuntime->getCurrentTime(); - std::list< LeaveTr >::iterator it = leave_list.begin(); - while (it != leave_list.end()) - { - if (tnow >= it->timeLeave) - { - return true; - } - ++it; - } - } - } - return false; + if (!m_transacts.empty()) + { + return true; + } + else + { + if (!leave_list.empty()) + { + double tnow = pRuntime->getCurrentTime(); + std::list< LeaveTr >::iterator it = leave_list.begin(); + while (it != leave_list.end()) + { + if (tnow >= it->timeLeave) + { + return true; + } + ++it; + } + } + } + return false; } -IBaseOperation::BOResult RDOPROCAdvance::onDoOperation(const LPRDORuntime& pRuntime) +IBaseOperation::ResultCode RDOPROCAdvance::onDoOperation(const LPRDORuntime& pRuntime) { - if (m_transacts.empty()) - return IBaseOperation::BOR_cant_run; + if (m_transacts.empty()) + return IBaseOperation::ResultCode::CANNOT_RUN; - // TRACE1("%7.1f ADVANCE BEGIN\n", pRuntime->getCurrentTime()); - double timeLeave = pDelayCalc->calcValue(pRuntime).getDouble() + pRuntime->getCurrentTime(); - leave_list.push_back(LeaveTr(m_transacts.front(), timeLeave)); - m_transacts.erase(m_transacts.begin()); + // TRACE1("%7.1f ADVANCE BEGIN\n", pRuntime->getCurrentTime()); + double timeLeave = pDelayCalc->calcValue(pRuntime).getDouble() + pRuntime->getCurrentTime(); + leave_list.push_back(LeaveTr(m_transacts.front(), timeLeave)); + m_transacts.erase(m_transacts.begin()); - pRuntime->addTimePoint( - timeLeave, - this, - boost::bind(&RDOPROCAdvance::onMakePlaned, this, pRuntime) - ); + pRuntime->addTimePoint( + timeLeave, + this, + boost::bind(&RDOPROCAdvance::onMakePlaned, this, pRuntime) + ); - if (m_pStatistics) - m_pStatistics->setTransCount(m_transacts.size()); + if (m_pStatistics) + m_pStatistics->setTransCount(m_transacts.size()); - return IBaseOperation::BOR_done; + return IBaseOperation::ResultCode::DONE; } void RDOPROCAdvance::onStart(const LPRDORuntime& /*pRuntime*/) @@ -78,34 +78,34 @@ void RDOPROCAdvance::onStop(const LPRDORuntime& /*pRuntime*/) void RDOPROCAdvance::onMakePlaned(const LPRDORuntime& pRuntime) { - if (leave_list.empty()) - return; - - double tnow = pRuntime->getCurrentTime(); - std::list::iterator it = leave_list.begin(); - while (it != leave_list.end()) - { - if (tnow >= it->timeLeave) - { - // TRACE1("%7.1f ADVANCE END\n", it->timeLeave); - it->transact->next(); - leave_list.erase(it++); - } - else - { - ++it; - } - } + if (leave_list.empty()) + return; + + double tnow = pRuntime->getCurrentTime(); + std::list::iterator it = leave_list.begin(); + while (it != leave_list.end()) + { + if (tnow >= it->timeLeave) + { + // TRACE1("%7.1f ADVANCE END\n", it->timeLeave); + it->transact->next(); + leave_list.erase(it++); + } + else + { + ++it; + } + } } -IBaseOperation::BOResult RDOPROCAdvance::onContinue(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOPROCAdvance::onContinue(const LPRDORuntime& /*pRuntime*/) { - return IBaseOperation::BOR_cant_run; + return IBaseOperation::ResultCode::CANNOT_RUN; } void RDOPROCAdvance::setStatistics(const rdo::runtime::LPIInternalStatistics& pStatistics) { - m_pStatistics = pStatistics; + m_pStatistics = pStatistics; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/process/advance.h b/simulator/runtime/process/advance.h index d66ca95bf..1b325f860 100644 --- a/simulator/runtime/process/advance.h +++ b/simulator/runtime/process/advance.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_PROCESS_ADVANCE_H_ -#define _LIB_RUNTIME_PROCESS_ADVANCE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -18,27 +17,25 @@ class RDOPROCAdvance: public RDOPROCBlock, public IInternalStatisticsManager { DECLARE_FACTORY(RDOPROCAdvance); protected: - LPRDOCalc pDelayCalc; + LPRDOCalc pDelayCalc; - struct LeaveTr - { - LPRDOPROCTransact transact; - double timeLeave; - LeaveTr(const LPRDOPROCTransact& _transact, double _timeLeave); - }; - std::list leave_list; + struct LeaveTr + { + LPRDOPROCTransact transact; + double timeLeave; + LeaveTr(const LPRDOPROCTransact& _transact, double _timeLeave); + }; + std::list leave_list; private: - RDOPROCAdvance(LPIPROCProcess process, const LPRDOCalc& _pDelayCalc); + RDOPROCAdvance(LPIPROCProcess process, const LPRDOCalc& _pDelayCalc); - LPIInternalStatistics m_pStatistics; + LPIInternalStatistics m_pStatistics; - void onMakePlaned(const LPRDORuntime& pRuntime); + void onMakePlaned(const LPRDORuntime& pRuntime); - DECLARE_IBaseOperation; - DECLARE_IInternalStatisticsManager; + DECLARE_IBaseOperation; + DECLARE_IInternalStatisticsManager; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_PROCESS_ADVANCE_H_ diff --git a/simulator/runtime/process/assign.cpp b/simulator/runtime/process/assign.cpp index 8eecfff19..b235c6b53 100644 --- a/simulator/runtime/process/assign.cpp +++ b/simulator/runtime/process/assign.cpp @@ -14,21 +14,21 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOPROCAssign // -------------------------------------------------------------------------------- RDOPROCAssign::RDOPROCAssign(LPIPROCProcess pProcess, const LPRDOCalc& pCalc) - : RDOPROCBlock(pProcess) - , pAssignCalc (pCalc ) + : RDOPROCBlock(pProcess) + , pAssignCalc (pCalc ) {} bool RDOPROCAssign::onCheckCondition(const LPRDORuntime& /*pRuntime*/) { - return !m_transacts.empty(); + return !m_transacts.empty(); } -IBaseOperation::BOResult RDOPROCAssign::onDoOperation(const LPRDORuntime& pRuntime) +IBaseOperation::ResultCode RDOPROCAssign::onDoOperation(const LPRDORuntime& pRuntime) { - pAssignCalc->calcValue(pRuntime); - TRACE1("%7.1f ASSIGN\n", pRuntime->getCurrentTime()); - m_transacts.front()->next(); - return IBaseOperation::BOR_done; + pAssignCalc->calcValue(pRuntime); + TRACE1("%7.1f ASSIGN\n", pRuntime->getCurrentTime()); + m_transacts.front()->next(); + return IBaseOperation::ResultCode::DONE; } void RDOPROCAssign::onStart(const LPRDORuntime& /*pRuntime*/) @@ -37,9 +37,9 @@ void RDOPROCAssign::onStart(const LPRDORuntime& /*pRuntime*/) void RDOPROCAssign::onStop(const LPRDORuntime& /*pRuntime*/) {} -IBaseOperation::BOResult RDOPROCAssign::onContinue(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOPROCAssign::onContinue(const LPRDORuntime& /*pRuntime*/) { - return IBaseOperation::BOR_cant_run; + return IBaseOperation::ResultCode::CANNOT_RUN; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/process/assign.h b/simulator/runtime/process/assign.h index aa0907838..2b303e76a 100644 --- a/simulator/runtime/process/assign.h +++ b/simulator/runtime/process/assign.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_PROCESS_ASSIGN_H_ -#define _LIB_RUNTIME_PROCESS_ASSIGN_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -19,13 +18,11 @@ class RDOPROCAssign: public RDOPROCBlock { DECLARE_FACTORY(RDOPROCAssign); private: - RDOPROCAssign(LPIPROCProcess pProcess, const LPRDOCalc& pCalc); + RDOPROCAssign(LPIPROCProcess pProcess, const LPRDOCalc& pCalc); - LPRDOCalc pAssignCalc; + LPRDOCalc pAssignCalc; - DECLARE_IBaseOperation; + DECLARE_IBaseOperation; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_PROCESS_ASSIGN_H_ diff --git a/simulator/runtime/process/generate.cpp b/simulator/runtime/process/generate.cpp index 0165e08fb..d918fa76e 100644 --- a/simulator/runtime/process/generate.cpp +++ b/simulator/runtime/process/generate.cpp @@ -13,42 +13,42 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOPROCGenerate // -------------------------------------------------------------------------------- RDOPROCGenerate::RDOPROCGenerate(LPIPROCProcess process, const LPRDOCalc& pTime, const LPRDOCalc& pCreateAndGoOnTransactCalc, boost::optional maxCreateTransactCount) - : RDOPROCBlock (process ) - , timeNext (0.0 ) - , m_pTimeCalc (pTime ) - , m_pCreateAndGoOnTransactCalc(pCreateAndGoOnTransactCalc) - , m_maxCreateTransactCount (maxCreateTransactCount ) - , m_createdTransactCount (0 ) + : RDOPROCBlock (process ) + , timeNext (0.0 ) + , m_pTimeCalc (pTime ) + , m_pCreateAndGoOnTransactCalc(pCreateAndGoOnTransactCalc) + , m_maxCreateTransactCount (maxCreateTransactCount ) + , m_createdTransactCount (0 ) {} void RDOPROCGenerate::onStart(const LPRDORuntime& pRuntime) { - calcNextTimeInterval(pRuntime); + calcNextTimeInterval(pRuntime); } bool RDOPROCGenerate::onCheckCondition(const LPRDORuntime& pRuntime) { - if (m_maxCreateTransactCount && m_createdTransactCount >= m_maxCreateTransactCount.get()) - { - return false; - } + if (m_maxCreateTransactCount && m_createdTransactCount >= m_maxCreateTransactCount.get()) + { + return false; + } - return pRuntime->getCurrentTime() >= timeNext ? true : false; + return pRuntime->getCurrentTime() >= timeNext ? true : false; } -IBaseOperation::BOResult RDOPROCGenerate::onDoOperation(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOPROCGenerate::onDoOperation(const LPRDORuntime& /*pRuntime*/) { - return IBaseOperation::BOR_done; + return IBaseOperation::ResultCode::DONE; } void RDOPROCGenerate::calcNextTimeInterval(const LPRDORuntime& pRuntime) { - timeNext = m_pTimeCalc->calcValue(pRuntime).getDouble() + pRuntime->getCurrentTime(); - pRuntime->addTimePoint( - timeNext, - this, - boost::bind(&RDOPROCGenerate::onMakePlaned, this, pRuntime) - ); + timeNext = m_pTimeCalc->calcValue(pRuntime).getDouble() + pRuntime->getCurrentTime(); + pRuntime->addTimePoint( + timeNext, + this, + boost::bind(&RDOPROCGenerate::onMakePlaned, this, pRuntime) + ); } void RDOPROCGenerate::onStop(const LPRDORuntime& /*pRuntime*/) @@ -56,35 +56,35 @@ void RDOPROCGenerate::onStop(const LPRDORuntime& /*pRuntime*/) void RDOPROCGenerate::onMakePlaned(const LPRDORuntime& pRuntime) { - ++m_createdTransactCount; + ++m_createdTransactCount; - if (m_pStatistics) - m_pStatistics->setTransCount(m_createdTransactCount); + if (m_pStatistics) + m_pStatistics->setTransCount(m_createdTransactCount); - LPRDOPROCTransact pTransact = m_pCreateAndGoOnTransactCalc->calcValue(pRuntime). - getPointerByType(); - ASSERT(pTransact); + LPRDOPROCTransact pTransact = m_pCreateAndGoOnTransactCalc->calcValue(pRuntime). + getPointerByType(); + ASSERT(pTransact); - pTransact->setBlock(this); - pTransact->next(); + pTransact->setBlock(this); + pTransact->next(); - RDOTrace* tracer = pRuntime->getTracer(); - if (!tracer->isNull()) - { - tracer->getOStream() << pTransact->traceResourceState('\0', pRuntime) << tracer->getEOL(); - } + RDOTrace* tracer = pRuntime->getTracer(); + if (!tracer->isNull()) + { + tracer->getOStream() << pTransact->traceResourceState('\0', pRuntime) << tracer->getEOL(); + } - calcNextTimeInterval(pRuntime); + calcNextTimeInterval(pRuntime); } -IBaseOperation::BOResult RDOPROCGenerate::onContinue(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOPROCGenerate::onContinue(const LPRDORuntime& /*pRuntime*/) { - return IBaseOperation::BOR_cant_run; + return IBaseOperation::ResultCode::CANNOT_RUN; } void RDOPROCGenerate::setStatistics(const LPIInternalStatistics& pStatistics) { - m_pStatistics = pStatistics; + m_pStatistics = pStatistics; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/process/generate.h b/simulator/runtime/process/generate.h index c0a824677..da6ecd63b 100644 --- a/simulator/runtime/process/generate.h +++ b/simulator/runtime/process/generate.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_PROCESS_GENERATE_H_ -#define _LIB_RUNTIME_PROCESS_GENERATE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -17,13 +16,13 @@ struct IInternalStatistics: public rdo::RefCounter { DECLARE_FACTORY(IInternalStatistics) public: - virtual void setTransCount(std::size_t count) = 0; + virtual void setTransCount(std::size_t count) = 0; protected: - IInternalStatistics() - {} - virtual ~IInternalStatistics() - {} + IInternalStatistics() + {} + virtual ~IInternalStatistics() + {} }; CLOSE_RDO_RUNTIME_NAMESPACE @@ -32,18 +31,18 @@ class IInternalStatisticsManager: public virtual rdo::counter_reference { DECLARE_FACTORY(IInternalStatisticsManager) public: - virtual void setStatistics(const rdo::runtime::LPIInternalStatistics& pStatistics) = 0; + virtual void setStatistics(const rdo::runtime::LPIInternalStatistics& pStatistics) = 0; protected: - IInternalStatisticsManager() - {} - virtual ~IInternalStatisticsManager() - {} + IInternalStatisticsManager() + {} + virtual ~IInternalStatisticsManager() + {} }; DECLARE_POINTER(IInternalStatisticsManager) #define DECLARE_IInternalStatisticsManager \ - virtual void setStatistics(const rdo::runtime::LPIInternalStatistics& pStatistics); + virtual void setStatistics(const rdo::runtime::LPIInternalStatistics& pStatistics); OPEN_RDO_RUNTIME_NAMESPACE @@ -51,24 +50,22 @@ class RDOPROCGenerate: public RDOPROCBlock, public IInternalStatisticsManager { DECLARE_FACTORY(RDOPROCGenerate); public: - void calcNextTimeInterval(const LPRDORuntime& pRuntime); + void calcNextTimeInterval(const LPRDORuntime& pRuntime); private: - RDOPROCGenerate(LPIPROCProcess process, const LPRDOCalc& pTime, const LPRDOCalc& pCreateAndGoOnTransactCalc, boost::optional maxCreateTransactCount = boost::optional()); + RDOPROCGenerate(LPIPROCProcess process, const LPRDOCalc& pTime, const LPRDOCalc& pCreateAndGoOnTransactCalc, boost::optional maxCreateTransactCount = boost::optional()); - double timeNext; - LPRDOCalc m_pTimeCalc; - LPRDOCalc m_pCreateAndGoOnTransactCalc; - boost::optional m_maxCreateTransactCount; - std::size_t m_createdTransactCount; - LPIInternalStatistics m_pStatistics; + double timeNext; + LPRDOCalc m_pTimeCalc; + LPRDOCalc m_pCreateAndGoOnTransactCalc; + boost::optional m_maxCreateTransactCount; + std::size_t m_createdTransactCount; + LPIInternalStatistics m_pStatistics; - void onMakePlaned(const LPRDORuntime& pRuntime); + void onMakePlaned(const LPRDORuntime& pRuntime); - DECLARE_IBaseOperation; - DECLARE_IInternalStatisticsManager; + DECLARE_IBaseOperation; + DECLARE_IInternalStatisticsManager; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_PROCESS_GENERATE_H_ diff --git a/simulator/runtime/process/queue_depart.cpp b/simulator/runtime/process/queue_depart.cpp index 095cddd88..a60229060 100644 --- a/simulator/runtime/process/queue_depart.cpp +++ b/simulator/runtime/process/queue_depart.cpp @@ -13,120 +13,120 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOPROCBlockForQueue // -------------------------------------------------------------------------------- RDOPROCBlockForQueue::RDOPROCBlockForQueue(LPIPROCProcess process, parser_for_Queue From_Par) - : RDOPROCBlock(process ) - , fromParser (From_Par) + : RDOPROCBlock(process ) + , fromParser (From_Par) {} void RDOPROCBlockForQueue::_onStart(const LPRDORuntime& pRuntime) { - int Id_res = fromParser.Id_res; - int Id_param = fromParser.Id_param; - LPRDOResource res = pRuntime->getResourceByID(Id_res); - forRes.Id_param = Id_param; - forRes.rss = res.object_static_cast(); - forRes.defaultValue = RDOValue(RDOPROCQueue::getDefaultValue()); + int Id_res = fromParser.Id_res; + int Id_param = fromParser.Id_param; + LPRDOResource res = pRuntime->getResourceByID(Id_res); + forRes.Id_param = Id_param; + forRes.rss = res.object_static_cast(); + forRes.defaultValue = RDOValue(RDOPROCQueue::getDefaultValue()); } // -------------------------------------------------------------------------------- // -------------------- RDOPROCQueue // -------------------------------------------------------------------------------- RDOPROCQueue::RDOPROCQueue(LPIPROCProcess process, parser_for_Queue From_Par) - : RDOPROCBlockForQueue(process, From_Par) + : RDOPROCBlockForQueue(process, From_Par) {} std::size_t RDOPROCQueue::getDefaultValue() { - return 0; + return 0; } std::string RDOPROCQueue::getQueueParamName() { - return "длина_очереди"; + return "длина_очереди"; } void RDOPROCQueue::onStart(const LPRDORuntime& pRuntime) { - _onStart(pRuntime); + _onStart(pRuntime); } bool RDOPROCQueue::onCheckCondition(const LPRDORuntime& /*pRuntime*/) { - if (!m_transacts.empty()) - { - RDOValue i = forRes.rss->getParam(forRes.Id_param); - RDOValue j = RDOValue(int (1)); - forRes.rss->setParam(forRes.Id_param, i + j); - return true; - } - else - { - return false; - } + if (!m_transacts.empty()) + { + RDOValue i = forRes.rss->getParam(forRes.Id_param); + RDOValue j = RDOValue(int (1)); + forRes.rss->setParam(forRes.Id_param, i + j); + return true; + } + else + { + return false; + } } -IBaseOperation::BOResult RDOPROCQueue::onDoOperation(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOPROCQueue::onDoOperation(const LPRDORuntime& /*pRuntime*/) { - m_transacts.front()->next(); - return IBaseOperation::BOR_done; + m_transacts.front()->next(); + return IBaseOperation::ResultCode::DONE; } void RDOPROCQueue::onStop (const LPRDORuntime& /*pRuntime*/) {} -IBaseOperation::BOResult RDOPROCQueue::onContinue(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOPROCQueue::onContinue(const LPRDORuntime& /*pRuntime*/) { - return IBaseOperation::BOR_cant_run; + return IBaseOperation::ResultCode::CANNOT_RUN; } // -------------------------------------------------------------------------------- // -------------------- RDOPROCDepart // -------------------------------------------------------------------------------- RDOPROCDepart::RDOPROCDepart(LPIPROCProcess process, parser_for_Queue From_Par) - : RDOPROCBlockForQueue(process, From_Par) + : RDOPROCBlockForQueue(process, From_Par) {} std::size_t RDOPROCDepart::getDefaultValue() { - return 0; + return 0; } std::string RDOPROCDepart::getDepartParamName() { - return "длина_очереди"; + return "длина_очереди"; } void RDOPROCDepart::onStart(const LPRDORuntime& pRuntime) { - _onStart(pRuntime); + _onStart(pRuntime); } bool RDOPROCDepart::onCheckCondition(const LPRDORuntime& /*pRuntime*/) { - if (!m_transacts.empty()) - { - RDOValue i = forRes.rss->getParam(forRes.Id_param); - RDOValue j = RDOValue(int (1)); - forRes.rss->setParam(forRes.Id_param, i - j); - return true; - } - else - { - return false; - } + if (!m_transacts.empty()) + { + RDOValue i = forRes.rss->getParam(forRes.Id_param); + RDOValue j = RDOValue(int (1)); + forRes.rss->setParam(forRes.Id_param, i - j); + return true; + } + else + { + return false; + } } -IBaseOperation::BOResult RDOPROCDepart::onDoOperation(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOPROCDepart::onDoOperation(const LPRDORuntime& /*pRuntime*/) { - m_transacts.front()->next(); - return IBaseOperation::BOR_done; + m_transacts.front()->next(); + return IBaseOperation::ResultCode::DONE; } void RDOPROCDepart::onStop(const LPRDORuntime& /*pRuntime*/) {} -IBaseOperation::BOResult RDOPROCDepart::onContinue(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOPROCDepart::onContinue(const LPRDORuntime& /*pRuntime*/) { - return IBaseOperation::BOR_cant_run; + return IBaseOperation::ResultCode::CANNOT_RUN; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/process/queue_depart.h b/simulator/runtime/process/queue_depart.h index 79f747396..f27b5a65b 100644 --- a/simulator/runtime/process/queue_depart.h +++ b/simulator/runtime/process/queue_depart.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_PROCESS_QUEUE_DEPART_H_ -#define _LIB_RUNTIME_PROCESS_QUEUE_DEPART_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -15,53 +14,51 @@ OPEN_RDO_RUNTIME_NAMESPACE struct runtime_for_Queue { - LPRDOResource rss; - int Id_param; - RDOValue defaultValue; + LPRDOResource rss; + int Id_param; + RDOValue defaultValue; }; struct parser_for_Queue { - int Id_res; - int Id_param; + int Id_res; + int Id_param; }; class RDOPROCBlockForQueue: public RDOPROCBlock { protected: - RDOPROCBlockForQueue(LPIPROCProcess process, parser_for_Queue From_Par); + RDOPROCBlockForQueue(LPIPROCProcess process, parser_for_Queue From_Par); - parser_for_Queue fromParser; - runtime_for_Queue forRes; - void _onStart(const LPRDORuntime& pRuntime); + parser_for_Queue fromParser; + runtime_for_Queue forRes; + void _onStart(const LPRDORuntime& pRuntime); }; class RDOPROCQueue: public RDOPROCBlockForQueue { DECLARE_FACTORY(RDOPROCQueue); public: - static std::size_t getDefaultValue(); - static std::string getQueueParamName(); + static std::size_t getDefaultValue(); + static std::string getQueueParamName(); private: - RDOPROCQueue(LPIPROCProcess process, parser_for_Queue From_Par); + RDOPROCQueue(LPIPROCProcess process, parser_for_Queue From_Par); - DECLARE_IBaseOperation; + DECLARE_IBaseOperation; }; class RDOPROCDepart: public RDOPROCBlockForQueue { DECLARE_FACTORY(RDOPROCDepart); public: - static std::size_t getDefaultValue(); - static std::string getDepartParamName(); + static std::size_t getDefaultValue(); + static std::string getDepartParamName(); private: - RDOPROCDepart(LPIPROCProcess process, parser_for_Queue From_Par); + RDOPROCDepart(LPIPROCProcess process, parser_for_Queue From_Par); - DECLARE_IBaseOperation; + DECLARE_IBaseOperation; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_PROCESS_QUEUE_DEPART_H_ diff --git a/simulator/runtime/process/rdoprocess.cpp b/simulator/runtime/process/rdoprocess.cpp index 514010548..235b704ab 100644 --- a/simulator/runtime/process/rdoprocess.cpp +++ b/simulator/runtime/process/rdoprocess.cpp @@ -13,10 +13,10 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOPROCBlock // -------------------------------------------------------------------------------- RDOPROCBlock::RDOPROCBlock(LPIPROCProcess pProcess) - : m_process(pProcess) + : m_process(pProcess) { - LPIBaseOperation pThis(this); - m_process.object_dynamic_cast()->append(pThis); + LPIBaseOperation pThis(this); + m_process.object_dynamic_cast()->append(pThis); } RDOPROCBlock::~RDOPROCBlock() @@ -24,120 +24,120 @@ RDOPROCBlock::~RDOPROCBlock() RDOPROCBlock::TransactIt RDOPROCBlock::transactFind(const LPTransact& pTransact) { - return std::find(m_transacts.begin(), m_transacts.end(), pTransact); + return std::find(m_transacts.begin(), m_transacts.end(), pTransact); } RDOPROCBlock::TransactIt RDOPROCBlock::transactEnd() { - return m_transacts.end(); + return m_transacts.end(); } void RDOPROCBlock::transactGoIn(const LPTransact& pTransact) { - m_transacts.push_back(pTransact); + m_transacts.push_back(pTransact); } void RDOPROCBlock::transactGoOut(const LPTransact& pTransact) { - m_transacts.remove(pTransact); + m_transacts.remove(pTransact); } LPIPROCProcess RDOPROCBlock::getProcess() const { - return m_process; + return m_process; } // -------------------------------------------------------------------------------- // -------------------- RDOPROCProcess // -------------------------------------------------------------------------------- RDOPROCProcess::RDOPROCProcess(const std::string& name, const LPRDORuntime& pRuntime) - : RDOLogicSimple(pRuntime, NULL) - , m_name (name ) + : RDOLogicSimple(pRuntime, NULL) + , m_name (name ) {} void RDOPROCProcess::insertChild(LPIPROCProcess pProcess) { - if (pProcess) - { - m_child.push_back(pProcess); - pProcess->setParent(this); - } + if (pProcess) + { + m_child.push_back(pProcess); + pProcess->setParent(this); + } } void RDOPROCProcess::setParent(LPIPROCProcess pProcess) { - m_parent = pProcess; + m_parent = pProcess; } LPIResourceType RDOPROCProcess::getTranType() const { - return m_pTransactType; + return m_pTransactType; } void RDOPROCProcess::next(const LPRDOPROCTransact& pTransact) { - if (pTransact->getBlock()) - { - Iterator it = std::find(begin(), end(), pTransact->getBlock()); - // Если у транзакта есть блок - if (it != end()) - { - // Берем этот блок - LPIPROCBlock block = it->object_dynamic_cast(); - ASSERT(block); - // Находим перемещаемый транзакт в списке его транзактов - RDOPROCBlock::TransactIt it_res = block->transactFind(pTransact); - // Если транзакт найден - // @warning только что созданный транзакт не привязывается к блоку GENERATE!!! - if (it_res != block->transactEnd()) - { - // Удаляем его из списка транзактов этого блока - block->transactGoOut(*it_res); - } - else - { - // Скорее всего здесь не будет ошибки, поскольку advance удаляет транзакты из себя - // getRuntime()->error( "Внутренняя ошибка: неучтенный транзакт (транзакт потерял свой блок)" ); - } - // Переходим к следующему блоку - ++it; - // Если следующий блок существует - if (it != end()) - { - // Берем этот блок - block = it->object_dynamic_cast(); - ASSERT(block); - pTransact->setBlock(block); - // Записываем в конец списка этого блока перемещаемый транзакт - block->transactGoIn(pTransact); - } - // Блок в из которого нужно было переместить транзакт был последним - else - { - //---------Вход в этот блок означает, что it-1 = последний блок для транзакта, - //---------в этом случае правильно будет удалить этот транзакт????????? - //getRuntime()->error( "Некуда перемещать транзакт, блок в котором он был - последний" ); - } - } - else - { - //getRuntime()->error( "Не существует такого блока, к которому привязан транзакт" ); - } - } - else - { - //getRuntime()->error( "К транзакту не привязан никакой блок" ); - } + if (pTransact->getBlock()) + { + Iterator it = std::find(begin(), end(), pTransact->getBlock()); + // Если у транзакта есть блок + if (it != end()) + { + // Берем этот блок + LPIPROCBlock block = it->object_dynamic_cast(); + ASSERT(block); + // Находим перемещаемый транзакт в списке его транзактов + RDOPROCBlock::TransactIt it_res = block->transactFind(pTransact); + // Если транзакт найден + // @warning только что созданный транзакт не привязывается к блоку GENERATE!!! + if (it_res != block->transactEnd()) + { + // Удаляем его из списка транзактов этого блока + block->transactGoOut(*it_res); + } + else + { + // Скорее всего здесь не будет ошибки, поскольку advance удаляет транзакты из себя + // getRuntime()->error( "Внутренняя ошибка: неучтенный транзакт (транзакт потерял свой блок)" ); + } + // Переходим к следующему блоку + ++it; + // Если следующий блок существует + if (it != end()) + { + // Берем этот блок + block = it->object_dynamic_cast(); + ASSERT(block); + pTransact->setBlock(block); + // Записываем в конец списка этого блока перемещаемый транзакт + block->transactGoIn(pTransact); + } + // Блок в из которого нужно было переместить транзакт был последним + else + { + //---------Вход в этот блок означает, что it-1 = последний блок для транзакта, + //---------в этом случае правильно будет удалить этот транзакт????????? + //getRuntime()->error( "Некуда перемещать транзакт, блок в котором он был - последний" ); + } + } + else + { + //getRuntime()->error( "Не существует такого блока, к которому привязан транзакт" ); + } + } + else + { + //getRuntime()->error( "К транзакту не привязан никакой блок" ); + } } // -------------------------------------------------------------------------------- // -------------------- RDOPROCTransact // -------------------------------------------------------------------------------- RDOPROCTransact::RDOPROCTransact(const LPRDORuntime& pRuntime, const std::vector& paramsCalcs, LPIResourceType pResType, std::size_t resID, std::size_t typeID, bool trace, bool temporary) - : RDOResource(pRuntime, paramsCalcs, pResType, resID, typeID, trace, temporary) + : RDOResource(pRuntime, paramsCalcs, pResType, resID, typeID, trace, temporary) { - m_state = RDOResource::CS_Create; - m_paramList.push_back(pRuntime->getCurrentTime()); + m_state = RDOResource::ConvertStatus::CREATE; + m_paramList.push_back(pRuntime->getCurrentTime()); } RDOPROCTransact::~RDOPROCTransact() @@ -145,41 +145,41 @@ RDOPROCTransact::~RDOPROCTransact() LPRDOPROCResource RDOPROCTransact::getRes() { - return m_res; + return m_res; } void RDOPROCTransact::setRes(const LPRDOPROCResource& pResource) { - m_res = pResource; + m_res = pResource; } LPIPROCBlock& RDOPROCTransact::getBlock() { - return m_block; + return m_block; } void RDOPROCTransact::setBlock(const LPIPROCBlock& block) { - m_block = block; + m_block = block; } LPRDOResource RDOPROCTransact::clone(const LPRDORuntime& pRuntime) const { - LPRDOResource pResource = rdo::Factory::create(pRuntime, getParamList(), getResType(), getTraceID(), getType(), traceable(), m_temporary); - ASSERT(pResource); - return pResource; + LPRDOResource pResource = rdo::Factory::create(pRuntime, getParamList(), getResType(), getTraceID(), getType(), traceable(), m_temporary); + ASSERT(pResource); + return pResource; } void RDOPROCTransact::next() { - m_block->getProcess()->next(this); + m_block->getProcess()->next(this); } // -------------------------------------------------------------------------------- // -------------------- RDOPROCResource // -------------------------------------------------------------------------------- RDOPROCResource::RDOPROCResource(const LPRDORuntime& pRuntime, const std::vector& paramsCalcs, LPIResourceType pResType, std::size_t resID, std::size_t typeID, bool trace, bool temporary) - : RDOResource(pRuntime, paramsCalcs, pResType, resID, typeID, trace, temporary) + : RDOResource(pRuntime, paramsCalcs, pResType, resID, typeID, trace, temporary) {} RDOPROCResource::~RDOPROCResource() @@ -187,14 +187,14 @@ RDOPROCResource::~RDOPROCResource() std::string RDOPROCResource::whoAreYou() { - return "procRes"; + return "procRes"; } LPRDOResource RDOPROCResource::clone(const LPRDORuntime& pRuntime) const { - LPRDOResource pResource = rdo::Factory::create(pRuntime, getParamList(), getResType(), getTraceID(), getType(), traceable(), m_temporary); - ASSERT(pResource); - return pResource; + LPRDOResource pResource = rdo::Factory::create(pRuntime, getParamList(), getResType(), getTraceID(), getType(), traceable(), m_temporary); + ASSERT(pResource); + return pResource; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/process/rdoprocess.h b/simulator/runtime/process/rdoprocess.h index 81b9c6bde..07fce5c31 100644 --- a/simulator/runtime/process/rdoprocess.h +++ b/simulator/runtime/process/rdoprocess.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_PROCESS_H_ -#define _LIB_RUNTIME_PROCESS_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -22,13 +21,13 @@ friend class RDOPROCProcess; friend class RDOPROCResource; protected: - LPIPROCProcess m_process; - TransactList m_transacts; + LPIPROCProcess m_process; + TransactList m_transacts; - RDOPROCBlock(LPIPROCProcess process); - virtual ~RDOPROCBlock(); + RDOPROCBlock(LPIPROCProcess process); + virtual ~RDOPROCBlock(); - DECLARE_IPROCBlock; + DECLARE_IPROCBlock; }; class RDOPROCProcess: public RDOLogicSimple, public IPROCProcess, public RDOPatternPrior @@ -37,16 +36,16 @@ DECLARE_FACTORY(RDOPROCProcess) friend class RDOPROCBlock; public: - DECLARE_IPROCProcess; + DECLARE_IPROCProcess; protected: - std::string m_name; - LPIPROCProcess m_parent; - std::list m_child; + std::string m_name; + LPIPROCProcess m_parent; + std::list m_child; private: - RDOPROCProcess(const std::string& _name, const LPRDORuntime& pRuntime); - LPIResourceType m_pTransactType; + RDOPROCProcess(const std::string& _name, const LPRDORuntime& pRuntime); + LPIResourceType m_pTransactType; }; PREDECLARE_POINTER(RDOPROCResource); @@ -55,20 +54,20 @@ class RDOPROCTransact: public RDOResource { DECLARE_FACTORY(RDOPROCTransact); public: - LPRDOPROCResource getRes(); - void setRes(const LPRDOPROCResource& pResource); - LPIPROCBlock& getBlock(); - void setBlock(const LPIPROCBlock& block); + LPRDOPROCResource getRes(); + void setRes(const LPRDOPROCResource& pResource); + LPIPROCBlock& getBlock(); + void setBlock(const LPIPROCBlock& block); - void next(); - virtual LPRDOResource clone(const LPRDORuntime& pRuntime) const; + void next(); + virtual LPRDOResource clone(const LPRDORuntime& pRuntime) const; private: - RDOPROCTransact(const LPRDORuntime& pRuntime, const std::vector& paramsCalcs, LPIResourceType pResType, std::size_t resID, std::size_t typeID, bool trace, bool permanentFlag); - virtual ~RDOPROCTransact(); + RDOPROCTransact(const LPRDORuntime& pRuntime, const std::vector& paramsCalcs, LPIResourceType pResType, std::size_t resID, std::size_t typeID, bool trace, bool permanentFlag); + virtual ~RDOPROCTransact(); - LPIPROCBlock m_block; - LPRDOPROCResource m_res; + LPIPROCBlock m_block; + LPRDOPROCResource m_res; }; class RDOPROCResource: public RDOResource @@ -78,17 +77,15 @@ friend class RDOPROCSeize; friend class RDOPROCRelease; public: - std::string whoAreYou(); - virtual LPRDOResource clone(const LPRDORuntime& pRuntime) const; + std::string whoAreYou(); + virtual LPRDOResource clone(const LPRDORuntime& pRuntime) const; protected: - std::list transacts; + std::list transacts; private: - RDOPROCResource(const LPRDORuntime& pRuntime, const std::vector& paramsCalcs, LPIResourceType pResType, std::size_t resID, std::size_t typeID, bool trace, bool permanentFlag); - virtual ~RDOPROCResource(); + RDOPROCResource(const LPRDORuntime& pRuntime, const std::vector& paramsCalcs, LPIResourceType pResType, std::size_t resID, std::size_t typeID, bool trace, bool permanentFlag); + virtual ~RDOPROCResource(); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_PROCESS_H_ diff --git a/simulator/runtime/process/rdoprocess_i.h b/simulator/runtime/process/rdoprocess_i.h index d0719eac1..e0aeb4f80 100644 --- a/simulator/runtime/process/rdoprocess_i.h +++ b/simulator/runtime/process/rdoprocess_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_PROCESS_I_H_ -#define _LIB_RUNTIME_PROCESS_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -15,38 +14,36 @@ PREDECLARE_POINTER(IPROCProcess) class IPROCBlock: public virtual rdo::counter_reference { public: - typedef rdo::runtime::LPRDOPROCTransact LPTransact; - typedef std::list TransactList; - typedef TransactList::iterator TransactIt; - - virtual TransactIt transactFind (const LPTransact& pTransact) = 0; - virtual TransactIt transactEnd () = 0; - virtual void transactGoIn (const LPTransact& pTransact) = 0; - virtual void transactGoOut(const LPTransact& pTransact) = 0; - virtual LPIPROCProcess getProcess () const = 0; + typedef rdo::runtime::LPRDOPROCTransact LPTransact; + typedef std::list TransactList; + typedef TransactList::iterator TransactIt; + + virtual TransactIt transactFind (const LPTransact& pTransact) = 0; + virtual TransactIt transactEnd () = 0; + virtual void transactGoIn (const LPTransact& pTransact) = 0; + virtual void transactGoOut(const LPTransact& pTransact) = 0; + virtual LPIPROCProcess getProcess () const = 0; }; DECLARE_POINTER(IPROCBlock) #define DECLARE_IPROCBlock \ - virtual TransactIt transactFind (const LPTransact& pTransact); \ - virtual TransactIt transactEnd (); \ - virtual void transactGoIn (const LPTransact& pTransact); \ - virtual void transactGoOut(const LPTransact& pTransact); \ - virtual LPIPROCProcess getProcess () const; + virtual TransactIt transactFind (const LPTransact& pTransact); \ + virtual TransactIt transactEnd (); \ + virtual void transactGoIn (const LPTransact& pTransact); \ + virtual void transactGoOut(const LPTransact& pTransact); \ + virtual LPIPROCProcess getProcess () const; class IPROCProcess: public virtual rdo::counter_reference { public: - virtual void insertChild(LPIPROCProcess pProcess ) = 0; - virtual void setParent (LPIPROCProcess pProcess ) = 0; - virtual void next (const rdo::runtime::LPRDOPROCTransact& pTransact) = 0; - virtual rdo::runtime::LPIResourceType getTranType() const = 0; + virtual void insertChild(LPIPROCProcess pProcess ) = 0; + virtual void setParent (LPIPROCProcess pProcess ) = 0; + virtual void next (const rdo::runtime::LPRDOPROCTransact& pTransact) = 0; + virtual rdo::runtime::LPIResourceType getTranType() const = 0; }; #define DECLARE_IPROCProcess \ - virtual void insertChild(LPIPROCProcess pProcess ); \ - virtual void setParent (LPIPROCProcess pProcess ); \ - virtual void next (const rdo::runtime::LPRDOPROCTransact& pTransact); \ - virtual rdo::runtime::LPIResourceType getTranType() const; - -#endif // _LIB_RUNTIME_PROCESS_I_H_ + virtual void insertChild(LPIPROCProcess pProcess ); \ + virtual void setParent (LPIPROCProcess pProcess ); \ + virtual void next (const rdo::runtime::LPRDOPROCTransact& pTransact); \ + virtual rdo::runtime::LPIResourceType getTranType() const; diff --git a/simulator/runtime/process/seize_release.cpp b/simulator/runtime/process/seize_release.cpp index f41131029..f0978fdee 100644 --- a/simulator/runtime/process/seize_release.cpp +++ b/simulator/runtime/process/seize_release.cpp @@ -15,195 +15,195 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOPROCBlockForSeize // -------------------------------------------------------------------------------- RDOPROCBlockForSeize::RDOPROCBlockForSeize(LPIPROCProcess process, std::vector From_Par) - : RDOPROCBlock(process ) - , fromParser (From_Par) + : RDOPROCBlock(process ) + , fromParser (From_Par) {} void RDOPROCBlockForSeize::_onStart(const LPRDORuntime& pRuntime) { - /// @todo: если потребуется стоить деревья, вершинами которых будут полные снимки БД, - // как при DPT search, то инициализацию атрибутов надо будет делать в checkOperation - std::vector::iterator it1 = fromParser.begin(); - while (it1 != fromParser.end()) - { - int Id_res = (*it1).Id_res; - int Id_param = (*it1).Id_param; - LPRDOResource res = pRuntime->getResourceByID(Id_res); - runtime_for_Seize bbb; - bbb.Id_param = Id_param; - bbb.rss = res.object_static_cast(); - bbb.enum_free = RDOValue(bbb.rss->getParam(Id_param).getEnum(), RDOPROCBlockForSeize::getStateEnumFree()); - bbb.enum_buzy = RDOValue(bbb.rss->getParam(Id_param).getEnum(), RDOPROCBlockForSeize::getStateEnumBuzy()); - forRes.push_back(bbb); - ++it1; - } + // TODO: если потребуется стоить деревья, вершинами которых будут полные снимки БД, + // как при DPT search, то инициализацию атрибутов надо будет делать в checkOperation + std::vector::iterator it1 = fromParser.begin(); + while (it1 != fromParser.end()) + { + int Id_res = (*it1).Id_res; + int Id_param = (*it1).Id_param; + LPRDOResource res = pRuntime->getResourceByID(Id_res); + runtime_for_Seize bbb; + bbb.Id_param = Id_param; + bbb.rss = res.object_static_cast(); + bbb.enum_free = RDOValue(bbb.rss->getParam(Id_param).getEnum(), RDOPROCBlockForSeize::getStateEnumFree()); + bbb.enum_buzy = RDOValue(bbb.rss->getParam(Id_param).getEnum(), RDOPROCBlockForSeize::getStateEnumBuzy()); + forRes.push_back(bbb); + ++it1; + } } std::string RDOPROCBlockForSeize::getStateParamName() { - return "Состояние"; + return "Состояние"; } std::string RDOPROCBlockForSeize::getStateEnumFree() { - return "Свободен"; + return "Свободен"; } std::string RDOPROCBlockForSeize::getStateEnumBuzy() { - return "Занят"; + return "Занят"; } // -------------------------------------------------------------------------------- // -------------------- RDOPROCSeize // -------------------------------------------------------------------------------- RDOPROCSeize::RDOPROCSeize(LPIPROCProcess process, std::vector From_Par) - : RDOPROCBlockForSeize(process, From_Par) + : RDOPROCBlockForSeize(process, From_Par) { - static std::size_t g_index = 1; - index = g_index++; + static std::size_t g_index = 1; + index = g_index++; } void RDOPROCSeize::onStart(const LPRDORuntime& pRuntime) { - _onStart(pRuntime); + _onStart(pRuntime); } bool RDOPROCSeize::onCheckCondition(const LPRDORuntime& pRuntime) { - if (m_transacts.empty()) - return false; + if (m_transacts.empty()) + return false; - const std::size_t Size_Seizes = forRes.size(); - for (std::size_t i = 0; i < Size_Seizes; i++) - { - // если свободен - if (forRes[i].rss->getParam(forRes[i].Id_param) == forRes[i].enum_free) - { - const std::size_t idBlocksTransact = m_transacts.front()->getTraceID(); - const std::size_t idResourcesTransact = forRes[i].rss->transacts.front()->getTraceID(); - if (idBlocksTransact != idResourcesTransact) - return false; + const std::size_t Size_Seizes = forRes.size(); + for (std::size_t i = 0; i < Size_Seizes; i++) + { + // если свободен + if (forRes[i].rss->getParam(forRes[i].Id_param) == forRes[i].enum_free) + { + const std::size_t idBlocksTransact = m_transacts.front()->getTraceID(); + const std::size_t idResourcesTransact = forRes[i].rss->transacts.front()->getTraceID(); + if (idBlocksTransact != idResourcesTransact) + return false; - RDOTrace* tracer = pRuntime->getTracer(); - forRes[i].rss->setParam(forRes[i].Id_param, forRes[i].enum_buzy); - TRACE3("%7.1f SEIZES-%d, resId = %d\n", pRuntime->getCurrentTime(), index, forRes[i].rss->getTraceID()); - if (!tracer->isNull()) - tracer->getOStream() << forRes[i].rss->traceResourceState('\0', pRuntime) << tracer->getEOL(); + RDOTrace* tracer = pRuntime->getTracer(); + forRes[i].rss->setParam(forRes[i].Id_param, forRes[i].enum_buzy); + TRACE3("%7.1f SEIZES-%d, resId = %d\n", pRuntime->getCurrentTime(), index, forRes[i].rss->getTraceID()); + if (!tracer->isNull()) + tracer->getOStream() << forRes[i].rss->traceResourceState('\0', pRuntime) << tracer->getEOL(); - m_transacts.front()->setRes(forRes[i].rss); - return true; - } - } - return false; + m_transacts.front()->setRes(forRes[i].rss); + return true; + } + } + return false; } -IBaseOperation::BOResult RDOPROCSeize::onDoOperation(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOPROCSeize::onDoOperation(const LPRDORuntime& /*pRuntime*/) { - m_transacts.front()->next(); - return IBaseOperation::BOR_done; + m_transacts.front()->next(); + return IBaseOperation::ResultCode::DONE; } void RDOPROCSeize::transactGoIn(const LPTransact& pTransact) { - int sizeSeizes = forRes.size(); - for(int i = 0; i < sizeSeizes; ++i) - { - forRes[i].rss->transacts.push_back(pTransact); - } - RDOPROCBlockForSeize::transactGoIn(pTransact); + int sizeSeizes = forRes.size(); + for(int i = 0; i < sizeSeizes; ++i) + { + forRes[i].rss->transacts.push_back(pTransact); + } + RDOPROCBlockForSeize::transactGoIn(pTransact); } void RDOPROCSeize::transactGoOut(const LPTransact& pTransact) { - int Size_Seizes = forRes.size(); - for(int i = 0; i < Size_Seizes; ++i) - { - forRes[i].rss->transacts.remove(pTransact); - } - RDOPROCBlockForSeize::transactGoOut(pTransact); + int Size_Seizes = forRes.size(); + for(int i = 0; i < Size_Seizes; ++i) + { + forRes[i].rss->transacts.remove(pTransact); + } + RDOPROCBlockForSeize::transactGoOut(pTransact); } void RDOPROCSeize::onStop(const LPRDORuntime& /*pRuntime*/) {} -IBaseOperation::BOResult RDOPROCSeize::onContinue(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOPROCSeize::onContinue(const LPRDORuntime& /*pRuntime*/) { - return IBaseOperation::BOR_cant_run; + return IBaseOperation::ResultCode::CANNOT_RUN; } // -------------------------------------------------------------------------------- // -------------------- RDOPROCRelease // -------------------------------------------------------------------------------- RDOPROCRelease::RDOPROCRelease(LPIPROCProcess process, std::vector From_Par) - : RDOPROCBlockForSeize(process, From_Par) + : RDOPROCBlockForSeize(process, From_Par) { - static std::size_t g_index = 1; - index = g_index++; + static std::size_t g_index = 1; + index = g_index++; } void RDOPROCRelease::onStart(const LPRDORuntime& pRuntime) { - _onStart(pRuntime); + _onStart(pRuntime); } bool RDOPROCRelease::onCheckCondition(const LPRDORuntime& pRuntime) { - if (!m_transacts.empty()) - { - int Size_Seizes = forRes.size(); - for(int i=0;igetRes()) - { - // Занят - if (forRes[i].rss->getParam(forRes[i].Id_param) == forRes[i].enum_buzy) - { - RDOTrace* tracer = pRuntime->getTracer(); - TRACE3("%7.1f RELEASES-%d, resId = %d\n", pRuntime->getCurrentTime(), index, forRes[i].rss->getTraceID()); - forRes[i].rss->setParam(forRes[i].Id_param, forRes[i].enum_free); - if (!tracer->isNull()) - { - tracer->getOStream() << forRes[i].rss->traceResourceState('\0', pRuntime) << tracer->getEOL(); - } - return true; - } - // Не Занят и не свободен - if (forRes[i].rss->getParam(forRes[i].Id_param) != forRes[i].enum_free) - { - //Удаляем транзакт - RDOTrace* tracer = pRuntime->getTracer(); - TRACE3("%7.1f RELEASES_Bad-%d, resId = %d\n", pRuntime->getCurrentTime(), index, forRes[i].rss->getTraceID()); - LPRDOPROCTransact transact = m_transacts.front(); - ASSERT(transact); - transact->setState(RDOResource::CS_Erase); - if (!tracer->isNull()) - { - tracer->getOStream() << transact->traceResourceState('\0', pRuntime) << tracer->getEOL(); - } - m_transacts.remove(transact); - forRes[i].rss->transacts.remove(transact); - pRuntime->onEraseRes(transact->getTraceID(), NULL); - return false; - } - } - } - } - return false; -} - -IBaseOperation::BOResult RDOPROCRelease::onDoOperation(const LPRDORuntime& /*pRuntime*/) -{ - m_transacts.front()->next(); - return IBaseOperation::BOR_done; + if (!m_transacts.empty()) + { + int Size_Seizes = forRes.size(); + for(int i=0;igetRes()) + { + // Занят + if (forRes[i].rss->getParam(forRes[i].Id_param) == forRes[i].enum_buzy) + { + RDOTrace* tracer = pRuntime->getTracer(); + TRACE3("%7.1f RELEASES-%d, resId = %d\n", pRuntime->getCurrentTime(), index, forRes[i].rss->getTraceID()); + forRes[i].rss->setParam(forRes[i].Id_param, forRes[i].enum_free); + if (!tracer->isNull()) + { + tracer->getOStream() << forRes[i].rss->traceResourceState('\0', pRuntime) << tracer->getEOL(); + } + return true; + } + // Не Занят и не свободен + if (forRes[i].rss->getParam(forRes[i].Id_param) != forRes[i].enum_free) + { + //Удаляем транзакт + RDOTrace* tracer = pRuntime->getTracer(); + TRACE3("%7.1f RELEASES_Bad-%d, resId = %d\n", pRuntime->getCurrentTime(), index, forRes[i].rss->getTraceID()); + LPRDOPROCTransact transact = m_transacts.front(); + ASSERT(transact); + transact->setState(RDOResource::ConvertStatus::ERASE); + if (!tracer->isNull()) + { + tracer->getOStream() << transact->traceResourceState('\0', pRuntime) << tracer->getEOL(); + } + m_transacts.remove(transact); + forRes[i].rss->transacts.remove(transact); + pRuntime->onEraseRes(transact->getTraceID(), NULL); + return false; + } + } + } + } + return false; +} + +IBaseOperation::ResultCode RDOPROCRelease::onDoOperation(const LPRDORuntime& /*pRuntime*/) +{ + m_transacts.front()->next(); + return IBaseOperation::ResultCode::DONE; } void RDOPROCRelease::onStop(const LPRDORuntime& /*pRuntime*/) {} -IBaseOperation::BOResult RDOPROCRelease::onContinue(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOPROCRelease::onContinue(const LPRDORuntime& /*pRuntime*/) { - return IBaseOperation::BOR_cant_run; + return IBaseOperation::ResultCode::CANNOT_RUN; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/process/seize_release.h b/simulator/runtime/process/seize_release.h index 0b2367a95..018ba7f19 100644 --- a/simulator/runtime/process/seize_release.h +++ b/simulator/runtime/process/seize_release.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_PROCESS_SEIZE_RELEASE_H_ -#define _LIB_RUNTIME_PROCESS_SEIZE_RELEASE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -16,60 +15,58 @@ OPEN_RDO_RUNTIME_NAMESPACE struct runtime_for_Seize { - LPRDOPROCResource rss; - int Id_param; - RDOValue enum_free; - RDOValue enum_buzy; - RDOValue enum_break; + LPRDOPROCResource rss; + int Id_param; + RDOValue enum_free; + RDOValue enum_buzy; + RDOValue enum_break; }; struct parser_for_Seize { - int Id_res; - int Id_param; + int Id_res; + int Id_param; }; class RDOPROCBlockForSeize: public RDOPROCBlock { public: - static std::string getStateParamName(); - static std::string getStateEnumFree(); - static std::string getStateEnumBuzy(); + static std::string getStateParamName(); + static std::string getStateEnumFree(); + static std::string getStateEnumBuzy(); protected: - RDOPROCBlockForSeize(LPIPROCProcess process, std::vector From_Par); + RDOPROCBlockForSeize(LPIPROCProcess process, std::vector From_Par); - std::vector forRes; - std::vector fromParser; + std::vector forRes; + std::vector fromParser; - void _onStart(const LPRDORuntime& pRuntime); + void _onStart(const LPRDORuntime& pRuntime); }; class RDOPROCSeize: public RDOPROCBlockForSeize { DECLARE_FACTORY(RDOPROCSeize); private: - RDOPROCSeize(LPIPROCProcess process, std::vector From_Par); + RDOPROCSeize(LPIPROCProcess process, std::vector From_Par); - std::size_t index; + std::size_t index; - virtual void transactGoIn (const LPTransact& pTransact); - virtual void transactGoOut(const LPTransact& pTransact); + virtual void transactGoIn (const LPTransact& pTransact); + virtual void transactGoOut(const LPTransact& pTransact); - DECLARE_IBaseOperation; + DECLARE_IBaseOperation; }; class RDOPROCRelease: public RDOPROCBlockForSeize { DECLARE_FACTORY(RDOPROCRelease); private: - RDOPROCRelease(LPIPROCProcess process, std::vector From_Par); + RDOPROCRelease(LPIPROCProcess process, std::vector From_Par); - std::size_t index; + std::size_t index; - DECLARE_IBaseOperation; + DECLARE_IBaseOperation; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_PROCESS_SEIZE_RELEASE_H_ diff --git a/simulator/runtime/process/terminate.cpp b/simulator/runtime/process/terminate.cpp index ea8514f4e..69c75077e 100644 --- a/simulator/runtime/process/terminate.cpp +++ b/simulator/runtime/process/terminate.cpp @@ -13,39 +13,39 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOPROCTerminate // -------------------------------------------------------------------------------- RDOPROCTerminate::RDOPROCTerminate(const LPIPROCProcess& pProcess, const LPRDOCalc& pCalc) - : RDOPROCBlock (pProcess) - , m_terminatedTransactCount(0 ) - , m_pTermCalc (pCalc ) + : RDOPROCBlock (pProcess) + , m_terminatedTransactCount(0 ) + , m_pTermCalc (pCalc ) {} bool RDOPROCTerminate::onCheckCondition(const LPRDORuntime& /*pRuntime*/) { - return !m_transacts.empty() ? true : false; + return !m_transacts.empty() ? true : false; } -IBaseOperation::BOResult RDOPROCTerminate::onDoOperation(const LPRDORuntime& pRuntime) +IBaseOperation::ResultCode RDOPROCTerminate::onDoOperation(const LPRDORuntime& pRuntime) { - TRACE1("%7.1f TERMINATE\n", pRuntime->getCurrentTime()); - LPRDOPROCTransact transact = m_transacts.front(); - ASSERT(transact); - transact->setState(RDOResource::CS_Erase); - RDOTrace* tracer = pRuntime->getTracer(); - if (!tracer->isNull()) - { - tracer->getOStream() << transact->traceResourceState('\0', pRuntime) << tracer->getEOL(); - } - pRuntime->onEraseRes(transact->getTraceID(), NULL); - m_transacts.erase(m_transacts.begin()); - std::size_t termNow = pRuntime->getCurrentTerm(); + TRACE1("%7.1f TERMINATE\n", pRuntime->getCurrentTime()); + LPRDOPROCTransact transact = m_transacts.front(); + ASSERT(transact); + transact->setState(RDOResource::ConvertStatus::ERASE); + RDOTrace* tracer = pRuntime->getTracer(); + if (!tracer->isNull()) + { + tracer->getOStream() << transact->traceResourceState('\0', pRuntime) << tracer->getEOL(); + } + pRuntime->onEraseRes(transact->getTraceID(), NULL); + m_transacts.erase(m_transacts.begin()); + std::size_t termNow = pRuntime->getCurrentTerm(); - ++m_terminatedTransactCount; + ++m_terminatedTransactCount; - if (m_pStatistics) - m_pStatistics->setTransCount(m_terminatedTransactCount); + if (m_pStatistics) + m_pStatistics->setTransCount(m_terminatedTransactCount); - termNow += m_pTermCalc->calcValue(pRuntime).getInt(); - pRuntime->setCurrentTerm(termNow); - return IBaseOperation::BOR_done; + termNow += m_pTermCalc->calcValue(pRuntime).getInt(); + pRuntime->setCurrentTerm(termNow); + return IBaseOperation::ResultCode::DONE; } void RDOPROCTerminate::onStart(const LPRDORuntime& /*pRuntime*/) @@ -54,14 +54,14 @@ void RDOPROCTerminate::onStart(const LPRDORuntime& /*pRuntime*/) void RDOPROCTerminate::onStop(const LPRDORuntime& /*pRuntime*/) {} -IBaseOperation::BOResult RDOPROCTerminate::onContinue(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOPROCTerminate::onContinue(const LPRDORuntime& /*pRuntime*/) { - return IBaseOperation::BOR_cant_run; + return IBaseOperation::ResultCode::CANNOT_RUN; } void RDOPROCTerminate::setStatistics(const rdo::runtime::LPIInternalStatistics& pStatistics) { - m_pStatistics = pStatistics; + m_pStatistics = pStatistics; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/process/terminate.h b/simulator/runtime/process/terminate.h index dbbfcda91..c7337aa7d 100644 --- a/simulator/runtime/process/terminate.h +++ b/simulator/runtime/process/terminate.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_PROCESS_TERMINATE_H_ -#define _LIB_RUNTIME_PROCESS_TERMINATE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -14,20 +13,18 @@ OPEN_RDO_RUNTIME_NAMESPACE -class RDOPROCTerminate: public RDOPROCBlock, public IInternalStatisticsManager, public boost::noncopyable +class RDOPROCTerminate: public RDOPROCBlock, public IInternalStatisticsManager, private boost::noncopyable { DECLARE_FACTORY(RDOPROCTerminate); private: - RDOPROCTerminate(const LPIPROCProcess& pProcess, const LPRDOCalc& pCalc); + RDOPROCTerminate(const LPIPROCProcess& pProcess, const LPRDOCalc& pCalc); - std::size_t m_terminatedTransactCount; - LPRDOCalc m_pTermCalc; - LPIInternalStatistics m_pStatistics; + std::size_t m_terminatedTransactCount; + LPRDOCalc m_pTermCalc; + LPIInternalStatistics m_pStatistics; - DECLARE_IBaseOperation; - DECLARE_IInternalStatisticsManager; + DECLARE_IBaseOperation; + DECLARE_IInternalStatisticsManager; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_PROCESS_TERMINATE_H_ diff --git a/simulator/runtime/rdo.cpp b/simulator/runtime/rdo.cpp index 2bf5d0d53..5db630ece 100644 --- a/simulator/runtime/rdo.cpp +++ b/simulator/runtime/rdo.cpp @@ -8,5 +8,5 @@ // -------------------------------------------------------------------------------- #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable : 4786) + #pragma warning(disable : 4786) #endif // COMPILER_VISUAL_STUDIO diff --git a/simulator/runtime/rdo.h b/simulator/runtime/rdo.h index dfcb04d68..5a23a49a5 100644 --- a/simulator/runtime/rdo.h +++ b/simulator/runtime/rdo.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_RDO_H_ -#define _LIB_RUNTIME_RDO_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,40 +12,33 @@ PREDECLARE_POINTER(RDORuntime) CLOSE_RDO_RUNTIME_NAMESPACE -/// @todo Надо бы сделать IBaseOperation базовым для всех возможных логик +// TODO Надо бы сделать IBaseOperation базовым для всех возможных логик class IBaseOperation: public virtual rdo::counter_reference { public: - //! Статуc состояния операции - enum BOResult - { - BOR_cant_run = 0, //!< операция не может быть запущена - BOR_planned_and_run, //!< операция запланирована и выполняется - BOR_must_continue , //!< операция может быть продолжена - BOR_done //!< операция выполнена - }; - - virtual void onStart(const rdo::runtime::LPRDORuntime& pRuntime) = 0; - - virtual void onStop(const rdo::runtime::LPRDORuntime& pRuntime) = 0; - - virtual bool onCheckCondition(const rdo::runtime::LPRDORuntime& pRuntime) = 0; - - virtual BOResult onDoOperation(const rdo::runtime::LPRDORuntime& pRuntime) = 0; - - virtual BOResult onContinue(const rdo::runtime::LPRDORuntime& pRuntime) = 0; + enum class ResultCode + { + CANNOT_RUN, + PLANNED_AND_RUN, + MUST_CONTINUE, + DONE + }; + + virtual void onStart(const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual void onStop(const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual bool onCheckCondition(const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual ResultCode onDoOperation(const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual ResultCode onContinue(const rdo::runtime::LPRDORuntime& pRuntime) = 0; }; #define DECLARE_IBaseOperation \ - virtual void onStart (const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual void onStop (const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual bool onCheckCondition(const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual BOResult onDoOperation (const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual BOResult onContinue (const rdo::runtime::LPRDORuntime& pRuntime); + virtual void onStart (const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual void onStop (const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual bool onCheckCondition(const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual ResultCode onDoOperation (const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual ResultCode onContinue (const rdo::runtime::LPRDORuntime& pRuntime); DECLARE_POINTER(IBaseOperation); typedef std::vector BaseOperationList; - -#endif // _LIB_RUNTIME_RDO_H_ diff --git a/simulator/runtime/rdo_activity-inl.h b/simulator/runtime/rdo_activity-inl.h index f20f4f64e..9d106a94e 100644 --- a/simulator/runtime/rdo_activity-inl.h +++ b/simulator/runtime/rdo_activity-inl.h @@ -13,8 +13,8 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- template inline RDOActivityPattern::RDOActivityPattern(const rdo::intrusive_ptr& pPattern, bool trace, const std::string& name) - : RDOActivity(trace, name) - , m_pPattern (pPattern ) + : RDOActivity(trace, name) + , m_pPattern (pPattern ) {} template @@ -24,13 +24,13 @@ inline RDOActivityPattern::~RDOActivityPattern() template inline void RDOActivityPattern::writeModelStructure(std::ostream& stream) const { - stream << m_oprName << " " << tracePatternId() << std::endl; + stream << m_oprName << " " << tracePatternId() << std::endl; } template inline const std::string& RDOActivityPattern::tracePatternId() const { - return m_pPattern->traceId(); + return m_pPattern->traceId(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_activity.cpp b/simulator/runtime/rdo_activity.cpp index ab730592c..e76daaa94 100644 --- a/simulator/runtime/rdo_activity.cpp +++ b/simulator/runtime/rdo_activity.cpp @@ -14,8 +14,8 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOActivity // -------------------------------------------------------------------------------- RDOActivity::RDOActivity(bool trace, const std::string& name) - : RDOTraceableObject(trace) - , m_oprName (name ) + : RDOTraceableObject(trace) + , m_oprName (name ) {} RDOActivity::~RDOActivity() @@ -23,124 +23,124 @@ RDOActivity::~RDOActivity() void RDOActivity::updateRelRes(const LPRDORuntime& pRuntime) { - getRelevantResources(pRuntime, m_relevantResources); + getRelevantResources(pRuntime, m_relevantResources); } void RDOActivity::addParamCalc(const LPRDOCalc& pCalc) { - m_paramsCalcs.push_back(pCalc); + m_paramsCalcs.push_back(pCalc); } int RDOActivity::getResByRelRes(std::size_t rel_res_id) const { - if (m_relResID.size() <= rel_res_id) - { - return 0; - } - return m_relResID.at(rel_res_id); + if (m_relResID.size() <= rel_res_id) + { + return 0; + } + return m_relResID.at(rel_res_id); } void RDOActivity::setRelRes(std::size_t rel_res_id, std::size_t res_id) { - if (m_relResID.size() <= rel_res_id) - { - m_relResID.resize(rel_res_id + 1); - } - m_relResID[rel_res_id] = res_id; + if (m_relResID.size() <= rel_res_id) + { + m_relResID.resize(rel_res_id + 1); + } + m_relResID[rel_res_id] = res_id; } void RDOActivity::setPatternParameters(const LPRDORuntime& pRuntime, const std::vector& params) { - std::vector params_values; - params_values.reserve(params.size()); - for (const LPRDOCalc& param: params) - { - params_values.push_back(param->calcValue(pRuntime)); - } - setPatternParameters(pRuntime, params_values); + std::vector params_values; + params_values.reserve(params.size()); + for (const LPRDOCalc& param: params) + { + params_values.push_back(param->calcValue(pRuntime)); + } + setPatternParameters(pRuntime, params_values); } void RDOActivity::setPatternParameters(const LPRDORuntime& pRuntime, const std::vector& params) { - for (size_t index = 0; index < params.size(); ++index) - { - pRuntime->setPatternParameter(index, params[index]); - } + for (size_t index = 0; index < params.size(); ++index) + { + pRuntime->setPatternParameter(index, params[index]); + } } void RDOActivity::getRelevantResources(const LPRDORuntime& pRuntime, std::list& rel_res_list) { - rel_res_list.clear(); - int size = m_relResID.size(); - for (int i = 0; i < size; ++i) - { - rel_res_list.push_back(pRuntime->getResourceByID(m_relResID[i])); - } + rel_res_list.clear(); + int size = m_relResID.size(); + for (int i = 0; i < size; ++i) + { + rel_res_list.push_back(pRuntime->getResourceByID(m_relResID[i])); + } } void RDOActivity::updateConvertStatus(const LPRDORuntime& pRuntime, const std::vector& status_list) { - updateRelRes(pRuntime); - int i = 0; - std::list::iterator it = m_relevantResources.begin(); - while (it != m_relevantResources.end()) - { - LPRDOResource res = *it; - if (res) - { - res->setState(status_list[i]); - switch (status_list[i]) - { - case RDOResource::CS_Create: - { - res->makeTemporary(true); - break; - } - default: break; - } - } - ++i; - ++it; - } + updateRelRes(pRuntime); + int i = 0; + std::list::iterator it = m_relevantResources.begin(); + while (it != m_relevantResources.end()) + { + LPRDOResource res = *it; + if (res) + { + res->setState(status_list[i]); + switch (status_list[i]) + { + case RDOResource::ConvertStatus::CREATE: + { + res->makeTemporary(true); + break; + } + default: break; + } + } + ++i; + ++it; + } } std::string RDOActivity::traceResourcesList(char prefix, const LPRDORuntime& pRuntime) { - std::string res; - for (std::list::const_iterator i = m_relevantResources.begin(); i != m_relevantResources.end(); ++i) - { - if (*i) - { - res += (*i)->traceResourceState(prefix, pRuntime); - } - } - return res; + std::string res; + for (std::list::const_iterator i = m_relevantResources.begin(); i != m_relevantResources.end(); ++i) + { + if (*i) + { + res += (*i)->traceResourceState(prefix, pRuntime); + } + } + return res; } std::string RDOActivity::traceResourcesListNumbers(const LPRDORuntime& /*pRuntime*/, bool show_create_index) { #ifndef RDOSIM_COMPATIBLE - (void)show_create_index; + (void)show_create_index; #endif - std::ostringstream res; - res << m_relevantResources.size() << " "; - for (std::list::const_iterator i = m_relevantResources.begin(); i != m_relevantResources.end(); ++i) - { + std::ostringstream res; + res << m_relevantResources.size() << " "; + for (std::list::const_iterator i = m_relevantResources.begin(); i != m_relevantResources.end(); ++i) + { #ifdef RDOSIM_COMPATIBLE - if (*i && (show_create_index || (!show_create_index && (*i)->getState() != RDOResource::CS_Create))) - { + if (*i && (show_create_index || (!show_create_index && (*i)->getState() != RDOResource::ConvertStatus::CREATE))) + { #else - if (*i) - { + if (*i) + { #endif - res << " " << (*i)->traceId(); - } - else - { - res << " 0"; - } - } - return res.str(); + res << " " << (*i)->traceId(); + } + else + { + res << " 0"; + } + } + return res.str(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_activity.h b/simulator/runtime/rdo_activity.h index 942015422..2d862b787 100644 --- a/simulator/runtime/rdo_activity.h +++ b/simulator/runtime/rdo_activity.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_ACTIVITY_H_ -#define _LIB_RUNTIME_ACTIVITY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -14,41 +13,39 @@ OPEN_RDO_RUNTIME_NAMESPACE class RDOActivity: public RDOTraceableObject, public IActivity, public IActivityTrace { protected: - RDOActivity(bool trace, const std::string& name); - virtual ~RDOActivity(); + RDOActivity(bool trace, const std::string& name); + virtual ~RDOActivity(); - std::string m_oprName; - std::list m_relevantResources; // Список релевантных ресурсов - std::vector m_relResID; // Содержит список id ресурсов, которые стали релевантными образцу - std::vector m_paramsCalcs; + std::string m_oprName; + std::list m_relevantResources; // Список релевантных ресурсов + std::vector m_relResID; // Содержит список id ресурсов, которые стали релевантными образцу + std::vector m_paramsCalcs; - void setPatternParameters(const LPRDORuntime& pRuntime, const std::vector& params); - void setPatternParameters(const LPRDORuntime& pRuntime, const std::vector& params); - void getRelevantResources(const LPRDORuntime& pRuntime, std::list& rel_res_list); - void updateRelRes (const LPRDORuntime& pRuntime); - void updateConvertStatus (const LPRDORuntime& pRuntime, const std::vector& status_list); + void setPatternParameters(const LPRDORuntime& pRuntime, const std::vector& params); + void setPatternParameters(const LPRDORuntime& pRuntime, const std::vector& params); + void getRelevantResources(const LPRDORuntime& pRuntime, std::list& rel_res_list); + void updateRelRes (const LPRDORuntime& pRuntime); + void updateConvertStatus (const LPRDORuntime& pRuntime, const std::vector& status_list); private: - DECLARE_IActivity; - DECLARE_IActivityTrace; + DECLARE_IActivity; + DECLARE_IActivityTrace; }; template class RDOActivityPattern: public RDOActivity, public IModelStructure, public IActivityPatternTrace { protected: - RDOActivityPattern(const rdo::intrusive_ptr& pPattern, bool trace, const std::string& name); - virtual ~RDOActivityPattern(); + RDOActivityPattern(const rdo::intrusive_ptr& pPattern, bool trace, const std::string& name); + virtual ~RDOActivityPattern(); - rdo::intrusive_ptr m_pPattern; + rdo::intrusive_ptr m_pPattern; private: - void writeModelStructure(std::ostream& stream) const; - const std::string& tracePatternId() const; + void writeModelStructure(std::ostream& stream) const; + const std::string& tracePatternId() const; }; CLOSE_RDO_RUNTIME_NAMESPACE #include "simulator/runtime/rdo_activity-inl.h" - -#endif // _LIB_RUNTIME_ACTIVITY_H_ diff --git a/simulator/runtime/rdo_activity_i.h b/simulator/runtime/rdo_activity_i.h index 088862bb2..cad7594f7 100644 --- a/simulator/runtime/rdo_activity_i.h +++ b/simulator/runtime/rdo_activity_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_ACTIVITY_I_H_ -#define _LIB_RUNTIME_ACTIVITY_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,37 +8,35 @@ class IActivity: public virtual rdo::counter_reference { public: - virtual void addParamCalc(const rdo::runtime::LPRDOCalc& pCalc) = 0; - virtual int getResByRelRes(std::size_t rel_res_id) const = 0; - virtual void setRelRes(std::size_t rel_res_id, std::size_t res_id) = 0; + virtual void addParamCalc(const rdo::runtime::LPRDOCalc& pCalc) = 0; + virtual int getResByRelRes(std::size_t rel_res_id) const = 0; + virtual void setRelRes(std::size_t rel_res_id, std::size_t res_id) = 0; }; DECLARE_POINTER(IActivity); #define DECLARE_IActivity \ - virtual void addParamCalc(const rdo::runtime::LPRDOCalc& pCalc); \ - virtual int getResByRelRes(std::size_t rel_res_id) const; \ - virtual void setRelRes(std::size_t rel_res_id, std::size_t res_id); + virtual void addParamCalc(const rdo::runtime::LPRDOCalc& pCalc); \ + virtual int getResByRelRes(std::size_t rel_res_id) const; \ + virtual void setRelRes(std::size_t rel_res_id, std::size_t res_id); class IActivityTrace: public virtual rdo::counter_reference { public: - virtual std::string traceResourcesList(char prefix, const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual std::string traceResourcesListNumbers(const rdo::runtime::LPRDORuntime& pRuntime, bool show_create_index) = 0; + virtual std::string traceResourcesList(char prefix, const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual std::string traceResourcesListNumbers(const rdo::runtime::LPRDORuntime& pRuntime, bool show_create_index) = 0; }; DECLARE_POINTER(IActivityTrace) #define DECLARE_IActivityTrace \ - virtual std::string traceResourcesList(char prefix, const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual std::string traceResourcesListNumbers(const rdo::runtime::LPRDORuntime& pRuntime, bool show_create_index); + virtual std::string traceResourcesList(char prefix, const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual std::string traceResourcesListNumbers(const rdo::runtime::LPRDORuntime& pRuntime, bool show_create_index); class IActivityPatternTrace: public virtual rdo::counter_reference { public: - virtual const std::string& tracePatternId() const = 0; + virtual const std::string& tracePatternId() const = 0; }; DECLARE_POINTER(IActivityPatternTrace) #define DECLARE_IActivityPatternTrace \ - virtual const std::string& tracePatternId() const; - -#endif // _LIB_RUNTIME_ACTIVITY_I_H_ + virtual const std::string& tracePatternId() const; diff --git a/simulator/runtime/rdo_array.cpp b/simulator/runtime/rdo_array.cpp index 92f06cf9c..4e3e47807 100644 --- a/simulator/runtime/rdo_array.cpp +++ b/simulator/runtime/rdo_array.cpp @@ -12,12 +12,12 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOArrayValue // -------------------------------------------------------------------------------- RDOArrayValue::RDOArrayValue(const LPRDOArrayType& pType) - : m_pArrayType(pType) + : m_pArrayType(pType) {} RDOArrayValue::RDOArrayValue(const LPRDOArrayValue& pValue) - : m_container (pValue->m_container ) - , m_pArrayType(pValue->m_pArrayType) + : m_container (pValue->m_container ) + , m_pArrayType(pValue->m_pArrayType) {} RDOArrayValue::~RDOArrayValue() @@ -25,113 +25,113 @@ RDOArrayValue::~RDOArrayValue() const LPRDOArrayType& RDOArrayValue::type() const { - ASSERT(m_pArrayType); - return m_pArrayType; + ASSERT(m_pArrayType); + return m_pArrayType; } void RDOArrayValue::push_back(const RDOValue& item) { - m_container.push_back(item); + m_container.push_back(item); } LPRDOArrayIterator RDOArrayValue::begin() { - return rdo::Factory::create(m_container.begin()); + return rdo::Factory::create(m_container.begin()); } LPRDOArrayIterator RDOArrayValue::end() { - return rdo::Factory::create(m_container.end()); + return rdo::Factory::create(m_container.end()); } void RDOArrayValue::insert(const LPRDOArrayIterator& pWhere, const LPRDOArrayIterator& pFromFirst, const LPRDOArrayIterator& pFromLast) { - ASSERT(pWhere ); - ASSERT(pFromFirst); - ASSERT(pFromLast ); + ASSERT(pWhere ); + ASSERT(pFromFirst); + ASSERT(pFromLast ); - m_container.insert(pWhere->getIterator(), pFromFirst->getIterator(), pFromLast->getIterator()); + m_container.insert(pWhere->getIterator(), pFromFirst->getIterator(), pFromLast->getIterator()); } void RDOArrayValue::erase(const LPRDOArrayIterator& pFirst, const LPRDOArrayIterator& pLast) { - ASSERT(pFirst) - ASSERT(pLast ); + ASSERT(pFirst) + ASSERT(pLast ); - m_container.erase(pFirst->getIterator(), pLast->getIterator()); + m_container.erase(pFirst->getIterator(), pLast->getIterator()); } std::string RDOArrayValue::asString() const { - std::string result("["); - for (Container::const_iterator item = m_container.begin(); item != m_container.end(); ++item) - { - if (item == m_container.begin()) - { - result = rdo::format("%s%s", result.c_str(), item->getAsString().c_str()); - } - else - { - result = rdo::format("%s, %s", result.c_str(), item->getAsString().c_str()); - } - } - return rdo::format("%s]", result.c_str()); + std::string result("["); + for (Container::const_iterator item = m_container.begin(); item != m_container.end(); ++item) + { + if (item == m_container.begin()) + { + result = rdo::format("%s%s", result.c_str(), item->getAsString().c_str()); + } + else + { + result = rdo::format("%s, %s", result.c_str(), item->getAsString().c_str()); + } + } + return rdo::format("%s]", result.c_str()); } std::size_t RDOArrayValue::size() const { - return m_container.size(); + return m_container.size(); } const RDOValue& RDOArrayValue::getItem(const RDOValue& index) const { - const std::size_t ind = index.getUInt(); - if (ind >= m_container.size()) - { - throw RDORuntimeException("Выход за пределы массива"); - } - return m_container[ind]; + const std::size_t ind = index.getUInt(); + if (ind >= m_container.size()) + { + throw RDORuntimeException("Выход за пределы массива"); + } + return m_container[ind]; } void RDOArrayValue::setItem(const RDOValue& index, const RDOValue& item) { - const std::size_t ind = index.getUInt(); - if (ind >= m_container.size()) - { - throw RDORuntimeException("Выход за пределы массива"); - } - m_container[ind] = item; + const std::size_t ind = index.getUInt(); + if (ind >= m_container.size()) + { + throw RDORuntimeException("Выход за пределы массива"); + } + m_container[ind] = item; } LPRDOArrayValue RDOArrayValue::clone() const { - LPRDOArrayValue pClone = rdo::Factory::create(type()); - ASSERT(pClone); + LPRDOArrayValue pClone = rdo::Factory::create(type()); + ASSERT(pClone); - for (const RDOValue& value: m_container) - { - pClone->push_back(value.clone()); - } + for (const RDOValue& value: m_container) + { + pClone->push_back(value.clone()); + } - return pClone; + return pClone; } // -------------------------------------------------------------------------------- // -------------------- RDOArrayIterator // -------------------------------------------------------------------------------- RDOArrayIterator::RDOArrayIterator(const LPRDOArrayIterator& pIterator) - : RDOType (RDOType::t_pointer ) - , m_iterator(pIterator->m_iterator) + : RDOType (RDOType::Type::POINTER ) + , m_iterator(pIterator->m_iterator) {} RDOArrayIterator::RDOArrayIterator(const RDOArrayIterator& iterator) - : RDOType (RDOType::t_pointer ) - , m_iterator(iterator.m_iterator) + : RDOType (RDOType::Type::POINTER ) + , m_iterator(iterator.m_iterator) {} RDOArrayIterator::RDOArrayIterator(const Iterator& iterator) - : RDOType (RDOType::t_pointer) - , m_iterator(iterator ) + : RDOType (RDOType::Type::POINTER) + , m_iterator(iterator ) {} RDOArrayIterator::~RDOArrayIterator() @@ -139,55 +139,55 @@ RDOArrayIterator::~RDOArrayIterator() RDOArrayIterator::Iterator RDOArrayIterator::getIterator() const { - return m_iterator; + return m_iterator; } const RDOValue& RDOArrayIterator::getValue() const { - return *m_iterator; + return *m_iterator; } LPRDOArrayIterator RDOArrayIterator::preInc(int delta) { - m_iterator += delta; - return LPRDOArrayIterator(this); + m_iterator += delta; + return LPRDOArrayIterator(this); } LPRDOArrayIterator RDOArrayIterator::postInc(int delta) { - LPRDOArrayIterator pPrev = rdo::Factory::create(m_iterator); - ASSERT(pPrev); - m_iterator += delta; - return pPrev; + LPRDOArrayIterator pPrev = rdo::Factory::create(m_iterator); + ASSERT(pPrev); + m_iterator += delta; + return pPrev; } LPRDOArrayIterator RDOArrayIterator::next() { - return preInc(1); + return preInc(1); } bool RDOArrayIterator::equal(const LPRDOArrayIterator& pIterator) const { - ASSERT(pIterator); - return m_iterator == pIterator->m_iterator; + ASSERT(pIterator); + return m_iterator == pIterator->m_iterator; } LPRDOArrayIterator RDOArrayIterator::clone() const { - return rdo::Factory::create(*this); + return rdo::Factory::create(*this); } std::string RDOArrayIterator::asString() const { - return getValue().getAsString(); + return getValue().getAsString(); } // -------------------------------------------------------------------------------- // -------------------- RDOArrayType // -------------------------------------------------------------------------------- RDOArrayType::RDOArrayType(const LPItemType& pItemType) - : RDOType (RDOType::t_pointer) - , m_pItemType(pItemType ) + : RDOType (RDOType::Type::POINTER) + , m_pItemType(pItemType ) {} RDOArrayType::~RDOArrayType() @@ -195,7 +195,7 @@ RDOArrayType::~RDOArrayType() const RDOArrayType::LPItemType& RDOArrayType::getItemType() const { - return m_pItemType; + return m_pItemType; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_array.h b/simulator/runtime/rdo_array.h index b04f5525d..31fa69c01 100644 --- a/simulator/runtime/rdo_array.h +++ b/simulator/runtime/rdo_array.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_ARRAY_H_ -#define _LIB_RUNTIME_ARRAY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -18,84 +17,79 @@ OPEN_RDO_RUNTIME_NAMESPACE PREDECLARE_POINTER(RDOArrayType ); PREDECLARE_POINTER(RDOArrayIterator); -//! Элемент массива PREDECLARE_POINTER(RDOArrayValue); class RDOArrayValue: public IAsString { DECLARE_FACTORY(RDOArrayValue) public: - typedef std::vector Container; + typedef std::vector Container; - const LPRDOArrayType& type() const; + const LPRDOArrayType& type() const; - void push_back(const RDOValue& item); - LPRDOArrayIterator begin(); - LPRDOArrayIterator end (); - void insert(const LPRDOArrayIterator& pWhere, const LPRDOArrayIterator& pFromFirst, const LPRDOArrayIterator& pFromLast); - void erase(const LPRDOArrayIterator& pFirst, const LPRDOArrayIterator& pLast); + void push_back(const RDOValue& item); + LPRDOArrayIterator begin(); + LPRDOArrayIterator end (); + void insert(const LPRDOArrayIterator& pWhere, const LPRDOArrayIterator& pFromFirst, const LPRDOArrayIterator& pFromLast); + void erase(const LPRDOArrayIterator& pFirst, const LPRDOArrayIterator& pLast); - std::size_t size() const; + std::size_t size() const; - const RDOValue& getItem(const RDOValue& index) const; - void setItem(const RDOValue& index, const RDOValue& item); + const RDOValue& getItem(const RDOValue& index) const; + void setItem(const RDOValue& index, const RDOValue& item); - LPRDOArrayValue clone() const; + LPRDOArrayValue clone() const; - DECLARE_IAsString; + DECLARE_IAsString; private: - RDOArrayValue(const LPRDOArrayType& pType ); - RDOArrayValue(const LPRDOArrayValue& pValue); - virtual ~RDOArrayValue(); + RDOArrayValue(const LPRDOArrayType& pType ); + RDOArrayValue(const LPRDOArrayValue& pValue); + virtual ~RDOArrayValue(); - Container m_container; - LPRDOArrayType m_pArrayType; + Container m_container; + LPRDOArrayType m_pArrayType; }; -//! Итератор массива class RDOArrayIterator: public RDOType, public IAsString { DECLARE_FACTORY(RDOArrayIterator) public: - typedef RDOArrayValue::Container::iterator Iterator; + typedef RDOArrayValue::Container::iterator Iterator; - Iterator getIterator() const; - const RDOValue& getValue() const; - LPRDOArrayIterator preInc(int delta); - LPRDOArrayIterator postInc(int delta); - LPRDOArrayIterator next(); - bool equal(const LPRDOArrayIterator& pIterator) const; - LPRDOArrayIterator clone() const; + Iterator getIterator() const; + const RDOValue& getValue() const; + LPRDOArrayIterator preInc(int delta); + LPRDOArrayIterator postInc(int delta); + LPRDOArrayIterator next(); + bool equal(const LPRDOArrayIterator& pIterator) const; + LPRDOArrayIterator clone() const; - DECLARE_IAsString; + DECLARE_IAsString; private: - RDOArrayIterator(const LPRDOArrayIterator& pIterator); - RDOArrayIterator(const RDOArrayIterator& iterator ); - RDOArrayIterator(const Iterator& iterator ); - virtual ~RDOArrayIterator(); + RDOArrayIterator(const LPRDOArrayIterator& pIterator); + RDOArrayIterator(const RDOArrayIterator& iterator ); + RDOArrayIterator(const Iterator& iterator ); + virtual ~RDOArrayIterator(); - Iterator m_iterator; + Iterator m_iterator; }; -//! Тип массив class RDOArrayType: public RDOType { DECLARE_FACTORY(RDOArrayType); public: - typedef LPRDOType LPItemType; - typedef RDOArrayValue value_type; + typedef LPRDOType LPItemType; + typedef RDOArrayValue value_type; - const LPItemType& getItemType() const; + const LPItemType& getItemType() const; protected: - RDOArrayType(const LPItemType& pItemType); - virtual ~RDOArrayType(); + RDOArrayType(const LPItemType& pItemType); + virtual ~RDOArrayType(); private: - LPItemType m_pItemType; + LPItemType m_pItemType; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_ARRAY_H_ diff --git a/simulator/runtime/rdo_as_string_i.h b/simulator/runtime/rdo_as_string_i.h index eea8d3089..4dd3e45d9 100644 --- a/simulator/runtime/rdo_as_string_i.h +++ b/simulator/runtime/rdo_as_string_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_AS_STRING_I_H -#define _LIB_RUNTIME_AS_STRING_I_H +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -13,17 +12,15 @@ struct IAsString: public virtual rdo::counter_reference { DECLARE_FACTORY(IAsString); public: - virtual std::string asString() const = 0; + virtual std::string asString() const = 0; protected: - IAsString() {} - virtual ~IAsString() {} + IAsString() {} + virtual ~IAsString() {} }; DECLARE_POINTER(IAsString) #define DECLARE_IAsString \ - std::string asString() const; + std::string asString() const; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_AS_STRING_I_H diff --git a/simulator/runtime/rdo_dptsearch_activity.cpp b/simulator/runtime/rdo_dptsearch_activity.cpp index be7734c78..768e4d8ab 100644 --- a/simulator/runtime/rdo_dptsearch_activity.cpp +++ b/simulator/runtime/rdo_dptsearch_activity.cpp @@ -11,30 +11,30 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- // -------------------- RDODPTSearchActivity // -------------------------------------------------------------------------------- -RDODPTSearchActivity::RDODPTSearchActivity(const LPIRule& rule, ValueTime valueTime, const LPRDOCalc& pCost) - : RDOTraceableObject(false ) - , m_rule (rule ) - , m_pCost (pCost ) - , m_valueTime (valueTime) +RDODPTSearchActivity::RDODPTSearchActivity(const LPIRule& rule, CostTime costTime, const LPRDOCalc& pCost) + : RDOTraceableObject(false) + , m_rule (rule) + , m_pCost (pCost) + , m_costTime (costTime) { - LPITrace trace = m_rule.object_dynamic_cast(); - ASSERT(trace); - setTraceID(trace->getTraceID()); + LPITrace trace = m_rule.object_dynamic_cast(); + ASSERT(trace); + setTraceID(trace->getTraceID()); } LPIRule& RDODPTSearchActivity::rule() { - return m_rule; + return m_rule; } double RDODPTSearchActivity::cost(const LPRDORuntime& pRuntime) { - return m_pCost->calcValue(pRuntime).getDouble(); + return m_pCost->calcValue(pRuntime).getDouble(); } -IDPTSearchActivity::ValueTime RDODPTSearchActivity::valueTime() const +IDPTSearchActivity::CostTime RDODPTSearchActivity::costTime() const { - return m_valueTime; + return m_costTime; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_dptsearch_activity.h b/simulator/runtime/rdo_dptsearch_activity.h index c41e72430..bde8238e2 100644 --- a/simulator/runtime/rdo_dptsearch_activity.h +++ b/simulator/runtime/rdo_dptsearch_activity.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_DPTSEARCH_ACTIVITY_H_ -#define _LIB_RUNTIME_DPTSEARCH_ACTIVITY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -15,15 +14,13 @@ class RDODPTSearchActivity: public IDPTSearchActivity, public RDOTraceableObject { DECLARE_FACTORY(RDODPTSearchActivity); private: - RDODPTSearchActivity(const LPIRule& rule, ValueTime valueTime, const LPRDOCalc& pCost); + RDODPTSearchActivity(const LPIRule& rule, CostTime costTime, const LPRDOCalc& pCost); - LPIRule m_rule; - LPRDOCalc m_pCost; - IDPTSearchActivity::ValueTime m_valueTime; + LPIRule m_rule; + LPRDOCalc m_pCost; + IDPTSearchActivity::CostTime m_costTime; - DECLARE_IDPTSearchActivity; + DECLARE_IDPTSearchActivity; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_DPTSEARCH_ACTIVITY_H_ diff --git a/simulator/runtime/rdo_dptsearch_activity_i.h b/simulator/runtime/rdo_dptsearch_activity_i.h index c36ac5d42..8aecb447a 100644 --- a/simulator/runtime/rdo_dptsearch_activity_i.h +++ b/simulator/runtime/rdo_dptsearch_activity_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_DPTSEARCH_ACTIVITY_I_H_ -#define _LIB_RUNTIME_DPTSEARCH_ACTIVITY_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -15,22 +14,19 @@ CLOSE_RDO_RUNTIME_NAMESPACE class IDPTSearchActivity: public virtual rdo::counter_reference { public: - //! Время вычисления функции стоимости пути - enum ValueTime - { - vt_before, //!< до выполнения активности - vt_after //!< после выполнения активности - }; - - virtual LPIRule& rule() = 0; - virtual double cost(const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual ValueTime valueTime() const = 0; + enum class CostTime + { + BEFORE, + AFTER + }; + + virtual LPIRule& rule() = 0; + virtual double cost(const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual CostTime costTime() const = 0; }; DECLARE_POINTER(IDPTSearchActivity) #define DECLARE_IDPTSearchActivity \ - virtual LPIRule& rule(); \ - virtual double cost(const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual ValueTime valueTime() const; - -#endif // _LIB_RUNTIME_DPTSEARCH_ACTIVITY_I_H_ + virtual LPIRule& rule(); \ + virtual double cost(const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual CostTime costTime() const; diff --git a/simulator/runtime/rdo_enum.cpp b/simulator/runtime/rdo_enum.cpp index 27c276fde..b138c32cf 100644 --- a/simulator/runtime/rdo_enum.cpp +++ b/simulator/runtime/rdo_enum.cpp @@ -15,49 +15,49 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOEnumType // -------------------------------------------------------------------------------- RDOEnumType::RDOEnumType() - : RDOType(RDOType::t_enum) + : RDOType(RDOType::Type::ENUM) {} RDOEnumType::RDOEnumType(const Enums& enums) - : RDOType(RDOType::t_enum) - , m_enum (enums ) + : RDOType(RDOType::Type::ENUM) + , m_enum (enums ) {} void RDOEnumType::add(const std::string& next) { - ASSERT(findEnum(next) == END); - m_enum.push_back(next); + ASSERT(findEnum(next) == END); + m_enum.push_back(next); } std::size_t RDOEnumType::findEnum(const std::string& val) const { - CIterator it = std::find(m_enum.begin(), m_enum.end(), val); - return it != m_enum.end() ? it - m_enum.begin() : END; + CIterator it = std::find(m_enum.begin(), m_enum.end(), val); + return it != m_enum.end() ? it - m_enum.begin() : END; } bool RDOEnumType::exist(const std::string& val) const { - return findEnum(val) != END; + return findEnum(val) != END; } bool RDOEnumType::empty() const { - return m_enum.empty(); + return m_enum.empty(); } const RDOEnumType::CIterator RDOEnumType::begin() const { - return m_enum.begin(); + return m_enum.begin(); } const RDOEnumType::CIterator RDOEnumType::end() const { - return m_enum.end(); + return m_enum.end(); } const RDOEnumType::Enums& RDOEnumType::getValues() const { - return m_enum; + return m_enum; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_enum.h b/simulator/runtime/rdo_enum.h index 90ac6b623..94da7c367 100644 --- a/simulator/runtime/rdo_enum.h +++ b/simulator/runtime/rdo_enum.h @@ -1,9 +1,9 @@ -#ifndef _LIB_RUNTIME_ENUM_H_ -#define _LIB_RUNTIME_ENUM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES +#include +#include // ----------------------------------------------------------------------- SYNOPSIS -#include "utils/src/common/rdocommon.h" #include "utils/src/smart_ptr/factory/factory.h" #include "simulator/runtime/rdo_type.h" // -------------------------------------------------------------------------------- @@ -14,30 +14,27 @@ class RDOEnumType: public RDOType { DECLARE_FACTORY(RDOEnumType); public: - typedef std::string EnumItem; - typedef rdo::vector Enums; - typedef Enums::const_iterator CIterator; - typedef Enums::const_iterator const_iterator; + typedef std::vector Enums; + typedef Enums::const_iterator CIterator; + typedef Enums::const_iterator const_iterator; - static const std::size_t END = std::size_t(~0); + static const std::size_t END = std::size_t(~0); - void add(const std::string& next); - std::size_t findEnum(const std::string& val) const; - bool exist(const std::string& val) const; + void add(const std::string& next); + std::size_t findEnum(const std::string& val) const; + bool exist(const std::string& val) const; - bool empty() const; - const CIterator begin() const; - const CIterator end() const; - const Enums& getValues() const; + bool empty() const; + const CIterator begin() const; + const CIterator end() const; + const Enums& getValues() const; protected: - RDOEnumType(); - RDOEnumType(const Enums& enums); + RDOEnumType(); + RDOEnumType(const Enums& enums); - Enums m_enum; + Enums m_enum; }; DECLARE_POINTER(RDOEnumType); CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_ENUM_H_ diff --git a/simulator/runtime/rdo_event.cpp b/simulator/runtime/rdo_event.cpp index ac357c11d..24ba2b6ad 100644 --- a/simulator/runtime/rdo_event.cpp +++ b/simulator/runtime/rdo_event.cpp @@ -12,10 +12,10 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOEvent // -------------------------------------------------------------------------------- RDOEvent::RDOEvent(const LPRDORuntime& pRuntime, const LPRDOPatternEvent& pPattern, bool trace, const std::string& name) - : RDOActivityPattern(pPattern, trace, name) + : RDOActivityPattern(pPattern, trace, name) { - setTrace (trace); - setTraceID(pRuntime->getFreeEventId()); + setTrace (trace); + setTraceID(pRuntime->getFreeEventId()); } void RDOEvent::onStart(const LPRDORuntime& /*pRuntime*/) @@ -26,44 +26,44 @@ void RDOEvent::onStop(const LPRDORuntime& /*pRuntime*/) bool RDOEvent::onCheckCondition(const LPRDORuntime& /*pRuntime*/) { - return false; + return false; } -IBaseOperation::BOResult RDOEvent::onDoOperation(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOEvent::onDoOperation(const LPRDORuntime& /*pRuntime*/) { - return IBaseOperation::BOR_cant_run; + return IBaseOperation::ResultCode::CANNOT_RUN; } void RDOEvent::onMakePlaned(const LPRDORuntime& pRuntime, const std::vector& params) { - pRuntime->inc_cnt_events(); - onBeforeEvent(pRuntime, params); - convertEvent (pRuntime); - onAfterEvent (pRuntime); + pRuntime->inc_cnt_events(); + onBeforeEvent(pRuntime, params); + convertEvent (pRuntime); + onAfterEvent (pRuntime); } void RDOEvent::convertEvent(const LPRDORuntime& pRuntime) { - m_pPattern->convertEvent(pRuntime); + m_pPattern->convertEvent(pRuntime); } void RDOEvent::onBeforeEvent(const LPRDORuntime& pRuntime, const std::vector& params) { - pRuntime->setCurrentActivity(this); - setPatternParameters(pRuntime, params); + pRuntime->setCurrentActivity(this); + setPatternParameters(pRuntime, params); } void RDOEvent::onAfterEvent(const LPRDORuntime& pRuntime) { - updateConvertStatus(pRuntime, m_pPattern->m_convertorStatus); - pRuntime->getTracer()->writeEvent(this, pRuntime); - m_pPattern->convertErase(pRuntime); - updateRelRes(pRuntime); + updateConvertStatus(pRuntime, m_pPattern->m_convertorStatus); + pRuntime->getTracer()->writeEvent(this, pRuntime); + m_pPattern->convertErase(pRuntime); + updateRelRes(pRuntime); } -IBaseOperation::BOResult RDOEvent::onContinue(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDOEvent::onContinue(const LPRDORuntime& /*pRuntime*/) { - return IBaseOperation::BOR_cant_run; + return IBaseOperation::ResultCode::CANNOT_RUN; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_event.h b/simulator/runtime/rdo_event.h index c7fa17fec..0235b2f6c 100644 --- a/simulator/runtime/rdo_event.h +++ b/simulator/runtime/rdo_event.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_EVENT_H_ -#define _LIB_RUNTIME_EVENT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -19,17 +18,15 @@ DECLARE_FACTORY(RDOEvent); friend class RDOTrace; private: - RDOEvent(const LPRDORuntime& pRuntime, const LPRDOPatternEvent& pPattern, bool trace, const std::string& name); + RDOEvent(const LPRDORuntime& pRuntime, const LPRDOPatternEvent& pPattern, bool trace, const std::string& name); - void convertEvent(const LPRDORuntime& pRuntime); + void convertEvent(const LPRDORuntime& pRuntime); - void onBeforeEvent(const LPRDORuntime& pRuntime, const std::vector& params); - void onAfterEvent (const LPRDORuntime& pRuntime); - virtual void onMakePlaned (const LPRDORuntime& pRuntime, const std::vector& params); + void onBeforeEvent(const LPRDORuntime& pRuntime, const std::vector& params); + void onAfterEvent (const LPRDORuntime& pRuntime); + virtual void onMakePlaned (const LPRDORuntime& pRuntime, const std::vector& params); - DECLARE_IBaseOperation; + DECLARE_IBaseOperation; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_EVENT_H_ diff --git a/simulator/runtime/rdo_event_i.h b/simulator/runtime/rdo_event_i.h index 82cdd8e20..c61de2914 100644 --- a/simulator/runtime/rdo_event_i.h +++ b/simulator/runtime/rdo_event_i.h @@ -16,9 +16,9 @@ PREDECLARE_POINTER(RDORuntime) class IEvent: public virtual rdo::counter_reference { public: - virtual void onMakePlaned(const rdo::runtime::LPRDORuntime& pRuntime, const std::vector& params) = 0; + virtual void onMakePlaned(const rdo::runtime::LPRDORuntime& pRuntime, const std::vector& params) = 0; - virtual ~IEvent() - {} + virtual ~IEvent() + {} }; DECLARE_POINTER(IEvent); diff --git a/simulator/runtime/rdo_exception.cpp b/simulator/runtime/rdo_exception.cpp index 24ce6709b..0b92baa28 100644 --- a/simulator/runtime/rdo_exception.cpp +++ b/simulator/runtime/rdo_exception.cpp @@ -11,72 +11,72 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOException // -------------------------------------------------------------------------------- RDOException::RDOException(const std::string& message) - : m_message(message) + : m_message(message) {} const std::string& RDOException::message() const { - return m_message; + return m_message; } // -------------------------------------------------------------------------------- // -------------------- RDORuntimeException // -------------------------------------------------------------------------------- RDORuntimeException::RDORuntimeException(const std::string& message) - : RDOException(message) + : RDOException(message) {} std::string RDORuntimeException::getType() const { - return "RDO Runtime Error"; + return "RDO Runtime Error"; } // -------------------------------------------------------------------------------- // -------------------- RDOTypeException // -------------------------------------------------------------------------------- RDOTypeException::RDOTypeException(const std::string& message) - : RDORuntimeException(message) + : RDORuntimeException(message) {} std::string RDOTypeException::getType() const { - return "RDOType Error"; + return "RDOType Error"; } // -------------------------------------------------------------------------------- // -------------------- RDOValueException // -------------------------------------------------------------------------------- RDOValueException::RDOValueException(const std::string& message) - : RDORuntimeException(message) + : RDORuntimeException(message) {} std::string RDOValueException::getType() const { - return "RDOValue Error"; + return "RDOValue Error"; } // -------------------------------------------------------------------------------- // -------------------- RDOUndefinedException // -------------------------------------------------------------------------------- RDOUndefinedException::RDOUndefinedException() - : RDORuntimeException("") + : RDORuntimeException("") {} std::string RDOUndefinedException::getType() const { - return "RDOValue Undefined Error"; + return "RDOValue Undefined Error"; } // -------------------------------------------------------------------------------- // -------------------- RDOInternalException // -------------------------------------------------------------------------------- RDOInternalException::RDOInternalException(const std::string& message) - : RDORuntimeException(message) + : RDORuntimeException(message) {} std::string RDOInternalException::getType() const { - return "RDO Internal Error"; + return "RDO Internal Error"; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_exception.h b/simulator/runtime/rdo_exception.h index 9ed6c25b3..632ab3b2c 100644 --- a/simulator/runtime/rdo_exception.h +++ b/simulator/runtime/rdo_exception.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_EXCEPTION_H_ -#define _LIB_RUNTIME_EXCEPTION_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -11,50 +10,48 @@ OPEN_RDO_RUNTIME_NAMESPACE class RDOException { public: - RDOException(const std::string& message); - virtual std::string getType() const = 0; + RDOException(const std::string& message); + virtual std::string getType() const = 0; - const std::string& message() const; + const std::string& message() const; private: - std::string m_message; + std::string m_message; }; class RDORuntimeException: public RDOException { public: - RDORuntimeException(const std::string& message); - virtual std::string getType() const; + RDORuntimeException(const std::string& message); + virtual std::string getType() const; }; class RDOTypeException: public RDORuntimeException { public: - RDOTypeException(const std::string& message = ""); - virtual std::string getType() const; + RDOTypeException(const std::string& message = ""); + virtual std::string getType() const; }; class RDOValueException: public RDORuntimeException { public: - RDOValueException(const std::string& message = ""); - virtual std::string getType() const; + RDOValueException(const std::string& message = ""); + virtual std::string getType() const; }; class RDOUndefinedException: public RDORuntimeException { public: - RDOUndefinedException(); - virtual std::string getType() const; + RDOUndefinedException(); + virtual std::string getType() const; }; class RDOInternalException: public RDORuntimeException { public: - RDOInternalException(const std::string& message); - virtual std::string getType() const; + RDOInternalException(const std::string& message); + virtual std::string getType() const; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_EXCEPTION_H_ diff --git a/simulator/runtime/rdo_fuzzy.cpp b/simulator/runtime/rdo_fuzzy.cpp index 47d74fdb5..c0c1c591b 100644 --- a/simulator/runtime/rdo_fuzzy.cpp +++ b/simulator/runtime/rdo_fuzzy.cpp @@ -12,8 +12,8 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- DefineArea::DefineArea() { - IntervalType mType = DomainPart::open(-10e15, 10e15); - m_domain = Domain(mType); + IntervalType mType = DomainPart::open(-10e15, 10e15); + m_domain = Domain(mType); } DefineArea::~DefineArea() @@ -21,13 +21,13 @@ DefineArea::~DefineArea() DefineArea::DefineArea(const RDOValue& leftRange, const RDOValue& rightRange) { - IntervalType mType = DomainPart::closed(leftRange, rightRange); - m_domain = Domain(mType); + IntervalType mType = DomainPart::closed(leftRange, rightRange); + m_domain = Domain(mType); } DefineArea::DefineArea(const RDOValue& value) { - IntervalType mType = DomainPart::closed(value,value); - m_domain = Domain(mType); + IntervalType mType = DomainPart::closed(value,value); + m_domain = Domain(mType); } // -------------------------------------------------------------------------------- @@ -42,12 +42,12 @@ FuzzySet::FuzzySet() {} FuzzySet::FuzzySet(const LPDefineArea& pDefineArea) - : m_defineArea(pDefineArea) + : m_defineArea(pDefineArea) {} FuzzySet::FuzzySet(const LPFuzzySet& pSet) - : m_fuzzySet (pSet->m_fuzzySet ) - , m_defineArea(pSet->m_defineArea) + : m_fuzzySet (pSet->m_fuzzySet ) + , m_defineArea(pSet->m_defineArea) {} FuzzySet::~FuzzySet() @@ -55,36 +55,36 @@ FuzzySet::~FuzzySet() void FuzzySet::setValues(const FuzzySetDefinition& values) { - m_fuzzySet = values; + m_fuzzySet = values; } LPFuzzySet FuzzySet::append(const RDOValue& rdovalue, double appertain) { - std::pair checkValue; - checkValue = m_fuzzySet.insert(std::pair(rdovalue, appertain)); - return LPFuzzySet(this); + std::pair checkValue; + checkValue = m_fuzzySet.insert(std::pair(rdovalue, appertain)); + return LPFuzzySet(this); } LPFuzzySet FuzzySet::operator() (const RDOValue& rdovalue, double appertain) { - return append(rdovalue, appertain); + return append(rdovalue, appertain); } double& FuzzySet::operator[] (const RDOValue& rdovalue) { - return m_fuzzySet[rdovalue]; + return m_fuzzySet[rdovalue]; } FuzzySet::FuzzySetDefinition::const_iterator FuzzySet::find(const RDOValue& rdovalue) const { - return m_fuzzySet.find(rdovalue); + return m_fuzzySet.find(rdovalue); } FuzzySet::FuzzyItem FuzzySet::findValue(const RDOValue& rdovalue) const { - FuzzySetDefinition::const_iterator found = find(rdovalue); - if (found != end()) return FuzzyItem(found->first, found->second); - else return FuzzyItem(rdovalue, 0.0 ); + FuzzySetDefinition::const_iterator found = find(rdovalue); + if (found != end()) return FuzzyItem(found->first, found->second); + else return FuzzyItem(rdovalue, 0.0 ); } FuzzySet::FuzzySetDefinition::const_iterator FuzzySet::begin() const { return m_fuzzySet.begin(); } @@ -94,28 +94,28 @@ FuzzySet::FuzzySetDefinition::iterator FuzzySet::end () { return m_ bool FuzzySet::empty() const { return m_fuzzySet.empty(); } bool FuzzySet::inRange (const RDOValue& rdovalue) { - return m_fuzzySet.find(rdovalue) != m_fuzzySet.end(); + return m_fuzzySet.find(rdovalue) != m_fuzzySet.end(); } LPFuzzySet FuzzySet::operator+ (const LPFuzzySet& pSet) const { - LPFuzzySet pThis(const_cast(this)); - return MemberFunctionProperties::ext_binary(fun_add, pThis, pSet); + LPFuzzySet pThis(const_cast(this)); + return MemberFunctionProperties::ext_binary(fun_add, pThis, pSet); } LPFuzzySet FuzzySet::operator- (const LPFuzzySet& pSet) const { - LPFuzzySet pThis(const_cast(this)); - return MemberFunctionProperties::ext_binary(fun_sub, pThis, pSet); + LPFuzzySet pThis(const_cast(this)); + return MemberFunctionProperties::ext_binary(fun_sub, pThis, pSet); } LPFuzzySet FuzzySet::operator* (const LPFuzzySet& pSet) const { - LPFuzzySet pThis(const_cast(this)); - return MemberFunctionProperties::ext_binary(fun_mult, pThis, pSet); + LPFuzzySet pThis(const_cast(this)); + return MemberFunctionProperties::ext_binary(fun_mult, pThis, pSet); } LPFuzzySet FuzzySet::operator/ (const LPFuzzySet& pSet) const { - LPFuzzySet pThis(const_cast(this)); - return MemberFunctionProperties::ext_binary(fun_div, pThis, pSet); + LPFuzzySet pThis(const_cast(this)); + return MemberFunctionProperties::ext_binary(fun_div, pThis, pSet); } RDOValue fun_u_minus(const RDOValue& rdovalue ) { return -rdovalue; } @@ -131,317 +131,317 @@ LPFuzzySet MemberFunctionProperties::u_log (const LPFuzzySet& pSet) std::string FuzzySet::getAsString() const { - if (empty()) - return "[empty value]"; + if (empty()) + return "[empty value]"; - std::string res = ""; - FuzzySetDefinition::const_iterator it = begin(); - while (it != end()) - { - const bool output = it->second > 0.0; - if (output) - res += rdo::format("<%s/%.2lf>", it->first.getAsString().c_str(), it->second); + std::string res = ""; + FuzzySetDefinition::const_iterator it = begin(); + while (it != end()) + { + const bool output = it->second > 0.0; + if (output) + res += rdo::format("<%s/%.2lf>", it->first.getAsString().c_str(), it->second); - ++it; + ++it; - if (output && it != end()) - res += " "; - } - return res; + if (output && it != end()) + res += " "; + } + return res; } LPFuzzySet FuzzySet::clone() const { - return rdo::Factory::create(LPFuzzySet(const_cast(this))); + return rdo::Factory::create(LPFuzzySet(const_cast(this))); } LPFuzzySet FuzzySet::operator&& (const LPFuzzySet& pSet) const { - LPFuzzySet pFuzzySetResult = rdo::Factory::create(); - ASSERT(pFuzzySetResult); - // Найдем только пересекающие элементы и выберем минимальную функцию принадлежности - FuzzySetDefinition::const_iterator it1 = begin(); - while (it1 != end()) - { - FuzzySet::FuzzySetDefinition::const_iterator it2 = pSet->find(it1->first); - if (it2 != pSet->end()) - { - pFuzzySetResult->operator[](it1->first) = (std::min)(it1->second, it2->second); - } - ++it1; - } - return pFuzzySetResult; + LPFuzzySet pFuzzySetResult = rdo::Factory::create(); + ASSERT(pFuzzySetResult); + // Найдем только пересекающие элементы и выберем минимальную функцию принадлежности + FuzzySetDefinition::const_iterator it1 = begin(); + while (it1 != end()) + { + FuzzySet::FuzzySetDefinition::const_iterator it2 = pSet->find(it1->first); + if (it2 != pSet->end()) + { + pFuzzySetResult->operator[](it1->first) = (std::min)(it1->second, it2->second); + } + ++it1; + } + return pFuzzySetResult; } LPFuzzySet FuzzySet::operator|| (const LPFuzzySet& pSet)const { - LPFuzzySet pFuzzySetResult = rdo::Factory::create(); - ASSERT(pFuzzySetResult); - // Объединим элементы двух множеств - // Если элемент одновременно принадлежит обоим множествам, то выберем максимальную функцию принадлежности - FuzzySetDefinition::const_iterator it1 = begin(); - while (it1 != end()) - { - FuzzySet::FuzzySetDefinition::const_iterator it2 = pSet->find(it1->first); - if (it2 != pSet->end()) - { - pFuzzySetResult->operator[](it1->first) = (std::max)(it1->second, it2->second); - } - else - { - // Не нашли пары - pFuzzySetResult->operator[](it1->first) = it1->second; - } - ++it1; - } - FuzzySet::FuzzySetDefinition::const_iterator it2 = pSet->begin(); - while (it2 != pSet->end()) - { - FuzzySetDefinition::const_iterator it1 = find(it2->first); - if (it1 == end()) - { - // Не нашли пары - pFuzzySetResult->operator[](it2->first) = it2->second; - } - ++it2; - } - return pFuzzySetResult; + LPFuzzySet pFuzzySetResult = rdo::Factory::create(); + ASSERT(pFuzzySetResult); + // Объединим элементы двух множеств + // Если элемент одновременно принадлежит обоим множествам, то выберем максимальную функцию принадлежности + FuzzySetDefinition::const_iterator it1 = begin(); + while (it1 != end()) + { + FuzzySet::FuzzySetDefinition::const_iterator it2 = pSet->find(it1->first); + if (it2 != pSet->end()) + { + pFuzzySetResult->operator[](it1->first) = (std::max)(it1->second, it2->second); + } + else + { + // Не нашли пары + pFuzzySetResult->operator[](it1->first) = it1->second; + } + ++it1; + } + FuzzySet::FuzzySetDefinition::const_iterator it2 = pSet->begin(); + while (it2 != pSet->end()) + { + FuzzySetDefinition::const_iterator it1 = find(it2->first); + if (it1 == end()) + { + // Не нашли пары + pFuzzySetResult->operator[](it2->first) = it2->second; + } + ++it2; + } + return pFuzzySetResult; } // -------------------------------------------------------------------------------- // -------------------- MemberFunctionProperties // -------------------------------------------------------------------------------- -/// @todo комментарии в *.h -//! Декартово произведение (попарное) элементов двух множест с применением произвольной функции fun +// TODO комментарии в *.h +// Декартово произведение (попарное) элементов двух множест с применением произвольной функции fun LPFuzzySet MemberFunctionProperties::ext_binary(ExtBinaryFun fun, const LPFuzzySet& pSet1, const LPFuzzySet& pSet2) { - FuzzySet::FuzzySetDefinition values; - FuzzySet::FuzzySetDefinition::const_iterator it1 = pSet1->begin(); - while (it1 != pSet1->end()) - { - FuzzySet::FuzzySetDefinition::const_iterator it2 = pSet2->begin(); - while (it2 != pSet2->end()) - { - RDOValue rdo_value = fun(it1->first, it2->first); - FuzzySet::FuzzySetDefinition::iterator val = values.find(rdo_value); - if (val == values.end()) - { - values[rdo_value] = (std::min)(it1->second, it2->second); - } - else - { - values[rdo_value] = (std::max)(val->second, (std::min)(it1->second, it2->second)); - } - ++it2; - } - ++it1; - } - - if (!values.empty()) - { - LPFuzzySet pFuzzySetResult = rdo::Factory::create(); - ASSERT(pFuzzySetResult); - pFuzzySetResult->setValues(values); - - return pFuzzySetResult; - } - - return LPFuzzySet(); -} - -//! Преобразование элементов через произвольную функцию fun + FuzzySet::FuzzySetDefinition values; + FuzzySet::FuzzySetDefinition::const_iterator it1 = pSet1->begin(); + while (it1 != pSet1->end()) + { + FuzzySet::FuzzySetDefinition::const_iterator it2 = pSet2->begin(); + while (it2 != pSet2->end()) + { + RDOValue rdo_value = fun(it1->first, it2->first); + FuzzySet::FuzzySetDefinition::iterator val = values.find(rdo_value); + if (val == values.end()) + { + values[rdo_value] = (std::min)(it1->second, it2->second); + } + else + { + values[rdo_value] = (std::max)(val->second, (std::min)(it1->second, it2->second)); + } + ++it2; + } + ++it1; + } + + if (!values.empty()) + { + LPFuzzySet pFuzzySetResult = rdo::Factory::create(); + ASSERT(pFuzzySetResult); + pFuzzySetResult->setValues(values); + + return pFuzzySetResult; + } + + return LPFuzzySet(); +} + +// Преобразование элементов через произвольную функцию fun LPFuzzySet MemberFunctionProperties::ext_unary(ExtUnaryFun fun, const LPFuzzySet& pSet) { - FuzzySet::FuzzySetDefinition values; - FuzzySet::FuzzySetDefinition::const_iterator it = pSet->begin(); - while (it != pSet->end()) - { - RDOValue rdo_value = fun(it->first); - FuzzySet::FuzzySetDefinition::iterator val = values.find(rdo_value); - if (val == values.end()) - { - values[rdo_value] = it->second; - } - else - { - values[rdo_value] = (std::max)(val->second, it->second); - } - ++it; - } + FuzzySet::FuzzySetDefinition values; + FuzzySet::FuzzySetDefinition::const_iterator it = pSet->begin(); + while (it != pSet->end()) + { + RDOValue rdo_value = fun(it->first); + FuzzySet::FuzzySetDefinition::iterator val = values.find(rdo_value); + if (val == values.end()) + { + values[rdo_value] = it->second; + } + else + { + values[rdo_value] = (std::max)(val->second, it->second); + } + ++it; + } - if (!values.empty()) - { + if (!values.empty()) + { - LPFuzzySet pFuzzySetResult = rdo::Factory::create(); - ASSERT(pFuzzySetResult); - pFuzzySetResult->setValues(values); + LPFuzzySet pFuzzySetResult = rdo::Factory::create(); + ASSERT(pFuzzySetResult); + pFuzzySetResult->setValues(values); - return pFuzzySetResult; - } + return pFuzzySetResult; + } - return LPFuzzySet(); + return LPFuzzySet(); } LPFuzzySet MemberFunctionProperties::ext_unary(ExtUnaryFunP fun, void* pParam, const LPFuzzySet& pSet) { - FuzzySet::FuzzySetDefinition values; - FuzzySet::FuzzySetDefinition::const_iterator it = pSet->begin(); - while (it != pSet->end()) - { - RDOValue rdo_value = fun(it->first, pParam); - FuzzySet::FuzzySetDefinition::iterator val = values.find(rdo_value); - if (val == values.end()) - { - values[rdo_value] = it->second; - } - else - { - values[rdo_value] = (std::max)(val->second, it->second); - } - ++it; - } - - if (!values.empty()) - { - - LPFuzzySet pFuzzySetResult = rdo::Factory::create(); - ASSERT(pFuzzySetResult); - pFuzzySetResult->setValues(values); - return pFuzzySetResult; - } - - return LPFuzzySet(); + FuzzySet::FuzzySetDefinition values; + FuzzySet::FuzzySetDefinition::const_iterator it = pSet->begin(); + while (it != pSet->end()) + { + RDOValue rdo_value = fun(it->first, pParam); + FuzzySet::FuzzySetDefinition::iterator val = values.find(rdo_value); + if (val == values.end()) + { + values[rdo_value] = it->second; + } + else + { + values[rdo_value] = (std::max)(val->second, it->second); + } + ++it; + } + + if (!values.empty()) + { + + LPFuzzySet pFuzzySetResult = rdo::Factory::create(); + ASSERT(pFuzzySetResult); + pFuzzySetResult->setValues(values); + return pFuzzySetResult; + } + + return LPFuzzySet(); } LPFuzzySet MemberFunctionProperties::a_con (const LPFuzzySet& pSet) { - return a_pow(pSet, 2.0); + return a_pow(pSet, 2.0); } LPFuzzySet MemberFunctionProperties::a_dil (const LPFuzzySet& pSet) { - return a_pow(pSet, 0.5); + return a_pow(pSet, 0.5); } LPFuzzySet MemberFunctionProperties::a_mult(const LPFuzzySet& pSet1, const LPFuzzySet& pSet2) { - LPFuzzySet pFuzzySetResult = rdo::Factory::create(); - ASSERT(pFuzzySetResult); + LPFuzzySet pFuzzySetResult = rdo::Factory::create(); + ASSERT(pFuzzySetResult); - // Найдем только пересекающие элементы и перемножим функции принадлежности - FuzzySet::FuzzySetDefinition::const_iterator it1 = pSet1->begin(); - for (it1 = pSet1->begin(); it1 != pSet1->end(); ++it1) - { - FuzzySet::FuzzySetDefinition::const_iterator it2 = pSet2->find(it1->first); - if (it2 != pSet2->end()) - { - pFuzzySetResult->operator[](it1->first) = it1->second * it2->second; - } - } - return pFuzzySetResult; + // Найдем только пересекающие элементы и перемножим функции принадлежности + FuzzySet::FuzzySetDefinition::const_iterator it1 = pSet1->begin(); + for (it1 = pSet1->begin(); it1 != pSet1->end(); ++it1) + { + FuzzySet::FuzzySetDefinition::const_iterator it2 = pSet2->find(it1->first); + if (it2 != pSet2->end()) + { + pFuzzySetResult->operator[](it1->first) = it1->second * it2->second; + } + } + return pFuzzySetResult; } LPFuzzySet MemberFunctionProperties::alpha(const LPFuzzySet& pSet,double appertain) { - if (appertain < 0) appertain = 0; - else if (appertain > 1) appertain = 1; + if (appertain < 0) appertain = 0; + else if (appertain > 1) appertain = 1; - LPFuzzySet pFuzzySetResult = rdo::Factory::create(); - ASSERT(pFuzzySetResult); + LPFuzzySet pFuzzySetResult = rdo::Factory::create(); + ASSERT(pFuzzySetResult); - FuzzySet::FuzzySetDefinition::const_iterator it = pSet->begin(); + FuzzySet::FuzzySetDefinition::const_iterator it = pSet->begin(); - // Найдем отсечку - while (it != pSet->end()) - { - if (it->second >= appertain) - { - pFuzzySetResult->operator[](it->first) = pSet->operator[](it->first); - } - ++it; - } - return pFuzzySetResult; + // Найдем отсечку + while (it != pSet->end()) + { + if (it->second >= appertain) + { + pFuzzySetResult->operator[](it->first) = pSet->operator[](it->first); + } + ++it; + } + return pFuzzySetResult; } LPFuzzySet MemberFunctionProperties::supplement(const LPFuzzySet& pSet) { - LPFuzzySet pFuzzySetResult = rdo::Factory::create(pSet); - ASSERT(pFuzzySetResult); + LPFuzzySet pFuzzySetResult = rdo::Factory::create(pSet); + ASSERT(pFuzzySetResult); - FuzzySet::FuzzySetDefinition::iterator it = pFuzzySetResult->begin(); - while (it != pFuzzySetResult->end()) - { - it->second = 1-(it->second); - ++it; - } - return(pFuzzySetResult); + FuzzySet::FuzzySetDefinition::iterator it = pFuzzySetResult->begin(); + while (it != pFuzzySetResult->end()) + { + it->second = 1-(it->second); + ++it; + } + return(pFuzzySetResult); } LPFuzzySet MemberFunctionProperties::a_pow(LPFuzzySet pSet, double power) { - LPFuzzySet pFuzzySetResult = rdo::Factory::create(pSet); - ASSERT(pFuzzySetResult); + LPFuzzySet pFuzzySetResult = rdo::Factory::create(pSet); + ASSERT(pFuzzySetResult); - // Возведём в степень - FuzzySet::FuzzySetDefinition::iterator it = pFuzzySetResult->begin(); - while (it != pFuzzySetResult->end()) - { - it->second = pow(it->second, power); ///flag - ++it; - } - return pFuzzySetResult; + // Возведём в степень + FuzzySet::FuzzySetDefinition::iterator it = pFuzzySetResult->begin(); + while (it != pFuzzySetResult->end()) + { + it->second = pow(it->second, power); + ++it; + } + return pFuzzySetResult; } LPRDOLingvoVariable MemberFunctionProperties::fuzzyfication(const RDOValue&value, const LPRDOLingvoVariable& variable) { - LPRDOLingvoVariable pVariable = rdo::Factory::create(value, variable); - for (RDOLingvoVariable::TermSet::const_iterator it = variable->begin(); it != variable->end(); ++it) - { - LPFuzzySet pSet = rdo::Factory::create(it->second); - FuzzySet::FuzzyItem item = pSet->findValue(value); - LPFuzzySet newSet = rdo::Factory::create(); - newSet->append(item.first, item.second); - pVariable->append(it->first, newSet); - } - return pVariable; + LPRDOLingvoVariable pVariable = rdo::Factory::create(value, variable); + for (RDOLingvoVariable::TermSet::const_iterator it = variable->begin(); it != variable->end(); ++it) + { + LPFuzzySet pSet = rdo::Factory::create(it->second); + FuzzySet::FuzzyItem item = pSet->findValue(value); + LPFuzzySet newSet = rdo::Factory::create(); + newSet->append(item.first, item.second); + pVariable->append(it->first, newSet); + } + return pVariable; } RDOValue MemberFunctionProperties::defuzzyfication(const LPFuzzySet& pSet) { - FuzzySet::FuzzySetDefinition::const_iterator it = pSet->begin(); - if (it == pSet->end()) - return RDOValue(); - - FuzzySet::FuzzySetDefinition::const_iterator it_next = it; - ++it_next; - if (it_next == pSet->end()) - return it->first; - - double g = 0; - double f = 0; - double x = it->first.getDouble(); - double x_next = it_next->first.getDouble(); - double a = it->second; - double b = it_next->second; - double h = x_next - x; - for (;;) - { - double t = h*(a+b)/2.0; - g += t*(x_next + x)/2.0; - f += t; - - ++it; - ++it_next; - if (it_next == pSet->end()) - break; - - x = x_next; - a = b; - x_next = it_next->first.getDouble(); - b = it_next->second; - h = x_next - x; - } - return g / f; + FuzzySet::FuzzySetDefinition::const_iterator it = pSet->begin(); + if (it == pSet->end()) + return RDOValue(); + + FuzzySet::FuzzySetDefinition::const_iterator it_next = it; + ++it_next; + if (it_next == pSet->end()) + return it->first; + + double g = 0; + double f = 0; + double x = it->first.getDouble(); + double x_next = it_next->first.getDouble(); + double a = it->second; + double b = it_next->second; + double h = x_next - x; + for (;;) + { + double t = h*(a+b)/2.0; + g += t*(x_next + x)/2.0; + f += t; + + ++it; + ++it_next; + if (it_next == pSet->end()) + break; + + x = x_next; + a = b; + x_next = it_next->first.getDouble(); + b = it_next->second; + h = x_next - x; + } + return g / f; } // -------------------------------------------------------------------------------- @@ -449,11 +449,11 @@ RDOValue MemberFunctionProperties::defuzzyfication(const LPFuzzySet& pSet) // -------------------------------------------------------------------------------- const LPFuzzySet& RDOFuzzyTerm::getFuzzySetDefinition() const { - return (m_term.second); + return (m_term.second); } std::string RDOFuzzyTerm::getName() const { - return (m_term.first); + return (m_term.first); } RDOFuzzyTerm::RDOFuzzyTerm(const termName& pName, const LPFuzzySet& pSet) { @@ -470,25 +470,25 @@ RDOLingvoVariable::TermSet::const_iterator RDOLingvoVariable::begin() const RDOLingvoVariable::TermSet::const_iterator RDOLingvoVariable::end () const {return m_set.end ();} RDOLingvoVariable::RDOLingvoVariable(const LPRDOFuzzyTerm& term, nameOfVariable nameOfVariable) { - m_name = nameOfVariable; - m_set.insert(make_pair(term->getName(), term->getFuzzySetDefinition())); + m_name = nameOfVariable; + m_set.insert(make_pair(term->getName(), term->getFuzzySetDefinition())); } RDOLingvoVariable::RDOLingvoVariable(const RDOValue&pDefineAreaValue, const LPRDOLingvoVariable& variable) - : m_name("activated") + : m_name("activated") { - LPDefineArea defineArea = rdo::Factory::create(pDefineAreaValue); - LPFuzzySet setOfVariable = rdo::Factory::create(defineArea); - for (RDOLingvoVariable::TermSet::const_iterator it = variable->begin(); it != variable->end(); it++) - { - m_set.insert(std::pair(it->first,setOfVariable)); - } + LPDefineArea defineArea = rdo::Factory::create(pDefineAreaValue); + LPFuzzySet setOfVariable = rdo::Factory::create(defineArea); + for (RDOLingvoVariable::TermSet::const_iterator it = variable->begin(); it != variable->end(); it++) + { + m_set.insert(std::pair(it->first,setOfVariable)); + } } RDOLingvoVariable::RDOLingvoVariable(const RDOLingvoVariable& variable) { - m_set = variable.m_set; - m_name = variable.m_name; + m_set = variable.m_set; + m_name = variable.m_name; } RDOLingvoVariable::~RDOLingvoVariable() @@ -496,17 +496,17 @@ RDOLingvoVariable::~RDOLingvoVariable() void RDOLingvoVariable::setName(nameOfVariable nameVariable) { - m_name = nameVariable; + m_name = nameVariable; } LPFuzzySet& RDOLingvoVariable::operator[] (std::string name) { - return m_set[name]; + return m_set[name]; } void RDOLingvoVariable::append(std::string name, const LPFuzzySet& fuzzySet) { - operator[](name) = fuzzySet; + operator[](name) = fuzzySet; } // -------------------------------------------------------------------------------- @@ -514,12 +514,12 @@ void RDOLingvoVariable::append(std::string name, const LPFuzzySet& fuzzySet) // -------------------------------------------------------------------------------- void Statement::setTerm(LPRDOFuzzyTerm term) { - m_term = term; + m_term = term; } void Statement::setVariable(LPRDOLingvoVariable variable) { - m_variable = variable; + m_variable = variable; } Statement::Statement() diff --git a/simulator/runtime/rdo_fuzzy.h b/simulator/runtime/rdo_fuzzy.h index f4f4f69c5..d89e4ea44 100644 --- a/simulator/runtime/rdo_fuzzy.h +++ b/simulator/runtime/rdo_fuzzy.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_FUZZY_H_ -#define _LIB_RUNTIME_FUZZY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -15,98 +14,95 @@ OPEN_RDO_RUNTIME_NAMESPACE PREDECLARE_POINTER(FuzzySet); PREDECLARE_POINTER(DefineArea); -//! Область определения PREDECLARE_POINTER(DefineArea); class DefineArea: public rdo::counter_reference { DECLARE_FACTORY(DefineArea); public: - typedef boost::icl::interval DomainPart; - typedef boost::icl::interval::type IntervalType; - typedef boost::icl::interval_set Domain; + typedef boost::icl::interval DomainPart; + typedef boost::icl::interval::type IntervalType; + typedef boost::icl::interval_set Domain; - DefineArea (); // типа бесконечность - virtual ~DefineArea(); + DefineArea(); + virtual ~DefineArea(); private: - DefineArea(const RDOValue&);// 1 element - DefineArea(const RDOValue& leftBorder, const RDOValue& rightBorder); //; + DefineArea(const RDOValue&); + DefineArea(const RDOValue& leftBorder, const RDOValue& rightBorder); - Domain m_domain; + Domain m_domain; }; -//! Нечеткое множество PREDECLARE_POINTER(FuzzySet); class FuzzySet: public rdo::counter_reference { DECLARE_FACTORY(FuzzySet); public: - typedef std::pair FuzzyItem; - typedef std::map FuzzySetDefinition; - - LPFuzzySet append (const RDOValue& rdovalue, double appertain); // вставка с проверкой значения, если такое же есть - не вставит - LPFuzzySet operator() (const RDOValue& rdovalue, double appertain); - double& operator[] (const RDOValue& rdovalue); // вставка без проверки значения - FuzzySetDefinition::const_iterator find (const RDOValue& rdovalue) const; - FuzzyItem findValue (const RDOValue& rdovalue) const; - FuzzySetDefinition::const_iterator begin () const; - FuzzySetDefinition::const_iterator end () const; - FuzzySetDefinition::iterator begin (); - FuzzySetDefinition::iterator end (); - LPFuzzySet clone () const; - bool empty () const; - bool inRange (const RDOValue& rdovalue); - void setValues (const FuzzySetDefinition& values); - - LPFuzzySet operator&& (const LPFuzzySet& pFuzzyValue) const; - LPFuzzySet operator|| (const LPFuzzySet& pFuzzyValue) const; - /* 3.102*/ LPFuzzySet operator+ (const LPFuzzySet& pFuzzyValue) const; - /* 3.104*/ LPFuzzySet operator- (const LPFuzzySet& pFuzzyValue) const; - /* 3.106*/ LPFuzzySet operator* (const LPFuzzySet& pFuzzyValue) const; - /* 3.108*/ LPFuzzySet operator/ (const LPFuzzySet& pFuzzyValue) const; - - - std::string getAsString() const; + typedef std::pair FuzzyItem; + typedef std::map FuzzySetDefinition; + + LPFuzzySet append (const RDOValue& rdovalue, double appertain); + LPFuzzySet operator() (const RDOValue& rdovalue, double appertain); + double& operator[] (const RDOValue& rdovalue); + FuzzySetDefinition::const_iterator find (const RDOValue& rdovalue) const; + FuzzyItem findValue (const RDOValue& rdovalue) const; + FuzzySetDefinition::const_iterator begin () const; + FuzzySetDefinition::const_iterator end () const; + FuzzySetDefinition::iterator begin (); + FuzzySetDefinition::iterator end (); + LPFuzzySet clone () const; + bool empty () const; + bool inRange (const RDOValue& rdovalue); + void setValues (const FuzzySetDefinition& values); + + LPFuzzySet operator&& (const LPFuzzySet& pFuzzyValue) const; + LPFuzzySet operator|| (const LPFuzzySet& pFuzzyValue) const; + /* 3.102*/ LPFuzzySet operator+ (const LPFuzzySet& pFuzzyValue) const; + /* 3.104*/ LPFuzzySet operator- (const LPFuzzySet& pFuzzyValue) const; + /* 3.106*/ LPFuzzySet operator* (const LPFuzzySet& pFuzzyValue) const; + /* 3.108*/ LPFuzzySet operator/ (const LPFuzzySet& pFuzzyValue) const; + + + std::string getAsString() const; private: - FuzzySet(); - FuzzySet(const LPDefineArea& pDefineArea); - FuzzySet(const LPFuzzySet& pSet); // KK + FuzzySet(); + FuzzySet(const LPDefineArea& pDefineArea); + FuzzySet(const LPFuzzySet& pSet); // KK - virtual ~FuzzySet(); + virtual ~FuzzySet(); - FuzzySetDefinition m_fuzzySet; - LPDefineArea m_defineArea; + FuzzySetDefinition m_fuzzySet; + LPDefineArea m_defineArea; }; PREDECLARE_POINTER(RDOValue); PREDECLARE_POINTER(RDOLingvoVariable); -//! Свойства НМ: class MemberFunctionProperties { public: - typedef RDOValue (*ExtUnaryFun )(const RDOValue& rdovalue); - typedef RDOValue (*ExtUnaryFunP)(const RDOValue& rdovalue, void* pParam); - typedef RDOValue (*ExtBinaryFun)(const RDOValue& rdovalue1, const RDOValue& rdovalue2); + typedef RDOValue (*ExtUnaryFun )(const RDOValue& rdovalue); + typedef RDOValue (*ExtUnaryFunP)(const RDOValue& rdovalue, void* pParam); + typedef RDOValue (*ExtBinaryFun)(const RDOValue& rdovalue1, const RDOValue& rdovalue2); - /* 3.116*/ static LPFuzzySet u_minus(const LPFuzzySet& pSet); - /* 3.117*/ static LPFuzzySet u_obr (const LPFuzzySet& pSet); - /* 3.118*/ static LPFuzzySet u_scale(const LPFuzzySet& pSet, double scale); - /* 3.119*/ static LPFuzzySet u_log (const LPFuzzySet& pSet); + /* 3.116*/ static LPFuzzySet u_minus(const LPFuzzySet& pSet); + /* 3.117*/ static LPFuzzySet u_obr (const LPFuzzySet& pSet); + /* 3.118*/ static LPFuzzySet u_scale(const LPFuzzySet& pSet, double scale); + /* 3.119*/ static LPFuzzySet u_log (const LPFuzzySet& pSet); - /* 3.39 */ static LPFuzzySet a_mult (const LPFuzzySet& pSet1, const LPFuzzySet& pSet2); // не работает пока - /* 3.48 */ static LPFuzzySet alpha (const LPFuzzySet& pSet, double appertain); - /* 3.62 */ static LPFuzzySet supplement(const LPFuzzySet& pSet); - /* 3.78 */ static LPFuzzySet a_con (const LPFuzzySet& pSet); - /* 3.79 */ static LPFuzzySet a_dil (const LPFuzzySet& pSet); + /* 3.39 */ static LPFuzzySet a_mult (const LPFuzzySet& pSet1, const LPFuzzySet& pSet2); // не работает пока + /* 3.48 */ static LPFuzzySet alpha (const LPFuzzySet& pSet, double appertain); + /* 3.62 */ static LPFuzzySet supplement(const LPFuzzySet& pSet); + /* 3.78 */ static LPFuzzySet a_con (const LPFuzzySet& pSet); + /* 3.79 */ static LPFuzzySet a_dil (const LPFuzzySet& pSet); - static LPRDOLingvoVariable fuzzyfication (const RDOValue&, const LPRDOLingvoVariable&); - /* 3.272*/ static RDOValue defuzzyfication(const LPFuzzySet& pSet); + static LPRDOLingvoVariable fuzzyfication (const RDOValue&, const LPRDOLingvoVariable&); + /* 3.272*/ static RDOValue defuzzyfication(const LPFuzzySet& pSet); - static LPFuzzySet a_pow (LPFuzzySet pSet, double power); - /* 3.114*/ static LPFuzzySet ext_unary (ExtUnaryFun fun, const LPFuzzySet& pSet); - /* 3.114*/ static LPFuzzySet ext_unary (ExtUnaryFunP fun, void* pParam, const LPFuzzySet& pSet); - /* 3.83 */ static LPFuzzySet ext_binary(ExtBinaryFun fun, const LPFuzzySet& pSet1, const LPFuzzySet& pSet2); + static LPFuzzySet a_pow (LPFuzzySet pSet, double power); + /* 3.114*/ static LPFuzzySet ext_unary (ExtUnaryFun fun, const LPFuzzySet& pSet); + /* 3.114*/ static LPFuzzySet ext_unary (ExtUnaryFunP fun, void* pParam, const LPFuzzySet& pSet); + /* 3.83 */ static LPFuzzySet ext_binary(ExtBinaryFun fun, const LPFuzzySet& pSet1, const LPFuzzySet& pSet2); }; // ! Терм @@ -116,17 +112,17 @@ class RDOFuzzyTerm: public rdo::counter_reference { DECLARE_FACTORY (RDOFuzzyTerm) public: - typedef std::string termName; - typedef std::pair Term; + typedef std::string termName; + typedef std::pair Term; - const LPFuzzySet& getFuzzySetDefinition() const; - termName getName () const; + const LPFuzzySet& getFuzzySetDefinition() const; + termName getName () const; private: - RDOFuzzyTerm(const termName&, const LPFuzzySet&); - virtual ~RDOFuzzyTerm(); + RDOFuzzyTerm(const termName&, const LPFuzzySet&); + virtual ~RDOFuzzyTerm(); - Term m_term; + Term m_term; }; // !Лингвистическая переменная @@ -136,26 +132,26 @@ class RDOLingvoVariable: public rdo::counter_reference { DECLARE_FACTORY(RDOLingvoVariable) public: - typedef std::map TermSet; - typedef std::string nameOfVariable; + typedef std::map TermSet; + typedef std::string nameOfVariable; - TermSet::const_iterator begin() const; - TermSet::const_iterator end() const; + TermSet::const_iterator begin() const; + TermSet::const_iterator end() const; - LPFuzzySet& operator[] (std::string name); + LPFuzzySet& operator[] (std::string name); - void setName(nameOfVariable); - nameOfVariable getName() {return m_name;}; - void append(std::string name, const LPFuzzySet& fuzzySet); + void setName(nameOfVariable); + nameOfVariable getName() {return m_name;}; + void append(std::string name, const LPFuzzySet& fuzzySet); private: - TermSet m_set; - nameOfVariable m_name; + TermSet m_set; + nameOfVariable m_name; - RDOLingvoVariable(const LPRDOFuzzyTerm& term, nameOfVariable nameOfVariable); - RDOLingvoVariable(const RDOValue& pDefineAreaValue, const LPRDOLingvoVariable& variable); - RDOLingvoVariable(const RDOLingvoVariable&); // KK - virtual ~RDOLingvoVariable(); + RDOLingvoVariable(const LPRDOFuzzyTerm& term, nameOfVariable nameOfVariable); + RDOLingvoVariable(const RDOValue& pDefineAreaValue, const LPRDOLingvoVariable& variable); + RDOLingvoVariable(const RDOLingvoVariable&); // KK + virtual ~RDOLingvoVariable(); }; PREDECLARE_POINTER(Statement); @@ -163,16 +159,14 @@ class Statement: public rdo::counter_reference { DECLARE_FACTORY(Statement) public: - void setTerm(LPRDOFuzzyTerm term); - void setVariable(LPRDOLingvoVariable variable); + void setTerm(LPRDOFuzzyTerm term); + void setVariable(LPRDOLingvoVariable variable); private: - LPRDOLingvoVariable m_variable; - LPRDOFuzzyTerm m_term; - Statement(); - ~Statement(); + LPRDOLingvoVariable m_variable; + LPRDOFuzzyTerm m_term; + Statement(); + ~Statement(); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_FUZZY_H_ diff --git a/simulator/runtime/rdo_keyboard.cpp b/simulator/runtime/rdo_keyboard.cpp index e4e7b2d81..4cd7f7ca0 100644 --- a/simulator/runtime/rdo_keyboard.cpp +++ b/simulator/runtime/rdo_keyboard.cpp @@ -6,9 +6,9 @@ // -------------------------------------------------------------------------------- #ifndef COMPILER_VISUAL_STUDIO - //! @todo А что на самом деле делать под линухами ? - const std::size_t VK_SHIFT = 0x10; - const std::size_t VK_CONTROL = 0x11; + // TODO А что на самом деле делать под линухами ? + const std::size_t VK_SHIFT = 0x10; + const std::size_t VK_CONTROL = 0x11; #endif OPEN_RDO_RUNTIME_NAMESPACE @@ -17,17 +17,17 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOKeyboard // -------------------------------------------------------------------------------- RDOKeyboard::RDOKeyboard(const LPRDORuntime& pRuntime, RDOPatternKeyboard* pattern, bool trace, const std::string& name) - : RDOOperation(pRuntime, pattern, trace, name) - , m_shift (false ) - , m_control (false ) - , m_scan_code (RDOHotKey::UNDEFINED_KEY ) + : RDOOperation(pRuntime, pattern, trace, name) + , m_shift (false ) + , m_control (false ) + , m_scan_code (RDOHotKey::UNDEFINED_KEY ) {} RDOKeyboard::RDOKeyboard(const LPRDORuntime& pRuntime, RDOPatternKeyboard* pattern, bool trace, const LPRDOCalc& pCondition, const std::string& name) - : RDOOperation(pRuntime, pattern, trace, pCondition, name) - , m_shift (false ) - , m_control (false ) - , m_scan_code (RDOHotKey::UNDEFINED_KEY ) + : RDOOperation(pRuntime, pattern, trace, pCondition, name) + , m_shift (false ) + , m_control (false ) + , m_scan_code (RDOHotKey::UNDEFINED_KEY ) {} RDOKeyboard::~RDOKeyboard() @@ -35,47 +35,47 @@ RDOKeyboard::~RDOKeyboard() bool RDOKeyboard::hasHotKey() const { - return m_scan_code != std::size_t(-1) ? true : false; + return m_scan_code != std::size_t(-1) ? true : false; } IKeyboard::AddHotKeyResult RDOKeyboard::addHotKey(const LPRDORuntime& pRuntime, const std::string& hotKey) { - RDOHotKey::KeyCode scanCode = pRuntime->hotkey().toolkit().codeFromString(hotKey); - if (scanCode == RDOHotKey::UNDEFINED_KEY) - return IKeyboard::addhk_notfound; - if (m_scan_code != RDOHotKey::UNDEFINED_KEY && scanCode != VK_SHIFT && scanCode != VK_CONTROL) - return IKeyboard::addhk_already; - switch (scanCode) - { - case VK_SHIFT: - m_shift = true; - pRuntime->hotkey().keyInModel().insert(VK_SHIFT); - break; - case VK_CONTROL: - m_control = true; - pRuntime->hotkey().keyInModel().insert(VK_CONTROL); - break; - default: - m_scan_code = scanCode; - if (m_scan_code) - { - pRuntime->hotkey().keyInModel().insert(scanCode); - } - break; - } - return IKeyboard::addhk_ok; + RDOHotKey::KeyCode scanCode = pRuntime->hotkey().toolkit().codeFromString(hotKey); + if (scanCode == RDOHotKey::UNDEFINED_KEY) + return IKeyboard::AddHotKeyResult::NOTFOUND; + if (m_scan_code != RDOHotKey::UNDEFINED_KEY && scanCode != VK_SHIFT && scanCode != VK_CONTROL) + return IKeyboard::AddHotKeyResult::ALREADY; + switch (scanCode) + { + case VK_SHIFT: + m_shift = true; + pRuntime->hotkey().keyInModel().insert(VK_SHIFT); + break; + case VK_CONTROL: + m_control = true; + pRuntime->hotkey().keyInModel().insert(VK_CONTROL); + break; + default: + m_scan_code = scanCode; + if (m_scan_code) + { + pRuntime->hotkey().keyInModel().insert(scanCode); + } + break; + } + return IKeyboard::AddHotKeyResult::OK; } bool RDOKeyboard::choiceFrom(const LPRDORuntime& pRuntime) { - pRuntime->setCurrentActivity(this); + pRuntime->setCurrentActivity(this); - if (!pRuntime->hotkey().areaList().check(m_oprName)) - { - if (!pRuntime->hotkey().keyDown().isPressed(m_scan_code, m_shift, m_control)) - return false; - } - return RDOOperation::choiceFrom(pRuntime); + if (!pRuntime->hotkey().areaList().check(m_oprName)) + { + if (!pRuntime->hotkey().keyDown().isPressed(m_scan_code, m_shift, m_control)) + return false; + } + return RDOOperation::choiceFrom(pRuntime); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_keyboard.h b/simulator/runtime/rdo_keyboard.h index d2dccb901..a20a42102 100644 --- a/simulator/runtime/rdo_keyboard.h +++ b/simulator/runtime/rdo_keyboard.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_KEYBOARD_H_ -#define _LIB_RUNTIME_KEYBOARD_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,19 +12,17 @@ class RDOKeyboard: public RDOOperation, public IKeyboard { DECLARE_FACTORY(RDOKeyboard); private: - RDOKeyboard(const LPRDORuntime& pRuntime, RDOPatternKeyboard* pattern, bool trace, const std::string& name); - RDOKeyboard(const LPRDORuntime& pRuntime, RDOPatternKeyboard* pattern, bool trace, const LPRDOCalc& pCondition, const std::string& name); - virtual ~RDOKeyboard(); + RDOKeyboard(const LPRDORuntime& pRuntime, RDOPatternKeyboard* pattern, bool trace, const std::string& name); + RDOKeyboard(const LPRDORuntime& pRuntime, RDOPatternKeyboard* pattern, bool trace, const LPRDOCalc& pCondition, const std::string& name); + virtual ~RDOKeyboard(); - bool m_shift; - bool m_control; - std::size_t m_scan_code; + bool m_shift; + bool m_control; + std::size_t m_scan_code; - virtual bool choiceFrom(const LPRDORuntime& pRuntime); + virtual bool choiceFrom(const LPRDORuntime& pRuntime); - DECLARE_IKeyboard; + DECLARE_IKeyboard; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_KEYBOARD_H_ diff --git a/simulator/runtime/rdo_keyboard_i.h b/simulator/runtime/rdo_keyboard_i.h index ff3374b9a..838c367e6 100644 --- a/simulator/runtime/rdo_keyboard_i.h +++ b/simulator/runtime/rdo_keyboard_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_KEYBOARD_I_H_ -#define _LIB_RUNTIME_KEYBOARD_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,21 +15,18 @@ CLOSE_RDO_RUNTIME_NAMESPACE class IKeyboard: public virtual rdo::counter_reference { public: - //! Статуc нажатия клавиши - enum AddHotKeyResult - { - addhk_ok, //!< клавиша нажата - addhk_already, //!< клавиша уже нажата - addhk_notfound, //!< клавиша не найдена - addhk_dont //!< клавиша не нажата - }; - virtual bool hasHotKey() const = 0; - virtual AddHotKeyResult addHotKey(const rdo::runtime::LPRDORuntime& pRuntime, const std::string& hotKey) = 0; + enum class AddHotKeyResult + { + OK, + ALREADY, + NOTFOUND, + DONT + }; + virtual bool hasHotKey() const = 0; + virtual AddHotKeyResult addHotKey(const rdo::runtime::LPRDORuntime& pRuntime, const std::string& hotKey) = 0; }; DECLARE_POINTER(IKeyboard) #define DECLARE_IKeyboard \ - virtual bool hasHotKey() const; \ - virtual AddHotKeyResult addHotKey(const rdo::runtime::LPRDORuntime& pRuntime, const std::string& hotKey); - -#endif // _LIB_RUNTIME_KEYBOARD_I_H_ + virtual bool hasHotKey() const; \ + virtual AddHotKeyResult addHotKey(const rdo::runtime::LPRDORuntime& pRuntime, const std::string& hotKey); diff --git a/simulator/runtime/rdo_logic-inl.h b/simulator/runtime/rdo_logic-inl.h index 2a2173cb1..885323660 100644 --- a/simulator/runtime/rdo_logic-inl.h +++ b/simulator/runtime/rdo_logic-inl.h @@ -2,7 +2,7 @@ #include "utils/src/common/platform.h" // ----------------------------------------------------------------------- INCLUDES #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable : 4786) + #pragma warning(disable : 4786) #endif // COMPILER_VISUAL_STUDIO // ----------------------------------------------------------------------- SYNOPSIS #include "simulator/runtime/rdo_runtime.h" @@ -15,11 +15,11 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- template inline RDOLogic::RDOLogic(const LPRDORuntime& pRuntime, LPIBaseOperationContainer pParent) - : m_pCondition (NULL ) - , m_lastCondition (false) - , m_pFirst (NULL ) - , m_pParent (pParent ? pParent : (pRuntime ? pRuntime->m_pMetaLogic : LPIBaseOperationContainer(NULL))) - , m_multithreading(false) + : m_pCondition (NULL ) + , m_lastCondition (false) + , m_pFirst (NULL ) + , m_pParent (pParent ? pParent : (pRuntime ? pRuntime->m_pMetaLogic : LPIBaseOperationContainer(NULL))) + , m_multithreading(false) {} template @@ -29,168 +29,168 @@ inline RDOLogic::~RDOLogic() template inline void RDOLogic::init(const LPRDORuntime& pRuntime) { - if (pRuntime) - { - pRuntime->appendLogic(this, m_pParent); - } + if (pRuntime) + { + pRuntime->appendLogic(this, m_pParent); + } } template inline void RDOLogic::setCondition(const LPRDOCalc& pCondition) { - m_pCondition = pCondition; + m_pCondition = pCondition; } template inline void RDOLogic::setMultithreading(bool multithreading) { - m_multithreading = multithreading; + m_multithreading = multithreading; } template inline void RDOLogic::onStart(const LPRDORuntime& pRuntime) { - m_lastCondition = checkSelfCondition(pRuntime); - if (m_lastCondition) - { - start(pRuntime); - } + m_lastCondition = checkSelfCondition(pRuntime); + if (m_lastCondition) + { + start(pRuntime); + } } template inline void RDOLogic::onStop(const LPRDORuntime& pRuntime) { - m_lastCondition = false; - stop(pRuntime); + m_lastCondition = false; + stop(pRuntime); } template inline bool RDOLogic::onCheckCondition(const LPRDORuntime& pRuntime) { - bool condition = checkSelfCondition(pRuntime); - if (condition != m_lastCondition) - { - m_lastCondition = condition; - if (condition) - { - start(pRuntime); - } - else - { - stop(pRuntime); - } - } + bool condition = checkSelfCondition(pRuntime); + if (condition != m_lastCondition) + { + m_lastCondition = condition; + if (condition) + { + start(pRuntime); + } + else + { + stop(pRuntime); + } + } - if (!condition) - return false; + if (!condition) + return false; - m_pFirst = Order::sort(pRuntime, m_childList); - return m_pFirst ? true : false; + m_pFirst = Order::sort(pRuntime, m_childList); + return m_pFirst ? true : false; } template -inline IBaseOperation::BOResult RDOLogic::onDoOperation(const LPRDORuntime& pRuntime) +inline IBaseOperation::ResultCode RDOLogic::onDoOperation(const LPRDORuntime& pRuntime) { - if (m_lastCondition) - { - if (!m_pFirst) - return IBaseOperation::BOR_cant_run; + if (m_lastCondition) + { + if (!m_pFirst) + return IBaseOperation::ResultCode::CANNOT_RUN; - IBaseOperation::BOResult result = m_pFirst->onDoOperation(pRuntime); - if (result == IBaseOperation::BOR_must_continue) - pRuntime->setMustContinueOpr(m_pFirst); + IBaseOperation::ResultCode result = m_pFirst->onDoOperation(pRuntime); + if (result == IBaseOperation::ResultCode::MUST_CONTINUE) + pRuntime->setMustContinueOpr(m_pFirst); - return result; - } - else - { - return IBaseOperation::BOR_cant_run; - } + return result; + } + else + { + return IBaseOperation::ResultCode::CANNOT_RUN; + } } template -inline IBaseOperation::BOResult RDOLogic::onContinue(const LPRDORuntime& pRuntime) +inline IBaseOperation::ResultCode RDOLogic::onContinue(const LPRDORuntime& pRuntime) { - for(ChildList::iterator it = m_childList.begin(); it != m_childList.end(); ++it) - { - if ((*it)->onContinue(pRuntime) == IBaseOperation::BOR_must_continue) - return IBaseOperation::BOR_must_continue; - } - return IBaseOperation::BOR_cant_run; + for(ChildList::iterator it = m_childList.begin(); it != m_childList.end(); ++it) + { + if ((*it)->onContinue(pRuntime) == IBaseOperation::ResultCode::MUST_CONTINUE) + return IBaseOperation::ResultCode::MUST_CONTINUE; + } + return IBaseOperation::ResultCode::CANNOT_RUN; } template inline bool RDOLogic::checkSelfCondition(const LPRDORuntime& pRuntime) { - return m_pCondition - ? m_pCondition->calcValue(pRuntime).getAsBool() - : true; + return m_pCondition + ? m_pCondition->calcValue(pRuntime).getAsBool() + : true; } template inline void RDOLogic::start(const LPRDORuntime& pRuntime) { - for(ChildList::iterator it = m_childList.begin(); it != m_childList.end(); ++it) - { - (*it)->onStart(pRuntime); - } + for(ChildList::iterator it = m_childList.begin(); it != m_childList.end(); ++it) + { + (*it)->onStart(pRuntime); + } } template inline void RDOLogic::stop(const LPRDORuntime& pRuntime) { - for(ChildList::iterator it = m_childList.begin(); it != m_childList.end(); ++it) - { - (*it)->onStop(pRuntime); - } + for(ChildList::iterator it = m_childList.begin(); it != m_childList.end(); ++it) + { + (*it)->onStop(pRuntime); + } } template inline bool RDOLogic::empty() const { - return m_childList.empty(); + return m_childList.empty(); } template inline typename RDOLogic::Iterator RDOLogic::begin() { - return m_childList.begin(); + return m_childList.begin(); } template inline typename RDOLogic::Iterator RDOLogic::end() { - return m_childList.end(); + return m_childList.end(); } template inline typename RDOLogic::CIterator RDOLogic::begin() const { - return m_childList.begin(); + return m_childList.begin(); } template inline typename RDOLogic::CIterator RDOLogic::end() const { - return m_childList.end(); + return m_childList.end(); } template inline LPIBaseOperation& RDOLogic::back() { - return m_childList.back(); + return m_childList.back(); } template inline void RDOLogic::append(const Item& item) { - m_childList.push_back(item); + m_childList.push_back(item); } template inline void RDOLogic::clear() { - m_childList.clear(); + m_childList.clear(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_logic.cpp b/simulator/runtime/rdo_logic.cpp index 7676408b3..ae9294d51 100644 --- a/simulator/runtime/rdo_logic.cpp +++ b/simulator/runtime/rdo_logic.cpp @@ -8,21 +8,21 @@ OPEN_RDO_RUNTIME_NAMESPACE -/// @todo не стоит ли здесь перейти на функторы? +// TODO не стоит ли здесь перейти на функторы? // -------------------------------------------------------------------------------- // -------------------- RDOOrderSimple // -------------------------------------------------------------------------------- LPIBaseOperation RDOOrderSimple::sort(const LPRDORuntime& pRuntime, BaseOperationList& container) { - for (auto& operation: container) - { - if (operation->onCheckCondition(pRuntime)) - { - return operation; - } - } - return NULL; + for (auto& operation: container) + { + if (operation->onCheckCondition(pRuntime)) + { + return operation; + } + } + return NULL; } // -------------------------------------------------------------------------------- @@ -30,34 +30,34 @@ LPIBaseOperation RDOOrderSimple::sort(const LPRDORuntime& pRuntime, BaseOperatio // -------------------------------------------------------------------------------- LPIBaseOperation RDOOrderMeta::sort(const LPRDORuntime& pRuntime, BaseOperationList& container) { - if (container.empty()) - return NULL; + if (container.empty()) + return NULL; - for (const auto& operation: container) - { - LPIPriority pPattern = operation.object_dynamic_cast(); - if (pPattern) - { - LPRDOCalc pPriorCalc = pPattern->getPrior(); - if (pPriorCalc) - { - RDOValue value = pPriorCalc->calcValue(pRuntime); - if (value < 0.0 || value > 1.0) - { - pRuntime->error().push(rdo::format("Приоритет активности вышел за пределы диапазона [0..1]: %s", value.getAsString().c_str()), pPriorCalc->srcInfo()); - } - } - } - } - std::sort(container.begin(), container.end(), RDODPTActivityCompare(pRuntime)); - for (auto& operation: container) - { - if (operation->onCheckCondition(pRuntime)) - { - return operation; - } - } - return NULL; + for (const auto& operation: container) + { + LPIPriority pPattern = operation.object_dynamic_cast(); + if (pPattern) + { + LPRDOCalc pPriorCalc = pPattern->getPrior(); + if (pPriorCalc) + { + RDOValue value = pPriorCalc->calcValue(pRuntime); + if (value < 0.0 || value > 1.0) + { + pRuntime->error().push(rdo::format("Приоритет активности вышел за пределы диапазона [0..1]: %s", value.getAsString().c_str()), pPriorCalc->srcInfo()); + } + } + } + } + std::sort(container.begin(), container.end(), RDODPTActivityCompare(pRuntime)); + for (auto& operation: container) + { + if (operation->onCheckCondition(pRuntime)) + { + return operation; + } + } + return NULL; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_logic.h b/simulator/runtime/rdo_logic.h index aa6a1195f..fb807c234 100644 --- a/simulator/runtime/rdo_logic.h +++ b/simulator/runtime/rdo_logic.h @@ -1,11 +1,10 @@ -#ifndef _LIB_RUNTIME_LOGIC_H_ -#define _LIB_RUNTIME_LOGIC_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM #include "utils/src/common/platform.h" // ----------------------------------------------------------------------- INCLUDES #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable : 4786) + #pragma warning(disable : 4786) #endif // ----------------------------------------------------------------------- SYNOPSIS #include "simulator/runtime/rdo.h" @@ -18,67 +17,65 @@ template class RDOLogic: public IBaseOperation, public IBaseOperationContainer, public ILogic { public: - typedef BaseOperationList ChildList; - typedef BaseOperationList::iterator Iterator; - typedef BaseOperationList::const_iterator CIterator; + typedef BaseOperationList ChildList; + typedef BaseOperationList::iterator Iterator; + typedef BaseOperationList::const_iterator CIterator; protected: - RDOLogic(const LPRDORuntime& pRuntime, LPIBaseOperationContainer pParent = NULL); - virtual ~RDOLogic(); + RDOLogic(const LPRDORuntime& pRuntime, LPIBaseOperationContainer pParent = NULL); + virtual ~RDOLogic(); - DECLARE_IBaseOperationContainer; + DECLARE_IBaseOperationContainer; - LPRDOCalc m_pCondition; - bool m_lastCondition; - ChildList m_childList; - LPIBaseOperation m_pFirst; - LPIBaseOperationContainer m_pParent; - bool m_multithreading; + LPRDOCalc m_pCondition; + bool m_lastCondition; + ChildList m_childList; + LPIBaseOperation m_pFirst; + LPIBaseOperationContainer m_pParent; + bool m_multithreading; private: - bool checkSelfCondition(const LPRDORuntime& pRuntime); - void start(const LPRDORuntime& pRuntime); - void stop(const LPRDORuntime& pRuntime); + bool checkSelfCondition(const LPRDORuntime& pRuntime); + void start(const LPRDORuntime& pRuntime); + void stop(const LPRDORuntime& pRuntime); - DECLARE_IBaseOperation; - DECLARE_ILogic; + DECLARE_IBaseOperation; + DECLARE_ILogic; }; class RDOOrderSimple { public: - static LPIBaseOperation sort(const LPRDORuntime& pRuntime, BaseOperationList& container); + static LPIBaseOperation sort(const LPRDORuntime& pRuntime, BaseOperationList& container); }; class RDOOrderMeta { public: - static LPIBaseOperation sort(const LPRDORuntime& pRuntime, BaseOperationList& container); + static LPIBaseOperation sort(const LPRDORuntime& pRuntime, BaseOperationList& container); }; class RDOLogicSimple: public RDOLogic { protected: - RDOLogicSimple(const LPRDORuntime& pRuntime, LPIBaseOperationContainer pParent) - : RDOLogic(pRuntime, pParent) - {} - virtual ~RDOLogicSimple() - {} + RDOLogicSimple(const LPRDORuntime& pRuntime, LPIBaseOperationContainer pParent) + : RDOLogic(pRuntime, pParent) + {} + virtual ~RDOLogicSimple() + {} }; class RDOLogicMeta: public RDOLogic { DECLARE_FACTORY(RDOLogicMeta); protected: - RDOLogicMeta() - : RDOLogic(NULL) - {} - virtual ~RDOLogicMeta() - {} + RDOLogicMeta() + : RDOLogic(NULL) + {} + virtual ~RDOLogicMeta() + {} }; CLOSE_RDO_RUNTIME_NAMESPACE #include "simulator/runtime/rdo_logic-inl.h" - -#endif // _LIB_RUNTIME_LOGIC_H_ diff --git a/simulator/runtime/rdo_logic_dptprior.cpp b/simulator/runtime/rdo_logic_dptprior.cpp index 1ed9fda4c..f133e8f76 100644 --- a/simulator/runtime/rdo_logic_dptprior.cpp +++ b/simulator/runtime/rdo_logic_dptprior.cpp @@ -12,45 +12,45 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- LPIBaseOperation RDOOrderDPTPrior::sort(const LPRDORuntime& pRuntime, BaseOperationList& container) { - BaseOperationList priorContainer; - for (const auto& operation: container) - { - if (operation.object_dynamic_cast()->onCheckCondition(pRuntime)) - { - priorContainer.push_back(operation); - } - } + BaseOperationList priorContainer; + for (const auto& operation: container) + { + if (operation.object_dynamic_cast()->onCheckCondition(pRuntime)) + { + priorContainer.push_back(operation); + } + } - if (priorContainer.empty()) - return NULL; + if (priorContainer.empty()) + return NULL; - for (const auto& operation: container) - { - LPIPriority pPattern = operation.object_dynamic_cast(); - if (pPattern) - { - LPRDOCalc pPriorCalc = pPattern->getPrior(); - if (pPriorCalc) - { - RDOValue value = pPriorCalc->calcValue(pRuntime); - if (value < 0.0 || value > 1.0) - { - pRuntime->error().push(rdo::format("Приоритет активности вышел за пределы диапазона [0..1]: %s", value.getAsString().c_str()), pPriorCalc->srcInfo()); - } - } - } - } - std::sort(priorContainer.begin(), priorContainer.end(), RDODPTActivityCompare(pRuntime)); - return priorContainer.front(); + for (const auto& operation: container) + { + LPIPriority pPattern = operation.object_dynamic_cast(); + if (pPattern) + { + LPRDOCalc pPriorCalc = pPattern->getPrior(); + if (pPriorCalc) + { + RDOValue value = pPriorCalc->calcValue(pRuntime); + if (value < 0.0 || value > 1.0) + { + pRuntime->error().push(rdo::format("Приоритет активности вышел за пределы диапазона [0..1]: %s", value.getAsString().c_str()), pPriorCalc->srcInfo()); + } + } + } + } + std::sort(priorContainer.begin(), priorContainer.end(), RDODPTActivityCompare(pRuntime)); + return priorContainer.front(); } // -------------------------------------------------------------------------------- // -------------------- RDODPTPrior // -------------------------------------------------------------------------------- RDODPTPrior::RDODPTPrior(const LPRDORuntime& pRuntime, LPIBaseOperationContainer pParent) - : RDOLogicDPTPrior(pRuntime, pParent) + : RDOLogicDPTPrior(pRuntime, pParent) { - pRuntime->getFreeDPTId(); + pRuntime->getFreeDPTId(); } RDODPTPrior::~RDODPTPrior() diff --git a/simulator/runtime/rdo_logic_dptprior.h b/simulator/runtime/rdo_logic_dptprior.h index bb4234966..91cad3d9b 100644 --- a/simulator/runtime/rdo_logic_dptprior.h +++ b/simulator/runtime/rdo_logic_dptprior.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_LOGIC_DPTPRIOR_H_ -#define _LIB_RUNTIME_LOGIC_DPTPRIOR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -12,27 +11,25 @@ OPEN_RDO_RUNTIME_NAMESPACE class RDOOrderDPTPrior { public: - static LPIBaseOperation sort(const LPRDORuntime& pRuntime, BaseOperationList& container); + static LPIBaseOperation sort(const LPRDORuntime& pRuntime, BaseOperationList& container); }; class RDOLogicDPTPrior: public RDOLogic { protected: - RDOLogicDPTPrior(const LPRDORuntime& pRuntime, LPIBaseOperationContainer parent) - : RDOLogic(pRuntime, parent) - {} - virtual ~RDOLogicDPTPrior() - {} + RDOLogicDPTPrior(const LPRDORuntime& pRuntime, LPIBaseOperationContainer parent) + : RDOLogic(pRuntime, parent) + {} + virtual ~RDOLogicDPTPrior() + {} }; class RDODPTPrior: public RDOLogicDPTPrior, public RDOPatternPrior { DECLARE_FACTORY(RDODPTPrior); private: - RDODPTPrior(const LPRDORuntime& pRuntime, LPIBaseOperationContainer pParent = NULL); - virtual ~RDODPTPrior(); + RDODPTPrior(const LPRDORuntime& pRuntime, LPIBaseOperationContainer pParent = NULL); + virtual ~RDODPTPrior(); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_LOGIC_DPTPRIOR_H_ diff --git a/simulator/runtime/rdo_logic_dptsearch.cpp b/simulator/runtime/rdo_logic_dptsearch.cpp index 395691879..e5b40c737 100644 --- a/simulator/runtime/rdo_logic_dptsearch.cpp +++ b/simulator/runtime/rdo_logic_dptsearch.cpp @@ -13,9 +13,9 @@ #ifndef COMPILER_VISUAL_STUDIO uint32_t GetTickCount() { - struct timeval tv; - gettimeofday(&tv,NULL); - return (tv.tv_sec * 1000 + tv.tv_usec / 1000); + struct timeval tv; + gettimeofday(&tv,NULL); + return (tv.tv_sec * 1000 + tv.tv_usec / 1000); } #endif @@ -25,85 +25,85 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDODPTSearch // -------------------------------------------------------------------------------- RDODPTSearch::RDODPTSearch(const LPRDORuntime& pRuntime, LPIBaseOperationContainer pParent) - : RDOLogicSimple(pRuntime, pParent) - , treeRoot (NULL) + : RDOLogicSimple(pRuntime, pParent) + , treeRoot (NULL) {} RDODPTSearch::~RDODPTSearch() {} -IBaseOperation::BOResult RDODPTSearch::onDoOperation(const LPRDORuntime& pRuntime) +IBaseOperation::ResultCode RDODPTSearch::onDoOperation(const LPRDORuntime& pRuntime) { - // Начало поиска: вывели трасировку, обновили статистику - onSearchBegin(pRuntime); - treeRoot = createTreeRoot(pRuntime); - treeRoot->createRootTreeNode(pRuntime->clone()); + // Начало поиска: вывели трасировку, обновили статистику + onSearchBegin(pRuntime); + treeRoot = createTreeRoot(pRuntime); + treeRoot->createRootTreeNode(pRuntime->clone()); - return onContinue(pRuntime); + return onContinue(pRuntime); } -IBaseOperation::BOResult RDODPTSearch::onContinue(const LPRDORuntime& /*pRuntime*/) +IBaseOperation::ResultCode RDODPTSearch::onContinue(const LPRDORuntime& /*pRuntime*/) { - uint32_t time_begin = ::GetTickCount(); - for (;;) - { - // Возмем для раскрытия первую вершину из списка OPEN - TreeNode* curr = *(treeRoot->m_OPEN.begin()); - curr->ExpandChildren(); - if (treeRoot->m_OPEN.empty() || treeRoot->m_targetNode) break; + uint32_t time_begin = ::GetTickCount(); + for (;;) + { + // Возмем для раскрытия первую вершину из списка OPEN + TreeNode* curr = *(treeRoot->m_OPEN.begin()); + curr->ExpandChildren(); + if (treeRoot->m_OPEN.empty() || treeRoot->m_targetNode) break; - uint32_t time_current = ::GetTickCount(); - if (time_current - time_begin > 1000 / 40) - { - return BOR_must_continue; - } - } + uint32_t time_current = ::GetTickCount(); + if (time_current - time_begin > 1000 / 40) + { + return ResultCode::MUST_CONTINUE; + } + } - bool success = treeRoot->m_targetNode ? true : false; - if (success) - { - // Нашли решение, собрали путь - std::list bestPath; -// TRACE( "решение... \n" ); - for (TreeNode* i = treeRoot->m_targetNode; i->m_parent; i = i->m_parent) - { + bool success = treeRoot->m_targetNode ? true : false; + if (success) + { + // Нашли решение, собрали путь + std::list bestPath; +// TRACE( "решение... \n" ); + for (TreeNode* i = treeRoot->m_targetNode; i->m_parent; i = i->m_parent) + { #ifdef _DEBUG - i->m_pRuntime->showResources(i->m_number); + i->m_pRuntime->showResources(i->m_number); #endif - bestPath.push_front(i); - } -// TRACE( "решение... done\n" ); - // Отработали предварительные действия: вывели трассировку - onSearchDecisionHeader(treeRoot->m_theRealSimulator); - // Отработали рулы - for (std::list::iterator ii = bestPath.begin(); ii != bestPath.end(); ++ii) - { - TreeNode* node = (*ii); - node->m_activity->rule()->onBeforeChoiceFrom(treeRoot->m_theRealSimulator); - node->m_activity->rule()->choiceFrom (treeRoot->m_theRealSimulator); - node->m_activity->rule()->onBeforeRule (treeRoot->m_theRealSimulator); - node->m_activity->rule()->convertRule (treeRoot->m_theRealSimulator); - node->m_activity->rule()->onAfterRule (treeRoot->m_theRealSimulator, true); - // Отработали каждую вершину: вывели трассировку - onSearchDecision(treeRoot->m_theRealSimulator, node); - } - // Отработали завершающие действия: вывели трассировку, обновили статистику по поиску - onSearchResultSuccess(treeRoot->m_theRealSimulator, treeRoot); - } - else - { - // Неудачное завершение поиска: вывели статистику - onSearchResultNotFound(treeRoot->m_theRealSimulator, treeRoot); - } - delete treeRoot->m_rootNode; - delete treeRoot; - treeRoot = NULL; - return success ? IBaseOperation::BOR_done : IBaseOperation::BOR_cant_run; + bestPath.push_front(i); + } +// TRACE( "решение... done\n" ); + // Отработали предварительные действия: вывели трассировку + onSearchDecisionHeader(treeRoot->m_theRealSimulator); + // Отработали рулы + for (std::list::iterator ii = bestPath.begin(); ii != bestPath.end(); ++ii) + { + TreeNode* node = (*ii); + node->m_activity->rule()->onBeforeChoiceFrom(treeRoot->m_theRealSimulator); + node->m_activity->rule()->choiceFrom (treeRoot->m_theRealSimulator); + node->m_activity->rule()->onBeforeRule (treeRoot->m_theRealSimulator); + node->m_activity->rule()->convertRule (treeRoot->m_theRealSimulator); + node->m_activity->rule()->onAfterRule (treeRoot->m_theRealSimulator, true); + // Отработали каждую вершину: вывели трассировку + onSearchDecision(treeRoot->m_theRealSimulator, node); + } + // Отработали завершающие действия: вывели трассировку, обновили статистику по поиску + onSearchResultSuccess(treeRoot->m_theRealSimulator, treeRoot); + } + else + { + // Неудачное завершение поиска: вывели статистику + onSearchResultNotFound(treeRoot->m_theRealSimulator, treeRoot); + } + delete treeRoot->m_rootNode; + delete treeRoot; + treeRoot = NULL; + return success ? IBaseOperation::ResultCode::DONE : IBaseOperation::ResultCode::CANNOT_RUN; } void RDODPTSearch::addActivity(LPIDPTSearchActivity activity) { - m_activityList.push_back(activity); + m_activityList.push_back(activity); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_logic_dptsearch.h b/simulator/runtime/rdo_logic_dptsearch.h index 6f1e07bf0..047569f63 100644 --- a/simulator/runtime/rdo_logic_dptsearch.h +++ b/simulator/runtime/rdo_logic_dptsearch.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_LOGIC_DPTSEARCH_H_ -#define _LIB_RUNTIME_LOGIC_DPTSEARCH_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -21,30 +20,28 @@ friend class RDOSimulator; friend class TreeNode; protected: - RDODPTSearch(const LPRDORuntime& pRuntime, LPIBaseOperationContainer pParent = NULL); - virtual ~RDODPTSearch(); - - typedef std::list ActivityList; - ActivityList m_activityList; - - virtual bool TermCondition (const LPRDORuntime& pRuntime) = 0; - virtual double EvaluateBy (const LPRDORuntime& pRuntime) = 0; - virtual void onSearchBegin (const LPRDORuntime& pRuntime) = 0; - virtual void onSearchDecisionHeader(const LPRDORuntime& pRuntime) = 0; - virtual void onSearchDecision (const LPRDORuntime& pRuntime, TreeNode* node ) = 0; - virtual void onSearchResultSuccess (const LPRDORuntime& pRuntime, TreeRoot* treeRoot ) = 0; - virtual void onSearchResultNotFound(const LPRDORuntime& pRuntime, TreeRoot* treeRoot ) = 0; - virtual bool NeedCompareTops () = 0; - virtual TreeRoot* createTreeRoot (const LPRDORuntime& pRuntime) = 0; - virtual BOResult onContinue (const LPRDORuntime& pRuntime); + RDODPTSearch(const LPRDORuntime& pRuntime, LPIBaseOperationContainer pParent = NULL); + virtual ~RDODPTSearch(); + + typedef std::list ActivityList; + ActivityList m_activityList; + + virtual bool TermCondition (const LPRDORuntime& pRuntime) = 0; + virtual double EvaluateBy (const LPRDORuntime& pRuntime) = 0; + virtual void onSearchBegin (const LPRDORuntime& pRuntime) = 0; + virtual void onSearchDecisionHeader(const LPRDORuntime& pRuntime) = 0; + virtual void onSearchDecision (const LPRDORuntime& pRuntime, TreeNode* node ) = 0; + virtual void onSearchResultSuccess (const LPRDORuntime& pRuntime, TreeRoot* treeRoot ) = 0; + virtual void onSearchResultNotFound(const LPRDORuntime& pRuntime, TreeRoot* treeRoot ) = 0; + virtual bool NeedCompareTops () = 0; + virtual TreeRoot* createTreeRoot (const LPRDORuntime& pRuntime) = 0; + virtual ResultCode onContinue (const LPRDORuntime& pRuntime); private: - TreeRoot* treeRoot; - virtual BOResult onDoOperation(const LPRDORuntime& pRuntime); + TreeRoot* treeRoot; + virtual ResultCode onDoOperation(const LPRDORuntime& pRuntime); - DECLARE_IDPTSearchLogic; + DECLARE_IDPTSearchLogic; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_LOGIC_DPTSEARCH_H_ diff --git a/simulator/runtime/rdo_logic_dptsearch_i.h b/simulator/runtime/rdo_logic_dptsearch_i.h index 4c80ec40f..3da988e04 100644 --- a/simulator/runtime/rdo_logic_dptsearch_i.h +++ b/simulator/runtime/rdo_logic_dptsearch_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_LOGIC_DPTSEARCH_I_H_ -#define _LIB_RUNTIME_LOGIC_DPTSEARCH_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,11 +8,9 @@ class IDPTSearchLogic: public virtual rdo::counter_reference { public: - virtual void addActivity(LPIDPTSearchActivity activity) = 0; + virtual void addActivity(LPIDPTSearchActivity activity) = 0; }; DECLARE_POINTER(IDPTSearchLogic) #define DECLARE_IDPTSearchLogic \ - virtual void addActivity(LPIDPTSearchActivity activity); - -#endif // _LIB_RUNTIME_LOGIC_DPTSEARCH_I_H_ + virtual void addActivity(LPIDPTSearchActivity activity); diff --git a/simulator/runtime/rdo_logic_dptsome.cpp b/simulator/runtime/rdo_logic_dptsome.cpp index 6fc45e0a1..9f861f79b 100644 --- a/simulator/runtime/rdo_logic_dptsome.cpp +++ b/simulator/runtime/rdo_logic_dptsome.cpp @@ -11,9 +11,9 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDODPTSome // -------------------------------------------------------------------------------- RDODPTSome::RDODPTSome(const LPRDORuntime& pRuntime, LPIBaseOperationContainer parent) - : RDOLogicSimple(pRuntime, parent) + : RDOLogicSimple(pRuntime, parent) { - pRuntime->getFreeDPTId(); + pRuntime->getFreeDPTId(); } RDODPTSome::~RDODPTSome() diff --git a/simulator/runtime/rdo_logic_dptsome.h b/simulator/runtime/rdo_logic_dptsome.h index 4a495bd3e..78d66482a 100644 --- a/simulator/runtime/rdo_logic_dptsome.h +++ b/simulator/runtime/rdo_logic_dptsome.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_LOGIC_DPTSOME_H_ -#define _LIB_RUNTIME_LOGIC_DPTSOME_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,10 +12,8 @@ class RDODPTSome: public RDOLogicSimple, public RDOPatternPrior { DECLARE_FACTORY(RDODPTSome); private: - RDODPTSome(const LPRDORuntime& pRuntime, LPIBaseOperationContainer parent = NULL); - virtual ~RDODPTSome(); + RDODPTSome(const LPRDORuntime& pRuntime, LPIBaseOperationContainer parent = NULL); + virtual ~RDODPTSome(); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_LOGIC_DPTSOME_H_ diff --git a/simulator/runtime/rdo_logic_i.h b/simulator/runtime/rdo_logic_i.h index 5cf42517b..b4634eab5 100644 --- a/simulator/runtime/rdo_logic_i.h +++ b/simulator/runtime/rdo_logic_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_LOGIC_I_H_ -#define _LIB_RUNTIME_LOGIC_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -15,44 +14,42 @@ CLOSE_RDO_RUNTIME_NAMESPACE class ILogic: public virtual rdo::counter_reference { public: - virtual void init (const rdo::runtime::LPRDORuntime& pRuntime ) = 0; - virtual void setCondition (const rdo::runtime::LPRDOCalc& pCondition ) = 0; - virtual void setMultithreading(bool multithreading) = 0; + virtual void init (const rdo::runtime::LPRDORuntime& pRuntime ) = 0; + virtual void setCondition (const rdo::runtime::LPRDOCalc& pCondition ) = 0; + virtual void setMultithreading(bool multithreading) = 0; }; DECLARE_POINTER(ILogic) #define DECLARE_ILogic \ - virtual void init (const rdo::runtime::LPRDORuntime& pRuntime ); \ - virtual void setCondition (const rdo::runtime::LPRDOCalc& pCondition ); \ - virtual void setMultithreading(bool multithreading); + virtual void init (const rdo::runtime::LPRDORuntime& pRuntime ); \ + virtual void setCondition (const rdo::runtime::LPRDOCalc& pCondition ); \ + virtual void setMultithreading(bool multithreading); class IBaseOperationContainer: public virtual rdo::counter_reference { public: - typedef LPIBaseOperation Item; - typedef std::vector List; - typedef List::iterator Iterator; - typedef List::const_iterator CIterator; - - virtual Iterator begin () = 0; - virtual Iterator end () = 0; - virtual CIterator begin () const = 0; - virtual CIterator end () const = 0; - virtual void append(const Item& item) = 0; - virtual bool empty () const = 0; - virtual LPIBaseOperation& back () = 0; - virtual void clear () = 0; + typedef LPIBaseOperation Item; + typedef std::vector List; + typedef List::iterator Iterator; + typedef List::const_iterator CIterator; + + virtual Iterator begin () = 0; + virtual Iterator end () = 0; + virtual CIterator begin () const = 0; + virtual CIterator end () const = 0; + virtual void append(const Item& item) = 0; + virtual bool empty () const = 0; + virtual LPIBaseOperation& back () = 0; + virtual void clear () = 0; }; DECLARE_POINTER(IBaseOperationContainer); #define DECLARE_IBaseOperationContainer \ - virtual Iterator begin (); \ - virtual Iterator end (); \ - virtual CIterator begin () const; \ - virtual CIterator end () const; \ - virtual void append(const Item& item); \ - virtual bool empty () const; \ - virtual LPIBaseOperation& back (); \ - virtual void clear (); - -#endif // _LIB_RUNTIME_LOGIC_I_H_ + virtual Iterator begin (); \ + virtual Iterator end (); \ + virtual CIterator begin () const; \ + virtual CIterator end () const; \ + virtual void append(const Item& item); \ + virtual bool empty () const; \ + virtual LPIBaseOperation& back (); \ + virtual void clear (); diff --git a/simulator/runtime/rdo_matrix.cpp b/simulator/runtime/rdo_matrix.cpp index 316050382..e69b37b7c 100644 --- a/simulator/runtime/rdo_matrix.cpp +++ b/simulator/runtime/rdo_matrix.cpp @@ -12,12 +12,12 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOMatrixValue // -------------------------------------------------------------------------------- RDOMatrixValue::RDOMatrixValue(const LPRDOMatrixType& pType) - : m_pMatrixType(pType) + : m_pMatrixType(pType) {} RDOMatrixValue::RDOMatrixValue(const LPRDOMatrixValue& pValue) - : m_container (pValue->m_container ) - , m_pMatrixType(pValue->m_pMatrixType) + : m_container (pValue->m_container ) + , m_pMatrixType(pValue->m_pMatrixType) {} RDOMatrixValue::~RDOMatrixValue() @@ -25,100 +25,100 @@ RDOMatrixValue::~RDOMatrixValue() const LPRDOMatrixType& RDOMatrixValue::type() const { - ASSERT(m_pMatrixType); - return m_pMatrixType; + ASSERT(m_pMatrixType); + return m_pMatrixType; } void RDOMatrixValue::push_back(const RDOValue& item) { - m_container.push_back(item); + m_container.push_back(item); } LPRDOMatrixIterator RDOMatrixValue::begin() { - return rdo::Factory::create(m_container.begin()); + return rdo::Factory::create(m_container.begin()); } LPRDOMatrixIterator RDOMatrixValue::end() { - return rdo::Factory::create(m_container.end()); + return rdo::Factory::create(m_container.end()); } void RDOMatrixValue::insert(const LPRDOMatrixIterator& pWhere, const LPRDOMatrixIterator& pFromFirst, const LPRDOMatrixIterator& pFromLast) { - ASSERT(pWhere ); - ASSERT(pFromFirst); - ASSERT(pFromLast ); + ASSERT(pWhere ); + ASSERT(pFromFirst); + ASSERT(pFromLast ); - m_container.insert(pWhere->getIterator(), pFromFirst->getIterator(), pFromLast->getIterator()); + m_container.insert(pWhere->getIterator(), pFromFirst->getIterator(), pFromLast->getIterator()); } void RDOMatrixValue::erase(const LPRDOMatrixIterator& pFirst, const LPRDOMatrixIterator& pLast) { - ASSERT(pFirst) - ASSERT(pLast ); + ASSERT(pFirst) + ASSERT(pLast ); - m_container.erase(pFirst->getIterator(), pLast->getIterator()); + m_container.erase(pFirst->getIterator(), pLast->getIterator()); } std::string RDOMatrixValue::asString() const { - std::string result("["); - for (Container::const_iterator item = m_container.begin(); item != m_container.end(); ++item) - { - if (item == m_container.begin()) - { - result = rdo::format("%s%s", result.c_str(), item->getAsString().c_str()); - } - else - { - result = rdo::format("%s, %s", result.c_str(), item->getAsString().c_str()); - } - } - return rdo::format("%s]", result.c_str()); + std::string result("["); + for (Container::const_iterator item = m_container.begin(); item != m_container.end(); ++item) + { + if (item == m_container.begin()) + { + result = rdo::format("%s%s", result.c_str(), item->getAsString().c_str()); + } + else + { + result = rdo::format("%s, %s", result.c_str(), item->getAsString().c_str()); + } + } + return rdo::format("%s]", result.c_str()); } std::size_t RDOMatrixValue::size() const { - return m_container.size(); + return m_container.size(); } const RDOValue& RDOMatrixValue::getItem(const RDOValue& index) const { - std::size_t ind = index.getUInt(); - if (ind >= m_container.size()) - { - throw RDORuntimeException("Выход за пределы матрицы"); - } - return m_container[ind]; + std::size_t ind = index.getUInt(); + if (ind >= m_container.size()) + { + throw RDORuntimeException("Выход за пределы матрицы"); + } + return m_container[ind]; } void RDOMatrixValue::setItem(const RDOValue& index, const RDOValue& item) { - std::size_t ind = index.getUInt(); - if (ind >= m_container.size()) - { - throw RDORuntimeException("Выход за пределы матрицы"); - } - m_container[ind] = item; + std::size_t ind = index.getUInt(); + if (ind >= m_container.size()) + { + throw RDORuntimeException("Выход за пределы матрицы"); + } + m_container[ind] = item; } // -------------------------------------------------------------------------------- // -------------------- RDOMatrixIterator // -------------------------------------------------------------------------------- RDOMatrixIterator::RDOMatrixIterator(const LPRDOMatrixIterator& pIterator) - : RDOType (RDOType::t_pointer ) - , m_iterator(pIterator->m_iterator) + : RDOType (RDOType::Type::POINTER ) + , m_iterator(pIterator->m_iterator) {} RDOMatrixIterator::RDOMatrixIterator(const RDOMatrixIterator& iterator) - : RDOType (RDOType::t_pointer ) - , m_iterator(iterator.m_iterator) + : RDOType (RDOType::Type::POINTER ) + , m_iterator(iterator.m_iterator) {} RDOMatrixIterator::RDOMatrixIterator(const Iterator& iterator) - : RDOType (RDOType::t_pointer) - , m_iterator(iterator ) + : RDOType (RDOType::Type::POINTER) + , m_iterator(iterator ) {} RDOMatrixIterator::~RDOMatrixIterator() @@ -126,55 +126,55 @@ RDOMatrixIterator::~RDOMatrixIterator() RDOMatrixIterator::Iterator RDOMatrixIterator::getIterator() const { - return m_iterator; + return m_iterator; } const RDOValue& RDOMatrixIterator::getValue() const { - return *m_iterator; + return *m_iterator; } LPRDOMatrixIterator RDOMatrixIterator::preInc(int delta) { - m_iterator += delta; - return LPRDOMatrixIterator(this); + m_iterator += delta; + return LPRDOMatrixIterator(this); } LPRDOMatrixIterator RDOMatrixIterator::postInc(int delta) { - LPRDOMatrixIterator pPrev = rdo::Factory::create(m_iterator); - ASSERT(pPrev); - m_iterator += delta; - return pPrev; + LPRDOMatrixIterator pPrev = rdo::Factory::create(m_iterator); + ASSERT(pPrev); + m_iterator += delta; + return pPrev; } LPRDOMatrixIterator RDOMatrixIterator::next() { - return preInc(1); + return preInc(1); } bool RDOMatrixIterator::equal(const LPRDOMatrixIterator& pIterator) const { - ASSERT(pIterator); - return m_iterator == pIterator->m_iterator; + ASSERT(pIterator); + return m_iterator == pIterator->m_iterator; } LPRDOMatrixIterator RDOMatrixIterator::clone() const { - return rdo::Factory::create(*this); + return rdo::Factory::create(*this); } std::string RDOMatrixIterator::asString() const { - return getValue().getAsString(); + return getValue().getAsString(); } // -------------------------------------------------------------------------------- // -------------------- RDOMatrixType // -------------------------------------------------------------------------------- RDOMatrixType::RDOMatrixType(const LPItemType& pItemType) - : RDOType (RDOType::t_pointer) - , m_pItemType(pItemType ) + : RDOType (RDOType::Type::POINTER) + , m_pItemType(pItemType ) {} RDOMatrixType::~RDOMatrixType() @@ -182,7 +182,7 @@ RDOMatrixType::~RDOMatrixType() const RDOMatrixType::LPItemType& RDOMatrixType::getItemType() const { - return m_pItemType; + return m_pItemType; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_matrix.h b/simulator/runtime/rdo_matrix.h index d2e733603..764a007cb 100644 --- a/simulator/runtime/rdo_matrix.h +++ b/simulator/runtime/rdo_matrix.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_MATRIX_H_ -#define _LIB_RUNTIME_MATRIX_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -16,81 +15,76 @@ OPEN_RDO_RUNTIME_NAMESPACE PREDECLARE_POINTER(RDOMatrixType ); PREDECLARE_POINTER(RDOMatrixIterator); -//! Элемент матрицы PREDECLARE_POINTER(RDOMatrixValue); class RDOMatrixValue: public IAsString { DECLARE_FACTORY(RDOMatrixValue) public: - typedef std::vector Container; + typedef std::vector Container; - const LPRDOMatrixType& type() const; + const LPRDOMatrixType& type() const; - void push_back(const RDOValue& item); - LPRDOMatrixIterator begin(); - LPRDOMatrixIterator end (); - void insert(const LPRDOMatrixIterator& pWhere, const LPRDOMatrixIterator& pFromFirst, const LPRDOMatrixIterator& pFromLast); - void erase(const LPRDOMatrixIterator& pFirst, const LPRDOMatrixIterator& pLast); + void push_back(const RDOValue& item); + LPRDOMatrixIterator begin(); + LPRDOMatrixIterator end (); + void insert(const LPRDOMatrixIterator& pWhere, const LPRDOMatrixIterator& pFromFirst, const LPRDOMatrixIterator& pFromLast); + void erase(const LPRDOMatrixIterator& pFirst, const LPRDOMatrixIterator& pLast); - std::size_t size() const; + std::size_t size() const; - const RDOValue& getItem(const RDOValue& index) const; - void setItem(const RDOValue& index, const RDOValue& item); + const RDOValue& getItem(const RDOValue& index) const; + void setItem(const RDOValue& index, const RDOValue& item); - DECLARE_IAsString; + DECLARE_IAsString; private: - RDOMatrixValue(const LPRDOMatrixType& pType ); - RDOMatrixValue(const LPRDOMatrixValue& pValue); - virtual ~RDOMatrixValue(); + RDOMatrixValue(const LPRDOMatrixType& pType ); + RDOMatrixValue(const LPRDOMatrixValue& pValue); + virtual ~RDOMatrixValue(); - Container m_container; - LPRDOMatrixType m_pMatrixType; + Container m_container; + LPRDOMatrixType m_pMatrixType; }; -//! Итератор матрицы class RDOMatrixIterator: public RDOType, public IAsString { DECLARE_FACTORY(RDOMatrixIterator) public: - typedef RDOMatrixValue::Container::iterator Iterator; + typedef RDOMatrixValue::Container::iterator Iterator; - Iterator getIterator() const; - const RDOValue& getValue () const; - LPRDOMatrixIterator preInc (int delta); - LPRDOMatrixIterator postInc (int delta); - LPRDOMatrixIterator next (); - bool equal (const LPRDOMatrixIterator& pIterator) const; - LPRDOMatrixIterator clone () const; + Iterator getIterator() const; + const RDOValue& getValue () const; + LPRDOMatrixIterator preInc (int delta); + LPRDOMatrixIterator postInc (int delta); + LPRDOMatrixIterator next (); + bool equal (const LPRDOMatrixIterator& pIterator) const; + LPRDOMatrixIterator clone () const; - DECLARE_IAsString; + DECLARE_IAsString; private: - RDOMatrixIterator(const LPRDOMatrixIterator& pIterator); - RDOMatrixIterator(const RDOMatrixIterator& iterator ); - RDOMatrixIterator(const Iterator& iterator ); - virtual ~RDOMatrixIterator(); + RDOMatrixIterator(const LPRDOMatrixIterator& pIterator); + RDOMatrixIterator(const RDOMatrixIterator& iterator ); + RDOMatrixIterator(const Iterator& iterator ); + virtual ~RDOMatrixIterator(); - Iterator m_iterator; + Iterator m_iterator; }; -//! Тип матрица class RDOMatrixType: public RDOType { DECLARE_FACTORY(RDOMatrixType); public: - typedef LPRDOType LPItemType; - typedef RDOMatrixValue value_type; + typedef LPRDOType LPItemType; + typedef RDOMatrixValue value_type; - const LPItemType& getItemType() const; + const LPItemType& getItemType() const; private: - RDOMatrixType(const LPItemType& pItemType); - virtual ~RDOMatrixType(); + RDOMatrixType(const LPItemType& pItemType); + virtual ~RDOMatrixType(); - LPItemType m_pItemType; + LPItemType m_pItemType; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_MATRIX_H_ diff --git a/simulator/runtime/rdo_memory.cpp b/simulator/runtime/rdo_memory.cpp index 3a26cd2f9..07d55bc04 100644 --- a/simulator/runtime/rdo_memory.cpp +++ b/simulator/runtime/rdo_memory.cpp @@ -14,30 +14,30 @@ RDOMemory::RDOMemory() void RDOMemory::createVariable(const std::string& name, const RDOValue& variable) { - std::pair result = - m_localMemory.insert(LocalMemory::value_type(name, variable)); + std::pair result = + m_localMemory.insert(LocalMemory::value_type(name, variable)); - ASSERT(result.second); - (void)result; + ASSERT(result.second); + (void)result; } RDOValue RDOMemory::getVariable(const std::string& name) const { - LocalMemory::const_iterator it = m_localMemory.find(name); - ASSERT(it != m_localMemory.end()); - return it->second; + LocalMemory::const_iterator it = m_localMemory.find(name); + ASSERT(it != m_localMemory.end()); + return it->second; } void RDOMemory::setVariable(const std::string& name, const RDOValue& variable) { - LocalMemory::iterator it = m_localMemory.find(name); - ASSERT(it != m_localMemory.end()); - it->second = variable; + LocalMemory::iterator it = m_localMemory.find(name); + ASSERT(it != m_localMemory.end()); + it->second = variable; } bool RDOMemory::findVariable(const std::string& name) const { - return m_localMemory.find(name) != m_localMemory.end(); + return m_localMemory.find(name) != m_localMemory.end(); } // -------------------------------------------------------------------------------- @@ -48,51 +48,51 @@ RDOMemoryStack::RDOMemoryStack() void RDOMemoryStack::push(LPRDOMemory pMemory) { - m_pMemoryStack.push_back(pMemory); + m_pMemoryStack.push_back(pMemory); } void RDOMemoryStack::pop() { - ASSERT(!m_pMemoryStack.empty()); + ASSERT(!m_pMemoryStack.empty()); - m_pMemoryStack.pop_back(); + m_pMemoryStack.pop_back(); } void RDOMemoryStack::create(const std::string& name, const RDOValue& variable) { - ASSERT(!m_pMemoryStack.empty()); + ASSERT(!m_pMemoryStack.empty()); - m_pMemoryStack.back()->createVariable(name, variable); + m_pMemoryStack.back()->createVariable(name, variable); } RDOValue RDOMemoryStack::get(const std::string& name) const { - ASSERT(!m_pMemoryStack.empty()); + ASSERT(!m_pMemoryStack.empty()); - MemoryStack::const_reverse_iterator stack_it = m_pMemoryStack.rbegin(); - while (stack_it != m_pMemoryStack.rend()) - { - if((*stack_it)->findVariable(name)) break; - else ++stack_it; - }; + MemoryStack::const_reverse_iterator stack_it = m_pMemoryStack.rbegin(); + while (stack_it != m_pMemoryStack.rend()) + { + if((*stack_it)->findVariable(name)) break; + else ++stack_it; + }; - ASSERT(stack_it != m_pMemoryStack.rend()); - return (*stack_it)->getVariable(name); + ASSERT(stack_it != m_pMemoryStack.rend()); + return (*stack_it)->getVariable(name); } void RDOMemoryStack::set(const std::string& name, const RDOValue& Variable) { - ASSERT(!m_pMemoryStack.empty()); + ASSERT(!m_pMemoryStack.empty()); - MemoryStack::reverse_iterator stack_it = m_pMemoryStack.rbegin(); - while (stack_it != m_pMemoryStack.rend()) - { - if((*stack_it)->findVariable(name)) break; - else ++stack_it; - }; + MemoryStack::reverse_iterator stack_it = m_pMemoryStack.rbegin(); + while (stack_it != m_pMemoryStack.rend()) + { + if((*stack_it)->findVariable(name)) break; + else ++stack_it; + }; - ASSERT(stack_it != m_pMemoryStack.rend()); - (*stack_it)->setVariable(name, Variable); + ASSERT(stack_it != m_pMemoryStack.rend()); + (*stack_it)->setVariable(name, Variable); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_memory.h b/simulator/runtime/rdo_memory.h index 5b234c532..3f92c1e93 100644 --- a/simulator/runtime/rdo_memory.h +++ b/simulator/runtime/rdo_memory.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_MEMORY_H_ -#define _LIB_RUNTIME_MEMORY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -16,17 +15,17 @@ class RDOMemory: public rdo::counter_reference { DECLARE_FACTORY(RDOMemory); public: - typedef std::map LocalMemory; + typedef std::map LocalMemory; - void createVariable(const std::string& name, const RDOValue& variable); - RDOValue getVariable(const std::string& name) const; - void setVariable(const std::string& name, const RDOValue& variable); - bool findVariable(const std::string& name) const; + void createVariable(const std::string& name, const RDOValue& variable); + RDOValue getVariable(const std::string& name) const; + void setVariable(const std::string& name, const RDOValue& variable); + bool findVariable(const std::string& name) const; private: - RDOMemory(); + RDOMemory(); - LocalMemory m_localMemory; + LocalMemory m_localMemory; }; PREDECLARE_POINTER(RDOMemoryStack); @@ -34,21 +33,19 @@ class RDOMemoryStack: public rdo::counter_reference { DECLARE_FACTORY(RDOMemoryStack); public: - typedef std::list MemoryStack; + typedef std::list MemoryStack; - void push(LPRDOMemory pMemory); - void pop(); + void push(LPRDOMemory pMemory); + void pop(); - void create(const std::string& name, const RDOValue& variable); - RDOValue get(const std::string& name) const; - void set(const std::string& name, const RDOValue& variable); + void create(const std::string& name, const RDOValue& variable); + RDOValue get(const std::string& name) const; + void set(const std::string& name, const RDOValue& variable); private: - RDOMemoryStack(); + RDOMemoryStack(); - MemoryStack m_pMemoryStack; + MemoryStack m_pMemoryStack; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_MEMORY_H_ diff --git a/simulator/runtime/rdo_model_i.h b/simulator/runtime/rdo_model_i.h index 942b641f0..960576f76 100644 --- a/simulator/runtime/rdo_model_i.h +++ b/simulator/runtime/rdo_model_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_MODEL_I_H_ -#define _LIB_RUNTIME_MODEL_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,21 +8,19 @@ class IModelStructure: public virtual rdo::counter_reference { public: - virtual void writeModelStructure(std::ostream& stream) const = 0; + virtual void writeModelStructure(std::ostream& stream) const = 0; }; DECLARE_POINTER(IModelStructure) #define DECLARE_IModelStructure \ - virtual void writeModelStructure(std::ostream& stream) const; + virtual void writeModelStructure(std::ostream& stream) const; class IName: public virtual rdo::counter_reference { public: - virtual const std::string& name() const = 0; + virtual const std::string& name() const = 0; }; DECLARE_POINTER(IName) #define DECLARE_IName \ - virtual const std::string& name() const; - -#endif // _LIB_RUNTIME_MODEL_I_H_ + virtual const std::string& name() const; diff --git a/simulator/runtime/rdo_object.cpp b/simulator/runtime/rdo_object.cpp index e9a086dc2..b59899a77 100644 --- a/simulator/runtime/rdo_object.cpp +++ b/simulator/runtime/rdo_object.cpp @@ -21,35 +21,34 @@ RDORuntimeObject::~RDORuntimeObject() // -------------------- Position::Position // -------------------------------------------------------------------------------- RDOSrcInfo::Position::Position() - : m_first_line(UNDEFINE_LINE) - , m_first_pos (UNDEFINE_POS ) - , m_last_line (UNDEFINE_LINE) - , m_last_pos (UNDEFINE_POS ) + : m_first_line(UNDEFINE_LINE) + , m_first_pos (UNDEFINE_POS ) + , m_last_line (UNDEFINE_LINE) + , m_last_pos (UNDEFINE_POS ) {} RDOSrcInfo::Position::Position(std::size_t first_line, std::size_t first_pos, std::size_t last_line, std::size_t last_pos) - : m_first_line(first_line) - , m_first_pos (first_pos ) - , m_last_line (last_line ) - , m_last_pos (last_pos ) + : m_first_line(first_line) + , m_first_pos (first_pos ) + , m_last_line (last_line ) + , m_last_pos (last_pos ) {} bool RDOSrcInfo::Position::empty() const { - return m_first_line == UNDEFINE_LINE && m_first_pos == UNDEFINE_POS && m_last_line == UNDEFINE_LINE && m_last_pos == UNDEFINE_POS; + return m_first_line == UNDEFINE_LINE && m_first_pos == UNDEFINE_POS && m_last_line == UNDEFINE_LINE && m_last_pos == UNDEFINE_POS; } bool RDOSrcInfo::Position::point() const { - return m_first_line == m_last_line && m_first_pos == m_last_pos; + return m_first_line == m_last_line && m_first_pos == m_last_pos; } // -------------------------------------------------------------------------------- // -------------------- RDOSrcInfo // -------------------------------------------------------------------------------- RDOSrcInfo::RDOSrcInfo() - : m_text_data("" ) - , m_file_type(rdo::model::TRC) + : m_file_type(rdo::FileType::TRC) {} RDOSrcInfo::~RDOSrcInfo() @@ -57,75 +56,75 @@ RDOSrcInfo::~RDOSrcInfo() void RDOSrcInfo::setSrcInfo(const RDOSrcInfo& info) { - setSrcPos (info.m_position ); - setSrcText (info.m_text_data); - setSrcFileType(info.m_file_type); + setSrcPos (info.m_position ); + setSrcText (info.m_text_data); + setSrcFileType(info.m_file_type); } void RDOSrcInfo::setSrcInfo(const RDOSrcInfo& begin, const std::string& delim, const RDOSrcInfo& end) { - setSrcPos (begin.src_pos().m_first_line, begin.src_pos().m_first_pos, end.src_pos().m_last_line, end.src_pos().m_last_pos); - setSrcText (begin.src_text() + delim + end.src_text()); - setSrcFileType(begin.src_filetype()); + setSrcPos (begin.src_pos().m_first_line, begin.src_pos().m_first_pos, end.src_pos().m_last_line, end.src_pos().m_last_pos); + setSrcText (begin.src_text() + delim + end.src_text()); + setSrcFileType(begin.src_filetype()); } void RDOSrcInfo::setSrcPos(const Position& position) { - m_position.m_first_line = position.m_first_line; - m_position.m_first_pos = position.m_first_pos; - m_position.m_last_line = position.m_last_line; - m_position.m_last_pos = position.m_last_pos; + m_position.m_first_line = position.m_first_line; + m_position.m_first_pos = position.m_first_pos; + m_position.m_last_line = position.m_last_line; + m_position.m_last_pos = position.m_last_pos; } void RDOSrcInfo::setSrcPos(const Position& position_begin, const Position& position_end) { - m_position.m_first_line = position_begin.m_first_line; - m_position.m_first_pos = position_begin.m_first_pos; - m_position.m_last_line = position_end.m_last_line; - m_position.m_last_pos = position_end.m_last_pos; + m_position.m_first_line = position_begin.m_first_line; + m_position.m_first_pos = position_begin.m_first_pos; + m_position.m_last_line = position_end.m_last_line; + m_position.m_last_pos = position_end.m_last_pos; } void RDOSrcInfo::setSrcPos(std::size_t first_line, std::size_t first_pos, std::size_t last_line, std::size_t last_pos) { - m_position.m_first_line = first_line; - m_position.m_first_pos = first_pos; - m_position.m_last_line = last_line; - m_position.m_last_pos = last_pos; + m_position.m_first_line = first_line; + m_position.m_first_pos = first_pos; + m_position.m_last_line = last_line; + m_position.m_last_pos = last_pos; } void RDOSrcInfo::setSrcText(const std::string& value) { - m_text_data = value; + m_text_data = value; } -void RDOSrcInfo::setSrcFileType(rdo::model::FileType value) +void RDOSrcInfo::setSrcFileType(rdo::FileType value) { - m_file_type = value; + m_file_type = value; } const RDOSrcInfo& RDOSrcInfo::src_info() const { - return *this; + return *this; } const RDOSrcInfo::Position& RDOSrcInfo::src_pos() const { - return m_position; + return m_position; } const std::string& RDOSrcInfo::src_text() const { - return m_text_data; + return m_text_data; } -rdo::model::FileType RDOSrcInfo::src_filetype() const +rdo::FileType RDOSrcInfo::src_filetype() const { - return m_file_type; + return m_file_type; } bool RDOSrcInfo::src_empty() const { - return m_position.empty() && m_text_data.empty() && m_file_type == rdo::model::TRC; + return m_position.empty() && m_text_data.empty() && m_file_type == rdo::FileType::TRC; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_object.h b/simulator/runtime/rdo_object.h index 1c3ed857f..117db15df 100644 --- a/simulator/runtime/rdo_object.h +++ b/simulator/runtime/rdo_object.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_OBJECT_H_ -#define _LIB_RUNTIME_OBJECT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -14,54 +13,52 @@ OPEN_RDO_RUNTIME_NAMESPACE class RDORuntimeObject { public: - RDORuntimeObject(); - virtual ~RDORuntimeObject(); + RDORuntimeObject(); + virtual ~RDORuntimeObject(); }; class RDOSrcInfo { public: - struct Position - { - static const std::size_t UNDEFINE_POS = std::size_t(~0); - static const std::size_t UNDEFINE_LINE = std::size_t(~0); + struct Position + { + static const std::size_t UNDEFINE_POS = std::size_t(~0); + static const std::size_t UNDEFINE_LINE = std::size_t(~0); - std::size_t m_first_line; - std::size_t m_first_pos; - std::size_t m_last_line; - std::size_t m_last_pos; + std::size_t m_first_line; + std::size_t m_first_pos; + std::size_t m_last_line; + std::size_t m_last_pos; - Position(); - Position(std::size_t first_line, std::size_t first_pos, std::size_t last_line, std::size_t last_pos); - bool empty() const; - bool point() const; - }; + Position(); + Position(std::size_t first_line, std::size_t first_pos, std::size_t last_line, std::size_t last_pos); + bool empty() const; + bool point() const; + }; - RDOSrcInfo(); - virtual ~RDOSrcInfo(); + RDOSrcInfo(); + virtual ~RDOSrcInfo(); - void setSrcInfo(const RDOSrcInfo& info); - void setSrcInfo(const RDOSrcInfo& begin, const std::string& delim, const RDOSrcInfo& end); + void setSrcInfo(const RDOSrcInfo& info); + void setSrcInfo(const RDOSrcInfo& begin, const std::string& delim, const RDOSrcInfo& end); - void setSrcPos(const Position& position); - void setSrcPos(const Position& position_begin, const Position& position_end); - void setSrcPos(std::size_t first_line, std::size_t first_pos, std::size_t last_line, std::size_t last_pos); + void setSrcPos(const Position& position); + void setSrcPos(const Position& position_begin, const Position& position_end); + void setSrcPos(std::size_t first_line, std::size_t first_pos, std::size_t last_line, std::size_t last_pos); - virtual void setSrcText(const std::string& value); - void setSrcFileType(rdo::model::FileType value); + virtual void setSrcText(const std::string& value); + void setSrcFileType(rdo::FileType value); - const RDOSrcInfo& src_info() const; - const Position& src_pos() const; - const std::string& src_text() const; - rdo::model::FileType src_filetype() const; - bool src_empty() const; + const RDOSrcInfo& src_info() const; + const Position& src_pos() const; + const std::string& src_text() const; + rdo::FileType src_filetype() const; + bool src_empty() const; private: - Position m_position; - std::string m_text_data; - rdo::model::FileType m_file_type; + Position m_position; + std::string m_text_data; + rdo::FileType m_file_type; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_OBJECT_H_ diff --git a/simulator/runtime/rdo_operation.cpp b/simulator/runtime/rdo_operation.cpp index 90c51d17a..6b7323143 100644 --- a/simulator/runtime/rdo_operation.cpp +++ b/simulator/runtime/rdo_operation.cpp @@ -13,36 +13,36 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOOperation // -------------------------------------------------------------------------------- RDOOperation::RDOOperation(const LPRDORuntime& pRuntime, const LPRDOPatternOperation& pPattern, bool trace, const std::string& name) - : RDOActivityPattern(pPattern, trace, name) - , RDOPatternPrior ( ) + : RDOActivityPattern(pPattern, trace, name) + , RDOPatternPrior ( ) { - setTrace(trace); - m_haveAdditionalCondition = false; - setTraceID(pRuntime->getFreeActivityId()); + setTrace(trace); + m_haveAdditionalCondition = false; + setTraceID(pRuntime->getFreeActivityId()); } RDOOperation::RDOOperation(const LPRDORuntime& pRuntime, const LPRDOPatternOperation& pPattern, bool trace, const LPRDOCalc& pCondition, const std::string& name) - : RDOActivityPattern(pPattern, trace, name) - , RDOPatternPrior ( ) - , m_pAdditionalCondition (pCondition ) + : RDOActivityPattern(pPattern, trace, name) + , RDOPatternPrior ( ) + , m_pAdditionalCondition (pCondition ) { - setTrace(trace); - m_haveAdditionalCondition = true; - setTraceID(pRuntime->getFreeActivityId()); + setTrace(trace); + m_haveAdditionalCondition = true; + setTraceID(pRuntime->getFreeActivityId()); } RDOOperation::RDOOperation(const LPRDORuntime& pRuntime, const RDOOperation& originForClone) - : RDOActivityPattern(originForClone.m_pPattern, originForClone.traceable(), originForClone.m_oprName) - , m_pAdditionalCondition (NULL) + : RDOActivityPattern(originForClone.m_pPattern, originForClone.traceable(), originForClone.m_oprName) + , m_pAdditionalCondition (NULL) { - setTrace(originForClone.traceable()); - m_haveAdditionalCondition = false; - setTraceID(pRuntime->getFreeActivityId()); + setTrace(originForClone.traceable()); + m_haveAdditionalCondition = false; + setTraceID(pRuntime->getFreeActivityId()); - m_paramsCalcs.insert(m_paramsCalcs.begin(), originForClone.m_paramsCalcs.begin(), originForClone.m_paramsCalcs.end()); - m_relResID .insert(m_relResID .begin(), originForClone.m_relResID .begin(), originForClone.m_relResID .end()); - setTraceID(originForClone.getTraceID()); - m_operId = pRuntime->getFreeOperationId(); + m_paramsCalcs.insert(m_paramsCalcs.begin(), originForClone.m_paramsCalcs.begin(), originForClone.m_paramsCalcs.end()); + m_relResID .insert(m_relResID .begin(), originForClone.m_relResID .begin(), originForClone.m_relResID .end()); + setTraceID(originForClone.getTraceID()); + m_operId = pRuntime->getFreeOperationId(); } RDOOperation::~RDOOperation() @@ -50,203 +50,203 @@ RDOOperation::~RDOOperation() bool RDOOperation::onCheckCondition(const LPRDORuntime& pRuntime) { - // Если операция может начаться, то создать её клон и поместить его в список - onBeforeChoiceFrom(pRuntime); - pRuntime->inc_cnt_choice_from(); - return choiceFrom(pRuntime); + // Если операция может начаться, то создать её клон и поместить его в список + onBeforeChoiceFrom(pRuntime); + pRuntime->inc_cnt_choice_from(); + return choiceFrom(pRuntime); } -IBaseOperation::BOResult RDOOperation::onDoOperation(const LPRDORuntime& pRuntime) +IBaseOperation::ResultCode RDOOperation::onDoOperation(const LPRDORuntime& pRuntime) { - LPIOperation newOper = rdo::Factory::create(pRuntime, *this); - newOper->onBeforeOperationBegin(pRuntime); - newOper->convertBegin(pRuntime); + LPIOperation newOper = rdo::Factory::create(pRuntime, *this); + newOper->onBeforeOperationBegin(pRuntime); + newOper->convertBegin(pRuntime); - std::vector params; - params.reserve(m_paramsCalcs.size()); - for (const LPRDOCalc& param: m_paramsCalcs) - { - params.push_back(param->calcValue(pRuntime)); - } + std::vector params; + params.reserve(m_paramsCalcs.size()); + for (const LPRDOCalc& param: m_paramsCalcs) + { + params.push_back(param->calcValue(pRuntime)); + } - LPIEvent event(newOper.object_dynamic_cast()); - pRuntime->addTimePoint( - newOper->getNextTimeInterval(pRuntime) + pRuntime->getCurrentTime(), - event.object_dynamic_cast(), - boost::bind(&IEvent::onMakePlaned, event.get(), pRuntime, params) - ); - newOper->onAfterOperationBegin(pRuntime); - return IBaseOperation::BOR_planned_and_run; + LPIEvent event(newOper.object_dynamic_cast()); + pRuntime->addTimePoint( + newOper->getNextTimeInterval(pRuntime) + pRuntime->getCurrentTime(), + event.object_dynamic_cast(), + boost::bind(&IEvent::onMakePlaned, event.get(), pRuntime, params) + ); + newOper->onAfterOperationBegin(pRuntime); + return IBaseOperation::ResultCode::PLANNED_AND_RUN; } void RDOOperation::onMakePlaned(const LPRDORuntime& pRuntime, const std::vector& params) { - // Выполняем событие конца операции-клона - pRuntime->inc_cnt_events(); - onBeforeOperationEnd(pRuntime, params); - convertEnd(pRuntime); - onAfterOperationEnd(pRuntime); + // Выполняем событие конца операции-клона + pRuntime->inc_cnt_events(); + onBeforeOperationEnd(pRuntime, params); + convertEnd(pRuntime); + onAfterOperationEnd(pRuntime); } bool RDOOperation::choiceFrom(const LPRDORuntime& pRuntime) { - pRuntime->setCurrentActivity(this); - if (m_haveAdditionalCondition) - { - if (!m_pAdditionalCondition->calcValue(pRuntime).getAsBool()) - { - return false; - } - } - return m_pPattern->choiceFrom(pRuntime); + pRuntime->setCurrentActivity(this); + if (m_haveAdditionalCondition) + { + if (!m_pAdditionalCondition->calcValue(pRuntime).getAsBool()) + { + return false; + } + } + return m_pPattern->choiceFrom(pRuntime); } void RDOOperation::convertBegin(const LPRDORuntime& pRuntime) { - pRuntime->setCurrentActivity(this); - m_pPattern->convertBegin(pRuntime); + pRuntime->setCurrentActivity(this); + m_pPattern->convertBegin(pRuntime); } void RDOOperation::convertEnd(const LPRDORuntime& pRuntime) { - pRuntime->setCurrentActivity(this); - m_pPattern->convertEnd(pRuntime); + pRuntime->setCurrentActivity(this); + m_pPattern->convertEnd(pRuntime); } void RDOOperation::onBeforeChoiceFrom(const LPRDORuntime& pRuntime) { - setPatternParameters(pRuntime, m_paramsCalcs); + setPatternParameters(pRuntime, m_paramsCalcs); } void RDOOperation::onBeforeOperationEnd(const LPRDORuntime& pRuntime, const std::vector& params) { - setPatternParameters(pRuntime, params); + setPatternParameters(pRuntime, params); } void RDOOperation::onAfterOperationBegin(const LPRDORuntime& pRuntime) { - updateConvertStatus(pRuntime, m_pPattern->m_convertorBeginStatus); - pRuntime->getTracer()->writeAfterOperationBegin(this, pRuntime); - m_pPattern->convertBeginErase(pRuntime); - updateRelRes(pRuntime); - incrementRelevantResourceReference(pRuntime); + updateConvertStatus(pRuntime, m_pPattern->m_convertorBeginStatus); + pRuntime->getTracer()->writeAfterOperationBegin(this, pRuntime); + m_pPattern->convertBeginErase(pRuntime); + updateRelRes(pRuntime); + incrementRelevantResourceReference(pRuntime); } void RDOOperation::onAfterOperationEnd(const LPRDORuntime& pRuntime) { - decrementRelevantResourceReference(pRuntime); - updateConvertStatus(pRuntime, m_pPattern->m_convertorEndStatus); - pRuntime->getTracer()->writeAfterOperationEnd(this, pRuntime); - pRuntime->freeOperationId(m_operId); - m_pPattern->convertEndErase(pRuntime); - updateRelRes(pRuntime); + decrementRelevantResourceReference(pRuntime); + updateConvertStatus(pRuntime, m_pPattern->m_convertorEndStatus); + pRuntime->getTracer()->writeAfterOperationEnd(this, pRuntime); + pRuntime->freeOperationId(m_operId); + m_pPattern->convertEndErase(pRuntime); + updateRelRes(pRuntime); } double RDOOperation::getNextTimeInterval(const LPRDORuntime& pRuntime) { - pRuntime->setCurrentActivity(this); - return m_pPattern->getNextTimeInterval(pRuntime); + pRuntime->setCurrentActivity(this); + return m_pPattern->getNextTimeInterval(pRuntime); } std::string RDOOperation::traceOperId() const { - return rdo::toString(m_operId); + return rdo::toString(m_operId); } namespace { bool mustBeExist(RDOResource::ConvertStatus status_begin, RDOResource::ConvertStatus status_end) { - switch (status_begin) - { - case RDOResource::CS_Keep: - switch (status_end) - { - case RDOResource::CS_Keep : return true; - case RDOResource::CS_Create : NEVER_REACH_HERE; - case RDOResource::CS_Erase : return true; - case RDOResource::CS_NonExist: NEVER_REACH_HERE; - case RDOResource::CS_NoChange: return true; - default: NEVER_REACH_HERE; - } - case RDOResource::CS_Create: - switch (status_end) - { - case RDOResource::CS_Keep : return true; - case RDOResource::CS_Create : NEVER_REACH_HERE; - case RDOResource::CS_Erase : return true; - case RDOResource::CS_NonExist: NEVER_REACH_HERE; - case RDOResource::CS_NoChange: return true; - default: NEVER_REACH_HERE; - } - case RDOResource::CS_Erase: - switch (status_end) - { - case RDOResource::CS_Keep : NEVER_REACH_HERE; - case RDOResource::CS_Create : NEVER_REACH_HERE; - case RDOResource::CS_Erase : NEVER_REACH_HERE; - case RDOResource::CS_NonExist: return false; - case RDOResource::CS_NoChange: NEVER_REACH_HERE; - default: NEVER_REACH_HERE; - } - case RDOResource::CS_NonExist: - switch (status_end) - { - case RDOResource::CS_Keep : NEVER_REACH_HERE; - case RDOResource::CS_Create : return false; - case RDOResource::CS_Erase : NEVER_REACH_HERE; - case RDOResource::CS_NonExist: NEVER_REACH_HERE; - case RDOResource::CS_NoChange: NEVER_REACH_HERE; - default: NEVER_REACH_HERE; - } - case RDOResource::CS_NoChange: - switch (status_end) - { - case RDOResource::CS_Keep : return true; - case RDOResource::CS_Create : NEVER_REACH_HERE; - case RDOResource::CS_Erase : return true; - case RDOResource::CS_NonExist: NEVER_REACH_HERE; - case RDOResource::CS_NoChange: return true; - default: NEVER_REACH_HERE; - } - default: NEVER_REACH_HERE; - } - NEVER_REACH_HERE; - return true; + switch (status_begin) + { + case RDOResource::ConvertStatus::KEEP: + switch (status_end) + { + case RDOResource::ConvertStatus::KEEP : return true; + case RDOResource::ConvertStatus::CREATE : NEVER_REACH_HERE; + case RDOResource::ConvertStatus::ERASE : return true; + case RDOResource::ConvertStatus::NONEXIST: NEVER_REACH_HERE; + case RDOResource::ConvertStatus::NOCHANGE: return true; + default: NEVER_REACH_HERE; + } + case RDOResource::ConvertStatus::CREATE: + switch (status_end) + { + case RDOResource::ConvertStatus::KEEP : return true; + case RDOResource::ConvertStatus::CREATE : NEVER_REACH_HERE; + case RDOResource::ConvertStatus::ERASE : return true; + case RDOResource::ConvertStatus::NONEXIST: NEVER_REACH_HERE; + case RDOResource::ConvertStatus::NOCHANGE: return true; + default: NEVER_REACH_HERE; + } + case RDOResource::ConvertStatus::ERASE: + switch (status_end) + { + case RDOResource::ConvertStatus::KEEP : NEVER_REACH_HERE; + case RDOResource::ConvertStatus::CREATE : NEVER_REACH_HERE; + case RDOResource::ConvertStatus::ERASE : NEVER_REACH_HERE; + case RDOResource::ConvertStatus::NONEXIST: return false; + case RDOResource::ConvertStatus::NOCHANGE: NEVER_REACH_HERE; + default: NEVER_REACH_HERE; + } + case RDOResource::ConvertStatus::NONEXIST: + switch (status_end) + { + case RDOResource::ConvertStatus::KEEP : NEVER_REACH_HERE; + case RDOResource::ConvertStatus::CREATE : return false; + case RDOResource::ConvertStatus::ERASE : NEVER_REACH_HERE; + case RDOResource::ConvertStatus::NONEXIST: NEVER_REACH_HERE; + case RDOResource::ConvertStatus::NOCHANGE: NEVER_REACH_HERE; + default: NEVER_REACH_HERE; + } + case RDOResource::ConvertStatus::NOCHANGE: + switch (status_end) + { + case RDOResource::ConvertStatus::KEEP : return true; + case RDOResource::ConvertStatus::CREATE : NEVER_REACH_HERE; + case RDOResource::ConvertStatus::ERASE : return true; + case RDOResource::ConvertStatus::NONEXIST: NEVER_REACH_HERE; + case RDOResource::ConvertStatus::NOCHANGE: return true; + default: NEVER_REACH_HERE; + } + default: NEVER_REACH_HERE; + } + NEVER_REACH_HERE; + return true; } } void RDOOperation::incrementRelevantResourceReference(const LPRDORuntime& pRuntime) { - ASSERT(m_pPattern->m_convertorBeginStatus.size() == m_pPattern->m_convertorEndStatus.size()); + ASSERT(m_pPattern->m_convertorBeginStatus.size() == m_pPattern->m_convertorEndStatus.size()); - for (size_t index = 0; index < m_pPattern->m_convertorBeginStatus.size(); ++index) - { - if (mustBeExist(m_pPattern->m_convertorBeginStatus[index], m_pPattern->m_convertorEndStatus[index])) - { - LPRDOResource resource = pRuntime->getResourceByID(m_relResID.at(index)); - resource->incRef(); - } - } + for (size_t index = 0; index < m_pPattern->m_convertorBeginStatus.size(); ++index) + { + if (mustBeExist(m_pPattern->m_convertorBeginStatus[index], m_pPattern->m_convertorEndStatus[index])) + { + LPRDOResource resource = pRuntime->getResourceByID(m_relResID.at(index)); + resource->incRef(); + } + } } void RDOOperation::decrementRelevantResourceReference(const LPRDORuntime& pRuntime) { - ASSERT(m_pPattern->m_convertorBeginStatus.size() == m_pPattern->m_convertorEndStatus.size()); + ASSERT(m_pPattern->m_convertorBeginStatus.size() == m_pPattern->m_convertorEndStatus.size()); - for (size_t index = 0; index < m_pPattern->m_convertorBeginStatus.size(); ++index) - { - if (mustBeExist(m_pPattern->m_convertorBeginStatus[index], m_pPattern->m_convertorEndStatus[index])) - { - LPRDOResource resource = pRuntime->getResourceByID(m_relResID.at(index)); - resource->decRef(); - } - } + for (size_t index = 0; index < m_pPattern->m_convertorBeginStatus.size(); ++index) + { + if (mustBeExist(m_pPattern->m_convertorBeginStatus[index], m_pPattern->m_convertorEndStatus[index])) + { + LPRDOResource resource = pRuntime->getResourceByID(m_relResID.at(index)); + resource->decRef(); + } + } } void RDOOperation::onBeforeOperationBegin(const LPRDORuntime& /*pRuntime*/) {} void RDOOperation::onStart (const LPRDORuntime& /*pRuntime*/) {} void RDOOperation::onStop (const LPRDORuntime& /*pRuntime*/) {} -IBaseOperation::BOResult RDOOperation::onContinue (const LPRDORuntime& /*pRuntime*/) { return IBaseOperation::BOR_cant_run; } +IBaseOperation::ResultCode RDOOperation::onContinue (const LPRDORuntime& /*pRuntime*/) { return IBaseOperation::ResultCode::CANNOT_RUN; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_operation.h b/simulator/runtime/rdo_operation.h index a462c1aab..7f4f3826b 100644 --- a/simulator/runtime/rdo_operation.h +++ b/simulator/runtime/rdo_operation.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_OPERATION_H_ -#define _LIB_RUNTIME_OPERATION_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,12 +15,12 @@ OPEN_RDO_RUNTIME_NAMESPACE class RDOOperation - : public IBaseOperation - , public IOperation - , public IEvent - , public RDOActivityPattern - , public RDOPatternPrior - , public IOperationTrace + : public IBaseOperation + , public IOperation + , public IEvent + , public RDOActivityPattern + , public RDOPatternPrior + , public IOperationTrace { typedef RDOActivityPattern pattern_type; DECLARE_FACTORY(RDOOperation); @@ -30,30 +29,28 @@ friend class RDOSimulatorTrace; friend class RDOSimulator; protected: - RDOOperation(const LPRDORuntime& pRuntime, const LPRDOPatternOperation& pPattern, bool trace, const std::string& name); - RDOOperation(const LPRDORuntime& pRuntime, const LPRDOPatternOperation& pPattern, bool trace, const LPRDOCalc& pCondition, const std::string& name); - virtual ~RDOOperation(); - DECLARE_IOperation; + RDOOperation(const LPRDORuntime& pRuntime, const LPRDOPatternOperation& pPattern, bool trace, const std::string& name); + RDOOperation(const LPRDORuntime& pRuntime, const LPRDOPatternOperation& pPattern, bool trace, const LPRDOCalc& pCondition, const std::string& name); + virtual ~RDOOperation(); + DECLARE_IOperation; private: - RDOOperation(const LPRDORuntime& pRuntime, const RDOOperation& originForClone); + RDOOperation(const LPRDORuntime& pRuntime, const RDOOperation& originForClone); - typedef std::vector CloneList; + typedef std::vector CloneList; - CloneList m_cloneList; - bool m_haveAdditionalCondition; - LPRDOCalc m_pAdditionalCondition; - int m_operId; + CloneList m_cloneList; + bool m_haveAdditionalCondition; + LPRDOCalc m_pAdditionalCondition; + int m_operId; - virtual void onMakePlaned(const LPRDORuntime& pRuntime, const std::vector& params); + virtual void onMakePlaned(const LPRDORuntime& pRuntime, const std::vector& params); - void incrementRelevantResourceReference(const LPRDORuntime& pRuntime); - void decrementRelevantResourceReference(const LPRDORuntime& pRuntime); + void incrementRelevantResourceReference(const LPRDORuntime& pRuntime); + void decrementRelevantResourceReference(const LPRDORuntime& pRuntime); - DECLARE_IBaseOperation; - DECLARE_IOperationTrace; + DECLARE_IBaseOperation; + DECLARE_IOperationTrace; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_OPERATION_H_ diff --git a/simulator/runtime/rdo_operation_i.h b/simulator/runtime/rdo_operation_i.h index 582a259d0..66e0d11a0 100644 --- a/simulator/runtime/rdo_operation_i.h +++ b/simulator/runtime/rdo_operation_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_OPERATION_I_H_ -#define _LIB_RUNTIME_OPERATION_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -18,37 +17,35 @@ CLOSE_RDO_RUNTIME_NAMESPACE class IOperation: public virtual rdo::counter_reference { public: - virtual void onBeforeChoiceFrom (const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual bool choiceFrom (const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual void onBeforeOperationBegin(const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual void convertBegin (const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual void onAfterOperationBegin (const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual void onBeforeOperationEnd (const rdo::runtime::LPRDORuntime& pRuntime, const std::vector& params) = 0; - virtual void convertEnd (const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual void onAfterOperationEnd (const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual double getNextTimeInterval (const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual void onBeforeChoiceFrom (const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual bool choiceFrom (const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual void onBeforeOperationBegin(const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual void convertBegin (const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual void onAfterOperationBegin (const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual void onBeforeOperationEnd (const rdo::runtime::LPRDORuntime& pRuntime, const std::vector& params) = 0; + virtual void convertEnd (const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual void onAfterOperationEnd (const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual double getNextTimeInterval (const rdo::runtime::LPRDORuntime& pRuntime) = 0; }; DECLARE_POINTER(IOperation) #define DECLARE_IOperation \ - virtual void onBeforeChoiceFrom (const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual bool choiceFrom (const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual void onBeforeOperationBegin(const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual void convertBegin (const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual void onAfterOperationBegin (const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual void onBeforeOperationEnd (const rdo::runtime::LPRDORuntime& pRuntime, const std::vector& params); \ - virtual void convertEnd (const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual void onAfterOperationEnd (const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual double getNextTimeInterval (const rdo::runtime::LPRDORuntime& pRuntime) + virtual void onBeforeChoiceFrom (const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual bool choiceFrom (const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual void onBeforeOperationBegin(const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual void convertBegin (const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual void onAfterOperationBegin (const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual void onBeforeOperationEnd (const rdo::runtime::LPRDORuntime& pRuntime, const std::vector& params); \ + virtual void convertEnd (const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual void onAfterOperationEnd (const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual double getNextTimeInterval (const rdo::runtime::LPRDORuntime& pRuntime) class IOperationTrace: public virtual rdo::counter_reference { public: - virtual std::string traceOperId() const = 0; + virtual std::string traceOperId() const = 0; }; DECLARE_POINTER(IOperationTrace) #define DECLARE_IOperationTrace \ - virtual std::string traceOperId() const; - -#endif // _LIB_RUNTIME_OPERATION_I_H_ + virtual std::string traceOperId() const; diff --git a/simulator/runtime/rdo_param_i.h b/simulator/runtime/rdo_param_i.h index db5b905d2..832763a10 100644 --- a/simulator/runtime/rdo_param_i.h +++ b/simulator/runtime/rdo_param_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_PARAM_I_H_ -#define _LIB_RUNTIME_PARAM_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,12 +15,10 @@ CLOSE_RDO_RUNTIME_NAMESPACE class IParam { public: - virtual bool setParam(const rdo::runtime::LPRDOCalc& pParam) = 0; - virtual bool endParam() = 0; + virtual bool setParam(const rdo::runtime::LPRDOCalc& pParam) = 0; + virtual bool endParam() = 0; }; #define DECLARE_IParam \ - virtual bool setParam(const rdo::runtime::LPRDOCalc& pParam); \ - virtual bool endParam(); - -#endif // _LIB_RUNTIME_PARAM_I_H_ + virtual bool setParam(const rdo::runtime::LPRDOCalc& pParam); \ + virtual bool endParam(); diff --git a/simulator/runtime/rdo_pattern.cpp b/simulator/runtime/rdo_pattern.cpp index 8d0e0be58..bc8858ea1 100644 --- a/simulator/runtime/rdo_pattern.cpp +++ b/simulator/runtime/rdo_pattern.cpp @@ -15,22 +15,22 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOPattern // -------------------------------------------------------------------------------- RDOPattern::RDOPattern(bool trace) - : RDORuntimeObject ( ) - , RDOTraceableObject(trace) + : RDORuntimeObject ( ) + , RDOTraceableObject(trace) {} void RDOPattern::addPreSelectRelRes(const LPRDOCalc& pCalc) { - CalcList::iterator it = m_preSelectRelRes.begin(); - while (it != m_preSelectRelRes.end()) - { - if ((*it)->compare(pCalc)) - { - return; - } - ++it; - } - m_preSelectRelRes.push_back(pCalc); + CalcList::iterator it = m_preSelectRelRes.begin(); + while (it != m_preSelectRelRes.end()) + { + if ((*it)->compare(pCalc)) + { + return; + } + ++it; + } + m_preSelectRelRes.push_back(pCalc); } RDOPattern::~RDOPattern() @@ -38,36 +38,36 @@ RDOPattern::~RDOPattern() void RDOPattern::preSelectRelRes(const LPRDORuntime& pRuntime) { - runCalcs(m_preSelectRelRes, pRuntime); + runCalcs(m_preSelectRelRes, pRuntime); } void RDOPattern::runCalcs(CalcList& calcList, const LPRDORuntime& pRuntime) { - LPRDOMemory pLocalMemory = rdo::Factory::create(); - pRuntime->getMemoryStack()->push(pLocalMemory); - for (const auto& calc: calcList) - calc->calcValue(pRuntime); - pRuntime->getMemoryStack()->pop(); + LPRDOMemory pLocalMemory = rdo::Factory::create(); + pRuntime->getMemoryStack()->push(pLocalMemory); + for (const auto& calc: calcList) + calc->calcValue(pRuntime); + pRuntime->getMemoryStack()->pop(); } bool RDOPattern::runCalcsBool(CalcList& calcList, const LPRDORuntime& pRuntime) { - for (const auto& calc: calcList) - { - if (!calc->calcValue(pRuntime).getAsBool()) - { - return false; - } - } - return true; + for (const auto& calc: calcList) + { + if (!calc->calcValue(pRuntime).getAsBool()) + { + return false; + } + } + return true; } // -------------------------------------------------------------------------------- // -------------------- RDOPatternEvent // -------------------------------------------------------------------------------- RDOPatternEvent::RDOPatternEvent(bool trace) - : RDOPattern(trace) - , m_timeCalc(NULL ) + : RDOPattern(trace) + , m_timeCalc(NULL ) {} RDOPatternEvent::~RDOPatternEvent() @@ -75,55 +75,55 @@ RDOPatternEvent::~RDOPatternEvent() void RDOPatternEvent::addConvertorCalc(const LPRDOCalc& pCalc) { - m_convertor.push_back(pCalc); + m_convertor.push_back(pCalc); } void RDOPatternEvent::addConvertorStatus(RDOResource::ConvertStatus status) { - m_convertorStatus.push_back(status); + m_convertorStatus.push_back(status); } void RDOPatternEvent::addEraseCalc(const LPRDOCalc& pCalc) { - m_erase.push_back(pCalc); + m_erase.push_back(pCalc); } void RDOPatternEvent::convertEvent(const LPRDORuntime& pRuntime) { - preSelectRelRes(pRuntime); - runCalcs(m_convertor, pRuntime); + preSelectRelRes(pRuntime); + runCalcs(m_convertor, pRuntime); } void RDOPatternEvent::convertErase(const LPRDORuntime& pRuntime) { - runCalcs(m_erase, pRuntime); + runCalcs(m_erase, pRuntime); } double RDOPatternEvent::getNextTimeInterval(const LPRDORuntime& pRuntime) { - double time_next = m_timeCalc->calcValue(pRuntime).getDouble(); - if (time_next >= 0) - { - return time_next; - } + double time_next = m_timeCalc->calcValue(pRuntime).getDouble(); + if (time_next >= 0) + { + return time_next; + } - pRuntime->error().push(rdo::format("Попытка запланировать событие в прошлом. Выражение времени для $Time имеет отрицательное значение: %f", time_next), m_timeCalc->srcInfo()); - return 0; + pRuntime->error().push(rdo::format("Попытка запланировать событие в прошлом. Выражение времени для $Time имеет отрицательное значение: %f", time_next), m_timeCalc->srcInfo()); + return 0; } LPIEvent RDOPatternEvent::createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const std::string& oprName) { - LPIEvent pEvent = rdo::Factory::create(pRuntime, this, traceable(), oprName); - ASSERT(pEvent); - pRuntime->addRuntimeEvent(pLogic, pEvent); - return pEvent; + LPIEvent pEvent = rdo::Factory::create(pRuntime, this, traceable(), oprName); + ASSERT(pEvent); + pRuntime->addRuntimeEvent(pLogic, pEvent); + return pEvent; } // -------------------------------------------------------------------------------- // -------------------- RDOPatternRule // -------------------------------------------------------------------------------- RDOPatternRule::RDOPatternRule(bool trace) - : RDOPattern(trace) + : RDOPattern(trace) {} RDOPatternRule::~RDOPatternRule() @@ -131,62 +131,62 @@ RDOPatternRule::~RDOPatternRule() void RDOPatternRule::addChoiceFromCalc(const LPRDOCalc& pCalc) { - m_choiceFrom.push_back(pCalc); + m_choiceFrom.push_back(pCalc); } void RDOPatternRule::addConvertorCalc(const LPRDOCalc& pCalc) { - m_convertor.push_back(pCalc); + m_convertor.push_back(pCalc); } void RDOPatternRule::addConvertorStatus(RDOResource::ConvertStatus status) { - m_convertorStatus.push_back(status); + m_convertorStatus.push_back(status); } void RDOPatternRule::addEraseCalc(const LPRDOCalc& pCalc) { - m_erase.push_back(pCalc); + m_erase.push_back(pCalc); } bool RDOPatternRule::choiceFrom(const LPRDORuntime& pRuntime) { - preSelectRelRes(pRuntime); - return runCalcsBool(m_choiceFrom, pRuntime); + preSelectRelRes(pRuntime); + return runCalcsBool(m_choiceFrom, pRuntime); } void RDOPatternRule::convertRule(const LPRDORuntime& pRuntime) { - runCalcs(m_convertor, pRuntime); + runCalcs(m_convertor, pRuntime); } void RDOPatternRule::convertErase(const LPRDORuntime& pRuntime) { - runCalcs(m_erase, pRuntime); + runCalcs(m_erase, pRuntime); } LPIRule RDOPatternRule::createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const std::string& _oprName) { - LPIRule pRule = rdo::Factory::create(pRuntime, this, traceable(), _oprName); - ASSERT(pRule); - pRuntime->addRuntimeRule(pLogic, pRule); - return pRule; + LPIRule pRule = rdo::Factory::create(pRuntime, this, traceable(), _oprName); + ASSERT(pRule); + pRuntime->addRuntimeRule(pLogic, pRule); + return pRule; } LPIRule RDOPatternRule::createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const LPRDOCalc& pCondition, const std::string& _oprName) { - LPIRule pRule = rdo::Factory::create(pRuntime, this, traceable(), pCondition, _oprName); - ASSERT(pRule); - pRuntime->addRuntimeRule(pLogic, pRule); - return pRule; + LPIRule pRule = rdo::Factory::create(pRuntime, this, traceable(), pCondition, _oprName); + ASSERT(pRule); + pRuntime->addRuntimeRule(pLogic, pRule); + return pRule; } // -------------------------------------------------------------------------------- // -------------------- RDOPatternOperation // -------------------------------------------------------------------------------- RDOPatternOperation::RDOPatternOperation(bool trace) - : RDOPattern(trace) - , m_timeCalc(NULL ) + : RDOPattern(trace) + , m_timeCalc(NULL ) {} RDOPatternOperation::~RDOPatternOperation() @@ -194,102 +194,102 @@ RDOPatternOperation::~RDOPatternOperation() void RDOPatternOperation::addChoiceFromCalc(const LPRDOCalc& pCalc) { - m_choiceFrom.push_back(pCalc); + m_choiceFrom.push_back(pCalc); } void RDOPatternOperation::addConvertorBeginCalc(const LPRDOCalc& pCalc) { - m_convertorBegin.push_back(pCalc); + m_convertorBegin.push_back(pCalc); } void RDOPatternOperation::addConvertorBeginStatus(RDOResource::ConvertStatus status) { - m_convertorBeginStatus.push_back(status); + m_convertorBeginStatus.push_back(status); } void RDOPatternOperation::addEraseBeginCalc(const LPRDOCalc& pCalc) { - m_eraseBegin.push_back(pCalc); + m_eraseBegin.push_back(pCalc); } void RDOPatternOperation::addConvertorEndCalc(const LPRDOCalc& pCalc) { - m_convertorEnd.push_back(pCalc); + m_convertorEnd.push_back(pCalc); } void RDOPatternOperation::addConvertorEndStatus(RDOResource::ConvertStatus status) { - m_convertorEndStatus.push_back(status); + m_convertorEndStatus.push_back(status); } void RDOPatternOperation::addEraseEndCalc(const LPRDOCalc& pCalc) { - m_eraseEnd.push_back(pCalc); + m_eraseEnd.push_back(pCalc); } void RDOPatternOperation::setTime(const LPRDOCalc& pCalc) { - m_timeCalc = pCalc; + m_timeCalc = pCalc; } bool RDOPatternOperation::choiceFrom(const LPRDORuntime& pRuntime) { - preSelectRelRes(pRuntime); - return runCalcsBool(m_choiceFrom, pRuntime); + preSelectRelRes(pRuntime); + return runCalcsBool(m_choiceFrom, pRuntime); } void RDOPatternOperation::convertBegin(const LPRDORuntime& pRuntime) { - runCalcs(m_convertorBegin, pRuntime); + runCalcs(m_convertorBegin, pRuntime); } void RDOPatternOperation::convertBeginErase(const LPRDORuntime& pRuntime) { - runCalcs(m_eraseBegin, pRuntime); + runCalcs(m_eraseBegin, pRuntime); } void RDOPatternOperation::convertEnd(const LPRDORuntime& pRuntime) { - runCalcs(m_convertorEnd, pRuntime); + runCalcs(m_convertorEnd, pRuntime); } void RDOPatternOperation::convertEndErase(const LPRDORuntime& pRuntime) { - runCalcs(m_eraseEnd, pRuntime); + runCalcs(m_eraseEnd, pRuntime); } double RDOPatternOperation::getNextTimeInterval(const LPRDORuntime& pRuntime) { - double time_next = m_timeCalc->calcValue(pRuntime).getDouble(); - if (time_next >= 0) - { - return time_next; - } - pRuntime->error().push(rdo::format("Попытка запланировать окончание операции в прошлом. Выражение времени для $Time имеет отрицательное значение: %f", time_next), m_timeCalc->srcInfo()); - return 0; + double time_next = m_timeCalc->calcValue(pRuntime).getDouble(); + if (time_next >= 0) + { + return time_next; + } + pRuntime->error().push(rdo::format("Попытка запланировать окончание операции в прошлом. Выражение времени для $Time имеет отрицательное значение: %f", time_next), m_timeCalc->srcInfo()); + return 0; } LPIOperation RDOPatternOperation::createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const std::string& _oprName) { - LPIOperation pOperation = rdo::Factory::create(pRuntime, this, traceable(), _oprName); - ASSERT(pOperation); - pRuntime->addRuntimeOperation(pLogic, pOperation); - return pOperation; + LPIOperation pOperation = rdo::Factory::create(pRuntime, this, traceable(), _oprName); + ASSERT(pOperation); + pRuntime->addRuntimeOperation(pLogic, pOperation); + return pOperation; } LPIOperation RDOPatternOperation::createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const LPRDOCalc& pCondition, const std::string& _oprName) { - LPIOperation pOperation = rdo::Factory::create(pRuntime, this, traceable(), pCondition, _oprName); - ASSERT(pOperation); - pRuntime->addRuntimeOperation(pLogic, pOperation); - return pOperation; + LPIOperation pOperation = rdo::Factory::create(pRuntime, this, traceable(), pCondition, _oprName); + ASSERT(pOperation); + pRuntime->addRuntimeOperation(pLogic, pOperation); + return pOperation; } // -------------------------------------------------------------------------------- // -------------------- RDOPatternKeyboard // -------------------------------------------------------------------------------- RDOPatternKeyboard::RDOPatternKeyboard(bool trace) - : RDOPatternOperation(trace) + : RDOPatternOperation(trace) {} RDOPatternKeyboard::~RDOPatternKeyboard() @@ -297,18 +297,18 @@ RDOPatternKeyboard::~RDOPatternKeyboard() LPIKeyboard RDOPatternKeyboard::createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const std::string& _oprName) { - LPIKeyboard pKeyboard = rdo::Factory::create(pRuntime, this, traceable(), _oprName); - ASSERT(pKeyboard); - pRuntime->addRuntimeOperation(pLogic, pKeyboard.object_dynamic_cast()); - return pKeyboard; + LPIKeyboard pKeyboard = rdo::Factory::create(pRuntime, this, traceable(), _oprName); + ASSERT(pKeyboard); + pRuntime->addRuntimeOperation(pLogic, pKeyboard.object_dynamic_cast()); + return pKeyboard; } LPIKeyboard RDOPatternKeyboard::createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const LPRDOCalc& pCondition, const std::string& _oprName) { - LPIKeyboard pKeyboard = rdo::Factory::create(pRuntime, this, traceable(), pCondition, _oprName); - ASSERT(pKeyboard); - pRuntime->addRuntimeOperation(pLogic, pKeyboard.object_dynamic_cast()); - return pKeyboard; + LPIKeyboard pKeyboard = rdo::Factory::create(pRuntime, this, traceable(), pCondition, _oprName); + ASSERT(pKeyboard); + pRuntime->addRuntimeOperation(pLogic, pKeyboard.object_dynamic_cast()); + return pKeyboard; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_pattern.h b/simulator/runtime/rdo_pattern.h index f442c6aad..a167c03f1 100644 --- a/simulator/runtime/rdo_pattern.h +++ b/simulator/runtime/rdo_pattern.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_PATTERN_H_ -#define _LIB_RUNTIME_PATTERN_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -18,28 +17,28 @@ class RDOKeyboard; PREDECLARE_POINTER(RDOPattern); class RDOPattern - : public virtual rdo::counter_reference - , public RDORuntimeObject - , public RDOTraceableObject + : public virtual rdo::counter_reference + , public RDORuntimeObject + , public RDOTraceableObject { DECLARE_FACTORY(RDOPattern); public: - void addPreSelectRelRes(const LPRDOCalc& pCalc); + void addPreSelectRelRes(const LPRDOCalc& pCalc); protected: - RDOPattern(bool trace); - virtual ~RDOPattern(); + RDOPattern(bool trace); + virtual ~RDOPattern(); - typedef std::vector CalcList; - typedef std::vector ConvertStatusList; + typedef std::vector CalcList; + typedef std::vector ConvertStatusList; - CalcList m_preSelectRelRes; + CalcList m_preSelectRelRes; - void preSelectRelRes(const LPRDORuntime& pRuntime); + void preSelectRelRes(const LPRDORuntime& pRuntime); - void runCalcs(CalcList& calcList, const LPRDORuntime& pRuntime); - bool runCalcsBool(CalcList& calcList, const LPRDORuntime& pRuntime); + void runCalcs(CalcList& calcList, const LPRDORuntime& pRuntime); + bool runCalcsBool(CalcList& calcList, const LPRDORuntime& pRuntime); }; class RDOPatternEvent: public RDOPattern @@ -48,26 +47,26 @@ DECLARE_FACTORY(RDOPatternEvent); friend class RDOEvent; public: - void addConvertorStatus(RDOResource::ConvertStatus status); + void addConvertorStatus(RDOResource::ConvertStatus status); - void addConvertorCalc (const LPRDOCalc& pCalc); - void addEraseCalc (const LPRDOCalc& pCalc); + void addConvertorCalc (const LPRDOCalc& pCalc); + void addEraseCalc (const LPRDOCalc& pCalc); - void convertEvent(const LPRDORuntime& pRuntime); - void convertErase(const LPRDORuntime& pRuntime); + void convertEvent(const LPRDORuntime& pRuntime); + void convertErase(const LPRDORuntime& pRuntime); - double getNextTimeInterval(const LPRDORuntime& pRuntime); + double getNextTimeInterval(const LPRDORuntime& pRuntime); - LPIEvent createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const std::string& oprName); + LPIEvent createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const std::string& oprName); private: - RDOPatternEvent(bool trace); - virtual ~RDOPatternEvent(); + RDOPatternEvent(bool trace); + virtual ~RDOPatternEvent(); - LPRDOCalc m_timeCalc; - CalcList m_convertor; - ConvertStatusList m_convertorStatus; - CalcList m_erase; + LPRDOCalc m_timeCalc; + CalcList m_convertor; + ConvertStatusList m_convertorStatus; + CalcList m_erase; }; DECLARE_POINTER(RDOPatternEvent); @@ -77,28 +76,28 @@ DECLARE_FACTORY(RDOPatternRule); friend class RDORule; public: - void addConvertorStatus(RDOResource::ConvertStatus status); + void addConvertorStatus(RDOResource::ConvertStatus status); - void addChoiceFromCalc (const LPRDOCalc& pCalc); - void addConvertorCalc (const LPRDOCalc& pCalc); - void addEraseCalc (const LPRDOCalc& pCalc); + void addChoiceFromCalc (const LPRDOCalc& pCalc); + void addConvertorCalc (const LPRDOCalc& pCalc); + void addEraseCalc (const LPRDOCalc& pCalc); - void convertRule (const LPRDORuntime& pRuntime); - void convertErase(const LPRDORuntime& pRuntime); + void convertRule (const LPRDORuntime& pRuntime); + void convertErase(const LPRDORuntime& pRuntime); - bool choiceFrom (const LPRDORuntime& pRuntime); + bool choiceFrom (const LPRDORuntime& pRuntime); - LPIRule createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const std::string& _oprName); - LPIRule createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const LPRDOCalc& condition, const std::string& _oprName); + LPIRule createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const std::string& _oprName); + LPIRule createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const LPRDOCalc& condition, const std::string& _oprName); private: - RDOPatternRule(bool trace); - virtual ~RDOPatternRule(); + RDOPatternRule(bool trace); + virtual ~RDOPatternRule(); - CalcList m_choiceFrom; - CalcList m_convertor; - ConvertStatusList m_convertorStatus; - CalcList m_erase; + CalcList m_choiceFrom; + CalcList m_convertor; + ConvertStatusList m_convertorStatus; + CalcList m_erase; }; DECLARE_POINTER(RDOPatternRule); @@ -108,42 +107,42 @@ DECLARE_FACTORY(RDOPatternOperation); friend class RDOOperation; public: - void addConvertorBeginStatus(RDOResource::ConvertStatus status); - void addConvertorEndStatus (RDOResource::ConvertStatus status); + void addConvertorBeginStatus(RDOResource::ConvertStatus status); + void addConvertorEndStatus (RDOResource::ConvertStatus status); - void addChoiceFromCalc (const LPRDOCalc& pCalc); - void addConvertorBeginCalc (const LPRDOCalc& pCalc); - void addConvertorEndCalc (const LPRDOCalc& pCalc); - void addEraseBeginCalc (const LPRDOCalc& pCalc); - void addEraseEndCalc (const LPRDOCalc& pCalc); - void setTime (const LPRDOCalc& pCalc); + void addChoiceFromCalc (const LPRDOCalc& pCalc); + void addConvertorBeginCalc (const LPRDOCalc& pCalc); + void addConvertorEndCalc (const LPRDOCalc& pCalc); + void addEraseBeginCalc (const LPRDOCalc& pCalc); + void addEraseEndCalc (const LPRDOCalc& pCalc); + void setTime (const LPRDOCalc& pCalc); - void convertBegin (const LPRDORuntime& pRuntime); - void convertEnd (const LPRDORuntime& pRuntime); - void convertBeginErase (const LPRDORuntime& pRuntime); - void convertEndErase (const LPRDORuntime& pRuntime); + void convertBegin (const LPRDORuntime& pRuntime); + void convertEnd (const LPRDORuntime& pRuntime); + void convertBeginErase (const LPRDORuntime& pRuntime); + void convertEndErase (const LPRDORuntime& pRuntime); - bool choiceFrom(const LPRDORuntime& pRuntime); - double getNextTimeInterval(const LPRDORuntime& pRuntime); + bool choiceFrom(const LPRDORuntime& pRuntime); + double getNextTimeInterval(const LPRDORuntime& pRuntime); - LPIOperation createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const std::string& _oprName); - LPIOperation createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const LPRDOCalc& condition, const std::string& _oprName); + LPIOperation createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const std::string& _oprName); + LPIOperation createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const LPRDOCalc& condition, const std::string& _oprName); protected: - RDOPatternOperation(bool trace); - virtual ~RDOPatternOperation(); + RDOPatternOperation(bool trace); + virtual ~RDOPatternOperation(); private: - LPRDOCalc m_timeCalc; - CalcList m_choiceFrom; + LPRDOCalc m_timeCalc; + CalcList m_choiceFrom; - CalcList m_convertorBegin; - ConvertStatusList m_convertorBeginStatus; - CalcList m_eraseBegin; + CalcList m_convertorBegin; + ConvertStatusList m_convertorBeginStatus; + CalcList m_eraseBegin; - CalcList m_convertorEnd; - ConvertStatusList m_convertorEndStatus; - CalcList m_eraseEnd; + CalcList m_convertorEnd; + ConvertStatusList m_convertorEndStatus; + CalcList m_eraseEnd; }; DECLARE_POINTER(RDOPatternOperation); @@ -151,15 +150,13 @@ class RDOPatternKeyboard: public RDOPatternOperation { DECLARE_FACTORY(RDOPatternKeyboard); public: - LPIKeyboard createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const std::string& _oprName); - LPIKeyboard createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const LPRDOCalc& condition, const std::string& _oprName); + LPIKeyboard createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const std::string& _oprName); + LPIKeyboard createActivity(LPIBaseOperationContainer pLogic, const LPRDORuntime& pRuntime, const LPRDOCalc& condition, const std::string& _oprName); private: - RDOPatternKeyboard(bool trace); - virtual ~RDOPatternKeyboard(); + RDOPatternKeyboard(bool trace); + virtual ~RDOPatternKeyboard(); }; DECLARE_POINTER(RDOPatternKeyboard); CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_PATTERN_H_ diff --git a/simulator/runtime/rdo_priority.cpp b/simulator/runtime/rdo_priority.cpp index 80d83566f..f1e4ac43f 100644 --- a/simulator/runtime/rdo_priority.cpp +++ b/simulator/runtime/rdo_priority.cpp @@ -18,35 +18,35 @@ RDOPatternPrior::~RDOPatternPrior() LPRDOCalc RDOPatternPrior::getPrior() { - return m_pPrior; + return m_pPrior; } bool RDOPatternPrior::setPrior(const LPRDOCalc& pPrior) { - m_pPrior = pPrior; - return true; + m_pPrior = pPrior; + return true; } // -------------------------------------------------------------------------------- // -------------------- RDODPTActivityCompare // -------------------------------------------------------------------------------- RDODPTActivityCompare::RDODPTActivityCompare(const LPRDORuntime& pRuntime) - : m_pRuntime(pRuntime) + : m_pRuntime(pRuntime) {} bool RDODPTActivityCompare::operator()(const LPIBaseOperation& pOpr1, const LPIBaseOperation& pOpr2) { - LPIPriority pPattern1 = pOpr1.object_dynamic_cast(); - LPIPriority pPattern2 = pOpr2.object_dynamic_cast(); - if (pPattern1 && pPattern2) - { - LPRDOCalc pPrior1 = pPattern1->getPrior(); - LPRDOCalc pPrior2 = pPattern2->getPrior(); - RDOValue value1 = pPrior1 ? pPrior1->calcValue(m_pRuntime) : RDOValue(0.0); - RDOValue value2 = pPrior2 ? pPrior2->calcValue(m_pRuntime) : RDOValue(0.0); - return value1 > value2; - } - return false; + LPIPriority pPattern1 = pOpr1.object_dynamic_cast(); + LPIPriority pPattern2 = pOpr2.object_dynamic_cast(); + if (pPattern1 && pPattern2) + { + LPRDOCalc pPrior1 = pPattern1->getPrior(); + LPRDOCalc pPrior2 = pPattern2->getPrior(); + RDOValue value1 = pPrior1 ? pPrior1->calcValue(m_pRuntime) : RDOValue(0.0); + RDOValue value2 = pPrior2 ? pPrior2->calcValue(m_pRuntime) : RDOValue(0.0); + return value1 > value2; + } + return false; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_priority.h b/simulator/runtime/rdo_priority.h index 445a8c069..50ebb852c 100644 --- a/simulator/runtime/rdo_priority.h +++ b/simulator/runtime/rdo_priority.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_PRIORITY_H_ -#define _LIB_RUNTIME_PRIORITY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -14,26 +13,24 @@ OPEN_RDO_RUNTIME_NAMESPACE class RDOPatternPrior: public IPriority { protected: - RDOPatternPrior(); - virtual ~RDOPatternPrior(); + RDOPatternPrior(); + virtual ~RDOPatternPrior(); private: - virtual LPRDOCalc getPrior(); - virtual bool setPrior(const LPRDOCalc& pPrior); + virtual LPRDOCalc getPrior(); + virtual bool setPrior(const LPRDOCalc& pPrior); - LPRDOCalc m_pPrior; + LPRDOCalc m_pPrior; }; class RDODPTActivityCompare { public: - RDODPTActivityCompare(const LPRDORuntime& pRuntime); - bool operator()(const LPIBaseOperation& pOpr1, const LPIBaseOperation& pOpr2); + RDODPTActivityCompare(const LPRDORuntime& pRuntime); + bool operator()(const LPIBaseOperation& pOpr1, const LPIBaseOperation& pOpr2); private: - LPRDORuntime m_pRuntime; + LPRDORuntime m_pRuntime; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_PRIORITY_H_ diff --git a/simulator/runtime/rdo_priority_i.h b/simulator/runtime/rdo_priority_i.h index 34860966d..27ed626ae 100644 --- a/simulator/runtime/rdo_priority_i.h +++ b/simulator/runtime/rdo_priority_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_PRIORITY_I_H_ -#define _LIB_RUNTIME_PRIORITY_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,13 +15,11 @@ CLOSE_RDO_RUNTIME_NAMESPACE class IPriority: public virtual rdo::counter_reference { public: - virtual rdo::runtime::LPRDOCalc getPrior() = 0; - virtual bool setPrior(const rdo::runtime::LPRDOCalc& pPrior) = 0; + virtual rdo::runtime::LPRDOCalc getPrior() = 0; + virtual bool setPrior(const rdo::runtime::LPRDOCalc& pPrior) = 0; }; DECLARE_POINTER(IPriority) #define DECLARE_IPriority \ - virtual rdo::runtime::LPRDOCalc getPrior(); \ - virtual bool setPrior(const rdo::runtime::LPRDOCalc& pPrior); - -#endif // _LIB_RUNTIME_PRIORITY_I_H_ + virtual rdo::runtime::LPRDOCalc getPrior(); \ + virtual bool setPrior(const rdo::runtime::LPRDOCalc& pPrior); diff --git a/simulator/runtime/rdo_random_distribution.cpp b/simulator/runtime/rdo_random_distribution.cpp index afe6429f1..bf182e117 100644 --- a/simulator/runtime/rdo_random_distribution.cpp +++ b/simulator/runtime/rdo_random_distribution.cpp @@ -12,7 +12,7 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RandGenerator // -------------------------------------------------------------------------------- RandGenerator::RandGenerator(long int seed) - : m_seed(seed) + : m_seed(seed) {} RandGenerator::~RandGenerator() @@ -20,30 +20,30 @@ RandGenerator::~RandGenerator() void RandGenerator::setSeed(long int seed) { - m_seed = seed; + m_seed = seed; } double RandGenerator::u01() { #ifdef RDO_NATIVE_U01 - m_seed = m_seed * 69069 + 1; - return m_seed / 4294967296.0; + m_seed = m_seed * 69069 + 1; + return m_seed / 4294967296.0; #else - const long int MODLUS = 2147483647; - const long int MULT1 = 24112; - const long int MULT2 = 26143; - long int zi = m_seed; - long int lowprd = (zi & 65535) * MULT1; - long int hi31 = (zi >> 16) * MULT1 + (lowprd >> 16); - zi = ((lowprd & 65535) - MODLUS) + ((hi31 & 32767) << 16) + (hi31 >> 15); - if (zi < 0) zi += MODLUS; - lowprd = (zi & 65535) * MULT2; - hi31 = (zi >> 16) * MULT2 + (lowprd >> 16); - zi = ((lowprd & 65535) - MODLUS) + ((hi31 & 32767) << 16) + (hi31 >> 15); - if (zi < 0) zi += MODLUS; - m_seed = zi; - //return ((zi >> 7) + 1) / 16777216.0; // Так в примере на FORTRAN imho - return (((zi >> 7) | 1) + 1) / 16777216.0; // Так в примере на C + const long int MODLUS = 2147483647; + const long int MULT1 = 24112; + const long int MULT2 = 26143; + long int zi = m_seed; + long int lowprd = (zi & 65535) * MULT1; + long int hi31 = (zi >> 16) * MULT1 + (lowprd >> 16); + zi = ((lowprd & 65535) - MODLUS) + ((hi31 & 32767) << 16) + (hi31 >> 15); + if (zi < 0) zi += MODLUS; + lowprd = (zi & 65535) * MULT2; + hi31 = (zi >> 16) * MULT2 + (lowprd >> 16); + zi = ((lowprd & 65535) - MODLUS) + ((hi31 & 32767) << 16) + (hi31 >> 15); + if (zi < 0) zi += MODLUS; + m_seed = zi; + //return ((zi >> 7) + 1) / 16777216.0; // Так в примере на FORTRAN imho + return (((zi >> 7) | 1) + 1) / 16777216.0; // Так в примере на C #endif } @@ -51,62 +51,62 @@ double RandGenerator::u01() // -------------------- RandGeneratorUniform // -------------------------------------------------------------------------------- RandGeneratorUniform::RandGeneratorUniform(long int seed) - : RandGenerator(seed) + : RandGenerator(seed) {} double RandGeneratorUniform::next(double from, double to) { - return u01() * (to - from) + from; + return u01() * (to - from) + from; } // -------------------------------------------------------------------------------- // -------------------- RandGeneratorExponential // -------------------------------------------------------------------------------- RandGeneratorExponential::RandGeneratorExponential(long int seed) - : RandGenerator(seed) + : RandGenerator(seed) {} double RandGeneratorExponential::next(double math) { - return -log(u01()) * math; + return -log(u01()) * math; } // -------------------------------------------------------------------------------- // -------------------- RandGeneratorNormal // -------------------------------------------------------------------------------- RandGeneratorNormal::RandGeneratorNormal(long int seed) - : RandGenerator(seed) + : RandGenerator(seed) {} double RandGeneratorNormal::next(double av, double var) { - double ran = 0; - for (int i = 0; i < 12; ++i) - { - ran += u01(); - } - return var * (ran - 6) + av; + double ran = 0; + for (int i = 0; i < 12; ++i) + { + ran += u01(); + } + return var * (ran - 6) + av; } // -------------------------------------------------------------------------------- // -------------------- RandGeneratorTriangular // -------------------------------------------------------------------------------- RandGeneratorTriangular::RandGeneratorTriangular(long int seed) - : RandGenerator(seed) + : RandGenerator(seed) {} double RandGeneratorTriangular::next(double from, double top, double to) { - double result; - if (u01() > (top-from)/(to-from)) - { - result = -(to-top)*(sqrt(u01()) - 1); - } - else - { - result = (top-from)*(sqrt(u01()) - 1); - } - return result + top; + double result; + if (u01() > (top-from)/(to-from)) + { + result = -(to-top)*(sqrt(u01()) - 1); + } + else + { + result = (top-from)*(sqrt(u01()) - 1); + } + return result + top; } // -------------------------------------------------------------------------------- @@ -122,72 +122,72 @@ RandGeneratorCommonNext::~RandGeneratorCommonNext() // -------------------- RandGeneratorByHist // -------------------------------------------------------------------------------- RandGeneratorByHist::RandGeneratorByHist(long int seed) - : RandGeneratorUniform (seed) - , RandGeneratorCommonNext( ) - , summ (0 ) + : RandGeneratorUniform (seed) + , RandGeneratorCommonNext( ) + , summ (0 ) {} // -------------------------------------------------------------------------------- // -------------------- RandGeneratorByHistReal // -------------------------------------------------------------------------------- RandGeneratorByHistReal::RandGeneratorByHistReal(long int seed) - : RandGeneratorByHist(seed) + : RandGeneratorByHist(seed) {} void RandGeneratorByHistReal::addValues(double from, double to, double freq) { - m_from.push_back(from); - m_to.push_back (to ); - m_freq.push_back(freq); - summ += freq; + m_from.push_back(from); + m_to.push_back (to ); + m_freq.push_back(freq); + summ += freq; } RDOValue RandGeneratorByHistReal::next() { - double ran1 = RandGeneratorUniform::next(0, summ); - double add = 0; - std::vector::size_type i; - for (i = 0; i < m_freq.size() - 1; ++i) - { - if (ran1 < m_freq[i] + add) break; - add += m_freq[i]; - } - return RandGeneratorUniform::next(m_from[i], m_to[i]); + double ran1 = RandGeneratorUniform::next(0, summ); + double add = 0; + std::vector::size_type i; + for (i = 0; i < m_freq.size() - 1; ++i) + { + if (ran1 < m_freq[i] + add) break; + add += m_freq[i]; + } + return RandGeneratorUniform::next(m_from[i], m_to[i]); } // -------------------------------------------------------------------------------- // -------------------- RandGeneratorByHistEnum // -------------------------------------------------------------------------------- RandGeneratorByHistEnum::RandGeneratorByHistEnum(long int seed) - : RandGeneratorByHist(seed) + : RandGeneratorByHist(seed) {} void RandGeneratorByHistEnum::addValues(RDOValue val, double freq) { - m_vals.push_back(val); - m_freq.push_back(freq); - summ += freq; + m_vals.push_back(val); + m_freq.push_back(freq); + summ += freq; } RDOValue RandGeneratorByHistEnum::next() { - double ran1 = RandGeneratorUniform::next(0, summ); - double add = 0; - std::vector::size_type i; - for (i = 0; i < m_freq.size() - 1; ++i) - { - if (ran1 < m_freq[i] + add) break; - add += m_freq[i]; - } - return m_vals[i]; + double ran1 = RandGeneratorUniform::next(0, summ); + double add = 0; + std::vector::size_type i; + for (i = 0; i < m_freq.size() - 1; ++i) + { + if (ran1 < m_freq[i] + add) break; + add += m_freq[i]; + } + return m_vals[i]; } // -------------------------------------------------------------------------------- // -------------------- RandGeneratorEnumerative // -------------------------------------------------------------------------------- RandGeneratorEnumerative::RandGeneratorEnumerative() - : RandGeneratorCommonNext( ) - , m_curr (0) + : RandGeneratorCommonNext( ) + , m_curr (0) {} RandGeneratorEnumerative::~RandGeneratorEnumerative() @@ -195,14 +195,14 @@ RandGeneratorEnumerative::~RandGeneratorEnumerative() void RandGeneratorEnumerative::addValue(RDOValue val) { - m_vals.push_back(val); + m_vals.push_back(val); } RDOValue RandGeneratorEnumerative::next() { - RDOValue res = m_vals[m_curr++]; - if (m_curr >= m_vals.size()) m_curr = 0; - return res; + RDOValue res = m_vals[m_curr++]; + if (m_curr >= m_vals.size()) m_curr = 0; + return res; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_random_distribution.h b/simulator/runtime/rdo_random_distribution.h index c97dedee6..db9ca5672 100644 --- a/simulator/runtime/rdo_random_distribution.h +++ b/simulator/runtime/rdo_random_distribution.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_RANDOM_DISTRIBUTION_H_ -#define _LIB_RUNTIME_RANDOM_DISTRIBUTION_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -9,181 +8,119 @@ OPEN_RDO_RUNTIME_NAMESPACE -//! Законы распределения псевдослучайных чисел в стиле РДО #define RDO_NATIVE_U01 -//! Базовое равномерное распределение [0, 1) class RandGenerator { public: - //! Удалять нельзя, нужен именно виртуальный деструктор для вызова из \ref RDOCalcSeqInit::~RDOCalcSeqInit() - virtual ~RandGenerator(); + virtual ~RandGenerator(); - //! Установка базы генератора - //! @param seed - База генератора - void setSeed(long int seed = 123456789); + void setSeed(long int seed = 123456789); - //! @brief Генерация псевдо-случайного числа на интевале [0, 1) по равномерному закону распределения - //! @result Псевдо-случайное число, значение в дипазоне [0, 1) - double u01(); + double u01(); protected: #ifdef RDO_NATIVE_U01 - //! @param m_seed База генератора - std::uint32_t m_seed; + std::uint32_t m_seed; #else - long int m_seed; + long int m_seed; #endif - RandGenerator(long int seed = 123456789); + RandGenerator(long int seed = 123456789); }; -//! Равномерное распределение [0, 1) class RandGeneratorUniform: public RandGenerator { public: - //! @param seed База генератора псевдослучайных чисел - RandGeneratorUniform(long int seed = 123456789); - - //! @brief Генерация чисел из последовательности по Равномерному закону - //! @param from Нижняя граница диапазона распределения - //! @param to Верхняя граница диапазона распределения - //! @note Базовое равномерное распределение масштабируется домножением на ширину диапазона и смещается прибавлением левой границы - //! @return Число из диапазона распределения - double next(double from, double to); + RandGeneratorUniform(long int seed = 123456789); + + double next(double from, double to); }; -//! Экспоненциальное распределение class RandGeneratorExponential: public RandGenerator { public: - //! @param seed База генератора псевдослучайных чисел - RandGeneratorExponential(long int seed = 123456789); + RandGeneratorExponential(long int seed = 123456789); - //! @brief Генерация чисел из последовательности по Эспоненциальному закону - //! @param math Математическое ожидание закона распределения - //! @result Число от 0 до бесконечности - double next(double math); + double next(double math); }; -//! Нормальное распределение class RandGeneratorNormal: public RandGenerator { public: - //! @param seed База генератора псевдослучайных чисел - RandGeneratorNormal(long int seed = 123456789); - - //! @brief Генерация чисел из последовательности по Нормальному закону - //! @param av Математическое ожидание последовательности - //! @param var Среднеквадратическое отклонение - //! @note Необъяснимые телодвижения, продиктованные опытом поколений (взято из литературы по программированию) - //! @result Число от минус бесконечноти до бесконечности. Но по факту чаще всего число из диапазона av+-3*var - double next(double av, double var); + RandGeneratorNormal(long int seed = 123456789); + + double next(double av, double var); }; -//! Треугольное распределение class RandGeneratorTriangular: public RandGenerator { public: - //! @param seed База генератора псевдослучайных чисел - RandGeneratorTriangular(long int seed = 123456789); - - //! @brief Генерация чисел из последовательности по Треугольному закону - //! @param from Левая граница интервала распределения - //! @param top Точка под вершиной треугольника - //! @param to Правая граница интервала распределения - //! result Число из диапазона распределения - double next(double from, double top, double to); + RandGeneratorTriangular(long int seed = 123456789); + + double next(double from, double top, double to); }; -//! Общий класс для by_hist и enumerative class RandGeneratorCommonNext { public: - virtual ~RandGeneratorCommonNext(); - virtual RDOValue next() = 0; + virtual ~RandGeneratorCommonNext(); + virtual RDOValue next() = 0; protected: - RandGeneratorCommonNext(); + RandGeneratorCommonNext(); }; -//! Базовый класс для гистограмм class RandGeneratorByHist: public RandGeneratorUniform, public RandGeneratorCommonNext { protected: - double summ; - //! @param seed База генератора чисел - RandGeneratorByHist(long int seed = 123456789); + double summ; + + RandGeneratorByHist(long int seed = 123456789); }; -//! Гистограмма вещественных чисел class RandGeneratorByHistReal: public RandGeneratorByHist { public: - //! @param seed База генератора чисел - RandGeneratorByHistReal(long int seed = 123456789); + RandGeneratorByHistReal(long int seed = 123456789); - //! @brief Добавление элемента в последовательность by_hist - //! @param from Нижняя граница диапазона - //! @param to Верхняя граница диапазона - //! @param freq Относительная частота попадания последовательности в заданный интервал - //! @note Добавление чисел в контейнер типа vector. Суммирование относительных частот - void addValues(double from, double to, double freq); + void addValues(double from, double to, double freq); private: - std::vector< double > m_from; - std::vector< double > m_to; - std::vector< double > m_freq; + std::vector< double > m_from; + std::vector< double > m_to; + std::vector< double > m_freq; - //! @brief Генерация элемента последовательности by_hist (Real) - //! @return Значение от самой левой из всех границ до самой правой. - virtual RDOValue next(); + virtual RDOValue next(); }; -//! Гистограмма перечислимого типа class RandGeneratorByHistEnum: public RandGeneratorByHist { public: - //! @param seed База генератора чисел - RandGeneratorByHistEnum(long int seed = 123456789); + RandGeneratorByHistEnum(long int seed = 123456789); - //! @brief Добавление элемента в последовательность by_hist - //! @param val Имя перечислимого типа - //! @param freq Относительная частота попадания последовательности в заданный интервал - //! @note Добавление чисел в контейнер типа vector. Суммирование относительных частот - void addValues(RDOValue val, double freq); + void addValues(RDOValue val, double freq); private: - std::vector< RDOValue > m_vals; - std::vector< double > m_freq; + std::vector< RDOValue > m_vals; + std::vector< double > m_freq; - //! @brief Генерация элемента последовательности by_hist (Enum) - //! @result Значение от самой левой из всех границ до самой правой. - virtual RDOValue next(); + virtual RDOValue next(); }; -//! Перечень значений class RandGeneratorEnumerative: public RandGeneratorCommonNext { public: - RandGeneratorEnumerative(); - virtual ~RandGeneratorEnumerative(); + RandGeneratorEnumerative(); + virtual ~RandGeneratorEnumerative(); - //! @brief Добавление элемента в последовательность enumerative - //! @param val Имя вещественной константы или Имя значения в соответсвии с типом значений последовательности - //! @note Добавление значения в контейнер типа vector - void addValue(RDOValue val); + void addValue(RDOValue val); private: - std::vector m_vals; - std::vector::size_type m_curr; + std::vector m_vals; + std::vector::size_type m_curr; - //! @brief Получение элемента из множества элементов Enum - //! @note Возвращает очередное значение из множества определенных элементов. При окончании списка - возврат в начало - //! @return Одно из перечисленных значений - virtual RDOValue next(); + virtual RDOValue next(); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_RANDOM_DISTRIBUTION_H_ diff --git a/simulator/runtime/rdo_res_type.cpp b/simulator/runtime/rdo_res_type.cpp index 1bfff672b..61027ce43 100644 --- a/simulator/runtime/rdo_res_type.cpp +++ b/simulator/runtime/rdo_res_type.cpp @@ -8,12 +8,12 @@ OPEN_RDO_RUNTIME_NAMESPACE RDOResourceTypeList::RDOResourceTypeList(std::size_t number, const LPRDORuntime& pRuntime) - : RDOType (t_pointer) - , RDOTraceableObject(false, number, rdo::toString(number + 1)) + : RDOType(Type::POINTER) + , RDOTraceableObject(false, number, rdo::toString(number + 1)) { - rdo::intrusive_ptr pThis(this); - ASSERT(pThis); - pRuntime->addResType(pThis); + rdo::intrusive_ptr pThis(this); + ASSERT(pThis); + pRuntime->addResType(pThis); } RDOResourceTypeList::~RDOResourceTypeList() @@ -21,67 +21,67 @@ RDOResourceTypeList::~RDOResourceTypeList() void RDOResourceTypeList::setFactoryMethod(const Create& create) { - ASSERT(create); - ASSERT(!m_create); - m_create = create; + ASSERT(create); + ASSERT(!m_create); + m_create = create; } LPRDOResource RDOResourceTypeList::createRes(const LPRDORuntime& pRuntime, std::size_t resID, const std::vector& paramsCalcs, bool traceFlag, bool permanentFlag, bool isNested) { - ASSERT(m_create); + ASSERT(m_create); - rdo::intrusive_ptr pThis(this); - ASSERT(pThis); - LPIResourceType pIResType = pThis.interface_cast(); - ASSERT(pIResType); + rdo::intrusive_ptr pThis(this); + ASSERT(pThis); + LPIResourceType pIResType = pThis.interface_cast(); + ASSERT(pIResType); - LPRDOResource resource = m_create(pRuntime, paramsCalcs, pIResType, resID, getTraceID(), traceFlag, permanentFlag, isNested); - insertNewResource(pRuntime, resource); + LPRDOResource resource = m_create(pRuntime, paramsCalcs, pIResType, resID, getTraceID(), traceFlag, permanentFlag, isNested); + insertNewResource(pRuntime, resource); - return resource; + return resource; } void RDOResourceTypeList::insertNewResource(const LPRDORuntime& pRuntime, const LPRDOResource& pResource) { - ASSERT(pRuntime); - ASSERT(pResource); + ASSERT(pRuntime); + ASSERT(pResource); #ifdef _DEBUG - for (const LPRDOResource& resource: m_resourceList) - { - ASSERT(resource->getTraceID() != pResource->getTraceID()); - } + for (const LPRDOResource& resource: m_resourceList) + { + ASSERT(resource->getTraceID() != pResource->getTraceID()); + } #endif // _DEBUG - m_resourceList.push_back(pResource); - pRuntime->insertNewResource(pResource); + m_resourceList.push_back(pResource); + pRuntime->insertNewResource(pResource); } void RDOResourceTypeList::eraseRes(const LPRDOResource& pResource) { - m_resourceList.remove(pResource); + m_resourceList.remove(pResource); } IResourceType::ResCIterator RDOResourceTypeList::res_begin() const { - return m_resourceList.begin(); + return m_resourceList.begin(); } IResourceType::ResCIterator RDOResourceTypeList::res_end() const { - return m_resourceList.end(); + return m_resourceList.end(); } LPRDOResourceTypeList RDOResourceTypeList::clone(const LPRDORuntime& pRuntime) const { - LPRDOResourceTypeList type = rdo::Factory::create(getTraceID(), pRuntime); - ASSERT(type); - type->setFactoryMethod(m_create); - for (const LPRDOResource& resource: m_resourceList) - { - type->insertNewResource(pRuntime, resource->clone(pRuntime)); - } - return type; + LPRDOResourceTypeList type = rdo::Factory::create(getTraceID(), pRuntime); + ASSERT(type); + type->setFactoryMethod(m_create); + for (const LPRDOResource& resource: m_resourceList) + { + type->insertNewResource(pRuntime, resource->clone(pRuntime)); + } + return type; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_res_type.h b/simulator/runtime/rdo_res_type.h index 6b58c8714..71c071052 100644 --- a/simulator/runtime/rdo_res_type.h +++ b/simulator/runtime/rdo_res_type.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_RES_TYPE_H_ -#define _LIB_RUNTIME_RES_TYPE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -15,38 +14,36 @@ class RDOResourceTypeList; typedef rdo::intrusive_ptr LPRDOResourceTypeList; class RDOResourceTypeList - : public RDOType - , public IResourceType - , public RDORuntimeObject - , public RDOTraceableObject + : public RDOType + , public IResourceType + , public RDORuntimeObject + , public RDOTraceableObject { private: - friend class rdo::Factory; + friend class rdo::Factory; public: - typedef boost::function&, const LPIResourceType&, std::size_t, std::size_t, bool, bool, bool)> Create; - void setFactoryMethod(const Create& create); + typedef boost::function&, const LPIResourceType&, std::size_t, std::size_t, bool, bool, bool)> Create; + void setFactoryMethod(const Create& create); - virtual ResCIterator res_begin() const; - virtual ResCIterator res_end () const; + virtual ResCIterator res_begin() const; + virtual ResCIterator res_end () const; - virtual void eraseRes(const LPRDOResource& pResource); - LPRDOResourceTypeList clone (const LPRDORuntime& pRuntime) const; + virtual void eraseRes(const LPRDOResource& pResource); + LPRDOResourceTypeList clone (const LPRDORuntime& pRuntime) const; protected: - RDOResourceTypeList(std::size_t number, const LPRDORuntime& pRuntime); - virtual ~RDOResourceTypeList(); + RDOResourceTypeList(std::size_t number, const LPRDORuntime& pRuntime); + virtual ~RDOResourceTypeList(); private: - void insertNewResource(const LPRDORuntime& pRuntime, const LPRDOResource& pResource); + void insertNewResource(const LPRDORuntime& pRuntime, const LPRDOResource& pResource); - typedef std::list ResourceList; - ResourceList m_resourceList; - Create m_create; + typedef std::list ResourceList; + ResourceList m_resourceList; + Create m_create; - virtual LPRDOResource createRes(const LPRDORuntime& pRuntime, std::size_t resID, const std::vector& paramsCalcs, bool traceFlag, bool permanentFlag, bool isNested = 0); + virtual LPRDOResource createRes(const LPRDORuntime& pRuntime, std::size_t resID, const std::vector& paramsCalcs, bool traceFlag, bool permanentFlag, bool isNested = 0); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_RES_TYPE_H_ diff --git a/simulator/runtime/rdo_res_type_i.h b/simulator/runtime/rdo_res_type_i.h index bd2a24bee..e1cf63308 100644 --- a/simulator/runtime/rdo_res_type_i.h +++ b/simulator/runtime/rdo_res_type_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_RES_TYPE_I_H_ -#define _LIB_RUNTIME_RES_TYPE_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -18,27 +17,25 @@ struct IResourceType: public rdo::RefCounter { DECLARE_FACTORY(IResourceType); public: - virtual rdo::runtime::LPRDOResource createRes(const LPRDORuntime& pRuntime, std::size_t resID, const std::vector& paramsCalcs, bool traceFlag, bool permanentFlag, bool isNested = 0) = 0; + virtual rdo::runtime::LPRDOResource createRes(const LPRDORuntime& pRuntime, std::size_t resID, const std::vector& paramsCalcs, bool traceFlag, bool permanentFlag, bool isNested = 0) = 0; - typedef std::list ResList; - typedef ResList::const_iterator ResCIterator; + typedef std::list ResList; + typedef ResList::const_iterator ResCIterator; - virtual ResCIterator res_begin() const = 0; - virtual ResCIterator res_end() const = 0; + virtual ResCIterator res_begin() const = 0; + virtual ResCIterator res_end() const = 0; - virtual void eraseRes(const rdo::runtime::LPRDOResource& pResource) = 0; + virtual void eraseRes(const rdo::runtime::LPRDOResource& pResource) = 0; - typedef RDOResource value_type; + typedef RDOResource value_type; protected: - IResourceType() {} - virtual ~IResourceType() {} + IResourceType() {} + virtual ~IResourceType() {} }; #define DECLARE_IResourceType \ - rdo::runtime::LPRDOResource createRes(const LPRDORuntime& pRuntime, std::size_t resID, const std::vector& paramsCalcs, bool traceFlag, bool permanentFlag, bool isNested = 0); + rdo::runtime::LPRDOResource createRes(const LPRDORuntime& pRuntime, std::size_t resID, const std::vector& paramsCalcs, bool traceFlag, bool permanentFlag, bool isNested = 0); CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_RES_TYPE_I_H_ diff --git a/simulator/runtime/rdo_resource.cpp b/simulator/runtime/rdo_resource.cpp index fb62597b1..07db46a29 100644 --- a/simulator/runtime/rdo_resource.cpp +++ b/simulator/runtime/rdo_resource.cpp @@ -11,35 +11,41 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- // -------------------- RDOResource // -------------------------------------------------------------------------------- -RDOResource::RDOResource(const LPRDORuntime& /*pRuntime*/, const ParamList& paramList, LPIResourceType pResType, std::size_t resID, std::size_t typeID, bool trace, bool temporary, bool isNested) - : RDORuntimeObject ( ) - , RDOTraceableObject (trace, resID, rdo::toString(resID + 1)) - , m_temporary (temporary ) - , m_state (RDOResource::CS_None ) - , m_type (typeID ) - , m_referenceCount (0 ) - , m_resType (pResType ) - , m_isNested (isNested ) +RDOResource::RDOResource( + const LPRDORuntime& /*pRuntime*/, + const ParamList& paramList, + LPIResourceType pResType, + std::size_t resID, + std::size_t typeID, + bool trace, + bool temporary, + bool isNested) + : RDOTraceableObject(trace, resID, rdo::toString(resID + 1)) + , m_temporary (temporary) + , m_isNested (isNested) + , m_state (RDOResource::ConvertStatus::NONE) + , m_type (typeID) + , m_referenceCount (0) + , m_resType (pResType) { - appendParams(paramList.begin(), paramList.end()); + appendParams(paramList.begin(), paramList.end()); } -/// @todo копирующий конструктор не используется - нужен ли он? +// TODO копирующий конструктор не используется - нужен ли он? RDOResource::RDOResource(const LPRDORuntime& /*pRuntime*/, const RDOResource& copy) - : RDORuntimeObject ( ) - , RDOTraceableObject (copy.traceable(), copy.getTraceID(), copy.traceId()) - , m_paramList (copy.m_paramList ) - , m_temporary (copy.m_temporary ) - , m_state (copy.m_state ) - , m_type (copy.m_type ) - , m_referenceCount (0 ) - , m_resType (copy.m_resType ) - , m_typeId (copy.m_typeId ) - , m_isNested (copy.m_isNested ) + : RDOTraceableObject(copy.traceable(), copy.getTraceID(), copy.traceId()) + , m_paramList (copy.m_paramList) + , m_temporary (copy.m_temporary) + , m_isNested (copy.m_isNested ) + , m_state (copy.m_state ) + , m_type (copy.m_type ) + , m_referenceCount(0 ) + , m_resType (copy.m_resType ) + , m_typeId (copy.m_typeId ) { - appendParams(copy.m_paramList.begin(), copy.m_paramList.end()); -/// @todo посмотреть history и принять решение о комментарии -// getRuntime()->incrementResourceIdReference( getTraceID() ); + appendParams(copy.m_paramList.begin(), copy.m_paramList.end()); +// TODO посмотреть history и принять решение о комментарии +// getRuntime()->incrementResourceIdReference( getTraceID() ); } RDOResource::~RDOResource() @@ -47,222 +53,222 @@ RDOResource::~RDOResource() bool RDOResource::operator== (const RDOResource& other) const { - if (m_type != other.m_type) - return false; - - if (m_paramList.size() != other.m_paramList.size()) - return false; - - int size = m_paramList.size(); - for (int i = 0; i < size; ++i) - { - if (m_paramList[i] != other.m_paramList[i]) - return false; - } - return true; + if (m_type != other.m_type) + return false; + + if (m_paramList.size() != other.m_paramList.size()) + return false; + + int size = m_paramList.size(); + for (int i = 0; i < size; ++i) + { + if (m_paramList[i] != other.m_paramList[i]) + return false; + } + return true; } LPRDOResource RDOResource::clone(const LPRDORuntime& pRuntime) const { - const LPRDOResourceTypeList& resourceType = pRuntime->getResType(m_type); - ASSERT(resourceType); - LPRDOResource pResource = rdo::Factory::create(pRuntime, m_paramList, resourceType.interface_cast(), getTraceID(), m_type, traceable(), m_temporary, m_isNested); - ASSERT(pResource); - return pResource; + const LPRDOResourceTypeList& resourceType = pRuntime->getResType(m_type); + ASSERT(resourceType); + LPRDOResource pResource = rdo::Factory::create(pRuntime, m_paramList, resourceType.interface_cast(), getTraceID(), m_type, traceable(), m_temporary, m_isNested); + ASSERT(pResource); + return pResource; } std::string RDOResource::getTypeId() { - std::ostringstream str; - str << m_type; - return str.str(); + std::ostringstream str; + str << m_type; + return str.str(); } std::string RDOResource::traceParametersValue() { - std::ostringstream str; - if(m_paramList.size() > 0) - { - ParamList::iterator end = m_paramList.end(); - for (ParamList::iterator it = m_paramList.begin();;) - { + std::ostringstream str; + if(m_paramList.size() > 0) + { + ParamList::iterator end = m_paramList.end(); + for (ParamList::iterator it = m_paramList.begin();;) + { #ifdef RDOSIM_COMPATIBLE - std::ostringstream _str; - _str << *it; - std::string::size_type pos = _str.str().find("e"); - if (pos != std::string::npos) - { - std::string __str = _str.str(); - __str.erase(pos + 2, 1); - str << __str.c_str(); - } - else - { - str << _str.str().c_str(); - } + std::ostringstream _str; + _str << *it; + std::string::size_type pos = _str.str().find("e"); + if (pos != std::string::npos) + { + std::string __str = _str.str(); + __str.erase(pos + 2, 1); + str << __str.c_str(); + } + else + { + str << _str.str().c_str(); + } #else - str << *it; + str << *it; #endif - if (++it == end) - break; - str << " "; - } - } - return str.str(); + if (++it == end) + break; + str << " "; + } + } + return str.str(); } std::string RDOResource::traceResourceState(char prefix, const LPRDORuntime& pRuntime) { - std::ostringstream res; - if (traceable() || (prefix != '\0')) - { - if (m_state == RDOResource::CS_NoChange || m_state == RDOResource::CS_NonExist) - return ""; - - if (prefix != '\0') - res << prefix; - - switch (m_state) - { - case RDOResource::CS_Create: - res << "RC "; - break; - case RDOResource::CS_Erase: - res << "RE " + std::ostringstream res; + if (traceable() || (prefix != '\0')) + { + if (m_state == RDOResource::ConvertStatus::NOCHANGE || m_state == RDOResource::ConvertStatus::NONEXIST) + return ""; + + if (prefix != '\0') + res << prefix; + + switch (m_state) + { + case RDOResource::ConvertStatus::CREATE: + res << "RC "; + break; + case RDOResource::ConvertStatus::ERASE: + res << "RE " #ifdef RDOSIM_COMPATIBLE - << pRuntime->getCurrentTime() << " " - << traceTypeId() << " " - << traceId() << std::endl; - return res.str(); + << pRuntime->getCurrentTime() << " " + << traceTypeId() << " " + << traceId() << std::endl; + return res.str(); #else - ; + ; #endif - break; - default: - res << "RK "; - break; - } - - res << pRuntime->getCurrentTime() << " " - << traceTypeId() << " " - << traceId() << " " - << traceParametersValue() << std::endl; - } - return res.str(); + break; + default: + res << "RK "; + break; + } + + res << pRuntime->getCurrentTime() << " " + << traceTypeId() << " " + << traceId() << " " + << traceParametersValue() << std::endl; + } + return res.str(); } void RDOResource::setRuntime(const LPRDORuntime& /*pRuntime*/) { - /// @todo походу надо удалить метод - NEVER_REACH_HERE; + // TODO походу надо удалить метод + NEVER_REACH_HERE; } std::string RDOResource::whoAreYou() { - return "rdoRes"; + return "rdoRes"; } void RDOResource::makeTemporary(bool value) { - m_temporary = value; + m_temporary = value; } RDOResource::ConvertStatus RDOResource::getState() const { - return m_state; + return m_state; } void RDOResource::setState(RDOResource::ConvertStatus value) { - m_state = value; + m_state = value; } bool RDOResource::checkType(std::size_t type) const { - return m_type == type; + return m_type == type; } const LPIResourceType& RDOResource::getResType() const { - return m_resType; + return m_resType; } std::size_t RDOResource::getType() const { - return m_type; + return m_type; } const RDOResource::ParamList& RDOResource::getParamList() const { - return m_paramList; + return m_paramList; } const RDOValue& RDOResource::getParam(std::size_t index) const { - ASSERT(index < m_paramList.size()); - return m_paramList[index]; + ASSERT(index < m_paramList.size()); + return m_paramList[index]; } RDOValue& RDOResource::getParamRaw(std::size_t index) { - ASSERT(index < m_paramList.size()); - setState(CS_Keep); - return m_paramList[index]; + ASSERT(index < m_paramList.size()); + setState(ConvertStatus::KEEP); + return m_paramList[index]; } void RDOResource::setParam(std::size_t index, const RDOValue& value) { - ASSERT(index < m_paramList.size()); - setState(CS_Keep); - m_paramList[index] = value; + ASSERT(index < m_paramList.size()); + setState(ConvertStatus::KEEP); + m_paramList[index] = value; } std::size_t RDOResource::paramsCount() const { - return m_paramList.size(); + return m_paramList.size(); } void RDOResource::appendParams(const ParamCIt& from_begin, const ParamCIt& from_end) { - m_paramList.insert(m_paramList.end(), from_begin, from_end); + m_paramList.insert(m_paramList.end(), from_begin, from_end); } bool RDOResource::canFree() const { - return m_referenceCount == 0; + return m_referenceCount == 0; } void RDOResource::incRef() { - ++m_referenceCount; + ++m_referenceCount; } void RDOResource::decRef() { - --m_referenceCount; + --m_referenceCount; } std::string RDOResource::traceTypeId() { - return m_typeId.empty() ? (m_typeId = getTypeId()) : m_typeId; + return m_typeId.empty() ? (m_typeId = getTypeId()) : m_typeId; } void RDOResource::onDestroy(const LPRDORuntime& pRuntime, const LPRDOEraseResRelCalc& pCalc) { - for (auto& param: m_paramList) - { - if(param.type().object_dynamic_cast()) - { - LPRDOResource pNestedResource = param.getPointerByType(); - pNestedResource->onDestroy(pRuntime, pCalc); - } - } - pRuntime->onEraseRes(getTraceID(), pCalc); + for (auto& param: m_paramList) + { + if(param.type().object_dynamic_cast()) + { + LPRDOResource pNestedResource = param.getPointerByType(); + pNestedResource->onDestroy(pRuntime, pCalc); + } + } + pRuntime->onEraseRes(getTraceID(), pCalc); } bool RDOResource::isNested() { - return m_isNested; + return m_isNested; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_resource.h b/simulator/runtime/rdo_resource.h index 51ba9ad3b..5ee551a23 100644 --- a/simulator/runtime/rdo_resource.h +++ b/simulator/runtime/rdo_resource.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_RESOURCE_H_ -#define _LIB_RUNTIME_RESOURCE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -17,71 +16,69 @@ PREDECLARE_OBJECT_INTERFACE(IResourceType); PREDECLARE_POINTER(RDOResource); class RDOResource - : public virtual rdo::counter_reference - , public RDORuntimeObject - , public RDOTraceableObject - , public boost::operators + : public virtual rdo::counter_reference + , public RDORuntimeObject + , public RDOTraceableObject + , public boost::operators { public: - enum ConvertStatus - { - CS_None = 0, - CS_Keep, - CS_Create, - CS_Erase, - CS_NonExist, - CS_NoChange - }; + enum class ConvertStatus + { + NONE = 0, + KEEP, + CREATE, + ERASE, + NONEXIST, + NOCHANGE + }; - typedef std::vector ParamList; - typedef ParamList::const_iterator ParamCIt; + typedef std::vector ParamList; + typedef ParamList::const_iterator ParamCIt; - RDOResource(const LPRDORuntime& pRuntime, const ParamList& paramList, LPIResourceType pResType, std::size_t resID, std::size_t typeID, bool trace, bool temporary, bool isNested = 0); - RDOResource(const LPRDORuntime& pRuntime, const RDOResource& copy); - virtual ~RDOResource(); + RDOResource(const LPRDORuntime& pRuntime, const ParamList& paramList, LPIResourceType pResType, std::size_t resID, std::size_t typeID, bool trace, bool temporary, bool isNested = 0); + RDOResource(const LPRDORuntime& pRuntime, const RDOResource& copy); + virtual ~RDOResource(); - bool operator== (const RDOResource& other) const; + bool operator== (const RDOResource& other) const; - ConvertStatus getState() const; - const RDOValue& getParam(std::size_t index) const; - bool checkType(std::size_t type) const; - bool canFree() const; - const LPIResourceType& getResType() const; - std::size_t getType() const; - virtual std::size_t paramsCount() const; - LPRDOResource clone(const LPRDORuntime& pRuntime) const; - const ParamList& getParamList() const; + ConvertStatus getState() const; + const RDOValue& getParam(std::size_t index) const; + bool checkType(std::size_t type) const; + bool canFree() const; + const LPIResourceType& getResType() const; + std::size_t getType() const; + virtual std::size_t paramsCount() const; + LPRDOResource clone(const LPRDORuntime& pRuntime) const; + const ParamList& getParamList() const; - virtual void appendParams(const ParamCIt& from_begin, const ParamCIt& from_end); - void setRuntime(const LPRDORuntime& pRuntime); - void makeTemporary(bool value); - void setState(ConvertStatus value); - std::string traceResourceState(char prefix, const LPRDORuntime& pRuntime); - RDOValue& getParamRaw(std::size_t index); - void setParam(std::size_t index, const RDOValue& value); - std::string getTypeId(); - std::string traceParametersValue(); - virtual std::string whoAreYou(); - void incRef(); - void decRef(); - void onDestroy(const LPRDORuntime& pRuntime, const LPRDOEraseResRelCalc& pCalc); - bool isNested(); + virtual void appendParams(const ParamCIt& from_begin, const ParamCIt& from_end); + void setRuntime(const LPRDORuntime& pRuntime); + void makeTemporary(bool value); + void setState(ConvertStatus value); + std::string traceResourceState(char prefix, const LPRDORuntime& pRuntime); + RDOValue& getParamRaw(std::size_t index); + void setParam(std::size_t index, const RDOValue& value); + std::string getTypeId(); + std::string traceParametersValue(); + virtual std::string whoAreYou(); + void incRef(); + void decRef(); + void onDestroy(const LPRDORuntime& pRuntime, const LPRDOEraseResRelCalc& pCalc); + bool isNested(); protected: - ParamList m_paramList; - bool m_temporary; - bool m_isNested; - ConvertStatus m_state; + ParamList m_paramList; + bool m_temporary; + bool m_isNested; + ConvertStatus m_state; private: - std::size_t m_type; - std::size_t m_referenceCount; - LPIResourceType m_resType; - std::string m_typeId; + std::size_t m_type; + std::size_t m_referenceCount; + LPIResourceType m_resType; + std::string m_typeId; - std::string traceTypeId(); + std::string traceTypeId(); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_RESOURCE_H_ diff --git a/simulator/runtime/rdo_rule.cpp b/simulator/runtime/rdo_rule.cpp index 0d7e97f83..6d50ea7b1 100644 --- a/simulator/runtime/rdo_rule.cpp +++ b/simulator/runtime/rdo_rule.cpp @@ -11,20 +11,20 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDORule // -------------------------------------------------------------------------------- RDORule::RDORule(const LPRDORuntime& pRuntime, const LPRDOPatternRule& pPattern, bool trace, const std::string& name) - : RDOActivityPattern(pPattern, trace, name) - , RDOPatternPrior ( ) - , m_pRuntime (pRuntime ) + : RDOActivityPattern(pPattern, trace, name) + , RDOPatternPrior ( ) + , m_pRuntime (pRuntime ) { - init(); + init(); } RDORule::RDORule(const LPRDORuntime& pRuntime, const LPRDOPatternRule& pPattern, bool trace, const LPRDOCalc& pCondition, const std::string& name) - : RDOActivityPattern(pPattern, trace, name) - , RDOPatternPrior ( ) - , m_pRuntime (pRuntime ) - , m_pAdditionalCondition (pCondition ) + : RDOActivityPattern(pPattern, trace, name) + , RDOPatternPrior ( ) + , m_pRuntime (pRuntime ) + , m_pAdditionalCondition (pCondition ) { - init(); + init(); } RDORule::~RDORule() @@ -32,23 +32,23 @@ RDORule::~RDORule() void RDORule::init() { - setTraceID(m_pRuntime->getFreeActivityId()); - m_traceOFF = false; + setTraceID(m_pRuntime->getFreeActivityId()); + m_traceOFF = false; } void RDORule::onBeforeChoiceFrom(const LPRDORuntime& pRuntime) { - setPatternParameters(pRuntime, m_paramsCalcs); + setPatternParameters(pRuntime, m_paramsCalcs); } bool RDORule::choiceFrom(const LPRDORuntime& pRuntime) { - pRuntime->setCurrentActivity(this); - if (m_pAdditionalCondition && !m_pAdditionalCondition->calcValue(pRuntime).getAsBool()) - { - return false; - } - return m_pPattern->choiceFrom(pRuntime); + pRuntime->setCurrentActivity(this); + if (m_pAdditionalCondition && !m_pAdditionalCondition->calcValue(pRuntime).getAsBool()) + { + return false; + } + return m_pPattern->choiceFrom(pRuntime); } void RDORule::onBeforeRule(const LPRDORuntime& /*pRuntime*/) @@ -56,63 +56,63 @@ void RDORule::onBeforeRule(const LPRDORuntime& /*pRuntime*/) void RDORule::convertRule(const LPRDORuntime& pRuntime) { - pRuntime->setCurrentActivity(this); - m_pPattern->convertRule(pRuntime); + pRuntime->setCurrentActivity(this); + m_pPattern->convertRule(pRuntime); } void RDORule::onAfterRule(const LPRDORuntime& pRuntime, bool inSearch) { - updateConvertStatus(pRuntime, m_pPattern->m_convertorStatus); - if (!inSearch) - { - trace(); - } - m_pPattern->convertErase(pRuntime); - updateRelRes(pRuntime); + updateConvertStatus(pRuntime, m_pPattern->m_convertorStatus); + if (!inSearch) + { + trace(); + } + m_pPattern->convertErase(pRuntime); + updateRelRes(pRuntime); } void RDORule::trace() { - if (!m_traceOFF) - { - m_pRuntime->getTracer()->writeRule(this, m_pRuntime); - } + if (!m_traceOFF) + { + m_pRuntime->getTracer()->writeRule(this, m_pRuntime); + } } bool RDORule::onCheckCondition(const LPRDORuntime& pRuntime) { - onBeforeChoiceFrom(pRuntime); - pRuntime->inc_cnt_choice_from(); - bool result = choiceFrom(pRuntime); - if (result) - { - m_traceOFF = true; - LPRDORuntime pClone = pRuntime->clone(); - ASSERT(pClone); - if (onDoOperation(pClone) != IBaseOperation::BOR_done) - { - /// @todo Реакция на плохой onDoOperation - это вообще-то спортный вопрос - return false; - } - if (pClone->equal(pRuntime)) - { - result = false; - } - m_traceOFF = false; - } - return result; + onBeforeChoiceFrom(pRuntime); + pRuntime->inc_cnt_choice_from(); + bool result = choiceFrom(pRuntime); + if (result) + { + m_traceOFF = true; + LPRDORuntime pClone = pRuntime->clone(); + ASSERT(pClone); + if (onDoOperation(pClone) != IBaseOperation::ResultCode::DONE) + { + // TODO Реакция на плохой onDoOperation - это вообще-то спортный вопрос + return false; + } + if (pClone->equal(pRuntime)) + { + result = false; + } + m_traceOFF = false; + } + return result; } -IBaseOperation::BOResult RDORule::onDoOperation(const LPRDORuntime& pRuntime) +IBaseOperation::ResultCode RDORule::onDoOperation(const LPRDORuntime& pRuntime) { - onBeforeRule(pRuntime); - convertRule (pRuntime); - onAfterRule (pRuntime, false); - return IBaseOperation::BOR_done; + onBeforeRule(pRuntime); + convertRule (pRuntime); + onAfterRule (pRuntime, false); + return IBaseOperation::ResultCode::DONE; } void RDORule::onStart (const LPRDORuntime& /*pRuntime*/) {} void RDORule::onStop (const LPRDORuntime& /*pRuntime*/) {} -IBaseOperation::BOResult RDORule::onContinue(const LPRDORuntime& /*pRuntime*/) { return IBaseOperation::BOR_cant_run; } +IBaseOperation::ResultCode RDORule::onContinue(const LPRDORuntime& /*pRuntime*/) { return IBaseOperation::ResultCode::CANNOT_RUN; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_rule.h b/simulator/runtime/rdo_rule.h index 81830cd93..0c7e33ffa 100644 --- a/simulator/runtime/rdo_rule.h +++ b/simulator/runtime/rdo_rule.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_RULE_H_ -#define _LIB_RUNTIME_RULE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -22,23 +21,21 @@ friend class RDODPTSearch; friend class TreeNode; private: - RDORule(const LPRDORuntime& pRuntime, const LPRDOPatternRule& pPattern, bool trace, const std::string& name); - RDORule(const LPRDORuntime& pRuntime, const LPRDOPatternRule& pPattern, bool trace, const LPRDOCalc& pCondition, const std::string& name); + RDORule(const LPRDORuntime& pRuntime, const LPRDOPatternRule& pPattern, bool trace, const std::string& name); + RDORule(const LPRDORuntime& pRuntime, const LPRDOPatternRule& pPattern, bool trace, const LPRDOCalc& pCondition, const std::string& name); - virtual ~RDORule(); + virtual ~RDORule(); - void init(); + void init(); - LPRDORuntime m_pRuntime; - LPRDOCalc m_pAdditionalCondition; - bool m_traceOFF; + LPRDORuntime m_pRuntime; + LPRDOCalc m_pAdditionalCondition; + bool m_traceOFF; - void trace(); + void trace(); - DECLARE_IBaseOperation; - DECLARE_IRule; + DECLARE_IBaseOperation; + DECLARE_IRule; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_RULE_H_ diff --git a/simulator/runtime/rdo_rule_i.h b/simulator/runtime/rdo_rule_i.h index d1c13a30b..8ef8b6534 100644 --- a/simulator/runtime/rdo_rule_i.h +++ b/simulator/runtime/rdo_rule_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_RULE_I_H_ -#define _LIB_RUNTIME_RULE_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,19 +15,17 @@ CLOSE_RDO_RUNTIME_NAMESPACE class IRule: public virtual rdo::counter_reference { public: - virtual void onBeforeChoiceFrom(const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual bool choiceFrom (const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual void onBeforeRule (const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual void convertRule (const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual void onAfterRule (const rdo::runtime::LPRDORuntime& pRuntime, bool inSearch) = 0; + virtual void onBeforeChoiceFrom(const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual bool choiceFrom (const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual void onBeforeRule (const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual void convertRule (const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual void onAfterRule (const rdo::runtime::LPRDORuntime& pRuntime, bool inSearch) = 0; }; DECLARE_POINTER(IRule) #define DECLARE_IRule \ - virtual void onBeforeChoiceFrom(const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual bool choiceFrom (const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual void onBeforeRule (const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual void convertRule (const rdo::runtime::LPRDORuntime& pRuntime); \ - virtual void onAfterRule (const rdo::runtime::LPRDORuntime& pRuntime, bool inSearch); - -#endif // _LIB_RUNTIME_RULE_I_H_ + virtual void onBeforeChoiceFrom(const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual bool choiceFrom (const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual void onBeforeRule (const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual void convertRule (const rdo::runtime::LPRDORuntime& pRuntime); \ + virtual void onAfterRule (const rdo::runtime::LPRDORuntime& pRuntime, bool inSearch); diff --git a/simulator/runtime/rdo_runtime-inl.h b/simulator/runtime/rdo_runtime-inl.h index 48f16c2fe..2d284ba48 100644 --- a/simulator/runtime/rdo_runtime-inl.h +++ b/simulator/runtime/rdo_runtime-inl.h @@ -11,8 +11,8 @@ OPEN_RDO_RUNTIME_NAMESPACE template inline RDOResults& RDOResults::operator<< (const T& value) { - getOStream() << value; - return *this; + getOStream() << value; + return *this; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_runtime.cpp b/simulator/runtime/rdo_runtime.cpp index d7d34ec75..4cafc5cae 100644 --- a/simulator/runtime/rdo_runtime.cpp +++ b/simulator/runtime/rdo_runtime.cpp @@ -5,7 +5,7 @@ // ----------------------------------------------------------------------- INCLUDES #include #ifdef COMPILER_GCC - #include + #include #endif // COMPILER_GCC #include // ----------------------------------------------------------------------- SYNOPSIS @@ -26,10 +26,10 @@ #include "simulator/runtime/calc/resource/calc_relevant.h" // -------------------------------------------------------------------------------- -typedef rdo::simulation::report::FileMessage RDOSyntaxMessage; +typedef rdo::simulation::report::FileMessage SyntaxMessage; #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable : 4786) + #pragma warning(disable : 4786) #endif OPEN_RDO_RUNTIME_NAMESPACE @@ -45,28 +45,28 @@ RDOResults::~RDOResults() void RDOResults::width(std::size_t w) { - getOStream().width(w); + getOStream().width(w); } // -------------------------------------------------------------------------------- // -------------------- RDORuntime // -------------------------------------------------------------------------------- RDORuntime::RDORuntime(Error* pError) - : RDOSimulatorTrace() - , m_whyStop (rdo::simulation::report::EC_OK) - , m_funBreakFlag (FBF_NONE) - , m_pStudioThread (NULL ) - , m_pError (pError ) - , m_currFuncTop (0 ) - , m_resultList (NULL ) - , m_resultListInfo (NULL ) - , m_currentTerm (0 ) - , m_pPreparingFrame(NULL ) -{ - ASSERT(m_pError); - m_pTerminateIfCalc = NULL; - m_pMemoryStack = rdo::Factory::create(); - ASSERT(m_pMemoryStack); + : RDOSimulatorTrace() + , m_whyStop(rdo::simulation::report::ExitCode::OK) + , m_functionExitStatus(FunctionExitStatus::NONE) + , m_pStudioThread(NULL) + , m_pError(pError) + , m_currFuncTop(0) + , m_resultList(NULL) + , m_resultListInfo(NULL) + , m_currentTerm(0) + , m_pPreparingFrame(NULL) +{ + ASSERT(m_pError); + m_pTerminateIfCalc = NULL; + m_pMemoryStack = rdo::Factory::create(); + ASSERT(m_pMemoryStack); } RDORuntime::~RDORuntime() @@ -74,699 +74,699 @@ RDORuntime::~RDORuntime() void RDORuntime::init() { - memory_insert(sizeof(RDORuntime)); + memory_insert(sizeof(RDORuntime)); } void RDORuntime::deinit() { - onDestroy(); + onDestroy(); } Notify& RDORuntime::notify() { - return m_notify; + return m_notify; } Error& RDORuntime::error() { - ASSERT(m_pError); - return *m_pError; + ASSERT(m_pError); + return *m_pError; } RDOHotKey& RDORuntime::hotkey() { - return m_hotKey; + return m_hotKey; } RDOResults& RDORuntime::getResults() { - return *m_resultList; + return *m_resultList; } RDOResults& RDORuntime::getResultsInfo() { - return *m_resultListInfo; + return *m_resultListInfo; } double RDORuntime::getTimeNow() { - return getCurrentTime(); + return getCurrentTime(); } double RDORuntime::getSeconds() { - /// @todo использовать явный cast() - return (double)(time(NULL) - m_physicTime); + // TODO использовать явный cast() + return (double)(time(NULL) - m_physicTime); } std::size_t RDORuntime::getCurrentTerm() const { - return m_currentTerm; + return m_currentTerm; } void RDORuntime::setCurrentTerm(std::size_t value) { - m_currentTerm = value; + m_currentTerm = value; } LPIActivity& RDORuntime::getCurrentActivity() { - return m_currActivity; + return m_currActivity; } void RDORuntime::setCurrentActivity(const LPIActivity& activity) { - m_currActivity = activity; + m_currActivity = activity; } const RDORuntime::LPIResultList& RDORuntime::getResult() const { - return m_resultAllList; + return m_resultAllList; } void RDORuntime::addInitCalc(const LPRDOCalc& initCalc) { - m_initCalcList.push_back(initCalc); + m_initCalcList.push_back(initCalc); } RDOValue& RDORuntime::getResParamValRaw(std::size_t resID, std::size_t paramID) { - LPRDOResource pResource = getResourceByID(resID); - ASSERT(pResource); - return pResource->getParamRaw(paramID); + LPRDOResource pResource = getResourceByID(resID); + ASSERT(pResource); + return pResource->getParamRaw(paramID); } void RDORuntime::setResParamVal(std::size_t resID, std::size_t paramID, const RDOValue& value) { - LPRDOResource pResource = getResourceByID(resID); - ASSERT(pResource); - pResource->setParam(paramID, value); + LPRDOResource pResource = getResourceByID(resID); + ASSERT(pResource); + pResource->setParam(paramID, value); } LPRDOResource RDORuntime::getGroupFuncRes() const { - return m_groupFuncStack.back(); + return m_groupFuncStack.back(); } void RDORuntime::pushFuncArgument(RDOValue arg) { - m_funcStack.push_back(arg); + m_funcStack.push_back(arg); } void RDORuntime::pushGroupFunc(const LPRDOResource& pResource) { - m_groupFuncStack.push_back(pResource); + m_groupFuncStack.push_back(pResource); } void RDORuntime::popFuncArgument() { - m_funcStack.pop_back(); + m_funcStack.pop_back(); } void RDORuntime::popGroupFunc() { - m_groupFuncStack.pop_back(); + m_groupFuncStack.pop_back(); } void RDORuntime::pushFuncTop() { - m_funcStack.push_back(RDOValue(m_currFuncTop)); + m_funcStack.push_back(RDOValue(m_currFuncTop)); } void RDORuntime::resetFuncTop(int numArg) { - m_currFuncTop = m_funcStack.size() - numArg; + m_currFuncTop = m_funcStack.size() - numArg; } void RDORuntime::popFuncTop() { - m_currFuncTop = m_funcStack.back().getInt(); - m_funcStack.pop_back(); + m_currFuncTop = m_funcStack.back().getInt(); + m_funcStack.pop_back(); } LPRDOResource RDORuntime::getResourceByID(std::size_t resourceID) const { - return resourceID != std::size_t(~0) && resourceID < m_resourceListByID.size() - ? m_resourceListByID[resourceID] - : LPRDOResource(NULL); + return resourceID != std::size_t(~0) && resourceID < m_resourceListByID.size() + ? m_resourceListByID[resourceID] + : LPRDOResource(NULL); } void RDORuntime::setPatternParameter(std::size_t paramID, const RDOValue& paramValue) { - if (m_patternParameterList.size() <= paramID) - { - m_patternParameterList.resize(paramID + 1); - } - m_patternParameterList[paramID] = paramValue; + if (m_patternParameterList.size() <= paramID) + { + m_patternParameterList.resize(paramID + 1); + } + m_patternParameterList[paramID] = paramValue; } RDOValue RDORuntime::getPatternParameter(std::size_t paramID) const { - ASSERT(paramID < m_patternParameterList.size()); - return m_patternParameterList[paramID]; + ASSERT(paramID < m_patternParameterList.size()); + return m_patternParameterList[paramID]; } void RDORuntime::onNothingMoreToDo() { - m_whyStop = rdo::simulation::report::EC_NoMoreEvents; + m_whyStop = rdo::simulation::report::ExitCode::NOMORE_EVENTS; } void RDORuntime::onEndCondition() { - m_whyStop = rdo::simulation::report::EC_OK; + m_whyStop = rdo::simulation::report::ExitCode::OK; } void RDORuntime::onRuntimeError() { - m_whyStop = rdo::simulation::report::EC_RunTimeError; + m_whyStop = rdo::simulation::report::ExitCode::RUNTIME_ERROR; } void RDORuntime::onUserBreak() { - m_whyStop = rdo::simulation::report::EC_UserBreak; + m_whyStop = rdo::simulation::report::ExitCode::USER_BREAK; } void RDORuntime::addResType(const LPRDOResourceTypeList& pResType) { - ASSERT(pResType); - ASSERT(m_resourceTypeList.size() == pResType->getTraceID() - 1); - m_resourceTypeList.push_back(pResType); + ASSERT(pResType); + ASSERT(m_resourceTypeList.size() == pResType->getTraceID() - 1); + m_resourceTypeList.push_back(pResType); } const LPRDOResourceTypeList& RDORuntime::getResType(std::size_t number) const { - ASSERT(number > 0); - ASSERT(number - 1 < m_resourceTypeList.size()); - return m_resourceTypeList[number - 1]; + ASSERT(number > 0); + ASSERT(number - 1 < m_resourceTypeList.size()); + return m_resourceTypeList[number - 1]; } const LPIThreadProxy& RDORuntime::getThreadProxy() const { - return m_pThreadProxy; + return m_pThreadProxy; } RDORuntime::ResList RDORuntime::getResourcesBeforeSim() const { - ResList list; - for (std::size_t i = 0; i < m_resourceTypeList.size(); i++) - { - ResCIterator it, end; - it = m_resourceTypeList[i]->res_begin(); - end = m_resourceTypeList[i]->res_end (); - while (it != end) - { - list.push_back(*it); - ++it; - } - } - return list; + ResList list; + for (std::size_t i = 0; i < m_resourceTypeList.size(); i++) + { + ResCIterator it, end; + it = m_resourceTypeList[i]->res_begin(); + end = m_resourceTypeList[i]->res_end (); + while (it != end) + { + list.push_back(*it); + ++it; + } + } + return list; } void RDORuntime::preProcess() { - parent_type::preProcess(); - m_physicTime = time(NULL); + parent_type::preProcess(); + m_physicTime = time(NULL); } void RDORuntime::setStudioThread(RDOThread* pStudioThread) { - m_pStudioThread = pStudioThread; + m_pStudioThread = pStudioThread; } bool RDORuntime::endCondition() { - if (!m_pTerminateIfCalc) - { - return false; // forever - } - return fabs(m_pTerminateIfCalc->calcValue(this).getDouble()) > DBL_EPSILON; + if (!m_pTerminateIfCalc) + { + return false; // forever + } + return fabs(m_pTerminateIfCalc->calcValue(this).getDouble()) > DBL_EPSILON; } void RDORuntime::setTerminateIf(const LPRDOCalc& pTerminateIfCalc) { - ASSERT(pTerminateIfCalc); - m_pTerminateIfCalc = pTerminateIfCalc; + ASSERT(pTerminateIfCalc); + m_pTerminateIfCalc = pTerminateIfCalc; } bool RDORuntime::breakPoints() { - for (const auto& breakPoint: m_breakPointList) - { - if (breakPoint->getCalc()->calcValue(this).getAsBool()) - { - m_pLastActiveBreakPoint = breakPoint; - return true; - } - } - return false; + for (const auto& breakPoint: m_breakPointList) + { + if (breakPoint->getCalc()->calcValue(this).getAsBool()) + { + m_pLastActiveBreakPoint = breakPoint; + return true; + } + } + return false; } void RDORuntime::insertBreakPoint(const std::string& name, const LPRDOCalc& pCalc) { - ASSERT(pCalc); - m_breakPointList.push_back(rdo::Factory::create(name, pCalc)); + ASSERT(pCalc); + m_breakPointList.push_back(rdo::Factory::create(name, pCalc)); } LPRDOCalc RDORuntime::findBreakPoint(const std::string& name) { - for (const auto& breakPoint: m_breakPointList) - { - if (breakPoint->getName() == name) - { - return breakPoint->getCalc(); - } - } - return NULL; + for (const auto& breakPoint: m_breakPointList) + { + if (breakPoint->getName() == name) + { + return breakPoint->getCalc(); + } + } + return NULL; } std::string RDORuntime::getLastBreakPointName() const { - return m_pLastActiveBreakPoint ? m_pLastActiveBreakPoint->getName() + ": " + m_pLastActiveBreakPoint->getCalc()->srcInfo().src_text() : ""; + return m_pLastActiveBreakPoint ? m_pLastActiveBreakPoint->getName() + ": " + m_pLastActiveBreakPoint->getCalc()->srcInfo().src_text() : ""; } void RDORuntime::setConstValue(std::size_t constID, const RDOValue& constValue) { - if (m_constantList.size() <= constID) - { - m_constantList.resize(constID + 1); - } - m_constantList[constID] = constValue; + if (m_constantList.size() <= constID) + { + m_constantList.resize(constID + 1); + } + m_constantList[constID] = constValue; } RDOValue RDORuntime::getConstValue(std::size_t constID) const { - ASSERT(constID < m_constantList.size()); - return m_constantList[constID]; + ASSERT(constID < m_constantList.size()); + return m_constantList[constID]; } #ifdef _DEBUG bool RDORuntime::checkState() { - if (m_state.empty()) - { - ValueList res; - res.push_back(1); - res.push_back(4); - m_state.push_back(res); - res[0] = 2; - res[1] = 1; - m_state.push_back(res); - res[0] = 3; - res[1] = 3; - m_state.push_back(res); - res[0] = 4; - res[1] = 2; - m_state.push_back(res); - res[0] = 5; - res[1] = 6; - m_state.push_back(res); - res.clear(); - res.push_back(5); - m_state.push_back(res); - } - if (m_state.size() != m_resourceListByID.size()) return false; - for (std::size_t i = 0; i < m_state.size(); ++i) - { - if (m_state[i].size() != m_resourceListByID[i]->paramsCount()) return false; - for (std::size_t j = 0; j < m_resourceListByID[i]->paramsCount(); ++j) - { - if (m_state[i][j] != m_resourceListByID[i]->getParam(j)) return false; - } - } - return true; + if (m_state.empty()) + { + ValueList res; + res.push_back(1); + res.push_back(4); + m_state.push_back(res); + res[0] = 2; + res[1] = 1; + m_state.push_back(res); + res[0] = 3; + res[1] = 3; + m_state.push_back(res); + res[0] = 4; + res[1] = 2; + m_state.push_back(res); + res[0] = 5; + res[1] = 6; + m_state.push_back(res); + res.clear(); + res.push_back(5); + m_state.push_back(res); + } + if (m_state.size() != m_resourceListByID.size()) return false; + for (std::size_t i = 0; i < m_state.size(); ++i) + { + if (m_state[i].size() != m_resourceListByID[i]->paramsCount()) return false; + for (std::size_t j = 0; j < m_resourceListByID[i]->paramsCount(); ++j) + { + if (m_state[i][j] != m_resourceListByID[i]->getParam(j)) return false; + } + } + return true; } void RDORuntime::showResources(int node) const { - TRACE1("------------- %d:\n", node); - int index = 0; - ResourceListByID::const_iterator it = m_resourceListByID.begin(); - while (it != m_resourceListByID.end()) - { - if (*it) - { - TRACE1("%d. ", index); - for (std::size_t i = 0; i < (*it)->paramsCount(); ++i) - { - TRACE1("%s ", (*it)->getParam(i).getAsString().c_str()); - } - TRACE("\n"); - } - else - { - TRACE1("%d. NULL\n", index); - } - ++index; - ++it; - } + TRACE1("------------- %d:\n", node); + int index = 0; + ResourceListByID::const_iterator it = m_resourceListByID.begin(); + while (it != m_resourceListByID.end()) + { + if (*it) + { + TRACE1("%d. ", index); + for (std::size_t i = 0; i < (*it)->paramsCount(); ++i) + { + TRACE1("%s ", (*it)->getParam(i).getAsString().c_str()); + } + TRACE("\n"); + } + else + { + TRACE1("%d. NULL\n", index); + } + ++index; + ++it; + } } #endif void RDORuntime::onEraseRes(std::size_t resourceID, const LPRDOEraseResRelCalc& pCalc) { - LPRDOResource res = m_resourceListByID.at(resourceID); - if (!res) - { - error().push(rdo::format("Временный ресурс уже удален. Возможно, он удален ранее в этом же образце. Имя релевантного ресурса: %s", pCalc ? pCalc->getName().c_str() : "неизвестное имя"), pCalc->srcInfo()); - } - if (!res->canFree()) - { - error().push("Невозможно удалить ресурс, т.к. он еще используется", pCalc->srcInfo()); - } - else - { - LPIResultWatchValueList::iterator it = m_resultWatchValueList.begin(); - while (it != m_resultWatchValueList.end()) - { - (*it)->checkResourceErased(res); - ++it; - } - m_resourceListByID.at(resourceID) = NULL; - - LPIResourceType type(res->getResType()); - // Деструктор ресурса вызывается в std::list::erase, который вызывается из std::list::remove - type->eraseRes(res); - notify().fireMessage(Notify::RO_BEFOREDELETE, reinterpret_cast(res->getTraceID())); - onResourceErase(res); - } + LPRDOResource res = m_resourceListByID.at(resourceID); + if (!res) + { + error().push(rdo::format("Временный ресурс уже удален. Возможно, он удален ранее в этом же образце. Имя релевантного ресурса: %s", pCalc ? pCalc->getName().c_str() : "неизвестное имя"), pCalc->srcInfo()); + } + if (!res->canFree()) + { + error().push("Невозможно удалить ресурс, т.к. он еще используется", pCalc->srcInfo()); + } + else + { + LPIResultWatchValueList::iterator it = m_resultWatchValueList.begin(); + while (it != m_resultWatchValueList.end()) + { + (*it)->checkResourceErased(res); + ++it; + } + m_resourceListByID.at(resourceID) = NULL; + + LPIResourceType type(res->getResType()); + // Деструктор ресурса вызывается в std::list::erase, который вызывается из std::list::remove + type->eraseRes(res); + notify().fireMessage(Notify::Message::BEFORE_DELETE, reinterpret_cast(res->getTraceID())); + onResourceErase(res); + } } void RDORuntime::insertNewResource(const LPRDOResource& pResource) { - ASSERT(pResource); - if (pResource->getTraceID() >= m_resourceListByID.size()) - { - m_resourceListByID.resize(pResource->getTraceID() + 1, NULL); - m_resourceListByID.at(pResource->getTraceID()) = pResource; - } - else - { - if (m_resourceListByID.at(pResource->getTraceID()) == LPRDOResource(NULL)) - { - m_resourceListByID.at(pResource->getTraceID()) = pResource; - } - else - { - error().push(RDOSyntaxMessage( - "Внутренняя ошибка: insertNewResource", - rdo::model::PAT, - 0, - 0 - )); - } - } + ASSERT(pResource); + if (pResource->getTraceID() >= m_resourceListByID.size()) + { + m_resourceListByID.resize(pResource->getTraceID() + 1, NULL); + m_resourceListByID.at(pResource->getTraceID()) = pResource; + } + else + { + if (m_resourceListByID.at(pResource->getTraceID()) == LPRDOResource(NULL)) + { + m_resourceListByID.at(pResource->getTraceID()) = pResource; + } + else + { + error().push(SyntaxMessage( + "Внутренняя ошибка: insertNewResource", + rdo::FileType::PAT, + 0, + 0 + )); + } + } #ifdef RDO_LIMIT_RES - if (m_resourceListByID.size() >= 200) - { - error().push(RDOSyntaxMessage( - "Сработало лицензионное ограничение на количество ресурсов. Обратитесь за приобритением полной версии", - rdo::model::PAT, - 0, - 0 - )); - } + if (m_resourceListByID.size() >= 200) + { + error().push(SyntaxMessage( + "Сработало лицензионное ограничение на количество ресурсов. Обратитесь за приобритением полной версии", + rdo::FileType::PAT, + 0, + 0 + )); + } #endif } void RDORuntime::addRuntimeEvent(LPIBaseOperationContainer pLogic, const LPIEvent& pEvent) { - ASSERT(pLogic); - ASSERT(pEvent); - appendBaseOperation(pLogic, pEvent.object_dynamic_cast()); + ASSERT(pLogic); + ASSERT(pEvent); + appendBaseOperation(pLogic, pEvent.object_dynamic_cast()); } void RDORuntime::addRuntimeRule(LPIBaseOperationContainer pLogic, const LPIRule& pRule) { - ASSERT(pLogic); - ASSERT(pRule ); - appendBaseOperation(pLogic, pRule.object_dynamic_cast()); + ASSERT(pLogic); + ASSERT(pRule ); + appendBaseOperation(pLogic, pRule.object_dynamic_cast()); } void RDORuntime::addRuntimeOperation(LPIBaseOperationContainer pLogic, const LPIOperation& pOperation) { - ASSERT(pLogic ); - ASSERT(pOperation); - appendBaseOperation(pLogic, pOperation.object_dynamic_cast()); + ASSERT(pLogic ); + ASSERT(pOperation); + appendBaseOperation(pLogic, pOperation.object_dynamic_cast()); } void RDORuntime::addRuntimeResult(const LPIResult& pResult) { - m_resultAllList.push_back(pResult); - LPIResultTrace resultTrace = pResult.object_dynamic_cast(); - LPITrace trace = pResult.object_dynamic_cast(); - if (resultTrace && trace && trace->traceable()) - { - m_resultTraceList.push_back(resultTrace); - } - const LPIResultWatchValue watch = pResult.object_dynamic_cast(); - if (watch) - { - m_resultWatchValueList.push_back(watch); - } + m_resultAllList.push_back(pResult); + LPIResultTrace resultTrace = pResult.object_dynamic_cast(); + LPITrace trace = pResult.object_dynamic_cast(); + if (resultTrace && trace && trace->traceable()) + { + m_resultTraceList.push_back(resultTrace); + } + const LPIResultWatchValue watch = pResult.object_dynamic_cast(); + if (watch) + { + m_resultWatchValueList.push_back(watch); + } } void RDORuntime::addRuntimeFrame(const LPRDOFRMFrame& pFrame) { - m_frameList.push_back(pFrame); + m_frameList.push_back(pFrame); } LPRDOFRMFrame RDORuntime::lastFrame() const { - return !m_frameList.empty() ? m_frameList.front() : LPRDOFRMFrame(NULL); + return !m_frameList.empty() ? m_frameList.front() : LPRDOFRMFrame(NULL); } bool RDORuntime::isKeyDown() const { - return m_hotKey.isKeyDown(); + return m_hotKey.isKeyDown(); } void RDORuntime::rdoInit(RDOTrace* tracer, RDOResults* customResults, RDOResults* customResultsInfo, const LPIThreadProxy& pThreadProxy) { - ASSERT(pThreadProxy); + ASSERT(pThreadProxy); - m_tracer = tracer; - m_resultList = customResults; - m_resultListInfo = customResultsInfo; - m_currFuncTop = 0; - m_pThreadProxy = pThreadProxy; - parent_type::rdoInit(); + m_tracer = tracer; + m_resultList = customResults; + m_resultListInfo = customResultsInfo; + m_currFuncTop = 0; + m_pThreadProxy = pThreadProxy; + parent_type::rdoInit(); } void RDORuntime::onInit() { - for (const auto& calc: m_initCalcList) - calc->calcValue(this); + for (const auto& calc: m_initCalcList) + calc->calcValue(this); } void RDORuntime::onDestroy() { - /// @todo Дима, почему у первого ресурса счетчик на 1 больше, чем у других ? - m_resourceListByID.clear(); - m_resourceTypeList.clear(); + // TODO Дима, почему у первого ресурса счетчик на 1 больше, чем у других ? + m_resourceListByID.clear(); + m_resourceTypeList.clear(); - if (m_resultList) - { - delete m_resultList; - m_resultList = NULL; - } - if (m_resultListInfo) - { - delete m_resultListInfo; - m_resultListInfo = NULL; - } + if (m_resultList) + { + delete m_resultList; + m_resultList = NULL; + } + if (m_resultListInfo) + { + delete m_resultListInfo; + m_resultListInfo = NULL; + } } RDOValue RDORuntime::getFuncArgument(std::size_t paramID) const { - ASSERT(m_currFuncTop + paramID < m_funcStack.size()); - return m_funcStack[m_currFuncTop + paramID]; + ASSERT(m_currFuncTop + paramID < m_funcStack.size()); + return m_funcStack[m_currFuncTop + paramID]; } LPRDORuntime RDORuntime::clone() const { - LPRDORuntime pRuntime = rdo::Factory::create(m_pError); - ASSERT(pRuntime); - pRuntime->m_sizeofSim = sizeof(RDORuntime); + LPRDORuntime pRuntime = rdo::Factory::create(m_pError); + ASSERT(pRuntime); + pRuntime->m_sizeofSim = sizeof(RDORuntime); - LPRDORuntime pThis(const_cast(this)); - pRuntime->copyFrom(pThis); + LPRDORuntime pThis(const_cast(this)); + pRuntime->copyFrom(pThis); - return pRuntime; + return pRuntime; } void RDORuntime::copyFrom(const LPRDORuntime& pOther) { - ASSERT(pOther); - ASSERT(m_resourceTypeList.empty()); + ASSERT(pOther); + ASSERT(m_resourceTypeList.empty()); - LPRDORuntime pThis(const_cast(this)); + LPRDORuntime pThis(const_cast(this)); - for (const LPRDOResourceTypeList& pRTP: pOther->m_resourceTypeList) - { - pRTP->clone(pThis); - } + for (const LPRDOResourceTypeList& pRTP: pOther->m_resourceTypeList) + { + pRTP->clone(pThis); + } - m_constantList = pOther->m_constantList; - m_patternParameterList = pOther->m_patternParameterList; - m_resultList = pOther->m_resultList; - m_pThreadProxy = pOther->m_pThreadProxy; - setCurrentTime(pOther->getCurrentTime()); + m_constantList = pOther->m_constantList; + m_patternParameterList = pOther->m_patternParameterList; + m_resultList = pOther->m_resultList; + m_pThreadProxy = pOther->m_pThreadProxy; + setCurrentTime(pOther->getCurrentTime()); - parent_type::copyFrom(pOther.object_parent_cast()); + parent_type::copyFrom(pOther.object_parent_cast()); } bool RDORuntime::equal(const LPRDORuntime& pOther) const { - if (pOther->m_resourceListByID.size() != m_resourceListByID.size()) return false; + if (pOther->m_resourceListByID.size() != m_resourceListByID.size()) return false; - const std::size_t size = m_resourceListByID.size(); - for (std::size_t i = 0; i < size; ++i) - { - if (m_resourceListByID.at(i) == LPRDOResource(NULL) && pOther->m_resourceListByID.at(i) != LPRDOResource(NULL)) return false; - if (m_resourceListByID.at(i) != LPRDOResource(NULL) && pOther->m_resourceListByID.at(i) == LPRDOResource(NULL)) return false; - if (m_resourceListByID.at(i) == LPRDOResource(NULL) && pOther->m_resourceListByID.at(i) == LPRDOResource(NULL)) continue; - if (*pOther->m_resourceListByID.at(i).get() != *m_resourceListByID.at(i).get()) return false; - } - return true; + const std::size_t size = m_resourceListByID.size(); + for (std::size_t i = 0; i < size; ++i) + { + if (m_resourceListByID.at(i) == LPRDOResource(NULL) && pOther->m_resourceListByID.at(i) != LPRDOResource(NULL)) return false; + if (m_resourceListByID.at(i) != LPRDOResource(NULL) && pOther->m_resourceListByID.at(i) == LPRDOResource(NULL)) return false; + if (m_resourceListByID.at(i) == LPRDOResource(NULL) && pOther->m_resourceListByID.at(i) == LPRDOResource(NULL)) continue; + if (*pOther->m_resourceListByID.at(i).get() != *m_resourceListByID.at(i).get()) return false; + } + return true; } void RDORuntime::onResetResult() { - LPIResultList::iterator it = m_resultAllList.begin(); - while (it != m_resultAllList.end()) - { - (*it)->resetResult(this); - ++it; - } + LPIResultList::iterator it = m_resultAllList.begin(); + while (it != m_resultAllList.end()) + { + (*it)->resetResult(this); + ++it; + } } void RDORuntime::onCheckResult() { - LPIResultList::iterator it = m_resultAllList.begin(); - while (it != m_resultAllList.end()) - { - (*it)->checkResult(this); - ++it; - } + LPIResultList::iterator it = m_resultAllList.begin(); + while (it != m_resultAllList.end()) + { + (*it)->checkResult(this); + ++it; + } } void RDORuntime::onAfterCheckResult() { - LPIResultTraceList::iterator it = m_resultTraceList.begin(); - while (it != m_resultTraceList.end()) - { - (*it)->traceResult(); - ++it; - } + LPIResultTraceList::iterator it = m_resultTraceList.begin(); + while (it != m_resultTraceList.end()) + { + (*it)->traceResult(); + ++it; + } } void RDORuntime::onPutToTreeNode() { - // when create TreeNode with new RDOSimulator, - // make all resources permanent, to avoid trace their - // erase when delete TreeNode - for (std::size_t i = 0; i < m_resourceListByID.size(); ++i) - { - if (m_resourceListByID[i]) - { - m_resourceListByID[i]->makeTemporary(false); - } - } + // when create TreeNode with new RDOSimulator, + // make all resources permanent, to avoid trace their + // erase when delete TreeNode + for (std::size_t i = 0; i < m_resourceListByID.size(); ++i) + { + if (m_resourceListByID[i]) + { + m_resourceListByID[i]->makeTemporary(false); + } + } } void RDORuntime::writeExitCode() { - std::string status; - switch (m_whyStop) - { - case rdo::simulation::report::EC_OK : status = "NORMAL_TERMINATION"; break; - case rdo::simulation::report::EC_NoMoreEvents : status = "NO_MORE_EVENTS"; break; - case rdo::simulation::report::EC_RunTimeError : status = "RUN_TIME_ERROR"; break; - case rdo::simulation::report::EC_UserBreak : status = "USER_BREAK"; break; - default: NEVER_REACH_HERE; - } + std::string status; + switch (m_whyStop) + { + case rdo::simulation::report::ExitCode::OK : status = "NORMAL_TERMINATION"; break; + case rdo::simulation::report::ExitCode::NOMORE_EVENTS : status = "NO_MORE_EVENTS"; break; + case rdo::simulation::report::ExitCode::RUNTIME_ERROR : status = "RUN_TIME_ERROR"; break; + case rdo::simulation::report::ExitCode::USER_BREAK : status = "USER_BREAK"; break; + default: NEVER_REACH_HERE; + } - getTracer()->writeStatus(this, status); + getTracer()->writeStatus(this, status); } void RDORuntime::postProcess() { - getTracer()->startWriting(); - LPIResultList::iterator it = m_resultAllList.begin(); - while (it != m_resultAllList.end()) - { - try - { - (*it)->calcStat(this, getResults().getOStream()); - } - catch (const RDORuntimeException&) - {} - ++it; - } - - try - { - parent_type::postProcess(); - writeExitCode(); - getTracer()->stopWriting(); - } - catch (const RDORuntimeException& e) - { - writeExitCode(); - getTracer()->stopWriting(); - throw e; - } + getTracer()->startWriting(); + LPIResultList::iterator it = m_resultAllList.begin(); + while (it != m_resultAllList.end()) + { + try + { + (*it)->calcStat(this, getResults().getOStream()); + } + catch (const RDORuntimeException&) + {} + ++it; + } + + try + { + parent_type::postProcess(); + writeExitCode(); + getTracer()->stopWriting(); + } + catch (const RDORuntimeException& e) + { + writeExitCode(); + getTracer()->stopWriting(); + throw e; + } } LPRDOMemoryStack RDORuntime::getMemoryStack() { - return m_pMemoryStack; + return m_pMemoryStack; } -void RDORuntime::setFunBreakFlag(const FunBreakFlag& flag) +void RDORuntime::setFunctionExitStatus(const FunctionExitStatus& status) { - m_funBreakFlag = flag; + m_functionExitStatus = status; } -const RDORuntime::FunBreakFlag& RDORuntime::getFunBreakFlag() const +const RDORuntime::FunctionExitStatus& RDORuntime::getFunctionExitStatus() const { - return m_funBreakFlag; + return m_functionExitStatus; } rdo::animation::Frame* RDORuntime::getPreparingFrame() const { - return m_pPreparingFrame; + return m_pPreparingFrame; } void RDORuntime::setPreparingFrame(rdo::animation::Frame* pPreparingFrame) { - ASSERT(pPreparingFrame); - ASSERT(!m_pPreparingFrame); - m_pPreparingFrame = pPreparingFrame; + ASSERT(pPreparingFrame); + ASSERT(!m_pPreparingFrame); + m_pPreparingFrame = pPreparingFrame; } void RDORuntime::resetPreparingFrame() { - ASSERT(m_pPreparingFrame); - m_pPreparingFrame = NULL; + ASSERT(m_pPreparingFrame); + m_pPreparingFrame = NULL; } // -------------------------------------------------------------------------------- // -------------------- RDORuntime::BreakPoint // -------------------------------------------------------------------------------- RDORuntime::BreakPoint::BreakPoint(const std::string& name, const LPRDOCalc& pCalc) - : m_name (name ) - , m_pCalc(pCalc) + : m_name (name ) + , m_pCalc(pCalc) {} const std::string& RDORuntime::BreakPoint::getName() const { - return m_name; + return m_name; } const LPRDOCalc& RDORuntime::BreakPoint::getCalc() const { - return m_pCalc; + return m_pCalc; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_runtime.h b/simulator/runtime/rdo_runtime.h index 0c61cd14a..0c7704647 100644 --- a/simulator/runtime/rdo_runtime.h +++ b/simulator/runtime/rdo_runtime.h @@ -1,11 +1,10 @@ -#ifndef _LIB_RUNTIME_RUNTIME_H_ -#define _LIB_RUNTIME_RUNTIME_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM #include "utils/src/common/platform.h" // ----------------------------------------------------------------------- INCLUDES #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable : 4786) + #pragma warning(disable : 4786) #endif // COMPILER_VISUAL_STUDIO #include // ----------------------------------------------------------------------- SYNOPSIS @@ -40,20 +39,19 @@ struct Frame; OPEN_RDO_RUNTIME_NAMESPACE -//! Результаты моделирования class RDOResults { public: - RDOResults(); - virtual ~RDOResults(); + RDOResults(); + virtual ~RDOResults(); - void width(std::size_t w); + void width(std::size_t w); - template - RDOResults& operator<< (const T& value); + template + RDOResults& operator<< (const T& value); - virtual void flush () = 0; - virtual std::ostream& getOStream() = 0; + virtual void flush () = 0; + virtual std::ostream& getOStream() = 0; }; class RDOEvent; @@ -65,226 +63,216 @@ PREDECLARE_POINTER(RDOFRMFrame); class RDOCalcCreateResource; PREDECLARE_POINTER(RDOEraseResRelCalc); -//! Симулятор, вычислитель, рантайм машина class RDORuntime: public RDOSimulatorTrace { DECLARE_FACTORY(RDORuntime); public: - void init (); - void deinit(); + void init (); + void deinit(); - typedef std::vector LPIResultList; - typedef std::vector LPIResultTraceList; - typedef std::vector LPIResultWatchValueList; + typedef std::vector LPIResultList; + typedef std::vector LPIResultTraceList; + typedef std::vector LPIResultWatchValueList; - //! Подписка на внутренние сообщения - Notify& notify(); + Notify& notify(); + Error& error(); + RDOHotKey& hotkey(); - //! Формирование ошибок рантайма - Error& error(); + LPRDORuntime clone() const; + void copyFrom(const LPRDORuntime& pOther); + bool equal(const LPRDORuntime& pOther) const; - //! Горячие клавиши - RDOHotKey& hotkey(); + void setConstValue(std::size_t constID, const RDOValue& constValue); + RDOValue getConstValue(std::size_t constID) const; - LPRDORuntime clone () const; - void copyFrom(const LPRDORuntime& pOther); - bool equal(const LPRDORuntime& pOther) const; + void rdoInit(RDOTrace* tracer, RDOResults* customResults, RDOResults* customResultsInfo, const LPIThreadProxy& pThreadProxy); - void setConstValue(std::size_t constID, const RDOValue& constValue); - RDOValue getConstValue(std::size_t constID) const; + RDOResults& getResults(); + RDOResults& getResultsInfo(); - void rdoInit(RDOTrace* tracer, RDOResults* customResults, RDOResults* customResultsInfo, const LPIThreadProxy& pThreadProxy); + double getTimeNow(); + double getSeconds(); - RDOResults& getResults(); - RDOResults& getResultsInfo(); + std::size_t getCurrentTerm() const; + void setCurrentTerm(std::size_t value); - double getTimeNow(); - double getSeconds(); + LPIActivity& getCurrentActivity(); + void setCurrentActivity(const LPIActivity& activity); - std::size_t getCurrentTerm() const; - void setCurrentTerm(std::size_t value); + void addRuntimeEvent (LPIBaseOperationContainer pLogic, const LPIEvent& pEvent ); + void addRuntimeRule (LPIBaseOperationContainer pLogic, const LPIRule& pRule ); + void addRuntimeOperation(LPIBaseOperationContainer pLogic, const LPIOperation& pOperation); + void addRuntimeResult (const LPIResult& pResult); + void addRuntimeFrame (const LPRDOFRMFrame& pFrame); - LPIActivity& getCurrentActivity(); - void setCurrentActivity(const LPIActivity& activity); + LPRDOFRMFrame lastFrame() const; - void addRuntimeEvent (LPIBaseOperationContainer pLogic, const LPIEvent& pEvent ); - void addRuntimeRule (LPIBaseOperationContainer pLogic, const LPIRule& pRule ); - void addRuntimeOperation(LPIBaseOperationContainer pLogic, const LPIOperation& pOperation); - void addRuntimeResult (const LPIResult& pResult); - void addRuntimeFrame (const LPRDOFRMFrame& pFrame); + const LPIResultList& getResult() const; - LPRDOFRMFrame lastFrame() const; + void addInitCalc(const LPRDOCalc& initCalc); - const LPIResultList& getResult() const; - - void addInitCalc(const LPRDOCalc& initCalc); - - // Параметры ресурса - RDOValue& getResParamValRaw(std::size_t resID, std::size_t paramID); - void setResParamVal(std::size_t resID, std::size_t paramID, const RDOValue& value); + RDOValue& getResParamValRaw(std::size_t resID, std::size_t paramID); + void setResParamVal(std::size_t resID, std::size_t paramID, const RDOValue& value); #ifdef _DEBUG - bool checkState(); - void showResources(int node) const; + bool checkState(); + void showResources(int node) const; #endif - void onEraseRes(std::size_t resourceID, const LPRDOEraseResRelCalc& pCalc); - LPRDOResource createNewResource(std::size_t type, RDOCalcCreateResource* calc); - LPRDOResource createNewResource(std::size_t type, bool trace); - void insertNewResource(const LPRDOResource& pResource); + void onEraseRes(std::size_t resourceID, const LPRDOEraseResRelCalc& pCalc); + LPRDOResource createNewResource(std::size_t type, RDOCalcCreateResource* calc); + LPRDOResource createNewResource(std::size_t type, bool trace); + void insertNewResource(const LPRDOResource& pResource); - RDOValue getFuncArgument (std::size_t paramID) const; - LPRDOResource getGroupFuncRes () const; - void pushFuncArgument(RDOValue arg); - void pushGroupFunc (const LPRDOResource& pResource); - void popFuncArgument (); - void popGroupFunc (); - void pushFuncTop (); - void resetFuncTop (int numArg); - void popFuncTop (); + RDOValue getFuncArgument (std::size_t paramID) const; + LPRDOResource getGroupFuncRes () const; + void pushFuncArgument(RDOValue arg); + void pushGroupFunc (const LPRDOResource& pResource); + void popFuncArgument (); + void popGroupFunc (); + void pushFuncTop (); + void resetFuncTop (int numArg); + void popFuncTop (); - virtual bool endCondition(); - void setTerminateIf(const LPRDOCalc& pTerminateIfCalc); + virtual bool endCondition(); + void setTerminateIf(const LPRDOCalc& pTerminateIfCalc); - virtual bool breakPoints(); - void insertBreakPoint(const std::string& name, const LPRDOCalc& pCalc); - LPRDOCalc findBreakPoint(const std::string& name); - std::string getLastBreakPointName() const; + virtual bool breakPoints(); + void insertBreakPoint(const std::string& name, const LPRDOCalc& pCalc); + LPRDOCalc findBreakPoint(const std::string& name); + std::string getLastBreakPointName() const; - LPRDOResource getResourceByID(std::size_t resourceID) const; + LPRDOResource getResourceByID(std::size_t resourceID) const; - void setPatternParameter(std::size_t paramID, const RDOValue& paramValue); - RDOValue getPatternParameter(std::size_t paramID) const; + void setPatternParameter(std::size_t paramID, const RDOValue& paramValue); + RDOValue getPatternParameter(std::size_t paramID) const; - typedef std::vector FrameList; - FrameList m_frameList; + typedef std::vector FrameList; + FrameList m_frameList; - virtual void onPutToTreeNode(); + virtual void onPutToTreeNode(); - rdo::simulation::report::RDOExitCode m_whyStop; + rdo::simulation::report::ExitCode m_whyStop; - virtual void onNothingMoreToDo(); - virtual void onEndCondition(); - virtual void onRuntimeError(); - virtual void onUserBreak(); + virtual void onNothingMoreToDo(); + virtual void onEndCondition(); + virtual void onRuntimeError(); + virtual void onUserBreak(); - virtual void postProcess(); + virtual void postProcess(); - enum FunBreakFlag - { - FBF_NONE = 0, - FBF_BREAK, - FBF_RETURN - }; + enum class FunctionExitStatus + { + NONE, + BREAK, + RETURN + }; - void setFunBreakFlag(const FunBreakFlag& flag); - const FunBreakFlag& getFunBreakFlag() const; + void setFunctionExitStatus(const FunctionExitStatus& status); + const FunctionExitStatus& getFunctionExitStatus() const; - LPRDOMemoryStack getMemoryStack(); + LPRDOMemoryStack getMemoryStack(); - typedef std::list ResList; - typedef ResList::const_iterator ResCIterator; + typedef std::list ResList; + typedef ResList::const_iterator ResCIterator; - void addResType(const LPRDOResourceTypeList& pResType); - const LPRDOResourceTypeList& getResType(std::size_t number) const; + void addResType(const LPRDOResourceTypeList& pResType); + const LPRDOResourceTypeList& getResType(std::size_t number) const; - const LPIThreadProxy& getThreadProxy() const; + const LPIThreadProxy& getThreadProxy() const; - void setStudioThread(RDOThread* pStudioThread); + void setStudioThread(RDOThread* pStudioThread); - rdo::animation::Frame* getPreparingFrame() const; - void setPreparingFrame(rdo::animation::Frame* pPreparingFrame); - void resetPreparingFrame(); + rdo::animation::Frame* getPreparingFrame() const; + void setPreparingFrame(rdo::animation::Frame* pPreparingFrame); + void resetPreparingFrame(); private: - RDORuntime(Error* pError); - virtual ~RDORuntime(); - - typedef RDOSimulatorTrace parent_type; - typedef std::list CalcList; - typedef std::vector ValueList; - typedef std::vector ResourceTypeList; - typedef std::vector ResourceListByID; - - ResourceTypeList m_resourceTypeList; - ResourceListByID m_resourceListByID; // Все ресурсы симулятора, даже NULL (NULL стоит на месте уже удаленного временного ресурса) - CalcList m_initCalcList; - LPRDOMemoryStack m_pMemoryStack; - FunBreakFlag m_funBreakFlag; - LPIThreadProxy m_pThreadProxy; - RDOThread* m_pStudioThread; - Notify m_notify; - Error* m_pError; - RDOHotKey m_hotKey; + RDORuntime(Error* pError); + virtual ~RDORuntime(); + + typedef RDOSimulatorTrace parent_type; + typedef std::list CalcList; + typedef std::vector ValueList; + typedef std::vector ResourceTypeList; + typedef std::vector ResourceListByID; + + ResourceTypeList m_resourceTypeList; + ResourceListByID m_resourceListByID; // Все ресурсы симулятора, даже NULL (NULL стоит на месте уже удаленного временного ресурса) + CalcList m_initCalcList; + LPRDOMemoryStack m_pMemoryStack; + FunctionExitStatus m_functionExitStatus; + LPIThreadProxy m_pThreadProxy; + RDOThread* m_pStudioThread; + Notify m_notify; + Error* m_pError; + RDOHotKey m_hotKey; #ifdef _DEBUG - typedef std::vector State; - State m_state; + typedef std::vector State; + State m_state; #endif - //! Точка останова - PREDECLARE_POINTER(BreakPoint); - class BreakPoint - : public rdo::counter_reference - , public RDORuntimeObject - { - DECLARE_FACTORY(BreakPoint) - public: - const std::string& getName() const; - const LPRDOCalc& getCalc() const; + PREDECLARE_POINTER(BreakPoint); + class BreakPoint + : public rdo::counter_reference + , public RDORuntimeObject + { + DECLARE_FACTORY(BreakPoint) + public: + const std::string& getName() const; + const LPRDOCalc& getCalc() const; - private: - BreakPoint(const std::string& name, const LPRDOCalc& pCalc); + private: + BreakPoint(const std::string& name, const LPRDOCalc& pCalc); - std::string m_name; - LPRDOCalc m_pCalc; - }; + std::string m_name; + LPRDOCalc m_pCalc; + }; - typedef std::list BreakPointList; + typedef std::list BreakPointList; - BreakPointList m_breakPointList; - LPBreakPoint m_pLastActiveBreakPoint; + BreakPointList m_breakPointList; + LPBreakPoint m_pLastActiveBreakPoint; - ValueList m_funcStack; - ResourceListByID m_groupFuncStack; - int m_currFuncTop; - int m_savedFuncTop; + ValueList m_funcStack; + ResourceListByID m_groupFuncStack; + int m_currFuncTop; + int m_savedFuncTop; - virtual void onInit (); - virtual void onDestroy(); + virtual void onInit (); + virtual void onDestroy(); - virtual ResList getResourcesBeforeSim() const; + virtual ResList getResourcesBeforeSim() const; - LPIResultList m_resultAllList; - LPIResultTraceList m_resultTraceList; - LPIResultWatchValueList m_resultWatchValueList; - LPIActivity m_currActivity; - ValueList m_patternParameterList; + LPIResultList m_resultAllList; + LPIResultTraceList m_resultTraceList; + LPIResultWatchValueList m_resultWatchValueList; + LPIActivity m_currActivity; + ValueList m_patternParameterList; - time_t m_physicTime; - virtual void preProcess(); + time_t m_physicTime; + virtual void preProcess(); - RDOResults* m_resultList; - RDOResults* m_resultListInfo; + RDOResults* m_resultList; + RDOResults* m_resultListInfo; - LPRDOCalc m_pTerminateIfCalc; - ValueList m_constantList; + LPRDOCalc m_pTerminateIfCalc; + ValueList m_constantList; - void writeExitCode(); + void writeExitCode(); - virtual bool isKeyDown() const; + virtual bool isKeyDown() const; - virtual void onResetResult(); - virtual void onCheckResult(); - virtual void onAfterCheckResult(); + virtual void onResetResult(); + virtual void onCheckResult(); + virtual void onAfterCheckResult(); - std::size_t m_currentTerm; + std::size_t m_currentTerm; - rdo::animation::Frame* m_pPreparingFrame; + rdo::animation::Frame* m_pPreparingFrame; }; CLOSE_RDO_RUNTIME_NAMESPACE #include "simulator/runtime/rdo_runtime-inl.h" - -#endif // _LIB_RUNTIME_RUNTIME_H_ diff --git a/simulator/runtime/rdo_simulator.cpp b/simulator/runtime/rdo_simulator.cpp index 6c105bdeb..9811adadf 100644 --- a/simulator/runtime/rdo_simulator.cpp +++ b/simulator/runtime/rdo_simulator.cpp @@ -11,7 +11,7 @@ // -------------------------------------------------------------------------------- #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable : 4786) + #pragma warning(disable : 4786) #endif // COMPILER_VISUAL_STUDIO OPEN_RDO_RUNTIME_NAMESPACE @@ -20,10 +20,10 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOSimulator // -------------------------------------------------------------------------------- RDOSimulator::RDOSimulator() - : RDOSimulatorBase( ) - , m_sizeofSim (0) + : RDOSimulatorBase( ) + , m_sizeofSim (0) { - m_pMetaLogic = rdo::Factory::create(); + m_pMetaLogic = rdo::Factory::create(); } RDOSimulator::~RDOSimulator() @@ -31,173 +31,173 @@ RDOSimulator::~RDOSimulator() LPIBaseOperation RDOSimulator::getMustContinueOpr() const { - return m_pOprMustContinue; + return m_pOprMustContinue; } void RDOSimulator::setMustContinueOpr(const LPIBaseOperation& pOperation) { - m_pOprMustContinue = pOperation; + m_pOprMustContinue = pOperation; } std::size_t RDOSimulator::getSizeofSim() const { - return m_sizeofSim; + return m_sizeofSim; } void RDOSimulator::appendBaseOperation(LPIBaseOperationContainer pLogic, const LPIBaseOperation& pBaseOperation) { - ASSERT(pLogic ); - ASSERT(pBaseOperation); - pLogic->append(pBaseOperation); + ASSERT(pLogic ); + ASSERT(pBaseOperation); + pLogic->append(pBaseOperation); } void RDOSimulator::appendLogic(const LPIBaseOperation& pLogic, LPIBaseOperationContainer pParent) { - ASSERT(pParent); - pParent->append(pLogic); + ASSERT(pParent); + pParent->append(pLogic); } bool RDOSimulator::doOperation() { - LPRDORuntime pRuntime(static_cast(this)); - - bool res; - if (getMustContinueOpr()) - { - // Есть действие, которое необходимо продолжить. Используется в DPT - IBaseOperation::BOResult result = getMustContinueOpr()->onContinue(pRuntime); - if (result != IBaseOperation::BOR_must_continue) - { - setMustContinueOpr(NULL); - } - return result != IBaseOperation::BOR_cant_run; - } - else - { - bool foundPlaned = false; - // Отработаем все запланированные на данный момент события - if (!m_checkOperation && !m_timePoints.empty()) - { - m_checkOperation = true; - BOPlannedMap::iterator begin = m_timePoints.begin(); - double newTime = begin->first; - if (getCurrentTime() >= newTime) - { - BOPlannedList& pList = begin->second; - if (!pList.empty()) - { + LPRDORuntime pRuntime(static_cast(this)); + + bool res; + if (getMustContinueOpr()) + { + // Есть действие, которое необходимо продолжить. Используется в DPT + IBaseOperation::ResultCode result = getMustContinueOpr()->onContinue(pRuntime); + if (result != IBaseOperation::ResultCode::MUST_CONTINUE) + { + setMustContinueOpr(NULL); + } + return result != IBaseOperation::ResultCode::CANNOT_RUN; + } + else + { + bool foundPlaned = false; + // Отработаем все запланированные на данный момент события + if (!m_checkOperation && !m_timePoints.empty()) + { + m_checkOperation = true; + BOPlannedMap::iterator begin = m_timePoints.begin(); + double newTime = begin->first; + if (getCurrentTime() >= newTime) + { + BOPlannedList& pList = begin->second; + if (!pList.empty()) + { #ifdef RDOSIM_COMPATIBLE - // Дисциплина списка текущих событий LIFO - LPIBaseOperation pOperation = pList.back().first; - EventFunction eventFunction = pList.back().second; - pList.pop_back(); + // Дисциплина списка текущих событий LIFO + LPIBaseOperation pOperation = pList.back().first; + EventFunction eventFunction = pList.back().second; + pList.pop_back(); #else - // Дисциплина списка текущих событий FIFO - LPIBaseOperation pOperation = pList.front().first; - EventFunction eventFunction = pList.front().second; - pList.pop_front(); + // Дисциплина списка текущих событий FIFO + LPIBaseOperation pOperation = pList.front().first; + EventFunction eventFunction = pList.front().second; + pList.pop_front(); #endif // RDOSIM_COMPATIBLE - if (pList.empty()) - { - m_timePoints.erase(begin); - } + if (pList.empty()) + { + m_timePoints.erase(begin); + } #ifndef RDO_703_COMPATIBLE - else - { - m_checkOperation = false; - } + else + { + m_checkOperation = false; + } #endif // not RDO_703_COMPATIBLE - eventFunction(); - foundPlaned = true; - } - } - } - res = foundPlaned; - if (!foundPlaned) - { - // Не нашли запланированное событие - // Проверить все возможные события и действия, вызвать первое, которое может быть вызвано - LPIBaseOperation pMetaLogic = m_pMetaLogic.object_dynamic_cast(); - try - { - res = pMetaLogic->onCheckCondition(pRuntime); - } - catch (const RDOUndefinedException&) - { - res = false; - } - if (res) - { - res = pMetaLogic->onDoOperation(pRuntime) != IBaseOperation::BOR_cant_run; - } - if (!res) - { - m_checkOperation = false; - } - } - } - onCheckResult (); - onAfterCheckResult(); - return res; + eventFunction(); + foundPlaned = true; + } + } + } + res = foundPlaned; + if (!foundPlaned) + { + // Не нашли запланированное событие + // Проверить все возможные события и действия, вызвать первое, которое может быть вызвано + LPIBaseOperation pMetaLogic = m_pMetaLogic.object_dynamic_cast(); + try + { + res = pMetaLogic->onCheckCondition(pRuntime); + } + catch (const RDOUndefinedException&) + { + res = false; + } + if (res) + { + res = pMetaLogic->onDoOperation(pRuntime) != IBaseOperation::ResultCode::CANNOT_RUN; + } + if (!res) + { + m_checkOperation = false; + } + } + } + onCheckResult (); + onAfterCheckResult(); + return res; } void RDOSimulator::preProcess() { - LPRDORuntime pRuntime(static_cast(this)); - m_pMetaLogic.object_dynamic_cast()->onStart(pRuntime); - onResetResult(); + LPRDORuntime pRuntime(static_cast(this)); + m_pMetaLogic.object_dynamic_cast()->onStart(pRuntime); + onResetResult(); } std::string writeActivitiesStructureRecurse(const LPIBaseOperationContainer& pLogic, std::size_t& counter) { - std::stringstream stream; - IBaseOperationContainer::CIterator it = pLogic->begin(); - while (it != pLogic->end()) - { - LPIModelStructure pModelStructure = it->object_dynamic_cast(); - if (pModelStructure && (pModelStructure.object_dynamic_cast() || pModelStructure.object_dynamic_cast())) - { - stream << counter++ << " "; - pModelStructure->writeModelStructure(stream); - } - ++it; - } + std::stringstream stream; + IBaseOperationContainer::CIterator it = pLogic->begin(); + while (it != pLogic->end()) + { + LPIModelStructure pModelStructure = it->object_dynamic_cast(); + if (pModelStructure && (pModelStructure.object_dynamic_cast() || pModelStructure.object_dynamic_cast())) + { + stream << counter++ << " "; + pModelStructure->writeModelStructure(stream); + } + ++it; + } #ifdef RDOSIM_COMPATIBLE #else - stream << std::endl; + stream << std::endl; #endif - std::size_t _counter = 1; - it = pLogic->begin(); - while (it != pLogic->end()) - { - LPIModelStructure pModelStructure = it->object_dynamic_cast(); - if (pModelStructure && pModelStructure.object_dynamic_cast() && !pModelStructure.object_dynamic_cast()) - { - stream << _counter++ << " "; - counter++; - pModelStructure->writeModelStructure(stream); - } - ++it; - } - - it = pLogic->begin(); - while (it != pLogic->end()) - { - LPILogic pLogic = it->object_dynamic_cast(); - if (pLogic) - { - stream << writeActivitiesStructureRecurse(pLogic.object_dynamic_cast(), counter); - } - ++it; - } - - return stream.str(); + std::size_t _counter = 1; + it = pLogic->begin(); + while (it != pLogic->end()) + { + LPIModelStructure pModelStructure = it->object_dynamic_cast(); + if (pModelStructure && pModelStructure.object_dynamic_cast() && !pModelStructure.object_dynamic_cast()) + { + stream << _counter++ << " "; + counter++; + pModelStructure->writeModelStructure(stream); + } + ++it; + } + + it = pLogic->begin(); + while (it != pLogic->end()) + { + LPILogic pLogic = it->object_dynamic_cast(); + if (pLogic) + { + stream << writeActivitiesStructureRecurse(pLogic.object_dynamic_cast(), counter); + } + ++it; + } + + return stream.str(); } std::string RDOSimulator::writeActivitiesStructure(std::size_t& counter) { - return writeActivitiesStructureRecurse(m_pMetaLogic, counter); + return writeActivitiesStructureRecurse(m_pMetaLogic, counter); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_simulator.h b/simulator/runtime/rdo_simulator.h index f34b284ee..b2f7c3afc 100644 --- a/simulator/runtime/rdo_simulator.h +++ b/simulator/runtime/rdo_simulator.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_SIMULATOR_H_ -#define _LIB_RUNTIME_SIMULATOR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,38 +12,36 @@ OPEN_RDO_RUNTIME_NAMESPACE class RDOSimulator: public RDOSimulatorBase { public: - RDOSimulator(); - virtual ~RDOSimulator(); + RDOSimulator(); + virtual ~RDOSimulator(); - void appendLogic(const LPIBaseOperation& pLogic, LPIBaseOperationContainer pParent); - LPIBaseOperation getMustContinueOpr() const; - void setMustContinueOpr(const LPIBaseOperation& pOperation); - virtual void onPutToTreeNode() = 0; + void appendLogic(const LPIBaseOperation& pLogic, LPIBaseOperationContainer pParent); + LPIBaseOperation getMustContinueOpr() const; + void setMustContinueOpr(const LPIBaseOperation& pOperation); + virtual void onPutToTreeNode() = 0; - std::string writeActivitiesStructure(std::size_t& counter); + std::string writeActivitiesStructure(std::size_t& counter); - std::size_t getSizeofSim() const; + std::size_t getSizeofSim() const; - LPIBaseOperationContainer m_pMetaLogic; + LPIBaseOperationContainer m_pMetaLogic; protected: - void appendBaseOperation(LPIBaseOperationContainer pLogic, const LPIBaseOperation& pBaseOperation); + void appendBaseOperation(LPIBaseOperationContainer pLogic, const LPIBaseOperation& pBaseOperation); - // Инициализирует нерегулярные события и блоки GENERATE: задает время первого срабатывания - virtual void preProcess(); + // Инициализирует нерегулярные события и блоки GENERATE: задает время первого срабатывания + virtual void preProcess(); - virtual void onResetResult () = 0; - virtual void onCheckResult () = 0; - virtual void onAfterCheckResult() = 0; + virtual void onResetResult () = 0; + virtual void onCheckResult () = 0; + virtual void onAfterCheckResult() = 0; - std::size_t m_sizeofSim; + std::size_t m_sizeofSim; private: - LPIBaseOperation m_pOprMustContinue; + LPIBaseOperation m_pOprMustContinue; - virtual bool doOperation(); + virtual bool doOperation(); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_SIMULATOR_H_ diff --git a/simulator/runtime/rdo_type.cpp b/simulator/runtime/rdo_type.cpp index 5cb7ccae3..f1a57d9b9 100644 --- a/simulator/runtime/rdo_type.cpp +++ b/simulator/runtime/rdo_type.cpp @@ -11,34 +11,28 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- // -------------------- RDOType // -------------------------------------------------------------------------------- -RDOType::RDOType(TypeID typeID) - : m_typeID(typeID) +RDOType::RDOType(Type typeID) + : m_typeID(typeID) {} RDOType::~RDOType() {} -RDOType::TypeID RDOType::typeID() const +RDOType::Type RDOType::typeID() const { - return m_typeID; + return m_typeID; } -/// @todo внимание макрос! +// TODO внимание макрос! #define DEFINE_ATOM_TYPE_DEFAULT_VALUE(Type) rdo::intrusive_ptr g_##Type = rdo::Factory::create(); -DEFINE_ATOM_TYPE_DEFAULT_VALUE(unknow); - -DEFINE_ATOM_TYPE_DEFAULT_VALUE(void); - -DEFINE_ATOM_TYPE_DEFAULT_VALUE(identificator); - -DEFINE_ATOM_TYPE_DEFAULT_VALUE(int); - -DEFINE_ATOM_TYPE_DEFAULT_VALUE(real); - -DEFINE_ATOM_TYPE_DEFAULT_VALUE(bool); - -DEFINE_ATOM_TYPE_DEFAULT_VALUE(string); +DEFINE_ATOM_TYPE_DEFAULT_VALUE(UNKNOW); +DEFINE_ATOM_TYPE_DEFAULT_VALUE(EMPTY); +DEFINE_ATOM_TYPE_DEFAULT_VALUE(IDENTIFICATOR); +DEFINE_ATOM_TYPE_DEFAULT_VALUE(INT); +DEFINE_ATOM_TYPE_DEFAULT_VALUE(REAL); +DEFINE_ATOM_TYPE_DEFAULT_VALUE(BOOL); +DEFINE_ATOM_TYPE_DEFAULT_VALUE(STRING); CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_type.h b/simulator/runtime/rdo_type.h index 71a93caea..be5d0e79d 100644 --- a/simulator/runtime/rdo_type.h +++ b/simulator/runtime/rdo_type.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_TYPE_H_ -#define _LIB_RUNTIME_TYPE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -15,53 +14,45 @@ PREDECLARE_POINTER(RDOType); class RDOType: public virtual rdo::counter_reference { public: - enum TypeID - { - t_unknow = 0, - t_void, - t_identificator, - t_int, - t_real, - t_bool, - t_string, - t_enum, - t_pointer - }; - - RDOType(TypeID typeID); - virtual ~RDOType(); - - TypeID typeID() const; + enum class Type + { + UNKNOW = 0, + EMPTY, + IDENTIFICATOR, + INT, + REAL, + BOOL, + STRING, + ENUM, + POINTER + }; + + RDOType(Type typeID); + virtual ~RDOType(); + + Type typeID() const; private: - TypeID m_typeID; + Type m_typeID; }; -/// @todo внимание макрос! -#define DEFINE_ATOM_TYPE(Type) \ -class RDOType__##Type: public RDOType \ -{ \ -public: \ - RDOType__##Type() \ - : RDOType(t_##Type) \ - {} \ -}; \ -extern rdo::intrusive_ptr g_##Type; - -DEFINE_ATOM_TYPE(unknow); - -DEFINE_ATOM_TYPE(void); - -DEFINE_ATOM_TYPE(identificator); - -DEFINE_ATOM_TYPE(int); - -DEFINE_ATOM_TYPE(real); - -DEFINE_ATOM_TYPE(bool); - -DEFINE_ATOM_TYPE(string); +// TODO внимание макрос! +#define DEFINE_ATOM_TYPE(TypeName) \ +class RDOType__##TypeName: public RDOType \ +{ \ +public: \ + RDOType__##TypeName() \ + : RDOType(Type::TypeName) \ + {} \ +}; \ +extern rdo::intrusive_ptr g_##TypeName; + +DEFINE_ATOM_TYPE(UNKNOW); +DEFINE_ATOM_TYPE(EMPTY); +DEFINE_ATOM_TYPE(IDENTIFICATOR); +DEFINE_ATOM_TYPE(INT); +DEFINE_ATOM_TYPE(REAL); +DEFINE_ATOM_TYPE(BOOL); +DEFINE_ATOM_TYPE(STRING); CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_TYPE_H_ diff --git a/simulator/runtime/rdo_value-inl.h b/simulator/runtime/rdo_value-inl.h index 136769dba..797f5afa0 100644 --- a/simulator/runtime/rdo_value-inl.h +++ b/simulator/runtime/rdo_value-inl.h @@ -7,76 +7,76 @@ OPEN_RDO_RUNTIME_NAMESPACE template inline RDOValue::RDOValue(const LPRDOType& pType, const rdo::intrusive_ptr& pObject) - : m_pType(pType) + : m_pType(pType) { - STATIC_ASSERT(sizeof(rdo::intrusive_ptr_interface_wrapper) >= sizeof(double)); + STATIC_ASSERT(sizeof(rdo::intrusive_ptr_interface_wrapper) >= sizeof(double)); - ASSERT(m_pType); - ASSERT( - typeID() == RDOType::t_string || - typeID() == RDOType::t_identificator || - typeID() == RDOType::t_pointer - ); - new (&m_value) rdo::intrusive_ptr_interface_wrapper(pObject); - setUndefined(false); + ASSERT(m_pType); + ASSERT( + typeID() == RDOType::Type::STRING || + typeID() == RDOType::Type::IDENTIFICATOR || + typeID() == RDOType::Type::POINTER + ); + new (&m_value) rdo::intrusive_ptr_interface_wrapper(pObject); + setUndefined(false); } template inline rdo::intrusive_ptr& RDOValue::getPointer() { - return __get >(); + return __get >(); } template inline const rdo::intrusive_ptr& RDOValue::getPointer() const { - return __get >(); + return __get >(); } template inline const rdo::intrusive_ptr& RDOValue::getPointerByType() const { - return getPointerByType(); + return getPointerByType(); } template inline const rdo::intrusive_ptr& RDOValue::getPointerByType() const { #ifdef _DEBUG - rdo::intrusive_ptr pType = type().object_dynamic_cast(); - ASSERT(pType); + rdo::intrusive_ptr pType = type().object_dynamic_cast(); + ASSERT(pType); #endif // _DEBUG - return getPointer(); + return getPointer(); } template inline const rdo::intrusive_ptr& RDOValue::getPointerByInterface() const { #ifdef _DEBUG - rdo::interface_ptr pType = type().interface_dynamic_cast(); - ASSERT(pType); + rdo::interface_ptr pType = type().interface_dynamic_cast(); + ASSERT(pType); #endif // _DEBUG - return getPointer(); + return getPointer(); } template inline bool RDOValue::isType() const { - return type().object_dynamic_cast(); + return type().object_dynamic_cast(); } template inline T& RDOValue::__get() { - return *reinterpret_cast(&m_value); + return *reinterpret_cast(&m_value); } template inline const T& RDOValue::__get() const { - return *reinterpret_cast(&m_value); + return *reinterpret_cast(&m_value); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_value.cpp b/simulator/runtime/rdo_value.cpp index bcc8d5f12..fe440576e 100644 --- a/simulator/runtime/rdo_value.cpp +++ b/simulator/runtime/rdo_value.cpp @@ -17,1304 +17,1304 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOValue // -------------------------------------------------------------------------------- RDOValue::RDOValue() - : m_pType(g_unknow) + : m_pType(g_UNKNOW) { - setUndefined(false); + setUndefined(false); } RDOValue::RDOValue(const RDOValue& rdovalue) { - set(rdovalue); + set(rdovalue); } RDOValue::RDOValue(const LPRDOType& pType) - : m_pType(pType) -{ - switch (typeID()) - { - case RDOType::t_unknow : break; - case RDOType::t_int : __get () = 0; break; - case RDOType::t_real : __get() = 0; break; - case RDOType::t_enum : __get () = 0; break; - case RDOType::t_bool : __get () = false; break; - case RDOType::t_string : new (&m_value) rdo::intrusive_ptr_interface_wrapper(new string_class("")); break; - case RDOType::t_identificator : new (&m_value) rdo::intrusive_ptr_interface_wrapper(new string_class("")); break; - default : throw RDOValueException(); - } - setUndefined(false); + : m_pType(pType) +{ + switch (typeID()) + { + case RDOType::Type::UNKNOW : break; + case RDOType::Type::INT : __get () = 0; break; + case RDOType::Type::REAL : __get() = 0; break; + case RDOType::Type::ENUM : __get () = 0; break; + case RDOType::Type::BOOL : __get () = false; break; + case RDOType::Type::STRING : new (&m_value) rdo::intrusive_ptr_interface_wrapper(new string_class("")); break; + case RDOType::Type::IDENTIFICATOR : new (&m_value) rdo::intrusive_ptr_interface_wrapper(new string_class("")); break; + default : throw RDOValueException(); + } + setUndefined(false); } RDOValue::RDOValue(int value) - : m_pType(g_int) + : m_pType(g_INT) { - __get() = value; - setUndefined(false); + __get() = value; + setUndefined(false); } RDOValue::RDOValue(std::size_t value) - : m_pType(g_int) + : m_pType(g_INT) { __get() = value; - setUndefined(false); + setUndefined(false); } RDOValue::RDOValue(double value) - : m_pType(g_real) + : m_pType(g_REAL) { - __get() = value; - setUndefined(false); + __get() = value; + setUndefined(false); } RDOValue::RDOValue(bool value) - : m_pType(g_bool) + : m_pType(g_BOOL) { - __get() = value; - setUndefined(false); + __get() = value; + setUndefined(false); } RDOValue::RDOValue(const LPRDOEnumType& pEnum) - : m_pType(pEnum) + : m_pType(pEnum) { - if (pEnum->empty()) - RDOValueException(); + if (pEnum->empty()) + RDOValueException(); - __get() = pEnum->findEnum(pEnum->getValues()[0]); - setUndefined(false); + __get() = pEnum->findEnum(pEnum->getValues()[0]); + setUndefined(false); } RDOValue::RDOValue(const LPRDOEnumType& pEnum, const std::string& value) - : m_pType(pEnum) + : m_pType(pEnum) { - __get() = pEnum->findEnum(value); - if (__get() == RDOEnumType::END) - RDOValueException(); - setUndefined(false); + __get() = pEnum->findEnum(value); + if (__get() == RDOEnumType::END) + RDOValueException(); + setUndefined(false); } RDOValue::RDOValue(const LPRDOEnumType& pEnum, std::size_t index) - : m_pType(pEnum) + : m_pType(pEnum) { - if (index == RDOEnumType::END || index >= pEnum->getValues().size()) - RDOValueException(); + if (index == RDOEnumType::END || index >= pEnum->getValues().size()) + RDOValueException(); - __get() = index; - setUndefined(false); + __get() = index; + setUndefined(false); } RDOValue::RDOValue(const std::string& value) - : m_pType(g_string) + : m_pType(g_STRING) { - STATIC_ASSERT(sizeof(rdo::intrusive_ptr_interface_wrapper) >= sizeof(double)); + STATIC_ASSERT(sizeof(rdo::intrusive_ptr_interface_wrapper) >= sizeof(double)); - new (&m_value) rdo::intrusive_ptr_interface_wrapper(new string_class(value)); - setUndefined(false); + new (&m_value) rdo::intrusive_ptr_interface_wrapper(new string_class(value)); + setUndefined(false); } RDOValue::RDOValue(const char* value) - : m_pType(g_string) + : m_pType(g_STRING) { - new (&m_value) rdo::intrusive_ptr_interface_wrapper(new string_class(value)); - setUndefined(false); + new (&m_value) rdo::intrusive_ptr_interface_wrapper(new string_class(value)); + setUndefined(false); } RDOValue::RDOValue(const std::string& value, const LPRDOType& pType) - : m_pType(g_identificator) + : m_pType(g_IDENTIFICATOR) { - if (pType->typeID() != RDOType::t_identificator) - RDOValueException(); + if (pType->typeID() != RDOType::Type::IDENTIFICATOR) + RDOValueException(); - new (&m_value) rdo::intrusive_ptr_interface_wrapper(new string_class(value)); - setUndefined(false); + new (&m_value) rdo::intrusive_ptr_interface_wrapper(new string_class(value)); + setUndefined(false); } RDOValue::~RDOValue() { - deleteValue(); + deleteValue(); } RDOValue RDOValue::fromDouble(const LPRDOType& pType, double value) { - RDOValue result(pType); + RDOValue result(pType); - switch (result.typeID()) - { - case RDOType::t_unknow: break; - case RDOType::t_int : result.__get () = int(value); break; - case RDOType::t_real : result.__get() = value; break; - case RDOType::t_enum : result.__get () = std::size_t(value); break; - case RDOType::t_bool : result.__get () = value != 0.0; break; - default : throw RDOValueException(); - } - result.setUndefined(false); + switch (result.typeID()) + { + case RDOType::Type::UNKNOW: break; + case RDOType::Type::INT : result.__get () = int(value); break; + case RDOType::Type::REAL : result.__get() = value; break; + case RDOType::Type::ENUM : result.__get () = std::size_t(value); break; + case RDOType::Type::BOOL : result.__get () = value != 0.0; break; + default : throw RDOValueException(); + } + result.setUndefined(false); - return result; + return result; } void RDOValue::deleteValue() { - switch (typeID()) - { - case RDOType::t_string : - case RDOType::t_identificator: - case RDOType::t_pointer : - reinterpret_cast(&m_value)->release(); - break; - default: - break; - } + switch (typeID()) + { + case RDOType::Type::STRING : + case RDOType::Type::IDENTIFICATOR: + case RDOType::Type::POINTER : + reinterpret_cast(&m_value)->release(); + break; + default: + break; + } } const LPRDOType& RDOValue::type() const { - return m_pType; + return m_pType; } -RDOType::TypeID RDOValue::typeID() const +RDOType::Type RDOValue::typeID() const { - return m_pType->typeID(); + return m_pType->typeID(); } std::ostream& operator<< (std::ostream& stream, const RDOValue& rdovalue) { - stream << rdovalue.getAsStringForTrace(); - return stream; + stream << rdovalue.getAsStringForTrace(); + return stream; } int RDOValue::getInt() const { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - switch (typeID()) - { - case RDOType::t_int : return __get(); - case RDOType::t_real : return (int)__get(); - case RDOType::t_enum : return __get(); - case RDOType::t_bool : return __get() ? 1 : 0; - case RDOType::t_pointer: return onPointerGetInt(); - default : break; - } - throw RDOValueException(); + switch (typeID()) + { + case RDOType::Type::INT : return __get(); + case RDOType::Type::REAL : return (int)__get(); + case RDOType::Type::ENUM : return __get(); + case RDOType::Type::BOOL : return __get() ? 1 : 0; + case RDOType::Type::POINTER: return onPointerGetInt(); + default : break; + } + throw RDOValueException(); } uint32_t RDOValue::getUInt() const { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - switch (typeID()) - { - case RDOType::t_int : return __get(); - case RDOType::t_real : return (uint32_t)__get(); - case RDOType::t_enum : return __get(); - case RDOType::t_bool : return __get() ? 1 : 0; - case RDOType::t_pointer: return onPointerGetUInt(); - default : break; - } - throw RDOValueException(); + switch (typeID()) + { + case RDOType::Type::INT : return __get(); + case RDOType::Type::REAL : return (uint32_t)__get(); + case RDOType::Type::ENUM : return __get(); + case RDOType::Type::BOOL : return __get() ? 1 : 0; + case RDOType::Type::POINTER: return onPointerGetUInt(); + default : break; + } + throw RDOValueException(); } int RDOValue::getEnumAsInt() const { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - switch (typeID()) - { - case RDOType::t_int : return __get(); - case RDOType::t_real: return (int)__get(); - case RDOType::t_enum: return __get(); - case RDOType::t_bool: return __get() ? 1 : 0; - default : break; - } - throw RDOValueException(); + switch (typeID()) + { + case RDOType::Type::INT : return __get(); + case RDOType::Type::REAL: return (int)__get(); + case RDOType::Type::ENUM: return __get(); + case RDOType::Type::BOOL: return __get() ? 1 : 0; + default : break; + } + throw RDOValueException(); } LPRDOEnumType RDOValue::getEnum() const { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - switch (typeID()) - { - case RDOType::t_enum: return __enumT(); - default : break; - } - throw RDOValueException(); + switch (typeID()) + { + case RDOType::Type::ENUM: return __enumT(); + default : break; + } + throw RDOValueException(); } double RDOValue::getDouble() const { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - switch (typeID()) - { - case RDOType::t_int : return __get(); - case RDOType::t_real: return __get(); - case RDOType::t_enum: return __get(); - case RDOType::t_bool: return __get() ? 1 : 0; - default : break; - } - throw RDOValueException(); + switch (typeID()) + { + case RDOType::Type::INT : return __get(); + case RDOType::Type::REAL: return __get(); + case RDOType::Type::ENUM: return __get(); + case RDOType::Type::BOOL: return __get() ? 1 : 0; + default : break; + } + throw RDOValueException(); } bool RDOValue::getBool() const { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - switch (typeID()) - { - case RDOType::t_bool: return __get(); - default : break; - } - throw RDOValueException(); + switch (typeID()) + { + case RDOType::Type::BOOL: return __get(); + default : break; + } + throw RDOValueException(); } bool RDOValue::getAsBool() const { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - switch (typeID()) - { - case RDOType::t_int : return __get() ? true : false; - case RDOType::t_real : return __get() ? true : false; - case RDOType::t_enum : return __get() ? true : false; - case RDOType::t_string: return !__stringV().empty() ? true : false; - case RDOType::t_bool : return __get (); - default : break; - } - throw RDOValueException(); + switch (typeID()) + { + case RDOType::Type::INT : return __get() ? true : false; + case RDOType::Type::REAL : return __get() ? true : false; + case RDOType::Type::ENUM : return __get() ? true : false; + case RDOType::Type::STRING: return !__stringV().empty() ? true : false; + case RDOType::Type::BOOL : return __get (); + default : break; + } + throw RDOValueException(); } const std::string& RDOValue::getString() const { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - switch (typeID()) - { - case RDOType::t_string: return __stringV(); - default : break; - } - throw RDOValueException(); + switch (typeID()) + { + case RDOType::Type::STRING: return __stringV(); + default : break; + } + throw RDOValueException(); } const std::string& RDOValue::getIdentificator() const { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - switch (typeID()) - { - case RDOType::t_identificator: return __stringV(); - default : break; - } - throw RDOValueException(); + switch (typeID()) + { + case RDOType::Type::IDENTIFICATOR: return __stringV(); + default : break; + } + throw RDOValueException(); } std::string RDOValue::getAsString() const { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - switch (typeID()) - { - case RDOType::t_int : return rdo::format("%d", __get()); - case RDOType::t_real : return rdo::toString(__get()); - case RDOType::t_enum : return __enumT()->getValues().at(__get()); - case RDOType::t_bool : return __get() ? "true" : "false"; - case RDOType::t_string : return __stringV(); - case RDOType::t_identificator: return __stringV(); - case RDOType::t_pointer : return onPointerAsString(); - default : break; - } - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод getAsString()"); + switch (typeID()) + { + case RDOType::Type::INT : return rdo::format("%d", __get()); + case RDOType::Type::REAL : return rdo::toString(__get()); + case RDOType::Type::ENUM : return __enumT()->getValues().at(__get()); + case RDOType::Type::BOOL : return __get() ? "true" : "false"; + case RDOType::Type::STRING : return __stringV(); + case RDOType::Type::IDENTIFICATOR: return __stringV(); + case RDOType::Type::POINTER : return onPointerAsString(); + default : break; + } + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод getAsString()"); } std::string RDOValue::getAsStringForTrace() const { - if (isUndefined()) - return "#"; + if (isUndefined()) + return "#"; - switch (typeID()) - { - case RDOType::t_int : return rdo::format("%d", __get()); - case RDOType::t_real : return rdo::toString(__get()); - case RDOType::t_enum : return rdo::format("%d", __get()); - case RDOType::t_bool : return __get() ? "true" : "false"; - case RDOType::t_string : return __stringV(); - case RDOType::t_pointer: return onPointerAsString(); - default : break; - } - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод getAsStringForTrace()"); + switch (typeID()) + { + case RDOType::Type::INT : return rdo::format("%d", __get()); + case RDOType::Type::REAL : return rdo::toString(__get()); + case RDOType::Type::ENUM : return rdo::format("%d", __get()); + case RDOType::Type::BOOL : return __get() ? "true" : "false"; + case RDOType::Type::STRING : return __stringV(); + case RDOType::Type::POINTER: return onPointerAsString(); + default : break; + } + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод getAsStringForTrace()"); } void RDOValue::set(const RDOValue& rdovalue) { - m_pType = rdovalue.m_pType; - m_undefined = rdovalue.m_undefined; - switch (typeID()) - { - case RDOType::t_string : - case RDOType::t_identificator: - case RDOType::t_pointer : - { - memcpy(&m_value, &rdovalue.m_value, sizeof(m_value)); - reinterpret_cast(&m_value)->addref(); - break; - } - default: - { - memcpy(&m_value, &rdovalue.m_value, sizeof(m_value)); - break; - } - } + m_pType = rdovalue.m_pType; + m_undefined = rdovalue.m_undefined; + switch (typeID()) + { + case RDOType::Type::STRING : + case RDOType::Type::IDENTIFICATOR: + case RDOType::Type::POINTER : + { + memcpy(&m_value, &rdovalue.m_value, sizeof(m_value)); + reinterpret_cast(&m_value)->addref(); + break; + } + default: + { + memcpy(&m_value, &rdovalue.m_value, sizeof(m_value)); + break; + } + } } RDOValue& RDOValue::operator= (const RDOValue& rdovalue) { - deleteValue(); - set(rdovalue); - return *this; + deleteValue(); + set(rdovalue); + return *this; } bool RDOValue::operator== (const RDOValue& rdovalue) const { - if (isUndefined() || rdovalue.isUndefined()) - throw RDOUndefinedException(); - - switch (typeID()) - { - case RDOType::t_int: - { - switch (rdovalue.typeID()) - { - case RDOType::t_int : return __get() == rdovalue.__get(); - case RDOType::t_real: return __get() == rdovalue.__get(); - default : break; - } - break; - } - case RDOType::t_real: - { - switch (rdovalue.typeID()) - { - case RDOType::t_int : return __get() == rdovalue.__get(); - case RDOType::t_real: return __get() == rdovalue.__get(); - default : break; - } - break; - } - case RDOType::t_bool: - { - switch (rdovalue.typeID()) - { - case RDOType::t_bool: return __get() == rdovalue.__get(); - default : break; - } - break; - } - case RDOType::t_enum: - { - switch (rdovalue.typeID()) - { - case RDOType::t_enum: if (m_pType == rdovalue.m_pType) return __get() == rdovalue.__get(); break; - default : break; - } - break; - } - case RDOType::t_string: - { - switch (rdovalue.typeID()) - { - case RDOType::t_string: return __stringV() == rdovalue.__stringV(); - default : break; - } - break; - } - case RDOType::t_identificator: - { - switch (rdovalue.typeID()) - { - case RDOType::t_identificator: return __stringV() == rdovalue.__stringV(); - default : break; - } - break; - } - case RDOType::t_pointer: - { - return onPointerEqual(rdovalue); - } - default: - break; - } - throw RDOValueException(); + if (isUndefined() || rdovalue.isUndefined()) + throw RDOUndefinedException(); + + switch (typeID()) + { + case RDOType::Type::INT: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::INT : return __get() == rdovalue.__get(); + case RDOType::Type::REAL: return __get() == rdovalue.__get(); + default : break; + } + break; + } + case RDOType::Type::REAL: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::INT : return __get() == rdovalue.__get(); + case RDOType::Type::REAL: return __get() == rdovalue.__get(); + default : break; + } + break; + } + case RDOType::Type::BOOL: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::BOOL: return __get() == rdovalue.__get(); + default : break; + } + break; + } + case RDOType::Type::ENUM: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::ENUM: if (m_pType == rdovalue.m_pType) return __get() == rdovalue.__get(); break; + default : break; + } + break; + } + case RDOType::Type::STRING: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::STRING: return __stringV() == rdovalue.__stringV(); + default : break; + } + break; + } + case RDOType::Type::IDENTIFICATOR: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::IDENTIFICATOR: return __stringV() == rdovalue.__stringV(); + default : break; + } + break; + } + case RDOType::Type::POINTER: + { + return onPointerEqual(rdovalue); + } + default: + break; + } + throw RDOValueException(); } bool RDOValue::operator!= (const RDOValue& rdovalue) const { - return !operator==(rdovalue); + return !operator==(rdovalue); } bool RDOValue::operator< (const RDOValue& rdovalue) const { - if (isUndefined() || rdovalue.isUndefined()) - throw RDOUndefinedException(); - - switch (typeID()) - { - case RDOType::t_int: - { - switch (rdovalue.typeID()) - { - case RDOType::t_int : return __get() < rdovalue.__get(); - case RDOType::t_real: return __get() < rdovalue.__get(); - default : break; - } - break; - } - case RDOType::t_real: - { - switch (rdovalue.typeID()) - { - case RDOType::t_int : return __get() < rdovalue.__get(); - case RDOType::t_real: return __get() < rdovalue.__get(); - default : break; - } - break; - } - case RDOType::t_bool: - { - switch (rdovalue.typeID()) - { - case RDOType::t_bool: return __get() < rdovalue.__get(); - default : break; - } - break; - } - case RDOType::t_string: - { - switch (rdovalue.typeID()) - { - case RDOType::t_string: return __stringV() < rdovalue.__stringV(); - default : break; - } - break; - } - default: - break; - } - throw RDOValueException(); + if (isUndefined() || rdovalue.isUndefined()) + throw RDOUndefinedException(); + + switch (typeID()) + { + case RDOType::Type::INT: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::INT : return __get() < rdovalue.__get(); + case RDOType::Type::REAL: return __get() < rdovalue.__get(); + default : break; + } + break; + } + case RDOType::Type::REAL: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::INT : return __get() < rdovalue.__get(); + case RDOType::Type::REAL: return __get() < rdovalue.__get(); + default : break; + } + break; + } + case RDOType::Type::BOOL: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::BOOL: return __get() < rdovalue.__get(); + default : break; + } + break; + } + case RDOType::Type::STRING: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::STRING: return __stringV() < rdovalue.__stringV(); + default : break; + } + break; + } + default: + break; + } + throw RDOValueException(); } bool RDOValue::operator> (const RDOValue& rdovalue) const { - return !operator<=(rdovalue); + return !operator<=(rdovalue); } bool RDOValue::operator<= (const RDOValue& rdovalue) const { - return operator<(rdovalue) || operator==(rdovalue); + return operator<(rdovalue) || operator==(rdovalue); } bool RDOValue::operator>= (const RDOValue& rdovalue) const { - return operator>(rdovalue) || operator==(rdovalue); + return operator>(rdovalue) || operator==(rdovalue); } RDOValue RDOValue::operator&& (const RDOValue& rdovalue) const { - if (isUndefined() || rdovalue.isUndefined()) - throw RDOUndefinedException(); - - switch (typeID()) - { - case RDOType::t_bool: - { - switch (rdovalue.typeID()) - { - case RDOType::t_bool: return __get() && rdovalue.__get(); - default : break; - } - break; - } - case RDOType::t_pointer: - { - return onPointerAnd(rdovalue); - } - default: - break; - } - throw RDOValueException(); + if (isUndefined() || rdovalue.isUndefined()) + throw RDOUndefinedException(); + + switch (typeID()) + { + case RDOType::Type::BOOL: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::BOOL: return __get() && rdovalue.__get(); + default : break; + } + break; + } + case RDOType::Type::POINTER: + { + return onPointerAnd(rdovalue); + } + default: + break; + } + throw RDOValueException(); } RDOValue RDOValue::operator|| (const RDOValue& rdovalue) const { - if (isUndefined() || rdovalue.isUndefined()) - throw RDOUndefinedException(); - - switch (typeID()) - { - case RDOType::t_bool: - { - switch (rdovalue.typeID()) - { - case RDOType::t_bool: return __get() || rdovalue.__get(); - default : break; - } - break; - } - case RDOType::t_pointer: - { - return onPointerAnd(rdovalue); - } - default: - break; - } - throw RDOValueException(); + if (isUndefined() || rdovalue.isUndefined()) + throw RDOUndefinedException(); + + switch (typeID()) + { + case RDOType::Type::BOOL: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::BOOL: return __get() || rdovalue.__get(); + default : break; + } + break; + } + case RDOType::Type::POINTER: + { + return onPointerAnd(rdovalue); + } + default: + break; + } + throw RDOValueException(); } RDOValue RDOValue::operator- () const { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - switch (typeID()) - { - case RDOType::t_int : return RDOValue(-__get ()); - case RDOType::t_real : return RDOValue(-__get()); - case RDOType::t_bool : return RDOValue(!__get ()); - case RDOType::t_pointer: return onPointerUMinus(); - default : throw RDOValueException(); - } + switch (typeID()) + { + case RDOType::Type::INT : return RDOValue(-__get ()); + case RDOType::Type::REAL : return RDOValue(-__get()); + case RDOType::Type::BOOL : return RDOValue(!__get ()); + case RDOType::Type::POINTER: return onPointerUMinus(); + default : throw RDOValueException(); + } } bool RDOValue::operator! () const { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - switch (typeID()) - { - case RDOType::t_int : return !__get (); break; - case RDOType::t_real: return !__get(); break; - case RDOType::t_bool: return !__get (); break; - default : throw RDOValueException(); - } + switch (typeID()) + { + case RDOType::Type::INT : return !__get (); break; + case RDOType::Type::REAL: return !__get(); break; + case RDOType::Type::BOOL: return !__get (); break; + default : throw RDOValueException(); + } } RDOValue& RDOValue::operator+= (const RDOValue& rdovalue) { - if (isUndefined() || rdovalue.isUndefined()) - throw RDOUndefinedException(); - - switch (typeID()) - { - case RDOType::t_int: - { - switch (rdovalue.typeID()) - { - case RDOType::t_int : - case RDOType::t_real: __get() += rdovalue.getInt(); return *this; - default : break; - } - break; - } - case RDOType::t_real: - { - switch (rdovalue.typeID()) - { - case RDOType::t_int : - case RDOType::t_real: __get() += rdovalue.getDouble(); return *this; - default : break; - } - break; - } - case RDOType::t_string: - { - switch (rdovalue.typeID()) - { - case RDOType::t_string: - { - rdo::LPIRefCounter pIRefCountrer = reinterpret_cast(&m_value); - ASSERT(pIRefCountrer); - - if (!pIRefCountrer->owner()) - { - pIRefCountrer->release(); - new (&m_value) rdo::intrusive_ptr_interface_wrapper(new string_class(__stringV())); - } - - __stringV() += rdovalue.__stringV(); - return *this; - } - default: break; - } - break; - } - case RDOType::t_pointer: - { - return onPointerPlus(rdovalue); - } - default: - break; - } - - throw RDOValueException(); + if (isUndefined() || rdovalue.isUndefined()) + throw RDOUndefinedException(); + + switch (typeID()) + { + case RDOType::Type::INT: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::INT : + case RDOType::Type::REAL: __get() += rdovalue.getInt(); return *this; + default : break; + } + break; + } + case RDOType::Type::REAL: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::INT : + case RDOType::Type::REAL: __get() += rdovalue.getDouble(); return *this; + default : break; + } + break; + } + case RDOType::Type::STRING: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::STRING: + { + rdo::LPIRefCounter pIRefCountrer = reinterpret_cast(&m_value); + ASSERT(pIRefCountrer); + + if (!pIRefCountrer->owner()) + { + pIRefCountrer->release(); + new (&m_value) rdo::intrusive_ptr_interface_wrapper(new string_class(__stringV())); + } + + __stringV() += rdovalue.__stringV(); + return *this; + } + default: break; + } + break; + } + case RDOType::Type::POINTER: + { + return onPointerPlus(rdovalue); + } + default: + break; + } + + throw RDOValueException(); } const RDOValue& RDOValue::operator++() { - operator+=(1); - return *this; + operator+=(1); + return *this; } RDOValue RDOValue::operator++(int /*inc*/) { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - RDOValue prevValue(typeID() == RDOType::t_pointer ? clone() : *this); - operator+=(1); - return prevValue; + RDOValue prevValue(typeID() == RDOType::Type::POINTER ? clone() : *this); + operator+=(1); + return prevValue; } const RDOValue& RDOValue::operator--() { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - operator-=(1); - return *this; + operator-=(1); + return *this; } RDOValue RDOValue::operator--(int /*inc*/) { - if (isUndefined()) - throw RDOUndefinedException(); + if (isUndefined()) + throw RDOUndefinedException(); - RDOValue prevValue(typeID() == RDOType::t_pointer ? clone() : *this); - operator-=(1); - return prevValue; + RDOValue prevValue(typeID() == RDOType::Type::POINTER ? clone() : *this); + operator-=(1); + return prevValue; } RDOValue& RDOValue::operator-= (const RDOValue& rdovalue) { - if (isUndefined() || rdovalue.isUndefined()) - throw RDOUndefinedException(); - - switch (typeID()) - { - case RDOType::t_int: - { - switch (rdovalue.typeID()) - { - case RDOType::t_int : - case RDOType::t_real: __get() -= rdovalue.getInt(); return *this; - default : break; - } - break; - } - case RDOType::t_real: - { - switch (rdovalue.typeID()) - { - case RDOType::t_int : - case RDOType::t_real: __get() -= rdovalue.getDouble(); return *this; - default : break; - } - break; - } - case RDOType::t_pointer: - { - return onPointerMinus(rdovalue); - } - default: - break; - } - - throw RDOValueException(); + if (isUndefined() || rdovalue.isUndefined()) + throw RDOUndefinedException(); + + switch (typeID()) + { + case RDOType::Type::INT: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::INT : + case RDOType::Type::REAL: __get() -= rdovalue.getInt(); return *this; + default : break; + } + break; + } + case RDOType::Type::REAL: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::INT : + case RDOType::Type::REAL: __get() -= rdovalue.getDouble(); return *this; + default : break; + } + break; + } + case RDOType::Type::POINTER: + { + return onPointerMinus(rdovalue); + } + default: + break; + } + + throw RDOValueException(); } RDOValue& RDOValue::operator*= (const RDOValue& rdovalue) { - if (isUndefined() || rdovalue.isUndefined()) - throw RDOUndefinedException(); - - switch (typeID()) - { - case RDOType::t_int: - { - switch (rdovalue.typeID()) - { - case RDOType::t_int : __get() *= rdovalue.__get(); return *this; - case RDOType::t_real: __get() = ((double)__get()) * rdovalue.__get(); m_pType = g_real; return *this; - default : break; - } - break; - } - case RDOType::t_real: - { - switch (rdovalue.typeID()) - { - case RDOType::t_int : - case RDOType::t_real: __get() *= rdovalue.getDouble(); return *this; - default : break; - } - break; - } - case RDOType::t_pointer: - { - return onPointerMult(rdovalue); - } - default: - break; - } - - throw RDOValueException(); + if (isUndefined() || rdovalue.isUndefined()) + throw RDOUndefinedException(); + + switch (typeID()) + { + case RDOType::Type::INT: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::INT : __get() *= rdovalue.__get(); return *this; + case RDOType::Type::REAL: __get() = ((double)__get()) * rdovalue.__get(); m_pType = g_REAL; return *this; + default : break; + } + break; + } + case RDOType::Type::REAL: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::INT : + case RDOType::Type::REAL: __get() *= rdovalue.getDouble(); return *this; + default : break; + } + break; + } + case RDOType::Type::POINTER: + { + return onPointerMult(rdovalue); + } + default: + break; + } + + throw RDOValueException(); } RDOValue& RDOValue::operator/= (const RDOValue& rdovalue) { - if (isUndefined() || rdovalue.isUndefined()) - throw RDOUndefinedException(); - - switch (typeID()) - { - case RDOType::t_int: - { - switch (rdovalue.typeID()) - { - case RDOType::t_int : - case RDOType::t_real: __get() = ((double)__get()) / rdovalue.getDouble(); m_pType = g_real; return *this; - default : break; - } - break; - } - case RDOType::t_real: - { - switch (rdovalue.typeID()) - { - case RDOType::t_int : - case RDOType::t_real: __get() = __get() / rdovalue.getDouble(); return *this; - default : break; - } - break; - } - case RDOType::t_pointer: - { - return onPointerDiv(rdovalue); - } - default: - break; - } - - throw RDOValueException(); + if (isUndefined() || rdovalue.isUndefined()) + throw RDOUndefinedException(); + + switch (typeID()) + { + case RDOType::Type::INT: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::INT : + case RDOType::Type::REAL: __get() = ((double)__get()) / rdovalue.getDouble(); m_pType = g_REAL; return *this; + default : break; + } + break; + } + case RDOType::Type::REAL: + { + switch (rdovalue.typeID()) + { + case RDOType::Type::INT : + case RDOType::Type::REAL: __get() = __get() / rdovalue.getDouble(); return *this; + default : break; + } + break; + } + case RDOType::Type::POINTER: + { + return onPointerDiv(rdovalue); + } + default: + break; + } + + throw RDOValueException(); } RDOValue RDOValue::operator+ (const RDOValue& rdovalue) const { - RDOValue value2(*this); - value2 += rdovalue; - return value2; + RDOValue value2(*this); + value2 += rdovalue; + return value2; } RDOValue RDOValue::operator- (const RDOValue& rdovalue) const { - RDOValue value2(*this); - value2 -= rdovalue; - return value2; + RDOValue value2(*this); + value2 -= rdovalue; + return value2; } RDOValue RDOValue::operator* (const RDOValue& rdovalue) const { - RDOValue value2(*this); - value2 *= rdovalue; - return value2; + RDOValue value2(*this); + value2 *= rdovalue; + return value2; } RDOValue RDOValue::operator/ (const RDOValue& rdovalue) const { - RDOValue value2(*this); - value2 /= rdovalue; - return value2; + RDOValue value2(*this); + value2 /= rdovalue; + return value2; } //RDOValue RDOValue::operator[] (const RDOValue& rdovalue) //{ -// switch (typeID()) -// { -// case RDOType::t_array : return __arrayV ()->operator [](rdovalue); -// case RDOType::t_matrix: return __matrixV()[rdovalue]; -// } -// throw RDOValueException(); +// switch (typeID()) +// { +// case RDOType::t_array : return __arrayV ()->operator [](rdovalue); +// case RDOType::t_matrix: return __matrixV()[rdovalue]; +// } +// throw RDOValueException(); //} // //RDOValue RDOValue::begin() //{ -// switch (typeID()) -// { -// case RDOType::t_array : return RDOValue(rdo::Factory::create(__arrayV()->containerBegin())); -// case RDOType::t_matrix: return RDOValue(RDOMatrixIterator(__matrixV().containerBegin())); -// } -// throw RDOValueException(); +// switch (typeID()) +// { +// case RDOType::t_array : return RDOValue(rdo::Factory::create(__arrayV()->containerBegin())); +// case RDOType::t_matrix: return RDOValue(RDOMatrixIterator(__matrixV().containerBegin())); +// } +// throw RDOValueException(); //} // //RDOValue RDOValue::end() //{ -// switch (typeID()) -// { -// case RDOType::t_array : return RDOValue(rdo::Factory::create( __arrayV()->containerEnd())); -// case RDOType::t_matrix: return RDOValue(RDOMatrixIterator(__matrixV().containerEnd())); -// } -// throw RDOValueException(); +// switch (typeID()) +// { +// case RDOType::t_array : return RDOValue(rdo::Factory::create( __arrayV()->containerEnd())); +// case RDOType::t_matrix: return RDOValue(RDOMatrixIterator(__matrixV().containerEnd())); +// } +// throw RDOValueException(); //} // //void RDOValue::insert(const RDOValue& itr, const RDOValue& itrFst, const RDOValue& itrLst) //{ -// switch (typeID()) -// { -// case RDOType::t_array : __arrayV ()->insertItems(itr.__arrayItr()->getIterator(), itrFst.__arrayItr ()->getIterator(), itrLst.__arrayItr ()->getIterator()); return; -// case RDOType::t_matrix: __matrixV().insertItems(itr.__matrixItr().getIterator(), itrFst.__matrixItr().getIterator(), itrLst.__matrixItr().getIterator()); return; -// } -// throw RDOValueException(); +// switch (typeID()) +// { +// case RDOType::t_array : __arrayV ()->insertItems(itr.__arrayItr()->getIterator(), itrFst.__arrayItr ()->getIterator(), itrLst.__arrayItr ()->getIterator()); return; +// case RDOType::t_matrix: __matrixV().insertItems(itr.__matrixItr().getIterator(), itrFst.__matrixItr().getIterator(), itrLst.__matrixItr().getIterator()); return; +// } +// throw RDOValueException(); //} // //void RDOValue::erase(const RDOValue& itrFst, const RDOValue& itrLst) //{ -// switch (typeID()) -// { -// case RDOType::t_array : __arrayV ()->eraseItems(itrFst.__arrayItr ()->getIterator(), itrLst.__arrayItr ()->getIterator()); return; -// case RDOType::t_matrix: __matrixV().eraseItems(itrFst.__matrixItr().getIterator(), itrLst.__matrixItr().getIterator()); return; -// } -// throw RDOValueException(); +// switch (typeID()) +// { +// case RDOType::t_array : __arrayV ()->eraseItems(itrFst.__arrayItr ()->getIterator(), itrLst.__arrayItr ()->getIterator()); return; +// case RDOType::t_matrix: __matrixV().eraseItems(itrFst.__matrixItr().getIterator(), itrLst.__matrixItr().getIterator()); return; +// } +// throw RDOValueException(); //} // //void RDOValue::setArrayItem(const RDOValue& ind, const RDOValue& item) //{ -// switch (typeID()) -// { -// case RDOType::t_array : -// { -// __arrayV()->setArrayItem(ind, item); -// return; -// } -// } -// throw RDOValueException(); +// switch (typeID()) +// { +// case RDOType::t_array : +// { +// __arrayV()->setArrayItem(ind, item); +// return; +// } +// } +// throw RDOValueException(); //} void*& RDOValue::__voidPtrV() { - return __get(); + return __get(); } const void*& RDOValue::__voidPtrV() const { - return *reinterpret_cast(&const_cast(this)->m_value); + return *reinterpret_cast(&const_cast(this)->m_value); } LPRDOEnumType RDOValue::__enumT() const { - return m_pType.object_static_cast(); + return m_pType.object_static_cast(); } std::string& RDOValue::__stringV() { - return *getPointer().get(); + return *getPointer().get(); } const std::string& RDOValue::__stringV() const { - return *getPointer().get(); + return *getPointer().get(); } RDOValue RDOValue::clone() const { - bool undefined = isUndefined(); - const_cast(this)->setUndefined(false); - - RDOValue result; - switch (typeID()) - { - case RDOType::t_int : result = RDOValue(getInt()); break; - case RDOType::t_real : result = RDOValue(getDouble()); break; - case RDOType::t_enum : result = RDOValue(getEnum(), getEnumAsInt()); break; - case RDOType::t_bool : result = RDOValue(getBool()); break; - case RDOType::t_string : result = RDOValue(getString()); break; - case RDOType::t_identificator: result = RDOValue(getIdentificator(), g_identificator); break; - case RDOType::t_pointer : - { - LPRDOArrayType pThisArrayType = m_pType.object_dynamic_cast(); - if (pThisArrayType) - { - LPRDOArrayValue pValue = getPointer(); - ASSERT(pValue); - result = RDOValue(pThisArrayType, pValue->clone()); - break; - } - - LPRDOArrayIterator pThisArrayIterator = m_pType.object_dynamic_cast(); - if (pThisArrayIterator) - { - LPRDOArrayIterator pIterator = pThisArrayIterator->clone(); - ASSERT(pIterator); - result = RDOValue(pIterator, pIterator); - break; - } - - LPRDOMatrixIterator pThisMatrixIterator = m_pType.object_dynamic_cast(); - if (pThisMatrixIterator) - { - LPRDOMatrixIterator pIterator = pThisMatrixIterator->clone(); - ASSERT(pIterator); - result = RDOValue(pIterator, pIterator); - break; - } - } - break; - default: break; - } - - //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); - //if (pThisFuzzyType) - //{ - // LPFuzzySet pThisValue = getPointer(); - // ASSERT(pThisValue); - - // LPFuzzySet pCloneValue = pThisValue->clone(); - // ASSERT(pCloneValue); - - // return RDOValue(pCloneValue->type(), pCloneValue); - //} - - if (result.typeID() == RDOType::t_unknow) - { - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод clone()"); - } - result.setUndefined(undefined); - const_cast(this)->setUndefined(undefined); - return result; + bool undefined = isUndefined(); + const_cast(this)->setUndefined(false); + + RDOValue result; + switch (typeID()) + { + case RDOType::Type::INT : result = RDOValue(getInt()); break; + case RDOType::Type::REAL : result = RDOValue(getDouble()); break; + case RDOType::Type::ENUM : result = RDOValue(getEnum(), getEnumAsInt()); break; + case RDOType::Type::BOOL : result = RDOValue(getBool()); break; + case RDOType::Type::STRING : result = RDOValue(getString()); break; + case RDOType::Type::IDENTIFICATOR: result = RDOValue(getIdentificator(), g_IDENTIFICATOR); break; + case RDOType::Type::POINTER : + { + LPRDOArrayType pThisArrayType = m_pType.object_dynamic_cast(); + if (pThisArrayType) + { + LPRDOArrayValue pValue = getPointer(); + ASSERT(pValue); + result = RDOValue(pThisArrayType, pValue->clone()); + break; + } + + LPRDOArrayIterator pThisArrayIterator = m_pType.object_dynamic_cast(); + if (pThisArrayIterator) + { + LPRDOArrayIterator pIterator = pThisArrayIterator->clone(); + ASSERT(pIterator); + result = RDOValue(pIterator, pIterator); + break; + } + + LPRDOMatrixIterator pThisMatrixIterator = m_pType.object_dynamic_cast(); + if (pThisMatrixIterator) + { + LPRDOMatrixIterator pIterator = pThisMatrixIterator->clone(); + ASSERT(pIterator); + result = RDOValue(pIterator, pIterator); + break; + } + } + break; + default: break; + } + + //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); + //if (pThisFuzzyType) + //{ + // LPFuzzySet pThisValue = getPointer(); + // ASSERT(pThisValue); + + // LPFuzzySet pCloneValue = pThisValue->clone(); + // ASSERT(pCloneValue); + + // return RDOValue(pCloneValue->type(), pCloneValue); + //} + + if (result.typeID() == RDOType::Type::UNKNOW) + { + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод clone()"); + } + result.setUndefined(undefined); + const_cast(this)->setUndefined(undefined); + return result; } std::string RDOValue::onPointerAsString() const { - ASSERT(typeID() == RDOType::t_pointer); - - LPRDOArrayType pThisArrayType = m_pType.object_dynamic_cast(); - if (pThisArrayType) - { - LPRDOArrayValue pValue = getPointer(); - ASSERT(pValue); - return pValue->asString(); - } - - LPRDOArrayIterator pThisArrayIterator = m_pType.object_dynamic_cast(); - if (pThisArrayIterator) - { - return pThisArrayIterator->asString(); - } - - LPRDOMatrixType pThisMatrixType = m_pType.object_dynamic_cast(); - if (pThisMatrixType) - { - LPRDOMatrixValue pValue = getPointer(); - ASSERT(pValue); - return pValue->asString(); - } - - LPRDOMatrixIterator pThisMatrixIterator = m_pType.object_dynamic_cast(); - if (pThisMatrixIterator) - { - return pThisMatrixIterator->asString(); - } - - LPRDOResourceTypeList pThisResource = m_pType.object_dynamic_cast(); - if (pThisResource) - { - return "nested_resource"; - } - - //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); - //if (pThisFuzzyType) - //{ - // LPFuzzySet pValue = getPointer(); - // ASSERT(pValue); - // return pValue->getAsString(); - //} - - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод getAsString()"); + ASSERT(typeID() == RDOType::Type::POINTER); + + LPRDOArrayType pThisArrayType = m_pType.object_dynamic_cast(); + if (pThisArrayType) + { + LPRDOArrayValue pValue = getPointer(); + ASSERT(pValue); + return pValue->asString(); + } + + LPRDOArrayIterator pThisArrayIterator = m_pType.object_dynamic_cast(); + if (pThisArrayIterator) + { + return pThisArrayIterator->asString(); + } + + LPRDOMatrixType pThisMatrixType = m_pType.object_dynamic_cast(); + if (pThisMatrixType) + { + LPRDOMatrixValue pValue = getPointer(); + ASSERT(pValue); + return pValue->asString(); + } + + LPRDOMatrixIterator pThisMatrixIterator = m_pType.object_dynamic_cast(); + if (pThisMatrixIterator) + { + return pThisMatrixIterator->asString(); + } + + LPRDOResourceTypeList pThisResource = m_pType.object_dynamic_cast(); + if (pThisResource) + { + return "nested_resource"; + } + + //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); + //if (pThisFuzzyType) + //{ + // LPFuzzySet pValue = getPointer(); + // ASSERT(pValue); + // return pValue->getAsString(); + //} + + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод getAsString()"); } bool RDOValue::onPointerEqual(const RDOValue& rdovalue) const { - ASSERT(typeID() == RDOType::t_pointer); - - LPRDOArrayIterator pThisArrayIterator = m_pType.object_dynamic_cast(); - if (pThisArrayIterator) - { - LPRDOArrayIterator pValueArrayIterator = rdovalue.type().object_dynamic_cast(); - if (pValueArrayIterator) - { - return pThisArrayIterator->equal(pValueArrayIterator); - } - } - - LPRDOMatrixIterator pThisMatrixIterator = m_pType.object_dynamic_cast(); - if (pThisMatrixIterator) - { - LPRDOMatrixIterator pValueMatrixIterator = rdovalue.type().object_dynamic_cast(); - if (pValueMatrixIterator) - { - return pThisMatrixIterator->equal(pValueMatrixIterator); - } - } - - LPRDOResourceTypeList pThisResourceType = m_pType.object_dynamic_cast(); - if (pThisResourceType) - { - LPRDOResource pThisResource = getPointerByType(); - LPRDOResource pOtherResource = rdovalue.getPointerByType(); - if (pThisResource && pOtherResource) - { - return pThisResource == pOtherResource; - } - } - - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerEqual()"); + ASSERT(typeID() == RDOType::Type::POINTER); + + LPRDOArrayIterator pThisArrayIterator = m_pType.object_dynamic_cast(); + if (pThisArrayIterator) + { + LPRDOArrayIterator pValueArrayIterator = rdovalue.type().object_dynamic_cast(); + if (pValueArrayIterator) + { + return pThisArrayIterator->equal(pValueArrayIterator); + } + } + + LPRDOMatrixIterator pThisMatrixIterator = m_pType.object_dynamic_cast(); + if (pThisMatrixIterator) + { + LPRDOMatrixIterator pValueMatrixIterator = rdovalue.type().object_dynamic_cast(); + if (pValueMatrixIterator) + { + return pThisMatrixIterator->equal(pValueMatrixIterator); + } + } + + LPRDOResourceTypeList pThisResourceType = m_pType.object_dynamic_cast(); + if (pThisResourceType) + { + LPRDOResource pThisResource = getPointerByType(); + LPRDOResource pOtherResource = rdovalue.getPointerByType(); + if (pThisResource && pOtherResource) + { + return pThisResource == pOtherResource; + } + } + + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerEqual()"); } RDOValue& RDOValue::onPointerPlus(const RDOValue& rdovalue) { - ASSERT(typeID() == RDOType::t_pointer); - - LPRDOArrayIterator pThisArrayIterator = m_pType.object_dynamic_cast(); - if (pThisArrayIterator) - { - if (rdovalue.typeID() == RDOType::t_int) - { - pThisArrayIterator->preInc(rdovalue.getInt()); - return *this; - } - } - - LPRDOMatrixIterator pThisMatrixIterator = m_pType.object_dynamic_cast(); - if (pThisMatrixIterator) - { - if (rdovalue.typeID() == RDOType::t_int) - { - pThisMatrixIterator->preInc(rdovalue.getInt()); - return *this; - } - } - - //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); - //if (pThisFuzzyType) - //{ - // LPFuzzySet pThisValue = getPointer(); - // ASSERT(pThisValue); - - // LPRDOFuzzyType pValueFuzzyType = rdovalue.type().object_dynamic_cast(); - // if (pValueFuzzyType) - // { - // pThisValue->operator+ (rdovalue.getPointer()); - // return *this; - // } - //} - - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerPlus()"); + ASSERT(typeID() == RDOType::Type::POINTER); + + LPRDOArrayIterator pThisArrayIterator = m_pType.object_dynamic_cast(); + if (pThisArrayIterator) + { + if (rdovalue.typeID() == RDOType::Type::INT) + { + pThisArrayIterator->preInc(rdovalue.getInt()); + return *this; + } + } + + LPRDOMatrixIterator pThisMatrixIterator = m_pType.object_dynamic_cast(); + if (pThisMatrixIterator) + { + if (rdovalue.typeID() == RDOType::Type::INT) + { + pThisMatrixIterator->preInc(rdovalue.getInt()); + return *this; + } + } + + //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); + //if (pThisFuzzyType) + //{ + // LPFuzzySet pThisValue = getPointer(); + // ASSERT(pThisValue); + + // LPRDOFuzzyType pValueFuzzyType = rdovalue.type().object_dynamic_cast(); + // if (pValueFuzzyType) + // { + // pThisValue->operator+ (rdovalue.getPointer()); + // return *this; + // } + //} + + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerPlus()"); } RDOValue& RDOValue::onPointerMinus(const RDOValue& rdovalue) { - ASSERT(typeID() == RDOType::t_pointer); - - LPRDOArrayIterator pThisArrayIterator = m_pType.object_dynamic_cast(); - if (pThisArrayIterator) - { - if (rdovalue.typeID() == RDOType::t_int) - { - pThisArrayIterator->preInc(-rdovalue.getInt()); - return *this; - } - } - - LPRDOMatrixIterator pThisMatrixIterator = m_pType.object_dynamic_cast(); - if (pThisMatrixIterator) - { - if (rdovalue.typeID() == RDOType::t_int) - { - pThisMatrixIterator->preInc(-rdovalue.getInt()); - return *this; - } - } - - //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); - //if (pThisFuzzyType) - //{ - // LPFuzzySet pThisValue = getPointer(); - // ASSERT(pThisValue); - - // LPRDOFuzzyType pValueFuzzyType = rdovalue.type().object_dynamic_cast(); - // if (pValueFuzzyType) - // { - // pThisValue->operator -(rdovalue.getPointer()); - // return *this; - // } - //} - - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerMinus()"); + ASSERT(typeID() == RDOType::Type::POINTER); + + LPRDOArrayIterator pThisArrayIterator = m_pType.object_dynamic_cast(); + if (pThisArrayIterator) + { + if (rdovalue.typeID() == RDOType::Type::INT) + { + pThisArrayIterator->preInc(-rdovalue.getInt()); + return *this; + } + } + + LPRDOMatrixIterator pThisMatrixIterator = m_pType.object_dynamic_cast(); + if (pThisMatrixIterator) + { + if (rdovalue.typeID() == RDOType::Type::INT) + { + pThisMatrixIterator->preInc(-rdovalue.getInt()); + return *this; + } + } + + //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); + //if (pThisFuzzyType) + //{ + // LPFuzzySet pThisValue = getPointer(); + // ASSERT(pThisValue); + + // LPRDOFuzzyType pValueFuzzyType = rdovalue.type().object_dynamic_cast(); + // if (pValueFuzzyType) + // { + // pThisValue->operator -(rdovalue.getPointer()); + // return *this; + // } + //} + + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerMinus()"); } RDOValue& RDOValue::onPointerMult(const RDOValue& /*rdovalue*/) { - ASSERT(typeID() == RDOType::t_pointer); + ASSERT(typeID() == RDOType::Type::POINTER); - //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); - //if (pThisFuzzyType) - //{ - // LPFuzzySet pThisValue = getPointer(); - // ASSERT(pThisValue); + //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); + //if (pThisFuzzyType) + //{ + // LPFuzzySet pThisValue = getPointer(); + // ASSERT(pThisValue); - // LPRDOFuzzyType pValueFuzzyType = rdovalue.type().object_dynamic_cast(); - // if (pValueFuzzyType) - // { - // pThisValue->operator*(rdovalue.getPointer()); - // return *this; - // } - //} + // LPRDOFuzzyType pValueFuzzyType = rdovalue.type().object_dynamic_cast(); + // if (pValueFuzzyType) + // { + // pThisValue->operator*(rdovalue.getPointer()); + // return *this; + // } + //} - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerMult()"); + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerMult()"); } RDOValue& RDOValue::onPointerDiv(const RDOValue& /*rdovalue*/) { - ASSERT(typeID() == RDOType::t_pointer); + ASSERT(typeID() == RDOType::Type::POINTER); - //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); - //if (pThisFuzzyType) - //{ - // LPFuzzySet pThisValue = getPointer(); - // ASSERT(pThisValue); + //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); + //if (pThisFuzzyType) + //{ + // LPFuzzySet pThisValue = getPointer(); + // ASSERT(pThisValue); - // LPRDOFuzzyType pValueFuzzyType = rdovalue.type().object_dynamic_cast(); - // if (pValueFuzzyType) - // { - // pThisValue->operator/(rdovalue.getPointer()); - // return *this; - // } - //} + // LPRDOFuzzyType pValueFuzzyType = rdovalue.type().object_dynamic_cast(); + // if (pValueFuzzyType) + // { + // pThisValue->operator/(rdovalue.getPointer()); + // return *this; + // } + //} - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerMult()"); + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerMult()"); } int RDOValue::onPointerGetInt() const { - ASSERT(typeID() == RDOType::t_pointer); + ASSERT(typeID() == RDOType::Type::POINTER); - //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); - //if (pThisFuzzyType) - //{ - // LPFuzzySet pThisValue = getPointer(); - // ASSERT(pThisValue); - // return MemberFunctionProperties::defuzzyfication(pThisValue).getInt(); - //} + //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); + //if (pThisFuzzyType) + //{ + // LPFuzzySet pThisValue = getPointer(); + // ASSERT(pThisValue); + // return MemberFunctionProperties::defuzzyfication(pThisValue).getInt(); + //} - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerGetInt()"); + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerGetInt()"); } uint32_t RDOValue::onPointerGetUInt() const { - ASSERT(typeID() == RDOType::t_pointer); + ASSERT(typeID() == RDOType::Type::POINTER); - //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); - //if (pThisFuzzyType) - //{ - // LPFuzzySet pThisValue = getPointer(); - // ASSERT(pThisValue); - // return (uint32_t)MemberFunctionProperties::defuzzyfication(pThisValue).getInt(); - //} + //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); + //if (pThisFuzzyType) + //{ + // LPFuzzySet pThisValue = getPointer(); + // ASSERT(pThisValue); + // return (uint32_t)MemberFunctionProperties::defuzzyfication(pThisValue).getInt(); + //} - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerGetUInt()"); + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerGetUInt()"); } bool RDOValue::onPointerAnd(const RDOValue& /*rdovalue*/) const { - ASSERT(typeID() == RDOType::t_pointer); + ASSERT(typeID() == RDOType::Type::POINTER); - //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); - //if (pThisFuzzyType) - //{ - // LPFuzzySet pThisValue = getPointer(); - // ASSERT(pThisValue); + //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); + //if (pThisFuzzyType) + //{ + // LPFuzzySet pThisValue = getPointer(); + // ASSERT(pThisValue); - // LPRDOFuzzyType pValueFuzzyType = rdovalue.type().object_dynamic_cast(); - // if (pValueFuzzyType) - // { - // return pThisValue->operator&&(rdovalue.getPointer()); - // } - //} + // LPRDOFuzzyType pValueFuzzyType = rdovalue.type().object_dynamic_cast(); + // if (pValueFuzzyType) + // { + // return pThisValue->operator&&(rdovalue.getPointer()); + // } + //} - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerAnd()"); + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerAnd()"); } bool RDOValue::onPointerOr(const RDOValue& /*rdovalue*/) const { - ASSERT(typeID() == RDOType::t_pointer); + ASSERT(typeID() == RDOType::Type::POINTER); - //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); - //if (pThisFuzzyType) - //{ - // LPFuzzySet pThisValue = getPointer(); - // ASSERT(pThisValue); + //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); + //if (pThisFuzzyType) + //{ + // LPFuzzySet pThisValue = getPointer(); + // ASSERT(pThisValue); - // LPRDOFuzzyType pValueFuzzyType = rdovalue.type().object_dynamic_cast(); - // if (pValueFuzzyType) - // { - // return pThisValue->operator||(rdovalue.getPointer()); - // } - //} + // LPRDOFuzzyType pValueFuzzyType = rdovalue.type().object_dynamic_cast(); + // if (pValueFuzzyType) + // { + // return pThisValue->operator||(rdovalue.getPointer()); + // } + //} - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerOr()"); + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerOr()"); } RDOValue RDOValue::onPointerUMinus() const { - ASSERT(typeID() == RDOType::t_pointer); + ASSERT(typeID() == RDOType::Type::POINTER); - //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); - //if (pThisFuzzyType) - //{ - // LPFuzzySet pCloneValue = clone().getPointer(); - // ASSERT(pCloneValue); - // return RDOValue(pCloneValue->type(), MemberFunctionProperties::u_minus(pCloneValue)); - //} + //LPRDOFuzzyType pThisFuzzyType = m_pType.object_dynamic_cast(); + //if (pThisFuzzyType) + //{ + // LPFuzzySet pCloneValue = clone().getPointer(); + // ASSERT(pCloneValue); + // return RDOValue(pCloneValue->type(), MemberFunctionProperties::u_minus(pCloneValue)); + //} - throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerUMinus()"); + throw RDOValueException("Для rdo::runtime::RDOValue не определен метод onPointerUMinus()"); } void RDOValue::setUndefined(bool undefined) { - m_undefined = undefined; + m_undefined = undefined; } bool RDOValue::isUndefined() const { - return m_undefined; + return m_undefined; } // -------------------------------------------------------------------------------- // -------------------- RDOValue::string_class // -------------------------------------------------------------------------------- RDOValue::string_class::string_class(const std::string& string) - : std::string(string) + : std::string(string) {} rdo::intrusive_ptr RDOValue::string_class::clone() const { - return rdo::intrusive_ptr(new string_class(c_str())); + return rdo::intrusive_ptr(new string_class(c_str())); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdo_value.h b/simulator/runtime/rdo_value.h index 51696e957..f4efcd69e 100644 --- a/simulator/runtime/rdo_value.h +++ b/simulator/runtime/rdo_value.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_VALUE_H_ -#define _LIB_RUNTIME_VALUE_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM #include "utils/src/common/platform.h" @@ -15,143 +14,140 @@ OPEN_RDO_RUNTIME_NAMESPACE PREDECLARE_POINTER(RDOEnumType); -//! Значение переменных в РДО class RDOValue { public: - RDOValue(); - ~RDOValue(); - - RDOValue(const RDOValue& rdovalue); - RDOValue(const LPRDOType& pType); - RDOValue(int value); - RDOValue(std::size_t value); - RDOValue(double value); - RDOValue(bool value); - RDOValue(const LPRDOEnumType& pEnum); - RDOValue(const LPRDOEnumType& pEnum, const std::string& value); - RDOValue(const LPRDOEnumType& pEnum, std::size_t index); - RDOValue(const std::string& value); - RDOValue(const char* value); - RDOValue(const std::string& value, const LPRDOType& pType); - - template - RDOValue(const LPRDOType& pType, const rdo::intrusive_ptr& pObject); - - static RDOValue fromDouble(const LPRDOType& pType, double value); - - int getInt() const; - uint32_t getUInt() const; - int getEnumAsInt() const; - LPRDOEnumType getEnum() const; - double getDouble() const; - bool getBool() const; - const std::string& getString() const; - const std::string& getIdentificator() const; - - template - const rdo::intrusive_ptr& getPointerByType() const; - - template - const rdo::intrusive_ptr& getPointerByType() const; - - template - const rdo::intrusive_ptr& getPointerByInterface() const; - - template - bool isType() const; - - bool getAsBool() const; - std::string getAsString() const; - std::string getAsStringForTrace() const; - - RDOValue& operator=(const RDOValue& rdovalue); - bool operator==(const RDOValue& rdovalue) const; - bool operator!=(const RDOValue& rdovalue) const; - bool operator<(const RDOValue& rdovalue) const; - bool operator>(const RDOValue& rdovalue) const; - bool operator<=(const RDOValue& rdovalue) const; - bool operator>=(const RDOValue& rdovalue) const; - RDOValue operator&&(const RDOValue& rdovalue) const; - RDOValue operator||(const RDOValue& rdovalue) const; - RDOValue operator-() const; - bool operator!() const; - const RDOValue& operator++(); - RDOValue operator++(int inc); - const RDOValue& operator--(); - RDOValue operator--(int inc); - RDOValue& operator+=(const RDOValue& rdovalue); - RDOValue& operator-=(const RDOValue& rdovalue); - RDOValue& operator*=(const RDOValue& rdovalue); - RDOValue& operator/=(const RDOValue& rdovalue); - RDOValue operator+(const RDOValue& rdovalue) const; - RDOValue operator-(const RDOValue& rdovalue) const; - RDOValue operator*(const RDOValue& rdovalue) const; - RDOValue operator/(const RDOValue& rdovalue) const; - - void setUndefined(bool undefined); - bool isUndefined () const; - - const LPRDOType& type() const; - RDOType::TypeID typeID() const; - - RDOValue clone() const; - - //RDOValue begin (); - //RDOValue end (); - //void insert(const RDOValue& itr, const RDOValue& itrFst, const RDOValue& itrLst); - //void erase (const RDOValue& itrFst, const RDOValue& itrLst ); - - //void setArrayItem(const RDOValue& ind, const RDOValue& item); + RDOValue(); + ~RDOValue(); + + RDOValue(const RDOValue& rdovalue); + RDOValue(const LPRDOType& pType); + RDOValue(int value); + RDOValue(std::size_t value); + RDOValue(double value); + RDOValue(bool value); + RDOValue(const LPRDOEnumType& pEnum); + RDOValue(const LPRDOEnumType& pEnum, const std::string& value); + RDOValue(const LPRDOEnumType& pEnum, std::size_t index); + RDOValue(const std::string& value); + RDOValue(const char* value); + RDOValue(const std::string& value, const LPRDOType& pType); + + template + RDOValue(const LPRDOType& pType, const rdo::intrusive_ptr& pObject); + + static RDOValue fromDouble(const LPRDOType& pType, double value); + + int getInt() const; + uint32_t getUInt() const; + int getEnumAsInt() const; + LPRDOEnumType getEnum() const; + double getDouble() const; + bool getBool() const; + const std::string& getString() const; + const std::string& getIdentificator() const; + + template + const rdo::intrusive_ptr& getPointerByType() const; + + template + const rdo::intrusive_ptr& getPointerByType() const; + + template + const rdo::intrusive_ptr& getPointerByInterface() const; + + template + bool isType() const; + + bool getAsBool() const; + std::string getAsString() const; + std::string getAsStringForTrace() const; + + RDOValue& operator=(const RDOValue& rdovalue); + bool operator==(const RDOValue& rdovalue) const; + bool operator!=(const RDOValue& rdovalue) const; + bool operator<(const RDOValue& rdovalue) const; + bool operator>(const RDOValue& rdovalue) const; + bool operator<=(const RDOValue& rdovalue) const; + bool operator>=(const RDOValue& rdovalue) const; + RDOValue operator&&(const RDOValue& rdovalue) const; + RDOValue operator||(const RDOValue& rdovalue) const; + RDOValue operator-() const; + bool operator!() const; + const RDOValue& operator++(); + RDOValue operator++(int inc); + const RDOValue& operator--(); + RDOValue operator--(int inc); + RDOValue& operator+=(const RDOValue& rdovalue); + RDOValue& operator-=(const RDOValue& rdovalue); + RDOValue& operator*=(const RDOValue& rdovalue); + RDOValue& operator/=(const RDOValue& rdovalue); + RDOValue operator+(const RDOValue& rdovalue) const; + RDOValue operator-(const RDOValue& rdovalue) const; + RDOValue operator*(const RDOValue& rdovalue) const; + RDOValue operator/(const RDOValue& rdovalue) const; + + void setUndefined(bool undefined); + bool isUndefined () const; + + const LPRDOType& type() const; + RDOType::Type typeID() const; + + RDOValue clone() const; + + //RDOValue begin (); + //RDOValue end (); + //void insert(const RDOValue& itr, const RDOValue& itrFst, const RDOValue& itrLst); + //void erase (const RDOValue& itrFst, const RDOValue& itrLst ); + + //void setArrayItem(const RDOValue& ind, const RDOValue& item); private: - //! Строковый тип данных - PREDECLARE_POINTER(string_class); - class string_class - : public rdo::counter_reference - , public std::string - { - public: - string_class(const std::string& string); - rdo::intrusive_ptr clone() const; - }; - - //! Тип контейнера значения, размер определяется по максимальному размеру типа данных - typedef unsigned char Value[sizeof(rdo::intrusive_ptr_interface_wrapper)]; - - Value m_value; //!< контейнер значения - LPRDOType m_pType; //!< тип значения - bool m_undefined; //!< неопределенность значения - - void set (const RDOValue& rdovalue); - void deleteValue(); - - template - T& __get(); - - template - const T& __get() const; - - void*& __voidPtrV(); - const void*& __voidPtrV() const; - LPRDOEnumType __enumT() const; - std::string& __stringV(); - const std::string& __stringV() const; - - template rdo::intrusive_ptr& getPointer(); - template const rdo::intrusive_ptr& getPointer() const; - - std::string onPointerAsString() const; - bool onPointerEqual(const RDOValue& rdovalue) const; - RDOValue& onPointerPlus(const RDOValue& rdovalue); - RDOValue& onPointerMinus(const RDOValue& rdovalue); - RDOValue& onPointerMult(const RDOValue& rdovalue); - RDOValue& onPointerDiv(const RDOValue& rdovalue); - int onPointerGetInt() const; - uint32_t onPointerGetUInt() const; - bool onPointerAnd(const RDOValue& rdovalue) const; - bool onPointerOr(const RDOValue& rdovalue) const; - RDOValue onPointerUMinus() const; + PREDECLARE_POINTER(string_class); + class string_class + : public rdo::counter_reference + , public std::string + { + public: + string_class(const std::string& string); + rdo::intrusive_ptr clone() const; + }; + + typedef unsigned char Value[sizeof(rdo::intrusive_ptr_interface_wrapper)]; + + Value m_value; // контейнер значения + LPRDOType m_pType; // тип значения + bool m_undefined; // неопределенность значения + + void set (const RDOValue& rdovalue); + void deleteValue(); + + template + T& __get(); + + template + const T& __get() const; + + void*& __voidPtrV(); + const void*& __voidPtrV() const; + LPRDOEnumType __enumT() const; + std::string& __stringV(); + const std::string& __stringV() const; + + template rdo::intrusive_ptr& getPointer(); + template const rdo::intrusive_ptr& getPointer() const; + + std::string onPointerAsString() const; + bool onPointerEqual(const RDOValue& rdovalue) const; + RDOValue& onPointerPlus(const RDOValue& rdovalue); + RDOValue& onPointerMinus(const RDOValue& rdovalue); + RDOValue& onPointerMult(const RDOValue& rdovalue); + RDOValue& onPointerDiv(const RDOValue& rdovalue); + int onPointerGetInt() const; + uint32_t onPointerGetUInt() const; + bool onPointerAnd(const RDOValue& rdovalue) const; + bool onPointerOr(const RDOValue& rdovalue) const; + RDOValue onPointerUMinus() const; }; std::ostream& operator<< (std::ostream& stream, const RDOValue& rdovalue); @@ -159,5 +155,3 @@ std::ostream& operator<< (std::ostream& stream, const RDOValue& rdovalue); CLOSE_RDO_RUNTIME_NAMESPACE #include "simulator/runtime/rdo_value-inl.h" - -#endif // _LIB_RUNTIME_VALUE_H_ diff --git a/simulator/runtime/rdobase.cpp b/simulator/runtime/rdobase.cpp index 937e44c72..09314f238 100644 --- a/simulator/runtime/rdobase.cpp +++ b/simulator/runtime/rdobase.cpp @@ -5,7 +5,7 @@ // ----------------------------------------------------------------------- INCLUDES #include #ifdef COMPILER_GCC - #include + #include #endif // COMPILER_GCC #include "utils/src/common/warning_disable.h" #include @@ -16,7 +16,7 @@ // -------------------------------------------------------------------------------- #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable : 4786) + #pragma warning(disable : 4786) #endif OPEN_RDO_RUNTIME_NAMESPACE @@ -25,20 +25,20 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOSimulatorBase // -------------------------------------------------------------------------------- RDOSimulatorBase::RDOSimulatorBase() - : m_checkOperation (true ) - , m_startTime (0 ) - , m_currentTime (0 ) - , m_nextTime (0 ) - , m_mode (RTM_MaxSpeed) - , m_speed (1 ) - , m_speed_range_max (500000 ) - , m_next_delay_count (0 ) - , m_next_delay_current(0 ) - , m_showRate (60 ) - , m_msec_wait (0 ) - , m_msec_prev (0 ) - , m_cnt_events (0 ) - , m_cnt_choice_from (0 ) + : m_checkOperation (true ) + , m_startTime (0 ) + , m_currentTime (0 ) + , m_nextTime (0 ) + , m_mode (RunTimeMode::MAX_SPEED) + , m_speed (1 ) + , m_speed_range_max (500000 ) + , m_next_delay_count (0 ) + , m_next_delay_current(0 ) + , m_showRate (60 ) + , m_msec_wait (0 ) + , m_msec_prev (0 ) + , m_cnt_events (0 ) + , m_cnt_choice_from (0 ) {} RDOSimulatorBase::~RDOSimulatorBase() @@ -46,58 +46,58 @@ RDOSimulatorBase::~RDOSimulatorBase() void RDOSimulatorBase::setStartTime(double value) { - m_startTime = value; + m_startTime = value; } double RDOSimulatorBase::getCurrentTime() const { - return m_currentTime; + return m_currentTime; } RunTimeMode RDOSimulatorBase::getMode() const { - return m_mode; + return m_mode; } double RDOSimulatorBase::getSpeed() const { - return m_speed; + return m_speed; } double RDOSimulatorBase::getShowRate() const { - return m_showRate; + return m_showRate; } void RDOSimulatorBase::inc_cnt_events() { - ++m_cnt_events; + ++m_cnt_events; } void RDOSimulatorBase::inc_cnt_choice_from() { - ++m_cnt_choice_from; + ++m_cnt_choice_from; } std::size_t RDOSimulatorBase::get_cnt_events() { - return m_cnt_events; + return m_cnt_events; } std::size_t RDOSimulatorBase::get_cnt_choice_from() { - return m_cnt_choice_from; + return m_cnt_choice_from; } std::size_t RDOSimulatorBase::getMSec(const boost::posix_time::ptime& ptime) { - boost::posix_time::ptime startTime = boost::posix_time::time_from_string("1970-01-01 00:00:00.000"); - return (std::size_t)( ptime - startTime ).total_milliseconds(); + boost::posix_time::ptime startTime = boost::posix_time::time_from_string("1970-01-01 00:00:00.000"); + return (std::size_t)( ptime - startTime ).total_milliseconds(); } void RDOSimulatorBase::setCurrentTime(double value) { - m_currentTime = value; + m_currentTime = value; } void RDOSimulatorBase::onNewTimeNow() @@ -105,234 +105,234 @@ void RDOSimulatorBase::onNewTimeNow() std::size_t RDOSimulatorBase::get_cnt_calc_arithm() const { - return OperatorType::getCalcCounter(); + return OperatorType::getCalcCounter(); } std::size_t RDOSimulatorBase::get_cnt_calc_logic() const { - return OperatorType::getCalcCounter(); + return OperatorType::getCalcCounter(); } void RDOSimulatorBase::rdoInit() { - m_currentTime = m_startTime; - m_nextTime = m_currentTime; - m_checkOperation = true; - onInit(); - OperatorType::getCalcCounter() = 0; - OperatorType::getCalcCounter () = 0; + m_currentTime = m_startTime; + m_nextTime = m_currentTime; + m_checkOperation = true; + onInit(); + OperatorType::getCalcCounter() = 0; + OperatorType::getCalcCounter () = 0; - if (m_timePoints.find(m_currentTime) == m_timePoints.end()) - m_timePoints[m_currentTime] = BOPlannedList(); - preProcess(); + if (m_timePoints.find(m_currentTime) == m_timePoints.end()) + m_timePoints[m_currentTime] = BOPlannedList(); + preProcess(); - m_speed = 1; - m_next_delay_count = 0; - m_next_delay_current = 0; - m_showRate = 60; - m_msec_wait = 0; + m_speed = 1; + m_next_delay_count = 0; + m_next_delay_current = 0; + m_showRate = 60; + m_msec_wait = 0; - onNewTimeNow(); + onNewTimeNow(); } bool RDOSimulatorBase::rdoNext() { - if (m_mode == RTM_Pause || m_mode == RTM_BreakPoint) - { - boost::this_thread::sleep(boost::posix_time::milliseconds(1)); - return true; - } - // Если нажата клавиша или активная область, то задержки надо проскачить - bool keyboard = isKeyDown(); - if (!keyboard) - { - // Задержка общей скорости моделирования - // Это mode == RTM_Jump || mode == RTM_Sync - if (m_mode != RTM_MaxSpeed && m_next_delay_count) - { - ++m_next_delay_current; - if (m_next_delay_current < m_next_delay_count) return true; - m_next_delay_current = 0; - } - // Задержка синхронной скорости моделирования (длительность операций) - // Тут не надо проверять mode == RTM_Sync, т.к. это уже заложено в msec_wait, - // который сбрасывается в setMode и не изменяется далее. - if (m_msec_wait > 1) - { - boost::posix_time::ptime systime_current = boost::posix_time::microsec_clock::local_time(); - std::size_t msec_curr = getMSec(systime_current); - std::size_t msec_delta; - // Милисекунды считаются с учетом часов, но при смене суток часы сбрасываются на ноль, - // и текущее время в милисекундах становится меньше предыдущего. Учитываем этот момент - // через ветку ELSE. Теперь система сможет учесть переход на один день вперед между - // двумя соседники моментами времени, но не сможет учесть на два и более дня. Это - // является маразматической ситуаций (ждать слудующего события два дня), но запросто - // может потребоваться в системе мониторинга реального времени, которая работает в - // автоматическом режиме, обрабатывая информацию с контроллеров. РДО это делать не умеет. - // Как решение - отказ от синхронной работы в таких системах, и учет только скорости, или - // переход на работу с календарем дней, месяцев и лет. SYSTEMTIME содержит такую информацию. - if (msec_curr >= m_msec_prev) - { - msec_delta = msec_curr - m_msec_prev; - } - else - { - msec_delta = UINT_MAX - m_msec_prev + msec_curr; - } - if (msec_delta <= m_msec_wait) return true; - m_msec_wait -= msec_delta; - } - } - // Окончание моделирования - сработало событие конца - if (endCondition()) - { - onEndCondition(); - return false; - } - if (m_currentTime != m_nextTime) - { - m_currentTime = m_nextTime; - onNewTimeNow(); - } - // Выполнение операции - if (doOperation()) - { - if (breakPoints()) - { - setMode(RTM_BreakPoint); - } - return true; - } - else - { - // Переход к следующей операции - if (!m_timePoints.empty()) - { - BOPlannedMap::iterator begin = m_timePoints.begin(); - double newTime = begin->first; - const BOPlannedList& list = begin->second; - if (list.empty()) - { - m_timePoints.erase(begin); - } - if (m_currentTime > newTime) - { - newTime = m_currentTime; - } - if (m_mode == RTM_Sync) - { - m_msec_wait += (newTime - m_nextTime) * 3600.0 * 1000.0 / m_showRate; - if (m_msec_wait > 0) - { - if (newTime != m_startTime) - { - if (m_speed > DBL_MIN) - { - m_msec_wait = m_msec_wait / m_speed; - } - else - { - m_msec_wait = m_msec_wait / DBL_MIN; - } - boost::posix_time::ptime systime_current = boost::posix_time::microsec_clock::local_time(); - m_msec_prev = getMSec(systime_current); - } - else - { - m_msec_wait = 0; - } - } - } - m_nextTime = newTime; - return true; - } - else - { - // Окончание моделирования - нет больше событий - onNothingMoreToDo(); - return false; - } - } + if (m_mode == RunTimeMode::PAUSE || m_mode == RunTimeMode::BREAKPOINT) + { + boost::this_thread::sleep(boost::posix_time::milliseconds(1)); + return true; + } + // Если нажата клавиша или активная область, то задержки надо проскачить + bool keyboard = isKeyDown(); + if (!keyboard) + { + // Задержка общей скорости моделирования + // Это mode == RunTimeMode::JUMP || mode == RunTimeMode::SYNC + if (m_mode != RunTimeMode::MAX_SPEED && m_next_delay_count) + { + ++m_next_delay_current; + if (m_next_delay_current < m_next_delay_count) return true; + m_next_delay_current = 0; + } + // Задержка синхронной скорости моделирования (длительность операций) + // Тут не надо проверять mode == RunTimeMode::SYNC, т.к. это уже заложено в msec_wait, + // который сбрасывается в setMode и не изменяется далее. + if (m_msec_wait > 1) + { + boost::posix_time::ptime systime_current = boost::posix_time::microsec_clock::local_time(); + std::size_t msec_curr = getMSec(systime_current); + std::size_t msec_delta; + // Милисекунды считаются с учетом часов, но при смене суток часы сбрасываются на ноль, + // и текущее время в милисекундах становится меньше предыдущего. Учитываем этот момент + // через ветку ELSE. Теперь система сможет учесть переход на один день вперед между + // двумя соседники моментами времени, но не сможет учесть на два и более дня. Это + // является маразматической ситуаций (ждать слудующего события два дня), но запросто + // может потребоваться в системе мониторинга реального времени, которая работает в + // автоматическом режиме, обрабатывая информацию с контроллеров. РДО это делать не умеет. + // Как решение - отказ от синхронной работы в таких системах, и учет только скорости, или + // переход на работу с календарем дней, месяцев и лет. SYSTEMTIME содержит такую информацию. + if (msec_curr >= m_msec_prev) + { + msec_delta = msec_curr - m_msec_prev; + } + else + { + msec_delta = UINT_MAX - m_msec_prev + msec_curr; + } + if (msec_delta <= m_msec_wait) return true; + m_msec_wait -= msec_delta; + } + } + // Окончание моделирования - сработало событие конца + if (endCondition()) + { + onEndCondition(); + return false; + } + if (m_currentTime != m_nextTime) + { + m_currentTime = m_nextTime; + onNewTimeNow(); + } + // Выполнение операции + if (doOperation()) + { + if (breakPoints()) + { + setMode(RunTimeMode::BREAKPOINT); + } + return true; + } + else + { + // Переход к следующей операции + if (!m_timePoints.empty()) + { + BOPlannedMap::iterator begin = m_timePoints.begin(); + double newTime = begin->first; + const BOPlannedList& list = begin->second; + if (list.empty()) + { + m_timePoints.erase(begin); + } + if (m_currentTime > newTime) + { + newTime = m_currentTime; + } + if (m_mode == RunTimeMode::SYNC) + { + m_msec_wait += (newTime - m_nextTime) * 3600.0 * 1000.0 / m_showRate; + if (m_msec_wait > 0) + { + if (newTime != m_startTime) + { + if (m_speed > DBL_MIN) + { + m_msec_wait = m_msec_wait / m_speed; + } + else + { + m_msec_wait = m_msec_wait / DBL_MIN; + } + boost::posix_time::ptime systime_current = boost::posix_time::microsec_clock::local_time(); + m_msec_prev = getMSec(systime_current); + } + else + { + m_msec_wait = 0; + } + } + } + m_nextTime = newTime; + return true; + } + else + { + // Окончание моделирования - нет больше событий + onNothingMoreToDo(); + return false; + } + } } void RDOSimulatorBase::setMode(RunTimeMode _mode) { - if (m_mode == RTM_Pause) - { - // Чтобы сразу перейти к следующей операции после паузы и чтобы 'не бегало' - m_next_delay_current = m_next_delay_count; - m_msec_wait = 0; - } - m_mode = _mode; - if (m_mode == RTM_MaxSpeed || m_mode == RTM_Jump) - { - // Чтобы сразу перейти к следующей операции - m_next_delay_current = m_next_delay_count; - m_msec_wait = 0; - } + if (m_mode == RunTimeMode::PAUSE) + { + // Чтобы сразу перейти к следующей операции после паузы и чтобы 'не бегало' + m_next_delay_current = m_next_delay_count; + m_msec_wait = 0; + } + m_mode = _mode; + if (m_mode == RunTimeMode::MAX_SPEED || m_mode == RunTimeMode::JUMP) + { + // Чтобы сразу перейти к следующей операции + m_next_delay_current = m_next_delay_count; + m_msec_wait = 0; + } } void RDOSimulatorBase::setSpeed( double value ) { - if (value < 0) value = 0; - if (value > 1) value = 1; - m_speed = value; - m_next_delay_count = (std::size_t)((1 - m_speed) * m_speed_range_max); - // Чтобы сразу перейти к следующей операции - m_next_delay_current = m_next_delay_count; - m_msec_wait = 0; + if (value < 0) value = 0; + if (value > 1) value = 1; + m_speed = value; + m_next_delay_count = (std::size_t)((1 - m_speed) * m_speed_range_max); + // Чтобы сразу перейти к следующей операции + m_next_delay_current = m_next_delay_count; + m_msec_wait = 0; } void RDOSimulatorBase::setShowRate( double value ) { - if (value < DBL_MIN) value = DBL_MIN; - if (value > DBL_MAX) value = DBL_MAX; - m_showRate = value; - // Чтобы сразу перейти к следующей операции - m_next_delay_current = m_next_delay_count; - m_msec_wait = 0; + if (value < DBL_MIN) value = DBL_MIN; + if (value > DBL_MAX) value = DBL_MAX; + m_showRate = value; + // Чтобы сразу перейти к следующей операции + m_next_delay_current = m_next_delay_count; + m_msec_wait = 0; } void RDOSimulatorBase::rdoPostProcess() { - postProcess(); - m_timePoints.clear(); + postProcess(); + m_timePoints.clear(); } void RDOSimulatorBase::addTimePoint(double timePoint, const LPIBaseOperation& eventID, const EventFunction& eventFunction) { - ASSERT(eventID); - m_timePoints[timePoint].push_back(std::make_pair(eventID, eventFunction)); + ASSERT(eventID); + m_timePoints[timePoint].push_back(std::make_pair(eventID, eventFunction)); } void RDOSimulatorBase::removeTimePoint(const LPIBaseOperation& eventID) { - BOPlannedMap::iterator it = m_timePoints.begin(); - while (it != m_timePoints.end()) - { - BOPlannedList& list = it->second; - BOPlannedList::iterator item = list.begin(); - while (item != list.end()) - { - // Удалим операцию из списка запланированных - if (item->first == eventID) - { - item = list.erase(item); - continue; - } - ++item; - } - // Если список запланированых пустой, то удалим и его - if (list.empty()) - { - m_timePoints.erase(it++); - continue; - } - else - { - ++it; - } - } + BOPlannedMap::iterator it = m_timePoints.begin(); + while (it != m_timePoints.end()) + { + BOPlannedList& list = it->second; + BOPlannedList::iterator item = list.begin(); + while (item != list.end()) + { + // Удалим операцию из списка запланированных + if (item->first == eventID) + { + item = list.erase(item); + continue; + } + ++item; + } + // Если список запланированых пустой, то удалим и его + if (list.empty()) + { + m_timePoints.erase(it++); + continue; + } + else + { + ++it; + } + } } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdobase.h b/simulator/runtime/rdobase.h index 72bfee433..d2c603d1b 100644 --- a/simulator/runtime/rdobase.h +++ b/simulator/runtime/rdobase.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_BASE_H_ -#define _LIB_RUNTIME_BASE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -13,11 +12,7 @@ #include "simulator/runtime/mode.h" #include "simulator/runtime/rdo.h" #ifdef COMPILER_VISUAL_STUDIO - #ifdef RDO_MT - #include - #else - #include - #endif + #include #endif // COMPILER_VISUAL_STUDIO // -------------------------------------------------------------------------------- @@ -28,110 +23,101 @@ class RDOSimulatorBase: public rdo::counter_reference { DECLARE_FACTORY(RDOSimulatorBase) public: - // Публичные методы управления симулятором - virtual void rdoInit(); - virtual bool rdoNext(); - virtual void rdoPostProcess(); + // Публичные методы управления симулятором + virtual void rdoInit(); + virtual bool rdoNext(); + virtual void rdoPostProcess(); - void setStartTime (double value); - double getCurrentTime() const; + void setStartTime (double value); + double getCurrentTime() const; - RunTimeMode getMode() const; - void setMode(RunTimeMode _mode); + RunTimeMode getMode() const; + void setMode(RunTimeMode _mode); - double getSpeed() const; - void setSpeed(double persent); + double getSpeed() const; + void setSpeed(double persent); - double getShowRate() const; - void setShowRate(double value); + double getShowRate() const; + void setShowRate(double value); - typedef boost::function EventFunction; - void addTimePoint (double timePoint, const LPIBaseOperation& eventID, const EventFunction& eventFunction); - void removeTimePoint(const LPIBaseOperation& eventID); + typedef boost::function EventFunction; + void addTimePoint (double timePoint, const LPIBaseOperation& eventID, const EventFunction& eventFunction); + void removeTimePoint(const LPIBaseOperation& eventID); - void inc_cnt_events(); - void inc_cnt_choice_from(); + void inc_cnt_events(); + void inc_cnt_choice_from(); - std::size_t get_cnt_events(); - std::size_t get_cnt_choice_from(); - std::size_t get_cnt_calc_arithm() const; - std::size_t get_cnt_calc_logic() const; + std::size_t get_cnt_events(); + std::size_t get_cnt_choice_from(); + std::size_t get_cnt_calc_arithm() const; + std::size_t get_cnt_calc_logic() const; - static std::size_t getMSec(const boost::posix_time::ptime& ptime); + static std::size_t getMSec(const boost::posix_time::ptime& ptime); protected: - RDOSimulatorBase(); - virtual ~RDOSimulatorBase(); + RDOSimulatorBase(); + virtual ~RDOSimulatorBase(); - typedef std::pair BOPlannedItem; - typedef std::list BOPlannedList; - typedef std::map BOPlannedMap; + typedef std::pair BOPlannedItem; + typedef std::list BOPlannedList; + typedef std::map BOPlannedMap; - BOPlannedMap m_timePoints; - bool m_checkOperation; + BOPlannedMap m_timePoints; + bool m_checkOperation; - void setCurrentTime(double value); + void setCurrentTime(double value); - // Выполнение любых операций (паттерны, DPT и процессы) - // Если вернулось значение true, то необходимо вызвать doOperation - // и в следующий раз/ без перевода модельного времени вперед - virtual bool doOperation() = 0; + // Выполнение любых операций (паттерны, DPT и процессы) + // Если вернулось значение true, то необходимо вызвать doOperation + // и в следующий раз без перевода модельного времени вперед + virtual bool doOperation() = 0; - //! Проверка на условие конца моделирования - virtual bool endCondition() = 0; + // Проверка на условие конца моделирования + virtual bool endCondition() = 0; - //! Проверка на точки останова - virtual bool breakPoints() = 0; + // Проверка на точки останова + virtual bool breakPoints() = 0; - //! Инициализация симулятора - virtual void onInit() = 0; + virtual void onInit() = 0; + virtual void onDestroy() = 0; - //! Очистка симулятора - virtual void onDestroy() = 0; + // Различные функции конца моделирования + // Вызывется, если нет больше событий + virtual void onNothingMoreToDo() = 0; + // Вызывется, если сработало условие конца моделирования + virtual void onEndCondition() = 0; + // Вызывется, tесли возникла ошибка прогона + virtual void onRuntimeError() = 0; + // Вызывается, если модель остановлена пользователем + virtual void onUserBreak() = 0; - // Различные функции конца моделирования - // Вызывется, если нет больше событий - virtual void onNothingMoreToDo() = 0; - // Вызывется, если сработало условие конца моделирования - virtual void onEndCondition() = 0; - // Вызывется, tесли возникла ошибка прогона - virtual void onRuntimeError() = 0; - // Вызывается, если модель остановлена пользователем - virtual void onUserBreak() = 0; + virtual void preProcess() = 0; + virtual void postProcess() = 0; - // Вызывается в самом начале прогона - virtual void preProcess() = 0; - // Вызывается непосредвтсенно перед окончанием прогона - virtual void postProcess() = 0; + virtual bool isKeyDown() const = 0; - // Проверка на нажатие клавиши или активной области - virtual bool isKeyDown() const = 0; - - /// @todo не ошибочная ли это реализация по умолчанию? - // Вызывается при увеличении модельного времени - virtual void onNewTimeNow(); + // TODO не ошибочная ли это реализация по умолчанию? + // Вызывается при увеличении модельного времени + virtual void onNewTimeNow(); private: - double m_startTime; - double m_currentTime; - double m_nextTime; - + double m_startTime; + double m_currentTime; + double m_nextTime; - RunTimeMode m_mode; + RunTimeMode m_mode; - double m_speed; - std::size_t m_speed_range_max; - std::size_t m_next_delay_count; - std::size_t m_next_delay_current; + double m_speed; + std::size_t m_speed_range_max; + std::size_t m_next_delay_count; + std::size_t m_next_delay_current; - double m_showRate; - double m_msec_wait; - std::size_t m_msec_prev; + double m_showRate; + double m_msec_wait; + std::size_t m_msec_prev; - std::size_t m_cnt_events; - std::size_t m_cnt_choice_from; + std::size_t m_cnt_events; + std::size_t m_cnt_choice_from; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_BASE_H_ diff --git a/simulator/runtime/rdodptrtime.cpp b/simulator/runtime/rdodptrtime.cpp index 0acd64ae9..23a28b1db 100644 --- a/simulator/runtime/rdodptrtime.cpp +++ b/simulator/runtime/rdodptrtime.cpp @@ -10,35 +10,35 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- // -------------------- RDODPTSearchRuntime // -------------------------------------------------------------------------------- -RDODPTSearchRuntime::RDODPTSearchRuntime(const LPRDORuntime& pRuntime, LPIBaseOperationContainer parent, const LPRDOCalc& _pCondition, const LPRDOCalc& _pTermCondition, const LPRDOCalc& _pEvaluateBy, bool _compTops, RDODPTSearchTrace::DPT_TraceFlag _traceFlag) - : RDODPTSearchTrace(pRuntime, parent) - , pCondition (_pCondition ) - , pTermCondition (_pTermCondition ) - , pEvaluateBy (_pEvaluateBy ) - , compTops (_compTops ) +RDODPTSearchRuntime::RDODPTSearchRuntime(const LPRDORuntime& pRuntime, LPIBaseOperationContainer parent, const LPRDOCalc& _pCondition, const LPRDOCalc& _pTermCondition, const LPRDOCalc& _pEvaluateBy, bool _compTops, RDODPTSearchTrace::TraceFlag _traceFlag) + : RDODPTSearchTrace(pRuntime, parent) + , pCondition (_pCondition ) + , pTermCondition (_pTermCondition ) + , pEvaluateBy (_pEvaluateBy ) + , compTops (_compTops ) { - setTraceID(pRuntime->getFreeDPTId()); - traceFlag = _traceFlag; + setTraceID(pRuntime->getFreeDPTId()); + traceFlag = _traceFlag; } bool RDODPTSearchRuntime::onCheckCondition(const LPRDORuntime& pRuntime) { - return pCondition->calcValue(pRuntime).getAsBool(); + return pCondition->calcValue(pRuntime).getAsBool(); } bool RDODPTSearchRuntime::TermCondition(const LPRDORuntime& pRuntime) { - return pTermCondition->calcValue(pRuntime).getAsBool(); + return pTermCondition->calcValue(pRuntime).getAsBool(); } double RDODPTSearchRuntime::EvaluateBy(const LPRDORuntime& pRuntime) { - return pEvaluateBy->calcValue(pRuntime).getDouble(); + return pEvaluateBy->calcValue(pRuntime).getDouble(); } bool RDODPTSearchRuntime::NeedCompareTops() { - return compTops; + return compTops; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdodptrtime.h b/simulator/runtime/rdodptrtime.h index 3678e6bc1..97ad26d3c 100644 --- a/simulator/runtime/rdodptrtime.h +++ b/simulator/runtime/rdodptrtime.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_DPTRTIME_H_ -#define _LIB_RUNTIME_DPTRTIME_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -16,19 +15,17 @@ class RDODPTSearchRuntime: public RDODPTSearchTrace DECLARE_FACTORY(RDODPTSearchRuntime); private: - RDODPTSearchRuntime(const LPRDORuntime& pRuntime, LPIBaseOperationContainer parent, const LPRDOCalc& _pCondition, const LPRDOCalc& _pTermCondition, const LPRDOCalc& _pEvaluateBy, bool _compTops, RDODPTSearchTrace::DPT_TraceFlag _traceFlag); + RDODPTSearchRuntime(const LPRDORuntime& pRuntime, LPIBaseOperationContainer parent, const LPRDOCalc& _pCondition, const LPRDOCalc& _pTermCondition, const LPRDOCalc& _pEvaluateBy, bool _compTops, RDODPTSearchTrace::TraceFlag _traceFlag); - LPRDOCalc pCondition; - LPRDOCalc pTermCondition; - LPRDOCalc pEvaluateBy; - bool compTops; + LPRDOCalc pCondition; + LPRDOCalc pTermCondition; + LPRDOCalc pEvaluateBy; + bool compTops; - virtual bool onCheckCondition(const LPRDORuntime& pRuntime); - virtual bool TermCondition(const LPRDORuntime& pRuntime); - virtual double EvaluateBy(const LPRDORuntime& pRuntime); - virtual bool NeedCompareTops(); + virtual bool onCheckCondition(const LPRDORuntime& pRuntime); + virtual bool TermCondition(const LPRDORuntime& pRuntime); + virtual double EvaluateBy(const LPRDORuntime& pRuntime); + virtual bool NeedCompareTops(); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_DPTRTIME_H_ diff --git a/simulator/runtime/rdoframe.cpp b/simulator/runtime/rdoframe.cpp index 95f0345a2..2fc958176 100644 --- a/simulator/runtime/rdoframe.cpp +++ b/simulator/runtime/rdoframe.cpp @@ -26,33 +26,33 @@ IRDOFRMItemGetBitmap::~IRDOFRMItemGetBitmap() // -------------------------------------------------------------------------------- // -------------------- RDOFRMColor // -------------------------------------------------------------------------------- -RDOFRMSprite::RDOFRMColor::RDOFRMColor(ColorType type) - : m_type(type) +RDOFRMSprite::RDOFRMColor::RDOFRMColor(Type type) + : m_type(type) {} RDOFRMSprite::RDOFRMColor::RDOFRMColor(unsigned char red, unsigned char green, unsigned char blue, const RDOSrcInfo& srcInfo) - : m_type(CT_RGB) + : m_type(Type::RGB) { - m_pRedCalc = rdo::Factory::create((int)red); - m_pGreenCalc = rdo::Factory::create((int)green); - m_pBlueCalc = rdo::Factory::create((int)blue); - ASSERT(m_pRedCalc ); - ASSERT(m_pGreenCalc); - ASSERT(m_pBlueCalc ); - m_pRedCalc ->setSrcInfo(srcInfo); - m_pGreenCalc->setSrcInfo(srcInfo); - m_pBlueCalc ->setSrcInfo(srcInfo); + m_pRedCalc = rdo::Factory::create((int)red); + m_pGreenCalc = rdo::Factory::create((int)green); + m_pBlueCalc = rdo::Factory::create((int)blue); + ASSERT(m_pRedCalc ); + ASSERT(m_pGreenCalc); + ASSERT(m_pBlueCalc ); + m_pRedCalc ->setSrcInfo(srcInfo); + m_pGreenCalc->setSrcInfo(srcInfo); + m_pBlueCalc ->setSrcInfo(srcInfo); } RDOFRMSprite::RDOFRMColor::RDOFRMColor(const LPRDOCalc& pRedCalc, const LPRDOCalc& pGreenCalc, const LPRDOCalc& pBlueCalc) - : m_type (CT_RGB ) - , m_pRedCalc (pRedCalc ) - , m_pGreenCalc(pGreenCalc) - , m_pBlueCalc (pBlueCalc ) + : m_type (Type::RGB ) + , m_pRedCalc (pRedCalc ) + , m_pGreenCalc(pGreenCalc) + , m_pBlueCalc (pBlueCalc ) { - ASSERT(m_pRedCalc ); - ASSERT(m_pGreenCalc); - ASSERT(m_pBlueCalc ); + ASSERT(m_pRedCalc ); + ASSERT(m_pGreenCalc); + ASSERT(m_pBlueCalc ); } RDOFRMSprite::RDOFRMColor::~RDOFRMColor() @@ -60,39 +60,39 @@ RDOFRMSprite::RDOFRMColor::~RDOFRMColor() rdo::animation::Color RDOFRMSprite::RDOFRMColor::getColor(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const { - switch (m_type) - { - case CT_NONE : return rdo::animation::Color(50, 200, 50); - case CT_RGB : return rdo::animation::Color - ( - (unsigned char)m_pRedCalc ->calcValue(pRuntime).getUInt(), - (unsigned char)m_pGreenCalc->calcValue(pRuntime).getUInt(), - (unsigned char)m_pBlueCalc ->calcValue(pRuntime).getUInt() - ); - case CT_TRANSPARENT : return rdo::animation::Color(); - case CT_LAST_BG : return pSprite->m_colorLastBg; - case CT_LAST_FG : return pSprite->m_colorLastFg; - case CT_LAST_BG_TEXT: return pSprite->m_colorLastBgText; - case CT_LAST_FG_TEXT: return pSprite->m_colorLastFgText; - default : NEVER_REACH_HERE; - } - return rdo::animation::Color(); + switch (m_type) + { + case Type::NONE : return rdo::animation::Color(50, 200, 50); + case Type::RGB : return rdo::animation::Color + ( + (unsigned char)m_pRedCalc ->calcValue(pRuntime).getUInt(), + (unsigned char)m_pGreenCalc->calcValue(pRuntime).getUInt(), + (unsigned char)m_pBlueCalc ->calcValue(pRuntime).getUInt() + ); + case Type::TRANSPARENT_COLOR : return rdo::animation::Color(); + case Type::LAST_BG : return pSprite->m_colorLastBg; + case Type::LAST_FG : return pSprite->m_colorLastFg; + case Type::LAST_BG_TEXT: return pSprite->m_colorLastBgText; + case Type::LAST_FG_TEXT: return pSprite->m_colorLastFgText; + default : NEVER_REACH_HERE; + } + return rdo::animation::Color(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMSprite // -------------------------------------------------------------------------------- RDOFRMSprite::RDOFRMSprite(const RDOSrcInfo& srcInfo) - : RDOSrcInfo (srcInfo) - , m_lastX (0 ) - , m_lastY (0 ) - , m_lastWidth (0 ) - , m_lastHeight(0 ) + : RDOSrcInfo (srcInfo) + , m_lastX (0 ) + , m_lastY (0 ) + , m_lastWidth (0 ) + , m_lastHeight(0 ) { - m_colorLastBg = rdo::animation::Color(50, 200, 50); - m_colorLastFg = m_colorLastBg; - m_colorLastBgText = m_colorLastBg; - m_colorLastFgText = m_colorLastBg; + m_colorLastBg = rdo::animation::Color(50, 200, 50); + m_colorLastFg = m_colorLastBg; + m_colorLastBgText = m_colorLastBg; + m_colorLastFgText = m_colorLastBg; } RDOFRMSprite::~RDOFRMSprite() @@ -100,283 +100,283 @@ RDOFRMSprite::~RDOFRMSprite() const std::string& RDOFRMSprite::name() const { - return src_text(); + return src_text(); } void RDOFRMSprite::setLastXYWH(double x, double y, double width, double height) { - setLastXY(x ,y); - m_lastWidth = width; - m_lastHeight = height; + setLastXY(x ,y); + m_lastWidth = width; + m_lastHeight = height; } void RDOFRMSprite::setLastXY(double x, double y) { - m_lastX = x; - m_lastY = y; + m_lastX = x; + m_lastY = y; } int RDOFRMSprite::getRuletX(const LPRDORuntime& pRuntime, std::size_t ruletID) const { - LPRDOFRMRulet pRulet = findRulet(ruletID); - return pRulet ? pRulet->getX()->getCalc()->calcValue(pRuntime).getInt() : 0; + LPRDOFRMRulet pRulet = findRulet(ruletID); + return pRulet ? pRulet->getX()->getCalc()->calcValue(pRuntime).getInt() : 0; } int RDOFRMSprite::getRuletY(const LPRDORuntime& pRuntime, std::size_t ruletID) const { - LPRDOFRMRulet pRulet = findRulet(ruletID); - return pRulet ? pRulet->getY()->getCalc()->calcValue(pRuntime).getInt() : 0; + LPRDOFRMRulet pRulet = findRulet(ruletID); + return pRulet ? pRulet->getY()->getCalc()->calcValue(pRuntime).getInt() : 0; } RDOFRMSprite::LPRDOFRMRulet RDOFRMSprite::findRulet(std::size_t ruletID) const { - RuletList::const_iterator it = m_ruletList.find(ruletID); - return it != m_ruletList.end() ? it->second : LPRDOFRMRulet(NULL); + RuletList::const_iterator it = m_ruletList.find(ruletID); + return it != m_ruletList.end() ? it->second : LPRDOFRMRulet(NULL); } RDOValue RDOFRMSprite::prepareFrame(const LPRDORuntime& pRuntime) { - return RDOFRMSprite::doCalc(pRuntime); + return RDOFRMSprite::doCalc(pRuntime); } RDOValue RDOFRMSprite::doCalc(const LPRDORuntime& pRuntime) { - m_lastX = 0; - m_lastY = 0; - m_lastWidth = 0; - m_lastHeight = 0; + m_lastX = 0; + m_lastY = 0; + m_lastWidth = 0; + m_lastHeight = 0; - m_pSpriteCalc->calcValue(pRuntime); + m_pSpriteCalc->calcValue(pRuntime); #ifdef MODEL_DOROGA_HACK - RDORuntime::ResCIterator end = pRuntime->res_end(); - for (RDORuntime::ResCIterator it = pRuntime->res_begin(); it != end; ++it) - { - if (*it && (*it)->checkType(1)) - { - rdo::animation::Point point((*it)->getParam(0).getInt(), (*it)->getParam(1).getInt()); - rdo::animation::Size size; - if ((*it)->getParam(5).getInt() == 1 || (*it)->getParam(5).getInt() == 3) - { - size.m_width = (*it)->getParam(8).getInt(); - size.m_height = (*it)->getParam(9).getInt(); - } - else - { - size.m_width = (*it)->getParam(9).getInt(); - size.m_height = (*it)->getParam(8).getInt(); - } - point.m_x -= size.m_width / 2; - point.m_y -= size.m_height / 2; - - const std::size_t colorRuint = (*it)->getParam(7).getUInt(); - rdo::animation::Color color(GetBValue(colorRuint), GetGValue(colorRuint), GetRValue(colorRuint)); - - rdo::animation::FrameItem* pRect = new rdo::animation::RectElement( - rdo::animation::BoundedElement(point, size), - rdo::animation::ColoredElement(color, color) - ); - pFrame->m_elements.push_back(pRect); - } - } + RDORuntime::ResCIterator end = pRuntime->res_end(); + for (RDORuntime::ResCIterator it = pRuntime->res_begin(); it != end; ++it) + { + if (*it && (*it)->checkType(1)) + { + rdo::animation::Point point((*it)->getParam(0).getInt(), (*it)->getParam(1).getInt()); + rdo::animation::Size size; + if ((*it)->getParam(5).getInt() == 1 || (*it)->getParam(5).getInt() == 3) + { + size.m_width = (*it)->getParam(8).getInt(); + size.m_height = (*it)->getParam(9).getInt(); + } + else + { + size.m_width = (*it)->getParam(9).getInt(); + size.m_height = (*it)->getParam(8).getInt(); + } + point.m_x -= size.m_width / 2; + point.m_y -= size.m_height / 2; + + const std::size_t colorRuint = (*it)->getParam(7).getUInt(); + rdo::animation::Color color(GetBValue(colorRuint), GetGValue(colorRuint), GetRValue(colorRuint)); + + rdo::animation::FrameItem* pRect = new rdo::animation::RectElement( + rdo::animation::BoundedElement(point, size), + rdo::animation::ColoredElement(color, color) + ); + pFrame->m_elements.push_back(pRect); + } + } #endif // MODEL_DOROGA_HACK - return RDOValue(); + return RDOValue(); } void RDOFRMSprite::getBitmaps(IRDOFRMItemGetBitmap::ImageNameList& list) const { - for (const LPIRDOFRMItemGetBitmap& pGetBitmap: m_getBitmapList) - { - pGetBitmap->getBitmaps(list); - } + for (const LPIRDOFRMItemGetBitmap& pGetBitmap: m_getBitmapList) + { + pGetBitmap->getBitmaps(list); + } } -void RDOFRMSprite::setColorLastBG(RDOFRMColor::ColorType type, const rdo::animation::Color& lastBg) +void RDOFRMSprite::setColorLastBG(RDOFRMColor::Type type, const rdo::animation::Color& lastBg) { - if (type == RDOFRMColor::CT_RGB) - { - m_colorLastBg = lastBg; - } + if (type == RDOFRMColor::Type::RGB) + { + m_colorLastBg = lastBg; + } } -void RDOFRMSprite::setColorLastFG(RDOFRMColor::ColorType type, const rdo::animation::Color& lastFg) +void RDOFRMSprite::setColorLastFG(RDOFRMColor::Type type, const rdo::animation::Color& lastFg) { - if (type == RDOFRMColor::CT_RGB) - { - m_colorLastFg = lastFg; - } + if (type == RDOFRMColor::Type::RGB) + { + m_colorLastFg = lastFg; + } } -void RDOFRMSprite::setColorLastBGText(RDOFRMColor::ColorType type, const rdo::animation::Color& lastBgText) +void RDOFRMSprite::setColorLastBGText(RDOFRMColor::Type type, const rdo::animation::Color& lastBgText) { - if (type == RDOFRMColor::CT_RGB) - { - m_colorLastBgText = lastBgText; - } + if (type == RDOFRMColor::Type::RGB) + { + m_colorLastBgText = lastBgText; + } } -void RDOFRMSprite::setColorLastFGText(RDOFRMColor::ColorType type, const rdo::animation::Color& lastFgText) +void RDOFRMSprite::setColorLastFGText(RDOFRMColor::Type type, const rdo::animation::Color& lastFgText) { - if (type == RDOFRMColor::CT_RGB) - { - m_colorLastFgText = lastFgText; - } + if (type == RDOFRMColor::Type::RGB) + { + m_colorLastFgText = lastFgText; + } } void RDOFRMSprite::insertItem(const LPRDOCalc& pItem) { - LPRDOCalcFunctionCaller pFunctionCaller = pItem.object_dynamic_cast(); - if (pFunctionCaller) - { - LPRDOFRMSprite pSprite = pFunctionCaller->function().object_dynamic_cast(); - if (pSprite) - { - LPIRDOFRMItemGetBitmap pGetBitmap = pSprite.interface_dynamic_cast(); - if (pGetBitmap) - { - insertGetBitmap(pGetBitmap); - } - } - } - - LPIRDOFRMItemGetBitmap pGetBitmap = pItem.interface_dynamic_cast(); - if (pGetBitmap) - { - insertGetBitmap(pGetBitmap); - } - - LPRDOFRMRulet pRulet = pItem.object_dynamic_cast(); - if (pRulet) - { - insertRulet(pRulet); - } + LPRDOCalcFunctionCaller pFunctionCaller = pItem.object_dynamic_cast(); + if (pFunctionCaller) + { + LPRDOFRMSprite pSprite = pFunctionCaller->function().object_dynamic_cast(); + if (pSprite) + { + LPIRDOFRMItemGetBitmap pGetBitmap = pSprite.interface_dynamic_cast(); + if (pGetBitmap) + { + insertGetBitmap(pGetBitmap); + } + } + } + + LPIRDOFRMItemGetBitmap pGetBitmap = pItem.interface_dynamic_cast(); + if (pGetBitmap) + { + insertGetBitmap(pGetBitmap); + } + + LPRDOFRMRulet pRulet = pItem.object_dynamic_cast(); + if (pRulet) + { + insertRulet(pRulet); + } } void RDOFRMSprite::setSpriteCalc(const LPRDOCalc& pSpriteCalc) { - ASSERT(pSpriteCalc); - ASSERT(!m_pSpriteCalc); + ASSERT(pSpriteCalc); + ASSERT(!m_pSpriteCalc); - LPRDOCalcReturnCatch pCalcReturnCatch = rdo::Factory::create(); - ASSERT(pCalcReturnCatch); - pCalcReturnCatch->setTryCalc(pSpriteCalc); + LPRDOCalcReturnCatch pCalcReturnCatch = rdo::Factory::create(); + ASSERT(pCalcReturnCatch); + pCalcReturnCatch->setTryCalc(pSpriteCalc); - m_pSpriteCalc = pCalcReturnCatch; + m_pSpriteCalc = pCalcReturnCatch; } void RDOFRMSprite::insertGetBitmap(const LPIRDOFRMItemGetBitmap& pGetBitmap) { - ASSERT(pGetBitmap); - m_getBitmapList.push_back(pGetBitmap); + ASSERT(pGetBitmap); + m_getBitmapList.push_back(pGetBitmap); } void RDOFRMSprite::insertRulet(const LPRDOFRMRulet& pRulet) { - ASSERT(pRulet); - std::pair result = - m_ruletList.insert(RuletList::value_type(pRulet->getIndex(), pRulet)); - ASSERT(result.second); - (void)result; + ASSERT(pRulet); + std::pair result = + m_ruletList.insert(RuletList::value_type(pRulet->getIndex(), pRulet)); + ASSERT(result.second); + (void)result; } // -------------------------------------------------------------------------------- // -------------------- RDOFRMSprite::RDOFRMPosition // -------------------------------------------------------------------------------- RDOFRMSprite::RDOFRMPosition::RDOFRMPosition() - : RDORuntimeObject() - , m_type (PT_ABSOLUTE) - , m_ruletID(0 ) + : RDORuntimeObject() + , m_type (Type::ABSOLUTE_POSITION) + , m_ruletID(0 ) {} -RDOFRMSprite::RDOFRMPosition::RDOFRMPosition(const LPRDOCalc& pCalc, PositionType type, int ruletID) - : RDORuntimeObject() - , m_pCalc (pCalc ) - , m_type (type ) - , m_ruletID(ruletID) +RDOFRMSprite::RDOFRMPosition::RDOFRMPosition(const LPRDOCalc& pCalc, Type type, int ruletID) + : RDORuntimeObject() + , m_pCalc (pCalc ) + , m_type (type ) + , m_ruletID(ruletID) {} RDOFRMSprite::RDOFRMPosition::~RDOFRMPosition() {} -RDOFRMSprite::RDOFRMPosition::PositionType RDOFRMSprite::RDOFRMPosition::getType() const +RDOFRMSprite::RDOFRMPosition::Type RDOFRMSprite::RDOFRMPosition::getType() const { - return m_type; + return m_type; } const LPRDOCalc& RDOFRMSprite::RDOFRMPosition::getCalc() const { - return m_pCalc; + return m_pCalc; } int RDOFRMSprite::RDOFRMPosition::getX(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) { - RDOValue res = m_pCalc->calcValue(pRuntime); - switch (m_type) - { - case RDOFRMPosition::PT_DELTA : res += pSprite->m_lastX; break; - case RDOFRMPosition::PT_GABARIT: res += pSprite->m_lastX + pSprite->m_lastWidth; break; - case RDOFRMPosition::PT_MULT : res *= pSprite->m_lastX; break; - case RDOFRMPosition::PT_RULET : res += pSprite->getRuletX(pRuntime, m_ruletID); break; - default : break; - } - return res.getInt(); + RDOValue res = m_pCalc->calcValue(pRuntime); + switch (m_type) + { + case RDOFRMPosition::Type::DELTA : res += pSprite->m_lastX; break; + case RDOFRMPosition::Type::GABARIT: res += pSprite->m_lastX + pSprite->m_lastWidth; break; + case RDOFRMPosition::Type::MULT : res *= pSprite->m_lastX; break; + case RDOFRMPosition::Type::RULET : res += pSprite->getRuletX(pRuntime, m_ruletID); break; + default : break; + } + return res.getInt(); } int RDOFRMSprite::RDOFRMPosition::getY(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) { - RDOValue res = m_pCalc->calcValue(pRuntime); - switch (m_type) - { - case RDOFRMPosition::PT_DELTA : res += pSprite->m_lastY; break; - case RDOFRMPosition::PT_GABARIT: res += pSprite->m_lastY + pSprite->m_lastHeight; break; - case RDOFRMPosition::PT_MULT : res *= pSprite->m_lastY; break; - case RDOFRMPosition::PT_RULET : res += pSprite->getRuletY(pRuntime, m_ruletID); break; - default : break; - } - return res.getInt(); + RDOValue res = m_pCalc->calcValue(pRuntime); + switch (m_type) + { + case RDOFRMPosition::Type::DELTA : res += pSprite->m_lastY; break; + case RDOFRMPosition::Type::GABARIT: res += pSprite->m_lastY + pSprite->m_lastHeight; break; + case RDOFRMPosition::Type::MULT : res *= pSprite->m_lastY; break; + case RDOFRMPosition::Type::RULET : res += pSprite->getRuletY(pRuntime, m_ruletID); break; + default : break; + } + return res.getInt(); } int RDOFRMSprite::RDOFRMPosition::getWidth(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) { - RDOValue res = m_pCalc->calcValue(pRuntime); - switch (m_type) - { - case RDOFRMPosition::PT_DELTA: res += pSprite->m_lastWidth; break; - case RDOFRMPosition::PT_MULT : res *= pSprite->m_lastWidth; break; - case RDOFRMPosition::PT_RULET: res += pSprite->getRuletX(pRuntime, m_ruletID); break; - default : break; - } - return res.getInt(); + RDOValue res = m_pCalc->calcValue(pRuntime); + switch (m_type) + { + case RDOFRMPosition::Type::DELTA: res += pSprite->m_lastWidth; break; + case RDOFRMPosition::Type::MULT : res *= pSprite->m_lastWidth; break; + case RDOFRMPosition::Type::RULET: res += pSprite->getRuletX(pRuntime, m_ruletID); break; + default : break; + } + return res.getInt(); } int RDOFRMSprite::RDOFRMPosition::getHeight(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) { - RDOValue res = m_pCalc->calcValue(pRuntime); - switch (m_type) - { - case RDOFRMPosition::PT_DELTA: res += pSprite->m_lastHeight; break; - case RDOFRMPosition::PT_MULT : res *= pSprite->m_lastHeight; break; - case RDOFRMPosition::PT_RULET: res += pSprite->getRuletY(pRuntime, m_ruletID); break; - default : break; - } - return res.getInt(); + RDOValue res = m_pCalc->calcValue(pRuntime); + switch (m_type) + { + case RDOFRMPosition::Type::DELTA: res += pSprite->m_lastHeight; break; + case RDOFRMPosition::Type::MULT : res *= pSprite->m_lastHeight; break; + case RDOFRMPosition::Type::RULET: res += pSprite->getRuletY(pRuntime, m_ruletID); break; + default : break; + } + return res.getInt(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMSprite::RDOFRMColor // -------------------------------------------------------------------------------- -RDOFRMSprite::RDOFRMColor::ColorType RDOFRMSprite::RDOFRMColor::getType() const +RDOFRMSprite::RDOFRMColor::Type RDOFRMSprite::RDOFRMColor::getType() const { - return m_type; + return m_type; } -void RDOFRMSprite::RDOFRMColor::setType(ColorType type) +void RDOFRMSprite::RDOFRMColor::setType(Type type) { - if (m_type == CT_NONE) - { - m_type = type; - } + if (m_type == Type::NONE) + { + m_type = type; + } } // -------------------------------------------------------------------------------- @@ -384,25 +384,25 @@ void RDOFRMSprite::RDOFRMColor::setType(ColorType type) // -------------------------------------------------------------------------------- std::size_t RDOFRMSprite::RDOFRMRulet::getIndex() const { - return m_index; + return m_index; } const RDOFRMSprite::LPRDOFRMPosition& RDOFRMSprite::RDOFRMRulet::getX() const { - return m_pX; + return m_pX; } const RDOFRMSprite::LPRDOFRMPosition& RDOFRMSprite::RDOFRMRulet::getY() const { - return m_pY; + return m_pY; } RDOFRMSprite::RDOFRMRulet::RDOFRMRulet(const RDOSrcInfo& src_info, std::size_t index, const LPRDOFRMPosition& pX, const LPRDOFRMPosition& pY) - : m_index(index) - , m_pX (pX ) - , m_pY (pY ) + : m_index(index) + , m_pX (pX ) + , m_pY (pY ) { - setSrcInfo(src_info); + setSrcInfo(src_info); } RDOFRMSprite::RDOFRMRulet::~RDOFRMRulet() @@ -410,22 +410,22 @@ RDOFRMSprite::RDOFRMRulet::~RDOFRMRulet() RDOValue RDOFRMSprite::RDOFRMRulet::doCalc(const LPRDORuntime& /*pRuntime*/) { - return RDOValue(); + return RDOValue(); } const RDOSrcInfo& RDOFRMSprite::RDOFRMRulet::src_info() const { - return srcInfo(); + return srcInfo(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMBoundingItem // -------------------------------------------------------------------------------- RDOFRMBoundingItem::RDOFRMBoundingItem(const RDOFRMSprite::LPRDOFRMPosition& pX, const RDOFRMSprite::LPRDOFRMPosition& pY, const RDOFRMSprite::LPRDOFRMPosition& pWidth, const RDOFRMSprite::LPRDOFRMPosition& pHeight) - : m_pX (pX ) - , m_pY (pY ) - , m_pWidth (pWidth ) - , m_pHeight(pHeight) + : m_pX (pX ) + , m_pY (pY ) + , m_pWidth (pWidth ) + , m_pHeight(pHeight) {} RDOFRMBoundingItem::~RDOFRMBoundingItem() @@ -433,40 +433,40 @@ RDOFRMBoundingItem::~RDOFRMBoundingItem() int RDOFRMBoundingItem::getX(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const { - return m_pX->getX(pRuntime, pSprite); + return m_pX->getX(pRuntime, pSprite); } int RDOFRMBoundingItem::getY(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const { - return m_pY->getY(pRuntime, pSprite); + return m_pY->getY(pRuntime, pSprite); } int RDOFRMBoundingItem::getWidth(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const { - return m_pWidth->getWidth(pRuntime, pSprite); + return m_pWidth->getWidth(pRuntime, pSprite); } int RDOFRMBoundingItem::getHeight(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const { - return m_pHeight->getHeight(pRuntime, pSprite); + return m_pHeight->getHeight(pRuntime, pSprite); } int RDOFRMBoundingItem::getWidthAsX(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const { - return m_pWidth->getX(pRuntime, pSprite); + return m_pWidth->getX(pRuntime, pSprite); } int RDOFRMBoundingItem::getHeightAsY(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const { - return m_pHeight->getY(pRuntime, pSprite); + return m_pHeight->getY(pRuntime, pSprite); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMColoredItem // -------------------------------------------------------------------------------- RDOFRMColoredItem::RDOFRMColoredItem(const RDOFRMSprite::LPRDOFRMColor& pBgColor, const RDOFRMSprite::LPRDOFRMColor& pFgColor) - : m_pBgColor(pBgColor) - , m_pFgColor(pFgColor) + : m_pBgColor(pBgColor) + , m_pFgColor(pFgColor) {} RDOFRMColoredItem::~RDOFRMColoredItem() @@ -474,29 +474,29 @@ RDOFRMColoredItem::~RDOFRMColoredItem() const RDOFRMSprite::LPRDOFRMColor& RDOFRMColoredItem::getBgColor() const { - return m_pBgColor; + return m_pBgColor; } const RDOFRMSprite::LPRDOFRMColor& RDOFRMColoredItem::getFgColor() const { - return m_pFgColor; + return m_pFgColor; } rdo::animation::Color RDOFRMColoredItem::getBg(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const { - return m_pBgColor->getColor(pRuntime, pSprite); + return m_pBgColor->getColor(pRuntime, pSprite); } rdo::animation::Color RDOFRMColoredItem::getFg(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const { - return m_pFgColor->getColor(pRuntime, pSprite); + return m_pFgColor->getColor(pRuntime, pSprite); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMItem // -------------------------------------------------------------------------------- RDOFRMItem::RDOFRMItem(const LPRDOFRMSprite& pSprite) - : m_pFrame(pSprite) + : m_pFrame(pSprite) {} RDOFRMItem::~RDOFRMItem() @@ -504,26 +504,26 @@ RDOFRMItem::~RDOFRMItem() const LPRDOFRMSprite& RDOFRMItem::getFrame() const { - return m_pFrame; + return m_pFrame; } // -------------------------------------------------------------------------------- // -------------------- RDOFRMText // -------------------------------------------------------------------------------- RDOFRMText::RDOFRMText( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight, - const RDOFRMSprite::LPRDOFRMColor& pBgColor, - const RDOFRMSprite::LPRDOFRMColor& pFgColor - ) - : RDOFRMItem (pSprite ) - , RDOFRMBoundingItem(pX, pY, pWidth, pHeight ) - , RDOFRMColoredItem (pBgColor, pFgColor ) - , m_align (rdo::animation::TextElement::TETA_LEFT) - , m_isTextString (true ) + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight, + const RDOFRMSprite::LPRDOFRMColor& pBgColor, + const RDOFRMSprite::LPRDOFRMColor& pFgColor + ) + : RDOFRMItem (pSprite) + , RDOFRMBoundingItem(pX, pY, pWidth, pHeight) + , RDOFRMColoredItem (pBgColor, pFgColor) + , m_align (rdo::animation::TextElement::Align::LEFT) + , m_isTextString (true) {} RDOFRMText::~RDOFRMText() @@ -531,66 +531,66 @@ RDOFRMText::~RDOFRMText() void RDOFRMText::setText(Align align, const LPRDOCalc& pValue) { - m_align = align; - m_pValue = pValue; - m_isTextString = false; + m_align = align; + m_pValue = pValue; + m_isTextString = false; } void RDOFRMText::setText(Align align, const std::string& text) { - m_align = align; - m_text = text; - m_isTextString = true; + m_align = align; + m_text = text; + m_isTextString = true; } RDOValue RDOFRMText::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->memory_insert(sizeof(rdo::animation::TextElement)); - - rdo::animation::Color bg = getBg(pRuntime, getFrame()); - rdo::animation::Color fg = getFg(pRuntime, getFrame()); - getFrame()->setColorLastBGText(getBgColor()->getType(), bg); - getFrame()->setColorLastFGText(getFgColor()->getType(), fg); - - std::string t; - if (m_isTextString) - { - t = m_text; - } - else - { - try - { - t = m_pValue->calcValue(pRuntime).getAsString(); - } - catch (const RDOUndefinedException&) - { - t = "#"; - } - } - - int x = getX (pRuntime, getFrame()); - int y = getY (pRuntime, getFrame()); - int width = getWidth (pRuntime, getFrame()); - int height = getHeight(pRuntime, getFrame()); - getFrame()->setLastXYWH(x, y, width, height); - - pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::TextElement( - rdo::animation::BoundedElement(rdo::animation::Point(x, y), rdo::animation::Size(width, height)), - rdo::animation::ColoredElement(bg, fg), - t, m_align - )); - - return RDOValue(); + pRuntime->memory_insert(sizeof(rdo::animation::TextElement)); + + rdo::animation::Color bg = getBg(pRuntime, getFrame()); + rdo::animation::Color fg = getFg(pRuntime, getFrame()); + getFrame()->setColorLastBGText(getBgColor()->getType(), bg); + getFrame()->setColorLastFGText(getFgColor()->getType(), fg); + + std::string t; + if (m_isTextString) + { + t = m_text; + } + else + { + try + { + t = m_pValue->calcValue(pRuntime).getAsString(); + } + catch (const RDOUndefinedException&) + { + t = "#"; + } + } + + int x = getX (pRuntime, getFrame()); + int y = getY (pRuntime, getFrame()); + int width = getWidth (pRuntime, getFrame()); + int height = getHeight(pRuntime, getFrame()); + getFrame()->setLastXYWH(x, y, width, height); + + pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::TextElement( + rdo::animation::BoundedElement(rdo::animation::Point(x, y), rdo::animation::Size(width, height)), + rdo::animation::ColoredElement(bg, fg), + t, m_align + )); + + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMBitmapBase // -------------------------------------------------------------------------------- RDOFRMBitmapBase::RDOFRMBitmapBase(const LPRDOFRMSprite& pSprite, const std::string& pictFilename, const std::string& maskFilename) - : RDOFRMItem (pSprite ) - , m_pictFilename(pictFilename) - , m_maskFilename(maskFilename) + : RDOFRMItem (pSprite ) + , m_pictFilename(pictFilename) + , m_maskFilename(maskFilename) {} RDOFRMBitmapBase::~RDOFRMBitmapBase() @@ -598,26 +598,26 @@ RDOFRMBitmapBase::~RDOFRMBitmapBase() void RDOFRMBitmapBase::getBitmaps(IRDOFRMItemGetBitmap::ImageNameList& list) const { - list.push_back(m_pictFilename); - if (!m_maskFilename.empty()) - { - list.push_back(m_maskFilename); - } + list.push_back(m_pictFilename); + if (!m_maskFilename.empty()) + { + list.push_back(m_maskFilename); + } } // -------------------------------------------------------------------------------- // -------------------- RDOFRMBitmap // -------------------------------------------------------------------------------- RDOFRMBitmap::RDOFRMBitmap( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const std::string& pictFilename, - const std::string& maskFilename - ) - : RDOFRMBitmapBase(pSprite, pictFilename, maskFilename) - , m_pX (pX) - , m_pY (pY) + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const std::string& pictFilename, + const std::string& maskFilename + ) + : RDOFRMBitmapBase(pSprite, pictFilename, maskFilename) + , m_pX (pX) + , m_pY (pY) {} RDOFRMBitmap::~RDOFRMBitmap() @@ -625,34 +625,34 @@ RDOFRMBitmap::~RDOFRMBitmap() RDOValue RDOFRMBitmap::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->memory_insert(sizeof(rdo::animation::BmpElement)); + pRuntime->memory_insert(sizeof(rdo::animation::BmpElement)); - int x = m_pX->getX(pRuntime, getFrame()); - int y = m_pY->getY(pRuntime, getFrame()); - getFrame()->setLastXYWH(x, y, 0, 0); + int x = m_pX->getX(pRuntime, getFrame()); + int y = m_pY->getY(pRuntime, getFrame()); + getFrame()->setLastXYWH(x, y, 0, 0); - pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::BmpElement( - rdo::animation::Point(x, y), - m_pictFilename, m_maskFilename - )); + pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::BmpElement( + rdo::animation::Point(x, y), + m_pictFilename, m_maskFilename + )); - return RDOValue(); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMBitmapStretch // -------------------------------------------------------------------------------- RDOFRMBitmapStretch::RDOFRMBitmapStretch( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight, - const std::string& pictFilename, - const std::string& maskFilename - ) - : RDOFRMBitmapBase (pSprite, pictFilename, maskFilename) - , RDOFRMBoundingItem(pX, pY, pWidth, pHeight) + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight, + const std::string& pictFilename, + const std::string& maskFilename + ) + : RDOFRMBitmapBase (pSprite, pictFilename, maskFilename) + , RDOFRMBoundingItem(pX, pY, pWidth, pHeight) {} RDOFRMBitmapStretch::~RDOFRMBitmapStretch() @@ -660,37 +660,37 @@ RDOFRMBitmapStretch::~RDOFRMBitmapStretch() RDOValue RDOFRMBitmapStretch::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->memory_insert(sizeof(rdo::animation::ScaledBmpElement)); + pRuntime->memory_insert(sizeof(rdo::animation::ScaledBmpElement)); - int x = getX (pRuntime, getFrame()); - int y = getY (pRuntime, getFrame()); - int width = getWidth (pRuntime, getFrame()); - int height = getHeight(pRuntime, getFrame()); - getFrame()->setLastXYWH(x, y, width, height); + int x = getX (pRuntime, getFrame()); + int y = getY (pRuntime, getFrame()); + int width = getWidth (pRuntime, getFrame()); + int height = getHeight(pRuntime, getFrame()); + getFrame()->setLastXYWH(x, y, width, height); - pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::ScaledBmpElement( - rdo::animation::BoundedElement(rdo::animation::Point(x, y), rdo::animation::Size(width, height)), - m_pictFilename, m_maskFilename - )); + pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::ScaledBmpElement( + rdo::animation::BoundedElement(rdo::animation::Point(x, y), rdo::animation::Size(width, height)), + m_pictFilename, m_maskFilename + )); - return RDOValue(); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMRect // -------------------------------------------------------------------------------- RDOFRMRect::RDOFRMRect( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight, - const RDOFRMSprite::LPRDOFRMColor& pBgColor, - const RDOFRMSprite::LPRDOFRMColor& pFgColor - ) - : RDOFRMItem (pSprite) - , RDOFRMBoundingItem(pX, pY, pWidth, pHeight) - , RDOFRMColoredItem (pBgColor, pFgColor ) + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight, + const RDOFRMSprite::LPRDOFRMColor& pBgColor, + const RDOFRMSprite::LPRDOFRMColor& pFgColor + ) + : RDOFRMItem (pSprite) + , RDOFRMBoundingItem(pX, pY, pWidth, pHeight) + , RDOFRMColoredItem (pBgColor, pFgColor ) {} RDOFRMRect::~RDOFRMRect() @@ -698,41 +698,41 @@ RDOFRMRect::~RDOFRMRect() RDOValue RDOFRMRect::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->memory_insert(sizeof(rdo::animation::RectElement)); + pRuntime->memory_insert(sizeof(rdo::animation::RectElement)); - rdo::animation::Color bg = getBg(pRuntime, getFrame()); - rdo::animation::Color fg = getFg(pRuntime, getFrame()); - getFrame()->setColorLastBG(getBgColor()->getType(), bg); - getFrame()->setColorLastFG(getFgColor()->getType(), fg); - int x = getX (pRuntime, getFrame()); - int y = getY (pRuntime, getFrame()); - int width = getWidth (pRuntime, getFrame()); - int height = getHeight(pRuntime, getFrame()); - getFrame()->setLastXYWH(x, y, width, height); + rdo::animation::Color bg = getBg(pRuntime, getFrame()); + rdo::animation::Color fg = getFg(pRuntime, getFrame()); + getFrame()->setColorLastBG(getBgColor()->getType(), bg); + getFrame()->setColorLastFG(getFgColor()->getType(), fg); + int x = getX (pRuntime, getFrame()); + int y = getY (pRuntime, getFrame()); + int width = getWidth (pRuntime, getFrame()); + int height = getHeight(pRuntime, getFrame()); + getFrame()->setLastXYWH(x, y, width, height); - pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::RectElement( - rdo::animation::BoundedElement(rdo::animation::Point(x, y), rdo::animation::Size(width, height)), - rdo::animation::ColoredElement(bg, fg) - )); + pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::RectElement( + rdo::animation::BoundedElement(rdo::animation::Point(x, y), rdo::animation::Size(width, height)), + rdo::animation::ColoredElement(bg, fg) + )); - return RDOValue(); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMRectRound // -------------------------------------------------------------------------------- RDOFRMRectRound::RDOFRMRectRound( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight, - const RDOFRMSprite::LPRDOFRMColor& pBgColor, - const RDOFRMSprite::LPRDOFRMColor& pFgColor - ) - : RDOFRMItem (pSprite) - , RDOFRMBoundingItem(pX, pY, pWidth, pHeight) - , RDOFRMColoredItem (pBgColor, pFgColor ) + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight, + const RDOFRMSprite::LPRDOFRMColor& pBgColor, + const RDOFRMSprite::LPRDOFRMColor& pFgColor + ) + : RDOFRMItem (pSprite) + , RDOFRMBoundingItem(pX, pY, pWidth, pHeight) + , RDOFRMColoredItem (pBgColor, pFgColor ) {} RDOFRMRectRound::~RDOFRMRectRound() @@ -740,42 +740,42 @@ RDOFRMRectRound::~RDOFRMRectRound() RDOValue RDOFRMRectRound::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->memory_insert(sizeof(rdo::animation::RoundRectElement)); + pRuntime->memory_insert(sizeof(rdo::animation::RoundRectElement)); - rdo::animation::Color bg = getBg(pRuntime, getFrame()); - rdo::animation::Color fg = getFg(pRuntime, getFrame()); - getFrame()->setColorLastBG(getBgColor()->getType(), bg); - getFrame()->setColorLastFG(getFgColor()->getType(), fg); - int x = getX (pRuntime, getFrame()); - int y = getY (pRuntime, getFrame()); - int width = getWidth (pRuntime, getFrame()); - int height = getHeight(pRuntime, getFrame()); - getFrame()->setLastXYWH(x, y, width, height); + rdo::animation::Color bg = getBg(pRuntime, getFrame()); + rdo::animation::Color fg = getFg(pRuntime, getFrame()); + getFrame()->setColorLastBG(getBgColor()->getType(), bg); + getFrame()->setColorLastFG(getFgColor()->getType(), fg); + int x = getX (pRuntime, getFrame()); + int y = getY (pRuntime, getFrame()); + int width = getWidth (pRuntime, getFrame()); + int height = getHeight(pRuntime, getFrame()); + getFrame()->setLastXYWH(x, y, width, height); - pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::RoundRectElement( - rdo::animation::BoundedElement(rdo::animation::Point(x, y), rdo::animation::Size(width, height)), - rdo::animation::ColoredElement(bg, fg) - )); + pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::RoundRectElement( + rdo::animation::BoundedElement(rdo::animation::Point(x, y), rdo::animation::Size(width, height)), + rdo::animation::ColoredElement(bg, fg) + )); - return RDOValue(); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMCircle // -------------------------------------------------------------------------------- RDOFRMCircle::RDOFRMCircle( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pRadius, - const RDOFRMSprite::LPRDOFRMColor& pBgColor, - const RDOFRMSprite::LPRDOFRMColor& pFgColor - ) - : RDOFRMItem (pSprite) - , RDOFRMColoredItem(pBgColor, pFgColor) - , m_pX (pX ) - , m_pY (pY ) - , m_pRadius (pRadius) + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pRadius, + const RDOFRMSprite::LPRDOFRMColor& pBgColor, + const RDOFRMSprite::LPRDOFRMColor& pFgColor + ) + : RDOFRMItem (pSprite) + , RDOFRMColoredItem(pBgColor, pFgColor) + , m_pX (pX ) + , m_pY (pY ) + , m_pRadius (pRadius) {} RDOFRMCircle::~RDOFRMCircle() @@ -783,42 +783,42 @@ RDOFRMCircle::~RDOFRMCircle() RDOValue RDOFRMCircle::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->memory_insert(sizeof(rdo::animation::CircleElement)); + pRuntime->memory_insert(sizeof(rdo::animation::CircleElement)); - rdo::animation::Color bg = getBg(pRuntime, getFrame()); - rdo::animation::Color fg = getFg(pRuntime, getFrame()); - getFrame()->setColorLastBG(getBgColor()->getType(), bg); - getFrame()->setColorLastFG(getFgColor()->getType(), fg); + rdo::animation::Color bg = getBg(pRuntime, getFrame()); + rdo::animation::Color fg = getFg(pRuntime, getFrame()); + getFrame()->setColorLastBG(getBgColor()->getType(), bg); + getFrame()->setColorLastFG(getFgColor()->getType(), fg); - int x = m_pX ->getX(pRuntime, getFrame()); - int y = m_pY ->getY(pRuntime, getFrame()); - int radius = m_pRadius->getX(pRuntime, getFrame()); - getFrame()->setLastXY(x, y); + int x = m_pX ->getX(pRuntime, getFrame()); + int y = m_pY ->getY(pRuntime, getFrame()); + int radius = m_pRadius->getX(pRuntime, getFrame()); + getFrame()->setLastXY(x, y); - pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::CircleElement( - rdo::animation::Point (x ,y), - rdo::animation::Radius(radius), - rdo::animation::ColoredElement(bg, fg) - )); + pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::CircleElement( + rdo::animation::Point (x ,y), + rdo::animation::Radius(radius), + rdo::animation::ColoredElement(bg, fg) + )); - return RDOValue(); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMEllipse // -------------------------------------------------------------------------------- RDOFRMEllipse::RDOFRMEllipse( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight, - const RDOFRMSprite::LPRDOFRMColor& pBgColor, - const RDOFRMSprite::LPRDOFRMColor& pFgColor - ) - : RDOFRMItem (pSprite) - , RDOFRMBoundingItem(pX, pY, pWidth, pHeight) - , RDOFRMColoredItem (pBgColor, pFgColor ) + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight, + const RDOFRMSprite::LPRDOFRMColor& pBgColor, + const RDOFRMSprite::LPRDOFRMColor& pFgColor + ) + : RDOFRMItem (pSprite) + , RDOFRMBoundingItem(pX, pY, pWidth, pHeight) + , RDOFRMColoredItem (pBgColor, pFgColor ) {} RDOFRMEllipse::~RDOFRMEllipse() @@ -826,40 +826,40 @@ RDOFRMEllipse::~RDOFRMEllipse() RDOValue RDOFRMEllipse::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->memory_insert(sizeof(rdo::animation::EllipseElement)); + pRuntime->memory_insert(sizeof(rdo::animation::EllipseElement)); - rdo::animation::Color bg = getBg(pRuntime, getFrame()); - rdo::animation::Color fg = getFg(pRuntime, getFrame()); - getFrame()->setColorLastBG(getBgColor()->getType(), bg); - getFrame()->setColorLastFG(getFgColor()->getType(), fg); - int x = getX (pRuntime, getFrame()); - int y = getY (pRuntime, getFrame()); - int width = getWidth (pRuntime, getFrame()); - int height = getHeight(pRuntime, getFrame()); - getFrame()->setLastXYWH(x, y, width, height); + rdo::animation::Color bg = getBg(pRuntime, getFrame()); + rdo::animation::Color fg = getFg(pRuntime, getFrame()); + getFrame()->setColorLastBG(getBgColor()->getType(), bg); + getFrame()->setColorLastFG(getFgColor()->getType(), fg); + int x = getX (pRuntime, getFrame()); + int y = getY (pRuntime, getFrame()); + int width = getWidth (pRuntime, getFrame()); + int height = getHeight(pRuntime, getFrame()); + getFrame()->setLastXYWH(x, y, width, height); - pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::EllipseElement( - rdo::animation::BoundedElement(rdo::animation::Point(x, y), rdo::animation::Size(width, height)), - rdo::animation::ColoredElement(bg, fg) - )); + pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::EllipseElement( + rdo::animation::BoundedElement(rdo::animation::Point(x, y), rdo::animation::Size(width, height)), + rdo::animation::ColoredElement(bg, fg) + )); - return RDOValue(); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMLine // -------------------------------------------------------------------------------- RDOFRMLine::RDOFRMLine( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX1, - const RDOFRMSprite::LPRDOFRMPosition& pY1, - const RDOFRMSprite::LPRDOFRMPosition& pX2, - const RDOFRMSprite::LPRDOFRMPosition& pY2, - const RDOFRMSprite::LPRDOFRMColor& pColor - ) - : RDOFRMItem (pSprite ) - , RDOFRMBoundingItem(pX1, pY1, pX2, pY2) - , m_pColor (pColor ) + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX1, + const RDOFRMSprite::LPRDOFRMPosition& pY1, + const RDOFRMSprite::LPRDOFRMPosition& pX2, + const RDOFRMSprite::LPRDOFRMPosition& pY2, + const RDOFRMSprite::LPRDOFRMColor& pColor + ) + : RDOFRMItem (pSprite ) + , RDOFRMBoundingItem(pX1, pY1, pX2, pY2) + , m_pColor (pColor ) {} RDOFRMLine::~RDOFRMLine() @@ -867,47 +867,47 @@ RDOFRMLine::~RDOFRMLine() RDOValue RDOFRMLine::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->memory_insert(sizeof(rdo::animation::LineElement)); + pRuntime->memory_insert(sizeof(rdo::animation::LineElement)); - rdo::animation::Color fg = m_pColor->getColor(pRuntime, getFrame()); - getFrame()->setColorLastFG(m_pColor->getType(), fg); - int x1 = getX (pRuntime, getFrame()); - int y1 = getY (pRuntime, getFrame()); - int x2 = getWidthAsX (pRuntime, getFrame()); - int y2 = getHeightAsY(pRuntime, getFrame()); - getFrame()->setLastXYWH(x1, y1, x2 - x1, y2 - y1); + rdo::animation::Color fg = m_pColor->getColor(pRuntime, getFrame()); + getFrame()->setColorLastFG(m_pColor->getType(), fg); + int x1 = getX (pRuntime, getFrame()); + int y1 = getY (pRuntime, getFrame()); + int x2 = getWidthAsX (pRuntime, getFrame()); + int y2 = getHeightAsY(pRuntime, getFrame()); + getFrame()->setLastXYWH(x1, y1, x2 - x1, y2 - y1); - pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::LineElement( - rdo::animation::Point(x1, y1), - rdo::animation::Point(x2, y2), - fg - )); + pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::LineElement( + rdo::animation::Point(x1, y1), + rdo::animation::Point(x2, y2), + fg + )); - return RDOValue(); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMTriang // -------------------------------------------------------------------------------- RDOFRMTriang::RDOFRMTriang( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX1, - const RDOFRMSprite::LPRDOFRMPosition& pY1, - const RDOFRMSprite::LPRDOFRMPosition& pX2, - const RDOFRMSprite::LPRDOFRMPosition& pY2, - const RDOFRMSprite::LPRDOFRMPosition& pX3, - const RDOFRMSprite::LPRDOFRMPosition& pY3, - const RDOFRMSprite::LPRDOFRMColor& pBgColor, - const RDOFRMSprite::LPRDOFRMColor& pFgColor - ) - : RDOFRMItem (pSprite ) - , RDOFRMColoredItem(pBgColor, pFgColor) - , m_pX1 (pX1 ) - , m_pY1 (pY1 ) - , m_pX2 (pX2 ) - , m_pY2 (pY2 ) - , m_pX3 (pX3 ) - , m_pY3 (pY3 ) + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX1, + const RDOFRMSprite::LPRDOFRMPosition& pY1, + const RDOFRMSprite::LPRDOFRMPosition& pX2, + const RDOFRMSprite::LPRDOFRMPosition& pY2, + const RDOFRMSprite::LPRDOFRMPosition& pX3, + const RDOFRMSprite::LPRDOFRMPosition& pY3, + const RDOFRMSprite::LPRDOFRMColor& pBgColor, + const RDOFRMSprite::LPRDOFRMColor& pFgColor + ) + : RDOFRMItem (pSprite ) + , RDOFRMColoredItem(pBgColor, pFgColor) + , m_pX1 (pX1 ) + , m_pY1 (pY1 ) + , m_pX2 (pX2 ) + , m_pY2 (pY2 ) + , m_pX3 (pX3 ) + , m_pY3 (pY3 ) {} RDOFRMTriang::~RDOFRMTriang() @@ -915,58 +915,58 @@ RDOFRMTriang::~RDOFRMTriang() RDOValue RDOFRMTriang::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->memory_insert(sizeof(rdo::animation::TriangElement)); - - rdo::animation::Color bg = getBg(pRuntime, getFrame()); - rdo::animation::Color fg = getFg(pRuntime, getFrame()); - getFrame()->setColorLastBG(getBgColor()->getType(), bg); - getFrame()->setColorLastFG(getFgColor()->getType(), fg); - int x1 = m_pX1->getX(pRuntime, getFrame()); - int y1 = m_pY1->getY(pRuntime, getFrame()); - int minX = x1; - int maxX = x1; - int minY = y1; - int maxY = y1; - getFrame()->setLastXYWH(x1, y1, x1, y1); - int x2 = m_pX2->getX(pRuntime, getFrame()); - int y2 = m_pY2->getY(pRuntime, getFrame()); - if (minX > x2) minX = x2; - if (maxX < x2) maxX = x2; - if (minY > y2) minY = y2; - if (maxY < x2) maxY = y2; - getFrame()->setLastXYWH(x2, y2, x2 - x1, y2 - y1); - int x3 = m_pX3->getX(pRuntime, getFrame()); - int y3 = m_pY3->getY(pRuntime, getFrame()); - if (minX > x3) minX = x3; - if (maxX < x3) maxX = x3; - if (minY > y3) minY = y3; - if (maxY < x3) maxY = y3; - getFrame()->setLastXYWH(minX, minY, maxX - minX, maxY - minY); - - pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::TriangElement( - rdo::animation::Point(x1, y1), - rdo::animation::Point(x2, y2), - rdo::animation::Point(x3, y3), - rdo::animation::ColoredElement(bg, fg) - )); - - return RDOValue(); + pRuntime->memory_insert(sizeof(rdo::animation::TriangElement)); + + rdo::animation::Color bg = getBg(pRuntime, getFrame()); + rdo::animation::Color fg = getFg(pRuntime, getFrame()); + getFrame()->setColorLastBG(getBgColor()->getType(), bg); + getFrame()->setColorLastFG(getFgColor()->getType(), fg); + int x1 = m_pX1->getX(pRuntime, getFrame()); + int y1 = m_pY1->getY(pRuntime, getFrame()); + int minX = x1; + int maxX = x1; + int minY = y1; + int maxY = y1; + getFrame()->setLastXYWH(x1, y1, x1, y1); + int x2 = m_pX2->getX(pRuntime, getFrame()); + int y2 = m_pY2->getY(pRuntime, getFrame()); + if (minX > x2) minX = x2; + if (maxX < x2) maxX = x2; + if (minY > y2) minY = y2; + if (maxY < x2) maxY = y2; + getFrame()->setLastXYWH(x2, y2, x2 - x1, y2 - y1); + int x3 = m_pX3->getX(pRuntime, getFrame()); + int y3 = m_pY3->getY(pRuntime, getFrame()); + if (minX > x3) minX = x3; + if (maxX < x3) maxX = x3; + if (minY > y3) minY = y3; + if (maxY < x3) maxY = y3; + getFrame()->setLastXYWH(minX, minY, maxX - minX, maxY - minY); + + pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::TriangElement( + rdo::animation::Point(x1, y1), + rdo::animation::Point(x2, y2), + rdo::animation::Point(x3, y3), + rdo::animation::ColoredElement(bg, fg) + )); + + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMActive // -------------------------------------------------------------------------------- RDOFRMActive::RDOFRMActive( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight, - const std::string& operName - ) - : RDOFRMItem (pSprite ) - , RDOFRMBoundingItem(pX, pY, pWidth, pHeight) - , m_operName (operName ) + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight, + const std::string& operName + ) + : RDOFRMItem (pSprite ) + , RDOFRMBoundingItem(pX, pY, pWidth, pHeight) + , m_operName (operName ) {} RDOFRMActive::~RDOFRMActive() @@ -974,34 +974,34 @@ RDOFRMActive::~RDOFRMActive() RDOValue RDOFRMActive::doCalc(const LPRDORuntime& pRuntime) { - pRuntime->memory_insert(sizeof(rdo::animation::ActiveElement)); + pRuntime->memory_insert(sizeof(rdo::animation::ActiveElement)); - int x = getX (pRuntime, getFrame()); - int y = getY (pRuntime, getFrame()); - int width = getWidth (pRuntime, getFrame()); - int height = getHeight(pRuntime, getFrame()); - getFrame()->setLastXYWH(x, y, width, height); + int x = getX (pRuntime, getFrame()); + int y = getY (pRuntime, getFrame()); + int width = getWidth (pRuntime, getFrame()); + int height = getHeight(pRuntime, getFrame()); + getFrame()->setLastXYWH(x, y, width, height); - pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::ActiveElement( - rdo::animation::BoundedElement(rdo::animation::Point(x, y), rdo::animation::Size(width, height)), - m_operName - )); + pRuntime->getPreparingFrame()->m_elements.push_back(new rdo::animation::ActiveElement( + rdo::animation::BoundedElement(rdo::animation::Point(x, y), rdo::animation::Size(width, height)), + m_operName + )); - return RDOValue(); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMSpace // -------------------------------------------------------------------------------- RDOFRMSpace::RDOFRMSpace( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight - ) - : RDOFRMItem (pSprite ) - , RDOFRMBoundingItem(pX, pY, pWidth, pHeight) + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight + ) + : RDOFRMItem (pSprite ) + , RDOFRMBoundingItem(pX, pY, pWidth, pHeight) {} RDOFRMSpace::~RDOFRMSpace() @@ -1009,89 +1009,89 @@ RDOFRMSpace::~RDOFRMSpace() RDOValue RDOFRMSpace::doCalc(const LPRDORuntime& pRuntime) { - int x = getX (pRuntime, getFrame()); - int y = getY (pRuntime, getFrame()); - int width = getWidth (pRuntime, getFrame()); - int height = getHeight(pRuntime, getFrame()); - getFrame()->setLastXYWH(x, y, width, height); + int x = getX (pRuntime, getFrame()); + int y = getY (pRuntime, getFrame()); + int width = getWidth (pRuntime, getFrame()); + int height = getHeight(pRuntime, getFrame()); + getFrame()->setLastXYWH(x, y, width, height); - return RDOValue(); + return RDOValue(); } // -------------------------------------------------------------------------------- // -------------------- RDOFRMFrame // -------------------------------------------------------------------------------- RDOFRMFrame::RDOFRMFrame(const RDOSrcInfo& srcInfo) - : RDOFRMSprite (srcInfo) - , m_picFileName("" ) - , m_width (800 ) - , m_height (600 ) - {} + : RDOFRMSprite (srcInfo) + , m_picFileName("" ) + , m_width (800 ) + , m_height (600 ) + {} RDOFRMFrame::~RDOFRMFrame() {} RDOValue RDOFRMFrame::doCalc(const LPRDORuntime& pRuntime) { - rdo::animation::Frame* pFrame = pRuntime->getPreparingFrame(); - ASSERT(pFrame); - - if (m_pBgColor) - { - if (m_pBgColor->getType() == RDOFRMColor::CT_RGB) - { - rdo::animation::Color bgColor = m_pBgColor->getColor(pRuntime, this); - pFrame->m_bgColor = bgColor; - } - else - { - pFrame->m_bgColor = rdo::animation::Color(); - } - } - else - { - pFrame->m_bgColor = rdo::animation::Color(); - } - - return RDOFRMSprite::prepareFrame(pRuntime); + rdo::animation::Frame* pFrame = pRuntime->getPreparingFrame(); + ASSERT(pFrame); + + if (m_pBgColor) + { + if (m_pBgColor->getType() == RDOFRMColor::Type::RGB) + { + rdo::animation::Color bgColor = m_pBgColor->getColor(pRuntime, this); + pFrame->m_bgColor = bgColor; + } + else + { + pFrame->m_bgColor = rdo::animation::Color(); + } + } + else + { + pFrame->m_bgColor = rdo::animation::Color(); + } + + return RDOFRMSprite::prepareFrame(pRuntime); } void RDOFRMFrame::setBackgroundColor(const LPRDOFRMColor& pBgColor) { - m_pBgColor = pBgColor; + m_pBgColor = pBgColor; } void RDOFRMFrame::setBackPicture(const std::string& picFileName) { - m_picFileName = picFileName; + m_picFileName = picFileName; } void RDOFRMFrame::setBackPicture(int width, int height) { - m_picFileName = ""; - m_width = width; - m_height = height; + m_picFileName = ""; + m_width = width; + m_height = height; } void RDOFRMFrame::prepareFrame(rdo::animation::Frame* pFrame, const LPRDORuntime& pRuntime) { - ASSERT(pFrame); + ASSERT(pFrame); - pFrame->m_bgImageName = m_picFileName; - pFrame->m_size.m_width = m_width; - pFrame->m_size.m_height = m_height; + pFrame->m_bgImageName = m_picFileName; + pFrame->m_size.m_width = m_width; + pFrame->m_size.m_height = m_height; - pRuntime->setPreparingFrame(pFrame); - calcValue(pRuntime); - pRuntime->resetPreparingFrame(); + pRuntime->setPreparingFrame(pFrame); + calcValue(pRuntime); + pRuntime->resetPreparingFrame(); } void RDOFRMFrame::getBitmaps(IRDOFRMItemGetBitmap::ImageNameList& list) const { - if (!m_picFileName.empty()) - list.push_back(m_picFileName); + if (!m_picFileName.empty()) + list.push_back(m_picFileName); - RDOFRMSprite::getBitmaps(list); + RDOFRMSprite::getBitmaps(list); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdoframe.h b/simulator/runtime/rdoframe.h index 4187a3a02..82f8e54f7 100644 --- a/simulator/runtime/rdoframe.h +++ b/simulator/runtime/rdoframe.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_FRAME_H_ -#define _LIB_RUNTIME_FRAME_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -19,205 +18,204 @@ struct IRDOFRMItemGetBitmap: public rdo::RefCounter { DECLARE_FACTORY(IRDOFRMItemGetBitmap) public: - typedef std::list ImageNameList; + typedef std::list ImageNameList; - virtual void getBitmaps(ImageNameList& list) const = 0; + virtual void getBitmaps(ImageNameList& list) const = 0; protected: - IRDOFRMItemGetBitmap(); - virtual ~IRDOFRMItemGetBitmap(); + IRDOFRMItemGetBitmap(); + virtual ~IRDOFRMItemGetBitmap(); }; #define DECLARE_IRDOFRMItemGetBitmap \ - virtual void getBitmaps(ImageNameList& list) const; + virtual void getBitmaps(ImageNameList& list) const; PREDECLARE_POINTER(RDOFRMSprite); class RDOFRMSprite - : public RDOCalc - , public RDORuntimeObject - , public RDOSrcInfo - , public IRDOFRMItemGetBitmap + : public RDOCalc + , public RDORuntimeObject + , public RDOSrcInfo + , public IRDOFRMItemGetBitmap { DECLARE_FACTORY(RDOFRMSprite) public: - PREDECLARE_POINTER(RDOFRMPosition); - class RDOFRMPosition - : public rdo::counter_reference - , public RDORuntimeObject - { - DECLARE_FACTORY(RDOFRMPosition) - public: - enum PositionType - { - PT_ABSOLUTE, - PT_DELTA, - PT_GABARIT, - PT_MULT, - PT_RULET - }; - - PositionType getType() const; - const LPRDOCalc& getCalc() const; - - int getX (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite); - int getY (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite); - int getWidth (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite); - int getHeight(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite); - - private: - RDOFRMPosition(const LPRDOCalc& pCalc, PositionType type = PT_ABSOLUTE, int ruletID = 0); - RDOFRMPosition(); - virtual ~RDOFRMPosition(); - - LPRDOCalc m_pCalc; - PositionType m_type; - int m_ruletID; - }; - friend class RDOFRMPosition; - - PREDECLARE_POINTER(RDOFRMColor); - class RDOFRMColor - : public rdo::counter_reference - , public RDORuntimeObject - { - DECLARE_FACTORY(RDOFRMColor) - public: - //! @brief Цвет фигуры - enum ColorType - { - CT_NONE, - CT_RGB, - CT_TRANSPARENT, - CT_LAST_BG, - CT_LAST_FG, - CT_LAST_BG_TEXT, - CT_LAST_FG_TEXT - }; - - rdo::animation::Color getColor(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; - - ColorType getType() const; - void setType(ColorType type); - - private: - RDOFRMColor(ColorType type = CT_NONE); - RDOFRMColor(unsigned char red, unsigned char green, unsigned char blue, const RDOSrcInfo& srcInfo); - RDOFRMColor(const LPRDOCalc& pRedCalc, const LPRDOCalc& pGreenCalc, const LPRDOCalc& pBlueCalc); - virtual ~RDOFRMColor(); - - ColorType m_type; - LPRDOCalc m_pRedCalc; - LPRDOCalc m_pGreenCalc; - LPRDOCalc m_pBlueCalc; - }; - friend class RDOFRMColor; - - PREDECLARE_POINTER(RDOFRMRulet); - class RDOFRMRulet: public RDOCalc - { - DECLARE_FACTORY(RDOFRMRulet) - public: - std::size_t getIndex() const; - const LPRDOFRMPosition& getX() const; - const LPRDOFRMPosition& getY() const; - - //! @todo Добавлен для обратной совместимости - const RDOSrcInfo& src_info() const; - - private: - RDOFRMRulet(const RDOSrcInfo& src_info, std::size_t index, const LPRDOFRMPosition& pX, const LPRDOFRMPosition& pY); - virtual ~RDOFRMRulet(); - - std::size_t m_index; - LPRDOFRMPosition m_pX; - LPRDOFRMPosition m_pY; - - DECLARE_ICalc; - }; + PREDECLARE_POINTER(RDOFRMPosition); + class RDOFRMPosition + : public rdo::counter_reference + , public RDORuntimeObject + { + DECLARE_FACTORY(RDOFRMPosition) + public: + enum class Type + { + ABSOLUTE_POSITION, + DELTA, + GABARIT, + MULT, + RULET + }; + + Type getType() const; + const LPRDOCalc& getCalc() const; + + int getX (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite); + int getY (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite); + int getWidth (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite); + int getHeight(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite); + + private: + RDOFRMPosition(const LPRDOCalc& pCalc, Type type = Type::ABSOLUTE_POSITION, int ruletID = 0); + RDOFRMPosition(); + virtual ~RDOFRMPosition(); + + LPRDOCalc m_pCalc; + Type m_type; + int m_ruletID; + }; + friend class RDOFRMPosition; + + PREDECLARE_POINTER(RDOFRMColor); + class RDOFRMColor + : public rdo::counter_reference + , public RDORuntimeObject + { + DECLARE_FACTORY(RDOFRMColor) + public: + enum class Type + { + NONE, + RGB, + TRANSPARENT_COLOR, + LAST_BG, + LAST_FG, + LAST_BG_TEXT, + LAST_FG_TEXT + }; + + rdo::animation::Color getColor(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; + + Type getType() const; + void setType(Type type); + + private: + RDOFRMColor(Type type = Type::NONE); + RDOFRMColor(unsigned char red, unsigned char green, unsigned char blue, const RDOSrcInfo& srcInfo); + RDOFRMColor(const LPRDOCalc& pRedCalc, const LPRDOCalc& pGreenCalc, const LPRDOCalc& pBlueCalc); + virtual ~RDOFRMColor(); + + Type m_type; + LPRDOCalc m_pRedCalc; + LPRDOCalc m_pGreenCalc; + LPRDOCalc m_pBlueCalc; + }; + friend class RDOFRMColor; + + PREDECLARE_POINTER(RDOFRMRulet); + class RDOFRMRulet: public RDOCalc + { + DECLARE_FACTORY(RDOFRMRulet) + public: + std::size_t getIndex() const; + const LPRDOFRMPosition& getX() const; + const LPRDOFRMPosition& getY() const; + + // TODO Добавлен для обратной совместимости + const RDOSrcInfo& src_info() const; + + private: + RDOFRMRulet(const RDOSrcInfo& src_info, std::size_t index, const LPRDOFRMPosition& pX, const LPRDOFRMPosition& pY); + virtual ~RDOFRMRulet(); + + std::size_t m_index; + LPRDOFRMPosition m_pX; + LPRDOFRMPosition m_pY; + + DECLARE_ICalc; + }; public: - const std::string& name() const; - void insertItem(const LPRDOCalc& pItem); - void setSpriteCalc(const LPRDOCalc& pSpriteCalc); + const std::string& name() const; + void insertItem(const LPRDOCalc& pItem); + void setSpriteCalc(const LPRDOCalc& pSpriteCalc); - void setColorLastBG (RDOFRMColor::ColorType type, const rdo::animation::Color& lastBg); - void setColorLastFG (RDOFRMColor::ColorType type, const rdo::animation::Color& lastFg); - void setColorLastBGText(RDOFRMColor::ColorType type, const rdo::animation::Color& lastBgText); - void setColorLastFGText(RDOFRMColor::ColorType type, const rdo::animation::Color& lastFgText); - void setLastXY (double x, double y); - void setLastXYWH (double x, double y, double width, double height); + void setColorLastBG (RDOFRMColor::Type type, const rdo::animation::Color& lastBg); + void setColorLastFG (RDOFRMColor::Type type, const rdo::animation::Color& lastFg); + void setColorLastBGText(RDOFRMColor::Type type, const rdo::animation::Color& lastBgText); + void setColorLastFGText(RDOFRMColor::Type type, const rdo::animation::Color& lastFgText); + void setLastXY (double x, double y); + void setLastXYWH (double x, double y, double width, double height); - int getRuletX(const LPRDORuntime& pRuntime, std::size_t ruletID) const; - int getRuletY(const LPRDORuntime& pRuntime, std::size_t ruletID) const; - LPRDOFRMRulet findRulet(std::size_t ruletID) const; + int getRuletX(const LPRDORuntime& pRuntime, std::size_t ruletID) const; + int getRuletY(const LPRDORuntime& pRuntime, std::size_t ruletID) const; + LPRDOFRMRulet findRulet(std::size_t ruletID) const; protected: - RDOFRMSprite(const RDOSrcInfo& srcInfo); - virtual ~RDOFRMSprite(); + RDOFRMSprite(const RDOSrcInfo& srcInfo); + virtual ~RDOFRMSprite(); - RDOValue prepareFrame(const LPRDORuntime& pRuntime); + RDOValue prepareFrame(const LPRDORuntime& pRuntime); - DECLARE_IRDOFRMItemGetBitmap; + DECLARE_IRDOFRMItemGetBitmap; private: - typedef std::map RuletList; - typedef std::list GetBitmapList; - - LPRDOCalc m_pSpriteCalc; - rdo::animation::Color m_colorLastBg; - rdo::animation::Color m_colorLastFg; - rdo::animation::Color m_colorLastBgText; - rdo::animation::Color m_colorLastFgText; - double m_lastX; - double m_lastY; - double m_lastWidth; - double m_lastHeight; - RuletList m_ruletList; - GetBitmapList m_getBitmapList; - - void insertGetBitmap(const LPIRDOFRMItemGetBitmap& pGetBitmap); - void insertRulet (const LPRDOFRMRulet& pRulet); - - DECLARE_ICalc; + typedef std::map RuletList; + typedef std::list GetBitmapList; + + LPRDOCalc m_pSpriteCalc; + rdo::animation::Color m_colorLastBg; + rdo::animation::Color m_colorLastFg; + rdo::animation::Color m_colorLastBgText; + rdo::animation::Color m_colorLastFgText; + double m_lastX; + double m_lastY; + double m_lastWidth; + double m_lastHeight; + RuletList m_ruletList; + GetBitmapList m_getBitmapList; + + void insertGetBitmap(const LPIRDOFRMItemGetBitmap& pGetBitmap); + void insertRulet (const LPRDOFRMRulet& pRulet); + + DECLARE_ICalc; }; DECLARE_POINTER(RDOFRMSprite); class RDOFRMBoundingItem { protected: - RDOFRMBoundingItem(const RDOFRMSprite::LPRDOFRMPosition& pX, const RDOFRMSprite::LPRDOFRMPosition& pY, const RDOFRMSprite::LPRDOFRMPosition& pWidth, const RDOFRMSprite::LPRDOFRMPosition& pHeight); - virtual ~RDOFRMBoundingItem(); + RDOFRMBoundingItem(const RDOFRMSprite::LPRDOFRMPosition& pX, const RDOFRMSprite::LPRDOFRMPosition& pY, const RDOFRMSprite::LPRDOFRMPosition& pWidth, const RDOFRMSprite::LPRDOFRMPosition& pHeight); + virtual ~RDOFRMBoundingItem(); - int getX (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; - int getY (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; - int getWidth (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; - int getHeight (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; - int getWidthAsX (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; - int getHeightAsY(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; + int getX (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; + int getY (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; + int getWidth (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; + int getHeight (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; + int getWidthAsX (const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; + int getHeightAsY(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; private: - RDOFRMSprite::LPRDOFRMPosition m_pX; - RDOFRMSprite::LPRDOFRMPosition m_pY; - RDOFRMSprite::LPRDOFRMPosition m_pWidth; - RDOFRMSprite::LPRDOFRMPosition m_pHeight; + RDOFRMSprite::LPRDOFRMPosition m_pX; + RDOFRMSprite::LPRDOFRMPosition m_pY; + RDOFRMSprite::LPRDOFRMPosition m_pWidth; + RDOFRMSprite::LPRDOFRMPosition m_pHeight; }; class RDOFRMColoredItem { public: - const RDOFRMSprite::LPRDOFRMColor& getBgColor() const; - const RDOFRMSprite::LPRDOFRMColor& getFgColor() const; + const RDOFRMSprite::LPRDOFRMColor& getBgColor() const; + const RDOFRMSprite::LPRDOFRMColor& getFgColor() const; - rdo::animation::Color getBg(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; - rdo::animation::Color getFg(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; + rdo::animation::Color getBg(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; + rdo::animation::Color getFg(const LPRDORuntime& pRuntime, const LPRDOFRMSprite& pSprite) const; protected: - RDOFRMColoredItem(const RDOFRMSprite::LPRDOFRMColor& pBgColor, const RDOFRMSprite::LPRDOFRMColor& pFgColor); - virtual ~RDOFRMColoredItem(); + RDOFRMColoredItem(const RDOFRMSprite::LPRDOFRMColor& pBgColor, const RDOFRMSprite::LPRDOFRMColor& pFgColor); + virtual ~RDOFRMColoredItem(); private: - RDOFRMSprite::LPRDOFRMColor m_pBgColor; - RDOFRMSprite::LPRDOFRMColor m_pFgColor; + RDOFRMSprite::LPRDOFRMColor m_pBgColor; + RDOFRMSprite::LPRDOFRMColor m_pFgColor; }; PREDECLARE_POINTER(RDOFRMItem); @@ -225,317 +223,315 @@ class RDOFRMItem: public RDOCalc { DECLARE_FACTORY(RDOFRMItem) protected: - RDOFRMItem(const LPRDOFRMSprite& pSprite); - virtual ~RDOFRMItem(); + RDOFRMItem(const LPRDOFRMSprite& pSprite); + virtual ~RDOFRMItem(); - const LPRDOFRMSprite& getFrame() const; + const LPRDOFRMSprite& getFrame() const; private: - LPRDOFRMSprite m_pFrame; + LPRDOFRMSprite m_pFrame; }; PREDECLARE_POINTER(RDOFRMText); class RDOFRMText - : public RDOFRMItem - , public RDOFRMBoundingItem - , public RDOFRMColoredItem + : public RDOFRMItem + , public RDOFRMBoundingItem + , public RDOFRMColoredItem { DECLARE_FACTORY(RDOFRMText) public: - typedef rdo::animation::TextElement::TextAlign Align; + typedef rdo::animation::TextElement::Align Align; - void setText(Align align, const LPRDOCalc& pValue); - void setText(Align align, const std::string& text); + void setText(Align align, const LPRDOCalc& pValue); + void setText(Align align, const std::string& text); private: - RDOFRMText( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight, - const RDOFRMSprite::LPRDOFRMColor& pBgColor, - const RDOFRMSprite::LPRDOFRMColor& pFgColor - ); - virtual ~RDOFRMText(); - - Align m_align; - LPRDOCalc m_pValue; - std::string m_text; - bool m_isTextString; - - DECLARE_ICalc; + RDOFRMText( + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight, + const RDOFRMSprite::LPRDOFRMColor& pBgColor, + const RDOFRMSprite::LPRDOFRMColor& pFgColor + ); + virtual ~RDOFRMText(); + + Align m_align; + LPRDOCalc m_pValue; + std::string m_text; + bool m_isTextString; + + DECLARE_ICalc; }; PREDECLARE_POINTER(RDOFRMBitmapBase); class RDOFRMBitmapBase - : public RDOFRMItem - , public IRDOFRMItemGetBitmap + : public RDOFRMItem + , public IRDOFRMItemGetBitmap { protected: - std::string m_pictFilename; - std::string m_maskFilename; + std::string m_pictFilename; + std::string m_maskFilename; - RDOFRMBitmapBase(const LPRDOFRMSprite& pSprite, const std::string& pictFilename, const std::string& maskFilename = ""); - virtual ~RDOFRMBitmapBase(); + RDOFRMBitmapBase(const LPRDOFRMSprite& pSprite, const std::string& pictFilename, const std::string& maskFilename = ""); + virtual ~RDOFRMBitmapBase(); private: - DECLARE_IRDOFRMItemGetBitmap + DECLARE_IRDOFRMItemGetBitmap }; class RDOFRMBitmap: public RDOFRMBitmapBase { DECLARE_FACTORY(RDOFRMBitmap) private: - RDOFRMBitmap( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const std::string& pictFilename, - const std::string& maskFilename = "" - ); - virtual ~RDOFRMBitmap(); - - RDOFRMSprite::LPRDOFRMPosition m_pX; - RDOFRMSprite::LPRDOFRMPosition m_pY; - - DECLARE_ICalc; + RDOFRMBitmap( + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const std::string& pictFilename, + const std::string& maskFilename = "" + ); + virtual ~RDOFRMBitmap(); + + RDOFRMSprite::LPRDOFRMPosition m_pX; + RDOFRMSprite::LPRDOFRMPosition m_pY; + + DECLARE_ICalc; }; DECLARE_POINTER(RDOFRMBitmap) class RDOFRMBitmapStretch - : public RDOFRMBitmapBase - , public RDOFRMBoundingItem + : public RDOFRMBitmapBase + , public RDOFRMBoundingItem { DECLARE_FACTORY(RDOFRMBitmapStretch) private: - RDOFRMBitmapStretch( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight, - const std::string& pictFilename, - const std::string& maskFilename = "" - ); - virtual ~RDOFRMBitmapStretch(); - - DECLARE_ICalc; + RDOFRMBitmapStretch( + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight, + const std::string& pictFilename, + const std::string& maskFilename = "" + ); + virtual ~RDOFRMBitmapStretch(); + + DECLARE_ICalc; }; DECLARE_POINTER(RDOFRMBitmapStretch); PREDECLARE_POINTER(RDOFRMRect); class RDOFRMRect - : public RDOFRMItem - , public RDOFRMBoundingItem - , public RDOFRMColoredItem + : public RDOFRMItem + , public RDOFRMBoundingItem + , public RDOFRMColoredItem { DECLARE_FACTORY(RDOFRMRect) private: - RDOFRMRect( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight, - const RDOFRMSprite::LPRDOFRMColor& pBgColor, - const RDOFRMSprite::LPRDOFRMColor& pFgColor - ); - virtual ~RDOFRMRect(); - - DECLARE_ICalc; + RDOFRMRect( + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight, + const RDOFRMSprite::LPRDOFRMColor& pBgColor, + const RDOFRMSprite::LPRDOFRMColor& pFgColor + ); + virtual ~RDOFRMRect(); + + DECLARE_ICalc; }; PREDECLARE_POINTER(RDOFRMRectRound); class RDOFRMRectRound - : public RDOFRMItem - , public RDOFRMBoundingItem - , public RDOFRMColoredItem + : public RDOFRMItem + , public RDOFRMBoundingItem + , public RDOFRMColoredItem { DECLARE_FACTORY(RDOFRMRectRound) private: - RDOFRMRectRound( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight, - const RDOFRMSprite::LPRDOFRMColor& pBgColor, - const RDOFRMSprite::LPRDOFRMColor& pFgColor - ); - virtual ~RDOFRMRectRound(); - - DECLARE_ICalc; + RDOFRMRectRound( + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight, + const RDOFRMSprite::LPRDOFRMColor& pBgColor, + const RDOFRMSprite::LPRDOFRMColor& pFgColor + ); + virtual ~RDOFRMRectRound(); + + DECLARE_ICalc; }; PREDECLARE_POINTER(RDOFRMCircle); class RDOFRMCircle - : public RDOFRMItem - , public RDOFRMColoredItem + : public RDOFRMItem + , public RDOFRMColoredItem { DECLARE_FACTORY(RDOFRMCircle) private: - RDOFRMCircle( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pRadius, - const RDOFRMSprite::LPRDOFRMColor& pBgColor, - const RDOFRMSprite::LPRDOFRMColor& pFgColor - ); - virtual ~RDOFRMCircle(); - - RDOFRMSprite::LPRDOFRMPosition m_pX; - RDOFRMSprite::LPRDOFRMPosition m_pY; - RDOFRMSprite::LPRDOFRMPosition m_pRadius; - - DECLARE_ICalc; + RDOFRMCircle( + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pRadius, + const RDOFRMSprite::LPRDOFRMColor& pBgColor, + const RDOFRMSprite::LPRDOFRMColor& pFgColor + ); + virtual ~RDOFRMCircle(); + + RDOFRMSprite::LPRDOFRMPosition m_pX; + RDOFRMSprite::LPRDOFRMPosition m_pY; + RDOFRMSprite::LPRDOFRMPosition m_pRadius; + + DECLARE_ICalc; }; PREDECLARE_POINTER(RDOFRMEllipse); class RDOFRMEllipse - : public RDOFRMItem - , public RDOFRMBoundingItem - , public RDOFRMColoredItem + : public RDOFRMItem + , public RDOFRMBoundingItem + , public RDOFRMColoredItem { DECLARE_FACTORY(RDOFRMEllipse) private: - RDOFRMEllipse( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight, - const RDOFRMSprite::LPRDOFRMColor& pBgColor, - const RDOFRMSprite::LPRDOFRMColor& pFgColor - ); - virtual ~RDOFRMEllipse(); - - DECLARE_ICalc; + RDOFRMEllipse( + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight, + const RDOFRMSprite::LPRDOFRMColor& pBgColor, + const RDOFRMSprite::LPRDOFRMColor& pFgColor + ); + virtual ~RDOFRMEllipse(); + + DECLARE_ICalc; }; PREDECLARE_POINTER(RDOFRMLine); class RDOFRMLine - : public RDOFRMItem - , public RDOFRMBoundingItem + : public RDOFRMItem + , public RDOFRMBoundingItem { DECLARE_FACTORY(RDOFRMLine) private: - RDOFRMLine( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX1, - const RDOFRMSprite::LPRDOFRMPosition& pY1, - const RDOFRMSprite::LPRDOFRMPosition& pX2, - const RDOFRMSprite::LPRDOFRMPosition& pY2, - const RDOFRMSprite::LPRDOFRMColor& pColor - ); - virtual ~RDOFRMLine(); - - RDOFRMSprite::LPRDOFRMColor m_pColor; - - DECLARE_ICalc; + RDOFRMLine( + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX1, + const RDOFRMSprite::LPRDOFRMPosition& pY1, + const RDOFRMSprite::LPRDOFRMPosition& pX2, + const RDOFRMSprite::LPRDOFRMPosition& pY2, + const RDOFRMSprite::LPRDOFRMColor& pColor + ); + virtual ~RDOFRMLine(); + + RDOFRMSprite::LPRDOFRMColor m_pColor; + + DECLARE_ICalc; }; PREDECLARE_POINTER(RDOFRMTriang); class RDOFRMTriang - : public RDOFRMItem - , public RDOFRMColoredItem + : public RDOFRMItem + , public RDOFRMColoredItem { DECLARE_FACTORY(RDOFRMTriang) private: - RDOFRMTriang( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX1, - const RDOFRMSprite::LPRDOFRMPosition& pY1, - const RDOFRMSprite::LPRDOFRMPosition& pX2, - const RDOFRMSprite::LPRDOFRMPosition& pY2, - const RDOFRMSprite::LPRDOFRMPosition& pX3, - const RDOFRMSprite::LPRDOFRMPosition& pY3, - const RDOFRMSprite::LPRDOFRMColor& pBgColor, - const RDOFRMSprite::LPRDOFRMColor& pFgColor - ); - virtual ~RDOFRMTriang(); - - RDOFRMSprite::LPRDOFRMPosition m_pX1; - RDOFRMSprite::LPRDOFRMPosition m_pY1; - RDOFRMSprite::LPRDOFRMPosition m_pX2; - RDOFRMSprite::LPRDOFRMPosition m_pY2; - RDOFRMSprite::LPRDOFRMPosition m_pX3; - RDOFRMSprite::LPRDOFRMPosition m_pY3; - - DECLARE_ICalc; + RDOFRMTriang( + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX1, + const RDOFRMSprite::LPRDOFRMPosition& pY1, + const RDOFRMSprite::LPRDOFRMPosition& pX2, + const RDOFRMSprite::LPRDOFRMPosition& pY2, + const RDOFRMSprite::LPRDOFRMPosition& pX3, + const RDOFRMSprite::LPRDOFRMPosition& pY3, + const RDOFRMSprite::LPRDOFRMColor& pBgColor, + const RDOFRMSprite::LPRDOFRMColor& pFgColor + ); + virtual ~RDOFRMTriang(); + + RDOFRMSprite::LPRDOFRMPosition m_pX1; + RDOFRMSprite::LPRDOFRMPosition m_pY1; + RDOFRMSprite::LPRDOFRMPosition m_pX2; + RDOFRMSprite::LPRDOFRMPosition m_pY2; + RDOFRMSprite::LPRDOFRMPosition m_pX3; + RDOFRMSprite::LPRDOFRMPosition m_pY3; + + DECLARE_ICalc; }; PREDECLARE_POINTER(RDOFRMActive); class RDOFRMActive - : public RDOFRMItem - , public RDOFRMBoundingItem + : public RDOFRMItem + , public RDOFRMBoundingItem { DECLARE_FACTORY(RDOFRMActive) private: - RDOFRMActive( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight, - const std::string& operName - ); - virtual ~RDOFRMActive(); - - std::string m_operName; - - DECLARE_ICalc; + RDOFRMActive( + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight, + const std::string& operName + ); + virtual ~RDOFRMActive(); + + std::string m_operName; + + DECLARE_ICalc; }; PREDECLARE_POINTER(RDOFRMSpace); class RDOFRMSpace - : public RDOFRMItem - , public RDOFRMBoundingItem + : public RDOFRMItem + , public RDOFRMBoundingItem { DECLARE_FACTORY(RDOFRMSpace) private: - RDOFRMSpace( - const LPRDOFRMSprite& pSprite, - const RDOFRMSprite::LPRDOFRMPosition& pX, - const RDOFRMSprite::LPRDOFRMPosition& pY, - const RDOFRMSprite::LPRDOFRMPosition& pWidth, - const RDOFRMSprite::LPRDOFRMPosition& pHeight - ); - virtual ~RDOFRMSpace(); - - DECLARE_ICalc; + RDOFRMSpace( + const LPRDOFRMSprite& pSprite, + const RDOFRMSprite::LPRDOFRMPosition& pX, + const RDOFRMSprite::LPRDOFRMPosition& pY, + const RDOFRMSprite::LPRDOFRMPosition& pWidth, + const RDOFRMSprite::LPRDOFRMPosition& pHeight + ); + virtual ~RDOFRMSpace(); + + DECLARE_ICalc; }; class RDOFRMFrame: public RDOFRMSprite { DECLARE_FACTORY(RDOFRMFrame) public: - void setBackPicture(const std::string& picFileName); - void setBackPicture(int width, int height); + void setBackPicture(const std::string& picFileName); + void setBackPicture(int width, int height); - void prepareFrame(rdo::animation::Frame* pFrame, const LPRDORuntime& pRuntime); + void prepareFrame(rdo::animation::Frame* pFrame, const LPRDORuntime& pRuntime); - void setBackgroundColor(const LPRDOFRMColor& pBgColor); + void setBackgroundColor(const LPRDOFRMColor& pBgColor); - //! @todo Нужно спрятатть в приват и поправить симулятор, из которого метод вызывается - DECLARE_IRDOFRMItemGetBitmap; + // TODO Нужно спрятатть в приват и поправить симулятор, из которого метод вызывается + DECLARE_IRDOFRMItemGetBitmap; private: - RDOFRMFrame(const RDOSrcInfo& srcInfo); - virtual ~RDOFRMFrame(); + RDOFRMFrame(const RDOSrcInfo& srcInfo); + virtual ~RDOFRMFrame(); - LPRDOFRMColor m_pBgColor; - std::string m_picFileName; - std::size_t m_width; - std::size_t m_height; + LPRDOFRMColor m_pBgColor; + std::string m_picFileName; + std::size_t m_width; + std::size_t m_height; - DECLARE_ICalc; + DECLARE_ICalc; }; DECLARE_POINTER(RDOFRMFrame); CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_FRAME_H_ diff --git a/simulator/runtime/rdotrace.cpp b/simulator/runtime/rdotrace.cpp index 2ca4cb495..399080109 100644 --- a/simulator/runtime/rdotrace.cpp +++ b/simulator/runtime/rdotrace.cpp @@ -16,25 +16,25 @@ OPEN_RDO_RUNTIME_NAMESPACE #ifdef RDOSIM_COMPATIBLE std::string doubleToString(double value) { - std::ostringstream _str; - _str << value; - const std::string::size_type pos = _str.str().find("e"); - if (pos != std::string::npos) - { - std::string __str = _str.str(); - __str.erase(pos + 2, 1); - return __str.c_str(); - } - else - { - return _str.str().c_str(); - } + std::ostringstream _str; + _str << value; + const std::string::size_type pos = _str.str().find("e"); + if (pos != std::string::npos) + { + std::string __str = _str.str(); + __str.erase(pos + 2, 1); + return __str.c_str(); + } + else + { + return _str.str().c_str(); + } } #else double doubleToString(double value) { - return value; + return value; } #endif @@ -46,16 +46,16 @@ void RDOEndL::onEndl() std::ostream& operator<< (std::ostream& stream, RDOEndL& rdoEndL) { - rdoEndL.onEndl(); - return stream; + rdoEndL.onEndl(); + return stream; } // -------------------------------------------------------------------------------- // -------------------- RDOTrace - Формирует строки трассировки // -------------------------------------------------------------------------------- RDOTrace::RDOTrace() - : m_isNullTracer (true ) - , m_canWriteToStream(false) + : m_isNullTracer (true ) + , m_canWriteToStream(false) {} RDOTrace::~RDOTrace() @@ -63,316 +63,316 @@ RDOTrace::~RDOTrace() bool RDOTrace::canTrace() const { - return !isNull() && canWrite(); + return !isNull() && canWrite(); } void RDOTrace::startWriting() { - m_canWriteToStream = true; + m_canWriteToStream = true; } void RDOTrace::stopWriting() { - m_canWriteToStream = false; + m_canWriteToStream = false; } bool RDOTrace::canWrite() const { - return m_canWriteToStream; + return m_canWriteToStream; } bool RDOTrace::isNull() const { - return m_isNullTracer; + return m_isNullTracer; } std::ostream& RDOTrace::getOStream() { - return m_emptyOut; + return m_emptyOut; } RDOEndL& RDOTrace::getEOL() { - return m_emptyEndL; + return m_emptyEndL; } void RDOTrace::writeSearchBegin(double currentTime, std::string decisionPointId) { - if (!canTrace()) - return; + if (!canTrace()) + return; - getOStream() << "SB " << currentTime << " " << decisionPointId.c_str() << std::endl << getEOL(); + getOStream() << "SB " << currentTime << " " << decisionPointId.c_str() << std::endl << getEOL(); } void RDOTrace::writeSearchDecisionHeader() { - if (!canTrace()) - return; + if (!canTrace()) + return; - getOStream() << "SD" << std::endl << getEOL(); + getOStream() << "SD" << std::endl << getEOL(); } void RDOTrace::writeSearchDecision(const LPRDORuntime& pRuntime, TreeNode* node) { - if (!canTrace()) - return; + if (!canTrace()) + return; - LPIActivityTrace activityTrace = node->m_activity->rule().object_dynamic_cast(); - LPIActivityPatternTrace activityPatternTrace = node->m_activity->rule().object_dynamic_cast(); - LPITrace trace = node->m_activity.object_dynamic_cast(); - ASSERT(trace); - ASSERT(activityTrace); - ASSERT(activityPatternTrace); + LPIActivityTrace activityTrace = node->m_activity->rule().object_dynamic_cast(); + LPIActivityPatternTrace activityPatternTrace = node->m_activity->rule().object_dynamic_cast(); + LPITrace trace = node->m_activity.object_dynamic_cast(); + ASSERT(trace); + ASSERT(activityTrace); + ASSERT(activityPatternTrace); - getOStream() << node->m_number - << " " << trace->traceId() - << " " << activityPatternTrace->tracePatternId() - << " " << activityTrace->traceResourcesListNumbers(pRuntime, true) - << std::endl << getEOL(); + getOStream() << node->m_number + << " " << trace->traceId() + << " " << activityPatternTrace->tracePatternId() + << " " << activityTrace->traceResourcesListNumbers(pRuntime, true) + << std::endl << getEOL(); } void RDOTrace::writeString(std::string str) { - if (!canTrace()) - return; + if (!canTrace()) + return; - getOStream() << str << std::endl << getEOL(); + getOStream() << str << std::endl << getEOL(); } void RDOTrace::writeSearchOpenNode(int nodeCount, int parentCount, double pathCost, double restCost) { - if (!canTrace()) - return; + if (!canTrace()) + return; - getOStream() << "SO " << nodeCount - << " " << doubleToString(parentCount) - << " " << doubleToString(pathCost) - << " " << doubleToString(restCost) << std::endl << getEOL(); + getOStream() << "SO " << nodeCount + << " " << doubleToString(parentCount) + << " " << doubleToString(pathCost) + << " " << doubleToString(restCost) << std::endl << getEOL(); } void RDOTrace::writeSearchNodeInfo(char sign, TreeNodeTrace* node) { - if (!canTrace()) - return; - - RDODPTSearchTrace* dpTrace = static_cast(node->m_root->m_dp); - if (dpTrace->traceFlag == RDODPTSearchTrace::DPT_trace_tops || dpTrace->traceFlag == RDODPTSearchTrace::DPT_trace_all) - { - const LPRDORuntime& pRuntime = node->m_pRuntime; - LPIActivityTrace activityTrace = node->m_currAct->rule().object_dynamic_cast(); - LPIActivityPatternTrace activityPatternTrace = node->m_currAct->rule().object_dynamic_cast(); - LPITrace trace = node->m_currAct.object_dynamic_cast(); - ASSERT(trace); - ASSERT(activityTrace); - ASSERT(activityPatternTrace); - - getOStream().precision(4); - getOStream() << "ST" << sign - << " " << ((sign != 'D') ? node->m_number : node->m_root->getNodesCound()) - << " " << ((sign != 'D') ? node->m_parent->m_number : node->m_number) - << " " << ((sign != 'D') ? doubleToString(node->m_costPath) : doubleToString(node->m_newCostPath)) - << " " << ((sign != 'D') ? doubleToString(node->m_costRest) : doubleToString(node->m_newCostRest)) - << " " << trace->traceId() - << " " << activityPatternTrace->tracePatternId() - << " " << ((sign != 'D') ? doubleToString(node->m_costRule) : doubleToString(node->m_newCostRule)) - << " " << activityTrace->traceResourcesListNumbers(pRuntime, true) - << std::endl << getEOL(); - - RDODPTSearchTrace* dpTrace = static_cast(node->m_root->m_dp); - if (dpTrace->traceFlag == RDODPTSearchTrace::DPT_trace_all) - { - getOStream() << activityTrace->traceResourcesList('S', pRuntime) << getEOL(); - } - } + if (!canTrace()) + return; + + RDODPTSearchTrace* dpTrace = static_cast(node->m_root->m_dp); + if (dpTrace->traceFlag == RDODPTSearchTrace::TraceFlag::TRACE_TOPS || dpTrace->traceFlag == RDODPTSearchTrace::TraceFlag::TRACE_ALL) + { + const LPRDORuntime& pRuntime = node->m_pRuntime; + LPIActivityTrace activityTrace = node->m_currAct->rule().object_dynamic_cast(); + LPIActivityPatternTrace activityPatternTrace = node->m_currAct->rule().object_dynamic_cast(); + LPITrace trace = node->m_currAct.object_dynamic_cast(); + ASSERT(trace); + ASSERT(activityTrace); + ASSERT(activityPatternTrace); + + getOStream().precision(4); + getOStream() << "ST" << sign + << " " << ((sign != 'D') ? node->m_number : node->m_root->getNodesCound()) + << " " << ((sign != 'D') ? node->m_parent->m_number : node->m_number) + << " " << ((sign != 'D') ? doubleToString(node->m_costPath) : doubleToString(node->m_newCostPath)) + << " " << ((sign != 'D') ? doubleToString(node->m_costRest) : doubleToString(node->m_newCostRest)) + << " " << trace->traceId() + << " " << activityPatternTrace->tracePatternId() + << " " << ((sign != 'D') ? doubleToString(node->m_costRule) : doubleToString(node->m_newCostRule)) + << " " << activityTrace->traceResourcesListNumbers(pRuntime, true) + << std::endl << getEOL(); + + RDODPTSearchTrace* dpTrace = static_cast(node->m_root->m_dp); + if (dpTrace->traceFlag == RDODPTSearchTrace::TraceFlag::TRACE_ALL) + { + getOStream() << activityTrace->traceResourcesList('S', pRuntime) << getEOL(); + } + } } void RDOTrace::writeSearchResult(char letter, const LPRDORuntime& simTr, TreeRoot* treeRoot) { - if (!canTrace()) - return; - - - boost::posix_time::ptime systime_current = boost::posix_time::microsec_clock::local_time(); - - const std::size_t msec_current = RDOSimulatorBase::getMSec(systime_current); - const std::size_t msec_begin = RDOSimulatorBase::getMSec(treeRoot->m_ptime); - double sec_delay = static_cast(msec_current - msec_begin) / 1000; - - static_cast(treeRoot->m_dp)->calc_times.push_back(sec_delay); - - getOStream() << "SE" << letter - << " " << simTr->getCurrentTime() - << " " << sec_delay // realTime - << " " << treeRoot->m_sizeof_dpt // memUsed - << " " << (letter == 'S' ? treeRoot->m_targetNode->m_costPath : 0) - << " " << treeRoot->m_expandedNodesCount - << " " << treeRoot->m_nodesInGraphCount - << " " << treeRoot->getNodesCound() - << " " << treeRoot->m_fullNodesCount - << std::endl << getEOL(); - if (letter == 'S') { - getOStream() << "ES" - << " " << simTr->getCurrentTime() - << " 4" - << std::endl << getEOL(); - static_cast(treeRoot->m_dp)->calc_cost.push_back(treeRoot->m_targetNode->m_costPath); - static_cast(treeRoot->m_dp)->calc_nodes.push_back(treeRoot->getNodesCound()); - static_cast(treeRoot->m_dp)->calc_nodes_expended.push_back(treeRoot->m_expandedNodesCount); - static_cast(treeRoot->m_dp)->calc_nodes_full.push_back(treeRoot->m_fullNodesCount); - static_cast(treeRoot->m_dp)->calc_nodes_in_graph.push_back(treeRoot->m_nodesInGraphCount); - } + if (!canTrace()) + return; + + + boost::posix_time::ptime systime_current = boost::posix_time::microsec_clock::local_time(); + + const std::size_t msec_current = RDOSimulatorBase::getMSec(systime_current); + const std::size_t msec_begin = RDOSimulatorBase::getMSec(treeRoot->m_ptime); + double sec_delay = static_cast(msec_current - msec_begin) / 1000; + + static_cast(treeRoot->m_dp)->calc_times.push_back(sec_delay); + + getOStream() << "SE" << letter + << " " << simTr->getCurrentTime() + << " " << sec_delay // realTime + << " " << treeRoot->m_sizeof_dpt // memUsed + << " " << (letter == 'S' ? treeRoot->m_targetNode->m_costPath : 0) + << " " << treeRoot->m_expandedNodesCount + << " " << treeRoot->m_nodesInGraphCount + << " " << treeRoot->getNodesCound() + << " " << treeRoot->m_fullNodesCount + << std::endl << getEOL(); + if (letter == 'S') { + getOStream() << "ES" + << " " << simTr->getCurrentTime() + << " 4" + << std::endl << getEOL(); + static_cast(treeRoot->m_dp)->calc_cost.push_back(treeRoot->m_targetNode->m_costPath); + static_cast(treeRoot->m_dp)->calc_nodes.push_back(treeRoot->getNodesCound()); + static_cast(treeRoot->m_dp)->calc_nodes_expended.push_back(treeRoot->m_expandedNodesCount); + static_cast(treeRoot->m_dp)->calc_nodes_full.push_back(treeRoot->m_fullNodesCount); + static_cast(treeRoot->m_dp)->calc_nodes_in_graph.push_back(treeRoot->m_nodesInGraphCount); + } } void RDOTrace::writePermanentResources(const LPRDORuntime& pRuntime, const std::list& res_perm) { - if (!canTrace()) - return; + if (!canTrace()) + return; - getOStream() << traceResourcesList('\0', pRuntime, res_perm) << getEOL(); + getOStream() << traceResourcesList('\0', pRuntime, res_perm) << getEOL(); } std::string RDOTrace::traceResourcesList(char prefix, const LPRDORuntime& pRuntime, const std::list& rel_res_list) { - std::string res; - for (std::list::const_iterator i = rel_res_list.begin(); i != rel_res_list.end(); ++i) - { - if (*i) - { - res += (*i)->traceResourceState(prefix, pRuntime); - } - } - return res; + std::string res; + for (std::list::const_iterator i = rel_res_list.begin(); i != rel_res_list.end(); ++i) + { + if (*i) + { + res += (*i)->traceResourceState(prefix, pRuntime); + } + } + return res; } void RDOTrace::writeEvent(const LPIBaseOperation& opr, const LPRDORuntime& pRuntime) { - if (!canTrace()) - return; + if (!canTrace()) + return; - LPIActivityTrace activityTrace = opr.object_dynamic_cast(); - ASSERT(activityTrace); + LPIActivityTrace activityTrace = opr.object_dynamic_cast(); + ASSERT(activityTrace); #ifdef RDOSIM_COMPATIBLE - getOStream() << activityTrace->traceResourcesList('\0', pRuntime) << getEOL(); + getOStream() << activityTrace->traceResourcesList('\0', pRuntime) << getEOL(); #endif - LPITrace trace = opr.object_dynamic_cast(); - ASSERT(trace); + LPITrace trace = opr.object_dynamic_cast(); + ASSERT(trace); - if (trace->traceable()) - { - LPIActivityPatternTrace activityPatternTrace = opr.object_dynamic_cast(); - ASSERT(activityPatternTrace); + if (trace->traceable()) + { + LPIActivityPatternTrace activityPatternTrace = opr.object_dynamic_cast(); + ASSERT(activityPatternTrace); - getOStream() << "EI " << pRuntime->getCurrentTime() - << " " << trace->traceId() - << " " << activityPatternTrace->tracePatternId() - << " " << activityTrace->traceResourcesListNumbers(pRuntime, true) - << std::endl << getEOL(); - } + getOStream() << "EI " << pRuntime->getCurrentTime() + << " " << trace->traceId() + << " " << activityPatternTrace->tracePatternId() + << " " << activityTrace->traceResourcesListNumbers(pRuntime, true) + << std::endl << getEOL(); + } #ifndef RDOSIM_COMPATIBLE - getOStream() << activityTrace->traceResourcesList('\0', pRuntime) << getEOL(); + getOStream() << activityTrace->traceResourcesList('\0', pRuntime) << getEOL(); #endif } void RDOTrace::writeRule(const LPIBaseOperation& opr, const LPRDORuntime& pRuntime) { - if (!canTrace()) - return; - - LPITrace trace = opr.object_dynamic_cast(); - LPIActivityTrace activityTrace = opr.object_dynamic_cast(); - ASSERT(trace); - ASSERT(activityTrace); - - if (trace->traceable()) - { - LPIActivityPatternTrace activityPatternTrace = opr.object_dynamic_cast(); - ASSERT(activityPatternTrace); - int operId = pRuntime->getFreeOperationId(); - getOStream() << "ER " << pRuntime->getCurrentTime() - << " " << operId - << " " << trace->traceId() - << " " << activityPatternTrace->tracePatternId() - << " " << activityTrace->traceResourcesListNumbers(pRuntime, false) - << std::endl << getEOL(); - pRuntime->freeOperationId(operId); - } - getOStream() << activityTrace->traceResourcesList('\0', pRuntime) << getEOL(); + if (!canTrace()) + return; + + LPITrace trace = opr.object_dynamic_cast(); + LPIActivityTrace activityTrace = opr.object_dynamic_cast(); + ASSERT(trace); + ASSERT(activityTrace); + + if (trace->traceable()) + { + LPIActivityPatternTrace activityPatternTrace = opr.object_dynamic_cast(); + ASSERT(activityPatternTrace); + int operId = pRuntime->getFreeOperationId(); + getOStream() << "ER " << pRuntime->getCurrentTime() + << " " << operId + << " " << trace->traceId() + << " " << activityPatternTrace->tracePatternId() + << " " << activityTrace->traceResourcesListNumbers(pRuntime, false) + << std::endl << getEOL(); + pRuntime->freeOperationId(operId); + } + getOStream() << activityTrace->traceResourcesList('\0', pRuntime) << getEOL(); } void RDOTrace::writeAfterOperationBegin(const LPIBaseOperation& opr, const LPRDORuntime& pRuntime) { - if (!canTrace()) - return; - - LPITrace trace = opr.object_dynamic_cast(); - LPIActivityTrace activityTrace = opr.object_dynamic_cast(); - ASSERT(trace); - ASSERT(activityTrace); - - if (trace->traceable()) - { - LPIOperationTrace operationTrace = opr.object_dynamic_cast(); - LPIActivityPatternTrace activityPatternTrace = opr.object_dynamic_cast(); - ASSERT(operationTrace); - ASSERT(activityPatternTrace); - getOStream() << "EB " << pRuntime->getCurrentTime() - << " " << operationTrace->traceOperId() - << " " << trace->traceId() - << " " << activityPatternTrace->tracePatternId() - << " " << activityTrace->traceResourcesListNumbers(pRuntime, false) - << std::endl << getEOL(); - } - getOStream() << activityTrace->traceResourcesList('\0', pRuntime) << getEOL(); + if (!canTrace()) + return; + + LPITrace trace = opr.object_dynamic_cast(); + LPIActivityTrace activityTrace = opr.object_dynamic_cast(); + ASSERT(trace); + ASSERT(activityTrace); + + if (trace->traceable()) + { + LPIOperationTrace operationTrace = opr.object_dynamic_cast(); + LPIActivityPatternTrace activityPatternTrace = opr.object_dynamic_cast(); + ASSERT(operationTrace); + ASSERT(activityPatternTrace); + getOStream() << "EB " << pRuntime->getCurrentTime() + << " " << operationTrace->traceOperId() + << " " << trace->traceId() + << " " << activityPatternTrace->tracePatternId() + << " " << activityTrace->traceResourcesListNumbers(pRuntime, false) + << std::endl << getEOL(); + } + getOStream() << activityTrace->traceResourcesList('\0', pRuntime) << getEOL(); } void RDOTrace::writeAfterOperationEnd(const LPIBaseOperation& opr, const LPRDORuntime& pRuntime) { - if (!canTrace()) - return; - - LPITrace trace = opr.object_dynamic_cast(); - LPIActivityTrace activityTrace = opr.object_dynamic_cast(); - ASSERT(trace); - ASSERT(activityTrace); - - if (trace->traceable()) - { - LPIOperationTrace operationTrace = opr.object_dynamic_cast(); - LPIActivityPatternTrace activityPatternTrace = opr.object_dynamic_cast(); - ASSERT(operationTrace); - ASSERT(activityPatternTrace); - getOStream() << "EF " << pRuntime->getCurrentTime() - << " " << operationTrace->traceOperId() - << " " << trace->traceId() - << " " << activityPatternTrace->tracePatternId() - << " " << activityTrace->traceResourcesListNumbers(pRuntime, false) - << std::endl << getEOL(); - } - getOStream() << activityTrace->traceResourcesList('\0', pRuntime) << getEOL(); + if (!canTrace()) + return; + + LPITrace trace = opr.object_dynamic_cast(); + LPIActivityTrace activityTrace = opr.object_dynamic_cast(); + ASSERT(trace); + ASSERT(activityTrace); + + if (trace->traceable()) + { + LPIOperationTrace operationTrace = opr.object_dynamic_cast(); + LPIActivityPatternTrace activityPatternTrace = opr.object_dynamic_cast(); + ASSERT(operationTrace); + ASSERT(activityPatternTrace); + getOStream() << "EF " << pRuntime->getCurrentTime() + << " " << operationTrace->traceOperId() + << " " << trace->traceId() + << " " << activityPatternTrace->tracePatternId() + << " " << activityTrace->traceResourcesListNumbers(pRuntime, false) + << std::endl << getEOL(); + } + getOStream() << activityTrace->traceResourcesList('\0', pRuntime) << getEOL(); } void RDOTrace::writeTraceBegin(const LPRDORuntime& pRuntime) { - if (isNull()) return; + if (isNull()) return; - getOStream() << "ES " << pRuntime->getCurrentTime() + getOStream() << "ES " << pRuntime->getCurrentTime() << " 1" << std::endl << getEOL(); } void RDOTrace::writeModelBegin(const LPRDORuntime& pRuntime) { - if (isNull()) return; + if (isNull()) return; - getOStream() << "ES " << pRuntime->getCurrentTime() + getOStream() << "ES " << pRuntime->getCurrentTime() << " 3" << std::endl << getEOL(); } void RDOTrace::writeTraceEnd(const LPRDORuntime& pRuntime) { - if (isNull()) return; + if (isNull()) return; getOStream() << "ES " << pRuntime->getCurrentTime() << " 2" << std::endl << getEOL(); @@ -380,92 +380,92 @@ void RDOTrace::writeTraceEnd(const LPRDORuntime& pRuntime) void RDOTrace::writeStatus(const LPRDORuntime& pRuntime, const std::string& status) { - if (isNull()) return; - - // Статус - getOStream() << "$Status = " << status << " " << pRuntime->getCurrentTime() << std::endl << getEOL(); - - // Статистика по поиску на графе - IBaseOperationContainer::CIterator it = pRuntime->m_pMetaLogic->begin(); - while (it != pRuntime->m_pMetaLogic->end()) - { - LPIDPTSearchTraceStatistics dp_stat = it->object_dynamic_cast(); - if (dp_stat) - { - LPITrace dp_trace = dp_stat.object_dynamic_cast(); - ASSERT(dp_trace); - // Информация о точке - getOStream() << std::endl << getEOL(); - getOStream() << "DPS_C" - << " " << dp_trace->getTraceID() - << " " << dp_stat->getCalcCnt() - << " " << dp_stat->getCalcResFoundCnt() - << std::endl << getEOL(); - if (dp_stat->getCalcCnt()) - { - // Время поиска - double d_min = 0; - double d_max = 0; - double d_med = 0; - dp_stat->getStatsDOUBLE(IDPTSearchTraceStatistics::ST_TIMES, d_min, d_max, d_med); - getOStream() << boost::format("DPS_TM %0.3f %0.3f %0.3f") % d_med % d_min % d_max << std::endl << getEOL(); - - // Используемая память - std::size_t ui_min = 0; - std::size_t ui_max = 0; - dp_stat->getStatsRUINT(IDPTSearchTraceStatistics::ST_MEMORY, ui_min, ui_max, d_med); - getOStream() << rdo::format("DPS_ME %0.0f %u %u", d_med, ui_min, ui_max) << std::endl << getEOL(); - - // Стоимость решения - dp_stat->getStatsDOUBLE(IDPTSearchTraceStatistics::ST_COST, d_min, d_max, d_med); - getOStream() << "DPS_CO" - << " " << d_med - << " " << d_min - << " " << d_max - << std::endl << getEOL(); - - // Количество раскрытых вершин - dp_stat->getStatsRUINT(IDPTSearchTraceStatistics::ST_NODES_EXPENDED, ui_min, ui_max, d_med); - getOStream() << rdo::format("DPS_TO %0.0f %u %u", d_med, ui_min, ui_max) << std::endl << getEOL(); - - // Количество вершин в графе - dp_stat->getStatsRUINT(IDPTSearchTraceStatistics::ST_NODES_IN_GRAPH, ui_min, ui_max, d_med); - getOStream() << rdo::format("DPS_TT %0.0f %u %u", d_med, ui_min, ui_max) << std::endl << getEOL(); - - // Количество включавшихся в граф вершин (вершины, соответствующие одному и тому же состоянию системы, могут включаться в граф неоднократно, если порождается вершина с меньшей стоимостью пути) - dp_stat->getStatsRUINT(IDPTSearchTraceStatistics::ST_NODES, ui_min, ui_max, d_med); - getOStream() << rdo::format("DPS_TI %0.0f %u %u", d_med, ui_min, ui_max) << std::endl << getEOL(); - - // Общее количество порожденных вершин-преемников - dp_stat->getStatsRUINT(IDPTSearchTraceStatistics::ST_NODES_FULL, ui_min, ui_max, d_med); - getOStream() << rdo::format("DPS_TG %0.0f %u %u", d_med, ui_min, ui_max) << std::endl << getEOL(); - } - } - ++it; - } - - // Используемая память - getOStream() << std::endl << getEOL(); - getOStream() << "DPS_MM " << pRuntime->memory_get() << std::endl << getEOL(); + if (isNull()) return; + + // Статус + getOStream() << "$Status = " << status << " " << pRuntime->getCurrentTime() << std::endl << getEOL(); + + // Статистика по поиску на графе + IBaseOperationContainer::CIterator it = pRuntime->m_pMetaLogic->begin(); + while (it != pRuntime->m_pMetaLogic->end()) + { + LPIDPTSearchTraceStatistics dp_stat = it->object_dynamic_cast(); + if (dp_stat) + { + LPITrace dp_trace = dp_stat.object_dynamic_cast(); + ASSERT(dp_trace); + // Информация о точке + getOStream() << std::endl << getEOL(); + getOStream() << "DPS_C" + << " " << dp_trace->getTraceID() + << " " << dp_stat->getCalcCnt() + << " " << dp_stat->getCalcResFoundCnt() + << std::endl << getEOL(); + if (dp_stat->getCalcCnt()) + { + // Время поиска + double d_min = 0; + double d_max = 0; + double d_med = 0; + dp_stat->getStatsDOUBLE(IDPTSearchTraceStatistics::Type::TIMES, d_min, d_max, d_med); + getOStream() << boost::format("DPS_TM %0.3f %0.3f %0.3f") % d_med % d_min % d_max << std::endl << getEOL(); + + // Используемая память + std::size_t ui_min = 0; + std::size_t ui_max = 0; + dp_stat->getStatsRUINT(IDPTSearchTraceStatistics::Type::MEMORY, ui_min, ui_max, d_med); + getOStream() << rdo::format("DPS_ME %0.0f %u %u", d_med, ui_min, ui_max) << std::endl << getEOL(); + + // Стоимость решения + dp_stat->getStatsDOUBLE(IDPTSearchTraceStatistics::Type::COST, d_min, d_max, d_med); + getOStream() << "DPS_CO" + << " " << d_med + << " " << d_min + << " " << d_max + << std::endl << getEOL(); + + // Количество раскрытых вершин + dp_stat->getStatsRUINT(IDPTSearchTraceStatistics::Type::NODES_EXPENDED, ui_min, ui_max, d_med); + getOStream() << rdo::format("DPS_TO %0.0f %u %u", d_med, ui_min, ui_max) << std::endl << getEOL(); + + // Количество вершин в графе + dp_stat->getStatsRUINT(IDPTSearchTraceStatistics::Type::NODES_IN_GRAPH, ui_min, ui_max, d_med); + getOStream() << rdo::format("DPS_TT %0.0f %u %u", d_med, ui_min, ui_max) << std::endl << getEOL(); + + // Количество включавшихся в граф вершин (вершины, соответствующие одному и тому же состоянию системы, могут включаться в граф неоднократно, если порождается вершина с меньшей стоимостью пути) + dp_stat->getStatsRUINT(IDPTSearchTraceStatistics::Type::NODES, ui_min, ui_max, d_med); + getOStream() << rdo::format("DPS_TI %0.0f %u %u", d_med, ui_min, ui_max) << std::endl << getEOL(); + + // Общее количество порожденных вершин-преемников + dp_stat->getStatsRUINT(IDPTSearchTraceStatistics::Type::NODES_FULL, ui_min, ui_max, d_med); + getOStream() << rdo::format("DPS_TG %0.0f %u %u", d_med, ui_min, ui_max) << std::endl << getEOL(); + } + } + ++it; + } + + // Используемая память + getOStream() << std::endl << getEOL(); + getOStream() << "DPS_MM " << pRuntime->memory_get() << std::endl << getEOL(); } void RDOTrace::writeResult(const LPRDORuntime& pRuntime, RDOResultTrace* pok) { - if (!canTrace()) - return; + if (!canTrace()) + return; - getOStream() << "V " << pRuntime->getCurrentTime() - << " " << pok->traceId() - << " " << pok->traceValue() << std::endl << getEOL(); + getOStream() << "V " << pRuntime->getCurrentTime() + << " " << pok->traceId() + << " " << pok->traceValue() << std::endl << getEOL(); } // -------------------------------------------------------------------------------- // -------------------- RDOTraceableObject // -------------------------------------------------------------------------------- RDOTraceableObject::RDOTraceableObject(bool trace, std::size_t id, std::string str) - : m_trace (trace) - , m_id (id ) - , m_str_id(str ) + : m_trace (trace) + , m_id (id ) + , m_str_id(str ) {} RDOTraceableObject::~RDOTraceableObject() @@ -473,58 +473,58 @@ RDOTraceableObject::~RDOTraceableObject() bool RDOTraceableObject::traceable() const { - return m_trace; + return m_trace; } void RDOTraceableObject::setTrace(bool trace) { - m_trace = trace; + m_trace = trace; } std::size_t RDOTraceableObject::getTraceID() const { - return m_id; + return m_id; } void RDOTraceableObject::setTraceID(std::size_t id) { - setTraceID(id, id); + setTraceID(id, id); } void RDOTraceableObject::setTraceID(std::size_t id, std::size_t str_id) { - m_id = id; - m_str_id = rdo::toString(str_id); + m_id = id; + m_str_id = rdo::toString(str_id); } std::string& RDOTraceableObject::traceId() const { - if (m_str_id.empty()) - { - m_str_id = rdo::toString(m_id); - } - return m_str_id; + if (m_str_id.empty()) + { + m_str_id = rdo::toString(m_id); + } + return m_str_id; } // -------------------------------------------------------------------------------- // -------------------- RDOResultTrace // -------------------------------------------------------------------------------- RDOResultTrace::RDOResultTrace(const LPRDORuntime& pRuntime, bool trace) - : RDOTraceableObject(trace ) - , m_pRuntime (pRuntime) - , m_wasChanged (true ) + : RDOTraceableObject(trace ) + , m_pRuntime (pRuntime) + , m_wasChanged (true ) { - ASSERT(m_pRuntime); + ASSERT(m_pRuntime); } void RDOResultTrace::traceResult() { - if (!traceable() || !m_wasChanged) - return; + if (!traceable() || !m_wasChanged) + return; - m_pRuntime->getTracer()->writeResult(m_pRuntime, this); - m_wasChanged = false; - return; + m_pRuntime->getTracer()->writeResult(m_pRuntime, this); + m_wasChanged = false; + return; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/rdotrace.h b/simulator/runtime/rdotrace.h index 69b55e9bb..a935ab9b0 100644 --- a/simulator/runtime/rdotrace.h +++ b/simulator/runtime/rdotrace.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_TRACE_H_ -#define _LIB_RUNTIME_TRACE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -28,7 +27,7 @@ PREDECLARE_POINTER(RDORuntime); class RDOEndL { public: - virtual void onEndl(); + virtual void onEndl(); }; std::ostream& operator << (std::ostream& stream, RDOEndL& rdoEndL); @@ -39,90 +38,88 @@ friend class RDOSimulatorTrace; friend class RDOResource; public: - RDOTrace(); - virtual ~RDOTrace(); + RDOTrace(); + virtual ~RDOTrace(); - bool canTrace() const; + bool canTrace() const; - void startWriting(); - void stopWriting(); - bool canWrite() const; - bool isNull() const; + void startWriting(); + void stopWriting(); + bool canWrite() const; + bool isNull() const; - // Search in tree - virtual void writeSearchBegin(double currentTime, std::string decisionPointId); - virtual void writeSearchDecisionHeader(); - virtual void writeSearchDecision(const LPRDORuntime& pRuntime, TreeNode *node); - virtual void writeString(std::string); - virtual void writeSearchOpenNode(int nodeCount, int parentCount, double pathCost, double restCost); - virtual void writeSearchNodeInfo(char sign, TreeNodeTrace *node); - virtual void writeSearchResult(char letter, const LPRDORuntime& pRuntime, TreeRoot *treeRoot); + // Search in tree + virtual void writeSearchBegin(double currentTime, std::string decisionPointId); + virtual void writeSearchDecisionHeader(); + virtual void writeSearchDecision(const LPRDORuntime& pRuntime, TreeNode *node); + virtual void writeString(std::string); + virtual void writeSearchOpenNode(int nodeCount, int parentCount, double pathCost, double restCost); + virtual void writeSearchNodeInfo(char sign, TreeNodeTrace *node); + virtual void writeSearchResult(char letter, const LPRDORuntime& pRuntime, TreeRoot *treeRoot); - virtual void writeEvent (const LPIBaseOperation& opr, const LPRDORuntime& pRuntime); - virtual void writeRule (const LPIBaseOperation& opr, const LPRDORuntime& pRuntime); - virtual void writeAfterOperationBegin(const LPIBaseOperation& opr, const LPRDORuntime& pRuntime); - virtual void writeAfterOperationEnd (const LPIBaseOperation& opr, const LPRDORuntime& pRuntime); + virtual void writeEvent (const LPIBaseOperation& opr, const LPRDORuntime& pRuntime); + virtual void writeRule (const LPIBaseOperation& opr, const LPRDORuntime& pRuntime); + virtual void writeAfterOperationBegin(const LPIBaseOperation& opr, const LPRDORuntime& pRuntime); + virtual void writeAfterOperationEnd (const LPIBaseOperation& opr, const LPRDORuntime& pRuntime); - virtual void writeTraceBegin(const LPRDORuntime& pRuntime); - virtual void writeModelBegin(const LPRDORuntime& pRuntime); - virtual void writeTraceEnd (const LPRDORuntime& pRuntime); - virtual void writeStatus (const LPRDORuntime& pRuntime, const std::string& status); + virtual void writeTraceBegin(const LPRDORuntime& pRuntime); + virtual void writeModelBegin(const LPRDORuntime& pRuntime); + virtual void writeTraceEnd (const LPRDORuntime& pRuntime); + virtual void writeStatus (const LPRDORuntime& pRuntime, const std::string& status); - virtual void writePermanentResources(const LPRDORuntime& pRuntime, const std::list& res_perm); + virtual void writePermanentResources(const LPRDORuntime& pRuntime, const std::list& res_perm); - std::string traceResourcesList( char prefix, const LPRDORuntime& pRuntime, const std::list& rel_res_list); + std::string traceResourcesList( char prefix, const LPRDORuntime& pRuntime, const std::list& rel_res_list); - virtual void writeResult(const LPRDORuntime& pRuntime, RDOResultTrace* pok); + virtual void writeResult(const LPRDORuntime& pRuntime, RDOResultTrace* pok); public: - virtual std::ostream& getOStream(); - virtual RDOEndL& getEOL(); + virtual std::ostream& getOStream(); + virtual RDOEndL& getEOL(); protected: - bool m_isNullTracer; + bool m_isNullTracer; private: - bool m_canWriteToStream; - std::ofstream m_emptyOut; - RDOEndL m_emptyEndL; + bool m_canWriteToStream; + std::ofstream m_emptyOut; + RDOEndL m_emptyEndL; }; class RDOTraceableObject: public ITrace { public: - enum { NONE = 0xFFFFFFFF }; + static const std::size_t NONE = std::size_t(~0); - bool traceable() const; - void setTrace(bool trace); + bool traceable() const; + void setTrace(bool trace); - std::size_t getTraceID() const; - void setTraceID(std::size_t id); - void setTraceID(std::size_t id, std::size_t str_id); + std::size_t getTraceID() const; + void setTraceID(std::size_t id); + void setTraceID(std::size_t id, std::size_t str_id); - std::string& traceId() const; + std::string& traceId() const; protected: - RDOTraceableObject(bool trace, std::size_t id = NONE, std::string str = ""); - virtual ~RDOTraceableObject(); + RDOTraceableObject(bool trace, std::size_t id = NONE, std::string str = std::string()); + virtual ~RDOTraceableObject(); private: - bool m_trace; - std::size_t m_id; - mutable std::string m_str_id; + bool m_trace; + std::size_t m_id; + mutable std::string m_str_id; }; class RDOResultTrace: public RDOTraceableObject, public IResultTrace, public IResultTraceValue { public: - RDOResultTrace(const LPRDORuntime& pRuntime, bool trace); + RDOResultTrace(const LPRDORuntime& pRuntime, bool trace); protected: - LPRDORuntime m_pRuntime; - bool m_wasChanged; + LPRDORuntime m_pRuntime; + bool m_wasChanged; - DECLARE_IResultTrace; + DECLARE_IResultTrace; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_TRACE_H_ diff --git a/simulator/runtime/rdotrace_i.h b/simulator/runtime/rdotrace_i.h index f8dbc039b..f471c2165 100644 --- a/simulator/runtime/rdotrace_i.h +++ b/simulator/runtime/rdotrace_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_TRACE_I_H_ -#define _LIB_RUNTIME_TRACE_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,42 +7,40 @@ class ITrace: public virtual rdo::counter_reference { public: - virtual bool traceable() const = 0; - virtual void setTrace (bool trace) = 0; + virtual bool traceable() const = 0; + virtual void setTrace (bool trace) = 0; - virtual std::size_t getTraceID() const = 0; - virtual void setTraceID(std::size_t id) = 0; - virtual void setTraceID(std::size_t id, std::size_t str_id) = 0; + virtual std::size_t getTraceID() const = 0; + virtual void setTraceID(std::size_t id) = 0; + virtual void setTraceID(std::size_t id, std::size_t str_id) = 0; - virtual std::string& traceId() const = 0; + virtual std::string& traceId() const = 0; }; DECLARE_POINTER(ITrace) #define DECLARE_ITrace \ - virtual bool traceable() const; \ - virtual void setTrace(bool trace); \ - virtual std::size_t getTraceID() const; \ - virtual void setTraceID(std::size_t id); \ - virtual void setTraceID(std::size_t id, std::size_t str_id); \ - virtual std::string& traceId() const ; + virtual bool traceable() const; \ + virtual void setTrace(bool trace); \ + virtual std::size_t getTraceID() const; \ + virtual void setTraceID(std::size_t id); \ + virtual void setTraceID(std::size_t id, std::size_t str_id); \ + virtual std::string& traceId() const ; class IResultTraceValue: public virtual rdo::counter_reference { public: - virtual std::string traceValue() const = 0; + virtual std::string traceValue() const = 0; }; #define DECLARE_IResultTraceValue \ - virtual std::string traceValue() const; + virtual std::string traceValue() const; class IResultTrace: public virtual rdo::counter_reference { public: - virtual void traceResult() = 0; + virtual void traceResult() = 0; }; DECLARE_POINTER(IResultTrace); #define DECLARE_IResultTrace \ - virtual void traceResult(); - -#endif // _LIB_RUNTIME_TRACE_I_H_ + virtual void traceResult(); diff --git a/simulator/runtime/result/result.cpp b/simulator/runtime/result/result.cpp index ee49f18e5..dcbaef2ff 100644 --- a/simulator/runtime/result/result.cpp +++ b/simulator/runtime/result/result.cpp @@ -7,7 +7,7 @@ #include #ifdef COMPILER_GCC - #include + #include #endif // COMPILER_GCC // ----------------------------------------------------------------------- SYNOPSIS #include "utils/src/locale/rdolocale.h" @@ -36,55 +36,55 @@ template class ResultStreamItem { public: - ResultStreamItem(bool predicate, const T& value) - : predicate(predicate) - , value (value ) - {} + ResultStreamItem(bool predicate, const T& value) + : predicate(predicate) + , value (value ) + {} - template - friend std::ostream& operator<< (std::ostream& stream, const ResultStreamItem& item); + template + friend std::ostream& operator<< (std::ostream& stream, const ResultStreamItem& item); private: - bool predicate; - T value; + bool predicate; + T value; }; template inline std::ostream& operator<< (std::ostream& stream, const ResultStreamItem& item) { - if (item.predicate) - { - stream << item.value; - } - else - { - stream << "нет данных"; - } - return stream; + if (item.predicate) + { + stream << item.value; + } + else + { + stream << "нет данных"; + } + return stream; } template <> inline std::ostream& operator<< (std::ostream& stream, const ResultStreamItem& item) { - if (item.predicate) - { - stream << boost::format("%1.6f") % item.value; - } - else - { - stream << "нет данных"; - } - return stream; + if (item.predicate) + { + stream << boost::format("%1.6f") % item.value; + } + else + { + stream << "нет данных"; + } + return stream; } // -------------------------------------------------------------------------------- // -------------------- RDOPMDResult // -------------------------------------------------------------------------------- RDOPMDResult::RDOPMDResult(const LPRDORuntime& pRuntime, const std::string& name, bool trace) - : RDOResultTrace(pRuntime, trace) - , m_name (name ) + : RDOResultTrace(pRuntime, trace) + , m_name (name ) { - setTrace(trace); + setTrace(trace); } RDOPMDResult::~RDOPMDResult() @@ -92,31 +92,31 @@ RDOPMDResult::~RDOPMDResult() const std::string& RDOPMDResult::name() const { - return m_name; + return m_name; } void RDOPMDResult::printLeft(std::ostream& stream, const std::string& txt) { - stream << txt; + stream << txt; - int spaceCnt = 30 - (int)rdo::locale::length(txt); - if (spaceCnt > 0) - { - stream.width(spaceCnt); - stream << " "; - } + int spaceCnt = 30 - (int)rdo::locale::length(txt); + if (spaceCnt > 0) + { + stream.width(spaceCnt); + stream << " "; + } } // -------------------------------------------------------------------------------- // -------------------- RDOPMDWatchPar // -------------------------------------------------------------------------------- RDOPMDWatchPar::RDOPMDWatchPar(const LPRDORuntime& pRuntime, const std::string& name, bool trace, const std::string& /*resName*/, const std::string& /*parName*/, const LPRDOCalc& pResourceCalc, std::size_t paramID) - : RDOPMDResult (pRuntime, name, trace) - , m_pResourceCalc(pResourceCalc ) - , m_paramID (paramID ) - , m_wasFinalCalc (false ) + : RDOPMDResult (pRuntime, name, trace) + , m_pResourceCalc(pResourceCalc ) + , m_paramID (paramID ) + , m_wasFinalCalc (false ) { - pRuntime->notify().connect(this, Notify::RO_BEFOREDELETE); + pRuntime->notify().connect(this, Notify::Message::BEFORE_DELETE); } RDOPMDWatchPar::~RDOPMDWatchPar() @@ -124,108 +124,108 @@ RDOPMDWatchPar::~RDOPMDWatchPar() void RDOPMDWatchPar::notify(std::size_t /*message*/, void* pParam) { - if ((ruint_type)pParam == m_resourceID) - { - m_resourceID = std::size_t(~0); - m_timeErase = m_pRuntime->getCurrentTime(); - } + if ((ruint_type)pParam == m_resourceID) + { + m_resourceID = std::size_t(~0); + m_timeErase = m_pRuntime->getCurrentTime(); + } }; std::string RDOPMDWatchPar::traceValue() const { - return rdo::toString(m_currentValue.rdoValue); + return rdo::toString(m_currentValue.rdoValue); } void RDOPMDWatchPar::resetResult(const LPRDORuntime& pRuntime) { - ASSERT(pRuntime); + ASSERT(pRuntime); - m_pResource = m_pResourceCalc->calcValue(pRuntime).getPointerByType(); - ASSERT(m_pResource); - m_resourceID = m_pResource->getTraceID(); + m_pResource = m_pResourceCalc->calcValue(pRuntime).getPointerByType(); + ASSERT(m_pResource); + m_resourceID = m_pResource->getTraceID(); - m_currentValue = m_pResource->getParam(m_paramID); - m_timePrev = m_timeBegin = m_timeErase = pRuntime->getCurrentTime(); - m_wasFinalCalc = false; + m_currentValue = m_pResource->getParam(m_paramID); + m_timePrev = m_timeBegin = m_timeErase = pRuntime->getCurrentTime(); + m_wasFinalCalc = false; } void RDOPMDWatchPar::checkResult(const LPRDORuntime& pRuntime) { - if (!m_pResource) - return; + if (!m_pResource) + return; - if (m_resourceID == std::size_t(~0)) - return; + if (m_resourceID == std::size_t(~0)) + return; - double currTime = pRuntime->getCurrentTime(); - m_currentValue.weight += currTime - m_timePrev; + double currTime = pRuntime->getCurrentTime(); + m_currentValue.weight += currTime - m_timePrev; - RDOValue newValue = m_pResource->getParam(m_paramID); - if (newValue != m_currentValue.rdoValue) - { - m_acc(m_currentValue.doubleValue, boost::accumulators::weight = m_currentValue.weight); + RDOValue newValue = m_pResource->getParam(m_paramID); + if (newValue != m_currentValue.rdoValue) + { + m_acc(m_currentValue.doubleValue, boost::accumulators::weight = m_currentValue.weight); - m_currentValue = newValue; - m_wasChanged = true; - } + m_currentValue = newValue; + m_wasChanged = true; + } - m_timePrev = currTime; + m_timePrev = currTime; } void RDOPMDWatchPar::calcStat(const LPRDORuntime& pRuntime, std::ostream& stream) { - if (!m_wasFinalCalc) - { - checkResult(pRuntime); + if (!m_wasFinalCalc) + { + checkResult(pRuntime); - m_acc(m_currentValue.doubleValue, boost::accumulators::weight = m_currentValue.weight); + m_acc(m_currentValue.doubleValue, boost::accumulators::weight = m_currentValue.weight); - m_wasFinalCalc = true; - } + m_wasFinalCalc = true; + } - double average = boost::accumulators::weighted_mean(m_acc); - std::size_t count = boost::accumulators::count(m_acc); - double variance = boost::accumulators::weighted_variance(m_acc); + double average = boost::accumulators::weighted_mean(m_acc); + std::size_t count = boost::accumulators::count(m_acc); + double variance = boost::accumulators::weighted_variance(m_acc); - bool averageEnable = count > 0 && fabs(variance) > DBL_EPSILON; - bool varianceEnable = count > 0 && fabs(variance) > DBL_EPSILON; + bool averageEnable = count > 0 && fabs(variance) > DBL_EPSILON; + bool varianceEnable = count > 0 && fabs(variance) > DBL_EPSILON; - double stdDeviation = varianceEnable - ? sqrt(variance) - : 0.0; + double stdDeviation = varianceEnable + ? sqrt(variance) + : 0.0; - double cv = averageEnable - ? (variance / average) * 100.0 - : 0.0; + double cv = averageEnable + ? (variance / average) * 100.0 + : 0.0; - double median = count > 0 - ? boost::accumulators::weighted_median(m_acc) - : 0.0; + double median = count > 0 + ? boost::accumulators::weighted_median(m_acc) + : 0.0; - RDOValue minValue = RDOValue::fromDouble(m_currentValue.rdoValue.type(), (boost::accumulators::min)(m_acc)); - RDOValue maxValue = RDOValue::fromDouble(m_currentValue.rdoValue.type(), (boost::accumulators::max)(m_acc)); + RDOValue minValue = RDOValue::fromDouble(m_currentValue.rdoValue.type(), (boost::accumulators::min)(m_acc)); + RDOValue maxValue = RDOValue::fromDouble(m_currentValue.rdoValue.type(), (boost::accumulators::max)(m_acc)); - printLeft(stream, name()); - stream - << "\t" << "Тип:" << "\t" << "par" - << "\t" << "Посл.знач.:" << "\t" << ResultStreamItem(count > 0, traceValue()) - << "\t" << "Ср.знач.:" << "\t" << ResultStreamItem (count > 0, average ) - << "\t" << "Мин.знач.:" << "\t" << ResultStreamItem(count > 0, minValue ) - << "\t" << "Макс.знач.:" << "\t" << ResultStreamItem(count > 0, maxValue ) - << "\t" << "Числ.наб.:" << "\t" << count - << "\t" << "Стд.откл.:" << "\t" << ResultStreamItem (varianceEnable, stdDeviation) - << "\t" << "К.вар.%:" << "\t" << ResultStreamItem (averageEnable, cv ) - << "\t" << "Медиана:" << "\t" << ResultStreamItem (count > 0, median ) - << '\n'; + printLeft(stream, name()); + stream + << "\t" << "Тип:" << "\t" << "par" + << "\t" << "Посл.знач.:" << "\t" << ResultStreamItem(count > 0, traceValue()) + << "\t" << "Ср.знач.:" << "\t" << ResultStreamItem (count > 0, average ) + << "\t" << "Мин.знач.:" << "\t" << ResultStreamItem(count > 0, minValue ) + << "\t" << "Макс.знач.:" << "\t" << ResultStreamItem(count > 0, maxValue ) + << "\t" << "Числ.наб.:" << "\t" << count + << "\t" << "Стд.откл.:" << "\t" << ResultStreamItem (varianceEnable, stdDeviation) + << "\t" << "К.вар.%:" << "\t" << ResultStreamItem (averageEnable, cv ) + << "\t" << "Медиана:" << "\t" << ResultStreamItem (count > 0, median ) + << '\n'; } // -------------------------------------------------------------------------------- // -------------------- RDOPMDWatchState // -------------------------------------------------------------------------------- RDOPMDWatchState::RDOPMDWatchState(const LPRDORuntime& pRuntime, const std::string& name, bool trace, const LPRDOCalc& pLogic) - : RDOPMDResult (pRuntime, name, trace) - , m_pLogicCalc (pLogic ) - , m_wasFinalCalc(false ) + : RDOPMDResult (pRuntime, name, trace) + , m_pLogicCalc (pLogic ) + , m_wasFinalCalc(false ) {} RDOPMDWatchState::~RDOPMDWatchState() @@ -233,90 +233,90 @@ RDOPMDWatchState::~RDOPMDWatchState() std::string RDOPMDWatchState::traceValue() const { - return m_currentValue.state ? "TRUE" : "FALSE"; + return m_currentValue.state ? "TRUE" : "FALSE"; } void RDOPMDWatchState::resetResult(const LPRDORuntime& pRuntime) { - try - { - m_currentValue = fabs(m_pLogicCalc->calcValue(pRuntime).getDouble()) > DBL_EPSILON; - } - catch (const RDOUndefinedException&) - { - m_currentValue = false; - } - m_timePrev = m_timeBegin = pRuntime->getCurrentTime(); - m_wasFinalCalc = false; + try + { + m_currentValue = fabs(m_pLogicCalc->calcValue(pRuntime).getDouble()) > DBL_EPSILON; + } + catch (const RDOUndefinedException&) + { + m_currentValue = false; + } + m_timePrev = m_timeBegin = pRuntime->getCurrentTime(); + m_wasFinalCalc = false; } void RDOPMDWatchState::checkResult(const LPRDORuntime& pRuntime) { - bool newValue; - try - { - newValue = fabs(m_pLogicCalc->calcValue(pRuntime).getDouble()) > DBL_EPSILON; - } - catch(const RDOUndefinedException&) - { - newValue = false; - } - - double currTime = pRuntime->getCurrentTime(); - m_currentValue.duration += currTime - m_timePrev; - - if (!m_currentValue.state && newValue) //! from FALSE to TRUE - { - m_currentValue = newValue; - m_wasChanged = true; - } - else if (m_currentValue.state && !newValue) //! from TRUE to FALSE - { - m_acc(m_currentValue.duration); - m_currentValue = newValue; - m_wasChanged = true; - } - - m_timePrev = currTime; + bool newValue; + try + { + newValue = fabs(m_pLogicCalc->calcValue(pRuntime).getDouble()) > DBL_EPSILON; + } + catch(const RDOUndefinedException&) + { + newValue = false; + } + + double currTime = pRuntime->getCurrentTime(); + m_currentValue.duration += currTime - m_timePrev; + + if (!m_currentValue.state && newValue) // from FALSE to TRUE + { + m_currentValue = newValue; + m_wasChanged = true; + } + else if (m_currentValue.state && !newValue) // from TRUE to FALSE + { + m_acc(m_currentValue.duration); + m_currentValue = newValue; + m_wasChanged = true; + } + + m_timePrev = currTime; } void RDOPMDWatchState::calcStat(const LPRDORuntime& pRuntime, std::ostream& stream) { - if (!m_wasFinalCalc) - { - if (m_currentValue.state) - { - double currTime = pRuntime->getCurrentTime(); - m_currentValue.duration += currTime - m_timePrev; - m_acc(m_currentValue.duration); - } - - m_wasFinalCalc = true; - } - - double currTime = pRuntime->getCurrentTime(); - double average = boost::accumulators::sum(m_acc) / (currTime - m_timeBegin); - std::size_t count = boost::accumulators::count(m_acc); - - printLeft(stream, name()); - stream - << "\t" << "Тип:" << "\t" << "state" - << "\t" << "Посл.знач.:" << "\t" << traceValue() - << "\t" << "% соотв.:" << "\t" << boost::format("%1.6f") % average - << "\t" << "Мин.длит.:" << "\t" << boost::format("%1.6f") % (count > 0 ? (boost::accumulators::min)(m_acc) : 0) - << "\t" << "Макс.длит.:" << "\t" << boost::format("%1.6f") % (count > 0 ? (boost::accumulators::max)(m_acc) : 0) - << "\t" << "Числ.наб.:" << "\t" << count - << '\n'; + if (!m_wasFinalCalc) + { + if (m_currentValue.state) + { + double currTime = pRuntime->getCurrentTime(); + m_currentValue.duration += currTime - m_timePrev; + m_acc(m_currentValue.duration); + } + + m_wasFinalCalc = true; + } + + double currTime = pRuntime->getCurrentTime(); + double average = boost::accumulators::sum(m_acc) / (currTime - m_timeBegin); + std::size_t count = boost::accumulators::count(m_acc); + + printLeft(stream, name()); + stream + << "\t" << "Тип:" << "\t" << "state" + << "\t" << "Посл.знач.:" << "\t" << traceValue() + << "\t" << "% соотв.:" << "\t" << boost::format("%1.6f") % average + << "\t" << "Мин.длит.:" << "\t" << boost::format("%1.6f") % (count > 0 ? (boost::accumulators::min)(m_acc) : 0) + << "\t" << "Макс.длит.:" << "\t" << boost::format("%1.6f") % (count > 0 ? (boost::accumulators::max)(m_acc) : 0) + << "\t" << "Числ.наб.:" << "\t" << count + << '\n'; } // -------------------------------------------------------------------------------- // -------------------- RDOPMDWatchQuant // -------------------------------------------------------------------------------- RDOPMDWatchQuant::RDOPMDWatchQuant(const LPRDORuntime& pRuntime, const std::string& name, bool trace, const std::string& /*resTypeName*/, int rtpID) - : RDOPMDResult (pRuntime, name, trace) - , m_pLogicCalc (NULL ) - , m_rtpID (rtpID ) - , m_wasFinalCalc(false ) + : RDOPMDResult (pRuntime, name, trace) + , m_pLogicCalc (NULL ) + , m_rtpID (rtpID ) + , m_wasFinalCalc(false ) {} RDOPMDWatchQuant::~RDOPMDWatchQuant() @@ -324,124 +324,124 @@ RDOPMDWatchQuant::~RDOPMDWatchQuant() std::string RDOPMDWatchQuant::traceValue() const { - return rdo::toString(m_currentValue.quant); + return rdo::toString(m_currentValue.quant); } void RDOPMDWatchQuant::resetResult(const LPRDORuntime& pRuntime) { - m_currentValue = 0; - m_timePrev = m_timeBegin = pRuntime->getCurrentTime(); - m_wasFinalCalc = false; + m_currentValue = 0; + m_timePrev = m_timeBegin = pRuntime->getCurrentTime(); + m_wasFinalCalc = false; } std::size_t RDOPMDWatchQuant::calcCurrentQuant(const LPRDORuntime& pRuntime) const { - std::size_t newQuant = 0; - RDORuntime::ResCIterator end = pRuntime->getResType(m_rtpID)->res_end(); - for (RDORuntime::ResCIterator it = pRuntime->getResType(m_rtpID)->res_begin(); it != end; ++it) - { - if (*it == 0) - continue; + std::size_t newQuant = 0; + RDORuntime::ResCIterator end = pRuntime->getResType(m_rtpID)->res_end(); + for (RDORuntime::ResCIterator it = pRuntime->getResType(m_rtpID)->res_begin(); it != end; ++it) + { + if (*it == 0) + continue; - if ((*it)->isNested()) - continue; + if ((*it)->isNested()) + continue; - pRuntime->pushGroupFunc(*it); - if (m_pLogicCalc->calcValue(pRuntime).getAsBool()) - { - newQuant++; - } + pRuntime->pushGroupFunc(*it); + if (m_pLogicCalc->calcValue(pRuntime).getAsBool()) + { + newQuant++; + } - pRuntime->popGroupFunc(); - } - return newQuant; + pRuntime->popGroupFunc(); + } + return newQuant; } void RDOPMDWatchQuant::checkResult(const LPRDORuntime& pRuntime) { - std::size_t newQuant = calcCurrentQuant(pRuntime); + std::size_t newQuant = calcCurrentQuant(pRuntime); - double currTime = pRuntime->getCurrentTime(); - m_currentValue.weight += currTime - m_timePrev; + double currTime = pRuntime->getCurrentTime(); + m_currentValue.weight += currTime - m_timePrev; - if (newQuant != m_currentValue.quant) - { - m_acc(m_currentValue.quant, boost::accumulators::weight = m_currentValue.weight); - m_currentValue = newQuant; - m_wasChanged = true; - } + if (newQuant != m_currentValue.quant) + { + m_acc(m_currentValue.quant, boost::accumulators::weight = m_currentValue.weight); + m_currentValue = newQuant; + m_wasChanged = true; + } - m_timePrev = currTime; + m_timePrev = currTime; } void RDOPMDWatchQuant::calcStat(const LPRDORuntime& pRuntime, std::ostream& stream) { - if (!m_wasFinalCalc) - { - std::size_t newQuant = calcCurrentQuant(pRuntime); - if (newQuant != m_currentValue.quant) - { - m_acc(m_currentValue.quant, boost::accumulators::weight = m_currentValue.weight); - m_currentValue = newQuant; - } - else - { - double currTime = pRuntime->getCurrentTime(); - m_currentValue.weight += currTime - m_timePrev; - } - m_acc(m_currentValue.quant, boost::accumulators::weight = m_currentValue.weight); - - m_wasFinalCalc = true; - } - - double average = boost::accumulators::weighted_mean(m_acc); - std::size_t count = boost::accumulators::count(m_acc); - double variance = boost::accumulators::weighted_variance(m_acc); - - bool averageEnable = count > 0 && fabs(variance) > DBL_EPSILON; - bool varianceEnable = count > 0 && fabs(variance) > DBL_EPSILON; - - double stdDeviation = varianceEnable - ? sqrt(variance) - : 0.0; - - double cv = averageEnable - ? (variance / average) * 100.0 - : 0.0; - - double median = count > 0 - ? boost::accumulators::weighted_median(m_acc) - : 0.0; - - printLeft(stream, name()); - stream - << "\t" << "Тип:" << "\t" << "quant" - << "\t" << "Посл.знач.:" << "\t" << ResultStreamItem(true, traceValue()) - << "\t" << "Ср.знач.:" << "\t" << ResultStreamItem (true, average ) - << "\t" << "Мин.знач.:" << "\t" << ResultStreamItem (true, (int)(boost::accumulators::min)(m_acc)) - << "\t" << "Макс.знач.:" << "\t" << ResultStreamItem (true, (int)(boost::accumulators::max)(m_acc)) - << "\t" << "Числ.наб.:" << "\t" << count - << "\t" << "Стд.откл.:" << "\t" << ResultStreamItem (varianceEnable, stdDeviation) - << "\t" << "К.вар.%:" << "\t" << ResultStreamItem (averageEnable, cv ) - << "\t" << "Медиана:" << "\t" << ResultStreamItem (count > 0, median ) - << '\n'; + if (!m_wasFinalCalc) + { + std::size_t newQuant = calcCurrentQuant(pRuntime); + if (newQuant != m_currentValue.quant) + { + m_acc(m_currentValue.quant, boost::accumulators::weight = m_currentValue.weight); + m_currentValue = newQuant; + } + else + { + double currTime = pRuntime->getCurrentTime(); + m_currentValue.weight += currTime - m_timePrev; + } + m_acc(m_currentValue.quant, boost::accumulators::weight = m_currentValue.weight); + + m_wasFinalCalc = true; + } + + double average = boost::accumulators::weighted_mean(m_acc); + std::size_t count = boost::accumulators::count(m_acc); + double variance = boost::accumulators::weighted_variance(m_acc); + + bool averageEnable = count > 0 && fabs(variance) > DBL_EPSILON; + bool varianceEnable = count > 0 && fabs(variance) > DBL_EPSILON; + + double stdDeviation = varianceEnable + ? sqrt(variance) + : 0.0; + + double cv = averageEnable + ? (variance / average) * 100.0 + : 0.0; + + double median = count > 0 + ? boost::accumulators::weighted_median(m_acc) + : 0.0; + + printLeft(stream, name()); + stream + << "\t" << "Тип:" << "\t" << "quant" + << "\t" << "Посл.знач.:" << "\t" << ResultStreamItem(true, traceValue()) + << "\t" << "Ср.знач.:" << "\t" << ResultStreamItem (true, average ) + << "\t" << "Мин.знач.:" << "\t" << ResultStreamItem (true, (int)(boost::accumulators::min)(m_acc)) + << "\t" << "Макс.знач.:" << "\t" << ResultStreamItem (true, (int)(boost::accumulators::max)(m_acc)) + << "\t" << "Числ.наб.:" << "\t" << count + << "\t" << "Стд.откл.:" << "\t" << ResultStreamItem (varianceEnable, stdDeviation) + << "\t" << "К.вар.%:" << "\t" << ResultStreamItem (averageEnable, cv ) + << "\t" << "Медиана:" << "\t" << ResultStreamItem (count > 0, median ) + << '\n'; } void RDOPMDWatchQuant::setLogicCalc(const LPRDOCalc& pLogicCalc) { - m_pLogicCalc = pLogicCalc; + m_pLogicCalc = pLogicCalc; } // -------------------------------------------------------------------------------- // -------------------- RDOPMDWatchValue // -------------------------------------------------------------------------------- RDOPMDWatchValue::RDOPMDWatchValue(const LPRDORuntime& pRuntime, const std::string& name, bool trace, const std::string& /*resTypeName*/, int rtpID) - : RDOPMDResult (pRuntime, name, trace) - , m_pLogicCalc (NULL ) - , m_pArithmCalc (NULL ) - , m_rtpID (rtpID ) + : RDOPMDResult (pRuntime, name, trace) + , m_pLogicCalc (NULL ) + , m_pArithmCalc (NULL ) + , m_rtpID (rtpID ) { - m_wasChanged = false; + m_wasChanged = false; } RDOPMDWatchValue::~RDOPMDWatchValue() @@ -449,12 +449,12 @@ RDOPMDWatchValue::~RDOPMDWatchValue() std::string RDOPMDWatchValue::traceValue() const { - return rdo::toString(m_currValue); + return rdo::toString(m_currValue); } void RDOPMDWatchValue::resetResult(const LPRDORuntime& /*pRuntime*/) { - m_currValue = 0; + m_currValue = 0; } void RDOPMDWatchValue::checkResult(const LPRDORuntime& /*pRuntime*/) @@ -462,78 +462,78 @@ void RDOPMDWatchValue::checkResult(const LPRDORuntime& /*pRuntime*/) void RDOPMDWatchValue::calcStat(const LPRDORuntime& /*pRuntime*/, std::ostream& stream) { - double average = boost::accumulators::mean(m_acc); - std::size_t count = boost::accumulators::count(m_acc); - double variance = boost::accumulators::variance(m_acc); + double average = boost::accumulators::mean(m_acc); + std::size_t count = boost::accumulators::count(m_acc); + double variance = boost::accumulators::variance(m_acc); - bool averageEnable = count > 0 && fabs(variance) > DBL_EPSILON; - bool varianceEnable = count > 0 && fabs(variance) > DBL_EPSILON; + bool averageEnable = count > 0 && fabs(variance) > DBL_EPSILON; + bool varianceEnable = count > 0 && fabs(variance) > DBL_EPSILON; - double stdDeviation = varianceEnable - ? sqrt(variance) - : 0.0; + double stdDeviation = varianceEnable + ? sqrt(variance) + : 0.0; - double cv = averageEnable - ? (variance / average) * 100.0 - : 0.0; + double cv = averageEnable + ? (variance / average) * 100.0 + : 0.0; - double median = count > 0 - ? boost::accumulators::median(m_acc) - : 0.0; + double median = count > 0 + ? boost::accumulators::median(m_acc) + : 0.0; - RDOValue minValue = RDOValue::fromDouble(m_currValue.type(), (boost::accumulators::min)(m_acc)); - RDOValue maxValue = RDOValue::fromDouble(m_currValue.type(), (boost::accumulators::max)(m_acc)); + RDOValue minValue = RDOValue::fromDouble(m_currValue.type(), (boost::accumulators::min)(m_acc)); + RDOValue maxValue = RDOValue::fromDouble(m_currValue.type(), (boost::accumulators::max)(m_acc)); - printLeft(stream, name()); - stream - << "\t" << "Тип:" << "\t" << "value" - << "\t" << "Ср.знач.:" << "\t" << ResultStreamItem (count > 0, average ) - << "\t" << "Мин.знач.:" << "\t" << ResultStreamItem(count > 0, minValue) - << "\t" << "Макс.знач.:" << "\t" << ResultStreamItem(count > 0, maxValue) - << "\t" << "Числ.наб.:" << "\t" << count - << "\t" << "Стд.откл.:" << "\t" << ResultStreamItem (varianceEnable, stdDeviation) - << "\t" << "К.вар.%:" << "\t" << ResultStreamItem (averageEnable, cv ) - << "\t" << "Медиана:" << "\t" << ResultStreamItem (count > 0, median ) - << '\n'; + printLeft(stream, name()); + stream + << "\t" << "Тип:" << "\t" << "value" + << "\t" << "Ср.знач.:" << "\t" << ResultStreamItem (count > 0, average ) + << "\t" << "Мин.знач.:" << "\t" << ResultStreamItem(count > 0, minValue) + << "\t" << "Макс.знач.:" << "\t" << ResultStreamItem(count > 0, maxValue) + << "\t" << "Числ.наб.:" << "\t" << count + << "\t" << "Стд.откл.:" << "\t" << ResultStreamItem (varianceEnable, stdDeviation) + << "\t" << "К.вар.%:" << "\t" << ResultStreamItem (averageEnable, cv ) + << "\t" << "Медиана:" << "\t" << ResultStreamItem (count > 0, median ) + << '\n'; } void RDOPMDWatchValue::checkResourceErased(const LPRDOResource& pResource) { - if (!pResource->checkType(m_rtpID) || pResource->isNested()) - { - return; - } - m_pRuntime->pushGroupFunc(pResource); - if (m_pLogicCalc->calcValue(m_pRuntime).getAsBool()) - { - m_currValue = m_pArithmCalc->calcValue(m_pRuntime); - m_wasChanged = true; - traceResult(); /// @todo убрать отсюда ? (и перенести DECLARE_IResultTrace в приват) -// pRuntime->getTracer()->writeResult(pRuntime, this); - m_acc(m_currValue.getDouble()); - return; - } - m_pRuntime->popGroupFunc(); - return; + if (!pResource->checkType(m_rtpID) || pResource->isNested()) + { + return; + } + m_pRuntime->pushGroupFunc(pResource); + if (m_pLogicCalc->calcValue(m_pRuntime).getAsBool()) + { + m_currValue = m_pArithmCalc->calcValue(m_pRuntime); + m_wasChanged = true; + traceResult(); // TODO убрать отсюда ? (и перенести DECLARE_IResultTrace в приват) +// pRuntime->getTracer()->writeResult(pRuntime, this); + m_acc(m_currValue.getDouble()); + return; + } + m_pRuntime->popGroupFunc(); + return; } void RDOPMDWatchValue::setLogicCalc(const LPRDOCalc& pLogicCalc) { - m_pLogicCalc = pLogicCalc; + m_pLogicCalc = pLogicCalc; } void RDOPMDWatchValue::setArithmCalc(const LPRDOCalc& pArithmCalc) { - m_pArithmCalc = pArithmCalc; + m_pArithmCalc = pArithmCalc; } // -------------------------------------------------------------------------------- // -------------------- RDOPMDGetValue // -------------------------------------------------------------------------------- RDOPMDGetValue::RDOPMDGetValue(const LPRDORuntime& pRuntime, const std::string& name, const LPRDOCalc& pArithm) - : RDOPMDResult (pRuntime, name, false) - , m_pArithmCalc (pArithm ) - , m_wasFinalCalc(false ) + : RDOPMDResult (pRuntime, name, false) + , m_pArithmCalc (pArithm ) + , m_wasFinalCalc(false ) {} RDOPMDGetValue::~RDOPMDGetValue() @@ -541,12 +541,12 @@ RDOPMDGetValue::~RDOPMDGetValue() std::string RDOPMDGetValue::traceValue() const { - return "ERROR"; + return "ERROR"; } void RDOPMDGetValue::resetResult(const LPRDORuntime& /*pRuntime*/) { - m_wasFinalCalc = false; + m_wasFinalCalc = false; } void RDOPMDGetValue::checkResult(const LPRDORuntime& /*pRuntime*/) @@ -554,47 +554,47 @@ void RDOPMDGetValue::checkResult(const LPRDORuntime& /*pRuntime*/) void RDOPMDGetValue::calcStat(const LPRDORuntime& pRuntime, std::ostream& stream) { - if (!m_wasFinalCalc) - { - m_value = m_pArithmCalc->calcValue(pRuntime); - m_wasFinalCalc = true; - } + if (!m_wasFinalCalc) + { + m_value = m_pArithmCalc->calcValue(pRuntime); + m_wasFinalCalc = true; + } - printLeft(stream, name()); - stream - << "\t" << "Тип:" << "\t" << "get_value" - << "\t" << "Значение:" << "\t" << m_value.getAsString() - << '\n'; + printLeft(stream, name()); + stream + << "\t" << "Тип:" << "\t" << "get_value" + << "\t" << "Значение:" << "\t" << m_value.getAsString() + << '\n'; } const RDOValue& RDOPMDGetValue::getValue() const { - return m_value; + return m_value; } void RDOPMDWatchPar::writeModelStructure(std::ostream& stream) const { - stream << traceId() << " watch_par" << std::endl; + stream << traceId() << " watch_par" << std::endl; } void RDOPMDWatchState::writeModelStructure(std::ostream& stream) const { - stream << traceId() << " watch_state" << std::endl; + stream << traceId() << " watch_state" << std::endl; } void RDOPMDWatchQuant::writeModelStructure(std::ostream& stream) const { - stream << traceId() << " watch_quant" << std::endl; + stream << traceId() << " watch_quant" << std::endl; } void RDOPMDWatchValue::writeModelStructure(std::ostream& stream) const { - stream << traceId() << " watch_value" << std::endl; + stream << traceId() << " watch_value" << std::endl; } void RDOPMDGetValue::writeModelStructure(std::ostream& stream) const { - stream << traceId() << " get_value" << std::endl; + stream << traceId() << " get_value" << std::endl; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/result/result.h b/simulator/runtime/result/result.h index 3050a509b..5daa2d1de 100644 --- a/simulator/runtime/result/result.h +++ b/simulator/runtime/result/result.h @@ -1,11 +1,10 @@ -#ifndef _LIB_RUNTIME_RESULT_H_ -#define _LIB_RUNTIME_RESULT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable: 4510) - #pragma warning(disable: 4512) - #pragma warning(disable: 4610) + #pragma warning(disable: 4510) + #pragma warning(disable: 4512) + #pragma warning(disable: 4610) #endif #include @@ -21,9 +20,9 @@ #include #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(default: 4510) - #pragma warning(default: 4512) - #pragma warning(default: 4610) + #pragma warning(default: 4510) + #pragma warning(default: 4512) + #pragma warning(default: 4610) #endif // ----------------------------------------------------------------------- SYNOPSIS #include "simulator/runtime/rdotrace.h" @@ -40,217 +39,215 @@ OPEN_RDO_RUNTIME_NAMESPACE class RDOPMDResult: public RDOResultTrace, public IName { protected: - RDOPMDResult(const LPRDORuntime& pRuntime, const std::string& name, bool trace); - virtual ~RDOPMDResult(); + RDOPMDResult(const LPRDORuntime& pRuntime, const std::string& name, bool trace); + virtual ~RDOPMDResult(); - static void printLeft(std::ostream& stream, const std::string& txt); + static void printLeft(std::ostream& stream, const std::string& txt); - DECLARE_IName; + DECLARE_IName; private: - std::string m_name; + std::string m_name; }; class RDOPMDWatchPar: public RDOPMDResult, public IResult, public IModelStructure, public INotify { DECLARE_FACTORY(RDOPMDWatchPar); private: - typedef boost::accumulators::accumulator_set< - double, - boost::accumulators::stats< - boost::accumulators::tag::weighted_mean, - boost::accumulators::tag::min, - boost::accumulators::tag::max, - boost::accumulators::tag::count, - boost::accumulators::tag::weighted_variance, - boost::accumulators::tag::weighted_median(boost::accumulators::with_p_square_quantile) - >, - double - > acc_type; - - RDOPMDWatchPar(const LPRDORuntime& pRuntime, const std::string& name, bool trace, const std::string& resName, const std::string& parName, const LPRDOCalc& pResourceCalc, std::size_t paramID); - virtual ~RDOPMDWatchPar(); - - struct CurrentValue - { - RDOValue rdoValue; - double doubleValue; - double weight; - - CurrentValue() - : doubleValue(0.0) - , weight (0.0) - {} - - CurrentValue(const RDOValue& rdoValue) - : rdoValue (rdoValue) - , doubleValue(rdoValue.getDouble()) - , weight (0.0) - {} - }; - - LPRDOResource m_pResource; - LPRDOCalc m_pResourceCalc; - std::size_t m_resourceID; - std::size_t m_paramID; - CurrentValue m_currentValue; - double m_timeBegin; - double m_timePrev; - double m_timeErase; - bool m_wasFinalCalc; - acc_type m_acc; - - DECLARE_INotify; - DECLARE_IResult; - DECLARE_IResultTraceValue; - DECLARE_IModelStructure; + typedef boost::accumulators::accumulator_set< + double, + boost::accumulators::stats< + boost::accumulators::tag::weighted_mean, + boost::accumulators::tag::min, + boost::accumulators::tag::max, + boost::accumulators::tag::count, + boost::accumulators::tag::weighted_variance, + boost::accumulators::tag::weighted_median(boost::accumulators::with_p_square_quantile) + >, + double + > acc_type; + + RDOPMDWatchPar(const LPRDORuntime& pRuntime, const std::string& name, bool trace, const std::string& resName, const std::string& parName, const LPRDOCalc& pResourceCalc, std::size_t paramID); + virtual ~RDOPMDWatchPar(); + + struct CurrentValue + { + RDOValue rdoValue; + double doubleValue; + double weight; + + CurrentValue() + : doubleValue(0.0) + , weight (0.0) + {} + + CurrentValue(const RDOValue& rdoValue) + : rdoValue (rdoValue) + , doubleValue(rdoValue.getDouble()) + , weight (0.0) + {} + }; + + LPRDOResource m_pResource; + LPRDOCalc m_pResourceCalc; + std::size_t m_resourceID; + std::size_t m_paramID; + CurrentValue m_currentValue; + double m_timeBegin; + double m_timePrev; + double m_timeErase; + bool m_wasFinalCalc; + acc_type m_acc; + + DECLARE_INotify; + DECLARE_IResult; + DECLARE_IResultTraceValue; + DECLARE_IModelStructure; }; class RDOPMDWatchState: public RDOPMDResult, public IResult, public IModelStructure { DECLARE_FACTORY(RDOPMDWatchState); private: - typedef boost::accumulators::accumulator_set< - double, - boost::accumulators::stats< - boost::accumulators::tag::sum, - boost::accumulators::tag::min, - boost::accumulators::tag::max, - boost::accumulators::tag::count - > - > acc_type; - - RDOPMDWatchState(const LPRDORuntime& pRuntime, const std::string& name, bool trace, const LPRDOCalc& pLogic); - virtual ~RDOPMDWatchState(); - - struct CurrentValue - { - bool state; - double duration; - - CurrentValue() - : state (false) - , duration(0.0 ) - {} - - CurrentValue(bool state) - : state (state) - , duration(0.0 ) - {} - }; - - LPRDOCalc m_pLogicCalc; - CurrentValue m_currentValue; - double m_timeBegin; - double m_timePrev; - bool m_wasFinalCalc; - acc_type m_acc; - - DECLARE_IResult; - DECLARE_IResultTraceValue; - DECLARE_IModelStructure; + typedef boost::accumulators::accumulator_set< + double, + boost::accumulators::stats< + boost::accumulators::tag::sum, + boost::accumulators::tag::min, + boost::accumulators::tag::max, + boost::accumulators::tag::count + > + > acc_type; + + RDOPMDWatchState(const LPRDORuntime& pRuntime, const std::string& name, bool trace, const LPRDOCalc& pLogic); + virtual ~RDOPMDWatchState(); + + struct CurrentValue + { + bool state; + double duration; + + CurrentValue() + : state (false) + , duration(0.0 ) + {} + + CurrentValue(bool state) + : state (state) + , duration(0.0 ) + {} + }; + + LPRDOCalc m_pLogicCalc; + CurrentValue m_currentValue; + double m_timeBegin; + double m_timePrev; + bool m_wasFinalCalc; + acc_type m_acc; + + DECLARE_IResult; + DECLARE_IResultTraceValue; + DECLARE_IModelStructure; }; class RDOPMDWatchQuant: public RDOPMDResult, public IResult, public IResultWatchQuant, public IModelStructure { DECLARE_FACTORY(RDOPMDWatchQuant); private: - typedef boost::accumulators::accumulator_set< - double, - boost::accumulators::stats< - boost::accumulators::tag::weighted_mean, - boost::accumulators::tag::min, - boost::accumulators::tag::max, - boost::accumulators::tag::count, - boost::accumulators::tag::weighted_variance, - boost::accumulators::tag::weighted_median(boost::accumulators::with_p_square_quantile) - >, - double - > acc_type; - - RDOPMDWatchQuant(const LPRDORuntime& pRuntime, const std::string& name, bool trace, const std::string& resTypeName, int rtpID); - virtual ~RDOPMDWatchQuant(); - - struct CurrentValue - { - std::size_t quant; - double weight; - - CurrentValue() - : quant (0 ) - , weight(0.0) - {} - - CurrentValue(std::size_t quant) - : quant (quant) - , weight(0.0 ) - {} - }; - - LPRDOCalc m_pLogicCalc; - int m_rtpID; - CurrentValue m_currentValue; - double m_timeBegin; - double m_timePrev; - bool m_wasFinalCalc; - acc_type m_acc; - - std::size_t calcCurrentQuant(const LPRDORuntime& pRuntime) const; - - DECLARE_IResult; - DECLARE_IResultTraceValue; - DECLARE_IResultWatchQuant; - DECLARE_IModelStructure; + typedef boost::accumulators::accumulator_set< + double, + boost::accumulators::stats< + boost::accumulators::tag::weighted_mean, + boost::accumulators::tag::min, + boost::accumulators::tag::max, + boost::accumulators::tag::count, + boost::accumulators::tag::weighted_variance, + boost::accumulators::tag::weighted_median(boost::accumulators::with_p_square_quantile) + >, + double + > acc_type; + + RDOPMDWatchQuant(const LPRDORuntime& pRuntime, const std::string& name, bool trace, const std::string& resTypeName, int rtpID); + virtual ~RDOPMDWatchQuant(); + + struct CurrentValue + { + std::size_t quant; + double weight; + + CurrentValue() + : quant (0 ) + , weight(0.0) + {} + + CurrentValue(std::size_t quant) + : quant (quant) + , weight(0.0 ) + {} + }; + + LPRDOCalc m_pLogicCalc; + int m_rtpID; + CurrentValue m_currentValue; + double m_timeBegin; + double m_timePrev; + bool m_wasFinalCalc; + acc_type m_acc; + + std::size_t calcCurrentQuant(const LPRDORuntime& pRuntime) const; + + DECLARE_IResult; + DECLARE_IResultTraceValue; + DECLARE_IResultWatchQuant; + DECLARE_IModelStructure; }; class RDOPMDWatchValue: public RDOPMDResult, public IResult, public IResultWatchValue, public IModelStructure { DECLARE_FACTORY(RDOPMDWatchValue); private: - typedef boost::accumulators::accumulator_set< - double, - boost::accumulators::stats< - boost::accumulators::tag::mean, - boost::accumulators::tag::min, - boost::accumulators::tag::max, - boost::accumulators::tag::count, - boost::accumulators::tag::variance, - boost::accumulators::tag::median(boost::accumulators::with_p_square_quantile) - > - > acc_type; - - RDOPMDWatchValue(const LPRDORuntime& pRuntime, const std::string& name, bool trace, const std::string& resTypeName, int rtpID); - virtual ~RDOPMDWatchValue(); - - LPRDOCalc m_pLogicCalc; - LPRDOCalc m_pArithmCalc; - int m_rtpID; - RDOValue m_currValue; - acc_type m_acc; - - DECLARE_IResult; - DECLARE_IResultTraceValue; - DECLARE_IResultWatchValue; - DECLARE_IModelStructure; + typedef boost::accumulators::accumulator_set< + double, + boost::accumulators::stats< + boost::accumulators::tag::mean, + boost::accumulators::tag::min, + boost::accumulators::tag::max, + boost::accumulators::tag::count, + boost::accumulators::tag::variance, + boost::accumulators::tag::median(boost::accumulators::with_p_square_quantile) + > + > acc_type; + + RDOPMDWatchValue(const LPRDORuntime& pRuntime, const std::string& name, bool trace, const std::string& resTypeName, int rtpID); + virtual ~RDOPMDWatchValue(); + + LPRDOCalc m_pLogicCalc; + LPRDOCalc m_pArithmCalc; + int m_rtpID; + RDOValue m_currValue; + acc_type m_acc; + + DECLARE_IResult; + DECLARE_IResultTraceValue; + DECLARE_IResultWatchValue; + DECLARE_IModelStructure; }; class RDOPMDGetValue: public RDOPMDResult, public IResult, public IResultGetValue, public IModelStructure { DECLARE_FACTORY(RDOPMDGetValue); private: - RDOPMDGetValue(const LPRDORuntime& pRuntime, const std::string& name, const LPRDOCalc& pArithm); - virtual ~RDOPMDGetValue(); + RDOPMDGetValue(const LPRDORuntime& pRuntime, const std::string& name, const LPRDOCalc& pArithm); + virtual ~RDOPMDGetValue(); - LPRDOCalc m_pArithmCalc; - RDOValue m_value; - bool m_wasFinalCalc; + LPRDOCalc m_pArithmCalc; + RDOValue m_value; + bool m_wasFinalCalc; - DECLARE_IResult; - DECLARE_IResultTraceValue; - DECLARE_IResultGetValue; - DECLARE_IModelStructure; + DECLARE_IResult; + DECLARE_IResultTraceValue; + DECLARE_IResultGetValue; + DECLARE_IModelStructure; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_RESULT_H_ diff --git a/simulator/runtime/result/result_group.cpp b/simulator/runtime/result/result_group.cpp index 9edcc2e4b..f8a17c81d 100644 --- a/simulator/runtime/result/result_group.cpp +++ b/simulator/runtime/result/result_group.cpp @@ -16,8 +16,8 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOPMDResult // -------------------------------------------------------------------------------- RDOPMDResultGroup::RDOPMDResultGroup(const std::string& name) - : m_name (name ) - , m_state(name.empty() ? RGS_START : RGS_STOP) + : m_name (name ) + , m_state(name.empty() ? State::START : State::STOP) {} RDOPMDResultGroup::~RDOPMDResultGroup() @@ -25,154 +25,154 @@ RDOPMDResultGroup::~RDOPMDResultGroup() void RDOPMDResultGroup::resetResult(const LPRDORuntime& pRuntime) { - if (m_state == RGS_STOP) - return; - - ASSERT(pRuntime); - - m_timeStart = pRuntime->getCurrentTime(); - - if (!m_name.empty()) - { - if (!m_streamFull.is_open()) - { - LPIThreadProxy pThreadProxy = pRuntime->getThreadProxy(); - ASSERT(pThreadProxy); - rdo::repository::RDOThreadRepository::CreateFileInfo file( - rdo::locale::convertToWStr(boost::str(boost::format("- %1% - full.txt") % m_name)), - m_streamFull - ); - pThreadProxy->sendMessage(IThreadProxy::TID_REPOSITORY, RDOThread::RT_REPOSITORY_CREATE_FILE, &file); - } - if (!m_streamTable.is_open()) - { - LPIThreadProxy pThreadProxy = pRuntime->getThreadProxy(); - ASSERT(pThreadProxy); - rdo::repository::RDOThreadRepository::CreateFileInfo file( - rdo::locale::convertToWStr(boost::str(boost::format("- %1% - table.txt") % m_name)), - m_streamTable - ); - pThreadProxy->sendMessage(IThreadProxy::TID_REPOSITORY, RDOThread::RT_REPOSITORY_CREATE_FILE, &file); - if (m_streamTable.is_open()) - { - for (const LPIResult& pResult: m_resultList) - { - LPIResultGetValue pGetValue = pResult.object_dynamic_cast(); - if (pGetValue) - { - LPIName pName = pGetValue.object_dynamic_cast(); - ASSERT(pName); - m_streamTable << pName->name() << "\t"; - } - } - m_streamTable << std::endl; - } - } - } - - for (LPIResult& pResult: m_resultList) - { - pResult->resetResult(pRuntime); - } + if (m_state == State::STOP) + return; + + ASSERT(pRuntime); + + m_timeStart = pRuntime->getCurrentTime(); + + if (!m_name.empty()) + { + if (!m_streamFull.is_open()) + { + LPIThreadProxy pThreadProxy = pRuntime->getThreadProxy(); + ASSERT(pThreadProxy); + rdo::repository::RDOThreadRepository::CreateFileInfo file( + rdo::locale::convertToWStr(boost::str(boost::format("- %1% - full.txt") % m_name)), + m_streamFull + ); + pThreadProxy->sendMessage(IThreadProxy::ThreadID::REPOSITORY, static_cast(RDOThread::Message::REPOSITORY_CREATE_FILE), &file); + } + if (!m_streamTable.is_open()) + { + LPIThreadProxy pThreadProxy = pRuntime->getThreadProxy(); + ASSERT(pThreadProxy); + rdo::repository::RDOThreadRepository::CreateFileInfo file( + rdo::locale::convertToWStr(boost::str(boost::format("- %1% - table.txt") % m_name)), + m_streamTable + ); + pThreadProxy->sendMessage(IThreadProxy::ThreadID::REPOSITORY, static_cast(RDOThread::Message::REPOSITORY_CREATE_FILE), &file); + if (m_streamTable.is_open()) + { + for (const LPIResult& pResult: m_resultList) + { + LPIResultGetValue pGetValue = pResult.object_dynamic_cast(); + if (pGetValue) + { + LPIName pName = pGetValue.object_dynamic_cast(); + ASSERT(pName); + m_streamTable << pName->name() << "\t"; + } + } + m_streamTable << std::endl; + } + } + } + + for (LPIResult& pResult: m_resultList) + { + pResult->resetResult(pRuntime); + } } void RDOPMDResultGroup::checkResult(const LPRDORuntime& pRuntime) { - if (m_state == RGS_STOP) - return; + if (m_state == State::STOP) + return; - for (LPIResult& pResult: m_resultList) - { - pResult->checkResult(pRuntime); - } + for (LPIResult& pResult: m_resultList) + { + pResult->checkResult(pRuntime); + } } void RDOPMDResultGroup::calcStat(const LPRDORuntime& pRuntime, std::ostream& stream) { - if (m_state == RGS_STOP) - return; - - if (!m_name.empty()) - { - double timeStop = pRuntime->getCurrentTime(); - boost::format header("---> %1%, %2$1.6f -> %3$1.6f = %4$1.6f\n"); - header - % m_name - % m_timeStart - % timeStop - % (timeStop - m_timeStart); - - stream << header.str(); - - if (m_streamFull.is_open()) - { - m_streamFull << header.str(); - } - } - - bool tableWrite = false; - for (LPIResult& pResult: m_resultList) - { - std::stringstream textStream; - - pResult->calcStat(pRuntime, textStream); - - stream << textStream.str(); - if (m_streamFull.is_open()) - { - m_streamFull << textStream.str(); - } - - LPIResultGetValue pGetValue = pResult.object_dynamic_cast(); - if (pGetValue) - { - if (pGetValue->getValue().typeID() != RDOType::t_real) - { - m_streamTable << pGetValue->getValue().getAsString() << "\t"; - } - else - { - m_streamTable << rdo::format("%f", pGetValue->getValue().getDouble()) << "\t"; - } - tableWrite = true; - } - } - - if (tableWrite) - { - m_streamTable << std::endl; - } - - if (!m_name.empty()) - { - boost::format footer("<--- %1%\n"); - footer % m_name; - stream << footer.str(); - if (m_streamFull.is_open()) - { - m_streamFull << footer.str(); - } - } - pRuntime->getResults().flush(); + if (m_state == State::STOP) + return; + + if (!m_name.empty()) + { + double timeStop = pRuntime->getCurrentTime(); + boost::format header("---> %1%, %2$1.6f -> %3$1.6f = %4$1.6f\n"); + header + % m_name + % m_timeStart + % timeStop + % (timeStop - m_timeStart); + + stream << header.str(); + + if (m_streamFull.is_open()) + { + m_streamFull << header.str(); + } + } + + bool tableWrite = false; + for (LPIResult& pResult: m_resultList) + { + std::stringstream textStream; + + pResult->calcStat(pRuntime, textStream); + + stream << textStream.str(); + if (m_streamFull.is_open()) + { + m_streamFull << textStream.str(); + } + + LPIResultGetValue pGetValue = pResult.object_dynamic_cast(); + if (pGetValue) + { + if (pGetValue->getValue().typeID() != RDOType::Type::REAL) + { + m_streamTable << pGetValue->getValue().getAsString() << "\t"; + } + else + { + m_streamTable << rdo::format("%f", pGetValue->getValue().getDouble()) << "\t"; + } + tableWrite = true; + } + } + + if (tableWrite) + { + m_streamTable << std::endl; + } + + if (!m_name.empty()) + { + boost::format footer("<--- %1%\n"); + footer % m_name; + stream << footer.str(); + if (m_streamFull.is_open()) + { + m_streamFull << footer.str(); + } + } + pRuntime->getResults().flush(); } void RDOPMDResultGroup::onStart(const LPRDORuntime& pRuntime) { - m_state = RGS_START; - resetResult(pRuntime); + m_state = State::START; + resetResult(pRuntime); } void RDOPMDResultGroup::onStop(const LPRDORuntime& pRuntime) { - calcStat(pRuntime, pRuntime->getResults().getOStream()); - m_state = RGS_STOP; + calcStat(pRuntime, pRuntime->getResults().getOStream()); + m_state = State::STOP; } void RDOPMDResultGroup::onAppend(const LPIResult& pResult) { - ASSERT(pResult); + ASSERT(pResult); - m_resultList.push_back(pResult); + m_resultList.push_back(pResult); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/result/result_group.h b/simulator/runtime/result/result_group.h index 7bcb999e7..383c613fc 100644 --- a/simulator/runtime/result/result_group.h +++ b/simulator/runtime/result/result_group.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_RESULT_GROUP_H_ -#define _LIB_RUNTIME_RESULT_GROUP_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -13,27 +12,25 @@ class RDOPMDResultGroup: public IResult, public IResultGroup { DECLARE_FACTORY(RDOPMDResultGroup); private: - RDOPMDResultGroup(const std::string& name); - virtual ~RDOPMDResultGroup(); - - enum State - { - RGS_STOP, - RGS_START - }; - - typedef std::vector ResultList; - ResultList m_resultList; - std::string m_name; - State m_state; - double m_timeStart; - boost::filesystem::ofstream m_streamFull; - boost::filesystem::ofstream m_streamTable; - - DECLARE_IResult; - DECLARE_IResultGroup; + RDOPMDResultGroup(const std::string& name); + virtual ~RDOPMDResultGroup(); + + enum class State + { + STOP, + START + }; + + typedef std::vector ResultList; + ResultList m_resultList; + std::string m_name; + State m_state; + double m_timeStart; + boost::filesystem::ofstream m_streamFull; + boost::filesystem::ofstream m_streamTable; + + DECLARE_IResult; + DECLARE_IResultGroup; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_RESULT_GROUP_H_ diff --git a/simulator/runtime/result/result_group_i.h b/simulator/runtime/result/result_group_i.h index e32f995fb..024bc1727 100644 --- a/simulator/runtime/result/result_group_i.h +++ b/simulator/runtime/result/result_group_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_RESULT_GROUP_I_H_ -#define _LIB_RUNTIME_RESULT_GROUP_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -10,15 +9,13 @@ class IResultGroup: public virtual rdo::counter_reference { public: - virtual void onStart (const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual void onStop (const rdo::runtime::LPRDORuntime& pRuntime) = 0; - virtual void onAppend(const LPIResult& pResult ) = 0; + virtual void onStart (const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual void onStop (const rdo::runtime::LPRDORuntime& pRuntime) = 0; + virtual void onAppend(const LPIResult& pResult ) = 0; }; DECLARE_POINTER(IResultGroup) #define DECLARE_IResultGroup \ - void onStart (const rdo::runtime::LPRDORuntime& pRuntime); \ - void onStop (const rdo::runtime::LPRDORuntime& pRuntime); \ - void onAppend(const LPIResult& pResult ); - -#endif // _LIB_RUNTIME_RESULT_GROUP_I_H_ + void onStart (const rdo::runtime::LPRDORuntime& pRuntime); \ + void onStop (const rdo::runtime::LPRDORuntime& pRuntime); \ + void onAppend(const LPIResult& pResult ); diff --git a/simulator/runtime/result/result_i.h b/simulator/runtime/result/result_i.h index 69fa4758b..8381211b9 100644 --- a/simulator/runtime/result/result_i.h +++ b/simulator/runtime/result/result_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_RESULT_I_H_ -#define _LIB_RUNTIME_RESULT_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -11,49 +10,47 @@ class IResult: public virtual rdo::counter_reference { public: - virtual void resetResult(const rdo::runtime::LPRDORuntime& Runtime) = 0; - virtual void checkResult(const rdo::runtime::LPRDORuntime& Runtime) = 0; - virtual void calcStat (const rdo::runtime::LPRDORuntime& Runtime, std::ostream& stream) = 0; + virtual void resetResult(const rdo::runtime::LPRDORuntime& Runtime) = 0; + virtual void checkResult(const rdo::runtime::LPRDORuntime& Runtime) = 0; + virtual void calcStat (const rdo::runtime::LPRDORuntime& Runtime, std::ostream& stream) = 0; }; DECLARE_POINTER(IResult); #define DECLARE_IResult \ - virtual void resetResult(const rdo::runtime::LPRDORuntime& Runtime); \ - virtual void checkResult(const rdo::runtime::LPRDORuntime& Runtime); \ - virtual void calcStat (const rdo::runtime::LPRDORuntime& Runtime, std::ostream& stream); + virtual void resetResult(const rdo::runtime::LPRDORuntime& Runtime); \ + virtual void checkResult(const rdo::runtime::LPRDORuntime& Runtime); \ + virtual void calcStat (const rdo::runtime::LPRDORuntime& Runtime, std::ostream& stream); class IResultWatchQuant: public virtual rdo::counter_reference { public: - virtual void setLogicCalc(const rdo::runtime::LPRDOCalc& pLogicCalc) = 0; + virtual void setLogicCalc(const rdo::runtime::LPRDOCalc& pLogicCalc) = 0; }; DECLARE_POINTER(IResultWatchQuant) #define DECLARE_IResultWatchQuant \ - virtual void setLogicCalc(const rdo::runtime::LPRDOCalc& pLogicCalc); + virtual void setLogicCalc(const rdo::runtime::LPRDOCalc& pLogicCalc); class IResultWatchValue: public virtual rdo::counter_reference { public: - virtual void checkResourceErased(const rdo::runtime::LPRDOResource& pResource ) = 0; - virtual void setLogicCalc (const rdo::runtime::LPRDOCalc& pLogicCalc ) = 0; - virtual void setArithmCalc (const rdo::runtime::LPRDOCalc& pArithmCalc) = 0; + virtual void checkResourceErased(const rdo::runtime::LPRDOResource& pResource ) = 0; + virtual void setLogicCalc (const rdo::runtime::LPRDOCalc& pLogicCalc ) = 0; + virtual void setArithmCalc (const rdo::runtime::LPRDOCalc& pArithmCalc) = 0; }; DECLARE_POINTER(IResultWatchValue); #define DECLARE_IResultWatchValue \ - virtual void checkResourceErased(const rdo::runtime::LPRDOResource& pResource ); \ - virtual void setLogicCalc (const rdo::runtime::LPRDOCalc& pLogicCalc ); \ - virtual void setArithmCalc (const rdo::runtime::LPRDOCalc& pArithmCalc); + virtual void checkResourceErased(const rdo::runtime::LPRDOResource& pResource ); \ + virtual void setLogicCalc (const rdo::runtime::LPRDOCalc& pLogicCalc ); \ + virtual void setArithmCalc (const rdo::runtime::LPRDOCalc& pArithmCalc); class IResultGetValue: public virtual rdo::counter_reference { public: - virtual const rdo::runtime::RDOValue& getValue() const = 0; + virtual const rdo::runtime::RDOValue& getValue() const = 0; }; DECLARE_POINTER(IResultGetValue) #define DECLARE_IResultGetValue \ - const rdo::runtime::RDOValue& getValue() const; - -#endif // _LIB_RUNTIME_RESULT_I_H_ + const rdo::runtime::RDOValue& getValue() const; diff --git a/simulator/runtime/searchtrace.cpp b/simulator/runtime/searchtrace.cpp index 22c3db9f5..5783085ca 100644 --- a/simulator/runtime/searchtrace.cpp +++ b/simulator/runtime/searchtrace.cpp @@ -14,85 +14,85 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDODPTSearchTrace // -------------------------------------------------------------------------------- RDODPTSearchTrace::RDODPTSearchTrace(const LPRDORuntime& pRuntime, LPIBaseOperationContainer parent) - : RDODPTSearch (pRuntime, parent) - , RDOTraceableObject(false ) - , calc_cnt (0 ) - , calc_res_found_cnt(0 ) + : RDODPTSearch (pRuntime, parent) + , RDOTraceableObject(false ) + , calc_cnt (0 ) + , calc_res_found_cnt(0 ) { - traceFlag = DPT_no_trace; + traceFlag = TraceFlag::NO_TRACE; } void RDODPTSearchTrace::onSearchBegin(const LPRDORuntime& pRuntime) { - if (traceFlag != DPT_no_trace) - { - pRuntime->getTracer()->writeSearchBegin(pRuntime->getCurrentTime(), traceId()); - } - if (traceFlag == DPT_trace_tops || traceFlag == DPT_trace_all) - { - pRuntime->getTracer()->writeString("STN 1 0 0 0 -1 -1 0 0"); - } - ++calc_cnt; + if (traceFlag != TraceFlag::NO_TRACE) + { + pRuntime->getTracer()->writeSearchBegin(pRuntime->getCurrentTime(), traceId()); + } + if (traceFlag == TraceFlag::TRACE_TOPS || traceFlag == TraceFlag::TRACE_ALL) + { + pRuntime->getTracer()->writeString("STN 1 0 0 0 -1 -1 0 0"); + } + ++calc_cnt; } void RDODPTSearchTrace::onSearchDecisionHeader(const LPRDORuntime& pRuntime) { - if (traceFlag != DPT_no_trace) - { - pRuntime->getTracer()->writeSearchDecisionHeader(); - } + if (traceFlag != TraceFlag::NO_TRACE) + { + pRuntime->getTracer()->writeSearchDecisionHeader(); + } } void RDODPTSearchTrace::onSearchDecision(const LPRDORuntime& pRuntime, TreeNode* node) { - if (traceFlag != DPT_no_trace) - { - pRuntime->getTracer()->writeSearchDecision(pRuntime, node); - } + if (traceFlag != TraceFlag::NO_TRACE) + { + pRuntime->getTracer()->writeSearchDecision(pRuntime, node); + } } void RDODPTSearchTrace::onSearchResultSuccess(const LPRDORuntime& pRuntime, TreeRoot* treeRoot) { - if (traceFlag != DPT_no_trace) - { - pRuntime->getTracer()->writeSearchResult('S', pRuntime, treeRoot); - } - ++calc_res_found_cnt; - calc_mems.push_back(treeRoot->m_sizeof_dpt); - pRuntime->memory_insert(treeRoot->m_sizeof_dpt); + if (traceFlag != TraceFlag::NO_TRACE) + { + pRuntime->getTracer()->writeSearchResult('S', pRuntime, treeRoot); + } + ++calc_res_found_cnt; + calc_mems.push_back(treeRoot->m_sizeof_dpt); + pRuntime->memory_insert(treeRoot->m_sizeof_dpt); } void RDODPTSearchTrace::onSearchResultNotFound(const LPRDORuntime& pRuntime, TreeRoot *treeRoot) { - if (traceFlag != DPT_no_trace) - { - pRuntime->getTracer()->writeSearchResult('N', pRuntime, treeRoot); - } + if (traceFlag != TraceFlag::NO_TRACE) + { + pRuntime->getTracer()->writeSearchResult('N', pRuntime, treeRoot); + } } // -------------------------------------------------------------------------------- // -------------------- TreeNodeTrace // -------------------------------------------------------------------------------- TreeNodeTrace::TreeNodeTrace(const LPRDORuntime& pRuntime, TreeNode* i_parent, TreeRoot* i_root, LPIDPTSearchActivity i_activity, double cost, int cnt) - : TreeNode(pRuntime, i_parent, i_root, i_activity, cost, cnt) + : TreeNode(pRuntime, i_parent, i_root, i_activity, cost, cnt) {} void TreeNodeTrace::onSearchOpenNode(const LPRDORuntime& pRuntime) { - /// @todo использовать явный cast - RDODPTSearchTrace* dpTrace = (RDODPTSearchTrace *)m_root->m_dp; - if (dpTrace->traceFlag == RDODPTSearchTrace::DPT_trace_tops || dpTrace->traceFlag == RDODPTSearchTrace::DPT_trace_all) - { - pRuntime->getTracer()->writeSearchOpenNode(m_number - , m_parent ? m_parent->m_number : 0 - , m_costPath - , m_costRest); - } + // TODO использовать явный cast + RDODPTSearchTrace* dpTrace = (RDODPTSearchTrace *)m_root->m_dp; + if (dpTrace->traceFlag == RDODPTSearchTrace::TraceFlag::TRACE_TOPS || dpTrace->traceFlag == RDODPTSearchTrace::TraceFlag::TRACE_ALL) + { + pRuntime->getTracer()->writeSearchOpenNode(m_number + , m_parent ? m_parent->m_number : 0 + , m_costPath + , m_costRest); + } } void TreeNodeTrace::onSearchNodeInfoDeleted(const LPRDORuntime& pRuntime) { - pRuntime->getTracer()->writeSearchNodeInfo('D', this); + pRuntime->getTracer()->writeSearchNodeInfo('D', this); } void TreeNodeTrace::onSearchNodeInfoReplaced(const LPRDORuntime& pRuntime) @@ -107,25 +107,25 @@ void TreeNodeTrace::onSearchNodeInfoNew(const LPRDORuntime& pRuntime) TreeNode* TreeNodeTrace::createChildTreeNode() { - m_root->m_sizeof_dpt += sizeof(TreeNode); - return new TreeNodeTrace(m_pChildRuntime, this, m_root, m_currAct, m_costPath, m_root->getNewNodeNumber()); + m_root->m_sizeof_dpt += sizeof(TreeNode); + return new TreeNodeTrace(m_pChildRuntime, this, m_root, m_currAct, m_costPath, m_root->getNewNodeNumber()); } // -------------------------------------------------------------------------------- // -------------------- TreeRootTrace // -------------------------------------------------------------------------------- TreeRootTrace::TreeRootTrace(const LPRDORuntime& pRuntime, RDODPTSearch* pDP) - : TreeRoot(pRuntime, pDP) + : TreeRoot(pRuntime, pDP) {} void TreeRootTrace::createRootTreeNode(const LPRDORuntime& pRuntime) { - m_rootNode = new TreeNodeTrace(pRuntime, NULL, this, NULL, 0, getNewNodeNumber()); - m_rootNode->m_costRule = 0; - m_rootNode->m_costPath = 0; - m_rootNode->m_costRest = 0; - m_OPEN.push_back(m_rootNode); - m_sizeof_dpt += sizeof(TreeNodeTrace) + sizeof(void*); + m_rootNode = new TreeNodeTrace(pRuntime, NULL, this, NULL, 0, getNewNodeNumber()); + m_rootNode->m_costRule = 0; + m_rootNode->m_costPath = 0; + m_rootNode->m_costRest = 0; + m_OPEN.push_back(m_rootNode); + m_sizeof_dpt += sizeof(TreeNodeTrace) + sizeof(void*); } // -------------------------------------------------------------------------------- @@ -133,80 +133,80 @@ void TreeRootTrace::createRootTreeNode(const LPRDORuntime& pRuntime) // -------------------------------------------------------------------------------- TreeRoot* RDODPTSearchTrace::createTreeRoot(const LPRDORuntime& pRuntime) { - TreeRootTrace* root = new TreeRootTrace(pRuntime, this); - root->m_sizeof_dpt = sizeof(TreeRootTrace) + pRuntime->getSizeofSim(); - return root; + TreeRootTrace* root = new TreeRootTrace(pRuntime, this); + root->m_sizeof_dpt = sizeof(TreeRootTrace) + pRuntime->getSizeofSim(); + return root; } std::size_t RDODPTSearchTrace::getCalcCnt() const { - return calc_cnt; + return calc_cnt; } std::size_t RDODPTSearchTrace::getCalcResFoundCnt() const { - return calc_res_found_cnt; + return calc_res_found_cnt; } template void __getStats(const std::list& list, T& min, T& max, double& med) { - T sum = 0; - std::size_t cnt = 0; - typename std::list::const_iterator it = list.begin(); - while (it != list.end()) - { - sum += *it; - if (!cnt) - { - min = *it; - max = *it; - } - ++cnt; - if (min > *it) - min = *it; - if (max < *it) - max = *it; - ++it; - } - if (cnt) - { - med = (double)sum / cnt; - } + T sum = 0; + std::size_t cnt = 0; + typename std::list::const_iterator it = list.begin(); + while (it != list.end()) + { + sum += *it; + if (!cnt) + { + min = *it; + max = *it; + } + ++cnt; + if (min > *it) + min = *it; + if (max < *it) + max = *it; + ++it; + } + if (cnt) + { + med = (double)sum / cnt; + } } void RDODPTSearchTrace::getStatsDOUBLE(Type type, double& min, double& max, double& med) const { - switch (type) - { - case IDPTSearchTraceStatistics::ST_TIMES: - return __getStats(calc_times, min, max, med); - case IDPTSearchTraceStatistics::ST_COST: - return __getStats(calc_cost , min, max, med); - default: - break; - } - NEVER_REACH_HERE; + switch (type) + { + case IDPTSearchTraceStatistics::Type::TIMES: + return __getStats(calc_times, min, max, med); + case IDPTSearchTraceStatistics::Type::COST: + return __getStats(calc_cost , min, max, med); + default: + break; + } + NEVER_REACH_HERE; } void RDODPTSearchTrace::getStatsRUINT(Type type, std::size_t& min, std::size_t& max, double& med) const { - switch (type) - { - case IDPTSearchTraceStatistics::ST_MEMORY: - return __getStats(calc_mems, min, max, med); - case IDPTSearchTraceStatistics::ST_NODES: - return __getStats(calc_nodes, min, max, med); - case IDPTSearchTraceStatistics::ST_NODES_FULL: - return __getStats(calc_nodes_full, min, max, med); - case IDPTSearchTraceStatistics::ST_NODES_EXPENDED: - return __getStats(calc_nodes_expended, min, max, med); - case IDPTSearchTraceStatistics::ST_NODES_IN_GRAPH: - return __getStats(calc_nodes_in_graph, min, max, med); - default: - break; - } - NEVER_REACH_HERE; + switch (type) + { + case IDPTSearchTraceStatistics::Type::MEMORY: + return __getStats(calc_mems, min, max, med); + case IDPTSearchTraceStatistics::Type::NODES: + return __getStats(calc_nodes, min, max, med); + case IDPTSearchTraceStatistics::Type::NODES_FULL: + return __getStats(calc_nodes_full, min, max, med); + case IDPTSearchTraceStatistics::Type::NODES_EXPENDED: + return __getStats(calc_nodes_expended, min, max, med); + case IDPTSearchTraceStatistics::Type::NODES_IN_GRAPH: + return __getStats(calc_nodes_in_graph, min, max, med); + default: + break; + } + NEVER_REACH_HERE; } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/searchtrace.h b/simulator/runtime/searchtrace.h index f754b7383..fbfc9b4ed 100644 --- a/simulator/runtime/searchtrace.h +++ b/simulator/runtime/searchtrace.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_SEARCH_TRACE_H_ -#define _LIB_RUNTIME_SEARCH_TRACE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,47 +15,47 @@ class RDODPTSearchTrace: public RDODPTSearch, public RDOTraceableObject, public { DECLARE_FACTORY(RDODPTSearchTrace); public: - enum DPT_TraceFlag - { - DPT_no_trace, - DPT_trace_stat, - DPT_trace_tops, - DPT_trace_all - }; + enum class TraceFlag + { + NO_TRACE, + TRACE_STAT, + TRACE_TOPS, + TRACE_ALL + }; - void onSearchBegin (const LPRDORuntime& pRuntime); - void onSearchDecisionHeader(const LPRDORuntime& pRuntime); - void onSearchDecision (const LPRDORuntime& pRuntime, TreeNode* node); - void onSearchResultSuccess (const LPRDORuntime& pRuntime, TreeRoot* treeRoot); - void onSearchResultNotFound(const LPRDORuntime& pRuntime, TreeRoot* treeRoot); - TreeRoot* createTreeRoot (const LPRDORuntime& pRuntime); + void onSearchBegin (const LPRDORuntime& pRuntime); + void onSearchDecisionHeader(const LPRDORuntime& pRuntime); + void onSearchDecision (const LPRDORuntime& pRuntime, TreeNode* node); + void onSearchResultSuccess (const LPRDORuntime& pRuntime, TreeRoot* treeRoot); + void onSearchResultNotFound(const LPRDORuntime& pRuntime, TreeRoot* treeRoot); + TreeRoot* createTreeRoot (const LPRDORuntime& pRuntime); - std::size_t calc_cnt; // Количество запусков - std::size_t calc_res_found_cnt; - std::list calc_times; - std::list calc_cost; - std::list calc_mems; - std::list calc_nodes; - std::list calc_nodes_expended; - std::list calc_nodes_full; - std::list calc_nodes_in_graph; + std::size_t calc_cnt; // Количество запусков + std::size_t calc_res_found_cnt; + std::list calc_times; + std::list calc_cost; + std::list calc_mems; + std::list calc_nodes; + std::list calc_nodes_expended; + std::list calc_nodes_full; + std::list calc_nodes_in_graph; - DPT_TraceFlag traceFlag; + TraceFlag traceFlag; protected: - RDODPTSearchTrace(const LPRDORuntime& pRuntime, LPIBaseOperationContainer parent); + RDODPTSearchTrace(const LPRDORuntime& pRuntime, LPIBaseOperationContainer parent); private: - DECLARE_IDPTSearchTraceStatistics; + DECLARE_IDPTSearchTraceStatistics; }; class TreeRootTrace: public TreeRoot { private: - virtual void createRootTreeNode(const LPRDORuntime& pRuntime); + virtual void createRootTreeNode(const LPRDORuntime& pRuntime); public: - TreeRootTrace(const LPRDORuntime& pRuntime, RDODPTSearch* pDP); + TreeRootTrace(const LPRDORuntime& pRuntime, RDODPTSearch* pDP); }; class TreeNodeTrace: public TreeNode @@ -64,16 +63,14 @@ class TreeNodeTrace: public TreeNode friend class RDOTrace; private: - void onSearchOpenNode (const LPRDORuntime& pRuntime); - void onSearchNodeInfoDeleted (const LPRDORuntime& pRuntime); - void onSearchNodeInfoReplaced(const LPRDORuntime& pRuntime); - void onSearchNodeInfoNew (const LPRDORuntime& pRuntime); - TreeNode* createChildTreeNode (); + void onSearchOpenNode (const LPRDORuntime& pRuntime); + void onSearchNodeInfoDeleted (const LPRDORuntime& pRuntime); + void onSearchNodeInfoReplaced(const LPRDORuntime& pRuntime); + void onSearchNodeInfoNew (const LPRDORuntime& pRuntime); + TreeNode* createChildTreeNode (); public: - TreeNodeTrace(const LPRDORuntime& pRuntime, TreeNode* i_parent, TreeRoot* i_root, LPIDPTSearchActivity i_activity, double cost, int cnt); + TreeNodeTrace(const LPRDORuntime& pRuntime, TreeNode* i_parent, TreeRoot* i_root, LPIDPTSearchActivity i_activity, double cost, int cnt); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_SEARCH_TRACE_H_ diff --git a/simulator/runtime/searchtrace_i.h b/simulator/runtime/searchtrace_i.h index e0c6a4308..717b1adf5 100644 --- a/simulator/runtime/searchtrace_i.h +++ b/simulator/runtime/searchtrace_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_SEARCH_TRACE_I_H_ -#define _LIB_RUNTIME_SEARCH_TRACE_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,27 +7,25 @@ class IDPTSearchTraceStatistics: public virtual rdo::counter_reference { public: - enum Type - { - ST_TIMES, - ST_COST, - ST_MEMORY, - ST_NODES, - ST_NODES_EXPENDED, - ST_NODES_FULL, - ST_NODES_IN_GRAPH - }; - virtual std::size_t getCalcCnt() const = 0; - virtual std::size_t getCalcResFoundCnt() const = 0; - virtual void getStatsDOUBLE(Type type, double& min, double& max, double& med) const = 0; - virtual void getStatsRUINT(Type type, std::size_t& min, std::size_t& max, double& med) const = 0; + enum class Type + { + TIMES, + COST, + MEMORY, + NODES, + NODES_EXPENDED, + NODES_FULL, + NODES_IN_GRAPH + }; + virtual std::size_t getCalcCnt() const = 0; + virtual std::size_t getCalcResFoundCnt() const = 0; + virtual void getStatsDOUBLE(Type type, double& min, double& max, double& med) const = 0; + virtual void getStatsRUINT(Type type, std::size_t& min, std::size_t& max, double& med) const = 0; }; DECLARE_POINTER(IDPTSearchTraceStatistics) #define DECLARE_IDPTSearchTraceStatistics \ - virtual std::size_t getCalcCnt() const; \ - virtual std::size_t getCalcResFoundCnt() const; \ - virtual void getStatsDOUBLE(Type type, double& min, double& max, double& med) const; \ - virtual void getStatsRUINT(Type type, std::size_t& min, std::size_t& max, double& med) const; - -#endif // _LIB_RUNTIME_SEARCH_TRACE_I_H_ + virtual std::size_t getCalcCnt() const; \ + virtual std::size_t getCalcResFoundCnt() const; \ + virtual void getStatsDOUBLE(Type type, double& min, double& max, double& med) const; \ + virtual void getStatsRUINT(Type type, std::size_t& min, std::size_t& max, double& med) const; diff --git a/simulator/runtime/searchtree.cpp b/simulator/runtime/searchtree.cpp index dd43c77ac..5fb4adc48 100644 --- a/simulator/runtime/searchtree.cpp +++ b/simulator/runtime/searchtree.cpp @@ -15,17 +15,17 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- TreeRoot // -------------------------------------------------------------------------------- TreeRoot::TreeRoot(const LPRDORuntime& pRuntime, RDODPTSearch* pDP) - : m_dp (pDP ) - , m_rootNode (NULL ) - , m_targetNode (NULL ) - , m_theRealSimulator (pRuntime) - , m_nodesInGraphCount (1 ) //! Учёт начальной вершины - , m_expandedNodesCount(0 ) - , m_fullNodesCount (0 ) - , m_sizeof_dpt (0 ) - , m_nodesCount (0 ) + : m_dp (pDP ) + , m_rootNode (NULL ) + , m_targetNode (NULL ) + , m_theRealSimulator (pRuntime) + , m_nodesInGraphCount (1 ) // Учёт начальной вершины + , m_expandedNodesCount(0 ) + , m_fullNodesCount (0 ) + , m_sizeof_dpt (0 ) + , m_nodesCount (0 ) { - m_ptime = boost::posix_time::microsec_clock::local_time(); + m_ptime = boost::posix_time::microsec_clock::local_time(); } TreeRoot::~TreeRoot() @@ -33,12 +33,12 @@ TreeRoot::~TreeRoot() int TreeRoot::getNodesCound() const { - return m_nodesCount; + return m_nodesCount; } int TreeRoot::getNewNodeNumber() { - return ++m_nodesCount; + return ++m_nodesCount; } // -------------------------------------------------------------------------------- @@ -46,269 +46,269 @@ int TreeRoot::getNewNodeNumber() // -------------------------------------------------------------------------------- bool compareNodes(const TreeNode* tn1, const TreeNode* tn2) { - if (fabs(tn1->m_costRest - tn2->m_costRest) > 0.0000001) - { - return (tn1->m_costRest < tn2->m_costRest); - } - else - { - return (tn1->m_number < tn2->m_number); - } + if (fabs(tn1->m_costRest - tn2->m_costRest) > 0.0000001) + { + return (tn1->m_costRest < tn2->m_costRest); + } + else + { + return (tn1->m_number < tn2->m_number); + } } TreeNode::TreeNode(const LPRDORuntime& pRuntime, TreeNode* pParent, TreeRoot* pRoot, LPIDPTSearchActivity pActivity, double cost, int cnt) - : m_pRuntime (pRuntime ) - , m_parent (pParent ) - , m_root (pRoot ) - , m_activity (pActivity) - , m_costRule (0 ) - , m_costPath (cost ) - , m_costRest (0 ) - , m_number (cnt ) - , m_newCostPath (0 ) - , m_newCostRest (0 ) - , m_newCostRule (0 ) + : m_pRuntime (pRuntime ) + , m_parent (pParent ) + , m_root (pRoot ) + , m_activity (pActivity) + , m_costRule (0 ) + , m_costPath (cost ) + , m_costRest (0 ) + , m_number (cnt ) + , m_newCostPath (0 ) + , m_newCostRest (0 ) + , m_newCostRule (0 ) { - m_pRuntime->onPutToTreeNode(); + m_pRuntime->onPutToTreeNode(); } TreeNode::~TreeNode() { - for(std::vector::iterator i = m_children.begin(); i != m_children.end(); i++) - { - delete (*i); - m_root->m_sizeof_dpt -= sizeof(TreeNode); - } - m_root->m_sizeof_dpt -= m_pRuntime->getSizeofSim(); - m_pRuntime = NULL; + for(std::vector::iterator i = m_children.begin(); i != m_children.end(); i++) + { + delete (*i); + m_root->m_sizeof_dpt -= sizeof(TreeNode); + } + m_root->m_sizeof_dpt -= m_pRuntime->getSizeofSim(); + m_pRuntime = NULL; } void TreeNode::ExpandChildren() { - m_root->m_sizeof_dpt -= (m_pRuntime->getSizeofSim() + sizeof(TreeNode)) * m_children.size(); - std::vector::reverse_iterator it = m_children.rbegin(); - while (it != m_children.rend()) - { - delete *it; - ++it; - } - m_children.clear(); + m_root->m_sizeof_dpt -= (m_pRuntime->getSizeofSim() + sizeof(TreeNode)) * m_children.size(); + std::vector::reverse_iterator it = m_children.rbegin(); + while (it != m_children.rend()) + { + delete *it; + ++it; + } + m_children.clear(); - // Вывели статистику - onSearchOpenNode(m_root->m_theRealSimulator); + // Вывели статистику + onSearchOpenNode(m_root->m_theRealSimulator); - // Проверили на конечную вершину - /// @todo возможно, надо проверить все вершины в списке OPEN - if (m_root->m_dp->TermCondition(m_pRuntime)) - { - m_root->m_targetNode = this; + // Проверили на конечную вершину + // TODO возможно, надо проверить все вершины в списке OPEN + if (m_root->m_dp->TermCondition(m_pRuntime)) + { + m_root->m_targetNode = this; #ifdef _DEBUG - m_pRuntime->showResources(m_number); + m_pRuntime->showResources(m_number); #endif - return; - } + return; + } - // Только для статистики - m_root->m_expandedNodesCount++; + // Только для статистики + m_root->m_expandedNodesCount++; - // Бегаем по всем активностям самой точки - for (RDODPTSearch::ActivityList::iterator i = m_root->m_dp->m_activityList.begin(); i != m_root->m_dp->m_activityList.end(); ++i) - { - m_currAct = *i; - m_pChildRuntime = m_pRuntime->clone(); + // Бегаем по всем активностям самой точки + for (RDODPTSearch::ActivityList::iterator i = m_root->m_dp->m_activityList.begin(); i != m_root->m_dp->m_activityList.end(); ++i) + { + m_currAct = *i; + m_pChildRuntime = m_pRuntime->clone(); #ifdef _DEBUG - if (m_pChildRuntime->checkState()) - { - TRACE1("состояние, node = %d\n", m_number); - } + if (m_pChildRuntime->checkState()) + { + TRACE1("состояние, node = %d\n", m_number); + } #endif - m_root->m_sizeof_dpt += m_pChildRuntime->getSizeofSim(); - m_currAct->rule()->onBeforeChoiceFrom(m_pChildRuntime); - if (!m_currAct->rule()->choiceFrom(m_pChildRuntime)) - { - // Не прошел Choice from, удаляем симулятор и переходим к другой активности. - /// @todo а зачем удалять симулятор, ведь БД не поменялась ? - // Такое будет возможно, если при подготовке параметров паттерна будет - // вызываться calc, на котором весит уведомление по вызову для другого - // объекта, который будут меняться параметры ресурсов - // Пока таких сложных взаимодействий в системе нет. - m_root->m_sizeof_dpt -= m_pChildRuntime->getSizeofSim(); - m_pChildRuntime = NULL; - } - else - { - // Только для статистики - m_root->m_fullNodesCount++; - // Расчитать стоимость применения правила (value before) - if (m_currAct->valueTime() == IDPTSearchActivity::vt_before) - { - m_newCostRule = m_currAct->cost(m_pChildRuntime); - } - // Выполнить само правило (раскрыть вершину) - m_currAct->rule()->onBeforeRule(m_pChildRuntime); - m_currAct->rule()->convertRule(m_pChildRuntime); - m_currAct->rule()->onAfterRule(m_pChildRuntime, true); + m_root->m_sizeof_dpt += m_pChildRuntime->getSizeofSim(); + m_currAct->rule()->onBeforeChoiceFrom(m_pChildRuntime); + if (!m_currAct->rule()->choiceFrom(m_pChildRuntime)) + { + // Не прошел Choice from, удаляем симулятор и переходим к другой активности. + // TODO а зачем удалять симулятор, ведь БД не поменялась ? + // Такое будет возможно, если при подготовке параметров паттерна будет + // вызываться calc, на котором весит уведомление по вызову для другого + // объекта, который будут меняться параметры ресурсов + // Пока таких сложных взаимодействий в системе нет. + m_root->m_sizeof_dpt -= m_pChildRuntime->getSizeofSim(); + m_pChildRuntime = NULL; + } + else + { + // Только для статистики + m_root->m_fullNodesCount++; + // Расчитать стоимость применения правила (value before) + if (m_currAct->costTime() == IDPTSearchActivity::CostTime::BEFORE) + { + m_newCostRule = m_currAct->cost(m_pChildRuntime); + } + // Выполнить само правило (раскрыть вершину) + m_currAct->rule()->onBeforeRule(m_pChildRuntime); + m_currAct->rule()->convertRule(m_pChildRuntime); + m_currAct->rule()->onAfterRule(m_pChildRuntime, true); - // Расчитать стоимость применения правила (value after) - if (m_currAct->valueTime() == IDPTSearchActivity::vt_after) - { - m_newCostRule = m_currAct->cost(m_pChildRuntime); - } - // Расчитали стоимость пути до текущей вершины - m_newCostPath = m_costPath + m_newCostRule; - // Расчитали стоимость пути до цели с учетом оценки - // Именно по этому значению и должен упорядочиваться список OPEN - m_newCostRest = m_newCostPath + m_root->m_dp->EvaluateBy(m_pChildRuntime); + // Расчитать стоимость применения правила (value after) + if (m_currAct->costTime() == IDPTSearchActivity::CostTime::AFTER) + { + m_newCostRule = m_currAct->cost(m_pChildRuntime); + } + // Расчитали стоимость пути до текущей вершины + m_newCostPath = m_costPath + m_newCostRule; + // Расчитали стоимость пути до цели с учетом оценки + // Именно по этому значению и должен упорядочиваться список OPEN + m_newCostRest = m_newCostPath + m_root->m_dp->EvaluateBy(m_pChildRuntime); - // Надо ли сравнивать вершины (запоминать уже пройденные) - // Алгоритм смены родителя - if (m_root->m_dp->NeedCompareTops()) - { - TreeNode* loser = NULL; - NodeFoundInfo res = m_root->m_rootNode->CheckIfExistBetter(m_pChildRuntime, m_newCostPath, &loser); - if (res == nfi_found_better) - { - // В графе есть более лучшая вершина, т.е. текущая активность - // отработала хуже (дороже) до одного и того же состояния. - // Граф перестраивать не надо. - // Вывели трассировку раскрытой вершины. - onSearchNodeInfoDeleted(m_root->m_theRealSimulator); - m_root->m_sizeof_dpt -= m_pChildRuntime->getSizeofSim(); - m_pChildRuntime = NULL; - // Переходим к следующей активности - continue; - } - else if (res == nfi_found_loser) - { + // Надо ли сравнивать вершины (запоминать уже пройденные) + // Алгоритм смены родителя + if (m_root->m_dp->NeedCompareTops()) + { + TreeNode* loser = NULL; + NodeFoundInfo res = m_root->m_rootNode->CheckIfExistBetter(m_pChildRuntime, m_newCostPath, &loser); + if (res == NodeFoundInfo::FOUND_BETTER) + { + // В графе есть более лучшая вершина, т.е. текущая активность + // отработала хуже (дороже) до одного и того же состояния. + // Граф перестраивать не надо. + // Вывели трассировку раскрытой вершины. + onSearchNodeInfoDeleted(m_root->m_theRealSimulator); + m_root->m_sizeof_dpt -= m_pChildRuntime->getSizeofSim(); + m_pChildRuntime = NULL; + // Переходим к следующей активности + continue; + } + else if (res == NodeFoundInfo::FOUND_LOSER) + { #ifdef _DEBUG - if (m_number == 294) - { - TRACE1("loser->m_number = %d\n", loser->m_number); - TRACE1("loser->m_parent->m_number = %d\n", loser->m_parent->m_number); - TRACE1("loser->m_parent->m_children.size() = %d\n", loser->m_parent->m_children.size()); - loser->m_pRuntime->showResources(loser->m_number); - } + if (m_number == 294) + { + TRACE1("loser->m_number = %d\n", loser->m_number); + TRACE1("loser->m_parent->m_number = %d\n", loser->m_parent->m_number); + TRACE1("loser->m_parent->m_children.size() = %d\n", loser->m_parent->m_children.size()); + loser->m_pRuntime->showResources(loser->m_number); + } #endif - // Смена родителя - // В графе нашлась вершина (loser) с более плохой стоимостью пути, - // т.е. текущая активность отработала лучше (дешевле). - // Необходимо перестроить граф - // Сначала отрываем всю ветку от старого родителя loser->parent - loser->m_parent->m_children.erase(std::find(loser->m_parent->m_children.begin(), loser->m_parent->m_children.end(), loser)); + // Смена родителя + // В графе нашлась вершина (loser) с более плохой стоимостью пути, + // т.е. текущая активность отработала лучше (дешевле). + // Необходимо перестроить граф + // Сначала отрываем всю ветку от старого родителя loser->parent + loser->m_parent->m_children.erase(std::find(loser->m_parent->m_children.begin(), loser->m_parent->m_children.end(), loser)); #ifdef _DEBUG - if (m_number == 294) - { - TRACE1("loser->m_parent->m_children.size() after erase = %d\n", loser->m_parent->m_children.size()); - } + if (m_number == 294) + { + TRACE1("loser->m_parent->m_children.size() after erase = %d\n", loser->m_parent->m_children.size()); + } #endif - // Теперь пересчитываем стоимость этой вершины и всех её потомков - /// @todo: а нет ли тут ошибки, т.к. costPath у старой вершины, - // подсчитанная как costPath + newCostRule, может не совпасть - // из-за newCostRule из-за разных стоимостей применения правил, - // т.е. сначла надо обновить loser->costRule (см. ниже), а потом - // вызывать loser->ReCostSubTree( costPath ) - loser->ReCostSubTree(m_costPath); - // Меняем родителя на текущую вершину - loser->m_parent = this; - // Присваеваем ей новый номер - loser->m_number = m_root->getNewNodeNumber(); - // Обновляем стоимости - loser->m_costPath = m_newCostPath; - loser->m_costRest = m_newCostRest; - loser->m_costRule = m_newCostRule; - // Меняем указатель на новую активность - loser->m_activity = m_currAct; - // Тоже, но только для правильного вывода статистики - loser->m_currAct = m_currAct; - // Выводим трассировку по смене родителя - loser->onSearchNodeInfoReplaced(m_root->m_theRealSimulator); - // Добавляем в список потомков текущей - m_children.push_back(loser); - m_root->m_sizeof_dpt -= m_pChildRuntime->getSizeofSim(); - m_pChildRuntime = NULL; + // Теперь пересчитываем стоимость этой вершины и всех её потомков + // TODO: а нет ли тут ошибки, т.к. costPath у старой вершины, + // подсчитанная как costPath + newCostRule, может не совпасть + // из-за newCostRule из-за разных стоимостей применения правил, + // т.е. сначла надо обновить loser->costRule (см. ниже), а потом + // вызывать loser->ReCostSubTree( costPath ) + loser->ReCostSubTree(m_costPath); + // Меняем родителя на текущую вершину + loser->m_parent = this; + // Присваеваем ей новый номер + loser->m_number = m_root->getNewNodeNumber(); + // Обновляем стоимости + loser->m_costPath = m_newCostPath; + loser->m_costRest = m_newCostRest; + loser->m_costRule = m_newCostRule; + // Меняем указатель на новую активность + loser->m_activity = m_currAct; + // Тоже, но только для правильного вывода статистики + loser->m_currAct = m_currAct; + // Выводим трассировку по смене родителя + loser->onSearchNodeInfoReplaced(m_root->m_theRealSimulator); + // Добавляем в список потомков текущей + m_children.push_back(loser); + m_root->m_sizeof_dpt -= m_pChildRuntime->getSizeofSim(); + m_pChildRuntime = NULL; #ifdef _DEBUG - if (m_number == 294) - { - loser->m_pRuntime->showResources(loser->m_number); - } + if (m_number == 294) + { + loser->m_pRuntime->showResources(loser->m_number); + } #endif - // Переходим к следующей активности - continue; - } - } + // Переходим к следующей активности + continue; + } + } - // Не нашли в графе такого состояния - // Его надо запомнить. Создадим для этого новую вершину - TreeNode* tn = createChildTreeNode(); - m_root->m_nodesInGraphCount++; - tn->m_costPath = m_newCostPath; - tn->m_costRest = m_newCostRest; - tn->m_costRule = m_newCostRule; - tn->m_currAct = m_currAct; - // Выведем трассировку - tn->onSearchNodeInfoNew(m_root->m_theRealSimulator); - // Добавим к списку потомков текущей - m_children.push_back(tn); + // Не нашли в графе такого состояния + // Его надо запомнить. Создадим для этого новую вершину + TreeNode* tn = createChildTreeNode(); + m_root->m_nodesInGraphCount++; + tn->m_costPath = m_newCostPath; + tn->m_costRest = m_newCostRest; + tn->m_costRule = m_newCostRule; + tn->m_currAct = m_currAct; + // Выведем трассировку + tn->onSearchNodeInfoNew(m_root->m_theRealSimulator); + // Добавим к списку потомков текущей + m_children.push_back(tn); /* - if(!root->m_dp->TermCondition(pChildRuntime)) - root->OPEN.push_back(tn); - else - { - root->targetNode = tn; - } + if(!root->m_dp->TermCondition(pChildRuntime)) + root->OPEN.push_back(tn); + else + { + root->targetNode = tn; + } */ - // Добавим в список OPEN - m_root->m_OPEN.push_back(tn); - } - } - // Удалим текущую вершину из списка OPEN - m_root->m_OPEN.erase(std::find(m_root->m_OPEN.begin(), m_root->m_OPEN.end(), this)); + // Добавим в список OPEN + m_root->m_OPEN.push_back(tn); + } + } + // Удалим текущую вершину из списка OPEN + m_root->m_OPEN.erase(std::find(m_root->m_OPEN.begin(), m_root->m_OPEN.end(), this)); - // Отсортируем все вершины в списке OPEN - std::sort(m_root->m_OPEN.begin(), m_root->m_OPEN.end(), compareNodes); + // Отсортируем все вершины в списке OPEN + std::sort(m_root->m_OPEN.begin(), m_root->m_OPEN.end(), compareNodes); } TreeNode::NodeFoundInfo TreeNode::CheckIfExistBetter(const LPRDORuntime& pChildRuntime, double useCost, TreeNode** loser) { - ASSERT(pChildRuntime); + ASSERT(pChildRuntime); - if (pChildRuntime->equal(m_pRuntime)) - { - if (m_costPath <= useCost) - { - return nfi_found_better; - } - else - { - *loser = this; - return nfi_found_loser; - } - } + if (pChildRuntime->equal(m_pRuntime)) + { + if (m_costPath <= useCost) + { + return NodeFoundInfo::FOUND_BETTER; + } + else + { + *loser = this; + return NodeFoundInfo::FOUND_LOSER; + } + } - for (std::vector::iterator i = m_children.begin(); i != m_children.end(); ++i) - { - NodeFoundInfo res = (*i)->CheckIfExistBetter(pChildRuntime, useCost, loser); - if (res != nfi_notfound) - return res; - } + for (std::vector::const_iterator it = m_children.begin(); it != m_children.end(); ++it) + { + NodeFoundInfo res = (*it)->CheckIfExistBetter(pChildRuntime, useCost, loser); + if (res != NodeFoundInfo::NOT_FOUND) + return res; + } - return nfi_notfound; + return NodeFoundInfo::NOT_FOUND; } void TreeNode::ReCostSubTree(double cost) { - m_costPath = cost + m_costRule; + m_costPath = cost + m_costRule; - for (std::vector::iterator i = m_children.begin(); i != m_children.end(); ++i) - { - (*i)->ReCostSubTree(m_costPath); - } + for (std::vector::iterator i = m_children.begin(); i != m_children.end(); ++i) + { + (*i)->ReCostSubTree(m_costPath); + } } TreeNode* TreeNode::createChildTreeNode() { - m_root->m_sizeof_dpt += sizeof(TreeNode); - return new TreeNode(m_pChildRuntime, this, m_root, m_currAct, m_costPath, m_root->getNewNodeNumber()); + m_root->m_sizeof_dpt += sizeof(TreeNode); + return new TreeNode(m_pChildRuntime, this, m_root, m_currAct, m_costPath, m_root->getNewNodeNumber()); } void TreeNode::onSearchOpenNode(const LPRDORuntime& /*pRuntime*/) diff --git a/simulator/runtime/searchtree.h b/simulator/runtime/searchtree.h index fc9720174..5fcd64013 100644 --- a/simulator/runtime/searchtree.h +++ b/simulator/runtime/searchtree.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_SEARCH_TREE_H_ -#define _LIB_RUNTIME_SEARCH_TREE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -15,77 +14,73 @@ class TreeNode; class TreeRoot { public: - virtual ~TreeRoot(); + virtual ~TreeRoot(); - virtual void createRootTreeNode(const LPRDORuntime& pRuntime) = 0; + virtual void createRootTreeNode(const LPRDORuntime& pRuntime) = 0; - std::vector m_OPEN; - RDODPTSearch* m_dp; - TreeNode* m_rootNode; - TreeNode* m_targetNode; - LPRDORuntime m_theRealSimulator; - int m_nodesInGraphCount; - int m_expandedNodesCount; - int m_fullNodesCount; - boost::posix_time::ptime m_ptime; - std::size_t m_sizeof_dpt; + std::vector m_OPEN; + RDODPTSearch* m_dp; + TreeNode* m_rootNode; + TreeNode* m_targetNode; + LPRDORuntime m_theRealSimulator; + int m_nodesInGraphCount; + int m_expandedNodesCount; + int m_fullNodesCount; + boost::posix_time::ptime m_ptime; + std::size_t m_sizeof_dpt; - int getNodesCound() const; - int getNewNodeNumber(); + int getNodesCound() const; + int getNewNodeNumber(); protected: - TreeRoot(const LPRDORuntime& pRuntime, RDODPTSearch* pDP); + TreeRoot(const LPRDORuntime& pRuntime, RDODPTSearch* pDP); private: - int m_nodesCount; + int m_nodesCount; }; class TreeNode { public: - virtual ~TreeNode(); - - LPRDORuntime m_pRuntime; - std::vector m_children; - TreeNode* m_parent; - TreeRoot* m_root; - LPIDPTSearchActivity m_activity; // активность (currAct), которую применил предок при создании this - double m_costRule; - double m_costPath; - double m_costRest; - int m_number; // Номер узла - - void ExpandChildren(); - - enum NodeFoundInfo - { - nfi_notfound = 0, - nfi_found_better = 1, - nfi_found_loser = 2 - }; - - /// @todo задокументировать функцию - // return 0 - no such simulator, 1 - exist better, 2 - exist not better - NodeFoundInfo CheckIfExistBetter(const LPRDORuntime& pChildRuntime, double useCost, TreeNode** better ); - void ReCostSubTree(double cost); + virtual ~TreeNode(); + + LPRDORuntime m_pRuntime; + std::vector m_children; + TreeNode* m_parent; + TreeRoot* m_root; + LPIDPTSearchActivity m_activity; // активность (currAct), которую применил предок при создании this + double m_costRule; + double m_costPath; + double m_costRest; + int m_number; // Номер узла + + void ExpandChildren(); + + enum class NodeFoundInfo + { + NOT_FOUND, + FOUND_BETTER, + FOUND_LOSER + }; + + NodeFoundInfo CheckIfExistBetter(const LPRDORuntime& pChildRuntime, double useCost, TreeNode** better ); + void ReCostSubTree(double cost); protected: - TreeNode(const LPRDORuntime& pRuntime, TreeNode* pParent, TreeRoot* pRoot, LPIDPTSearchActivity pActivity, double cost, int cnt); + TreeNode(const LPRDORuntime& pRuntime, TreeNode* pParent, TreeRoot* pRoot, LPIDPTSearchActivity pActivity, double cost, int cnt); - LPIDPTSearchActivity m_currAct; // вершина пытается применять различные активности - LPRDORuntime m_pChildRuntime; + LPIDPTSearchActivity m_currAct; // вершина пытается применять различные активности + LPRDORuntime m_pChildRuntime; - double m_newCostPath; - double m_newCostRest; - double m_newCostRule; + double m_newCostPath; + double m_newCostRest; + double m_newCostRule; - virtual void onSearchOpenNode (const LPRDORuntime& pRuntime); - virtual void onSearchNodeInfoDeleted (const LPRDORuntime& pRuntime); - virtual void onSearchNodeInfoReplaced(const LPRDORuntime& pRuntime); - virtual void onSearchNodeInfoNew (const LPRDORuntime& pRuntime); - virtual TreeNode* createChildTreeNode (); + virtual void onSearchOpenNode (const LPRDORuntime& pRuntime); + virtual void onSearchNodeInfoDeleted (const LPRDORuntime& pRuntime); + virtual void onSearchNodeInfoReplaced(const LPRDORuntime& pRuntime); + virtual void onSearchNodeInfoNew (const LPRDORuntime& pRuntime); + virtual TreeNode* createChildTreeNode (); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_SEARCH_TREE_H_ diff --git a/simulator/runtime/set_operation_type.cpp b/simulator/runtime/set_operation_type.cpp index 2b9924008..421e15c36 100644 --- a/simulator/runtime/set_operation_type.cpp +++ b/simulator/runtime/set_operation_type.cpp @@ -7,20 +7,20 @@ OPEN_RDO_RUNTIME_NAMESPACE -std::string SetOperationType::toString(Type type) +std::string SetOperation::toString(Type type) { - switch (type) - { - case NOCHANGE : return ""; - case SET : return "="; - case ADDITION : return "+="; - case SUBTRACTION: return "-="; - case MULTIPLY : return "*="; - case DIVIDE : return "/="; - case INCREMENT : return "++"; - case DECRIMENT : return "--"; - default: NEVER_REACH_HERE; return ""; - } + switch (type) + { + case Type::NOCHANGE : return std::string(); + case Type::SET : return "="; + case Type::ADDITION : return "+="; + case Type::SUBTRACTION: return "-="; + case Type::MULTIPLY : return "*="; + case Type::DIVIDE : return "/="; + case Type::INCREMENT : return "++"; + case Type::DECRIMENT : return "--"; + default: NEVER_REACH_HERE; return std::string(); + } } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/set_operation_type.h b/simulator/runtime/set_operation_type.h index a9ba86e65..550eb152f 100644 --- a/simulator/runtime/set_operation_type.h +++ b/simulator/runtime/set_operation_type.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_SET_OPERATION_TYPE_H_ -#define _LIB_RUNTIME_SET_OPERATION_TYPE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -9,23 +8,21 @@ OPEN_RDO_RUNTIME_NAMESPACE -struct SetOperationType +struct SetOperation { - enum Type - { - NOCHANGE, - SET, - ADDITION, - SUBTRACTION, - MULTIPLY, - DIVIDE, - INCREMENT, - DECRIMENT - }; + enum class Type + { + NOCHANGE, + SET, + ADDITION, + SUBTRACTION, + MULTIPLY, + DIVIDE, + INCREMENT, + DECRIMENT + }; - static std::string toString(Type type); + static std::string toString(Type type); }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_SET_OPERATION_TYPE_H_ diff --git a/simulator/runtime/simtrace.cpp b/simulator/runtime/simtrace.cpp index 8ff582cd2..9dcde3358 100644 --- a/simulator/runtime/simtrace.cpp +++ b/simulator/runtime/simtrace.cpp @@ -1,10 +1,9 @@ // ----------------------------------------------------------------------- PLATFORM -#include - #include "utils/src/common/platform.h" // ---------------------------------------------------------------------------- PCH #include "simulator/runtime/pch/stdpch.h" // ----------------------------------------------------------------------- INCLUDES +#include // ----------------------------------------------------------------------- SYNOPSIS #include "utils/src/debug/rdodebug.h" #include "simulator/runtime/simtrace.h" @@ -15,7 +14,7 @@ // -------------------------------------------------------------------------------- #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable : 4786) + #pragma warning(disable : 4786) #endif // COMPILER_VISUAL_STUDIO OPEN_RDO_RUNTIME_NAMESPACE @@ -23,217 +22,219 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------------------------------------------------------------------- // -------------------- RDOSimulatorTrace // -------------------------------------------------------------------------------- +const double RDOSimulatorTrace::UNDEFINE_TIME = -1.0; + RDOSimulatorTrace::RDOSimulatorTrace() - : RDOSimulator ( ) - , m_tracer (NULL ) - , maxOperationId (1 ) - , traceStartTime (UNDEFINE_TIME) - , traceEndTime (UNDEFINE_TIME) - , m_ieCounter (1 ) - , m_eventCounter (1 ) - , m_activityCounter(1 ) - , m_dptCounter (1 ) - , memory_current (0 ) - , memory_max (0 ) + : RDOSimulator ( ) + , m_tracer (NULL ) + , maxOperationId (1 ) + , traceStartTime (UNDEFINE_TIME) + , traceEndTime (UNDEFINE_TIME) + , m_ieCounter (1 ) + , m_eventCounter (1 ) + , m_activityCounter(1 ) + , m_dptCounter (1 ) + , memory_current (0 ) + , memory_max (0 ) {} RDOSimulatorTrace::~RDOSimulatorTrace() { - if (m_tracer) - { - delete m_tracer; - m_tracer = NULL; - } + if (m_tracer) + { + delete m_tracer; + m_tracer = NULL; + } } RDOTrace* RDOSimulatorTrace::getTracer() const { - return m_tracer; + return m_tracer; } bool RDOSimulatorTrace::canTrace() const { - return getTracer()->canTrace(); + return getTracer()->canTrace(); } double RDOSimulatorTrace::getTraceStartTime() const { - return traceStartTime; + return traceStartTime; } void RDOSimulatorTrace::setTraceStartTime(double value) { - traceStartTime = value; + traceStartTime = value; } double RDOSimulatorTrace::getTraceEndTime() const { - return traceEndTime; + return traceEndTime; } void RDOSimulatorTrace::setTraceEndTime(double value) { - traceEndTime = value; + traceEndTime = value; } void RDOSimulatorTrace::onNewTimeNow() { - if (timeForTrace()) - { - getTracer()->startWriting(); - } - else - { - getTracer()->stopWriting(); - } + if (timeForTrace()) + { + getTracer()->startWriting(); + } + else + { + getTracer()->stopWriting(); + } } void RDOSimulatorTrace::memory_insert(std::size_t mem) { - memory_current += mem; - if (memory_current > memory_max) memory_max = memory_current; + memory_current += mem; + if (memory_current > memory_max) memory_max = memory_current; } void RDOSimulatorTrace::memory_remove(std::size_t mem) { - memory_current -= mem; + memory_current -= mem; } std::size_t RDOSimulatorTrace::memory_get() const { - return memory_max; + return memory_max; } int RDOSimulatorTrace::getFreeEventId() { - return m_eventCounter++; + return m_eventCounter++; } int RDOSimulatorTrace::getFreeActivityId() { - return m_activityCounter++; + return m_activityCounter++; } int RDOSimulatorTrace::getFreeDPTId() { - return m_dptCounter++; + return m_dptCounter++; } bool RDOSimulatorTrace::timeForTrace() const { - if (getTraceStartTime() != UNDEFINE_TIME && getTraceStartTime() > getCurrentTime()) - return false; - if (getTraceEndTime() != UNDEFINE_TIME && getTraceEndTime() < getCurrentTime()) - return false; - return true; + if (getTraceStartTime() != UNDEFINE_TIME && getTraceStartTime() > getCurrentTime()) + return false; + if (getTraceEndTime() != UNDEFINE_TIME && getTraceEndTime() < getCurrentTime()) + return false; + return true; } void RDOSimulatorTrace::copyFrom(const LPRDOSimulatorTrace& pOther) { - ASSERT(pOther); + ASSERT(pOther); - registeredResourcesId = pOther->registeredResourcesId; + registeredResourcesId = pOther->registeredResourcesId; } void RDOSimulatorTrace::rdoInit() { - maxOperationId = 1; - registeredResourcesId.clear(); -// ASSERT(m_tracer != NULL); - RDOSimulator::rdoInit(); + maxOperationId = 1; + registeredResourcesId.clear(); +// ASSERT(m_tracer != NULL); + RDOSimulator::rdoInit(); } void RDOSimulatorTrace::registerResourceId(std::size_t id) { - ASSERT(registeredResourcesId.find(id) == registeredResourcesId.end()); - registeredResourcesId.insert(id); + ASSERT(registeredResourcesId.find(id) == registeredResourcesId.end()); + registeredResourcesId.insert(id); } std::size_t RDOSimulatorTrace::getResourceId() { #ifdef _DEBUG - for (const auto& id: registeredResourcesId) - { - TRACE1("getRegisteredResourcesId: %d\n", id); - } + for (const auto& id: registeredResourcesId) + { + TRACE1("getRegisteredResourcesId: %d\n", id); + } #endif - std::size_t id = 0; - std::set::iterator it = registeredResourcesId.begin(); - while (it != registeredResourcesId.end() && *it == id) - { - ++it; - ++id; - } - return id; + std::size_t id = 0; + std::set::iterator it = registeredResourcesId.begin(); + while (it != registeredResourcesId.end() && *it == id) + { + ++it; + ++id; + } + return id; } void RDOSimulatorTrace::eraseFreeResourceId(std::size_t id) { - MAPII::iterator it = resourcesIdsRefs.find(id); - if (it != resourcesIdsRefs.end()) - { - if(--(*it).second >= 1) return; - resourcesIdsRefs.erase(it); - } - registeredResourcesId.erase(id); + MAPII::iterator it = resourcesIdsRefs.find(id); + if (it != resourcesIdsRefs.end()) + { + if(--(*it).second >= 1) return; + resourcesIdsRefs.erase(it); + } + registeredResourcesId.erase(id); } void RDOSimulatorTrace::incrementResourceIdReference(int id) { - MAPII::iterator it = resourcesIdsRefs.find(id); - if (it == resourcesIdsRefs.end()) - { - resourcesIdsRefs.insert(MAPII::value_type(id, 2)); - } - else - { - (*it).second++; - } + MAPII::iterator it = resourcesIdsRefs.find(id); + if (it == resourcesIdsRefs.end()) + { + resourcesIdsRefs.insert(MAPII::value_type(id, 2)); + } + else + { + (*it).second++; + } } int RDOSimulatorTrace::getFreeOperationId() { - if (freeOperationsIds.empty()) - { - return maxOperationId++; - } - else - { - int id = freeOperationsIds.front(); - freeOperationsIds.pop_front(); - return id; - } + if (freeOperationsIds.empty()) + { + return maxOperationId++; + } + else + { + int id = freeOperationsIds.front(); + freeOperationsIds.pop_front(); + return id; + } } void RDOSimulatorTrace::freeOperationId(int id) { - freeOperationsIds.push_front(id); + freeOperationsIds.push_front(id); } void RDOSimulatorTrace::onResourceErase(const LPRDOResource& pResource) { - eraseFreeResourceId(pResource->getTraceID()); + eraseFreeResourceId(pResource->getTraceID()); } void RDOSimulatorTrace::preProcess() { - RDOSimulator::preProcess(); - getTracer()->startWriting(); - LPRDORuntime pRuntime = static_cast(this); - getTracer()->writeTraceBegin(pRuntime); - getTracer()->writePermanentResources(pRuntime, getResourcesBeforeSim()); - getTracer()->writeModelBegin(pRuntime); - getTracer()->startWriting(); - onCheckResult(); - onAfterCheckResult(); + RDOSimulator::preProcess(); + getTracer()->startWriting(); + LPRDORuntime pRuntime = static_cast(this); + getTracer()->writeTraceBegin(pRuntime); + getTracer()->writePermanentResources(pRuntime, getResourcesBeforeSim()); + getTracer()->writeModelBegin(pRuntime); + getTracer()->startWriting(); + onCheckResult(); + onAfterCheckResult(); } void RDOSimulatorTrace::postProcess() { - LPRDORuntime pRuntime = static_cast(this); - getTracer()->writeTraceEnd(pRuntime); -// getTracer()->stopWriting(); + LPRDORuntime pRuntime = static_cast(this); + getTracer()->writeTraceEnd(pRuntime); +// getTracer()->stopWriting(); } CLOSE_RDO_RUNTIME_NAMESPACE diff --git a/simulator/runtime/simtrace.h b/simulator/runtime/simtrace.h index 91bd26083..f43e8abe7 100644 --- a/simulator/runtime/simtrace.h +++ b/simulator/runtime/simtrace.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_SIM_TRACE_H_ -#define _LIB_RUNTIME_SIM_TRACE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -22,82 +21,80 @@ class RDOSimulatorTrace: public RDOSimulator { DECLARE_FACTORY(RDOSimulatorTrace) public: - enum { UNDEFINE_TIME = -1 }; + static const double UNDEFINE_TIME; - virtual void rdoInit(); + virtual void rdoInit(); - RDOTrace* getTracer() const; - bool canTrace() const; + RDOTrace* getTracer() const; + bool canTrace() const; - double getTraceStartTime() const; - void setTraceStartTime(double value); + double getTraceStartTime() const; + void setTraceStartTime(double value); - double getTraceEndTime() const; - void setTraceEndTime(double value); + double getTraceEndTime() const; + void setTraceEndTime(double value); - virtual void onNewTimeNow(); + virtual void onNewTimeNow(); - void memory_insert(std::size_t mem); - void memory_remove(std::size_t mem); - std::size_t memory_get() const; + void memory_insert(std::size_t mem); + void memory_remove(std::size_t mem); + std::size_t memory_get() const; - void registerResourceId(std::size_t id); - std::size_t getResourceId(); - void incrementResourceIdReference(int id); + void registerResourceId(std::size_t id); + std::size_t getResourceId(); + void incrementResourceIdReference(int id); - void freeOperationId(int id); - int getFreeOperationId(); - void onResourceErase(const LPRDOResource& pResource); + void freeOperationId(int id); + int getFreeOperationId(); + void onResourceErase(const LPRDOResource& pResource); - int getFreeEventId(); - int getFreeActivityId(); + int getFreeEventId(); + int getFreeActivityId(); - int getFreeDPTId(); + int getFreeDPTId(); protected: - RDOSimulatorTrace(); - virtual ~RDOSimulatorTrace(); + RDOSimulatorTrace(); + virtual ~RDOSimulatorTrace(); - void copyFrom(const LPRDOSimulatorTrace& pOther); + void copyFrom(const LPRDOSimulatorTrace& pOther); - RDOTrace* m_tracer; + RDOTrace* m_tracer; - int maxOperationId; + int maxOperationId; - virtual void preProcess(); - virtual void postProcess(); - void checkRSSDefinedResources(); + virtual void preProcess(); + virtual void postProcess(); + void checkRSSDefinedResources(); - virtual std::list getResourcesBeforeSim() const = 0; + virtual std::list getResourcesBeforeSim() const = 0; private: - double traceStartTime; - double traceEndTime; + double traceStartTime; + double traceEndTime; - std::set registeredResourcesId; + std::set registeredResourcesId; - typedef std::map MAPII; - MAPII resourcesIdsRefs; - std::list freeOperationsIds; + typedef std::map MAPII; + MAPII resourcesIdsRefs; + std::list freeOperationsIds; - void eraseFreeResourceId(std::size_t id); + void eraseFreeResourceId(std::size_t id); - int m_ieCounter; - int m_eventCounter; - int m_activityCounter; - int m_dptCounter; + int m_ieCounter; + int m_eventCounter; + int m_activityCounter; + int m_dptCounter; - void addTemplateDecisionPoint(RDODPTSearchTrace *dp ); - void addTemplateEvent (RDOEvent *ev ); - void addTemplateRule (RDORule *rule); - void addTemplateOperation (RDOOperation *op ); + void addTemplateDecisionPoint(RDODPTSearchTrace *dp ); + void addTemplateEvent (RDOEvent *ev ); + void addTemplateRule (RDORule *rule); + void addTemplateOperation (RDOOperation *op ); - std::size_t memory_current; - std::size_t memory_max; + std::size_t memory_current; + std::size_t memory_max; - bool timeForTrace() const; + bool timeForTrace() const; }; CLOSE_RDO_RUNTIME_NAMESPACE - -#endif // _LIB_RUNTIME_SIM_TRACE_H_ diff --git a/simulator/runtime/test/array/main.cpp b/simulator/runtime/test/array/main.cpp index 0c9ad7f05..f94bc0eda 100644 --- a/simulator/runtime/test/array/main.cpp +++ b/simulator/runtime/test/array/main.cpp @@ -3,9 +3,10 @@ // ----------------------------------------------------------------------- INCLUDES #define BOOST_TEST_MODULE RDORuntime_Array_Test #include "utils/src/common/warning_disable.h" +#include #include #include -#include +#include #include "utils/src/common/warning_enable.h" // ----------------------------------------------------------------------- SYNOPSIS #include "simulator/runtime/rdo_value.h" @@ -16,266 +17,240 @@ BOOST_AUTO_TEST_SUITE(RDORuntime_Array_Test) -typedef rdo::vector Container; +typedef std::vector Container; typedef std::pair Array; Array createArray(const Container& data) { - rdo::runtime::LPRDOArrayType pType = rdo::Factory::create(rdo::runtime::g_int); - ASSERT(pType); - rdo::runtime::LPRDOArrayValue pValue = rdo::Factory::create(pType); - ASSERT(pValue); + rdo::runtime::LPRDOArrayType pType = rdo::Factory::create(rdo::runtime::g_INT); + ASSERT(pType); + rdo::runtime::LPRDOArrayValue pValue = rdo::Factory::create(pType); + ASSERT(pValue); - for (const auto& item: data) - { - pValue->push_back(rdo::runtime::RDOValue(item)); - } + for (const auto& item: data) + pValue->push_back(rdo::runtime::RDOValue(item)); - return std::make_pair(pValue, rdo::runtime::RDOValue(pType, pValue)); + return std::make_pair(pValue, rdo::runtime::RDOValue(pType, pValue)); } std::string getString(const rdo::runtime::LPRDOArrayValue& pArray, const rdo::runtime::LPRDOArrayIterator& pIt) { - if (!pIt->equal(pArray->end())) - { - return pIt->getValue().getAsString(); - } - return ""; + return !pIt->equal(pArray->end()) + ? pIt->getValue().getAsString() + : std::string(); } std::string getString(const rdo::runtime::RDOValue& it, const rdo::runtime::RDOValue& end) { - if (it != end) - { - return it.getAsString(); - } - return ""; + return it != end + ? it.getAsString() + : std::string(); } BOOST_AUTO_TEST_CASE(ArrayTestCreate) { - BOOST_CHECK(createArray(Container()(1)(2)(3)).second.getAsString() == "[1, 2, 3]"); + BOOST_CHECK(createArray({1, 2, 3}).second.getAsString() == "[1, 2, 3]"); } BOOST_AUTO_TEST_CASE(ArrayTestInsert) { - Array array1 = createArray(Container()(1)(2)(3)); - Array array2 = createArray(Container()(4)(5)(6)); + Array array1 = createArray({1, 2, 3}); + Array array2 = createArray({4, 5, 6}); - array1.first->insert(array1.first->begin()->next(), array2.first->begin(), array2.first->end()); + array1.first->insert(array1.first->begin()->next(), array2.first->begin(), array2.first->end()); - BOOST_CHECK(array1.second.getAsString() == "[1, 4, 5, 6, 2, 3]"); + BOOST_CHECK(array1.second.getAsString() == "[1, 4, 5, 6, 2, 3]"); } BOOST_AUTO_TEST_CASE(ArrayTestErase) { - Array array = createArray(Container()(1)(2)(3)); + Array array = createArray({1, 2, 3}); - array.first->erase(array.first->begin()->next(), array.first->begin()->preInc(3)); + array.first->erase(array.first->begin()->next(), array.first->begin()->preInc(3)); - BOOST_CHECK(array.second.getAsString() == "[1]"); + BOOST_CHECK(array.second.getAsString() == "[1]"); } BOOST_AUTO_TEST_CASE(ArrayTestIteratorPrePlus) { - Array array = createArray(Container()(1)(2)(3)); - - std::string result; - rdo::runtime::LPRDOArrayIterator pIt = array.first->begin(); - while (!pIt->equal(array.first->end())) - { - result += getString(array.first, pIt->preInc(1)); - } - BOOST_CHECK(result == "23"); + Array array = createArray({1, 2, 3}); + + std::string result; + rdo::runtime::LPRDOArrayIterator pIt = array.first->begin(); + while (!pIt->equal(array.first->end())) + result += getString(array.first, pIt->preInc(1)); + + BOOST_CHECK(result == "23"); } BOOST_AUTO_TEST_CASE(ArrayTestIteratorPostPlus) { - Array array = createArray(Container()(1)(2)(3)); - - std::string result; - rdo::runtime::LPRDOArrayIterator pIt = array.first->begin(); - while (!pIt->equal(array.first->end())) - { - result += getString(array.first, pIt->postInc(1)); - } - BOOST_CHECK(result == "123"); + Array array = createArray({1, 2, 3}); + + std::string result; + rdo::runtime::LPRDOArrayIterator pIt = array.first->begin(); + while (!pIt->equal(array.first->end())) + result += getString(array.first, pIt->postInc(1)); + + BOOST_CHECK(result == "123"); } BOOST_AUTO_TEST_CASE(ArrayTestIteratorPreMinus) { - Array array = createArray(Container()(1)(2)(3)); + Array array = createArray({1, 2, 3}); - std::string result; - rdo::runtime::LPRDOArrayIterator pIt = array.first->end(); - do - { - result += getString(array.first, pIt->preInc(-1)); - } - while (!pIt->equal(array.first->begin())); + std::string result; + rdo::runtime::LPRDOArrayIterator pIt = array.first->end(); + do + result += getString(array.first, pIt->preInc(-1)); + while (!pIt->equal(array.first->begin())); - BOOST_CHECK(result == "321"); + BOOST_CHECK(result == "321"); } BOOST_AUTO_TEST_CASE(ArrayTestIteratorPostMinus) { - Array array = createArray(Container()(1)(2)(3)); + Array array = createArray({1, 2, 3}); - std::string result; - rdo::runtime::LPRDOArrayIterator pIt = array.first->end(); - do - { - result += getString(array.first, pIt->postInc(-1)); - } - while (!pIt->equal(array.first->begin())); + std::string result; + rdo::runtime::LPRDOArrayIterator pIt = array.first->end(); + do + result += getString(array.first, pIt->postInc(-1)); + while (!pIt->equal(array.first->begin())); - BOOST_CHECK(result == "32"); + BOOST_CHECK(result == "32"); } BOOST_AUTO_TEST_CASE(ArrayTestValuePrePlus) { - Array array = createArray(Container()(1)(2)(3)); - - std::string result; - rdo::runtime::LPRDOArrayIterator pIt = array.first->begin(); - rdo::runtime::LPRDOArrayIterator pEnd = array.first->end (); - rdo::runtime::RDOValue it (pIt, pIt ); - rdo::runtime::RDOValue end(pEnd, pEnd); - BOOST_CHECK(it != end); - - while (it != end) - { - result += getString(++it, end); - } - BOOST_CHECK(result == "23"); + Array array = createArray({1, 2, 3}); + + std::string result; + rdo::runtime::LPRDOArrayIterator pIt = array.first->begin(); + rdo::runtime::LPRDOArrayIterator pEnd = array.first->end (); + rdo::runtime::RDOValue it (pIt, pIt ); + rdo::runtime::RDOValue end(pEnd, pEnd); + BOOST_CHECK(it != end); + + while (it != end) + result += getString(++it, end); + + BOOST_CHECK(result == "23"); } BOOST_AUTO_TEST_CASE(ArrayTestValuePostPlus) { - Array array = createArray(Container()(1)(2)(3)); - - std::string result; - rdo::runtime::LPRDOArrayIterator pIt = array.first->begin(); - rdo::runtime::LPRDOArrayIterator pEnd = array.first->end (); - rdo::runtime::RDOValue it (pIt, pIt ); - rdo::runtime::RDOValue end(pEnd, pEnd); - BOOST_CHECK(it != end); - - while (it != end) - { - result += getString(it++, end); - } - BOOST_CHECK(result == "123"); + Array array = createArray({1, 2, 3}); + + std::string result; + rdo::runtime::LPRDOArrayIterator pIt = array.first->begin(); + rdo::runtime::LPRDOArrayIterator pEnd = array.first->end (); + rdo::runtime::RDOValue it (pIt, pIt ); + rdo::runtime::RDOValue end(pEnd, pEnd); + BOOST_CHECK(it != end); + + while (it != end) + result += getString(it++, end); + + BOOST_CHECK(result == "123"); } BOOST_AUTO_TEST_CASE(ArrayTestValuePreMinus) { - Array array = createArray(Container()(1)(2)(3)); - - std::string result; - rdo::runtime::LPRDOArrayIterator pIt = array.first->end (); - rdo::runtime::LPRDOArrayIterator pBegin = array.first->begin(); - rdo::runtime::LPRDOArrayIterator pEnd = array.first->end (); - rdo::runtime::RDOValue it (pIt, pIt ); - rdo::runtime::RDOValue begin(pBegin, pBegin); - rdo::runtime::RDOValue end (pEnd, pEnd ); - BOOST_CHECK(it != begin); - BOOST_CHECK(it == end ); - - do - { - result += getString(--it, end); - } - while (it != begin); - BOOST_CHECK(result == "321"); + Array array = createArray({1, 2, 3}); + + std::string result; + rdo::runtime::LPRDOArrayIterator pIt = array.first->end (); + rdo::runtime::LPRDOArrayIterator pBegin = array.first->begin(); + rdo::runtime::LPRDOArrayIterator pEnd = array.first->end (); + rdo::runtime::RDOValue it (pIt, pIt ); + rdo::runtime::RDOValue begin(pBegin, pBegin); + rdo::runtime::RDOValue end (pEnd, pEnd ); + BOOST_CHECK(it != begin); + BOOST_CHECK(it == end ); + + do + result += getString(--it, end); + while (it != begin); + BOOST_CHECK(result == "321"); } BOOST_AUTO_TEST_CASE(ArrayTestValuePostMinus) { - Array array = createArray(Container()(1)(2)(3)); - - std::string result; - rdo::runtime::LPRDOArrayIterator pIt = array.first->end (); - rdo::runtime::LPRDOArrayIterator pBegin = array.first->begin(); - rdo::runtime::LPRDOArrayIterator pEnd = array.first->end (); - rdo::runtime::RDOValue it (pIt, pIt ); - rdo::runtime::RDOValue begin(pBegin, pBegin); - rdo::runtime::RDOValue end (pEnd, pEnd ); - BOOST_CHECK(it != begin); - BOOST_CHECK(it == end ); - - do - { - result += getString(it--, end); - } - while (it != begin); - BOOST_CHECK(result == "32"); + Array array = createArray({1, 2, 3}); + + std::string result; + rdo::runtime::LPRDOArrayIterator pIt = array.first->end (); + rdo::runtime::LPRDOArrayIterator pBegin = array.first->begin(); + rdo::runtime::LPRDOArrayIterator pEnd = array.first->end (); + rdo::runtime::RDOValue it (pIt, pIt ); + rdo::runtime::RDOValue begin(pBegin, pBegin); + rdo::runtime::RDOValue end (pEnd, pEnd ); + BOOST_CHECK(it != begin); + BOOST_CHECK(it == end ); + + do + result += getString(it--, end); + while (it != begin); + BOOST_CHECK(result == "32"); } BOOST_AUTO_TEST_CASE(ArrayTestSetItem) { - Array array = createArray(Container()(1)(2)(3)); - - std::size_t ind = 1; - std::size_t item = 48; - rdo::runtime::RDOValue index(ind); - rdo::runtime::RDOValue value(item); - array.first->setItem(index, value); - - BOOST_CHECK(array.second.getAsString() == "[1, 48, 3]"); - - ind = 3; - index = ind; - bool found = false; - - try - { - array.first->setItem(index, value); - } - catch (const rdo::runtime::RDORuntimeException& ex) - { - if (!ex.message().empty()) - { - found = ex.message() == "Выход за пределы массива"; - } - } - - if (!found) - { - BOOST_CHECK(false); - } + Array array = createArray({1, 2, 3}); + + std::size_t ind = 1; + std::size_t item = 48; + rdo::runtime::RDOValue index(ind); + rdo::runtime::RDOValue value(item); + array.first->setItem(index, value); + + BOOST_CHECK(array.second.getAsString() == "[1, 48, 3]"); + + ind = 3; + index = ind; + bool found = false; + + try + { + array.first->setItem(index, value); + } + catch (const rdo::runtime::RDORuntimeException& ex) + { + if (!ex.message().empty()) + found = ex.message() == "Выход за пределы массива"; + } + + if (!found) + BOOST_CHECK(false); } BOOST_AUTO_TEST_CASE(ArrayTestGetItem) { - Array array = createArray(Container()(1)(48)(3)); - - std::size_t ind = 1; - rdo::runtime::RDOValue index(ind); - rdo::runtime::RDOValue value(array.first->getItem(index)); - - BOOST_CHECK(value.getAsString() == "48"); - - ind = 3; - index = ind; - bool found = false; - - try - { - array.first->getItem(index); - } - catch (const rdo::runtime::RDORuntimeException& ex) - { - if (!ex.message().empty()) - { - found = ex.message() == "Выход за пределы массива"; - } - } - - if (!found) - { - BOOST_CHECK(false); - } + Array array = createArray({1, 48, 3}); + + std::size_t ind = 1; + rdo::runtime::RDOValue index(ind); + rdo::runtime::RDOValue value(array.first->getItem(index)); + + BOOST_CHECK(value.getAsString() == "48"); + + ind = 3; + index = ind; + bool found = false; + + try + { + array.first->getItem(index); + } + catch (const rdo::runtime::RDORuntimeException& ex) + { + if (!ex.message().empty()) + found = ex.message() == "Выход за пределы массива"; + } + + if (!found) + BOOST_CHECK(false); } BOOST_AUTO_TEST_SUITE_END() // RDORuntime_Array_Test diff --git a/simulator/runtime/test/calc/main.cpp b/simulator/runtime/test/calc/main.cpp index d2e1a0de3..e96aa9263 100644 --- a/simulator/runtime/test/calc/main.cpp +++ b/simulator/runtime/test/calc/main.cpp @@ -28,281 +28,281 @@ typedef boost::tuple CalcTriple; template RDOValue calc(const CalcTriple& calcTriple) { - BOOST_CHECK(calcTriple.get<0>()); - BOOST_CHECK(calcTriple.get<1>()); - BOOST_CHECK(calcTriple.get<2>()); + BOOST_CHECK(calcTriple.get<0>()); + BOOST_CHECK(calcTriple.get<1>()); + BOOST_CHECK(calcTriple.get<2>()); - rdo::intrusive_ptr pCalc = rdo::Factory::create(calcTriple.get<1>(), calcTriple.get<2>()); - ASSERT(pCalc); + rdo::intrusive_ptr pCalc = rdo::Factory::create(calcTriple.get<1>(), calcTriple.get<2>()); + ASSERT(pCalc); - return pCalc->calcValue(calcTriple.get<0>()); + return pCalc->calcValue(calcTriple.get<0>()); } CalcTriple prepair() { - static Error error; - LPRDORuntime pRuntime = rdo::Factory::create(&error); - BOOST_CHECK(pRuntime); + static Error error; + LPRDORuntime pRuntime = rdo::Factory::create(&error); + BOOST_CHECK(pRuntime); - LPRDOCalc pLeft = rdo::Factory::create(RDOValue(const1)); - BOOST_CHECK(pLeft); + LPRDOCalc pLeft = rdo::Factory::create(RDOValue(const1)); + BOOST_CHECK(pLeft); - LPRDOCalc pRight = rdo::Factory::create(RDOValue(const2)); - BOOST_CHECK(pRight); + LPRDOCalc pRight = rdo::Factory::create(RDOValue(const2)); + BOOST_CHECK(pRight); - return CalcTriple(pRuntime, pLeft, pRight); + return CalcTriple(pRuntime, pLeft, pRight); } BOOST_AUTO_TEST_CASE(RDOCalc_MultDouble) { - RDOValue result = calc(prepair()); - BOOST_CHECK(result.getDouble() == const1 * const2); + RDOValue result = calc(prepair()); + BOOST_CHECK(result.getDouble() == const1 * const2); } BOOST_AUTO_TEST_CASE(RDOCalc_DivDouble) { - RDOValue result = calc(prepair()); - BOOST_CHECK(result.getDouble() == const1 / const2); + RDOValue result = calc(prepair()); + BOOST_CHECK(result.getDouble() == const1 / const2); } BOOST_AUTO_TEST_CASE(RDOCalc_PlusDouble) { - RDOValue result = calc(prepair()); - BOOST_CHECK(result.getDouble() == const1 + const2); + RDOValue result = calc(prepair()); + BOOST_CHECK(result.getDouble() == const1 + const2); } BOOST_AUTO_TEST_CASE(RDOCalc_MinusDouble) { - RDOValue result = calc(prepair()); - BOOST_CHECK(result.getDouble() == const1 - const2); + RDOValue result = calc(prepair()); + BOOST_CHECK(result.getDouble() == const1 - const2); } BOOST_AUTO_TEST_CASE(RDOCalc_RecursSimulator) { - struct RecursCalcSimulator - { - struct Param - { - Param(int value) - : m_value(value) - {} - - //! Важно, чтобы тип был int, а не int& - //! Иначе результаты обоих функций будут по 1 - //! А сейчас 1 и 120 - int value() - { - return m_value; - } - - Param& dec() - { - --m_value; - return *this; - } - - private: - int m_value; - }; - - int funErrorOrOK(Param& param) - { - if (param.value() == 1) - { - return 1; - } - else - { - return funErrorOrOK(param.dec()) * param.value(); - } - } - - int funOk(Param& param) - { - if (param.value() == 1) - { - return 1; - } - else - { - return param.value() * funOk(param.dec()); - } - } - }; - - RecursCalcSimulator calc1; - RecursCalcSimulator calc2; - RecursCalcSimulator::Param param1(5); - RecursCalcSimulator::Param param2(5); - - int resultErrorOrOK = calc1.funErrorOrOK(param1); - int resultOk = calc2.funOk (param2); - - BOOST_CHECK_MESSAGE(resultErrorOrOK == 1 || resultErrorOrOK == 24, "resultErrorOrOK " << resultErrorOrOK << " != (1 or 24)"); - BOOST_CHECK_MESSAGE(resultOk == 120, "resultOk " << resultOk << " != 120"); + struct RecursCalcSimulator + { + struct Param + { + Param(int value) + : m_value(value) + {} + + // Важно, чтобы тип был int, а не int& + // Иначе результаты обоих функций будут по 1 + // А сейчас 1 и 120 + int value() + { + return m_value; + } + + Param& dec() + { + --m_value; + return *this; + } + + private: + int m_value; + }; + + int funErrorOrOK(Param& param) + { + if (param.value() == 1) + { + return 1; + } + else + { + return funErrorOrOK(param.dec()) * param.value(); + } + } + + int funOk(Param& param) + { + if (param.value() == 1) + { + return 1; + } + else + { + return param.value() * funOk(param.dec()); + } + } + }; + + RecursCalcSimulator calc1; + RecursCalcSimulator calc2; + RecursCalcSimulator::Param param1(5); + RecursCalcSimulator::Param param2(5); + + int resultErrorOrOK = calc1.funErrorOrOK(param1); + int resultOk = calc2.funOk (param2); + + BOOST_CHECK_MESSAGE(resultErrorOrOK == 1 || resultErrorOrOK == 24, "resultErrorOrOK " << resultErrorOrOK << " != (1 or 24)"); + BOOST_CHECK_MESSAGE(resultOk == 120, "resultOk " << resultOk << " != 120"); } BOOST_AUTO_TEST_CASE(RDOCalc_Recurs) { - struct generator - { - enum MultOrder - { - MO_FUN_PARAM, - MO_PARAM_FUN - }; - - static LPRDOCalc create(MultOrder order) - { - //! ручная набивка тела функции вида - //! - //! int fun(int param) - //! { - //! if (param == 1) - //! { - //! return 1; - //! } - //! else - //! { - //! return fun(param - 1) * param; - //! } - //! } - - LPRDOCalcReturnCatch pReturnCatch = rdo::Factory::create(); - BOOST_CHECK(pReturnCatch); - - LPRDOCalc pGetFunParam = rdo::Factory::create(0, RDOSrcInfo()); - - //! if (param == 1) - LPRDOCalc pIFCondition; - { - LPRDOCalc pParamLeft = pGetFunParam; - BOOST_CHECK(pParamLeft); - - LPRDOCalc pParamRight = rdo::Factory::create(RDOValue(int(1))); - BOOST_CHECK(pParamRight); - - pIFCondition = rdo::Factory::create(pParamLeft, pParamRight); - } - BOOST_CHECK(pIFCondition); - - LPRDOCalcIf pIf = rdo::Factory::create(pIFCondition); - BOOST_CHECK(pIf); - - //! return 1 - LPRDOCalc pThen = rdo::Factory::create( - rdo::Factory::create(RDOValue(int(1))) - ); - BOOST_CHECK(pThen); - - //! return fun(param - 1) * param - LPRDOCalc pElse; - { - //! param - 1 - LPRDOCalc pParamValue; - { - LPRDOCalc pParamLeft = pGetFunParam; - BOOST_CHECK(pParamLeft); - - LPRDOCalc pParamRight = rdo::Factory::create(RDOValue(int(1))); - BOOST_CHECK(pParamRight); - - pParamValue = rdo::Factory::create(pParamLeft, pParamRight); - } - BOOST_CHECK(pParamValue); - - //! Вызов fun(param - 1) - LPRDOCalc pFunctionCaller = caller(pReturnCatch, pParamValue); - BOOST_CHECK(pFunctionCaller); - - //! fun(param - 1) * param - //! или - //! param * fun(param - 1) - LPRDOCalc pMult; - switch (order) - { - case MO_FUN_PARAM: pMult = rdo::Factory::create(pFunctionCaller, pGetFunParam); break; - case MO_PARAM_FUN: pMult = rdo::Factory::create(pGetFunParam, pFunctionCaller); break; - } - BOOST_CHECK(pMult); - - pElse = rdo::Factory::create(pMult); - } - BOOST_CHECK(pElse); - - pIf->setThenStatement(pThen); - pIf->setElseStatement(pElse); - - pReturnCatch->setTryCalc(pIf); - - return externalCaller(pReturnCatch); - } - - private: - //! ручная набивка вызова функции int fun(5) - static LPRDOCalc externalCaller(const LPRDOCalc& pBody) - { - LPRDOCalc pParam = rdo::Factory::create(RDOValue(int(5))); - BOOST_CHECK(pParam); - - return caller(pBody, pParam); - } - - static LPRDOCalc caller(const LPRDOCalc& pBody, const LPRDOCalc& pParam) - { - BOOST_CHECK(pBody ); - BOOST_CHECK(pParam); - - LPRDOCalcFunctionCaller pFunctionCaller = rdo::Factory::create(pBody); - BOOST_CHECK(pFunctionCaller); - - pFunctionCaller->addParameter(pParam); - - return pFunctionCaller; - } - }; - - Error error; - - RDOValue resultFunParam = generator::create(generator::MO_FUN_PARAM)->calcValue(rdo::Factory::create(&error)); - std::string resultFunParamStr = resultFunParam.getAsString(); - BOOST_CHECK(resultFunParam.getInt() == 120); - - RDOValue resultParamFun = generator::create(generator::MO_PARAM_FUN)->calcValue(rdo::Factory::create(&error)); - std::string resultParamFunStr = resultParamFun.getAsString(); - BOOST_CHECK(resultParamFun.getInt() == 120); + struct Generator + { + enum class MultOrder + { + FUN_PARAM, + PARAM_FUN + }; + + static LPRDOCalc create(MultOrder order) + { + // ручная набивка тела функции вида + // + // int fun(int param) + // { + // if (param == 1) + // { + // return 1; + // } + // else + // { + // return fun(param - 1) * param; + // } + // } + + LPRDOCalcReturnCatch pReturnCatch = rdo::Factory::create(); + BOOST_CHECK(pReturnCatch); + + LPRDOCalc pGetFunParam = rdo::Factory::create(0, RDOSrcInfo()); + + // if (param == 1) + LPRDOCalc pIFCondition; + { + LPRDOCalc pParamLeft = pGetFunParam; + BOOST_CHECK(pParamLeft); + + LPRDOCalc pParamRight = rdo::Factory::create(RDOValue(int(1))); + BOOST_CHECK(pParamRight); + + pIFCondition = rdo::Factory::create(pParamLeft, pParamRight); + } + BOOST_CHECK(pIFCondition); + + LPRDOCalcIf pIf = rdo::Factory::create(pIFCondition); + BOOST_CHECK(pIf); + + // return 1 + LPRDOCalc pThen = rdo::Factory::create( + rdo::Factory::create(RDOValue(int(1))) + ); + BOOST_CHECK(pThen); + + // return fun(param - 1) * param + LPRDOCalc pElse; + { + // param - 1 + LPRDOCalc pParamValue; + { + LPRDOCalc pParamLeft = pGetFunParam; + BOOST_CHECK(pParamLeft); + + LPRDOCalc pParamRight = rdo::Factory::create(RDOValue(int(1))); + BOOST_CHECK(pParamRight); + + pParamValue = rdo::Factory::create(pParamLeft, pParamRight); + } + BOOST_CHECK(pParamValue); + + // Вызов fun(param - 1) + LPRDOCalc pFunctionCaller = caller(pReturnCatch, pParamValue); + BOOST_CHECK(pFunctionCaller); + + // fun(param - 1) * param + // или + // param * fun(param - 1) + LPRDOCalc pMult; + switch (order) + { + case MultOrder::FUN_PARAM: pMult = rdo::Factory::create(pFunctionCaller, pGetFunParam); break; + case MultOrder::PARAM_FUN: pMult = rdo::Factory::create(pGetFunParam, pFunctionCaller); break; + } + BOOST_CHECK(pMult); + + pElse = rdo::Factory::create(pMult); + } + BOOST_CHECK(pElse); + + pIf->setThenStatement(pThen); + pIf->setElseStatement(pElse); + + pReturnCatch->setTryCalc(pIf); + + return externalCaller(pReturnCatch); + } + + private: + // ручная набивка вызова функции int fun(5) + static LPRDOCalc externalCaller(const LPRDOCalc& pBody) + { + LPRDOCalc pParam = rdo::Factory::create(RDOValue(int(5))); + BOOST_CHECK(pParam); + + return caller(pBody, pParam); + } + + static LPRDOCalc caller(const LPRDOCalc& pBody, const LPRDOCalc& pParam) + { + BOOST_CHECK(pBody ); + BOOST_CHECK(pParam); + + LPRDOCalcFunctionCaller pFunctionCaller = rdo::Factory::create(pBody); + BOOST_CHECK(pFunctionCaller); + + pFunctionCaller->addParameter(pParam); + + return pFunctionCaller; + } + }; + + Error error; + + RDOValue resultFunParam = Generator::create(Generator::MultOrder::FUN_PARAM)->calcValue(rdo::Factory::create(&error)); + std::string resultFunParamStr = resultFunParam.getAsString(); + BOOST_CHECK(resultFunParam.getInt() == 120); + + RDOValue resultParamFun = Generator::create(Generator::MultOrder::PARAM_FUN)->calcValue(rdo::Factory::create(&error)); + std::string resultParamFunStr = resultParamFun.getAsString(); + BOOST_CHECK(resultParamFun.getInt() == 120); } BOOST_AUTO_TEST_CASE(RDOCalc_SpeedTest) { - CalcTriple triple = prepair(); - LPRDOCalc pPlus = rdo::Factory::create(triple.get<1>(), triple.get<2>()); - BOOST_CHECK(pPlus); + CalcTriple triple = prepair(); + LPRDOCalc pPlus = rdo::Factory::create(triple.get<1>(), triple.get<2>()); + BOOST_CHECK(pPlus); - LPRDORuntime pRuntime = triple.get<0>(); - BOOST_CHECK(pRuntime); + LPRDORuntime pRuntime = triple.get<0>(); + BOOST_CHECK(pRuntime); - typedef boost::chrono::process_user_cpu_clock clock; + typedef boost::chrono::process_user_cpu_clock clock; - static const std::size_t RUN_TEST_COUNT = 1000000; + static const std::size_t RUN_TEST_COUNT = 1000000; - clock::time_point timeStart = clock::now(); - for (std::size_t i = 0; i < RUN_TEST_COUNT; ++i) - { - pPlus->calcValue(pRuntime); - } - clock::duration duration(clock::now() - timeStart); - boost::chrono::duration seconds(duration); + clock::time_point timeStart = clock::now(); + for (std::size_t i = 0; i < RUN_TEST_COUNT; ++i) + { + pPlus->calcValue(pRuntime); + } + clock::duration duration(clock::now() - timeStart); + boost::chrono::duration seconds(duration); - { - using namespace boost::unit_test; - log_level logLevelBackup = runtime_config::log_level(); - unit_test_log.set_threshold_level(log_messages); + { + using namespace boost::unit_test; + log_level logLevelBackup = runtime_config::log_level(); + unit_test_log.set_threshold_level(log_messages); - BOOST_TEST_MESSAGE("RDOCalc_SpeedTest: " << seconds); + BOOST_TEST_MESSAGE("RDOCalc_SpeedTest: " << seconds); - unit_test_log.set_threshold_level(logLevelBackup); - } + unit_test_log.set_threshold_level(logLevelBackup); + } } BOOST_AUTO_TEST_SUITE_END() // RDOCalc_Test diff --git a/simulator/runtime/test/fuzzy/main.cpp b/simulator/runtime/test/fuzzy/main.cpp index d97df7207..14e8998fc 100644 --- a/simulator/runtime/test/fuzzy/main.cpp +++ b/simulator/runtime/test/fuzzy/main.cpp @@ -17,179 +17,179 @@ BOOST_AUTO_TEST_SUITE(RDORuntime_Fuzzy_Test) BOOST_AUTO_TEST_CASE(DefineAreaTest) { - Error error; - LPRDORuntime pRuntime = rdo::Factory::create(&error); - BOOST_CHECK(pRuntime); + Error error; + LPRDORuntime pRuntime = rdo::Factory::create(&error); + BOOST_CHECK(pRuntime); - LPDefineArea pDefineAreaEmpty = rdo::Factory::create(); - BOOST_CHECK(pDefineAreaEmpty); + LPDefineArea pDefineAreaEmpty = rdo::Factory::create(); + BOOST_CHECK(pDefineAreaEmpty); - LPDefineArea pDefineArea = rdo::Factory::create(1.0, 5.0); - BOOST_CHECK(pDefineArea); + LPDefineArea pDefineArea = rdo::Factory::create(1.0, 5.0); + BOOST_CHECK(pDefineArea); } BOOST_AUTO_TEST_CASE(FuzzySetTest) { - Error error; - LPRDORuntime pRuntime = rdo::Factory::create(&error); - BOOST_CHECK(pRuntime); + Error error; + LPRDORuntime pRuntime = rdo::Factory::create(&error); + BOOST_CHECK(pRuntime); - LPFuzzySet pInfinityFuzzySet = rdo::Factory::create(); - BOOST_CHECK(pInfinityFuzzySet); + LPFuzzySet pInfinityFuzzySet = rdo::Factory::create(); + BOOST_CHECK(pInfinityFuzzySet); - LPFuzzySet pCopyFuzzySet = rdo::Factory::create(pInfinityFuzzySet); - BOOST_CHECK(pCopyFuzzySet); + LPFuzzySet pCopyFuzzySet = rdo::Factory::create(pInfinityFuzzySet); + BOOST_CHECK(pCopyFuzzySet); - LPDefineArea pDefineArea = rdo::Factory::create(0.0, 100.0); - BOOST_CHECK(pDefineArea); + LPDefineArea pDefineArea = rdo::Factory::create(0.0, 100.0); + BOOST_CHECK(pDefineArea); - LPFuzzySet pFuzzySet = rdo::Factory::create(pDefineArea); - BOOST_CHECK(pFuzzySet); + LPFuzzySet pFuzzySet = rdo::Factory::create(pDefineArea); + BOOST_CHECK(pFuzzySet); - LPFuzzySet pSet = rdo::Factory::create(); + LPFuzzySet pSet = rdo::Factory::create(); - std::string stringPresentation = pSet->getAsString(); - BOOST_CHECK(stringPresentation == "[empty value]"); + std::string stringPresentation = pSet->getAsString(); + BOOST_CHECK(stringPresentation == "[empty value]"); - pSet->append(1,0.10); - pSet->append(2,0.20); - pSet->append(3,1.00); - pSet->append(5,0.50); - pSet->append(6,0.40); - pSet->append(7,0.20); - pSet->append(9,0.10); + pSet->append(1,0.10); + pSet->append(2,0.20); + pSet->append(3,1.00); + pSet->append(5,0.50); + pSet->append(6,0.40); + pSet->append(7,0.20); + pSet->append(9,0.10); - BOOST_CHECK(pSet->getAsString() == "<1/0.10> <2/0.20> <3/1.00> <5/0.50> <6/0.40> <7/0.20> <9/0.10>"); + BOOST_CHECK(pSet->getAsString() == "<1/0.10> <2/0.20> <3/1.00> <5/0.50> <6/0.40> <7/0.20> <9/0.10>"); - RDOValue repeatValue = 3.0; - pSet->append(repeatValue, 0.3); - BOOST_CHECK(pSet->getAsString() == "<1/0.10> <2/0.20> <3/1.00> <5/0.50> <6/0.40> <7/0.20> <9/0.10>"); + RDOValue repeatValue = 3.0; + pSet->append(repeatValue, 0.3); + BOOST_CHECK(pSet->getAsString() == "<1/0.10> <2/0.20> <3/1.00> <5/0.50> <6/0.40> <7/0.20> <9/0.10>"); - pSet->operator[](repeatValue) = 0.3; - BOOST_CHECK(pSet->getAsString() == "<1/0.10> <2/0.20> <3/0.30> <5/0.50> <6/0.40> <7/0.20> <9/0.10>"); + pSet->operator[](repeatValue) = 0.3; + BOOST_CHECK(pSet->getAsString() == "<1/0.10> <2/0.20> <3/0.30> <5/0.50> <6/0.40> <7/0.20> <9/0.10>"); - LPFuzzySet pConSet = MemberFunctionProperties::a_con(pSet); - BOOST_CHECK(pConSet->getAsString() == "<1/0.01> <2/0.04> <3/0.09> <5/0.25> <6/0.16> <7/0.04> <9/0.01>"); + LPFuzzySet pConSet = MemberFunctionProperties::a_con(pSet); + BOOST_CHECK(pConSet->getAsString() == "<1/0.01> <2/0.04> <3/0.09> <5/0.25> <6/0.16> <7/0.04> <9/0.01>"); - LPFuzzySet pDilSet = MemberFunctionProperties::a_dil(pSet); - BOOST_CHECK(pDilSet->getAsString() == "<1/0.32> <2/0.45> <3/0.55> <5/0.71> <6/0.63> <7/0.45> <9/0.32>"); + LPFuzzySet pDilSet = MemberFunctionProperties::a_dil(pSet); + BOOST_CHECK(pDilSet->getAsString() == "<1/0.32> <2/0.45> <3/0.55> <5/0.71> <6/0.63> <7/0.45> <9/0.32>"); - LPFuzzySet pUnaryMinusSet = MemberFunctionProperties::u_minus(pSet); - BOOST_CHECK(pUnaryMinusSet->getAsString() == "<-9/0.10> <-7/0.20> <-6/0.40> <-5/0.50> <-3/0.30> <-2/0.20> <-1/0.10>"); + LPFuzzySet pUnaryMinusSet = MemberFunctionProperties::u_minus(pSet); + BOOST_CHECK(pUnaryMinusSet->getAsString() == "<-9/0.10> <-7/0.20> <-6/0.40> <-5/0.50> <-3/0.30> <-2/0.20> <-1/0.10>"); - LPFuzzySet pScaleSet = MemberFunctionProperties::u_scale(pSet, 4.0); - BOOST_CHECK(pScaleSet->getAsString() == "<4/0.10> <8/0.20> <12/0.30> <20/0.50> <24/0.40> <28/0.20> <36/0.10>"); + LPFuzzySet pScaleSet = MemberFunctionProperties::u_scale(pSet, 4.0); + BOOST_CHECK(pScaleSet->getAsString() == "<4/0.10> <8/0.20> <12/0.30> <20/0.50> <24/0.40> <28/0.20> <36/0.10>"); - LPFuzzySet pSupplement = MemberFunctionProperties::supplement(pSet); - BOOST_CHECK(pSupplement->getAsString() == "<1/0.90> <2/0.80> <3/0.70> <5/0.50> <6/0.60> <7/0.80> <9/0.90>"); + LPFuzzySet pSupplement = MemberFunctionProperties::supplement(pSet); + BOOST_CHECK(pSupplement->getAsString() == "<1/0.90> <2/0.80> <3/0.70> <5/0.50> <6/0.60> <7/0.80> <9/0.90>"); - LPFuzzySet pAlphaTest = MemberFunctionProperties::alpha(pSet, 0.3); - BOOST_CHECK(pAlphaTest->getAsString() == "<3/0.30> <5/0.50> <6/0.40>"); + LPFuzzySet pAlphaTest = MemberFunctionProperties::alpha(pSet, 0.3); + BOOST_CHECK(pAlphaTest->getAsString() == "<3/0.30> <5/0.50> <6/0.40>"); - LPFuzzySet pMultTest = MemberFunctionProperties::a_mult(pSet, pSupplement); - BOOST_CHECK(pMultTest->getAsString() == "<1/0.09> <2/0.16> <3/0.21> <5/0.25> <6/0.24> <7/0.16> <9/0.09>"); + LPFuzzySet pMultTest = MemberFunctionProperties::a_mult(pSet, pSupplement); + BOOST_CHECK(pMultTest->getAsString() == "<1/0.09> <2/0.16> <3/0.21> <5/0.25> <6/0.24> <7/0.16> <9/0.09>"); - LPFuzzySet pMultTestDown = MemberFunctionProperties::a_mult(pSet, pScaleSet); - BOOST_CHECK(pMultTestDown->getAsString() == "[empty value]"); + LPFuzzySet pMultTestDown = MemberFunctionProperties::a_mult(pSet, pScaleSet); + BOOST_CHECK(pMultTestDown->getAsString() == "[empty value]"); - RDOValue defuzzyficationValue = MemberFunctionProperties::defuzzyfication(pSet); - BOOST_CHECK(defuzzyficationValue.getAsString() == "4.83333" ); + RDOValue defuzzyficationValue = MemberFunctionProperties::defuzzyfication(pSet); + BOOST_CHECK(defuzzyficationValue.getAsString() == "4.83333" ); } BOOST_AUTO_TEST_CASE(TermTest) { - LPFuzzySet pSet = rdo::Factory::create(); - std::string testname = "test"; - LPRDOFuzzyTerm pTerm = rdo::Factory::create(testname, pSet); - BOOST_CHECK(pTerm->getName() == "test"); + LPFuzzySet pSet = rdo::Factory::create(); + std::string testname = "test"; + LPRDOFuzzyTerm pTerm = rdo::Factory::create(testname, pSet); + BOOST_CHECK(pTerm->getName() == "test"); - Error error; - LPRDORuntime pRuntime = rdo::Factory::create(&error); - BOOST_CHECK(pRuntime); + Error error; + LPRDORuntime pRuntime = rdo::Factory::create(&error); + BOOST_CHECK(pRuntime); - LPDefineArea pDefineArea = rdo::Factory::create(0.0, 100.0); - BOOST_CHECK(pDefineArea); + LPDefineArea pDefineArea = rdo::Factory::create(0.0, 100.0); + BOOST_CHECK(pDefineArea); - LPFuzzySet pFuzzySet = rdo::Factory::create(pDefineArea); - BOOST_CHECK(pFuzzySet); + LPFuzzySet pFuzzySet = rdo::Factory::create(pDefineArea); + BOOST_CHECK(pFuzzySet); - LPRDOFuzzyTerm pTerm3 = rdo::Factory::create("term", pFuzzySet); - BOOST_CHECK(pTerm3->getName() == "term"); + LPRDOFuzzyTerm pTerm3 = rdo::Factory::create("term", pFuzzySet); + BOOST_CHECK(pTerm3->getName() == "term"); } BOOST_AUTO_TEST_CASE(VariableTest) { - LPDefineArea pDefineArea1 = rdo::Factory::create(0.0, 20.0); - BOOST_CHECK(pDefineArea1); + LPDefineArea pDefineArea1 = rdo::Factory::create(0.0, 20.0); + BOOST_CHECK(pDefineArea1); - LPDefineArea pDefineArea2 = rdo::Factory::create(10.0, 20.0); - BOOST_CHECK(pDefineArea2); + LPDefineArea pDefineArea2 = rdo::Factory::create(10.0, 20.0); + BOOST_CHECK(pDefineArea2); - LPFuzzySet pFuzzySet1 = rdo::Factory::create(pDefineArea1); - BOOST_CHECK(pFuzzySet1); + LPFuzzySet pFuzzySet1 = rdo::Factory::create(pDefineArea1); + BOOST_CHECK(pFuzzySet1); - LPFuzzySet pFuzzySet2 = rdo::Factory::create(pDefineArea2); - BOOST_CHECK(pFuzzySet2); + LPFuzzySet pFuzzySet2 = rdo::Factory::create(pDefineArea2); + BOOST_CHECK(pFuzzySet2); - LPRDOFuzzyTerm pTerm1 = rdo::Factory::create("term1", pFuzzySet1); - BOOST_CHECK(pTerm1); + LPRDOFuzzyTerm pTerm1 = rdo::Factory::create("term1", pFuzzySet1); + BOOST_CHECK(pTerm1); - LPRDOFuzzyTerm pTerm2 = rdo::Factory::create("term2", pFuzzySet2); - BOOST_CHECK(pTerm2); + LPRDOFuzzyTerm pTerm2 = rdo::Factory::create("term2", pFuzzySet2); + BOOST_CHECK(pTerm2); - std::string name1 = pTerm1->getName(); - BOOST_CHECK(name1 == "term1"); - LPRDOLingvoVariable pVariable = rdo::Factory::create(pTerm1,"test"); - BOOST_CHECK(pVariable); + std::string name1 = pTerm1->getName(); + BOOST_CHECK(name1 == "term1"); + LPRDOLingvoVariable pVariable = rdo::Factory::create(pTerm1,"test"); + BOOST_CHECK(pVariable); - Error error; - LPRDORuntime pRuntime = rdo::Factory::create(&error); - BOOST_CHECK(pRuntime); + Error error; + LPRDORuntime pRuntime = rdo::Factory::create(&error); + BOOST_CHECK(pRuntime); - LPDefineArea pDefineArea = rdo::Factory::create(0.0, 100.0); - BOOST_CHECK(pDefineArea); + LPDefineArea pDefineArea = rdo::Factory::create(0.0, 100.0); + BOOST_CHECK(pDefineArea); - LPFuzzySet pFuzzySet = rdo::Factory::create(pDefineArea); - BOOST_CHECK(pFuzzySet); + LPFuzzySet pFuzzySet = rdo::Factory::create(pDefineArea); + BOOST_CHECK(pFuzzySet); - pFuzzySet->append(5,0.5); - BOOST_CHECK(pFuzzySet->getAsString() == "<5/0.50>"); + pFuzzySet->append(5,0.5); + BOOST_CHECK(pFuzzySet->getAsString() == "<5/0.50>"); - pFuzzySet->append(1,0.1); - BOOST_CHECK(pFuzzySet->getAsString() == "<1/0.10> <5/0.50>"); + pFuzzySet->append(1,0.1); + BOOST_CHECK(pFuzzySet->getAsString() == "<1/0.10> <5/0.50>"); - pFuzzySet->append(2,0.2); - BOOST_CHECK(pFuzzySet->getAsString() == "<1/0.10> <2/0.20> <5/0.50>"); + pFuzzySet->append(2,0.2); + BOOST_CHECK(pFuzzySet->getAsString() == "<1/0.10> <2/0.20> <5/0.50>"); - pFuzzySet->append(3,1.0); - BOOST_CHECK(pFuzzySet->getAsString() == "<1/0.10> <2/0.20> <3/1.00> <5/0.50>"); + pFuzzySet->append(3,1.0); + BOOST_CHECK(pFuzzySet->getAsString() == "<1/0.10> <2/0.20> <3/1.00> <5/0.50>"); - pFuzzySet->append(6,0.4); - BOOST_CHECK(pFuzzySet->getAsString() == "<1/0.10> <2/0.20> <3/1.00> <5/0.50> <6/0.40>"); + pFuzzySet->append(6,0.4); + BOOST_CHECK(pFuzzySet->getAsString() == "<1/0.10> <2/0.20> <3/1.00> <5/0.50> <6/0.40>"); - pFuzzySet->append(7,0.2); - BOOST_CHECK(pFuzzySet->getAsString() == "<1/0.10> <2/0.20> <3/1.00> <5/0.50> <6/0.40> <7/0.20>"); + pFuzzySet->append(7,0.2); + BOOST_CHECK(pFuzzySet->getAsString() == "<1/0.10> <2/0.20> <3/1.00> <5/0.50> <6/0.40> <7/0.20>"); - pFuzzySet->append(9,0.1); - BOOST_CHECK(pFuzzySet->getAsString() == "<1/0.10> <2/0.20> <3/1.00> <5/0.50> <6/0.40> <7/0.20> <9/0.10>"); + pFuzzySet->append(9,0.1); + BOOST_CHECK(pFuzzySet->getAsString() == "<1/0.10> <2/0.20> <3/1.00> <5/0.50> <6/0.40> <7/0.20> <9/0.10>"); - LPRDOFuzzyTerm pTerm4 = rdo::Factory::create("term4", pFuzzySet); - BOOST_CHECK(pTerm4); + LPRDOFuzzyTerm pTerm4 = rdo::Factory::create("term4", pFuzzySet); + BOOST_CHECK(pTerm4); - pVariable->append(pTerm4->getName(), pTerm4->getFuzzySetDefinition()); - pVariable->setName("testName"); + pVariable->append(pTerm4->getName(), pTerm4->getFuzzySetDefinition()); + pVariable->setName("testName"); - RDOValue value = 1.0; - LPRDOLingvoVariable pVariable2 = rdo::Factory::create(value, pVariable); - BOOST_CHECK(pVariable2); + RDOValue value = 1.0; + LPRDOLingvoVariable pVariable2 = rdo::Factory::create(value, pVariable); + BOOST_CHECK(pVariable2); - RDOValue valueTrueOn0_2 = 7.0; - LPRDOLingvoVariable fuzzyVariable1 = MemberFunctionProperties::fuzzyfication(valueTrueOn0_2, pVariable); - BOOST_CHECK(fuzzyVariable1); + RDOValue valueTrueOn0_2 = 7.0; + LPRDOLingvoVariable fuzzyVariable1 = MemberFunctionProperties::fuzzyfication(valueTrueOn0_2, pVariable); + BOOST_CHECK(fuzzyVariable1); - RDOValue valueTrueOn0_0 = 10.0; - LPRDOLingvoVariable fuzzyVariable2 = MemberFunctionProperties::fuzzyfication(valueTrueOn0_0, pVariable); - BOOST_CHECK(fuzzyVariable2); + RDOValue valueTrueOn0_0 = 10.0; + LPRDOLingvoVariable fuzzyVariable2 = MemberFunctionProperties::fuzzyfication(valueTrueOn0_0, pVariable); + BOOST_CHECK(fuzzyVariable2); } BOOST_AUTO_TEST_SUITE_END() // RDORuntime_Fuzzy_Test diff --git a/simulator/runtime/test/logic/main.cpp b/simulator/runtime/test/logic/main.cpp index e4969d219..3dd4de699 100644 --- a/simulator/runtime/test/logic/main.cpp +++ b/simulator/runtime/test/logic/main.cpp @@ -14,75 +14,75 @@ class MyOperation { public: - MyOperation(std::size_t dummy) - : m_dummy(dummy) - {} + MyOperation(std::size_t dummy) + : m_dummy(dummy) + {} - bool operator< (const MyOperation& opr) const - { - return m_dummy < opr.m_dummy; - } + bool operator< (const MyOperation& opr) const + { + return m_dummy < opr.m_dummy; + } - std::size_t getData() - { - return m_dummy; - } + std::size_t getData() + { + return m_dummy; + } private: - std::size_t m_dummy; + std::size_t m_dummy; }; template > class Container { public: - typedef T Item; - typedef C List; - typedef typename List::iterator Iterator; - typedef typename List::const_iterator CIterator; - - Iterator begin() { return m_list.begin(); } - Iterator end() { return m_list.end(); } - CIterator begin() const { return m_list.begin(); } - CIterator end() const { return m_list.end(); } - bool empty() const { return m_list.empty(); } - - Container& operator() (const Item& item) - { - m_list.push_back(item); - return *this; - } + typedef T Item; + typedef C List; + typedef typename List::iterator Iterator; + typedef typename List::const_iterator CIterator; + + Iterator begin() { return m_list.begin(); } + Iterator end() { return m_list.end(); } + CIterator begin() const { return m_list.begin(); } + CIterator end() const { return m_list.end(); } + bool empty() const { return m_list.empty(); } + + Container& operator() (const Item& item) + { + m_list.push_back(item); + return *this; + } private: - List m_list; + List m_list; }; class OrderFIFO { public: - template - static void sort(Container&) - {} + template + static void sort(Container&) + {} }; class OrderLIFO { public: - template - static void sort(Container& container) - { - std::reverse(container.begin(), container.end()); - } + template + static void sort(Container& container) + { + std::reverse(container.begin(), container.end()); + } }; class OrderPrior { public: - template - static void sort(Container& container) - { - std::sort(container.begin(), container.end()); - } + template + static void sort(Container& container) + { + std::sort(container.begin(), container.end()); + } }; typedef std::vector data_vector; @@ -91,85 +91,85 @@ template class Logic { public: - Logic(const data_vector& data) - { - data_vector::const_iterator endIt = data.end(); - for(data_vector::const_iterator it = data.begin(); it != endIt; ++it) - { - m_container(*it); - } - } - bool checkOperation(const data_vector& data) - { - Order::sort(m_container); - - data_vector check_data; - - DataContainer::CIterator endIt = m_container.end(); - for(DataContainer::Iterator it = m_container.begin() ;it != endIt; ++it) - { - check_data.push_back((*it).getData()); - } - - return check_data == data; - } + Logic(const data_vector& data) + { + data_vector::const_iterator endIt = data.end(); + for(data_vector::const_iterator it = data.begin(); it != endIt; ++it) + { + m_container(*it); + } + } + bool checkOperation(const data_vector& data) + { + Order::sort(m_container); + + data_vector check_data; + + DataContainer::CIterator endIt = m_container.end(); + for(DataContainer::Iterator it = m_container.begin() ;it != endIt; ++it) + { + check_data.push_back((*it).getData()); + } + + return check_data == data; + } private: - typedef MyOperation Item; - typedef Container DataContainer; + typedef MyOperation Item; + typedef Container DataContainer; - DataContainer m_container; + DataContainer m_container; }; data_vector createData() { - data_vector _vector; - _vector.push_back(1); - _vector.push_back(2); - _vector.push_back(4); - _vector.push_back(3); - return _vector; + data_vector _vector; + _vector.push_back(1); + _vector.push_back(2); + _vector.push_back(4); + _vector.push_back(3); + return _vector; } BOOST_AUTO_TEST_SUITE(RDORuntime_Logic_Test) BOOST_AUTO_TEST_CASE(RDORuntime_Logic_FIFO_Test) { - Logic logic(createData()); // 1 2 4 3 + Logic logic(createData()); // 1 2 4 3 - data_vector checkVector; - checkVector.push_back(1); - checkVector.push_back(2); - checkVector.push_back(4); - checkVector.push_back(3); + data_vector checkVector; + checkVector.push_back(1); + checkVector.push_back(2); + checkVector.push_back(4); + checkVector.push_back(3); - BOOST_CHECK(logic.checkOperation(checkVector)); + BOOST_CHECK(logic.checkOperation(checkVector)); } BOOST_AUTO_TEST_CASE(RDORuntime_Logic_LIFO_Test) { - Logic logic(createData()); // 3 4 2 1 + Logic logic(createData()); // 3 4 2 1 - data_vector checkVector; - checkVector.push_back(3); - checkVector.push_back(4); - checkVector.push_back(2); - checkVector.push_back(1); + data_vector checkVector; + checkVector.push_back(3); + checkVector.push_back(4); + checkVector.push_back(2); + checkVector.push_back(1); - BOOST_CHECK(logic.checkOperation(checkVector)); + BOOST_CHECK(logic.checkOperation(checkVector)); } BOOST_AUTO_TEST_CASE(RDORuntime_Logic_Prior_Test) { - Logic logic(createData()); // 1 2 3 4 + Logic logic(createData()); // 1 2 3 4 - data_vector checkVector; - checkVector.push_back(1); - checkVector.push_back(2); - checkVector.push_back(3); - checkVector.push_back(4); + data_vector checkVector; + checkVector.push_back(1); + checkVector.push_back(2); + checkVector.push_back(3); + checkVector.push_back(4); - BOOST_CHECK(logic.checkOperation(checkVector)); + BOOST_CHECK(logic.checkOperation(checkVector)); } BOOST_AUTO_TEST_SUITE_END() // RDORuntime_Logic_Test diff --git a/simulator/runtime/test/matrix/main.cpp b/simulator/runtime/test/matrix/main.cpp index c09ee57ee..ed212b464 100644 --- a/simulator/runtime/test/matrix/main.cpp +++ b/simulator/runtime/test/matrix/main.cpp @@ -3,9 +3,10 @@ // ----------------------------------------------------------------------- INCLUDES #define BOOST_TEST_MODULE RDORuntime_Matrix_Test #include "utils/src/common/warning_disable.h" +#include #include #include -#include +#include #include "utils/src/common/warning_enable.h" // ----------------------------------------------------------------------- SYNOPSIS #include "simulator/runtime/rdo_value.h" @@ -16,266 +17,242 @@ BOOST_AUTO_TEST_SUITE(RDORuntime_Matrix_Test) -typedef rdo::vector Container; +typedef std::vector Container; typedef std::pair Matrix; Matrix createMatrix(const Container& data) { - rdo::runtime::LPRDOMatrixType pType = rdo::Factory::create(rdo::runtime::g_int); - ASSERT(pType); - rdo::runtime::LPRDOMatrixValue pValue = rdo::Factory::create(pType); - ASSERT(pValue); + rdo::runtime::LPRDOMatrixType pType = rdo::Factory::create(rdo::runtime::g_INT); + ASSERT(pType); + rdo::runtime::LPRDOMatrixValue pValue = rdo::Factory::create(pType); + ASSERT(pValue); - for (const auto& item: data) - { - pValue->push_back(rdo::runtime::RDOValue(item)); - } + for (const auto& item: data) + pValue->push_back(rdo::runtime::RDOValue(item)); - return std::make_pair(pValue, rdo::runtime::RDOValue(pType, pValue)); + return std::make_pair(pValue, rdo::runtime::RDOValue(pType, pValue)); } std::string getString(const rdo::runtime::LPRDOMatrixValue& pMatrix, const rdo::runtime::LPRDOMatrixIterator& pIt) { - if (!pIt->equal(pMatrix->end())) - { - return pIt->getValue().getAsString(); - } - return ""; + if (!pIt->equal(pMatrix->end())) + return pIt->getValue().getAsString(); + + return ""; } std::string getString(const rdo::runtime::RDOValue& it, const rdo::runtime::RDOValue& end) { - if (it != end) - { - return it.getAsString(); - } - return ""; + if (it != end) + return it.getAsString(); + + return ""; } BOOST_AUTO_TEST_CASE(MatrixTestCreate) { - BOOST_CHECK(createMatrix(Container()(1)(2)(3)).second.getAsString() == "[1, 2, 3]"); + BOOST_CHECK(createMatrix({1, 2, 3}).second.getAsString() == "[1, 2, 3]"); } BOOST_AUTO_TEST_CASE(MatrixTestInsert) { - Matrix matrix1 = createMatrix(Container()(1)(2)(3)); - Matrix matrix2 = createMatrix(Container()(4)(5)(6)); + Matrix matrix1 = createMatrix({1, 2, 3}); + Matrix matrix2 = createMatrix({4, 5, 6}); - matrix1.first->insert(matrix1.first->begin()->next(), matrix2.first->begin(), matrix2.first->end()); + matrix1.first->insert(matrix1.first->begin()->next(), matrix2.first->begin(), matrix2.first->end()); - BOOST_CHECK(matrix1.second.getAsString() == "[1, 4, 5, 6, 2, 3]"); + BOOST_CHECK(matrix1.second.getAsString() == "[1, 4, 5, 6, 2, 3]"); } BOOST_AUTO_TEST_CASE(MatrixTestErase) { - Matrix matrix = createMatrix(Container()(1)(2)(3)); + Matrix matrix = createMatrix({1, 2, 3}); - matrix.first->erase(matrix.first->begin()->next(), matrix.first->begin()->preInc(3)); + matrix.first->erase(matrix.first->begin()->next(), matrix.first->begin()->preInc(3)); - BOOST_CHECK(matrix.second.getAsString() == "[1]"); + BOOST_CHECK(matrix.second.getAsString() == "[1]"); } BOOST_AUTO_TEST_CASE(MatrixTestIteratorPrePlus) { - Matrix matrix = createMatrix(Container()(1)(2)(3)); - - std::string result; - rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->begin(); - while (!pIt->equal(matrix.first->end())) - { - result += getString(matrix.first, pIt->preInc(1)); - } - BOOST_CHECK(result == "23"); + Matrix matrix = createMatrix({1, 2, 3}); + + std::string result; + rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->begin(); + while (!pIt->equal(matrix.first->end())) + result += getString(matrix.first, pIt->preInc(1)); + + BOOST_CHECK(result == "23"); } BOOST_AUTO_TEST_CASE(MatrixTestIteratorPostPlus) { - Matrix matrix = createMatrix(Container()(1)(2)(3)); - - std::string result; - rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->begin(); - while (!pIt->equal(matrix.first->end())) - { - result += getString(matrix.first, pIt->postInc(1)); - } - BOOST_CHECK(result == "123"); + Matrix matrix = createMatrix({1, 2, 3}); + + std::string result; + rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->begin(); + while (!pIt->equal(matrix.first->end())) + result += getString(matrix.first, pIt->postInc(1)); + + BOOST_CHECK(result == "123"); } BOOST_AUTO_TEST_CASE(MatrixTestIteratorPreMinus) { - Matrix matrix = createMatrix(Container()(1)(2)(3)); + Matrix matrix = createMatrix({1, 2, 3}); - std::string result; - rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->end(); - do - { - result += getString(matrix.first, pIt->preInc(-1)); - } - while (!pIt->equal(matrix.first->begin())); + std::string result; + rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->end(); + do + result += getString(matrix.first, pIt->preInc(-1)); + while (!pIt->equal(matrix.first->begin())); - BOOST_CHECK(result == "321"); + BOOST_CHECK(result == "321"); } BOOST_AUTO_TEST_CASE(MatrixTestIteratorPostMinus) { - Matrix matrix = createMatrix(Container()(1)(2)(3)); + Matrix matrix = createMatrix({1, 2, 3}); - std::string result; - rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->end(); - do - { - result += getString(matrix.first, pIt->postInc(-1)); - } - while (!pIt->equal(matrix.first->begin())); + std::string result; + rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->end(); + do + result += getString(matrix.first, pIt->postInc(-1)); + while (!pIt->equal(matrix.first->begin())); - BOOST_CHECK(result == "32"); + BOOST_CHECK(result == "32"); } BOOST_AUTO_TEST_CASE(MatrixTestValuePrePlus) { - Matrix matrix = createMatrix(Container()(1)(2)(3)); - - std::string result; - rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->begin(); - rdo::runtime::LPRDOMatrixIterator pEnd = matrix.first->end (); - rdo::runtime::RDOValue it (pIt, pIt ); - rdo::runtime::RDOValue end(pEnd, pEnd); - BOOST_CHECK(it != end); - - while (it != end) - { - result += getString(++it, end); - } - BOOST_CHECK(result == "23"); + Matrix matrix = createMatrix({1, 2, 3}); + + std::string result; + rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->begin(); + rdo::runtime::LPRDOMatrixIterator pEnd = matrix.first->end (); + rdo::runtime::RDOValue it (pIt, pIt ); + rdo::runtime::RDOValue end(pEnd, pEnd); + BOOST_CHECK(it != end); + + while (it != end) + result += getString(++it, end); + + BOOST_CHECK(result == "23"); } BOOST_AUTO_TEST_CASE(MatrixTestValuePostPlus) { - Matrix matrix = createMatrix(Container()(1)(2)(3)); - - std::string result; - rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->begin(); - rdo::runtime::LPRDOMatrixIterator pEnd = matrix.first->end (); - rdo::runtime::RDOValue it (pIt, pIt ); - rdo::runtime::RDOValue end(pEnd, pEnd); - BOOST_CHECK(it != end); - - while (it != end) - { - result += getString(it++, end); - } - BOOST_CHECK(result == "123"); + Matrix matrix = createMatrix({1, 2, 3}); + + std::string result; + rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->begin(); + rdo::runtime::LPRDOMatrixIterator pEnd = matrix.first->end (); + rdo::runtime::RDOValue it (pIt, pIt ); + rdo::runtime::RDOValue end(pEnd, pEnd); + BOOST_CHECK(it != end); + + while (it != end) + result += getString(it++, end); + + BOOST_CHECK(result == "123"); } BOOST_AUTO_TEST_CASE(MatrixTestValuePreMinus) { - Matrix matrix = createMatrix(Container()(1)(2)(3)); - - std::string result; - rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->end (); - rdo::runtime::LPRDOMatrixIterator pBegin = matrix.first->begin(); - rdo::runtime::LPRDOMatrixIterator pEnd = matrix.first->end (); - rdo::runtime::RDOValue it (pIt, pIt ); - rdo::runtime::RDOValue begin(pBegin, pBegin); - rdo::runtime::RDOValue end (pEnd, pEnd ); - BOOST_CHECK(it != begin); - BOOST_CHECK(it == end ); - - do - { - result += getString(--it, end); - } - while (it != begin); - BOOST_CHECK(result == "321"); + Matrix matrix = createMatrix({1, 2, 3}); + + std::string result; + rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->end (); + rdo::runtime::LPRDOMatrixIterator pBegin = matrix.first->begin(); + rdo::runtime::LPRDOMatrixIterator pEnd = matrix.first->end (); + rdo::runtime::RDOValue it (pIt, pIt ); + rdo::runtime::RDOValue begin(pBegin, pBegin); + rdo::runtime::RDOValue end (pEnd, pEnd ); + BOOST_CHECK(it != begin); + BOOST_CHECK(it == end ); + + do + result += getString(--it, end); + while (it != begin); + BOOST_CHECK(result == "321"); } BOOST_AUTO_TEST_CASE(MatrixTestValuePostMinus) { - Matrix matrix = createMatrix(Container()(1)(2)(3)); - - std::string result; - rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->end (); - rdo::runtime::LPRDOMatrixIterator pBegin = matrix.first->begin(); - rdo::runtime::LPRDOMatrixIterator pEnd = matrix.first->end (); - rdo::runtime::RDOValue it (pIt, pIt ); - rdo::runtime::RDOValue begin(pBegin, pBegin); - rdo::runtime::RDOValue end (pEnd, pEnd ); - BOOST_CHECK(it != begin); - BOOST_CHECK(it == end ); - - do - { - result += getString(it--, end); - } - while (it != begin); - BOOST_CHECK(result == "32"); + Matrix matrix = createMatrix({1, 2, 3}); + + std::string result; + rdo::runtime::LPRDOMatrixIterator pIt = matrix.first->end (); + rdo::runtime::LPRDOMatrixIterator pBegin = matrix.first->begin(); + rdo::runtime::LPRDOMatrixIterator pEnd = matrix.first->end (); + rdo::runtime::RDOValue it (pIt, pIt ); + rdo::runtime::RDOValue begin(pBegin, pBegin); + rdo::runtime::RDOValue end (pEnd, pEnd ); + BOOST_CHECK(it != begin); + BOOST_CHECK(it == end ); + + do + result += getString(it--, end); + while (it != begin); + BOOST_CHECK(result == "32"); } BOOST_AUTO_TEST_CASE(MatrixTestSetItem) { - Matrix matrix = createMatrix(Container()(1)(2)(3)); - - std::size_t ind = 1; - std::size_t item = 48; - rdo::runtime::RDOValue index(ind); - rdo::runtime::RDOValue value(item); - matrix.first->setItem(index, value); - - BOOST_CHECK(matrix.second.getAsString() == "[1, 48, 3]"); - - ind = 3; - index = ind; - bool found = false; - - try - { - matrix.first->setItem(index, value); - } - catch (const rdo::runtime::RDORuntimeException& ex) - { - if (!ex.message().empty()) - { - found = ex.message() == "Выход за пределы матрицы"; - } - } - - if (!found) - { - BOOST_CHECK(false); - } + Matrix matrix = createMatrix({1, 2, 3}); + + std::size_t ind = 1; + std::size_t item = 48; + rdo::runtime::RDOValue index(ind); + rdo::runtime::RDOValue value(item); + matrix.first->setItem(index, value); + + BOOST_CHECK(matrix.second.getAsString() == "[1, 48, 3]"); + + ind = 3; + index = ind; + bool found = false; + + try + { + matrix.first->setItem(index, value); + } + catch (const rdo::runtime::RDORuntimeException& ex) + { + if (!ex.message().empty()) + found = ex.message() == "Выход за пределы матрицы"; + } + + if (!found) + BOOST_CHECK(false); } BOOST_AUTO_TEST_CASE(MatrixTestGetItem) { - Matrix matrix = createMatrix(Container()(1)(48)(3)); - - std::size_t ind = 1; - rdo::runtime::RDOValue index(ind); - rdo::runtime::RDOValue value(matrix.first->getItem(index)); - - BOOST_CHECK(value.getAsString() == "48"); - - ind = 3; - index = ind; - bool found = false; - - try - { - matrix.first->getItem(index); - } - catch (const rdo::runtime::RDORuntimeException& ex) - { - if (!ex.message().empty()) - { - found = ex.message() == "Выход за пределы матрицы"; - } - } - - if (!found) - { - BOOST_CHECK(false); - } + Matrix matrix = createMatrix({1, 48, 3}); + + std::size_t ind = 1; + rdo::runtime::RDOValue index(ind); + rdo::runtime::RDOValue value(matrix.first->getItem(index)); + + BOOST_CHECK(value.getAsString() == "48"); + + ind = 3; + index = ind; + bool found = false; + + try + { + matrix.first->getItem(index); + } + catch (const rdo::runtime::RDORuntimeException& ex) + { + if (!ex.message().empty()) + found = ex.message() == "Выход за пределы матрицы"; + } + + if (!found) + BOOST_CHECK(false); } BOOST_AUTO_TEST_SUITE_END() // RDORuntime_Matrix_Test diff --git a/simulator/runtime/test/sequences/main.cpp b/simulator/runtime/test/sequences/main.cpp index 6e66ef453..4aa9145cb 100644 --- a/simulator/runtime/test/sequences/main.cpp +++ b/simulator/runtime/test/sequences/main.cpp @@ -22,28 +22,28 @@ typedef std::vector Container; typedef std::vector ContainerInt; const double g_pi = 3.141592653589793; -const long int g_seed = 123456789; //!< база генератора -const std::string g_filePath = "../../test/sequences/"; //!< путь к файлам относительно проекта -const std::string g_fileNormalName = "data_normal.txt"; //!< файл данных -const std::string g_fileUniformName = "data_uniform.txt"; //!< файл данных -const std::string g_fileExponentialName = "data_exponential.txt"; //!< файл данных -const std::string g_fileTriangularName = "data_trinagular.txt"; //!< файл данных - -const std::size_t g_count = 100000; //!< количество генерируемых данных -const double g_main = 10.0; //!< параметр закона экспоненциального и нормального -const double g_var = 1.0; //!< параметр закона нормального -const double g_from = 1.0; //!< параметр закона равномерного и треугольного -const double g_to = 7.0; //!< параметр закона равномерного и треугольного -const double g_top = 5.0; //!< параметр закона треугольного +const long int g_seed = 123456789; // база генератора +const std::string g_filePath = "../../test/sequences/"; // путь к файлам относительно проекта +const std::string g_fileNormalName = "data_normal.txt"; // файл данных +const std::string g_fileUniformName = "data_uniform.txt"; // файл данных +const std::string g_fileExponentialName = "data_exponential.txt"; // файл данных +const std::string g_fileTriangularName = "data_trinagular.txt"; // файл данных + +const std::size_t g_count = 100000; // количество генерируемых данных +const double g_main = 10.0; // параметр закона экспоненциального и нормального +const double g_var = 1.0; // параметр закона нормального +const double g_from = 1.0; // параметр закона равномерного и треугольного +const double g_to = 7.0; // параметр закона равномерного и треугольного +const double g_top = 5.0; // параметр закона треугольного #if defined(ARCHITECTURE_X86) -const std::size_t g_precision = 20; //!< точность вещественного числа при выводе в поток +const std::size_t g_precision = 20; // точность вещественного числа при выводе в поток #elif defined(ARCHITECTURE_AMD64) || defined(ARCHITECTURE_ARM) -const std::size_t g_precision = 14; //!< точность вещественного числа при выводе в поток +const std::size_t g_precision = 14; // точность вещественного числа при выводе в поток #endif -const std::size_t g_countOfExamples = 2000; //!< количество чисел в выборке -const std::size_t g_countOfR = 39; //!< число разрядов -const double g_ksiEtalon = 50.9985; //!< табличное значение. 95% вероятность того, что это действительно тот самый закон распределения +const std::size_t g_countOfExamples = 2000; // количество чисел в выборке +const std::size_t g_countOfR = 39; // число разрядов +const double g_ksiEtalon = 50.9985; // табличное значение. 95% вероятность того, что это действительно тот самый закон распределения // -------------------------------------------------------------------------------- // -------Templates @@ -51,239 +51,239 @@ const double g_ksiEtalon = 50.9985; //!< та template void onGenerateData(F binder, const std::string& g_fileName) { - if (rdo::File::exist(g_fileName)) - return; - - T sequence(g_seed); - Container test; - test.reserve(g_count); - - for (std::size_t i = 0; i < g_count; ++i) - { - test.push_back(binder.operator()(&sequence)); - } - - std::ofstream stream(g_fileName.c_str()); - stream.precision(g_precision); - for (const auto& item: test) - { - stream << item << std::endl; - } + if (rdo::File::exist(g_fileName)) + return; + + T sequence(g_seed); + Container test; + test.reserve(g_count); + + for (std::size_t i = 0; i < g_count; ++i) + { + test.push_back(binder.operator()(&sequence)); + } + + std::ofstream stream(g_fileName.c_str()); + stream.precision(g_precision); + for (const auto& item: test) + { + stream << item << std::endl; + } } template void onCheckData(F binder, const std::string& g_fileName) { - T sequence(g_seed); - std::ifstream stream(g_fileName.c_str()); - - const boost::posix_time::time_duration testDuration = boost::posix_time::microseconds(100000); - unsigned int minTestCount = 100; - - boost::posix_time::ptime testStart = boost::posix_time::microsec_clock::local_time(); - while (boost::posix_time::microsec_clock::local_time() - testStart < testDuration) - { - for (unsigned int i = 0; i < minTestCount; ++i) - { - if (!stream.good()) - return; - - double valueOriginal; - stream >> valueOriginal; - - if (!stream.good()) - return; - - { - std::stringstream s; - s.precision(g_precision); - s << valueOriginal; - s >> valueOriginal; - } - - double valueTest; - - { - std::stringstream s; - s.precision(g_precision); - s << binder.operator()(&sequence); - s >> valueTest; - } - - const bool check = valueOriginal == valueTest; - BOOST_CHECK(check); - if (!check) - { - std::cout.precision(g_precision); - std::cout << valueOriginal << " != " << valueTest << std::endl; - } - } - } + T sequence(g_seed); + std::ifstream stream(g_fileName.c_str()); + + const boost::posix_time::time_duration testDuration = boost::posix_time::microseconds(100000); + unsigned int minTestCount = 100; + + boost::posix_time::ptime testStart = boost::posix_time::microsec_clock::local_time(); + while (boost::posix_time::microsec_clock::local_time() - testStart < testDuration) + { + for (unsigned int i = 0; i < minTestCount; ++i) + { + if (!stream.good()) + return; + + double valueOriginal; + stream >> valueOriginal; + + if (!stream.good()) + return; + + { + std::stringstream s; + s.precision(g_precision); + s << valueOriginal; + s >> valueOriginal; + } + + double valueTest; + + { + std::stringstream s; + s.precision(g_precision); + s << binder.operator()(&sequence); + s >> valueTest; + } + + const bool check = valueOriginal == valueTest; + BOOST_CHECK(check); + if (!check) + { + std::cout.precision(g_precision); + std::cout << valueOriginal << " != " << valueTest << std::endl; + } + } + } } template double area (F binder, double n, double m) { - double k = 1; - double S1 = 1; - double S2 = 0; - std::size_t t = 10; - while (fabs(S1-S2) / S1 > 0.01) - { - S2 = S1; - S1 = 0; - for (std::size_t g = 0; g < t + 1; ++g) - { - if ((g == 0) || (g == t - 1)) - k = 0.5; - S1 += k*(binder.operator()(n + g*(m-n)/t)); - k = 1; - } - S1 *= (m-n) / t; - t *= 10; - } - return S1; + double k = 1; + double S1 = 1; + double S2 = 0; + std::size_t t = 10; + while (fabs(S1-S2) / S1 > 0.01) + { + S2 = S1; + S1 = 0; + for (std::size_t g = 0; g < t + 1; ++g) + { + if ((g == 0) || (g == t - 1)) + k = 0.5; + S1 += k*(binder.operator()(n + g*(m-n)/t)); + k = 1; + } + S1 *= (m-n) / t; + t *= 10; + } + return S1; } template void onCheckKsi(F binder, S binderSeq, double left, double right) { - Container x; - x.reserve(g_countOfR + 1); - double elem = (right-left) / (g_countOfR*1.0); // расстояние между точками на прямой - - for (std::size_t i = 0; i < g_countOfR + 1; ++i) - { - x.push_back(left + elem*i); - } - - Container vb; // контейнер для хранения выборки - vb.reserve(g_countOfExamples); - - G sequence(g_seed); // выборка - for (std::size_t i = 0; i < g_countOfExamples; ++i) - { - vb.push_back(binderSeq.operator()(&sequence)); - } - - Container f_vb; // контейнер для храниения количества попаданий на интервал - f_vb.reserve(g_countOfR); - - for (std::size_t i = 0; i < g_countOfR; ++i) // нахождение количества попаданий на интервал - { - std::size_t freq = 0; - for (std::size_t k = 0; k < g_countOfExamples; ++k) - { - if ((vb[k] > x[i]) & (vb[k] <= x[i+1])) - { - ++freq; - } - } - f_vb.push_back(freq); - } - - Container F_etalon; - F_etalon.reserve(g_countOfR); - - for (std::size_t i = 0; i < g_countOfR; ++i) - { - F_etalon.push_back(area(binder, x[i], x[i+1])); - } - - double ksi = 0; - for (std::size_t i = 0; i < g_countOfR; ++i) - { - double ksiTemp = F_etalon[i] * g_countOfExamples; - ksi += (f_vb[i] - ksiTemp) * (f_vb[i] - ksiTemp) / ksiTemp; - } - BOOST_CHECK(ksi <= g_ksiEtalon); - if (ksi > g_ksiEtalon) - { - std::cout << ksi << std::endl; - } + Container x; + x.reserve(g_countOfR + 1); + double elem = (right-left) / (g_countOfR*1.0); // расстояние между точками на прямой + + for (std::size_t i = 0; i < g_countOfR + 1; ++i) + { + x.push_back(left + elem*i); + } + + Container vb; // контейнер для хранения выборки + vb.reserve(g_countOfExamples); + + G sequence(g_seed); // выборка + for (std::size_t i = 0; i < g_countOfExamples; ++i) + { + vb.push_back(binderSeq.operator()(&sequence)); + } + + Container f_vb; // контейнер для храниения количества попаданий на интервал + f_vb.reserve(g_countOfR); + + for (std::size_t i = 0; i < g_countOfR; ++i) // нахождение количества попаданий на интервал + { + std::size_t freq = 0; + for (std::size_t k = 0; k < g_countOfExamples; ++k) + { + if ((vb[k] > x[i]) & (vb[k] <= x[i+1])) + { + ++freq; + } + } + f_vb.push_back(freq); + } + + Container F_etalon; + F_etalon.reserve(g_countOfR); + + for (std::size_t i = 0; i < g_countOfR; ++i) + { + F_etalon.push_back(area(binder, x[i], x[i+1])); + } + + double ksi = 0; + for (std::size_t i = 0; i < g_countOfR; ++i) + { + double ksiTemp = F_etalon[i] * g_countOfExamples; + ksi += (f_vb[i] - ksiTemp) * (f_vb[i] - ksiTemp) / ksiTemp; + } + BOOST_CHECK(ksi <= g_ksiEtalon); + if (ksi > g_ksiEtalon) + { + std::cout << ksi << std::endl; + } } // -------------------------------------------------------------------------------- class SequenceNormal { public: - SequenceNormal(double main, double var) - : m_main(main) - , m_var (var ) - {} + SequenceNormal(double main, double var) + : m_main(main) + , m_var (var ) + {} - double get(double x) const - { - return 1 / (sqrt(2 * g_pi) * m_var * exp((x - m_main) * (x - m_main) / (2*m_var*m_var))); - } + double get(double x) const + { + return 1 / (sqrt(2 * g_pi) * m_var * exp((x - m_main) * (x - m_main) / (2*m_var*m_var))); + } private: - double m_main; - double m_var; + double m_main; + double m_var; }; class SequenceExponential { public: - SequenceExponential(double main) - : m_main(main) - {} + SequenceExponential(double main) + : m_main(main) + {} - double get(double x) const - { - return 1 / (m_main * exp(x/m_main)); - } + double get(double x) const + { + return 1 / (m_main * exp(x/m_main)); + } private: - double m_main; + double m_main; }; class SequenceUniform { public: - SequenceUniform(double min, double max) - : m_min(min) - , m_max(max) - {} + SequenceUniform(double min, double max) + : m_min(min) + , m_max(max) + {} - double get(double /*x*/) const - { - return 1 / (m_max-m_min); - } + double get(double /*x*/) const + { + return 1 / (m_max-m_min); + } private: - double m_min; - double m_max; + double m_min; + double m_max; }; class SequenceTriangular { public: - SequenceTriangular(double min, double top, double max) - : m_min(min-top) - , m_top(top) - , m_max(max-top) - {} - - double get(double x) const - { - x -= m_top; - double temp; - if (x < 0) - { - temp = -2 * x / ((m_max - m_min) * m_min) + 2 / (m_max - m_min); - } - else - { - temp = -2 * x / ((m_max - m_min) * m_max) + 2 / (m_max - m_min); - } - return temp; - } + SequenceTriangular(double min, double top, double max) + : m_min(min-top) + , m_top(top) + , m_max(max-top) + {} + + double get(double x) const + { + x -= m_top; + double temp; + if (x < 0) + { + temp = -2 * x / ((m_max - m_min) * m_min) + 2 / (m_max - m_min); + } + else + { + temp = -2 * x / ((m_max - m_min) * m_max) + 2 / (m_max - m_min); + } + return temp; + } private: - double m_min; - double m_top; - double m_max; + double m_min; + double m_top; + double m_max; }; BOOST_AUTO_TEST_SUITE(RDOSequencesTest) @@ -293,24 +293,24 @@ BOOST_AUTO_TEST_SUITE(RDOSequencesTest) // -------------------------------------------------------------------------------- BOOST_AUTO_TEST_CASE(RDONormalTestCreate) { - rdo::locale::initForTest(); + rdo::locale::initForTest(); - onGenerateData - (boost::bind(&rdo::runtime::RandGeneratorNormal::next, _1, g_main, g_var), g_filePath + g_fileNormalName); + onGenerateData + (boost::bind(&rdo::runtime::RandGeneratorNormal::next, _1, g_main, g_var), g_filePath + g_fileNormalName); } BOOST_AUTO_TEST_CASE(RDONormalTestCheck) { - onCheckData - (boost::bind(&rdo::runtime::RandGeneratorNormal::next, _1, g_main, g_var), g_filePath + g_fileNormalName); - - SequenceNormal normal(g_main, g_var); - onCheckKsi( - boost::bind(&SequenceNormal::get, normal, _1), - boost::bind(&rdo::runtime::RandGeneratorNormal::next, _1, g_main, g_var), - g_main - 4 * g_var, - g_main + 4 * g_var - ); + onCheckData + (boost::bind(&rdo::runtime::RandGeneratorNormal::next, _1, g_main, g_var), g_filePath + g_fileNormalName); + + SequenceNormal normal(g_main, g_var); + onCheckKsi( + boost::bind(&SequenceNormal::get, normal, _1), + boost::bind(&rdo::runtime::RandGeneratorNormal::next, _1, g_main, g_var), + g_main - 4 * g_var, + g_main + 4 * g_var + ); } // -------------------------------------------------------------------------------- @@ -319,22 +319,22 @@ BOOST_AUTO_TEST_CASE(RDONormalTestCheck) // -------------------------------------------------------------------------------- BOOST_AUTO_TEST_CASE(RDOUniformTestCreate) { - onGenerateData - (boost::bind(&rdo::runtime::RandGeneratorUniform::next, _1, g_from, g_to), g_filePath + g_fileUniformName); + onGenerateData + (boost::bind(&rdo::runtime::RandGeneratorUniform::next, _1, g_from, g_to), g_filePath + g_fileUniformName); } BOOST_AUTO_TEST_CASE(RDOUniformTestCheck) { - onCheckData - (boost::bind(&rdo::runtime::RandGeneratorUniform::next, _1, g_from, g_to), g_filePath + g_fileUniformName); - - SequenceUniform uniform(g_from, g_to); - onCheckKsi( - boost::bind(&SequenceUniform::get, uniform, _1), - boost::bind(&rdo::runtime::RandGeneratorUniform::next, _1, g_from, g_to), - g_from, - g_to - ); + onCheckData + (boost::bind(&rdo::runtime::RandGeneratorUniform::next, _1, g_from, g_to), g_filePath + g_fileUniformName); + + SequenceUniform uniform(g_from, g_to); + onCheckKsi( + boost::bind(&SequenceUniform::get, uniform, _1), + boost::bind(&rdo::runtime::RandGeneratorUniform::next, _1, g_from, g_to), + g_from, + g_to + ); } // -------------------------------------------------------------------------------- @@ -343,22 +343,22 @@ BOOST_AUTO_TEST_CASE(RDOUniformTestCheck) // -------------------------------------------------------------------------------- BOOST_AUTO_TEST_CASE(RDOExponentialTestCreate) { - onGenerateData - (boost::bind(&rdo::runtime::RandGeneratorExponential::next, _1, g_main), g_filePath + g_fileExponentialName); + onGenerateData + (boost::bind(&rdo::runtime::RandGeneratorExponential::next, _1, g_main), g_filePath + g_fileExponentialName); } BOOST_AUTO_TEST_CASE(RDOExponentialTestCheck) { - onCheckData - (boost::bind(&rdo::runtime::RandGeneratorExponential::next, _1, g_main), g_filePath + g_fileExponentialName); - - SequenceExponential exponential(g_main); - onCheckKsi( - boost::bind(&SequenceExponential::get, exponential, _1), - boost::bind(&rdo::runtime::RandGeneratorExponential::next, _1, g_main), - 0, - 7 * g_main - ); + onCheckData + (boost::bind(&rdo::runtime::RandGeneratorExponential::next, _1, g_main), g_filePath + g_fileExponentialName); + + SequenceExponential exponential(g_main); + onCheckKsi( + boost::bind(&SequenceExponential::get, exponential, _1), + boost::bind(&rdo::runtime::RandGeneratorExponential::next, _1, g_main), + 0, + 7 * g_main + ); } // -------------------------------------------------------------------------------- @@ -367,22 +367,22 @@ BOOST_AUTO_TEST_CASE(RDOExponentialTestCheck) // -------------------------------------------------------------------------------- BOOST_AUTO_TEST_CASE(RDOTriangularTestCreate) { - onGenerateData - (boost::bind(&rdo::runtime::RandGeneratorTriangular::next, _1, g_from, g_top, g_to), g_filePath + g_fileTriangularName); + onGenerateData + (boost::bind(&rdo::runtime::RandGeneratorTriangular::next, _1, g_from, g_top, g_to), g_filePath + g_fileTriangularName); } BOOST_AUTO_TEST_CASE(RDOTriangularTestCheck) { - onCheckData - (boost::bind(&rdo::runtime::RandGeneratorTriangular::next, _1, g_from, g_top, g_to), g_filePath + g_fileTriangularName); - - SequenceTriangular triangular(g_from, g_top, g_to); - onCheckKsi( - boost::bind(&SequenceTriangular::get, triangular, _1), - boost::bind(&rdo::runtime::RandGeneratorTriangular::next, _1, g_from, g_top, g_to), - g_from, - g_to - ); + onCheckData + (boost::bind(&rdo::runtime::RandGeneratorTriangular::next, _1, g_from, g_top, g_to), g_filePath + g_fileTriangularName); + + SequenceTriangular triangular(g_from, g_top, g_to); + onCheckKsi( + boost::bind(&SequenceTriangular::get, triangular, _1), + boost::bind(&rdo::runtime::RandGeneratorTriangular::next, _1, g_from, g_top, g_to), + g_from, + g_to + ); } // -------------------------------------------------------------------------------- diff --git a/simulator/runtime/test/value/main.cpp b/simulator/runtime/test/value/main.cpp index 1ef4900e7..6b3c47665 100644 --- a/simulator/runtime/test/value/main.cpp +++ b/simulator/runtime/test/value/main.cpp @@ -21,552 +21,552 @@ BOOST_AUTO_TEST_SUITE(RDOValue_Test) template void testException(F binder) { - bool flag = false; - try - { - binder(); - } - catch(const RDOValueException&) - { - flag = true; - } - BOOST_CHECK(flag); + bool flag = false; + try + { + binder(); + } + catch(const RDOValueException&) + { + flag = true; + } + BOOST_CHECK(flag); } void testing(RDOValue value1, RDOValue value2) { - testException(boost::bind(&RDOValue::operator+=, &value1, boost::cref(value2))); - testException(boost::bind(&RDOValue::operator-=, &value1, boost::cref(value2))); - testException(boost::bind(&RDOValue::operator*=, &value1, boost::cref(value2))); - testException(boost::bind(&RDOValue::operator/=, &value1, boost::cref(value2))); - testException(boost::bind(&RDOValue::operator>, &value1, boost::cref(value2))); - testException(boost::bind(&RDOValue::operator<, &value1, boost::cref(value2))); - testException(boost::bind(&RDOValue::operator>=, &value1, boost::cref(value2))); - testException(boost::bind(&RDOValue::operator<=, &value1, boost::cref(value2))); - testException(boost::bind(&RDOValue::operator==, &value1, boost::cref(value2))); + testException(boost::bind(&RDOValue::operator+=, &value1, boost::cref(value2))); + testException(boost::bind(&RDOValue::operator-=, &value1, boost::cref(value2))); + testException(boost::bind(&RDOValue::operator*=, &value1, boost::cref(value2))); + testException(boost::bind(&RDOValue::operator/=, &value1, boost::cref(value2))); + testException(boost::bind(&RDOValue::operator>, &value1, boost::cref(value2))); + testException(boost::bind(&RDOValue::operator<, &value1, boost::cref(value2))); + testException(boost::bind(&RDOValue::operator>=, &value1, boost::cref(value2))); + testException(boost::bind(&RDOValue::operator<=, &value1, boost::cref(value2))); + testException(boost::bind(&RDOValue::operator==, &value1, boost::cref(value2))); } void compare(RDOValue value1, RDOValue value2) { - BOOST_CHECK(value1 != value2); - BOOST_CHECK(value1 < value2); - BOOST_CHECK(value2 > value1); - BOOST_CHECK(value1 <= value2); - BOOST_CHECK(value2 >= value1); + BOOST_CHECK(value1 != value2); + BOOST_CHECK(value1 < value2); + BOOST_CHECK(value2 > value1); + BOOST_CHECK(value1 <= value2); + BOOST_CHECK(value2 >= value1); } template void compareOne(const T1& param1, const T1& param2) { - const T1 val1 = param1; - const T1 val2 = param2; - RDOValue value1(val1); - RDOValue value2(val2); + const T1 val1 = param1; + const T1 val2 = param2; + RDOValue value1(val1); + RDOValue value2(val2); - BOOST_CHECK(value1 != value2); - BOOST_CHECK(value1 > value2); - BOOST_CHECK(value2 < value1); - BOOST_CHECK(value1 >= value2); - BOOST_CHECK(value2 <= value1); - value2 = val1; - BOOST_CHECK(value1 >= value2); - BOOST_CHECK(value2 <= value1); + BOOST_CHECK(value1 != value2); + BOOST_CHECK(value1 > value2); + BOOST_CHECK(value2 < value1); + BOOST_CHECK(value1 >= value2); + BOOST_CHECK(value2 <= value1); + value2 = val1; + BOOST_CHECK(value1 >= value2); + BOOST_CHECK(value2 <= value1); } template -void compareValue(const T1& param1, const T2& param2, const RDOType::TypeID& type1, const RDOType::TypeID& type2) +void compareValue(const T1& param1, const T2& param2, const RDOType::Type& type1, const RDOType::Type& type2) { - T1 val1 = param1; - T2 val2 = param2; - RDOValue value1(val1); - RDOValue value2(val2); + T1 val1 = param1; + T2 val2 = param2; + RDOValue value1(val1); + RDOValue value2(val2); - compare(value1, value2); + compare(value1, value2); - value1 = value2; - BOOST_CHECK(value1 == value2); + value1 = value2; + BOOST_CHECK(value1 == value2); - value1 = val1; - value2 = val2; - value1 += value2; - BOOST_CHECK(value1 == T1(param1 + param2)); - BOOST_CHECK(value1.typeID() == type1); - value1 -= value2; - BOOST_CHECK(value1 == param1); - value1 *= value2; - BOOST_CHECK(value1 == param1 * param2); - value1 /= value2; - BOOST_CHECK(value1 == param1); + value1 = val1; + value2 = val2; + value1 += value2; + BOOST_CHECK(value1 == T1(param1 + param2)); + BOOST_CHECK(value1.typeID() == type1); + value1 -= value2; + BOOST_CHECK(value1 == param1); + value1 *= value2; + BOOST_CHECK(value1 == param1 * param2); + value1 /= value2; + BOOST_CHECK(value1 == param1); - BOOST_CHECK(value1.typeID() == type2); + BOOST_CHECK(value1.typeID() == type2); } template void compareStr(const T1& param1, const T2& param2) { - T1 val1 = param1; - T2 str1 = param2; - RDOValue value1(val1); - RDOValue value2(str1); + T1 val1 = param1; + T2 str1 = param2; + RDOValue value1(val1); + RDOValue value2(str1); - testing(value1, value2); + testing(value1, value2); } template void compareChr(const T1& param1, const T2& param2) { - T1 val1 = param1; - T2 ch1 = param2; - RDOValue value1(val1); - RDOValue value2(ch1 ); + T1 val1 = param1; + T2 ch1 = param2; + RDOValue value1(val1); + RDOValue value2(ch1 ); - value1 += value2; - BOOST_CHECK(value1 == val1 + ch1); - value1 -= value2; - BOOST_CHECK(value1 == val1); - value1 *= value2; - BOOST_CHECK(value1 == val1 * ch1); - value1 /= value2; - BOOST_CHECK(value1 == val1); + value1 += value2; + BOOST_CHECK(value1 == val1 + ch1); + value1 -= value2; + BOOST_CHECK(value1 == val1); + value1 *= value2; + BOOST_CHECK(value1 == val1 * ch1); + value1 /= value2; + BOOST_CHECK(value1 == val1); - compare(value1, value2); + compare(value1, value2); } BOOST_AUTO_TEST_CASE(RDOValue_String) { - const std::string str1 = "qqq"; - RDOValue value1(str1); - BOOST_CHECK(value1.getString() == str1); - BOOST_CHECK(value1.getAsString() == str1); + const std::string str1 = "qqq"; + RDOValue value1(str1); + BOOST_CHECK(value1.getString() == str1); + BOOST_CHECK(value1.getAsString() == str1); - RDOValue value2 = value1; - BOOST_CHECK(value2.getString() == str1); - BOOST_CHECK(value2.getAsString() == str1); - BOOST_CHECK(value2 == value1); + RDOValue value2 = value1; + BOOST_CHECK(value2.getString() == str1); + BOOST_CHECK(value2.getAsString() == str1); + BOOST_CHECK(value2 == value1); - const std::string str2 = "aaa"; - value2 += str2; - BOOST_CHECK(value2.getString() == str1 + str2); - BOOST_CHECK(value2.getAsString() == str1 + str2); + const std::string str2 = "aaa"; + value2 += str2; + BOOST_CHECK(value2.getString() == str1 + str2); + BOOST_CHECK(value2.getAsString() == str1 + str2); } BOOST_AUTO_TEST_CASE(RDOValue_Rsint_Arifmethic) { - const int val1 = 30; - RDOValue value1(val1); - BOOST_CHECK(value1.getInt () == val1); - BOOST_CHECK(value1.getUInt () == std::size_t(val1)); - BOOST_CHECK(value1.getDouble () == val1); - BOOST_CHECK(value1.getAsString () == "30"); - BOOST_CHECK(value1.getEnumAsInt() == 30 ); - - RDOValue value2 = value1; - BOOST_CHECK(value2 == val1 ); - BOOST_CHECK(value2 == value1); - - const int val2 = 20; - value1 += val2; - BOOST_CHECK(value1 == val1 + val2); - value1 = val1; - value1 = value1 + val2; - BOOST_CHECK(value1 == val1 + val2); - - const int val3 = 10; - value1 -= val3; - BOOST_CHECK(value1 == val1 + val2 - val3); - value1 += val3; - value1 = value1 - val3; - BOOST_CHECK(value1 == val1 + val2 - val3); - - const int val4 = 2; - value2 = value1; - value2 *= val4; - BOOST_CHECK(value2 == (val1 + val2 - val3) * val4); - value2 /= val4; - value2 = value2 * val4; - BOOST_CHECK(value2 == (val1 + val2 - val3) * val4); - - const int val5 = 5; - value2 = value1; - value2 /= val5; - BOOST_CHECK(value2 == ((val1 + val2 - val3) / val5)); - value2 *= val5; - value2 = value2 / val5; - BOOST_CHECK(value2 == ((val1 + val2 - val3) / val5)); - - value2 = value1; - value2 --; - BOOST_CHECK(value2 == value1 - 1); - value2 ++; - BOOST_CHECK(value2 == value1); + const int val1 = 30; + RDOValue value1(val1); + BOOST_CHECK(value1.getInt () == val1); + BOOST_CHECK(value1.getUInt () == std::size_t(val1)); + BOOST_CHECK(value1.getDouble () == val1); + BOOST_CHECK(value1.getAsString () == "30"); + BOOST_CHECK(value1.getEnumAsInt() == 30 ); + + RDOValue value2 = value1; + BOOST_CHECK(value2 == val1 ); + BOOST_CHECK(value2 == value1); + + const int val2 = 20; + value1 += val2; + BOOST_CHECK(value1 == val1 + val2); + value1 = val1; + value1 = value1 + val2; + BOOST_CHECK(value1 == val1 + val2); + + const int val3 = 10; + value1 -= val3; + BOOST_CHECK(value1 == val1 + val2 - val3); + value1 += val3; + value1 = value1 - val3; + BOOST_CHECK(value1 == val1 + val2 - val3); + + const int val4 = 2; + value2 = value1; + value2 *= val4; + BOOST_CHECK(value2 == (val1 + val2 - val3) * val4); + value2 /= val4; + value2 = value2 * val4; + BOOST_CHECK(value2 == (val1 + val2 - val3) * val4); + + const int val5 = 5; + value2 = value1; + value2 /= val5; + BOOST_CHECK(value2 == ((val1 + val2 - val3) / val5)); + value2 *= val5; + value2 = value2 / val5; + BOOST_CHECK(value2 == ((val1 + val2 - val3) / val5)); + + value2 = value1; + value2 --; + BOOST_CHECK(value2 == value1 - 1); + value2 ++; + BOOST_CHECK(value2 == value1); } BOOST_AUTO_TEST_CASE(RDOValue_Rsint_Compare) { - compareOne(30, 20); + compareOne(30, 20); } BOOST_AUTO_TEST_CASE(RDOValue_Ruint_Arifmethic) { - const std::size_t val1 = 30; - RDOValue value1(val1); - BOOST_CHECK(value1 == val1); - BOOST_CHECK(value1.getInt () == int(val1)); - BOOST_CHECK(value1.getUInt () == val1); - BOOST_CHECK(value1.getDouble () == val1); - BOOST_CHECK(value1.getAsString () == "30"); - BOOST_CHECK(value1.getEnumAsInt() == 30 ); - - RDOValue value2 = value1; - BOOST_CHECK(value2 == val1 ); - BOOST_CHECK(value2 == value1); - - const std::size_t val2 = 20; - value1 += val2; - BOOST_CHECK(value1 == val1 + val2); - value1 = val1; - value1 = value1 + val2; - BOOST_CHECK(value1 == val1 + val2); - - const std::size_t val3 = 10; - value1 -= val3; - BOOST_CHECK(value1 == val1 + val2 - val3); - value1 += val3; - value1 = value1 - val3; - BOOST_CHECK(value1 == val1 + val2 - val3); - - const std::size_t val4 = 2; - value2 = value1; - value2 *= val4; - BOOST_CHECK(value2 == (val1 + val2 - val3) * val4); - value2 /= val4; - value2 = value2 * val4; - BOOST_CHECK(value2 == (val1 + val2 - val3) * val4); - - const std::size_t val5 = 5; - value2 = value1; - value2 /= val5; - BOOST_CHECK(value2 == ((val1 + val2 - val3) / val5)); - value2 *= val5; - value2 = value2 / val5; - BOOST_CHECK(value2 == ((val1 + val2 - val3) / val5)); - - value2 = value1; - value2 --; - BOOST_CHECK(value2 == value1 - 1); - value2 ++; - BOOST_CHECK(value2 == value1); + const std::size_t val1 = 30; + RDOValue value1(val1); + BOOST_CHECK(value1 == val1); + BOOST_CHECK(value1.getInt () == int(val1)); + BOOST_CHECK(value1.getUInt () == val1); + BOOST_CHECK(value1.getDouble () == val1); + BOOST_CHECK(value1.getAsString () == "30"); + BOOST_CHECK(value1.getEnumAsInt() == 30 ); + + RDOValue value2 = value1; + BOOST_CHECK(value2 == val1 ); + BOOST_CHECK(value2 == value1); + + const std::size_t val2 = 20; + value1 += val2; + BOOST_CHECK(value1 == val1 + val2); + value1 = val1; + value1 = value1 + val2; + BOOST_CHECK(value1 == val1 + val2); + + const std::size_t val3 = 10; + value1 -= val3; + BOOST_CHECK(value1 == val1 + val2 - val3); + value1 += val3; + value1 = value1 - val3; + BOOST_CHECK(value1 == val1 + val2 - val3); + + const std::size_t val4 = 2; + value2 = value1; + value2 *= val4; + BOOST_CHECK(value2 == (val1 + val2 - val3) * val4); + value2 /= val4; + value2 = value2 * val4; + BOOST_CHECK(value2 == (val1 + val2 - val3) * val4); + + const std::size_t val5 = 5; + value2 = value1; + value2 /= val5; + BOOST_CHECK(value2 == ((val1 + val2 - val3) / val5)); + value2 *= val5; + value2 = value2 / val5; + BOOST_CHECK(value2 == ((val1 + val2 - val3) / val5)); + + value2 = value1; + value2 --; + BOOST_CHECK(value2 == value1 - 1); + value2 ++; + BOOST_CHECK(value2 == value1); } BOOST_AUTO_TEST_CASE(RDOValue_Ruint_Compare) { - compareOne(30, 20); + compareOne(30, 20); } BOOST_AUTO_TEST_CASE(RDOValue_Double_Arifmethic) { - const double doub1 = 30.2; - RDOValue value1(doub1); - BOOST_CHECK(value1 == doub1); - BOOST_CHECK(value1.getInt () == 30 ); - BOOST_CHECK(value1.getUInt () == 30 ); - BOOST_CHECK(value1.getDouble () == doub1 ); - BOOST_CHECK(value1.getAsString () == "30.2"); - BOOST_CHECK(value1.getEnumAsInt() == 30 ); - - RDOValue value2 = value1; - BOOST_CHECK(value2 == doub1); - BOOST_CHECK(value2 == value1); - - const double doub2 = 20.5; - value1 += doub2; - BOOST_CHECK(value1 == doub1 + doub2); - value1 = doub1; - value1 = value1 + doub2; - BOOST_CHECK(value1 == doub1 + doub2); - - const double doub3 = 10.3; - value1 -= doub3; - BOOST_CHECK(value1 == doub1 + doub2 - doub3); - value1 += doub3; - value1 = value1 - doub3; - BOOST_CHECK(value1 == doub1 + doub2 - doub3); - - const double doub4 = 2.5; - value2 = value1; - value2 *= doub4; - BOOST_CHECK(value2 == (doub1 + doub2 - doub3) * doub4); - value2 /= doub4; - value2 = value2 * doub4; - BOOST_CHECK(value2 == (doub1 + doub2 - doub3) * doub4); - - const double doub5 = 5; - value2 = value1; - value2 /= doub5; - BOOST_CHECK(value2 == ((doub1 + doub2 - doub3) / doub5)); - value2 *= doub5; - value2 = value2 / doub5; - BOOST_CHECK(value2 == ((doub1 + doub2 - doub3) / doub5)); - - value2 = value1; - value2 --; - BOOST_CHECK(value2 == value1 - 1); - value2 ++; - BOOST_CHECK(value2 == value1); + const double doub1 = 30.2; + RDOValue value1(doub1); + BOOST_CHECK(value1 == doub1); + BOOST_CHECK(value1.getInt () == 30 ); + BOOST_CHECK(value1.getUInt () == 30 ); + BOOST_CHECK(value1.getDouble () == doub1 ); + BOOST_CHECK(value1.getAsString () == "30.2"); + BOOST_CHECK(value1.getEnumAsInt() == 30 ); + + RDOValue value2 = value1; + BOOST_CHECK(value2 == doub1); + BOOST_CHECK(value2 == value1); + + const double doub2 = 20.5; + value1 += doub2; + BOOST_CHECK(value1 == doub1 + doub2); + value1 = doub1; + value1 = value1 + doub2; + BOOST_CHECK(value1 == doub1 + doub2); + + const double doub3 = 10.3; + value1 -= doub3; + BOOST_CHECK(value1 == doub1 + doub2 - doub3); + value1 += doub3; + value1 = value1 - doub3; + BOOST_CHECK(value1 == doub1 + doub2 - doub3); + + const double doub4 = 2.5; + value2 = value1; + value2 *= doub4; + BOOST_CHECK(value2 == (doub1 + doub2 - doub3) * doub4); + value2 /= doub4; + value2 = value2 * doub4; + BOOST_CHECK(value2 == (doub1 + doub2 - doub3) * doub4); + + const double doub5 = 5; + value2 = value1; + value2 /= doub5; + BOOST_CHECK(value2 == ((doub1 + doub2 - doub3) / doub5)); + value2 *= doub5; + value2 = value2 / doub5; + BOOST_CHECK(value2 == ((doub1 + doub2 - doub3) / doub5)); + + value2 = value1; + value2 --; + BOOST_CHECK(value2 == value1 - 1); + value2 ++; + BOOST_CHECK(value2 == value1); } BOOST_AUTO_TEST_CASE(RDOValue_Double_Compare) { - compareOne(30.2, 20.5); + compareOne(30.2, 20.5); } BOOST_AUTO_TEST_CASE(RDOValue_Bool) { - bool bool1 = true; - bool bool2 = false; - bool bool3 = true; - bool bool4 = false; - - RDOValue value1(bool1); - RDOValue value2(bool2); - RDOValue value3(bool3); - RDOValue value4(bool4); - - BOOST_CHECK(value1.getBool ()); - BOOST_CHECK(value1.getInt () == 1); - BOOST_CHECK(value1.getUInt () == 1); - BOOST_CHECK(value1.getEnumAsInt() == 1); - BOOST_CHECK(value1.getDouble () == 1); - BOOST_CHECK(!value2); - BOOST_CHECK( value2 == value4 ); - BOOST_CHECK( value1 != value2 ); - BOOST_CHECK(!(value1 == value2)); - BOOST_CHECK( value1 && value3 ); - BOOST_CHECK(!(value2 && value3)); - BOOST_CHECK( value1 || value2 ); - BOOST_CHECK(!(value2 || value4)); + bool bool1 = true; + bool bool2 = false; + bool bool3 = true; + bool bool4 = false; + + RDOValue value1(bool1); + RDOValue value2(bool2); + RDOValue value3(bool3); + RDOValue value4(bool4); + + BOOST_CHECK(value1.getBool ()); + BOOST_CHECK(value1.getInt () == 1); + BOOST_CHECK(value1.getUInt () == 1); + BOOST_CHECK(value1.getEnumAsInt() == 1); + BOOST_CHECK(value1.getDouble () == 1); + BOOST_CHECK(!value2); + BOOST_CHECK( value2 == value4 ); + BOOST_CHECK( value1 != value2 ); + BOOST_CHECK(!(value1 == value2)); + BOOST_CHECK( value1 && value3 ); + BOOST_CHECK(!(value2 && value3)); + BOOST_CHECK( value1 || value2 ); + BOOST_CHECK(!(value2 || value4)); } BOOST_AUTO_TEST_CASE(RDOValue_Char) { - const char ch1 = 'a'; - const char ch2 = 'b'; - RDOValue value1 = ch1; - RDOValue value2 = ch2; - BOOST_CHECK(value1 == ch1 ); - BOOST_CHECK(value1 < value2); - BOOST_CHECK(value2 > value1); - BOOST_CHECK(value1 != value2); - value1 = value2; - BOOST_CHECK(value1 == value2); + const char ch1 = 'a'; + const char ch2 = 'b'; + RDOValue value1 = ch1; + RDOValue value2 = ch2; + BOOST_CHECK(value1 == ch1 ); + BOOST_CHECK(value1 < value2); + BOOST_CHECK(value2 > value1); + BOOST_CHECK(value1 != value2); + value1 = value2; + BOOST_CHECK(value1 == value2); } BOOST_AUTO_TEST_CASE(RDOValue_Enum) { - LPRDOEnumType pEnum = rdo::Factory::create(); - BOOST_CHECK(pEnum); - BOOST_CHECK(pEnum->empty()); - pEnum->add("test0"); - pEnum->add("test1"); - pEnum->add("test2"); - pEnum->add("test3"); - BOOST_CHECK(pEnum->findEnum("test1") == 1); - BOOST_CHECK(pEnum->exist ("test3")); - - RDOValue value(pEnum); - BOOST_CHECK(value.typeID () == RDOType::t_enum); - BOOST_CHECK(value.getEnum () == pEnum); - BOOST_CHECK(value.getInt () == 0); - BOOST_CHECK(value.getDouble () == 0); - BOOST_CHECK(value.getEnumAsInt() == 0); - BOOST_CHECK(!value.getAsBool ()); - BOOST_CHECK(value.getAsString () == "test0"); - - RDOValue value1(pEnum, "test2"); - BOOST_CHECK(value1.typeID () == RDOType::t_enum); - BOOST_CHECK(value1.getEnum () == pEnum); - BOOST_CHECK(value1.getInt () == 2); - BOOST_CHECK(value1.getDouble () == 2); - BOOST_CHECK(value1.getEnumAsInt() == 2); - BOOST_CHECK(value1.getAsBool ()); - BOOST_CHECK(value1.getAsString () == "test2"); - - RDOValue value2(pEnum, 2); - BOOST_CHECK(value2.typeID () == RDOType::t_enum); - BOOST_CHECK(value2.getEnum () == pEnum); - BOOST_CHECK(value2.getInt () == 2); - BOOST_CHECK(value2.getDouble () == 2); - BOOST_CHECK(value2.getEnumAsInt() == 2); - BOOST_CHECK(value2.getAsBool ()); - BOOST_CHECK(value2.getAsString () == "test2"); + LPRDOEnumType pEnum = rdo::Factory::create(); + BOOST_CHECK(pEnum); + BOOST_CHECK(pEnum->empty()); + pEnum->add("test0"); + pEnum->add("test1"); + pEnum->add("test2"); + pEnum->add("test3"); + BOOST_CHECK(pEnum->findEnum("test1") == 1); + BOOST_CHECK(pEnum->exist ("test3")); + + RDOValue value(pEnum); + BOOST_CHECK(value.typeID () == RDOType::Type::ENUM); + BOOST_CHECK(value.getEnum () == pEnum); + BOOST_CHECK(value.getInt () == 0); + BOOST_CHECK(value.getDouble () == 0); + BOOST_CHECK(value.getEnumAsInt() == 0); + BOOST_CHECK(!value.getAsBool ()); + BOOST_CHECK(value.getAsString () == "test0"); + + RDOValue value1(pEnum, "test2"); + BOOST_CHECK(value1.typeID () == RDOType::Type::ENUM); + BOOST_CHECK(value1.getEnum () == pEnum); + BOOST_CHECK(value1.getInt () == 2); + BOOST_CHECK(value1.getDouble () == 2); + BOOST_CHECK(value1.getEnumAsInt() == 2); + BOOST_CHECK(value1.getAsBool ()); + BOOST_CHECK(value1.getAsString () == "test2"); + + RDOValue value2(pEnum, 2); + BOOST_CHECK(value2.typeID () == RDOType::Type::ENUM); + BOOST_CHECK(value2.getEnum () == pEnum); + BOOST_CHECK(value2.getInt () == 2); + BOOST_CHECK(value2.getDouble () == 2); + BOOST_CHECK(value2.getEnumAsInt() == 2); + BOOST_CHECK(value2.getAsBool ()); + BOOST_CHECK(value2.getAsString () == "test2"); } BOOST_AUTO_TEST_CASE(RDOValue_Rsint_Ruint) { - compareValue(10, 15, RDOType::t_int, RDOType::t_real); + compareValue(10, 15, RDOType::Type::INT, RDOType::Type::REAL); } BOOST_AUTO_TEST_CASE(RDOValue_Ruint_Rsint) { - compareValue(10, 15, RDOType::t_int, RDOType::t_real); + compareValue(10, 15, RDOType::Type::INT, RDOType::Type::REAL); } BOOST_AUTO_TEST_CASE(RDOValue_Rsint_Double) { - compareValue(10, 15.2, RDOType::t_int, RDOType::t_real); + compareValue(10, 15.2, RDOType::Type::INT, RDOType::Type::REAL); } BOOST_AUTO_TEST_CASE(RDOValue_Double_rsint) { - compareValue(10.2, 15, RDOType::t_real, RDOType::t_real); + compareValue(10.2, 15, RDOType::Type::REAL, RDOType::Type::REAL); } BOOST_AUTO_TEST_CASE(RDOValue_Ruint_Double) { - compareValue(10, 15.2, RDOType::t_int, RDOType::t_real); + compareValue(10, 15.2, RDOType::Type::INT, RDOType::Type::REAL); } BOOST_AUTO_TEST_CASE(RDOValue_Double_ruint) { - compareValue(10.2, 15, RDOType::t_real, RDOType::t_real); + compareValue(10.2, 15, RDOType::Type::REAL, RDOType::Type::REAL); } BOOST_AUTO_TEST_CASE(RDOValue_Rsint_String) { - compareStr(10, "abc"); + compareStr(10, "abc"); } BOOST_AUTO_TEST_CASE(RDOValue_Ruint_String) { - compareStr(10, "abc"); + compareStr(10, "abc"); } BOOST_AUTO_TEST_CASE(RDOValue_Double_String) { - compareStr(10, "abc"); + compareStr(10, "abc"); } BOOST_AUTO_TEST_CASE(RDOValue_Char_Rsint) { - compareChr(10, 'a'); + compareChr(10, 'a'); } BOOST_AUTO_TEST_CASE(RDOValue_Char_Ruint) { - compareChr(10, 'a'); + compareChr(10, 'a'); } BOOST_AUTO_TEST_CASE(RDOValue_Char_Double) { - compareChr(10, 'a'); + compareChr(10, 'a'); } BOOST_AUTO_TEST_CASE(RDOValue_String_Char) { - compareStr('a', "abc"); + compareStr('a', "abc"); } BOOST_AUTO_TEST_CASE(RDOValue_Identificator) { - const std::string str = "abc"; - RDOValue value1(str, g_identificator); - BOOST_CHECK(value1.typeID() == RDOType::t_identificator); - std::string iden = value1.getIdentificator(); - BOOST_CHECK(iden == str); - iden = value1.getAsString(); - BOOST_CHECK(iden == str); + const std::string str = "abc"; + RDOValue value1(str, g_IDENTIFICATOR); + BOOST_CHECK(value1.typeID() == RDOType::Type::IDENTIFICATOR); + std::string iden = value1.getIdentificator(); + BOOST_CHECK(iden == str); + iden = value1.getAsString(); + BOOST_CHECK(iden == str); - const std::string str2 ="dba"; - RDOValue value2(str2, g_identificator); - BOOST_CHECK(value1 != value2); + const std::string str2 ="dba"; + RDOValue value2(str2, g_IDENTIFICATOR); + BOOST_CHECK(value1 != value2); - RDOValue value3(str, g_identificator); - BOOST_CHECK(value1 == value3); + RDOValue value3(str, g_IDENTIFICATOR); + BOOST_CHECK(value1 == value3); } template void testUndef(const T1& param1) { - T1 val = param1; - RDOValue value(val); - BOOST_CHECK(value.isUndefined() == false); + T1 val = param1; + RDOValue value(val); + BOOST_CHECK(value.isUndefined() == false); } BOOST_AUTO_TEST_CASE(RDOValue_Undefined) { - testUndef(10); - testUndef(10); - testUndef(10.5); - testUndef("abc"); - testUndef('a'); - testUndef(true); + testUndef(10); + testUndef(10); + testUndef(10.5); + testUndef("abc"); + testUndef('a'); + testUndef(true); - int val1 = 10; - RDOValue value1(val1); - BOOST_CHECK(value1); + int val1 = 10; + RDOValue value1(val1); + BOOST_CHECK(value1); - BOOST_CHECK(value1.isUndefined() == false); - value1.setUndefined(true); - BOOST_CHECK(value1.isUndefined() == true); + BOOST_CHECK(value1.isUndefined() == false); + value1.setUndefined(true); + BOOST_CHECK(value1.isUndefined() == true); - RDOValue value2(value1); - BOOST_CHECK(value2.isUndefined() == true); + RDOValue value2(value1); + BOOST_CHECK(value2.isUndefined() == true); } namespace { rdo::runtime::LPRDOResource createSimpleResource( - const rdo::runtime::LPRDORuntime runtime, - const rdo::runtime::RDOResource::ParamList& params, - const rdo::runtime::LPIResourceType& type, - std::size_t resource_id, - std::size_t type_id, - bool trace, - bool temporary) + const rdo::runtime::LPRDORuntime runtime, + const rdo::runtime::RDOResource::ParamList& params, + const rdo::runtime::LPIResourceType& type, + std::size_t resource_id, + std::size_t type_id, + bool trace, + bool temporary) { - return rdo::Factory::create(runtime, params, type, resource_id, type_id, trace, temporary); + return rdo::Factory::create(runtime, params, type, resource_id, type_id, trace, temporary); } } BOOST_AUTO_TEST_CASE(RDOValue_Resource) { - Error error; - LPRDORuntime pRuntime = rdo::Factory::create(&error); - BOOST_CHECK(pRuntime); + Error error; + LPRDORuntime pRuntime = rdo::Factory::create(&error); + BOOST_CHECK(pRuntime); - LPRDOResourceTypeList pResourceType = rdo::Factory::create(1, pRuntime); - BOOST_CHECK(pResourceType); - pResourceType->setFactoryMethod(boost::bind(&createSimpleResource, _1, _2, _3, _4, _5, _6, _7)); + LPRDOResourceTypeList pResourceType = rdo::Factory::create(1, pRuntime); + BOOST_CHECK(pResourceType); + pResourceType->setFactoryMethod(boost::bind(&createSimpleResource, _1, _2, _3, _4, _5, _6, _7)); - LPIResourceType pResourceFactory = pResourceType.interface_cast(); - BOOST_CHECK(pResourceFactory); + LPIResourceType pResourceFactory = pResourceType.interface_cast(); + BOOST_CHECK(pResourceFactory); - std::vector paramList; - paramList.push_back(RDOValue(1)); - paramList.push_back(RDOValue(2.2)); - paramList.push_back(RDOValue("3")); + std::vector paramList; + paramList.push_back(RDOValue(1)); + paramList.push_back(RDOValue(2.2)); + paramList.push_back(RDOValue("3")); - LPRDOResource pResource = pResourceFactory->createRes(pRuntime, pRuntime->getResourceId(), paramList, true, true); - BOOST_CHECK(pResource); + LPRDOResource pResource = pResourceFactory->createRes(pRuntime, pRuntime->getResourceId(), paramList, true, true); + BOOST_CHECK(pResource); - RDOValue value1(pResourceType, pResource); + RDOValue value1(pResourceType, pResource); - LPRDOResourceTypeList pType = value1.type().object_dynamic_cast(); - BOOST_CHECK(pType); + LPRDOResourceTypeList pType = value1.type().object_dynamic_cast(); + BOOST_CHECK(pType); - LPRDOResource pResource1 = value1.getPointerByType(); + LPRDOResource pResource1 = value1.getPointerByType(); - pRuntime = NULL; - value1 = RDOValue(); - pResource1 = NULL; - pResourceType->eraseRes(pResource); + pRuntime = NULL; + value1 = RDOValue(); + pResource1 = NULL; + pResourceType->eraseRes(pResource); - BOOST_CHECK(pResource.owner()); + BOOST_CHECK(pResource.owner()); - pResource = NULL; + pResource = NULL; } BOOST_AUTO_TEST_SUITE_END() // RDOValue_Test diff --git a/simulator/runtime/thread_proxy_i.h b/simulator/runtime/thread_proxy_i.h index 19045f5e8..2d711f48f 100644 --- a/simulator/runtime/thread_proxy_i.h +++ b/simulator/runtime/thread_proxy_i.h @@ -1,5 +1,4 @@ -#ifndef _LIB_RUNTIME_THREAD_PROXY_I_H_ -#define _LIB_RUNTIME_THREAD_PROXY_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -12,17 +11,15 @@ struct IThreadProxy: public rdo::RefCounter { DECLARE_FACTORY(IThreadProxy) public: - enum ThreadID - { - TID_REPOSITORY - }; - virtual void sendMessage(ThreadID threadID, std::size_t messageID, void* pParam) = 0; + enum class ThreadID + { + REPOSITORY + }; + virtual void sendMessage(ThreadID threadID, std::size_t messageID, void* pParam) = 0; protected: - IThreadProxy() - {} - virtual ~IThreadProxy() - {} + IThreadProxy() + {} + virtual ~IThreadProxy() + {} }; - -#endif // _LIB_RUNTIME_THREAD_PROXY_I_H_ diff --git a/simulator/service/CMakeLists.txt b/simulator/service/CMakeLists.txt index 647e515fc..687064a95 100644 --- a/simulator/service/CMakeLists.txt +++ b/simulator/service/CMakeLists.txt @@ -11,7 +11,7 @@ INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) -FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/*.cpp) +FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} src/*.cpp src/*.h) ADD_LIBRARY(rdo_simulator STATIC ${SOURCE_FILES}) INCLUDE(${PROJECT_SOURCE_DIR}/simulator/simulator.cmake) @@ -21,7 +21,6 @@ ADD_DEPENDENCIES(rdo_simulator rdo_utils) ADD_DEPENDENCIES(rdo_simulator rdo_runtime) ADD_DEPENDENCIES(rdo_simulator rdo_parser) ADD_DEPENDENCIES(rdo_simulator rdo_mbuilder) -ADD_DEPENDENCIES(rdo_simulator rdo_procgui) ADD_DEPENDENCIES(rdo_simulator rdo_simulator_report) ADD_DEPENDENCIES(rdo_simulator rdo_converter_smr2rdox) @@ -30,7 +29,6 @@ TARGET_LINK_LIBRARIES(rdo_simulator rdo_utils) TARGET_LINK_LIBRARIES(rdo_simulator rdo_runtime) TARGET_LINK_LIBRARIES(rdo_simulator rdo_parser) TARGET_LINK_LIBRARIES(rdo_simulator rdo_mbuilder) -TARGET_LINK_LIBRARIES(rdo_simulator rdo_procgui) TARGET_LINK_LIBRARIES(rdo_simulator rdo_simulator_report) TARGET_LINK_LIBRARIES(rdo_simulator rdo_converter_smr2rdox) diff --git a/simulator/service/src/show_mode.h b/simulator/service/src/show_mode.h index 0dc6bd150..5f0d95019 100644 --- a/simulator/service/src/show_mode.h +++ b/simulator/service/src/show_mode.h @@ -1,5 +1,4 @@ -#ifndef _LIB_SERVICE_SHOW_MODE_H_ -#define _LIB_SERVICE_SHOW_MODE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,14 +8,11 @@ namespace rdo { namespace service { namespace simulation { -//! Режимы анимации -enum ShowMode +enum class ShowMode { - SM_NoShow, //!< Без анимации - SM_Animation, //!< С анимацией - SM_Monitor //!< Анимация и модель на паузе + NoShow, // Без анимации + Animation, // С анимацией + Monitor // Анимация и модель на паузе }; }}} // namespace rdo::service::simulation - -#endif // _LIB_SERVICE_SHOW_MODE_H_ diff --git a/simulator/service/src/simulator.cpp b/simulator/service/src/simulator.cpp index ffdaee924..5707ff571 100644 --- a/simulator/service/src/simulator.cpp +++ b/simulator/service/src/simulator.cpp @@ -3,8 +3,8 @@ #include "utils/src/common/platform.h" // ----------------------------------------------------------------------- INCLUDES #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable : 4786) - #include + #pragma warning(disable : 4786) + #include #endif // COMPILER_VISUAL_STUDIO #include #include @@ -28,18 +28,15 @@ #include "kernel/rdokernel.h" #include "repository/rdorepository.h" #include "simulator/runtime/rdotrace.h" -#include "simulator/runtime/rdo_runtime.h" #include "simulator/runtime/rdoframe.h" -#include "simulator/compiler/parser/rdoparser.h" #include "simulator/compiler/parser/rdosmr.h" #include "simulator/compiler/parser/src/animation/animation_frame.h" #include "simulator/compiler/parser/rdortp.h" #include "simulator/compiler/mbuilder/rdo_resources.h" -#include "simulator/compiler/procgui/procgui_datablock.h" #include "simulator/service/src/simulator.h" #ifndef DISABLE_CONVERTER - #include "converter/smr2rdox/rdoparser.h" + #include "converter/smr2rdox/rdoparser.h" #endif // DISABLE_CONVERTER // -------------------------------------------------------------------------------- @@ -58,287 +55,266 @@ CORBA::ORB_var g_orb; class RDOCorba_i: public POA_rdoParse::RDOCorba { public: - RDOCorba_i() - {} - virtual ~RDOCorba_i() - {} + RDOCorba_i() + {} + virtual ~RDOCorba_i() + {} - virtual rdo::compiler::parser::RDOCorba::GetRTP* getRDORTPlist (::CORBA::Long& rtp_count); - virtual rdo::compiler::parser::RDOCorba::GetRSS* getRDORSSPlist(::CORBA::Long& rss_count); + virtual rdo::compiler::parser::RDOCorba::GetRTP* getRDORTPlist (::CORBA::Long& rtp_count); + virtual rdo::compiler::parser::RDOCorba::GetRSS* getRDORSSPlist(::CORBA::Long& rss_count); - static CORBA::Boolean bindObjectToName(CORBA::ORB_ptr orb, CORBA::Object_ptr objref); + static CORBA::Boolean bindObjectToName(CORBA::ORB_ptr orb, CORBA::Object_ptr objref); }; rdo::compiler::parser::RDOCorba::GetRTP* RDOCorba_i::getRDORTPlist(::CORBA::Long& rtp_count) { - //! Создаем список структур для хранения информации об искомых типах ресурсов - rdo::compiler::parser::RDOCorba::GetRTP_var my_rtpList = new rdo::compiler::parser::RDOCorba::GetRTP; + // Создаем список структур для хранения информации об искомых типах ресурсов + rdo::compiler::parser::RDOCorba::GetRTP_var my_rtpList = new rdo::compiler::parser::RDOCorba::GetRTP; - //! Получаем необходимые нам данные о типах ресурсов РДО - kernel->sendMessage(kernel->simulator(), RDOThread::RT_CORBA_PARSER_GET_RTP, &my_rtpList); + // Получаем необходимые нам данные о типах ресурсов РДО + kernel->sendMessage(kernel->simulator(), RDOThread::Message::CORBA_PARSER_GET_RTP, &my_rtpList); - return my_rtpList._retn(); + return my_rtpList._retn(); } rdo::compiler::parser::RDOCorba::GetRSS* RDOCorba_i::getRDORSSPlist(::CORBA::Long& rss_count) { - //! Создаем список структур для хранения информации об искомых ресурсах - rdo::compiler::parser::RDOCorba::GetRSS_var my_rssList = new rdo::compiler::parser::RDOCorba::GetRSS; + // Создаем список структур для хранения информации об искомых ресурсах + rdo::compiler::parser::RDOCorba::GetRSS_var my_rssList = new rdo::compiler::parser::RDOCorba::GetRSS; - //! Получаем необходимые нам данные о ресурсах РДО - kernel->sendMessage(kernel->simulator(), RDOThread::RT_CORBA_PARSER_GET_RSS, &my_rssList); + // Получаем необходимые нам данные о ресурсах РДО + kernel->sendMessage(kernel->simulator(), RDOThread::Message::CORBA_PARSER_GET_RSS, &my_rssList); - return my_rssList._retn(); + return my_rssList._retn(); } CORBA::Boolean bindObjectToName(CORBA::ORB_ptr orb, CORBA::Object_ptr objref, const char* ModelName) { - CosNaming::NamingContext_var rootContext; - - try - { - //! Obtain a reference to the root context of the Name service: - CORBA::Object_var obj; - obj = orb->resolve_initial_references("NameService"); - - //! Narrow the reference returned. - rootContext = CosNaming::NamingContext::_narrow(obj); - if (CORBA::is_nil(rootContext)) - { - TRACE("Failed to narrow the root naming context."); - return 0; - } - } - catch (const CORBA::NO_RESOURCES&) - { - TRACE("Caught NO_RESOURCES exception. You must configure omniORB with the location of the naming service."); - return 0; - } - catch (const CORBA::ORB::InvalidName&) - { - //! This should not happen! - TRACE("Service required is invalid [does not exist]."); - return 0; - } - - try - { - //! Bind a context called "test" to the root context: - CosNaming::Name contextName; - contextName.length(1); - contextName[0].id = (const char*)"RDO"; //! string copied - contextName[0].kind = (const char*)"RDO_context"; //! string copied - - //! Note on kind: The kind field is used to indicate the type - //! of the object. This is to avoid conventions such as that used - //! by files (name.type -- e.g. test.ps = postscript etc.) - CosNaming::NamingContext_var testContext; - - try - { - //! Bind the context to root. - testContext = rootContext->bind_new_context(contextName); - } - catch(const CosNaming::NamingContext::AlreadyBound&) - { - //! If the context already exists, this exception will be raised. - //! In this case, just resolve the name and assign testContext - //! to the object returned: - CORBA::Object_var obj; - obj = rootContext->resolve(contextName); - - testContext = CosNaming::NamingContext::_narrow(obj); - - if (CORBA::is_nil(testContext)) - { - TRACE("Failed to narrow naming context."); - return 0; - } - } - - //! Bind objref with name Echo to the testContext: - CosNaming::Name objectName; - objectName.length(1); - - //! rdo::compiler::parser::RDOParserSMRInfo parser; - //! parser.parse(); - - objectName[0].id = ModelName; - objectName[0].kind = (const char*)"Object"; - - try - { - testContext->bind(objectName, objref); - } - catch(const CosNaming::NamingContext::AlreadyBound&) - { - testContext->rebind(objectName, objref); - } - - //! Note: Using rebind() will overwrite any Object previously bound - //! to /test/Echo with obj. - //! Alternatively, bind() can be used, which will raise a - //! CosNaming::NamingContext::AlreadyBound exception if the name - //! supplied is already bound to an object. - //! Amendment: When using OrbixNames, it is necessary to first try bind - //! and then rebind, as rebind on it’s own will throw a NotFoundexception if - //! the Name has not already been bound. [This is incorrect behaviour - - //! it should just bind]. - } - catch(const CORBA::TRANSIENT&) - { - TRACE("Caught system exception TRANSIENT -- unable to contact the naming service."); - TRACE("Make sure the naming server is running and that omniORB is configured correctly."); - return 0; - } - catch(const CORBA::SystemException& ex) - { - TRACE1("Caught a CORBA:: %s while using the naming service.", ex._name()); - return 0; - } - - return 1; + CosNaming::NamingContext_var rootContext; + + try + { + // Obtain a reference to the root context of the Name service: + CORBA::Object_var obj; + obj = orb->resolve_initial_references("NameService"); + + // Narrow the reference returned. + rootContext = CosNaming::NamingContext::_narrow(obj); + if (CORBA::is_nil(rootContext)) + { + TRACE("Failed to narrow the root naming context."); + return 0; + } + } + catch (const CORBA::NO_RESOURCES&) + { + TRACE("Caught NO_RESOURCES exception. You must configure omniORB with the location of the naming service."); + return 0; + } + catch (const CORBA::ORB::InvalidName&) + { + // This should not happen! + TRACE("Service required is invalid [does not exist]."); + return 0; + } + + try + { + // Bind a context called "test" to the root context: + CosNaming::Name contextName; + contextName.length(1); + contextName[0].id = (const char*)"RDO"; // string copied + contextName[0].kind = (const char*)"RDO_context"; // string copied + + // Note on kind: The kind field is used to indicate the type + // of the object. This is to avoid conventions such as that used + // by files (name.type -- e.g. test.ps = postscript etc.) + CosNaming::NamingContext_var testContext; + + try + { + // Bind the context to root. + testContext = rootContext->bind_new_context(contextName); + } + catch(const CosNaming::NamingContext::AlreadyBound&) + { + // If the context already exists, this exception will be raised. + // In this case, just resolve the name and assign testContext + // to the object returned: + CORBA::Object_var obj; + obj = rootContext->resolve(contextName); + + testContext = CosNaming::NamingContext::_narrow(obj); + + if (CORBA::is_nil(testContext)) + { + TRACE("Failed to narrow naming context."); + return 0; + } + } + + // Bind objref with name Echo to the testContext: + CosNaming::Name objectName; + objectName.length(1); + + // rdo::compiler::parser::RDOParserSMRInfo parser; + // parser.parse(); + + objectName[0].id = ModelName; + objectName[0].kind = (const char*)"Object"; + + try + { + testContext->bind(objectName, objref); + } + catch(const CosNaming::NamingContext::AlreadyBound&) + { + testContext->rebind(objectName, objref); + } + + // Note: Using rebind() will overwrite any Object previously bound + // to /test/Echo with obj. + // Alternatively, bind() can be used, which will raise a + // CosNaming::NamingContext::AlreadyBound exception if the name + // supplied is already bound to an object. + // Amendment: When using OrbixNames, it is necessary to first try bind + // and then rebind, as rebind on it’s own will throw a NotFoundexception if + // the Name has not already been bound. [This is incorrect behaviour - + // it should just bind]. + } + catch(const CORBA::TRANSIENT&) + { + TRACE("Caught system exception TRANSIENT -- unable to contact the naming service."); + TRACE("Make sure the naming server is running and that omniORB is configured correctly."); + return 0; + } + catch(const CORBA::SystemException& ex) + { + TRACE1("Caught a CORBA:: %s while using the naming service.", ex._name()); + return 0; + } + + return 1; } std::size_t RDOThreadCorba::corbaRunThreadFun(void* pParam) { - try - { - int argc = 0; - g_orb = CORBA::ORB_init(argc, NULL); + try + { + int argc = 0; + g_orb = CORBA::ORB_init(argc, NULL); - CORBA::Object_var obj = g_orb->resolve_initial_references("RootPOA"); - PortableServer::POA_var poa = PortableServer::POA::_narrow(obj); + CORBA::Object_var obj = g_orb->resolve_initial_references("RootPOA"); + PortableServer::POA_var poa = PortableServer::POA::_narrow(obj); - RDOCorba_i* myrdocorba = new RDOCorba_i(); + RDOCorba_i* myrdocorba = new RDOCorba_i(); - PortableServer::ObjectId_var myrdocorbaid = poa->activate_object(myrdocorba); + PortableServer::ObjectId_var myrdocorbaid = poa->activate_object(myrdocorba); - //! Obtain a reference to the object, and register it in - //! the naming service. - obj = myrdocorba->_this(); + // Obtain a reference to the object, and register it in + // the naming service. + obj = myrdocorba->_this(); - const char* ModelName = "ЦЕХ"; - //! const char* ModelName = "СКЛАД"; + const char* ModelName = "ЦЕХ"; + // const char* ModelName = "СКЛАД"; - if (!bindObjectToName(g_orb, obj, ModelName)) - { - delete myrdocorba; - return 1; - } + if (!bindObjectToName(g_orb, obj, ModelName)) + { + delete myrdocorba; + return 1; + } - myrdocorba->_remove_ref(); + myrdocorba->_remove_ref(); - PortableServer::POAManager_var pman = poa->the_POAManager(); + PortableServer::POAManager_var pman = poa->the_POAManager(); - pman->activate(); + pman->activate(); - g_orb->run(); - } - catch(const CORBA::SystemException& ex) - { - TRACE1("Caught CORBA::%s", ex._name()); - } - catch(const CORBA::Exception&) - { - TRACE("Caught CORBA::Exception: "); - } - catch(const omniORB::fatalException& fe) - { - TRACE3("Caught omniORB::fatalException: file: %s, line: %d, mesg: %s ", fe.file(), fe.line(), fe.errmsg()); - } + g_orb->run(); + } + catch(const CORBA::SystemException& ex) + { + TRACE1("Caught CORBA::%s", ex._name()); + } + catch(const CORBA::Exception&) + { + TRACE("Caught CORBA::Exception: "); + } + catch(const omniORB::fatalException& fe) + { + TRACE3("Caught omniORB::fatalException: file: %s, line: %d, mesg: %s ", fe.file(), fe.line(), fe.errmsg()); + } - return 0; + return 0; } RDOThreadCorba::RDOThreadCorba() - : RDOThreadMT ("RDOThreadCorba") - , thread_corbaRunThreadFun(NULL ) + : RDOThreadMT ("RDOThreadCorba") + , thread_corbaRunThreadFun(NULL ) { - //! Место для регистации сообщений корбе - after_constructor(); + // Место для регистации сообщений корбе + after_constructor(); } void RDOThreadCorba::proc(RDOMessageInfo& msg) { - //! Место для обработки сообщений корбе + // Место для обработки сообщений корбе } void RDOThreadCorba::start() { -#ifdef TR_TRACE - trace(thread_name + " corba begin"); -#endif - - //! Место для запуска корбы - thread_corbaRunThreadFun = AfxBeginThread(corbaRunThreadFun, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); - thread_corbaRunThreadFun->m_bAutoDelete = false; - thread_corbaRunThreadFun->ResumeThread(); - -#ifdef TR_TRACE - trace(thread_name + " corba end"); -#endif + // Место для запуска корбы + thread_corbaRunThreadFun = AfxBeginThread(corbaRunThreadFun, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); + thread_corbaRunThreadFun->m_bAutoDelete = false; + thread_corbaRunThreadFun->ResumeThread(); } void RDOThreadCorba::idle() { -#ifdef RDO_MT - if (broadcast_waiting || !was_start || was_close) - { - RDOThread::idle(); - return; - } -#endif - //! Вот тут основная работа корбы + // Вот тут основная работа корбы } void RDOThreadCorba::stop() { -#ifdef TR_TRACE - trace(thread_name + " stop begin"); -#endif - //! Место для остановки корбы - if (g_orb != CORBA::ORB::_nil()) - { - try - { - g_orb->shutdown(true); - g_orb->destroy(); - } - catch (...) - {} - } - - if (thread_corbaRunThreadFun) - { - DWORD res; - while (true) - { - if (::GetExitCodeThread(thread_corbaRunThreadFun->m_hThread, &res)) - { - if (res == STILL_ACTIVE) - { - ::Sleep(1); - } - else - { - break; - } - } - } -// thread_corbaRunThreadFun->Delete(); - delete thread_corbaRunThreadFun; - thread_corbaRunThreadFun = NULL; - } - - RDOThread::stop(); -#ifdef TR_TRACE - trace(thread_name + " stop end"); -#endif + // Место для остановки корбы + if (g_orb != CORBA::ORB::_nil()) + { + try + { + g_orb->shutdown(true); + g_orb->destroy(); + } + catch (...) + {} + } + + if (thread_corbaRunThreadFun) + { + DWORD res; + while (true) + { + if (::GetExitCodeThread(thread_corbaRunThreadFun->m_hThread, &res)) + { + if (res == STILL_ACTIVE) + { + ::Sleep(1); + } + else + { + break; + } + } + } +// thread_corbaRunThreadFun->Delete(); + delete thread_corbaRunThreadFun; + thread_corbaRunThreadFun = NULL; + } + + RDOThread::stop(); } -} //! namespace rdoCorba +} // namespace rdoCorba #endif // CORBA_ENABLE @@ -353,42 +329,42 @@ namespace simulation { class RDORuntimeTracer: public rdo::runtime::RDOTrace, public rdo::runtime::RDOEndL { public: - virtual std::ostream& getOStream() { return m_stream; } - virtual rdo::runtime::RDOEndL& getEOL() { return *this; } - - void onEndl() - { - const std::string& trace_str = m_stream.str(); - if (trace_str.empty() ) return; - if (!m_pSimulator->m_canTrace) return; - std::string::size_type pos = 0; - for (;;) - { - std::string::size_type next = trace_str.find('\n', pos); - std::string str = trace_str.substr(pos, next-pos); - m_pSimulator->m_pThreadRuntime->broadcastMessage(RDOThread::RT_RUNTIME_TRACE_STRING, &str, true); - if (next == std::string::npos) - { - break; - } - pos = next + 1; - if (pos >= trace_str.length()) - { - break; - } - } - m_stream.str(""); - } - - RDORuntimeTracer(RDOThreadSimulator* pSimulator) - : m_pSimulator(pSimulator) - { - m_isNullTracer = false; - } + virtual std::ostream& getOStream() { return m_stream; } + virtual rdo::runtime::RDOEndL& getEOL() { return *this; } + + void onEndl() + { + const std::string& trace_str = m_stream.str(); + if (trace_str.empty() ) return; + if (!m_pSimulator->m_canTrace) return; + std::string::size_type pos = 0; + for (;;) + { + std::string::size_type next = trace_str.find('\n', pos); + std::string str = trace_str.substr(pos, next-pos); + m_pSimulator->m_pThreadRuntime->broadcastMessage(RDOThread::Message::RUNTIME_TRACE_STRING, &str, true); + if (next == std::string::npos) + { + break; + } + pos = next + 1; + if (pos >= trace_str.length()) + { + break; + } + } + m_stream.str(""); + } + + RDORuntimeTracer(RDOThreadSimulator* pSimulator) + : m_pSimulator(pSimulator) + { + m_isNullTracer = false; + } private: - RDOThreadSimulator* m_pSimulator; - std::stringstream m_stream; + RDOThreadSimulator* m_pSimulator; + std::stringstream m_stream; }; // -------------------------------------------------------------------------------- @@ -397,73 +373,73 @@ class RDORuntimeTracer: public rdo::runtime::RDOTrace, public rdo::runtime::RDOE class RDOSimResulter: public rdo::runtime::RDOResults { public: - RDOSimResulter(RDOThreadSimulator* pSimulator, std::ostream& stream) - : m_pSimulator(pSimulator) - , m_stream (stream ) - {} + RDOSimResulter(RDOThreadSimulator* pSimulator, std::ostream& stream) + : m_pSimulator(pSimulator) + , m_stream (stream ) + {} private: - RDOThreadSimulator* m_pSimulator; - std::ostream& m_stream; - std::stringstream m_buffer; - - virtual std::ostream& getOStream() - { - return m_buffer; - } - - void flush() - { - const std::string& bufferStr = m_buffer.str(); - if (bufferStr.empty()) - { - return; - } - - m_stream << bufferStr; - - std::string::size_type pos = 0; - for (;;) - { - std::string::size_type next = bufferStr.find('\n', pos); - std::string str = bufferStr.substr(pos, next-pos+1); - m_pSimulator->m_pThreadRuntime->broadcastMessage(RDOThread::RT_RESULT_STRING, &str, true); - if (next == std::string::npos) - { - break; - } - pos = next + 1; - if (pos >= bufferStr.length()) - { - break; - } - } - m_buffer.str(""); - } + RDOThreadSimulator* m_pSimulator; + std::ostream& m_stream; + std::stringstream m_buffer; + + virtual std::ostream& getOStream() + { + return m_buffer; + } + + void flush() + { + const std::string& bufferStr = m_buffer.str(); + if (bufferStr.empty()) + { + return; + } + + m_stream << bufferStr; + + std::string::size_type pos = 0; + for (;;) + { + std::string::size_type next = bufferStr.find('\n', pos); + std::string str = bufferStr.substr(pos, next-pos+1); + m_pSimulator->m_pThreadRuntime->broadcastMessage(RDOThread::Message::RESULT_STRING, &str, true); + if (next == std::string::npos) + { + break; + } + pos = next + 1; + if (pos >= bufferStr.length()) + { + break; + } + } + m_buffer.str(""); + } }; // -------------------------------------------------------------------------------- // -------------------- RDOSimResultInformer // -------------------------------------------------------------------------------- -class RDOSimResultInformer: public rdo::runtime::RDOResults, public boost::noncopyable +class RDOSimResultInformer: public rdo::runtime::RDOResults, private boost::noncopyable { public: - RDOSimResultInformer(std::ostream& stream) - : m_stream(stream) - {} + RDOSimResultInformer(std::ostream& stream) + : m_stream(stream) + {} private: - std::ostream& m_stream; + std::ostream& m_stream; - virtual std::ostream& getOStream() - { - return m_stream; - } + virtual std::ostream& getOStream() + { + return m_stream; + } - void flush() - { - NEVER_REACH_HERE; - } + void flush() + { + NEVER_REACH_HERE; + } }; }}} // namespace rdo::service::simulation @@ -473,349 +449,324 @@ OPEN_RDO_RUNTIME_NAMESPACE // -------------------- RDOThreadRunTime // -------------------------------------------------------------------------------- RDOThreadRunTime::RDOThreadRunTime() - : RDOThreadMT ("RDOThreadRunTime") - , m_pSimulator (NULL ) - , m_runtimeError(false ) + : RDOThreadMT ("RDOThreadRunTime") + , m_pSimulator (NULL ) + , m_runtimeError(false ) { - rdo::Time time; - - m_timeStart = time.local(); - m_timeStart /= 1000000; - - m_pSimulator = kernel->simulator(); - - notifies.push_back(RT_SIMULATOR_MODEL_STOP_RUNTIME_DELAY); - notifies.push_back(RT_RUNTIME_GET_MODE ); - notifies.push_back(RT_RUNTIME_SET_MODE ); - notifies.push_back(RT_RUNTIME_GET_SPEED ); - notifies.push_back(RT_RUNTIME_SET_SPEED ); - notifies.push_back(RT_RUNTIME_GET_SHOWRATE ); - notifies.push_back(RT_RUNTIME_SET_SHOWRATE ); - notifies.push_back(RT_RUNTIME_GET_TIMENOW ); - notifies.push_back(RT_RUNTIME_GET_FRAME ); - notifies.push_back(RT_RUNTIME_KEY_DOWN ); - notifies.push_back(RT_RUNTIME_KEY_UP ); - notifies.push_back(RT_RUNTIME_FRAME_AREA_DOWN ); - after_constructor(); + rdo::Time time; + + m_timeStart = time.local(); + m_timeStart /= 1000000; + + m_pSimulator = kernel->simulator(); + + notifies.push_back(Message::SIMULATOR_MODEL_STOP_RUNTIME_DELAY); + notifies.push_back(Message::RUNTIME_GET_MODE ); + notifies.push_back(Message::RUNTIME_SET_MODE ); + notifies.push_back(Message::RUNTIME_GET_SPEED ); + notifies.push_back(Message::RUNTIME_SET_SPEED ); + notifies.push_back(Message::RUNTIME_GET_SHOWRATE ); + notifies.push_back(Message::RUNTIME_SET_SHOWRATE ); + notifies.push_back(Message::RUNTIME_GET_TIMENOW ); + notifies.push_back(Message::RUNTIME_GET_FRAME ); + notifies.push_back(Message::RUNTIME_KEY_DOWN ); + notifies.push_back(Message::RUNTIME_KEY_UP ); + notifies.push_back(Message::RUNTIME_FRAME_AREA_DOWN ); + after_constructor(); } void RDOThreadRunTime::proc(RDOMessageInfo& msg) { - switch (msg.message) - { - case RT_THREAD_CLOSE: - { - broadcastMessage(RT_RUNTIME_MODEL_STOP_BEFORE); - break; - } - case RT_SIMULATOR_MODEL_STOP_RUNTIME_DELAY: - { - m_runtimeError = true; - break; - } - case RT_RUNTIME_GET_MODE: - { - *static_cast(msg.param) = m_pSimulator->m_pRuntime->getMode(); - break; - } - case RT_RUNTIME_SET_MODE: - { - msg.lock(); - m_pSimulator->m_pRuntime->setMode(*static_cast(msg.param)); - msg.unlock(); - break; - } - case RT_RUNTIME_GET_SPEED: - { - *static_cast(msg.param) = m_pSimulator->m_pRuntime->getSpeed(); - break; - } - case RT_RUNTIME_SET_SPEED: - { - msg.lock(); - m_pSimulator->m_pRuntime->setSpeed(*static_cast(msg.param)); - msg.unlock(); - break; - } - case RT_RUNTIME_GET_SHOWRATE: - { - *static_cast(msg.param) = m_pSimulator->m_pRuntime->getShowRate(); - break; - } - case RT_RUNTIME_SET_SHOWRATE: - { - msg.lock(); - m_pSimulator->m_pRuntime->setShowRate(*static_cast(msg.param)); - msg.unlock(); - break; - } - case RT_RUNTIME_GET_TIMENOW: - { - *static_cast(msg.param) = m_pSimulator->m_pRuntime->getTimeNow(); - break; - } - case RT_RUNTIME_GET_FRAME: - { - msg.lock(); - GetFrame* getframe = static_cast(msg.param); - m_pSimulator->m_pRuntime->m_frameList.at(getframe->m_number)->prepareFrame(getframe->m_pFrame, m_pSimulator->m_pRuntime); - msg.unlock(); - break; - } - case RT_RUNTIME_GET_LAST_BREAKPOINT: - { - msg.lock(); - *static_cast(msg.param) = m_pSimulator->m_pRuntime->getLastBreakPointName(); - msg.unlock(); - break; - } - case RT_RUNTIME_KEY_DOWN: - { - msg.lock(); - RDOHotKey::KeyCode keyCode = *static_cast(msg.param); - msg.unlock(); - - if (m_pSimulator->m_pRuntime->hotkey().keyInModel().check(keyCode)) - { - if (!m_pSimulator->m_pRuntime->hotkey().keyDown().down(keyCode)) - { - m_pSimulator->m_pRuntime->setShowRate(m_pSimulator->m_pRuntime->getShowRate()); - } - } - break; - } - case RT_RUNTIME_KEY_UP: - { - msg.lock(); - RDOHotKey::KeyCode keyCode = *static_cast(msg.param); - msg.unlock(); - m_pSimulator->m_pRuntime->hotkey().keyDown().up(keyCode); - break; - } - case RT_RUNTIME_FRAME_AREA_DOWN: - { - msg.lock(); - std::string areaName = *static_cast(msg.param); - msg.unlock(); - m_pSimulator->m_pRuntime->hotkey().areaList().click(areaName); - m_pSimulator->m_pRuntime->setShowRate(m_pSimulator->m_pRuntime->getShowRate()); - break; - } - default: break; - } + switch (msg.message) + { + case Message::THREAD_CLOSE: + { + broadcastMessage(Message::RUNTIME_MODEL_STOP_BEFORE); + break; + } + case Message::SIMULATOR_MODEL_STOP_RUNTIME_DELAY: + { + m_runtimeError = true; + break; + } + case Message::RUNTIME_GET_MODE: + { + *static_cast(msg.param) = m_pSimulator->m_pRuntime->getMode(); + break; + } + case Message::RUNTIME_SET_MODE: + { + msg.lock(); + m_pSimulator->m_pRuntime->setMode(*static_cast(msg.param)); + msg.unlock(); + break; + } + case Message::RUNTIME_GET_SPEED: + { + *static_cast(msg.param) = m_pSimulator->m_pRuntime->getSpeed(); + break; + } + case Message::RUNTIME_SET_SPEED: + { + msg.lock(); + m_pSimulator->m_pRuntime->setSpeed(*static_cast(msg.param)); + msg.unlock(); + break; + } + case Message::RUNTIME_GET_SHOWRATE: + { + *static_cast(msg.param) = m_pSimulator->m_pRuntime->getShowRate(); + break; + } + case Message::RUNTIME_SET_SHOWRATE: + { + msg.lock(); + m_pSimulator->m_pRuntime->setShowRate(*static_cast(msg.param)); + msg.unlock(); + break; + } + case Message::RUNTIME_GET_TIMENOW: + { + *static_cast(msg.param) = m_pSimulator->m_pRuntime->getTimeNow(); + break; + } + case Message::RUNTIME_GET_FRAME: + { + msg.lock(); + GetFrame* getframe = static_cast(msg.param); + m_pSimulator->m_pRuntime->m_frameList.at(getframe->m_number)->prepareFrame(getframe->m_pFrame, m_pSimulator->m_pRuntime); + msg.unlock(); + break; + } + case Message::RUNTIME_GET_LAST_BREAKPOINT: + { + msg.lock(); + *static_cast(msg.param) = m_pSimulator->m_pRuntime->getLastBreakPointName(); + msg.unlock(); + break; + } + case Message::RUNTIME_KEY_DOWN: + { + msg.lock(); + RDOHotKey::KeyCode keyCode = *static_cast(msg.param); + msg.unlock(); + + if (m_pSimulator->m_pRuntime->hotkey().keyInModel().check(keyCode)) + { + if (!m_pSimulator->m_pRuntime->hotkey().keyDown().down(keyCode)) + { + m_pSimulator->m_pRuntime->setShowRate(m_pSimulator->m_pRuntime->getShowRate()); + } + } + break; + } + case Message::RUNTIME_KEY_UP: + { + msg.lock(); + RDOHotKey::KeyCode keyCode = *static_cast(msg.param); + msg.unlock(); + m_pSimulator->m_pRuntime->hotkey().keyDown().up(keyCode); + break; + } + case Message::RUNTIME_FRAME_AREA_DOWN: + { + msg.lock(); + std::string areaName = *static_cast(msg.param); + msg.unlock(); + m_pSimulator->m_pRuntime->hotkey().areaList().click(areaName); + m_pSimulator->m_pRuntime->setShowRate(m_pSimulator->m_pRuntime->getShowRate()); + break; + } + default: break; + } } void RDOThreadRunTime::start() { -#ifdef TR_TRACE - trace(thread_name + " start begin"); -#endif - - broadcastMessage(RT_RUNTIME_MODEL_START_BEFORE); - - RDOTrace* pTracer; - rdo::runtime::RDOResults* pResults; - rdo::runtime::RDOResults* pResultsInfo; - - //! Creating tracer and results - pTracer = new rdo::service::simulation::RDORuntimeTracer(m_pSimulator); - - m_pSimulator->m_resultString.str(""); - pResults = new rdo::service::simulation::RDOSimResulter(m_pSimulator, m_pSimulator->m_resultString); - - m_pSimulator->m_resultInfoString.str(""); - pResultsInfo = new rdo::service::simulation::RDOSimResultInformer(m_pSimulator->m_resultInfoString); - - //! RDO config initialization - m_pSimulator->m_pRuntime->hotkey().clear(); - m_pSimulator->m_pRuntime->setStartTime (m_pSimulator->m_pParser->getSMR()->getRunStartTime ()); - m_pSimulator->m_pRuntime->setTraceStartTime(m_pSimulator->m_pParser->getSMR()->getTraceStartTime()); - m_pSimulator->m_pRuntime->setTraceEndTime (m_pSimulator->m_pParser->getSMR()->getTraceEndTime ()); - - //! Modelling - m_pSimulator->m_canTrace = true; - - try - { - LPRDOThreadRunTime pThis(this); - m_pSimulator->m_exitCode = rdo::simulation::report::EC_OK; - m_pSimulator->m_pRuntime->rdoInit(pTracer, pResults, pResultsInfo, pThis.interface_cast()); - switch (m_pSimulator->m_pParser->getSMR()->getShowMode()) - { - case rdo::service::simulation::SM_NoShow : m_pSimulator->m_pRuntime->setMode(rdo::runtime::RTM_MaxSpeed); break; - case rdo::service::simulation::SM_Animation: m_pSimulator->m_pRuntime->setMode(rdo::runtime::RTM_Sync ); break; - case rdo::service::simulation::SM_Monitor : m_pSimulator->m_pRuntime->setMode(rdo::runtime::RTM_Pause ); break; - } - m_pSimulator->m_pRuntime->setShowRate(m_pSimulator->m_pParser->getSMR()->getShowRate()); - } - catch (const rdo::compiler::parser::RDOSyntaxException&) - { - m_runtimeError = true; - m_pSimulator->m_pRuntime->onRuntimeError(); - } - catch (const rdo::runtime::RDORuntimeException& ex) - { - m_runtimeError = true; - m_pSimulator->m_pRuntime->onRuntimeError(); - std::string mess = ex.getType() + " : " + ex.message(); - RDOThreadMT::sendMessage(kernel, RDOThread::RT_DEBUG_STRING, &mess); - } - - if (!m_runtimeError) - { - broadcastMessage(RT_RUNTIME_MODEL_START_AFTER); - } - -#ifdef TR_TRACE - trace(thread_name + " start end, runing simulation"); -#endif + broadcastMessage(Message::RUNTIME_MODEL_START_BEFORE); + + RDOTrace* pTracer; + rdo::runtime::RDOResults* pResults; + rdo::runtime::RDOResults* pResultsInfo; + + // Creating tracer and results + pTracer = new rdo::service::simulation::RDORuntimeTracer(m_pSimulator); + + m_pSimulator->m_resultString.str(""); + pResults = new rdo::service::simulation::RDOSimResulter(m_pSimulator, m_pSimulator->m_resultString); + + m_pSimulator->m_resultInfoString.str(""); + pResultsInfo = new rdo::service::simulation::RDOSimResultInformer(m_pSimulator->m_resultInfoString); + + // RDO config initialization + m_pSimulator->m_pRuntime->hotkey().clear(); + m_pSimulator->m_pRuntime->setStartTime (m_pSimulator->m_pParser->getSMR()->getRunStartTime ()); + m_pSimulator->m_pRuntime->setTraceStartTime(m_pSimulator->m_pParser->getSMR()->getTraceStartTime()); + m_pSimulator->m_pRuntime->setTraceEndTime (m_pSimulator->m_pParser->getSMR()->getTraceEndTime ()); + + // Modelling + m_pSimulator->m_canTrace = true; + + try + { + LPRDOThreadRunTime pThis(this); + m_pSimulator->m_exitCode = rdo::simulation::report::ExitCode::OK; + m_pSimulator->m_pRuntime->rdoInit(pTracer, pResults, pResultsInfo, pThis.interface_cast()); + switch (m_pSimulator->m_pParser->getSMR()->getShowMode()) + { + case rdo::service::simulation::ShowMode::NoShow : m_pSimulator->m_pRuntime->setMode(rdo::runtime::RunTimeMode::MAX_SPEED); break; + case rdo::service::simulation::ShowMode::Animation: m_pSimulator->m_pRuntime->setMode(rdo::runtime::RunTimeMode::SYNC ); break; + case rdo::service::simulation::ShowMode::Monitor : m_pSimulator->m_pRuntime->setMode(rdo::runtime::RunTimeMode::PAUSE ); break; + } + m_pSimulator->m_pRuntime->setShowRate(m_pSimulator->m_pParser->getSMR()->getShowRate()); + } + catch (const rdo::compiler::parser::RDOSyntaxException&) + { + m_runtimeError = true; + m_pSimulator->m_pRuntime->onRuntimeError(); + } + catch (const rdo::runtime::RDORuntimeException& ex) + { + m_runtimeError = true; + m_pSimulator->m_pRuntime->onRuntimeError(); + std::string mess = ex.getType() + " : " + ex.message(); + RDOThreadMT::sendMessage(kernel, RDOThread::Message::DEBUG_STRING, &mess); + } + + if (!m_runtimeError) + broadcastMessage(Message::RUNTIME_MODEL_START_AFTER); } void RDOThreadRunTime::idle() { -#ifdef RDO_MT - if (broadcast_waiting || !was_start || was_close) - { - RDOThread::idle(); - return; - } -#endif -// TRACE("R. %d, %d, %d, %d\n", ::GetCurrentProcess(), ::GetCurrentProcessId(), ::GetCurrentThread(), ::GetCurrentThreadId()); - try - { - if (m_runtimeError || !m_pSimulator->m_pRuntime->rdoNext()) - { - LPRDOThreadRunTime pThis(this); //! Увеличим на себя ссылку, чтобы нас не удалил симулятор раньше времени - RDOThreadMT::sendMessage(this, RT_THREAD_CLOSE); - } - } - catch (const rdo::compiler::parser::RDOSyntaxException&) - { - m_runtimeError = true; - m_pSimulator->m_pRuntime->onRuntimeError(); - } - catch (const rdo::runtime::RDORuntimeException& ex) - { - m_runtimeError = true; - m_pSimulator->m_pRuntime->onRuntimeError(); - std::string mess = ex.getType() + " : " + ex.message(); - RDOThreadMT::sendMessage(kernel, RDOThread::RT_DEBUG_STRING, &mess); - } -// catch (...) { -// m_runtimeError = true; -// TRACE("******************************** Ошибка rdoNext()\n"); -// m_pSimulator->m_pRuntime->onRuntimeError(); -// } +// TRACE("R. %d, %d, %d, %d\n", ::GetCurrentProcess(), ::GetCurrentProcessId(), ::GetCurrentThread(), ::GetCurrentThreadId()); + try + { + if (m_runtimeError || !m_pSimulator->m_pRuntime->rdoNext()) + { + LPRDOThreadRunTime pThis(this); // Увеличим на себя ссылку, чтобы нас не удалил симулятор раньше времени + RDOThreadMT::sendMessage(this, Message::THREAD_CLOSE); + } + } + catch (const rdo::compiler::parser::RDOSyntaxException&) + { + m_runtimeError = true; + m_pSimulator->m_pRuntime->onRuntimeError(); + } + catch (const rdo::runtime::RDORuntimeException& ex) + { + m_runtimeError = true; + m_pSimulator->m_pRuntime->onRuntimeError(); + std::string mess = ex.getType() + " : " + ex.message(); + RDOThreadMT::sendMessage(kernel, RDOThread::Message::DEBUG_STRING, &mess); + } +// catch (...) { +// m_runtimeError = true; +// TRACE("******************************** Ошибка rdoNext()\n"); +// m_pSimulator->m_pRuntime->onRuntimeError(); +// } } void RDOThreadRunTime::writeResultsInfo() { - switch (m_pSimulator->m_pRuntime->m_whyStop) - { - case rdo::simulation::report::EC_OK: - m_pSimulator->m_pRuntime->getResultsInfo() << "$Status = " << "NORMAL_TERMINATION"; - break; - case rdo::simulation::report::EC_NoMoreEvents: - m_pSimulator->m_pRuntime->getResultsInfo() << "$Status = " << "NO_MORE_EVENTS"; - break; - case rdo::simulation::report::EC_RunTimeError: - m_pSimulator->m_pRuntime->getResultsInfo() << "$Status = " << "RUN_TIME_ERROR"; - break; - case rdo::simulation::report::EC_UserBreak: - m_pSimulator->m_pRuntime->getResultsInfo() << "$Status = " << "USER_BREAK"; - break; - default: - break; - } - m_pSimulator->m_pRuntime->getResultsInfo() << '\n' << "$Result_values 0 " << m_pSimulator->m_pRuntime->getTimeNow(); - - rdo::Time time; - - uint64_t timeStop = time.local(); - timeStop /= 1000000; - - double delay = -1; - - delay = (double)(timeStop - m_timeStart); - - if (delay != -1) - { - m_pSimulator->m_pRuntime->getResultsInfo() << " " << delay / 1000.0; - } - else - { - m_pSimulator->m_pRuntime->getResultsInfo() << " ?"; - } - m_pSimulator->m_pRuntime->getResultsInfo() << '\n' << " EventCount " << m_pSimulator->m_pRuntime->get_cnt_events() << " " << (double)m_pSimulator->m_pRuntime->get_cnt_events() / m_pSimulator->m_pRuntime->getTimeNow() << " "; - if (delay != -1) - { - m_pSimulator->m_pRuntime->getResultsInfo() << (std::size_t)((double)m_pSimulator->m_pRuntime->get_cnt_events() / delay * 1000); - } - else - { - m_pSimulator->m_pRuntime->getResultsInfo() << "?"; - } - - m_pSimulator->m_pRuntime->getResultsInfo() << '\n' << " OperRuleCheckCounter " << m_pSimulator->m_pRuntime->get_cnt_choice_from() << " " << (double)m_pSimulator->m_pRuntime->get_cnt_choice_from() / m_pSimulator->m_pRuntime->getTimeNow() << " "; - if (delay != -1) - { - m_pSimulator->m_pRuntime->getResultsInfo() << (std::size_t)((double)m_pSimulator->m_pRuntime->get_cnt_choice_from() / delay * 1000); - } - else - { - m_pSimulator->m_pRuntime->getResultsInfo() << "?"; - } - m_pSimulator->m_pRuntime->getResultsInfo() << '\n' << " AExpCalcCounter " << m_pSimulator->m_pRuntime->get_cnt_calc_arithm() << " " << (double)m_pSimulator->m_pRuntime->get_cnt_calc_arithm() / m_pSimulator->m_pRuntime->getTimeNow() << " "; - if (delay != -1) - { - m_pSimulator->m_pRuntime->getResultsInfo() << (std::size_t)((double)m_pSimulator->m_pRuntime->get_cnt_calc_arithm() / delay * 1000); - } - else - { - m_pSimulator->m_pRuntime->getResultsInfo() << "?"; - } - m_pSimulator->m_pRuntime->getResultsInfo() << '\n' << " BExpCalcCounter " << m_pSimulator->m_pRuntime->get_cnt_calc_logic() << " " << (double)m_pSimulator->m_pRuntime->get_cnt_calc_logic() / m_pSimulator->m_pRuntime->getTimeNow() << " "; - if (delay != -1) - { - m_pSimulator->m_pRuntime->getResultsInfo() << (std::size_t)((double)m_pSimulator->m_pRuntime->get_cnt_calc_logic() / delay * 1000); - } - else - { - m_pSimulator->m_pRuntime->getResultsInfo() << "?"; - } + switch (m_pSimulator->m_pRuntime->m_whyStop) + { + case rdo::simulation::report::ExitCode::OK: + m_pSimulator->m_pRuntime->getResultsInfo() << "$Status = " << "NORMAL_TERMINATION"; + break; + case rdo::simulation::report::ExitCode::NOMORE_EVENTS: + m_pSimulator->m_pRuntime->getResultsInfo() << "$Status = " << "NO_MORE_EVENTS"; + break; + case rdo::simulation::report::ExitCode::RUNTIME_ERROR: + m_pSimulator->m_pRuntime->getResultsInfo() << "$Status = " << "RUN_TIME_ERROR"; + break; + case rdo::simulation::report::ExitCode::USER_BREAK: + m_pSimulator->m_pRuntime->getResultsInfo() << "$Status = " << "USER_BREAK"; + break; + default: + break; + } + m_pSimulator->m_pRuntime->getResultsInfo() << '\n' << "$Result_values 0 " << m_pSimulator->m_pRuntime->getTimeNow(); + + rdo::Time time; + + uint64_t timeStop = time.local(); + timeStop /= 1000000; + + double delay = -1; + + delay = (double)(timeStop - m_timeStart); + + if (delay != -1) + { + m_pSimulator->m_pRuntime->getResultsInfo() << " " << delay / 1000.0; + } + else + { + m_pSimulator->m_pRuntime->getResultsInfo() << " ?"; + } + m_pSimulator->m_pRuntime->getResultsInfo() << '\n' << " EventCount " << m_pSimulator->m_pRuntime->get_cnt_events() << " " << (double)m_pSimulator->m_pRuntime->get_cnt_events() / m_pSimulator->m_pRuntime->getTimeNow() << " "; + if (delay != -1) + { + m_pSimulator->m_pRuntime->getResultsInfo() << (std::size_t)((double)m_pSimulator->m_pRuntime->get_cnt_events() / delay * 1000); + } + else + { + m_pSimulator->m_pRuntime->getResultsInfo() << "?"; + } + + m_pSimulator->m_pRuntime->getResultsInfo() << '\n' << " OperRuleCheckCounter " << m_pSimulator->m_pRuntime->get_cnt_choice_from() << " " << (double)m_pSimulator->m_pRuntime->get_cnt_choice_from() / m_pSimulator->m_pRuntime->getTimeNow() << " "; + if (delay != -1) + { + m_pSimulator->m_pRuntime->getResultsInfo() << (std::size_t)((double)m_pSimulator->m_pRuntime->get_cnt_choice_from() / delay * 1000); + } + else + { + m_pSimulator->m_pRuntime->getResultsInfo() << "?"; + } + m_pSimulator->m_pRuntime->getResultsInfo() << '\n' << " AExpCalcCounter " << m_pSimulator->m_pRuntime->get_cnt_calc_arithm() << " " << (double)m_pSimulator->m_pRuntime->get_cnt_calc_arithm() / m_pSimulator->m_pRuntime->getTimeNow() << " "; + if (delay != -1) + { + m_pSimulator->m_pRuntime->getResultsInfo() << (std::size_t)((double)m_pSimulator->m_pRuntime->get_cnt_calc_arithm() / delay * 1000); + } + else + { + m_pSimulator->m_pRuntime->getResultsInfo() << "?"; + } + m_pSimulator->m_pRuntime->getResultsInfo() << '\n' << " BExpCalcCounter " << m_pSimulator->m_pRuntime->get_cnt_calc_logic() << " " << (double)m_pSimulator->m_pRuntime->get_cnt_calc_logic() / m_pSimulator->m_pRuntime->getTimeNow() << " "; + if (delay != -1) + { + m_pSimulator->m_pRuntime->getResultsInfo() << (std::size_t)((double)m_pSimulator->m_pRuntime->get_cnt_calc_logic() / delay * 1000); + } + else + { + m_pSimulator->m_pRuntime->getResultsInfo() << "?"; + } } void RDOThreadRunTime::stop() { -#ifdef TR_TRACE - trace(thread_name + " stop begin"); -#endif - - try - { - m_pSimulator->m_pRuntime->rdoPostProcess(); - writeResultsInfo(); - } - catch (const rdo::compiler::parser::RDOSyntaxException&) - { - m_runtimeError = true; - m_pSimulator->m_pRuntime->onRuntimeError(); - } - catch (const rdo::runtime::RDORuntimeException& ex) - { - m_runtimeError = true; - m_pSimulator->m_pRuntime->onRuntimeError(); - std::string mess = ex.getType() + " : " + ex.message(); - RDOThreadMT::sendMessage(kernel, RDOThread::RT_DEBUG_STRING, &mess); - } - - broadcastMessage(RT_RUNTIME_MODEL_STOP_AFTER); - - RDOThread::stop(); - -#ifdef TR_TRACE - trace(thread_name + " stop end"); -#endif + try + { + m_pSimulator->m_pRuntime->rdoPostProcess(); + writeResultsInfo(); + } + catch (const rdo::compiler::parser::RDOSyntaxException&) + { + m_runtimeError = true; + m_pSimulator->m_pRuntime->onRuntimeError(); + } + catch (const rdo::runtime::RDORuntimeException& ex) + { + m_runtimeError = true; + m_pSimulator->m_pRuntime->onRuntimeError(); + std::string mess = ex.getType() + " : " + ex.message(); + RDOThreadMT::sendMessage(kernel, RDOThread::Message::DEBUG_STRING, &mess); + } + + broadcastMessage(Message::RUNTIME_MODEL_STOP_AFTER); + + RDOThread::stop(); } void RDOThreadRunTime::destroy() @@ -823,22 +774,20 @@ void RDOThreadRunTime::destroy() bool RDOThreadRunTime::runtimeError() const { - return m_runtimeError; + return m_runtimeError; } void RDOThreadRunTime::sendMessage(ThreadID threadID, std::size_t messageID, void* pParam) { - RDOThread* pThread; - switch (threadID) - { - case TID_REPOSITORY: pThread = kernel->repository(); break; - default : pThread = NULL; break; - } - - if (pThread) - { - RDOThreadMT::sendMessage(pThread, static_cast(messageID), pParam); - } + RDOThread* pThread; + switch (threadID) + { + case ThreadID::REPOSITORY: pThread = kernel->repository(); break; + default: pThread = NULL; break; + } + + if (pThread) + RDOThreadMT::sendMessage(pThread, static_cast(messageID), pParam); } CLOSE_RDO_RUNTIME_NAMESPACE @@ -851,443 +800,375 @@ namespace simulation { // -------------------- RDOThreadSimulator // -------------------------------------------------------------------------------- RDOThreadSimulator::RDOThreadSimulator() - : RDOThreadMT ("RDOThreadSimulator" ) - , m_pThreadRuntime(NULL ) - , m_exitCode (rdo::simulation::report::EC_OK) + : RDOThreadMT ("RDOThreadSimulator" ) + , m_pThreadRuntime(NULL ) + , m_exitCode (rdo::simulation::report::ExitCode::OK) { - notifies.push_back(RT_STUDIO_MODEL_BUILD ); - notifies.push_back(RT_STUDIO_MODEL_RUN ); - notifies.push_back(RT_STUDIO_MODEL_STOP ); - notifies.push_back(RT_SIMULATOR_GET_MODEL_STRUCTURE ); - notifies.push_back(RT_SIMULATOR_GET_MODEL_RESULTS ); - notifies.push_back(RT_SIMULATOR_GET_MODEL_RESULTS_INFO); - notifies.push_back(RT_SIMULATOR_GET_MODEL_EXITCODE ); - notifies.push_back(RT_SIMULATOR_GET_LIST ); - notifies.push_back(RT_SIMULATOR_GET_ERRORS ); - notifies.push_back(RT_THREAD_STOP_AFTER ); - notifies.push_back(RT_CODECOMP_GET_DATA ); - notifies.push_back(RT_CORBA_PARSER_GET_RTP ); - notifies.push_back(RT_CORBA_PARSER_GET_RSS ); - notifies.push_back(RT_PROCGUI_BLOCK_CREATE ); - notifies.push_back(RT_PROCGUI_BLOCK_TERMINATE ); - notifies.push_back(RT_PROCGUI_BLOCK_PROCESS ); - //notifies.push_back(RT_CORBA_PARSER_GET_RTP_COUNT ); - //notifies.push_back(RT_CORBA_PARSER_GET_RTP_PAR_COUNT ); - after_constructor(); + notifies.push_back(Message::STUDIO_MODEL_BUILD ); + notifies.push_back(Message::STUDIO_MODEL_RUN ); + notifies.push_back(Message::STUDIO_MODEL_STOP ); + notifies.push_back(Message::SIMULATOR_GET_MODEL_STRUCTURE ); + notifies.push_back(Message::SIMULATOR_GET_MODEL_RESULTS ); + notifies.push_back(Message::SIMULATOR_GET_MODEL_RESULTS_INFO); + notifies.push_back(Message::SIMULATOR_GET_MODEL_EXITCODE ); + notifies.push_back(Message::SIMULATOR_GET_LIST ); + notifies.push_back(Message::SIMULATOR_GET_ERRORS ); + notifies.push_back(Message::THREAD_STOP_AFTER ); + notifies.push_back(Message::CODECOMP_GET_DATA ); + notifies.push_back(Message::CORBA_PARSER_GET_RTP ); + notifies.push_back(Message::CORBA_PARSER_GET_RSS ); + //notifies.push_back(Message::CORBA_PARSER_GET_RTP_COUNT ); + //notifies.push_back(Message::CORBA_PARSER_GET_RTP_PAR_COUNT ); + after_constructor(); } RDOThreadSimulator::~RDOThreadSimulator() { - terminateModel(); - closeModel (); + terminateModel(); + closeModel (); } void RDOThreadSimulator::proc(RDOMessageInfo& msg) { - switch (msg.message) - { - case RT_STUDIO_MODEL_BUILD: - { - parseModel(); - break; - } - case RT_STUDIO_MODEL_RUN: - { - runModel(); - break; - } - case RT_STUDIO_MODEL_STOP: - { - stopModel(); - break; - } - case RT_SIMULATOR_GET_MODEL_STRUCTURE: - { - msg.lock(); - *static_cast(msg.param) << m_pParser->getModelStructure(); - msg.unlock(); - break; - } - case RT_SIMULATOR_GET_MODEL_RESULTS: - { - msg.lock(); - *static_cast(msg.param) << m_resultString.str(); - msg.unlock(); - break; - } - case RT_SIMULATOR_GET_MODEL_RESULTS_INFO: - { - msg.lock(); - *static_cast(msg.param) << m_pParser->getChanges(); - *static_cast(msg.param) << std::endl << std::endl; - *static_cast(msg.param) << m_resultInfoString.str(); - msg.unlock(); - break; - } - case RT_SIMULATOR_GET_MODEL_EXITCODE: - { - msg.lock(); - *static_cast(msg.param) = m_exitCode; - msg.unlock(); - break; - } - case RT_CODECOMP_GET_DATA: - { - codeCompletion(); - break; - } - case RT_PROCGUI_BLOCK_CREATE: - { - m_pGUIProcess = rdo::Factory::create(m_pRuntime); - msg.lock(); - rdo::compiler::gui::RPShapeDataBlockCreate* pRawParams = static_cast(msg.param); - rdo::compiler::gui::LPRPShapeDataBlockCreate pParams(pRawParams); - m_pBlock = rdo::Factory::create(m_pGUIProcess, m_pRuntime, m_pParser, pParams); - msg.unlock(); - ASSERT(m_pBlock); - pRawParams = NULL; - m_pBlock = NULL; - pParams = NULL; - break; - } - case RT_PROCGUI_BLOCK_PROCESS: - { - ASSERT(m_pGUIProcess); - msg.lock(); - rdo::compiler::gui::RPShapeDataBlockProcess* pRawParams = static_cast(msg.param); - rdo::compiler::gui::LPRPShapeDataBlockProcess pParams(pRawParams); - m_pBlock = rdo::Factory::create(m_pGUIProcess, m_pRuntime, m_pParser, pParams); - msg.unlock(); - ASSERT(m_pBlock); - pRawParams = NULL; - m_pBlock = NULL; - pParams = NULL; - break; - } - case RT_PROCGUI_BLOCK_TERMINATE: - { - ASSERT(m_pGUIProcess); - msg.lock(); - rdo::compiler::gui::RPShapeDataBlockTerminate* pRawParams = static_cast(msg.param); - rdo::compiler::gui::LPRPShapeDataBlockTerminate pParams(pRawParams); - m_pBlock = rdo::Factory::create(m_pGUIProcess, pParams); - msg.unlock(); - ASSERT(m_pBlock); - m_pGUIProcess->clear(); - m_pGUIProcess = NULL; - pRawParams = NULL; - m_pBlock = NULL; - pParams = NULL; - break; - } + switch (msg.message) + { + case Message::STUDIO_MODEL_BUILD: + { + parseModel(); + break; + } + case Message::STUDIO_MODEL_RUN: + { + runModel(); + break; + } + case Message::STUDIO_MODEL_STOP: + { + stopModel(); + break; + } + case Message::SIMULATOR_GET_MODEL_STRUCTURE: + { + msg.lock(); + *static_cast(msg.param) << m_pParser->getModelStructure(); + msg.unlock(); + break; + } + case Message::SIMULATOR_GET_MODEL_RESULTS: + { + msg.lock(); + *static_cast(msg.param) << m_resultString.str(); + msg.unlock(); + break; + } + case Message::SIMULATOR_GET_MODEL_RESULTS_INFO: + { + msg.lock(); + *static_cast(msg.param) << m_pParser->getChanges(); + *static_cast(msg.param) << std::endl << std::endl; + *static_cast(msg.param) << m_resultInfoString.str(); + msg.unlock(); + break; + } + case Message::SIMULATOR_GET_MODEL_EXITCODE: + { + msg.lock(); + *static_cast(msg.param) = m_exitCode; + msg.unlock(); + break; + } + case Message::CODECOMP_GET_DATA: + { + codeCompletion(); + break; + } #ifdef CORBA_ENABLE - case RT_CORBA_PARSER_GET_RTP: - { - msg.lock(); - corbaGetRTP(*static_cast(msg.param)); - msg.unlock(); - break; - } - - case RT_CORBA_PARSER_GET_RSS: - { - msg.lock(); - corbaGetRSS(*static_cast(msg.param)); - msg.unlock(); - break; - } + case Message::CORBA_PARSER_GET_RTP: + { + msg.lock(); + corbaGetRTP(*static_cast(msg.param)); + msg.unlock(); + break; + } + + case Message::CORBA_PARSER_GET_RSS: + { + msg.lock(); + corbaGetRSS(*static_cast(msg.param)); + msg.unlock(); + break; + } #endif // CORBA_ENABLE - case RT_SIMULATOR_GET_LIST: - { - msg.lock(); - GetList* getlist = static_cast(msg.param); - switch (getlist->m_type) - { - case GetList::frames: - { - if (m_pRuntime) - { - int size = m_pRuntime->m_frameList.size(); - for (int i = 0; i < size; i++) - { - getlist->m_list->push_back(m_pRuntime->m_frameList.at(i)->name()); - } - } - break; - } - case GetList::bitmaps: - { - if (m_pRuntime) - { - int size = m_pRuntime->m_frameList.size(); - for (int i = 0; i < size; i++) - { - m_pRuntime->m_frameList.at(i)->getBitmaps(*getlist->m_list); - } - } - break; - } - } - msg.unlock(); - break; - } - case RT_SIMULATOR_GET_ERRORS: - { - SyntaxMessageList m_errorList = getErrors(); - msg.lock(); - SyntaxMessageList* msg_errors = static_cast(msg.param); - msg_errors->assign(m_errorList.begin(), m_errorList.end()); - msg.unlock(); - break; - } - case RT_THREAD_STOP_AFTER: - { - if (msg.from == m_pThreadRuntime.get()) - { - //! rdo::simulation::report::EC_ParserError - Не используется в run-time - //! rdo::simulation::report::EC_ModelNotFound - Не используется в run-time - //! rdo::simulation::report::EC_UserBreak - Устанавливается в m_pSimulator, перехват RT_THREAD_STOP_AFTER не срабатывает - m_exitCode = m_pRuntime->m_whyStop; - if (!m_pThreadRuntime->runtimeError()) - { - //! Остановились сами нормально - broadcastMessage(RT_SIMULATOR_MODEL_STOP_OK); - closeModel(); - } - else - { - //! Остановились сами, но не нормально - broadcastMessage(RT_SIMULATOR_MODEL_STOP_RUNTIME_ERROR); - closeModel(); - } - //! Треда удаляется сама, надо удалить её событие - //! Делается это без мутексов, т.к. thread_destroy не должна использоваться в m_pThreadRuntime пока обрабатывается RT_THREAD_STOP_AFTER -#ifdef RDO_MT - delete m_pThreadRuntime->thread_destroy; - m_pThreadRuntime->thread_destroy = NULL; -#endif - m_pThreadRuntime = NULL; - } - break; - } - default: break; - } + case Message::SIMULATOR_GET_LIST: + { + msg.lock(); + GetList* getlist = static_cast(msg.param); + switch (getlist->m_type) + { + case GetList::Type::FRAMES: + { + if (m_pRuntime) + { + int size = m_pRuntime->m_frameList.size(); + for (int i = 0; i < size; i++) + { + getlist->m_list->push_back(m_pRuntime->m_frameList.at(i)->name()); + } + } + break; + } + case GetList::Type::BITMAPS: + { + if (m_pRuntime) + { + int size = m_pRuntime->m_frameList.size(); + for (int i = 0; i < size; i++) + { + m_pRuntime->m_frameList.at(i)->getBitmaps(*getlist->m_list); + } + } + break; + } + } + msg.unlock(); + break; + } + case Message::SIMULATOR_GET_ERRORS: + { + SyntaxMessageList m_errorList = getErrors(); + msg.lock(); + SyntaxMessageList* msg_errors = static_cast(msg.param); + msg_errors->assign(m_errorList.begin(), m_errorList.end()); + msg.unlock(); + break; + } + case Message::THREAD_STOP_AFTER: + { + if (msg.from == m_pThreadRuntime.get()) + { + // rdo::simulation::report::ExitCode::PARSER_ERROR - Не используется в run-time + // rdo::simulation::report::ExitCode::MODEL_NOTFOUND - Не используется в run-time + // rdo::simulation::report::ExitCode::USER_BREAK - Устанавливается в m_pSimulator, перехват Message::THREAD_STOP_AFTER не срабатывает + m_exitCode = m_pRuntime->m_whyStop; + if (!m_pThreadRuntime->runtimeError()) + { + // Остановились сами нормально + broadcastMessage(Message::SIMULATOR_MODEL_STOP_OK); + closeModel(); + } + else + { + // Остановились сами, но не нормально + broadcastMessage(Message::SIMULATOR_MODEL_STOP_RUNTIME_ERROR); + closeModel(); + } + // Треда удаляется сама, надо удалить её событие + // Делается это без мутексов, т.к. thread_destroy не должна использоваться в m_pThreadRuntime пока обрабатывается Message::THREAD_STOP_AFTER + m_pThreadRuntime = NULL; + } + break; + } + default: break; + } } bool RDOThreadSimulator::parseModel() { - terminateModel(); - closeModel(); - - m_pParser = rdo::Factory::create(); - ASSERT(m_pParser); - m_pParser->init(); - m_pRuntime = m_pParser->runtime(); - ASSERT(m_pRuntime); - - try - { - m_exitCode = rdo::simulation::report::EC_OK; - m_pParser->parse(); - } - catch (const rdo::compiler::parser::RDOSyntaxException&) - { - m_exitCode = rdo::simulation::report::EC_ParserError; - broadcastMessage(RT_SIMULATOR_PARSE_ERROR); - closeModel(); - return false; - } - catch (const rdo::runtime::RDORuntimeException& ex) - { - std::string mess = ex.getType() + " : " + ex.message(); - broadcastMessage(RT_SIMULATOR_PARSE_STRING, &mess); - m_exitCode = rdo::simulation::report::EC_ParserError; - broadcastMessage(RT_SIMULATOR_PARSE_ERROR); - closeModel(); - return false; - } - - m_showMode = getInitialShowMode(); - m_showRate = getInitialShowRate(); - - broadcastMessage(RT_SIMULATOR_PARSE_OK); - - return true; + terminateModel(); + closeModel(); + + m_pParser = rdo::Factory::create(); + ASSERT(m_pParser); + m_pParser->init(); + m_pRuntime = m_pParser->runtime(); + ASSERT(m_pRuntime); + + try + { + m_exitCode = rdo::simulation::report::ExitCode::OK; + m_pParser->parse(); + } + catch (const rdo::compiler::parser::RDOSyntaxException&) + { + m_exitCode = rdo::simulation::report::ExitCode::PARSER_ERROR; + broadcastMessage(Message::SIMULATOR_PARSE_ERROR); + closeModel(); + return false; + } + catch (const rdo::runtime::RDORuntimeException& ex) + { + std::string mess = ex.getType() + " : " + ex.message(); + broadcastMessage(Message::SIMULATOR_PARSE_STRING, &mess); + m_exitCode = rdo::simulation::report::ExitCode::PARSER_ERROR; + broadcastMessage(Message::SIMULATOR_PARSE_ERROR); + closeModel(); + return false; + } + + m_showMode = getInitialShowMode(); + m_showRate = getInitialShowRate(); + + broadcastMessage(Message::SIMULATOR_PARSE_OK); + + return true; } void RDOThreadSimulator::runModel() { - ASSERT(m_pParser ); - ASSERT(m_pRuntime); + ASSERT(m_pParser ); + ASSERT(m_pRuntime); - m_pParser->beforeRun(); + m_pParser->beforeRun(); - m_pParser->error().clear(); - m_exitCode = rdo::simulation::report::EC_OK; - m_pRuntime->setStudioThread(kernel->studio()); - m_pThreadRuntime = rdo::Factory::create(); + m_pParser->error().clear(); + m_exitCode = rdo::simulation::report::ExitCode::OK; + m_pRuntime->setStudioThread(kernel->studio()); + m_pThreadRuntime = rdo::Factory::create(); } void RDOThreadSimulator::stopModel() { - m_pRuntime->onUserBreak(); - m_exitCode = rdo::simulation::report::EC_UserBreak; - terminateModel(); - m_canTrace = false; - broadcastMessage(RT_SIMULATOR_MODEL_STOP_BY_USER); - closeModel(); -// kernel.callback(RDOKernel::modelExit, rdo::simulation::report::EC_UserBreak); + m_pRuntime->onUserBreak(); + m_exitCode = rdo::simulation::report::ExitCode::USER_BREAK; + terminateModel(); + m_canTrace = false; + broadcastMessage(Message::SIMULATOR_MODEL_STOP_BY_USER); + closeModel(); +// kernel.callback(RDOKernel::modelExit, rdo::simulation::report::ExitCode::USER_BREAK); } void RDOThreadSimulator::terminateModel() { - if (m_pThreadRuntime) - { - //! Перестали реагировать на остановку run-time-треды, т.к. закрываем её сами -#ifdef RDO_MT - notifies_mutex.Lock(); -#endif - notifies.erase(std::find(notifies.begin(), notifies.end(), RT_THREAD_STOP_AFTER)); -#ifdef RDO_MT - notifies_mutex.Unlock(); - CEvent* thread_destroy = m_pThreadRuntime->thread_destroy; -#endif + if (m_pThreadRuntime) + { + // Перестали реагировать на остановку run-time-треды, т.к. закрываем её сами + notifies.erase(std::find(notifies.begin(), notifies.end(), Message::THREAD_STOP_AFTER)); - sendMessage(m_pThreadRuntime.get(), RDOThread::RT_THREAD_CLOSE); + sendMessage(m_pThreadRuntime.get(), RDOThread::Message::THREAD_CLOSE); -#ifdef RDO_MT - thread_destroy->Lock(); - delete thread_destroy; -#endif - m_pThreadRuntime = NULL; + m_pThreadRuntime = NULL; - //! Опять начали реагировать на остановку run-time-треды, чтобы обнаружить нормальное завершение модели (или по run-time-error) -#ifdef RDO_MT - notifies_mutex.Lock(); -#endif - notifies.push_back(RT_THREAD_STOP_AFTER); -#ifdef RDO_MT - notifies_mutex.Unlock(); -#endif - } + // Опять начали реагировать на остановку run-time-треды, чтобы обнаружить нормальное завершение модели (или по run-time-error) + notifies.push_back(Message::THREAD_STOP_AFTER); + } } void RDOThreadSimulator::closeModel() { /* - try - { - if (m_pRuntime) - { - m_pRuntime = NULL; - } - } - catch (...) - { - m_pRuntime = NULL; - TRACE("******************************** Ошибка удаления m_pRuntime\n"); - } + try + { + if (m_pRuntime) + { + m_pRuntime = NULL; + } + } + catch (...) + { + m_pRuntime = NULL; + TRACE("******************************** Ошибка удаления m_pRuntime\n"); + } */ - m_pRuntime = NULL; - try - { - if (m_pParser) - { - m_pParser->deinit(); - m_pParser = NULL; - } - } - catch (...) - { - m_pParser = NULL; - TRACE("******************************** Ошибка удаления m_pParser\n"); - } + m_pRuntime = NULL; + try + { + if (m_pParser) + { + m_pParser->deinit(); + m_pParser = NULL; + } + } + catch (...) + { + m_pParser = NULL; + TRACE("******************************** Ошибка удаления m_pParser\n"); + } } void RDOThreadSimulator::parseSMRFileInfo(rdo::converter::smr2rdox::RDOSMRFileInfo& info) { #ifdef DISABLE_CONVERTER - (void)info; + (void)info; #else - try - { - rdo::converter::smr2rdox::RDOParserModel converter; - rdo::repository::RDOThreadRepository::FileInfo fileInfo(rdo::model::SMR); - kernel->sendMessage(kernel->repository(), RT_REPOSITORY_MODEL_GET_FILEINFO, &fileInfo); - rdo::converter::smr2rdox::RDOParserModel::Result res = converter.convert(fileInfo.m_fullName, info); - switch (res) - { - case rdo::converter::smr2rdox::RDOParserModel::CNV_NONE : - { - broadcastMessage(RT_CONVERTOR_NONE); - } - break; - - case rdo::converter::smr2rdox::RDOParserModel::CNV_OK : - { - broadcastMessage(RT_CONVERTOR_OK); - } - break; - - case rdo::converter::smr2rdox::RDOParserModel::CNV_ERROR: - { - broadcastMessage(RT_CONVERTOR_ERROR); - - std::string mess("Ошибка конвертора\n"); - broadcastMessage(RT_DEBUG_STRING, &mess); - const rdo::converter::smr2rdox::Error::ErrorList& errorList = converter.error().getList(); - auto it = errorList.begin(); - while (it != errorList.end()) - { - std::string text = it->getText(); - broadcastMessage(RT_DEBUG_STRING, const_cast(&text)); - ++it; - } - } - break; - - default : NEVER_REACH_HERE; - } - } - catch (const rdo::converter::smr2rdox::RDOSyntaxException&) - {} - catch (const rdo::runtime::RDORuntimeException&) - {} - catch (...) - {} + try + { + rdo::converter::smr2rdox::RDOParserModel converter; + rdo::repository::RDOThreadRepository::FileInfo fileInfo(rdo::FileType::SMR); + kernel->sendMessage(kernel->repository(), Message::REPOSITORY_MODEL_GET_FILEINFO, &fileInfo); + rdo::converter::smr2rdox::RDOParserModel::Result res = converter.convert(fileInfo.m_fullName, info); + switch (res) + { + case rdo::converter::smr2rdox::RDOParserModel::Result::NONE : + { + broadcastMessage(Message::CONVERTOR_NONE); + } + break; + + case rdo::converter::smr2rdox::RDOParserModel::Result::OK : + { + broadcastMessage(Message::CONVERTOR_OK); + } + break; + + case rdo::converter::smr2rdox::RDOParserModel::Result::CONVERTER_ERROR: + { + broadcastMessage(Message::CONVERTOR_ERROR); + + std::string mess("Ошибка конвертора\n"); + broadcastMessage(Message::DEBUG_STRING, &mess); + const rdo::converter::smr2rdox::Error::ErrorList& errorList = converter.error().getList(); + auto it = errorList.begin(); + while (it != errorList.end()) + { + std::string text = it->getText(); + broadcastMessage(Message::DEBUG_STRING, const_cast(&text)); + ++it; + } + } + break; + + default : NEVER_REACH_HERE; + } + } + catch (const rdo::converter::smr2rdox::RDOSyntaxException&) + {} + catch (const rdo::runtime::RDORuntimeException&) + {} + catch (...) + {} #endif } RDOThreadSimulator::SyntaxMessageList RDOThreadSimulator::getErrors() { - SyntaxMessageList res; + SyntaxMessageList res; - if (!m_pParser) - { - return res; - } + if (!m_pParser) + { + return res; + } - res = m_pParser->error().getList(); - res.insert(res.end(), m_pRuntime->error().list().begin(), m_pRuntime->error().list().end()); - return res; + res = m_pParser->error().getList(); + res.insert(res.end(), m_pRuntime->error().list().begin(), m_pRuntime->error().list().end()); + return res; } ShowMode RDOThreadSimulator::getInitialShowMode() const { - return m_pParser->getSMR()->getShowMode(); + return m_pParser->getSMR()->getShowMode(); } int RDOThreadSimulator::getInitialFrameNumber() const { - return m_pParser->getSMR()->getFrameNumber(); + return m_pParser->getSMR()->getFrameNumber(); } double RDOThreadSimulator::getInitialShowRate() const { - return m_pParser->getSMR()->getShowRate(); + return m_pParser->getSMR()->getShowRate(); } void RDOThreadSimulator::codeCompletion() @@ -1297,290 +1178,290 @@ void RDOThreadSimulator::codeCompletion() void RDOThreadSimulator::corbaGetRTP(rdo::compiler::parser::RDOCorba::GetRTP_var& my_rtpList) { - //! Пропарсели типы и ресурсы текста модели (текущие, а не записанные) - rdo::compiler::parser::RDOParserCorba parser; - try - { - parser.parse(); - } - catch (const rdo::compiler::parser::RDOSyntaxException&) - {} - catch (const rdo::runtime::RDORuntimeException&) - {} - - ::CORBA::Long i = 0, j = 0; - - //! Пробежались по всем типам и переписали в RTPList - rdo::compiler::mbuilder::RDOResTypeList rtpList(&parser); - - //! Считаем количество типов ресурсов - rdo::compiler::mbuilder::RDOResTypeList::List::const_iterator rtp_it = rtpList.begin(); - - ::CORBA::Long rtp_count = 0; - - while (rtp_it != rtpList.end()) - { - ++rtp_count; - ++rtp_it; - } - - //! Выделяем пямять под последовательность - my_rtpList->length(rtp_count); - - //! Снова возвращаемся в начало списка типов ресурсов - rtp_it = rtpList.begin(); - - while (rtp_it != rtpList.end()) - { - //! Создаем текстовую структуру - - my_rtpList[i].m_name = CORBA::string_dup(rtp_it->name().c_str()); - - if ((rtp_it->getType()) == rdo::compiler::mbuilder::RDOResType::rt_permanent) - my_rtpList[i].m_type=rdo::compiler::parser::RDOCorba::rt_permanent; - else - my_rtpList[i].m_type=rdo::compiler::parser::RDOCorba::rt_temporary; - - //! Считаем количество параметров i-го типа ресурса - rdo::compiler::mbuilder::RDOResType::ParamList::List::const_iterator param_it = rtp_it->m_params.begin(); - my_rtpList[i].m_param_count = 0; - - while (param_it != rtp_it->m_params.end()) - { - ++(my_rtpList[i].m_param_count); - ++param_it; - } - - //! Выделяем память под последовательность параметров i-го типа ресурсов - my_rtpList[i].m_param.length(my_rtpList[i].m_param_count); - - //! Снова возвращаемся в начало списка параметров i-го типа ресурсов - param_it = rtp_it->m_params.begin(); - - while (param_it != rtp_it->m_params.end()) - { - //! Добавляем в структуру параметр!!!!!!!!!!!!!!!! - my_rtpList[i].m_param[j].m_name = CORBA::string_dup(param_it->name().c_str()); - - my_rtpList[i].m_param[j].m_range_int = 0; - my_rtpList[i].m_param[j].m_default_int_ch = 0; - my_rtpList[i].m_param[j].m_range_double = 0; - my_rtpList[i].m_param[j].m_default_double_ch = 0; - my_rtpList[i].m_param[j].m_var_enum_ch = 0; - my_rtpList[i].m_param[j].m_default_enum_ch = 0; - my_rtpList[i].m_param[j].m_var_enum_count = 0; - - switch (param_it->typeID()) - { - case rdo::runtime::RDOType::t_int: - { - my_rtpList[i].m_param[j].m_type = rdo::compiler::parser::RDOCorba::int_type; - - if (param_it->hasRange()) - { - my_rtpList[i].m_param[j].m_min_int = param_it->getMin()->getInt(); - my_rtpList[i].m_param[j].m_max_int = param_it->getMax()->getInt(); - my_rtpList[i].m_param[j].m_range_int = 1; - - } - if (param_it->hasDefault()) - { - my_rtpList[i].m_param[j].m_default_int = param_it->getDefault()->getInt(); - my_rtpList[i].m_param[j].m_default_int_ch = 1; - } - break; - } - case rdo::runtime::RDOType::t_real: - { - my_rtpList[i].m_param[j].m_type = rdo::compiler::parser::RDOCorba::double_type; - - if (param_it->hasRange()) - { - my_rtpList[i].m_param[j].m_min_double = param_it->getMin()->getDouble(); - my_rtpList[i].m_param[j].m_max_double = param_it->getMax()->getDouble(); - my_rtpList[i].m_param[j].m_range_double = 1; - - } - if (param_it->hasDefault()) - { - my_rtpList[i].m_param[j].m_default_double = param_it->getDefault()->getDouble(); - my_rtpList[i].m_param[j].m_default_double_ch = 1; - } - break; - } - case rdo::runtime::RDOType::t_enum: - { - my_rtpList[i].m_param[j].m_type = rdo::compiler::parser::RDOCorba::enum_type; - - //! Считаем количество значений перечислимого типа - rdo::runtime::RDOEnumType::CIterator enum_it = param_it->getEnum()->getEnums().begin(); - - CORBA::Long k = 0; - - while (enum_it != param_it->getEnum()->getEnums().end()) - { - k++; - enum_it++; - } - - //! Выделяем память под последовательность значений j-го параметра перечислимого типа i-го типа ресурсов - my_rtpList[i].m_param[j].m_var_enum.length(k); - - enum_it = param_it->getEnum()->getEnums().begin(); - k = 0; - - while (enum_it != param_it->getEnum()->getEnums().end()) - { - my_rtpList[i].m_param[j].m_var_enum[k] = CORBA::string_dup(enum_it->c_str()); - enum_it++; - k++; - } - - if (param_it->hasDefault()) - { - my_rtpList[i].m_param[j].m_default_enum = CORBA::string_dup(param_it->getDefault()->getAsString().c_str()); - my_rtpList[i].m_param[j].m_default_enum_ch = 1; - } - - my_rtpList[i].m_param[j].m_var_enum_ch = 1; - my_rtpList[i].m_param[j].m_var_enum_count = k; - break; - } - default: break; - } - - ++j; - ++param_it; - } - j = 0; - ++i; - ++rtp_it; - } + // Пропарсели типы и ресурсы текста модели (текущие, а не записанные) + rdo::compiler::parser::RDOParserCorba parser; + try + { + parser.parse(); + } + catch (const rdo::compiler::parser::RDOSyntaxException&) + {} + catch (const rdo::runtime::RDORuntimeException&) + {} + + ::CORBA::Long i = 0, j = 0; + + // Пробежались по всем типам и переписали в RTPList + rdo::compiler::mbuilder::RDOResTypeList rtpList(&parser); + + // Считаем количество типов ресурсов + rdo::compiler::mbuilder::RDOResTypeList::List::const_iterator rtp_it = rtpList.begin(); + + ::CORBA::Long rtp_count = 0; + + while (rtp_it != rtpList.end()) + { + ++rtp_count; + ++rtp_it; + } + + // Выделяем пямять под последовательность + my_rtpList->length(rtp_count); + + // Снова возвращаемся в начало списка типов ресурсов + rtp_it = rtpList.begin(); + + while (rtp_it != rtpList.end()) + { + // Создаем текстовую структуру + + my_rtpList[i].m_name = CORBA::string_dup(rtp_it->name().c_str()); + + if ((rtp_it->getType()) == rdo::compiler::mbuilder::RDOResType::PERMANENT) + my_rtpList[i].m_type=rdo::compiler::parser::RDOCorba::rt_permanent; + else + my_rtpList[i].m_type=rdo::compiler::parser::RDOCorba::rt_temporary; + + // Считаем количество параметров i-го типа ресурса + rdo::compiler::mbuilder::RDOResType::ParamList::List::const_iterator param_it = rtp_it->m_params.begin(); + my_rtpList[i].m_param_count = 0; + + while (param_it != rtp_it->m_params.end()) + { + ++(my_rtpList[i].m_param_count); + ++param_it; + } + + // Выделяем память под последовательность параметров i-го типа ресурсов + my_rtpList[i].m_param.length(my_rtpList[i].m_param_count); + + // Снова возвращаемся в начало списка параметров i-го типа ресурсов + param_it = rtp_it->m_params.begin(); + + while (param_it != rtp_it->m_params.end()) + { + // Добавляем в структуру параметр!!!!!!!!!!!!!!!! + my_rtpList[i].m_param[j].m_name = CORBA::string_dup(param_it->name().c_str()); + + my_rtpList[i].m_param[j].m_range_int = 0; + my_rtpList[i].m_param[j].m_default_int_ch = 0; + my_rtpList[i].m_param[j].m_range_double = 0; + my_rtpList[i].m_param[j].m_default_double_ch = 0; + my_rtpList[i].m_param[j].m_var_enum_ch = 0; + my_rtpList[i].m_param[j].m_default_enum_ch = 0; + my_rtpList[i].m_param[j].m_var_enum_count = 0; + + switch (param_it->typeID()) + { + case rdo::runtime::RDOType::Type::INT: + { + my_rtpList[i].m_param[j].m_type = rdo::compiler::parser::RDOCorba::int_type; + + if (param_it->hasRange()) + { + my_rtpList[i].m_param[j].m_min_int = param_it->getMin()->getInt(); + my_rtpList[i].m_param[j].m_max_int = param_it->getMax()->getInt(); + my_rtpList[i].m_param[j].m_range_int = 1; + + } + if (param_it->hasDefault()) + { + my_rtpList[i].m_param[j].m_default_int = param_it->getDefault()->getInt(); + my_rtpList[i].m_param[j].m_default_int_ch = 1; + } + break; + } + case rdo::runtime::RDOType::Type::REAL: + { + my_rtpList[i].m_param[j].m_type = rdo::compiler::parser::RDOCorba::double_type; + + if (param_it->hasRange()) + { + my_rtpList[i].m_param[j].m_min_double = param_it->getMin()->getDouble(); + my_rtpList[i].m_param[j].m_max_double = param_it->getMax()->getDouble(); + my_rtpList[i].m_param[j].m_range_double = 1; + + } + if (param_it->hasDefault()) + { + my_rtpList[i].m_param[j].m_default_double = param_it->getDefault()->getDouble(); + my_rtpList[i].m_param[j].m_default_double_ch = 1; + } + break; + } + case rdo::runtime::RDOType::Type::ENUM: + { + my_rtpList[i].m_param[j].m_type = rdo::compiler::parser::RDOCorba::enum_type; + + // Считаем количество значений перечислимого типа + rdo::runtime::RDOEnumType::CIterator enum_it = param_it->getEnum()->getEnums().begin(); + + CORBA::Long k = 0; + + while (enum_it != param_it->getEnum()->getEnums().end()) + { + k++; + enum_it++; + } + + // Выделяем память под последовательность значений j-го параметра перечислимого типа i-го типа ресурсов + my_rtpList[i].m_param[j].m_var_enum.length(k); + + enum_it = param_it->getEnum()->getEnums().begin(); + k = 0; + + while (enum_it != param_it->getEnum()->getEnums().end()) + { + my_rtpList[i].m_param[j].m_var_enum[k] = CORBA::string_dup(enum_it->c_str()); + enum_it++; + k++; + } + + if (param_it->hasDefault()) + { + my_rtpList[i].m_param[j].m_default_enum = CORBA::string_dup(param_it->getDefault()->getAsString().c_str()); + my_rtpList[i].m_param[j].m_default_enum_ch = 1; + } + + my_rtpList[i].m_param[j].m_var_enum_ch = 1; + my_rtpList[i].m_param[j].m_var_enum_count = k; + break; + } + default: break; + } + + ++j; + ++param_it; + } + j = 0; + ++i; + ++rtp_it; + } } void RDOThreadSimulator::corbaGetRSS(rdo::compiler::parser::RDOCorba::GetRSS_var& my_rssList) { - //! Пропарсели типы и ресурсы текста модели (текущие, а не записанные) - rdo::compiler::parser::RDOParserCorba parser; - try - { - parser.parse(); - } - catch (const rdo::compiler::parser::RDOSyntaxException&) - {} - catch (const rdo::runtime::RDORuntimeException&) - {} - - //! Пробежались по всем ресурсам и переписали в RSSList - rdo::compiler::mbuilder::RDOResourceList rssList(&parser); - rdo::compiler::mbuilder::RDOResourceList::List::const_iterator rss_it = rssList.begin(); - - ::CORBA::Long i = 0, j = 0; - ::CORBA::Long rss_count = 0; - - //! Считаем количество ресурсов - while (rss_it != rssList.end()) - { - ++rss_count; - ++rss_it; - } - - //! Выделяем пямять под последовательность - my_rssList->length(rss_count); - - //! Снова возвращаемся в начало списка типов ресурсов - rss_it = rssList.begin(); - - while (rss_it != rssList.end()) - { - //! Заполняем значения структуры - my_rssList[i].m_name = CORBA::string_dup(rss_it->name().c_str()); - my_rssList[i].m_type = CORBA::string_dup(rss_it->getType().name().c_str()); - - //! Считаем количество параметров i-го типа ресурса - rdo::compiler::mbuilder::RDOResource::Params::const_iterator param_it = rss_it->begin(); - - my_rssList[i].m_param_count = 0; - - while (param_it != rss_it->end()) - { - ++(my_rssList[i].m_param_count); - ++param_it; - } - - //! Выделяем память под последовательность параметров i-го ресурса - my_rssList[i].m_param.length(my_rssList[i].m_param_count); - - //! Снова возвращаемся в начало списка параметров i-го ресурса - param_it = rss_it->begin(); - - while (param_it != rss_it->end()) - { - my_rssList[i].m_param[j].m_name = CORBA::string_dup(param_it->first.c_str());; - - switch (param_it->second.typeID()) - { - case rdo::runtime::RDOType::t_int: - { - - my_rssList[i].m_param[j].m_int = param_it->second->getInt(); - my_rssList[i].m_param[j].m_type = rdo::compiler::parser::RDOCorba::int_type; - - break; - } - case rdo::runtime::RDOType::t_real: - { - - my_rssList[i].m_param[j].m_double = param_it->second->getDouble(); - my_rssList[i].m_param[j].m_type = rdo::compiler::parser::RDOCorba::double_type; - - break; - } - case rdo::runtime::RDOType::t_enum: - { - - my_rssList[i].m_param[j].m_enum = param_it->second->getAsString().c_str(); - my_rssList[i].m_param[j].m_type = rdo::compiler::parser::RDOCorba::enum_type; - - break; - } - default: break; - } - - ++param_it; - ++j; - } - - j = 0; - ++rss_it; - ++i; - } + // Пропарсели типы и ресурсы текста модели (текущие, а не записанные) + rdo::compiler::parser::RDOParserCorba parser; + try + { + parser.parse(); + } + catch (const rdo::compiler::parser::RDOSyntaxException&) + {} + catch (const rdo::runtime::RDORuntimeException&) + {} + + // Пробежались по всем ресурсам и переписали в RSSList + rdo::compiler::mbuilder::RDOResourceList rssList(&parser); + rdo::compiler::mbuilder::RDOResourceList::List::const_iterator rss_it = rssList.begin(); + + ::CORBA::Long i = 0, j = 0; + ::CORBA::Long rss_count = 0; + + // Считаем количество ресурсов + while (rss_it != rssList.end()) + { + ++rss_count; + ++rss_it; + } + + // Выделяем пямять под последовательность + my_rssList->length(rss_count); + + // Снова возвращаемся в начало списка типов ресурсов + rss_it = rssList.begin(); + + while (rss_it != rssList.end()) + { + // Заполняем значения структуры + my_rssList[i].m_name = CORBA::string_dup(rss_it->name().c_str()); + my_rssList[i].m_type = CORBA::string_dup(rss_it->getType().name().c_str()); + + // Считаем количество параметров i-го типа ресурса + rdo::compiler::mbuilder::RDOResource::Params::const_iterator param_it = rss_it->begin(); + + my_rssList[i].m_param_count = 0; + + while (param_it != rss_it->end()) + { + ++(my_rssList[i].m_param_count); + ++param_it; + } + + // Выделяем память под последовательность параметров i-го ресурса + my_rssList[i].m_param.length(my_rssList[i].m_param_count); + + // Снова возвращаемся в начало списка параметров i-го ресурса + param_it = rss_it->begin(); + + while (param_it != rss_it->end()) + { + my_rssList[i].m_param[j].m_name = CORBA::string_dup(param_it->first.c_str());; + + switch (param_it->second.typeID()) + { + case rdo::runtime::RDOType::Type::INT: + { + + my_rssList[i].m_param[j].m_int = param_it->second->getInt(); + my_rssList[i].m_param[j].m_type = rdo::compiler::parser::RDOCorba::int_type; + + break; + } + case rdo::runtime::RDOType::Type::REAL: + { + + my_rssList[i].m_param[j].m_double = param_it->second->getDouble(); + my_rssList[i].m_param[j].m_type = rdo::compiler::parser::RDOCorba::double_type; + + break; + } + case rdo::runtime::RDOType::Type::ENUM: + { + + my_rssList[i].m_param[j].m_enum = param_it->second->getAsString().c_str(); + my_rssList[i].m_param[j].m_type = rdo::compiler::parser::RDOCorba::enum_type; + + break; + } + default: break; + } + + ++param_it; + ++j; + } + + j = 0; + ++rss_it; + ++i; + } /* - //! Пропарсели типы и ресурсы текста модели (текущие, а не записанные) - rdo::compiler::parser::RDOParserCorba parser; - try - { - parser.parse(); - } - catch (const rdo::compiler::parser::RDOSyntaxException&) - {} - catch (const rdo::runtime::RDORuntimeException&) - {} - - //! Пробежались по всем ресурсам и переписали в RSSList - rdo::compiler::mbuilder::RDOResourceList rssList(&parser); - rdo::compiler::mbuilder::RDOResourceList::List::const_iterator rss_it = rssList.begin(); - while (rss_it != rssList.end()) - { - //! Создаем текстовую структуру - RSS rss; - rss.m_name = rss_it->name(); - //! Запоминаем в списке - RSSList->push_back(rss); - rss_it++; - } + // Пропарсели типы и ресурсы текста модели (текущие, а не записанные) + rdo::compiler::parser::RDOParserCorba parser; + try + { + parser.parse(); + } + catch (const rdo::compiler::parser::RDOSyntaxException&) + {} + catch (const rdo::runtime::RDORuntimeException&) + {} + + // Пробежались по всем ресурсам и переписали в RSSList + rdo::compiler::mbuilder::RDOResourceList rssList(&parser); + rdo::compiler::mbuilder::RDOResourceList::List::const_iterator rss_it = rssList.begin(); + while (rss_it != rssList.end()) + { + // Создаем текстовую структуру + RSS rss; + rss.m_name = rss_it->name(); + // Запоминаем в списке + RSSList->push_back(rss); + rss_it++; + } */ } #endif // CORBA_ENABLE @@ -1589,11 +1470,11 @@ void RDOThreadSimulator::corbaGetRSS(rdo::compiler::parser::RDOCorba::GetRSS_var // -------------------- RDOThreadCodeComp // -------------------------------------------------------------------------------- RDOThreadCodeComp::RDOThreadCodeComp() - : RDOThreadMT("RDOThreadCodeComp") - , m_pParser (NULL ) + : RDOThreadMT("RDOThreadCodeComp") + , m_pParser (NULL ) { -// notifies.push_back(RT_CODECOMP_GET_DATA); - after_constructor(); +// notifies.push_back(Message::CODECOMP_GET_DATA); + after_constructor(); } RDOThreadCodeComp::~RDOThreadCodeComp() @@ -1601,35 +1482,35 @@ RDOThreadCodeComp::~RDOThreadCodeComp() void RDOThreadCodeComp::proc(RDOMessageInfo& msg) { - switch (msg.message) - { - case RT_CODECOMP_GET_DATA: - { -// if (rdo::compiler::parser::m_pParser) m_pParser = rdo::compiler::parser::m_pParser; - if (!m_pParser) break; - msg.lock(); - GetCodeComp* data = static_cast(msg.param); -// std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); -// sendMessage(kernel->studio(), RDOThread::RT_STUDIO_MODEL_GET_TEXT, &rdo::repository::RDOThreadRepository::FileData(data->file, stream)); -// data->result = stream.data(); - const rdo::compiler::parser::RDOParser::RTPResTypeList& rtp_list = m_pParser->getRTPResTypes(); - for (const auto& rtp: rtp_list) - { - const rdo::compiler::parser::RDORTPResType::ParamList& param_list = rtp->getParams(); - rdo::compiler::parser::RDORTPResType::ParamList::const_iterator param_it = param_list.begin(); - while (param_it != param_list.end()) - { - data->m_result += (*param_it)->name() + ' '; - ++param_it; - } - } - msg.unlock(); -// if (m_pParser != rdo::compiler::parser::m_pParser) delete m_pParser; - m_pParser = NULL; - break; - } - default: break; - } + switch (msg.message) + { + case Message::CODECOMP_GET_DATA: + { +// if (rdo::compiler::parser::m_pParser) m_pParser = rdo::compiler::parser::m_pParser; + if (!m_pParser) break; + msg.lock(); + GetCodeComp* data = static_cast(msg.param); +// std::stringstream stream(std::ios_base::in | std::ios_base::out | std::ios_base::binary); +// sendMessage(kernel->studio(), RDOThread::Message::STUDIO_MODEL_GET_TEXT, &rdo::repository::RDOThreadRepository::FileData(data->file, stream)); +// data->result = stream.data(); + const rdo::compiler::parser::RDOParser::RTPResTypeList& rtp_list = m_pParser->getRTPResTypes(); + for (const auto& rtp: rtp_list) + { + const rdo::compiler::parser::RDORTPResType::ParamList& param_list = rtp->getParams(); + rdo::compiler::parser::RDORTPResType::ParamList::const_iterator param_it = param_list.begin(); + while (param_it != param_list.end()) + { + data->m_result += (*param_it)->name() + ' '; + ++param_it; + } + } + msg.unlock(); +// if (m_pParser != rdo::compiler::parser::m_pParser) delete m_pParser; + m_pParser = NULL; + break; + } + default: break; + } } }}} // namespace rdo::service::simulation diff --git a/simulator/service/src/simulator.h b/simulator/service/src/simulator.h index 660e6258c..62f203e72 100644 --- a/simulator/service/src/simulator.h +++ b/simulator/service/src/simulator.h @@ -1,5 +1,4 @@ -#ifndef _LIB_SERVICE_SIMULATOR_H_ -#define _LIB_SERVICE_SIMULATOR_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM #include "utils/src/common/platform.h" @@ -11,19 +10,16 @@ #include #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable : 4786) - #ifdef RDO_MT - #include - #else - #include - #endif + #pragma warning(disable : 4786) + #include #endif // COMPILER_VISUAL_STUDIO // ----------------------------------------------------------------------- SYNOPSIS #include "utils/src/common/rdocommon.h" #include "kernel/rdokernel.h" #include "kernel/rdothread.h" #include "simulator/runtime/thread_proxy_i.h" -#include "simulator/compiler/procgui/procgui.h" +#include "simulator/runtime/rdo_runtime.h" +#include "simulator/compiler/parser/rdoparser.h" #include "converter/smr2rdox/rdo_common/model_objects_convertor.h" // -------------------------------------------------------------------------------- @@ -74,20 +70,21 @@ namespace rdoCorba { class RDOThreadCorba: public RDOThreadMT { public: - RDOThreadCorba(); + RDOThreadCorba(); private: - virtual ~RDOThreadCorba() {}; //! Чтобы нельзя было удалить через delete - virtual void proc(RDOMessageInfo& msg); - virtual void idle(); - virtual void start(); - virtual void stop(); - - CWinThread* thread_corbaRunThreadFun; - static std::size_t corbaRunThreadFun(void* pParam); + virtual ~RDOThreadCorba() + {} + virtual void proc(RDOMessageInfo& msg); + virtual void idle(); + virtual void start(); + virtual void stop(); + + CWinThread* thread_corbaRunThreadFun; + static std::size_t corbaRunThreadFun(void* pParam); }; -} //! namespace rdoCorba +} // namespace rdoCorba #endif // CORBA_ENABLE @@ -108,64 +105,60 @@ class RDOResult; // -------------------------------------------------------------------------------- PREDECLARE_POINTER(RDOThreadRunTime); class RDOThreadRunTime - : public rdo::counter_reference - , public RDOThreadMT - , public IThreadProxy + : public rdo::counter_reference + , public RDOThreadMT + , public IThreadProxy { DECLARE_FACTORY(RDOThreadRunTime); public: - bool runtimeError() const; - - struct GetFrame - { - rdo::animation::Frame* m_pFrame; - std::size_t m_number; - - GetFrame(rdo::animation::Frame* pFrame, std::size_t number) - : m_pFrame(pFrame) - , m_number(number) - {} - }; - - struct FrameAreaDown - { - std::size_t m_number; - std::string m_name; - - FrameAreaDown(std::size_t number, const std::string& name) - : m_number(number) - , m_name (name ) - {} - }; + bool runtimeError() const; + + struct GetFrame + { + rdo::animation::Frame* m_pFrame; + std::size_t m_number; + + GetFrame(rdo::animation::Frame* pFrame, std::size_t number) + : m_pFrame(pFrame) + , m_number(number) + {} + }; + + struct FrameAreaDown + { + std::size_t m_number; + std::string m_name; + + FrameAreaDown(std::size_t number, const std::string& name) + : m_number(number) + , m_name (name ) + {} + }; private: - rdo::service::simulation::RDOThreadSimulator* m_pSimulator; - bool m_runtimeError; - uint64_t m_timeStart; + rdo::service::simulation::RDOThreadSimulator* m_pSimulator; + bool m_runtimeError; + uint64_t m_timeStart; - RDOThreadRunTime(); - virtual ~RDOThreadRunTime() //! Чтобы нельзя было удалить через delete - {}; + RDOThreadRunTime(); + virtual ~RDOThreadRunTime() + {}; - virtual void proc (RDOMessageInfo& msg); - virtual void idle (); - virtual void start (); - virtual void stop (); - virtual void destroy(); + virtual void proc (RDOMessageInfo& msg); + virtual void idle (); + virtual void start (); + virtual void stop (); + virtual void destroy(); - void writeResultsInfo(); + void writeResultsInfo(); - void sendMessage(ThreadID threadID, std::size_t messageID, void* pParam); + void sendMessage(ThreadID threadID, std::size_t messageID, void* pParam); }; CLOSE_RDO_RUNTIME_NAMESPACE class RDOTrace; -OPEN_RDO_PARSER_NAMESPACE -PREDECLARE_POINTER(RDOParser); -CLOSE_RDO_PARSER_NAMESPACE - namespace rdo { namespace service { namespace simulation { @@ -180,100 +173,98 @@ friend class RDORuntimeTracer; friend class RDOSimResulter; public: - struct RTP - { - struct Param - { - std::string m_name; - }; - typedef std::vector ParamList; - - std::string m_name; - ParamList m_params; - }; - - struct RSS - { - std::string m_name; - }; - - struct GetRTP: public std::vector - {}; - struct GetRSS: public std::vector - {}; + struct RTP + { + struct Param + { + std::string m_name; + }; + typedef std::vector ParamList; + + std::string m_name; + ParamList m_params; + }; + + struct RSS + { + std::string m_name; + }; + + struct GetRTP: public std::vector + {}; + struct GetRSS: public std::vector + {}; private: - rdo::compiler::parser::LPRDOParser m_pParser; - rdo::runtime::LPRDORuntime m_pRuntime; - bool m_canTrace; - rdo::compiler::gui::LPProcGUIProcess m_pGUIProcess; - rdo::compiler::gui::LPProcGUIBlock m_pBlock; - rdo::runtime::LPRDOThreadRunTime m_pThreadRuntime; - rdo::simulation::report::RDOExitCode m_exitCode; + rdo::compiler::parser::LPRDOParser m_pParser; + rdo::runtime::LPRDORuntime m_pRuntime; + bool m_canTrace; + rdo::runtime::LPRDOThreadRunTime m_pThreadRuntime; + rdo::simulation::report::ExitCode m_exitCode; - void terminateModel(); - void closeModel (); + void terminateModel(); + void closeModel (); - ShowMode m_showMode; //! current show mode - double m_showRate; //! current show mode + ShowMode m_showMode; + double m_showRate; - std::stringstream m_resultString; - std::stringstream m_resultInfoString; + std::stringstream m_resultString; + std::stringstream m_resultInfoString; #ifdef CORBA_ENABLE -// void corbaGetRTPcount(::CORBA::Long& rtp_count); -// void corbaGetRTPParamscount(rdo::compiler::parser::RDOCorba::PARAM_count& params_count); - void corbaGetRTP(rdo::compiler::parser::RDOCorba::GetRTP_var& my_rtpList); - void corbaGetRSS(rdo::compiler::parser::RDOCorba::GetRSS_var& my_rssList); +// void corbaGetRTPcount(::CORBA::Long& rtp_count); +// void corbaGetRTPParamscount(rdo::compiler::parser::RDOCorba::PARAM_count& params_count); + void corbaGetRTP(rdo::compiler::parser::RDOCorba::GetRTP_var& my_rtpList); + void corbaGetRSS(rdo::compiler::parser::RDOCorba::GetRSS_var& my_rssList); #endif // CORBA_ENABLE protected: - virtual ~RDOThreadSimulator(); //! Чтобы нельзя было удалить через delete помещаем его в protected + virtual ~RDOThreadSimulator(); - virtual void proc(RDOMessageInfo& msg); + virtual void proc(RDOMessageInfo& msg); - bool parseModel(); - void runModel(); - void stopModel(); + bool parseModel(); + void runModel(); + void stopModel(); - typedef std::vector SyntaxMessageList; - SyntaxMessageList getErrors(); + typedef std::vector SyntaxMessageList; + SyntaxMessageList getErrors(); - void codeCompletion(); + void codeCompletion(); - void corbaGetRTP(GetRTP* RTPList); - void corbaGetRSS(GetRSS* RSSList); + void corbaGetRTP(GetRTP* RTPList); + void corbaGetRSS(GetRSS* RSSList); public: - RDOThreadSimulator(); + RDOThreadSimulator(); - void parseSMRFileInfo(rdo::converter::smr2rdox::RDOSMRFileInfo& info); + void parseSMRFileInfo(rdo::converter::smr2rdox::RDOSMRFileInfo& info); - ShowMode getInitialShowMode () const; - int getInitialFrameNumber() const; - double getInitialShowRate () const; + ShowMode getInitialShowMode () const; + int getInitialFrameNumber() const; + double getInitialShowRate () const; - struct GetList - { - enum Type - { - frames, - bitmaps - }; + struct GetList + { + enum class Type + { + FRAMES, + BITMAPS + }; - typedef std::list StringList; + typedef std::list StringList; - Type m_type; - StringList* m_list; + Type m_type; + StringList* m_list; - GetList(Type type, StringList* list) - : m_type(type) - , m_list(list) - {} - }; + GetList(Type type, StringList* list) + : m_type(type) + , m_list(list) + {} + }; }; // -------------------------------------------------------------------------------- @@ -282,30 +273,28 @@ friend class RDOSimResulter; class RDOThreadCodeComp: public RDOThreadMT { protected: - rdo::compiler::parser::LPRDOParser m_pParser; + rdo::compiler::parser::LPRDOParser m_pParser; - virtual ~RDOThreadCodeComp(); //! Чтобы нельзя было удалить через delete помещаем его в protected - virtual void proc(RDOMessageInfo& msg); + virtual ~RDOThreadCodeComp(); + virtual void proc(RDOMessageInfo& msg); public: - RDOThreadCodeComp(); - - struct GetCodeComp: public boost::noncopyable - { - rdo::model::FileType m_file; - int m_pos_x; - int m_pos_y; - std::string& m_result; - - GetCodeComp(rdo::model::FileType file, int pos_x, int pos_y, std::string& result) - : m_file (file ) - , m_pos_x (pos_x ) - , m_pos_y (pos_y ) - , m_result(result) - {} - }; + RDOThreadCodeComp(); + + struct GetCodeComp: private boost::noncopyable + { + rdo::FileType m_file; + int m_pos_x; + int m_pos_y; + std::string& m_result; + + GetCodeComp(rdo::FileType file, int pos_x, int pos_y, std::string& result) + : m_file (file ) + , m_pos_x (pos_x ) + , m_pos_y (pos_y ) + , m_result(result) + {} + }; }; }}} // namespace rdo::service::simulation - -#endif // _LIB_SERVICE_SIMULATOR_H_ diff --git a/thirdparty/scintilla/CMakeLists.txt b/thirdparty/scintilla/CMakeLists.txt index 1a6d5d3fa..48140934d 100644 --- a/thirdparty/scintilla/CMakeLists.txt +++ b/thirdparty/scintilla/CMakeLists.txt @@ -125,21 +125,21 @@ SET_TARGET_PROPERTIES(scintilla PROPERTIES FOLDER ${THIRDPARTY_FOLDERS}) IF(MSVC) # options for windows # - SOURCE_GROUP(".include" FILES - ${HEADERS_INCLUDE} - ) - - SOURCE_GROUP(".lexlib" FILES - ${LEXLIB_FILES} - ) - - SOURCE_GROUP(".src" FILES - ${SCINTILLA_SRC} - ) - - SOURCE_GROUP(".qt" FILES - ${QT_BINDS} - ${MOC_SOURCES} - ) + SOURCE_GROUP(".include" FILES + ${HEADERS_INCLUDE} + ) + + SOURCE_GROUP(".lexlib" FILES + ${LEXLIB_FILES} + ) + + SOURCE_GROUP(".src" FILES + ${SCINTILLA_SRC} + ) + + SOURCE_GROUP(".qt" FILES + ${QT_BINDS} + ${MOC_SOURCES} + ) ENDIF() diff --git a/ui/abstract/CMakeLists.txt b/ui/abstract/CMakeLists.txt index 2d825a389..b4b22497c 100644 --- a/ui/abstract/CMakeLists.txt +++ b/ui/abstract/CMakeLists.txt @@ -9,7 +9,7 @@ INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) -FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) +FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp *.h) ADD_LIBRARY(rdo_ui_abstract STATIC ${SOURCE_FILES}) INCLUDE(${PROJECT_SOURCE_DIR}/app/rdo_studio/projects/common/rdo_studio.cmake) @@ -20,10 +20,10 @@ ADD_DEPENDENCIES(rdo_ui_abstract rdo_utils) TARGET_LINK_LIBRARIES(rdo_ui_abstract rdo_utils) IF(MSVC_IDE) - SET(PCH_FILES - pch/stdpch.cpp - pch/stdpch.h - ) - INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) - ADD_PCH("${SOURCE_FILES}" "${PCH_FILES}" ui/abstract pch stdpch) + SET(PCH_FILES + pch/stdpch.cpp + pch/stdpch.h + ) + INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) + ADD_PCH("${SOURCE_FILES}" "${PCH_FILES}" ui/abstract pch stdpch) ENDIF() diff --git a/ui/abstract/headers/memdc/memdc-inl.h b/ui/abstract/headers/memdc/memdc-inl.h index eaae3a942..0e4b17e84 100644 --- a/ui/abstract/headers/memdc/memdc-inl.h +++ b/ui/abstract/headers/memdc/memdc-inl.h @@ -4,70 +4,70 @@ namespace rdo { - namespace gui - { - template - inline MemDC::MemDC() - : MemDCBase() - {} + namespace gui + { + template + inline MemDC::MemDC() + : MemDCBase() + {} - template - inline MemDC::~MemDC() - { - clear(); - } + template + inline MemDC::~MemDC() + { + clear(); + } - template - inline bool MemDC::valid() const - { - return m_pDC.get() != NULL ? true : false; - } + template + inline bool MemDC::valid() const + { + return m_pDC.get() != NULL ? true : false; + } - template - inline bool MemDC::create(std::size_t width, std::size_t height) - { - if (m_pBitmap.get() || m_pDC.get()) - return false; + template + inline bool MemDC::create(std::size_t width, std::size_t height) + { + if (m_pBitmap.get() || m_pDC.get()) + return false; - m_width = width; - m_height = height; + m_width = width; + m_height = height; - if (!onCreate()) - return false; + if (!onCreate()) + return false; - return valid(); - } + return valid(); + } - template - inline bool MemDC::resize(std::size_t width, std::size_t height) - { - if (width == 0 || height == 0) - return false; - if (width == m_width && height == m_height) - return true; + template + inline bool MemDC::resize(std::size_t width, std::size_t height) + { + if (width == 0 || height == 0) + return false; + if (width == m_width && height == m_height) + return true; - clear(); - return create(width, height); - } + clear(); + return create(width, height); + } - template - inline TDC& MemDC::dc() - { - return *m_pDC.get(); - } + template + inline TDC& MemDC::dc() + { + return *m_pDC.get(); + } - template - inline TBMP& MemDC::buffer() - { - return *m_pBitmap.get(); - } + template + inline TBMP& MemDC::buffer() + { + return *m_pBitmap.get(); + } - template - inline void MemDC::clear() - { - if (m_pBitmap.get()) m_pBitmap.reset(); - if (m_pDC .get()) m_pDC .reset(); - } + template + inline void MemDC::clear() + { + if (m_pBitmap.get()) m_pBitmap.reset(); + if (m_pDC .get()) m_pDC .reset(); + } - } // namespace gui + } // namespace gui } // namespace rdo diff --git a/ui/abstract/headers/memdc/memdc.h b/ui/abstract/headers/memdc/memdc.h index 1a0937467..4039feba2 100644 --- a/ui/abstract/headers/memdc/memdc.h +++ b/ui/abstract/headers/memdc/memdc.h @@ -1,5 +1,4 @@ -#ifndef _UI_ABSTRACT_MEMDC_H_ -#define _UI_ABSTRACT_MEMDC_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -9,53 +8,51 @@ namespace rdo { - namespace gui - { - class MemDCBase - { - public: - MemDCBase(); - ~MemDCBase(); - - std::size_t width() const; - std::size_t height() const; - - protected: - std::size_t m_width; - std::size_t m_height; - }; - - template - class MemDC: public MemDCBase - { - public: - MemDC(); - ~MemDC(); - - bool valid() const; - bool create(std::size_t width, std::size_t height); - bool create(std::size_t width, std::size_t height, TDC& from); - bool resize(std::size_t width, std::size_t height); - - TDC& dc(); - TBMP& buffer(); - - private: + namespace gui + { + class MemDCBase + { + public: + MemDCBase(); + ~MemDCBase(); + + std::size_t width() const; + std::size_t height() const; + + protected: + std::size_t m_width; + std::size_t m_height; + }; + + template + class MemDC: public MemDCBase + { + public: + MemDC(); + ~MemDC(); + + bool valid() const; + bool create(std::size_t width, std::size_t height); + bool create(std::size_t width, std::size_t height, TDC& from); + bool resize(std::size_t width, std::size_t height); + + TDC& dc(); + TBMP& buffer(); + + private: #ifdef BOOST_NO_CXX11_SMART_PTR - std::auto_ptr m_pDC; - std::auto_ptr m_pBitmap; + std::auto_ptr m_pDC; + std::auto_ptr m_pBitmap; #else - std::unique_ptr m_pDC; - std::unique_ptr m_pBitmap; + std::unique_ptr m_pDC; + std::unique_ptr m_pBitmap; #endif - bool onCreate(); + bool onCreate(); - void clear(); - }; + void clear(); + }; - } // namespace gui + } // namespace gui } // namespace rdo #include "ui/abstract/headers/memdc/memdc-inl.h" - -#endif // _UI_ABSTRACT_MEMDC_H_ diff --git a/ui/abstract/pch/stdpch.h b/ui/abstract/pch/stdpch.h index e95c53052..bfc6bd5e4 100644 --- a/ui/abstract/pch/stdpch.h +++ b/ui/abstract/pch/stdpch.h @@ -1,5 +1,4 @@ -#ifndef _UI_ABSTRACT_STDPCH_H_ -#define _UI_ABSTRACT_STDPCH_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -7,5 +6,3 @@ #include // ----------------------------------------------------------------------- SYNOPSIS // -------------------------------------------------------------------------------- - -#endif // _UI_ABSTRACT_STDPCH_H_ diff --git a/ui/abstract/src/memdc/memdc.cpp b/ui/abstract/src/memdc/memdc.cpp index 8c3f682be..08f1c16ac 100644 --- a/ui/abstract/src/memdc/memdc.cpp +++ b/ui/abstract/src/memdc/memdc.cpp @@ -7,25 +7,25 @@ namespace rdo { - namespace gui - { - MemDCBase::MemDCBase() - : m_width (0) - , m_height(0) - {} + namespace gui + { + MemDCBase::MemDCBase() + : m_width (0) + , m_height(0) + {} - MemDCBase::~MemDCBase() - {} + MemDCBase::~MemDCBase() + {} - std::size_t MemDCBase::width() const - { - return m_width; - } + std::size_t MemDCBase::width() const + { + return m_width; + } - std::size_t MemDCBase::height() const - { - return m_height; - } + std::size_t MemDCBase::height() const + { + return m_height; + } - } // namespace gui + } // namespace gui } // namespace rdo diff --git a/ui/qt/CMakeLists.txt b/ui/qt/CMakeLists.txt index 0e777964b..b7e2a91db 100644 --- a/ui/qt/CMakeLists.txt +++ b/ui/qt/CMakeLists.txt @@ -12,7 +12,7 @@ INCLUDE_DIRECTORIES(${Qt5Widgets_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) -FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) +FILE(GLOB_RECURSE SOURCE_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp *.h) ADD_LIBRARY(rdo_ui_qt STATIC ${SOURCE_FILES}) INCLUDE(${PROJECT_SOURCE_DIR}/app/rdo_studio/projects/common/rdo_studio.cmake) @@ -23,10 +23,10 @@ ADD_DEPENDENCIES(rdo_ui_qt rdo_utils) TARGET_LINK_LIBRARIES(rdo_ui_qt rdo_utils) IF(MSVC_IDE) - SET(PCH_FILES - pch/stdpch.cpp - pch/stdpch.h - ) - INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) - ADD_PCH("${SOURCE_FILES}" "${PCH_FILES}" ui/qt pch stdpch) + SET(PCH_FILES + pch/stdpch.cpp + pch/stdpch.h + ) + INCLUDE(${PROJECT_SOURCE_DIR}/cmake/pch.cmake) + ADD_PCH("${SOURCE_FILES}" "${PCH_FILES}" ui/qt pch stdpch) ENDIF() diff --git a/ui/qt/headers/animation/area.h b/ui/qt/headers/animation/area.h index 470ef956d..74978b2c3 100644 --- a/ui/qt/headers/animation/area.h +++ b/ui/qt/headers/animation/area.h @@ -1,5 +1,4 @@ -#ifndef _UI_QT_ANIMATION_AREA_H_ -#define _UI_QT_ANIMATION_AREA_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -12,18 +11,16 @@ namespace rdo { - namespace gui - { - namespace animation - { - struct Area - { - QRect m_rect; - }; - typedef std::map AreaList; + namespace gui + { + namespace animation + { + struct Area + { + QRect m_rect; + }; + typedef std::map AreaList; - } // namespace animation - } // namespace gui + } // namespace animation + } // namespace gui } // namespace rdo - -#endif // _UI_QT_ANIMATION_AREA_H_ diff --git a/ui/qt/headers/bitmap/bitmap.h b/ui/qt/headers/bitmap/bitmap.h index f3d958090..9a3c49414 100644 --- a/ui/qt/headers/bitmap/bitmap.h +++ b/ui/qt/headers/bitmap/bitmap.h @@ -1,5 +1,4 @@ -#ifndef _UI_QT_BITMAP_H_ -#define _UI_QT_BITMAP_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -12,18 +11,16 @@ namespace rdo { - namespace gui - { - class Bitmap - { - public: - static QPixmap transparent(const QPixmap& bitmap, const QPixmap& mask); - static QImage transparent(const QImage& bitmap, const QImage& mask); - }; + namespace gui + { + class Bitmap + { + public: + static QPixmap transparent(const QPixmap& bitmap, const QPixmap& mask); + static QImage transparent(const QImage& bitmap, const QImage& mask); + }; - typedef std::map BitmapList; + typedef std::map BitmapList; - } // namespace gui + } // namespace gui } // namespace rdo - -#endif // _UI_GDIPLUS_BITMAP_H_ diff --git a/ui/qt/headers/memdc/memdc.h b/ui/qt/headers/memdc/memdc.h index 4d13a2400..a349ad2b4 100644 --- a/ui/qt/headers/memdc/memdc.h +++ b/ui/qt/headers/memdc/memdc.h @@ -1,5 +1,4 @@ -#ifndef _UI_QT_MEMDC_H_ -#define _UI_QT_MEMDC_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -14,48 +13,46 @@ namespace rdo { - namespace gui - { - typedef MemDC QtMemDC; - - template <> - inline bool MemDC::onCreate() - { - m_pBitmap.reset(new QPixmap(m_width, m_height)); - m_pDC.reset(new QPainter); - return true; - } - - template <> - inline bool MemDC::resize(std::size_t width, std::size_t height) - { - if (width == 0 || height == 0) - return false; - if (width == m_width && height == m_height) - return true; + namespace gui + { + typedef MemDC QtMemDC; + + template <> + inline bool MemDC::onCreate() + { + m_pBitmap.reset(new QPixmap(m_width, m_height)); + m_pDC.reset(new QPainter); + return true; + } + + template <> + inline bool MemDC::resize(std::size_t width, std::size_t height) + { + if (width == 0 || height == 0) + return false; + if (width == m_width && height == m_height) + return true; #ifdef BOOST_NO_CXX11_SMART_PTR - typedef std::auto_ptr QPixmapPointer; + typedef std::auto_ptr QPixmapPointer; #else - typedef std::unique_ptr QPixmapPointer; + typedef std::unique_ptr QPixmapPointer; #endif - QPixmapPointer pPrevBitmap; - std::swap(pPrevBitmap, m_pBitmap); + QPixmapPointer pPrevBitmap; + std::swap(pPrevBitmap, m_pBitmap); - clear(); - if (!create(width, height)) - return false; + clear(); + if (!create(width, height)) + return false; - if (pPrevBitmap.get()) - { - QPainter painter(m_pBitmap.get()); - painter.drawPixmap(0, 0, *pPrevBitmap.get()); - } + if (pPrevBitmap.get()) + { + QPainter painter(m_pBitmap.get()); + painter.drawPixmap(0, 0, *pPrevBitmap.get()); + } - return true; - } + return true; + } - } // namespace gui + } // namespace gui } // namespace rdo - -#endif // _UI_QT_MEMDC_H_ diff --git a/ui/qt/headers/scroll_bar/scroll_bar.h b/ui/qt/headers/scroll_bar/scroll_bar.h index 5fa6fe40f..f921ae726 100644 --- a/ui/qt/headers/scroll_bar/scroll_bar.h +++ b/ui/qt/headers/scroll_bar/scroll_bar.h @@ -1,5 +1,4 @@ -#ifndef _UI_QT_SCROLL_BAR_H_ -#define _UI_QT_SCROLL_BAR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -7,19 +6,17 @@ namespace rdo { - namespace gui - { - struct ScrollMetric - { - int position; - int posMax; - int pageSize; + namespace gui + { + struct ScrollMetric + { + int position; + int posMax; + int pageSize; - ScrollMetric(); + ScrollMetric(); - bool applyInc(int delta); - }; - } // namespace gui + bool applyInc(int delta); + }; + } // namespace gui } // namespace rdo - -#endif // _UI_QT_SCROLL_BAR_H_ diff --git a/ui/qt/pch/stdpch.h b/ui/qt/pch/stdpch.h index a5558601b..bfc6bd5e4 100644 --- a/ui/qt/pch/stdpch.h +++ b/ui/qt/pch/stdpch.h @@ -1,5 +1,4 @@ -#ifndef _UI_QT_STDPCH_H_ -#define _UI_QT_STDPCH_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -7,5 +6,3 @@ #include // ----------------------------------------------------------------------- SYNOPSIS // -------------------------------------------------------------------------------- - -#endif // _UI_QT_STDPCH_H_ diff --git a/ui/qt/src/bitmap/bitmap.cpp b/ui/qt/src/bitmap/bitmap.cpp index 276d54f05..44318820d 100644 --- a/ui/qt/src/bitmap/bitmap.cpp +++ b/ui/qt/src/bitmap/bitmap.cpp @@ -9,36 +9,36 @@ using namespace rdo::gui; QPixmap Bitmap::transparent(const QPixmap& bitmap, const QPixmap& mask) { - QPixmap result; + QPixmap result; - if (bitmap.isNull() || mask.isNull() || bitmap.size() != mask.size()) - return result; + if (bitmap.isNull() || mask.isNull() || bitmap.size() != mask.size()) + return result; - QImage generatedImage = bitmap.copy().toImage().convertToFormat(QImage::Format_ARGB32); + QImage generatedImage = bitmap.copy().toImage().convertToFormat(QImage::Format_ARGB32); - result = QPixmap::fromImage(Bitmap::transparent(generatedImage, mask.toImage())); - return result; + result = QPixmap::fromImage(Bitmap::transparent(generatedImage, mask.toImage())); + return result; } QImage Bitmap::transparent(const QImage& bitmap, const QImage& mask) { - QImage result(bitmap); - - if (bitmap.isNull() || mask.isNull() || bitmap.size() != mask.size()) - return result; - - QRgb white = QColor(Qt::white).rgb(); - QRgb transparent = QColor(Qt::transparent).rgba(); - for (int x = 0; x < mask.width(); ++x) - { - for (int y = 0; y < mask.height(); ++y) - { - if (mask.pixel(x, y) == white) - { - result.setPixel(x, y, transparent); - } - } - } - - return result; + QImage result(bitmap); + + if (bitmap.isNull() || mask.isNull() || bitmap.size() != mask.size()) + return result; + + QRgb white = QColor(Qt::white).rgb(); + QRgb transparent = QColor(Qt::transparent).rgba(); + for (int x = 0; x < mask.width(); ++x) + { + for (int y = 0; y < mask.height(); ++y) + { + if (mask.pixel(x, y) == white) + { + result.setPixel(x, y, transparent); + } + } + } + + return result; } diff --git a/ui/qt/src/scroll_bar/scroll_bar.cpp b/ui/qt/src/scroll_bar/scroll_bar.cpp index a427f9201..8eeab4ecc 100644 --- a/ui/qt/src/scroll_bar/scroll_bar.cpp +++ b/ui/qt/src/scroll_bar/scroll_bar.cpp @@ -8,23 +8,23 @@ using namespace rdo::gui; ScrollMetric::ScrollMetric() - : position(0) - , posMax (0) - , pageSize(0) + : position(0) + , posMax (0) + , pageSize(0) {} bool ScrollMetric::applyInc(int delta) { - if (delta == 0) - { - return false; - } + if (delta == 0) + { + return false; + } - if (position + delta < 0 || position + delta > posMax) - { - return false; - } + if (position + delta < 0 || position + delta > posMax) + { + return false; + } - position += delta; - return true; + position += delta; + return true; } diff --git a/utils/src/animation/rdoanimation.cpp b/utils/src/animation/rdoanimation.cpp index b49f1f8d9..b8067307f 100644 --- a/utils/src/animation/rdoanimation.cpp +++ b/utils/src/animation/rdoanimation.cpp @@ -8,178 +8,178 @@ namespace rdo { namespace animation { FrameItem::FrameItem(Type type) - : m_type(type) + : m_type(type) {} FrameItem::Type FrameItem::getType() const { - return m_type; + return m_type; } Color::Color() - : m_transparent(true) + : m_transparent(true) {} Color::Color(const Color& color) - : m_r (color.m_r ) - , m_g (color.m_g ) - , m_b (color.m_b ) - , m_transparent(color.m_transparent) + : m_r (color.m_r ) + , m_g (color.m_g ) + , m_b (color.m_b ) + , m_transparent(color.m_transparent) {} Color::Color(unsigned char r, unsigned char g, unsigned char b, bool transparent) - : m_r (r ) - , m_g (g ) - , m_b (b ) - , m_transparent(transparent) + : m_r (r ) + , m_g (g ) + , m_b (b ) + , m_transparent(transparent) {} ColoredElement::ColoredElement(const ColoredElement& color) - : m_background(color.m_background) - , m_foreground(color.m_foreground) + : m_background(color.m_background) + , m_foreground(color.m_foreground) {} ColoredElement::ColoredElement(const Color& background, const Color& foreground) - : m_background(background) - , m_foreground(foreground) + : m_background(background) + , m_foreground(foreground) {} Point::Point(const Point& point) - : m_x(point.m_x) - , m_y(point.m_y) + : m_x(point.m_x) + , m_y(point.m_y) {} Point::Point(double x, double y) - : m_x(x) - , m_y(y) + : m_x(x) + , m_y(y) {} Size::Size() - : m_width (0) - , m_height(0) + : m_width (0) + , m_height(0) {} Size::Size(const Size& size) - : m_width (size.m_width ) - , m_height(size.m_height) + : m_width (size.m_width ) + , m_height(size.m_height) {} Size::Size(double width, double height) - : m_width (width ) - , m_height(height) + : m_width (width ) + , m_height(height) {} BoundedElement::BoundedElement(const BoundedElement& rect) - : m_point(rect.m_point) - , m_size (rect.m_size ) + : m_point(rect.m_point) + , m_size (rect.m_size ) {} BoundedElement::BoundedElement(const Point& point, const Size& size) - : m_point(point) - , m_size (size ) + : m_point(point) + , m_size (size ) {} Radius::Radius(const Radius& radius) - : m_radius(radius.m_radius) + : m_radius(radius.m_radius) {} Radius::Radius(double radius) - : m_radius(radius) + : m_radius(radius) {} -TextElement::TextElement(const BoundedElement& rect, const ColoredElement& color, const std::string& text, TextAlign align) - : FrameItem (FIT_TEXT) - , BoundedElement(rect ) - , ColoredElement(color ) - , m_text (text ) - , m_align (align ) +TextElement::TextElement(const BoundedElement& rect, const ColoredElement& color, const std::string& text, Align align) + : FrameItem (FrameItem::Type::TEXT) + , BoundedElement(rect) + , ColoredElement(color) + , m_text (text) + , m_align (align) {} LineElement::LineElement(const Point& point1, const Point& point2, const Color& color) - : FrameItem(FIT_LINE) - , m_point1 (point1 ) - , m_point2 (point2 ) - , m_color (color ) + : FrameItem(FrameItem::Type::LINE) + , m_point1 (point1) + , m_point2 (point2) + , m_color (color) {} TriangElement::TriangElement(const Point& point1, const Point& point2, const Point& point3, const ColoredElement& color) - : FrameItem (FIT_TRIANG) - , ColoredElement(color ) - , m_point1 (point1 ) - , m_point2 (point2 ) - , m_point3 (point3 ) + : FrameItem (FrameItem::Type::TRIANG) + , ColoredElement(color) + , m_point1 (point1) + , m_point2 (point2) + , m_point3 (point3) {} RectElement::RectElement(const BoundedElement& rect, const ColoredElement& color) - : FrameItem (FIT_RECT) - , BoundedElement(rect ) - , ColoredElement(color ) + : FrameItem (FrameItem::Type::RECT) + , BoundedElement(rect) + , ColoredElement(color) {} RoundRectElement::RoundRectElement(const BoundedElement& rect, const ColoredElement& color) - : FrameItem (FIT_R_RECT) - , BoundedElement(rect ) - , ColoredElement(color ) + : FrameItem (FrameItem::Type::ROUND_RECT) + , BoundedElement(rect) + , ColoredElement(color) {} CircleElement::CircleElement(const Point& center, const Radius& radius, const ColoredElement& color) - : FrameItem (FIT_CIRCLE) - , ColoredElement(color ) - , m_center (center ) - , m_radius (radius ) + : FrameItem (FrameItem::Type::CIRCLE) + , ColoredElement(color) + , m_center (center) + , m_radius (radius) {} EllipseElement::EllipseElement(const BoundedElement& rect, const ColoredElement& color) - : FrameItem (FIT_ELLIPSE) - , BoundedElement(rect ) - , ColoredElement(color ) + : FrameItem (FrameItem::Type::ELLIPSE) + , BoundedElement(rect) + , ColoredElement(color) {} BmpElement::BmpElement(const Point& point, const std::string& bmp_name, const std::string& mask_name) - : FrameItem (FIT_BMP ) - , m_point (point ) - , m_bmp_name (bmp_name ) - , m_mask_name(mask_name) + : FrameItem (FrameItem::Type::BMP) + , m_point (point) + , m_bmp_name (bmp_name) + , m_mask_name(mask_name) {} bool BmpElement::hasMask() const { - return !m_mask_name.empty(); + return !m_mask_name.empty(); } ScaledBmpElement::ScaledBmpElement(const BoundedElement& rect, const std::string& bmp_name, const std::string& mask_name) - : FrameItem (FIT_S_BMP) - , BoundedElement(rect ) - , m_bmp_name (bmp_name ) - , m_mask_name (mask_name) + : FrameItem (FrameItem::Type::S_BMP) + , BoundedElement(rect) + , m_bmp_name (bmp_name) + , m_mask_name (mask_name) {} bool ScaledBmpElement::hasMask() const { - return !m_mask_name.empty(); + return !m_mask_name.empty(); } ActiveElement::ActiveElement(const BoundedElement& rect, const std::string& opr_name) - : FrameItem (FIT_ACTIVE) - , BoundedElement(rect ) - , m_opr_name (opr_name ) + : FrameItem (FrameItem::Type::ACTIVE) + , BoundedElement(rect) + , m_opr_name (opr_name) {} NullElement::NullElement() - : FrameItem(FIT_NULL) + : FrameItem(FrameItem::Type::NONE) {} Frame::~Frame() { - for (const auto& element: m_elements) - delete element; + for (const auto& element: m_elements) + delete element; - m_elements.clear(); + m_elements.clear(); } bool Frame::hasBgImage() const { - return !m_bgImageName.empty(); + return !m_bgImageName.empty(); } }} // namespace rdo::animation diff --git a/utils/src/animation/rdoanimation.h b/utils/src/animation/rdoanimation.h index 1330a6fd1..3f21aa160 100644 --- a/utils/src/animation/rdoanimation.h +++ b/utils/src/animation/rdoanimation.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_RDOANIMATION_H_ -#define _UTILS_RDOANIMATION_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -10,374 +9,249 @@ namespace rdo { namespace animation { -//! Базовый класс элементов анимации struct FrameItem { - //! \details Тип элемента - enum Type - { - FIT_NULL , //!< Пустой - FIT_TEXT , //!< Текст - FIT_LINE , //!< Линия - FIT_TRIANG , //!< Треугольник - FIT_RECT , //!< Прямоугольник - FIT_R_RECT , //!< Прямоугольник со скруглёнными краями - FIT_CIRCLE , //!< Окружности - FIT_ELLIPSE, //!< Эллипс - FIT_BMP , //!< Картинка - FIT_S_BMP , //!< Смасштабированная картинка - FIT_ACTIVE //!< Область активности - }; - - //! \param type - тип элемента - FrameItem(Type type); - - //! \details Возвращает тип элемента - Type getType() const; - - bool operator== (const FrameItem& item) const - { - return m_type == item.m_type; - } + enum class Type + { + NONE, + TEXT, + LINE, + TRIANG, + RECT, + ROUND_RECT, + CIRCLE, + ELLIPSE, + BMP, + S_BMP, + ACTIVE + }; + + FrameItem(Type type); + + Type getType() const; + + bool operator== (const FrameItem& item) const + { + return m_type == item.m_type; + } private: - Type m_type; + Type m_type; }; -//! \brief Цвет -//! \details Хранит RGB-цвет и признак прозрачности struct Color { - unsigned char m_r; //!< Красная составляющая цвета - unsigned char m_g; //!< Зелёная составляющая цвета - unsigned char m_b; //!< Синяя составляющая цвета - bool m_transparent; //!< Признак прозрачности - - //! \details Создаёт прозрачный цвет. Значения других атрибутов неопределены. - Color(); - - //! Конструктор копии - //! \param color - цвет, на основе которого создаётся новый - Color(const Color& color); - - //! Создаёт цвет - //! \param r - красная составляющая цвета - //! \param g - зелёная составляющая цвета - //! \param b - синяя составляющая цвета - //! \param transparent - признак прозрачности - Color(unsigned char r, unsigned char g, unsigned char b, bool transparent = false); - - bool operator== (const Color& color) const - { - return m_r == color.m_r && m_g == color.m_g && m_b == color.m_b && m_transparent == color.m_transparent; - } + unsigned char m_r; + unsigned char m_g; + unsigned char m_b; + bool m_transparent; + + Color(); + Color(const Color& color); + Color(unsigned char r, unsigned char g, unsigned char b, bool transparent = false); + + bool operator== (const Color& color) const + { + return m_r == color.m_r && m_g == color.m_g && m_b == color.m_b && m_transparent == color.m_transparent; + } }; -//! \brief Цвет элемента -//! \details Используется для хранения цветов переднего плана и фона элемента анимации struct ColoredElement { - Color m_background; //!< Цвет фона - Color m_foreground; //!< Цвет переднего плана - - //! Конструктор копии - //! \param color - цвет, на основе которого создаётся новый - ColoredElement(const ColoredElement& color); - - //! Создаёт цвет элемента - //! \param background - цвет фона - //! \param foreground - цвет переднего плана - ColoredElement(const Color& background, const Color& foreground); - - bool operator== (const ColoredElement& element) const - { - return m_background == element.m_background && m_foreground == element.m_foreground; - } + Color m_background; + Color m_foreground; + + ColoredElement(const ColoredElement& color); + ColoredElement(const Color& background, const Color& foreground); + + bool operator== (const ColoredElement& element) const + { + return m_background == element.m_background && m_foreground == element.m_foreground; + } }; -//! \brief Точка -//! \details Начало системы координат - левый верхний угол struct Point { - double m_x; //!< Координата x - double m_y; //!< Координата y - - //! Конструктор копии - //! \param point - точка, на основе которой создаётся новый - Point(const Point& point); - - //! Создаёт точку - //! \param x - координата x - //! \param y - координата y - Point(double x, double y); - - bool operator== (const Point& point) const - { - return m_x == point.m_x && m_y == point.m_y; - } + double m_x; + double m_y; + + Point(const Point& point); + Point(double x, double y); + + bool operator== (const Point& point) const + { + return m_x == point.m_x && m_y == point.m_y; + } }; -//! Размер struct Size { - double m_width; //!< Ширина - double m_height; //!< Высота - - //! \details Создаёт объект нулевых размеров - Size(); + double m_width; + double m_height; - //! Конструктор копии - //! \param size - размер, на основе которой создаётся новый - Size(const Size& size); + Size(); + Size(const Size& size); + Size(double width, double height); - //! Создаёт размер - //! \param width - ширина - //! \param height - высота - Size(double width, double height); - - bool operator== (const Size& size) const - { - return m_width == size.m_width && m_height == size.m_height; - } + bool operator== (const Size& size) const + { + return m_width == size.m_width && m_height == size.m_height; + } }; -//! Вписанный в прямоуголник элемент struct BoundedElement { - Point m_point; //!< Координата элемента - Size m_size; //!< Размер элемента - - //! Конструктор копии - //! \param rect - прямоуголник, на основе которой создаётся новый - BoundedElement(const BoundedElement& rect); - - //! Создаёт вписанный в прямоуголник элемент - //! \param point - координата элемента - //! \param size - размер элемента - BoundedElement(const Point& point, const Size& size); - - bool operator== (const BoundedElement& element) const - { - return m_point == element.m_point && m_size == element.m_size; - } + Point m_point; + Size m_size; + + BoundedElement(const BoundedElement& rect); + BoundedElement(const Point& point, const Size& size); + + bool operator== (const BoundedElement& element) const + { + return m_point == element.m_point && m_size == element.m_size; + } }; -//! Радиус окружности struct Radius { - double m_radius; //!< Радиус - - //! Конструктор копии - //! \param radius - радиус, на основе которой создаётся новый - Radius(const Radius& radius); + double m_radius; - //! Создаёт радиус - //! \param radius - значение радиуса - Radius(double radius); + Radius(const Radius& radius); + Radius(double radius); - bool operator== (const Radius& radius) const - { - return m_radius == radius.m_radius; - } + bool operator== (const Radius& radius) const + { + return m_radius == radius.m_radius; + } }; -//! \brief Текст -//! \details Используется для реализации команды анимации text[x, y, ширина, высота, цвет_фона, цвет, [выравнивание] содержимое] struct TextElement - : public FrameItem - , public BoundedElement - , public ColoredElement + : public FrameItem + , public BoundedElement + , public ColoredElement { - //! \details Тип выравнивания текста - enum TextAlign - { - TETA_LEFT, //!< По левому краю - TETA_RIGHT, //!< По правому краю - TETA_CENTER //!< По центру - }; - - std::string m_text; //!< Строка текста - TextAlign m_align; //!< Тип выравнивания - - //! Создаёт объект текста - //! \param rect - область вывода - //! \param color - цвет текста - //! \param text - строка - //! \param align - выравнивание - TextElement(const BoundedElement& rect, const ColoredElement& color, const std::string& text, TextAlign align); + enum class Align + { + LEFT, + RIGHT, + CENTER + }; + + std::string m_text; + Align m_align; + + TextElement(const BoundedElement& rect, const ColoredElement& color, const std::string& text, Align align); }; -//! \brief Отрезок -//! \details Используется для реализации команды анимации line[x1, y1, x2, y2, цвет] struct LineElement: public FrameItem { - Point m_point1; //!< Начальная точка - Point m_point2; //!< Конечная точка - Color m_color; //!< Цвет отрезка - - //! Создаёт отрезок - //! \param point1 - начальная точка - //! \param point2 - конечная точка - //! \param color - цвет отрезка - LineElement(const Point& point1, const Point& point2, const Color& color); - - bool operator== (const LineElement& element) const - { - return m_point1 == element.m_point1 && m_point2 == element.m_point2 && m_color == element.m_color; - } + Point m_point1; + Point m_point2; + Color m_color; + + LineElement(const Point& point1, const Point& point2, const Color& color); + + bool operator== (const LineElement& element) const + { + return m_point1 == element.m_point1 && m_point2 == element.m_point2 && m_color == element.m_color; + } }; -//! \brief Треугольник -//! \details Используется для реализации команды анимации triang[x1, y1, x2, y2, x3, y3, цвет_фона, цвет] struct TriangElement - : public FrameItem - , public ColoredElement + : public FrameItem + , public ColoredElement { - Point m_point1; //!< Первая точка треугольника - Point m_point2; //!< Вторая точка треугольника - Point m_point3; //!< Третья точка треугольника - - //! Создаёт треугольник - //! \param point1 - первая точка треугольника - //! \param point2 - вторая точка треугольника - //! \param point3 - третья точка треугольника - //! \param color - цвет треугольника - TriangElement(const Point& point1, const Point& point2, const Point& point3, const ColoredElement& color); + Point m_point1; + Point m_point2; + Point m_point3; + + TriangElement(const Point& point1, const Point& point2, const Point& point3, const ColoredElement& color); }; -//! \brief Прямоугольник -//! \details Используется для реализации команды анимации rect[x, y, ширина, высота, цвет_фона, цвет] struct RectElement - : public FrameItem - , public BoundedElement - , public ColoredElement + : public FrameItem + , public BoundedElement + , public ColoredElement { - //! Создаёт прямоугольник - //! \param rect - координаты и размер фигуры - //! \param color - цвет фигуры - RectElement(const BoundedElement& rect, const ColoredElement& color); + RectElement(const BoundedElement& rect, const ColoredElement& color); }; -//! \brief Прямоугольник со скруглёнными углами -//! \details Используется для реализации команды анимации r_rect[x, y, ширина, высота, цвет_фона, цвет] struct RoundRectElement - : public FrameItem - , public BoundedElement - , public ColoredElement + : public FrameItem + , public BoundedElement + , public ColoredElement { - //! Создаёт прямоугольник - //! \param rect - координаты и размер фигуры - //! \param color - цвет фигуры - RoundRectElement(const BoundedElement& rect, const ColoredElement& color); + RoundRectElement(const BoundedElement& rect, const ColoredElement& color); }; -//! \brief Окружность -//! \details Используется для реализации команды анимации circle[x, y, радиус, цвет_фона, цвет] struct CircleElement - : public FrameItem - , public ColoredElement + : public FrameItem + , public ColoredElement { - Point m_center; //!< Центр окружности - Radius m_radius; //!< Радиус окружности - - //! Создаёт окружность - //! \param center - центр окружности - //! \param radius - радиус окружности - //! \param color - цвет окружности - CircleElement(const Point& center, const Radius& radius, const ColoredElement& color); + Point m_center; + Radius m_radius; + + CircleElement(const Point& center, const Radius& radius, const ColoredElement& color); }; -//! \brief Эллипс -//! \details Используется для реализации команды анимации ellipse[x, y, ширина, высота, цвет_фона, цвет] struct EllipseElement - : public FrameItem - , public BoundedElement - , public ColoredElement + : public FrameItem + , public BoundedElement + , public ColoredElement { - //! Создаёт эллипс - //! \param rect - координаты и размер фигуры - //! \param color - цвет фигуры - EllipseElement(const BoundedElement& rect, const ColoredElement& color); + EllipseElement(const BoundedElement& rect, const ColoredElement& color); }; -//! \brief Картинка -//! \details Используется для реализации команды анимации bitmap[x, y, имя_файла_битовой_карты [, имя_файла_маски]] struct BmpElement: public FrameItem { - Point m_point; //!< Координата левого верхнего угла картинки - std::string m_bmp_name; //!< Имя файла картинки - std::string m_mask_name; //!< Имя файла маски картинки - - //! Создаёт картинку - //! \param point - координата левого верхнего угла картинки - //! \param bmp_name - имя файла картинки - //! \param mask_name - имя файла маски картинки, может отсутствовать - BmpElement(const Point& point, const std::string& bmp_name, const std::string& mask_name = ""); - - //! \details Возвращает \b true, если маска указана - bool hasMask() const; + Point m_point; + std::string m_bmp_name; + std::string m_mask_name; + + BmpElement(const Point& point, const std::string& bmp_name, const std::string& mask_name = ""); + + bool hasMask() const; }; -//! \brief Масштабируемая картинка -//! \details Используется для реализации команды анимации s_bmp[x, y, ширина, высота, имя_файла_битовой_карты [, имя_файла_маски]] struct ScaledBmpElement - : public FrameItem - , public BoundedElement + : public FrameItem + , public BoundedElement { - std::string m_bmp_name; //!< Имя файла картинки - std::string m_mask_name; //!< Имя файла маски картинки + std::string m_bmp_name; + std::string m_mask_name; - //! Создаёт картинку - //! \param rect - координаты и размер фигуры - //! \param bmp_name - имя файла картинки - //! \param mask_name - имя файла маски картинки, может отсутствовать - ScaledBmpElement(const BoundedElement& rect, const std::string& bmp_name, const std::string& mask_name = ""); + ScaledBmpElement(const BoundedElement& rect, const std::string& bmp_name, const std::string& mask_name = ""); - //! \details Возвращает \b true, если маска указана - bool hasMask() const; + bool hasMask() const; }; -//! \brief Активная область -//! \details Используется для реализации команды анимации active имя_клавиатурной_операции[x, y, ширина, высота] struct ActiveElement - : public FrameItem - , public BoundedElement + : public FrameItem + , public BoundedElement { - std::string m_opr_name; //!< Имя клавиатурной операции + std::string m_opr_name; - //! Создаёт активную область - //! \param rect - координаты и размер области - //! \param opr_name - имя клавиатурной операции - ActiveElement(const BoundedElement& rect, const std::string& opr_name); + ActiveElement(const BoundedElement& rect, const std::string& opr_name); }; -//! \brief Пустой элемент -//! \details Нигде не используется struct NullElement: public FrameItem { - //! \details Создаёт пустой элемент - NullElement(); + NullElement(); }; -//! \brief Фрейм -//! \details Является контейнером элементов анимации. -//! Аналог $Frame, но содержит только те элементы, которые необходимо вывести struct Frame { - typedef std::vector Elements; //!< Тип контейнера элементов анимации + typedef std::vector Elements; - Color m_bgColor; //!< Цвет фона фрейма - std::string m_bgImageName; //!< Имя фоновой картинки - Size m_size; //!< Размер фрейма - Elements m_elements; //!< Список элементов анимации + Color m_bgColor; + std::string m_bgImageName; + Size m_size; + Elements m_elements; - //! \details Удаляет все элементы - ~Frame(); + ~Frame(); - //! \details Возвращает \b true, если указана фоновая картинка - bool hasBgImage() const; + bool hasBgImage() const; }; }} // namespace rdo::animation - -#endif // _UTILS_RDOANIMATION_H_ diff --git a/utils/src/common/model_objects.cpp b/utils/src/common/model_objects.cpp index c2b30dd5f..49516faba 100644 --- a/utils/src/common/model_objects.cpp +++ b/utils/src/common/model_objects.cpp @@ -4,30 +4,29 @@ // -------------------------------------------------------------------------------- namespace rdo { -namespace model { std::string getFileTypeString(FileType type) { - std::string string; - switch (type) - { - case RTP : string = "RTP" ; break; - case RSS : string = "RSS" ; break; - case EVN : string = "EVN" ; break; - case PAT : string = "PAT" ; break; - case DPT : string = "DPT" ; break; - case PRC : string = "PRC" ; break; - case PRCX: string = "PRCX"; break; - case FRM : string = "FRM" ; break; - case FUN : string = "FUN" ; break; - case SMR : string = "SMR" ; break; - case PMD : string = "PMD" ; break; - case PMV : string = "PMV" ; break; - case TRC : string = "TRC" ; break; - case RDOX: string = "RDOX" ; break; - default: string = ""; - } - return string; + std::string string; + switch (type) + { + case FileType::RTP : string = "RTP" ; break; + case FileType::RSS : string = "RSS" ; break; + case FileType::EVN : string = "EVN" ; break; + case FileType::PAT : string = "PAT" ; break; + case FileType::DPT : string = "DPT" ; break; + case FileType::PRC : string = "PRC" ; break; + case FileType::PRCX: string = "PRCX"; break; + case FileType::FRM : string = "FRM" ; break; + case FileType::FUN : string = "FUN" ; break; + case FileType::SMR : string = "SMR" ; break; + case FileType::PMD : string = "PMD" ; break; + case FileType::PMV : string = "PMV" ; break; + case FileType::TRC : string = "TRC" ; break; + case FileType::RDOX: string = "RDOX" ; break; + default: string = ""; + } + return string; } -}} // namespace rdo::model +} // namespace rdo diff --git a/utils/src/common/model_objects.h b/utils/src/common/model_objects.h index c2eaffd10..03efa4385 100644 --- a/utils/src/common/model_objects.h +++ b/utils/src/common/model_objects.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_MODEL_OBJECTS_H_ -#define _UTILS_MODEL_OBJECTS_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -7,29 +6,25 @@ // -------------------------------------------------------------------------------- namespace rdo { -namespace model { -//! \details Типы файлов -enum FileType +enum class FileType { - RTP = 0, //!< Файл типов ресурсов - RSS, //!< Файл ресурсов - EVN, //!< Файл событий - PAT, //!< Файл паттернов - DPT, //!< Файл точек принятия решений - PRC, //!< Файл процессов - FRM, //!< Файл анимации - FUN, //!< Файл функций - SMR, //!< Файл прогона - PMD, //!< Файл описания показателей - PMV, //!< Файл со значениями показателей - TRC, //!< Файл трассировки - RDOX, //!< Файл проекта - PRCX //!< Файл GUI-процессов, XML + RTP = 0, + RSS, + EVN, + PAT, + DPT, + PRC, + FRM, + FUN, + SMR, + PMD, + PMV, + TRC, + RDOX, + PRCX }; std::string getFileTypeString(FileType type); -}} // namespace rdo::model - -#endif // _UTILS_MODEL_OBJECTS_H_ +} // namespace rdo diff --git a/utils/src/common/platform.h b/utils/src/common/platform.h index 071befb37..8d4ba2995 100644 --- a/utils/src/common/platform.h +++ b/utils/src/common/platform.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_PLATFORM_H_ -#define _UTILS_PLATFORM_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -7,41 +6,39 @@ // compilers #ifdef _MSC_VER - #define COMPILER_VISUAL_STUDIO + #define COMPILER_VISUAL_STUDIO #elif defined( __MINGW32__ ) - #define COMPILER_GCC - #define COMPILER_MINGW + #define COMPILER_GCC + #define COMPILER_MINGW #elif defined( __GNUC__ ) - #define COMPILER_GCC + #define COMPILER_GCC #else - #error Unknown compiler! + #error Unknown compiler! #endif // operating systems #ifdef _WIN32 - #define OST_WINDOWS - #ifdef _WIN64 - #define OST_WINDOWS_64 - #else - #define OST_WINDOWS_32 - #endif + #define OST_WINDOWS + #ifdef _WIN64 + #define OST_WINDOWS_64 + #else + #define OST_WINDOWS_32 + #endif #elif defined( __linux__ ) - #define OST_LINUX + #define OST_LINUX #elif defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) - #define OST_MACOSX + #define OST_MACOSX #else - #error Unknown OS! + #error Unknown OS! #endif // architecture #if defined( __amd64__ ) || defined( _M_X64 ) - #define ARCHITECTURE_AMD64 + #define ARCHITECTURE_AMD64 #elif defined( __i386__ ) || defined( _M_IX86 ) - #define ARCHITECTURE_X86 + #define ARCHITECTURE_X86 #elif defined( __arm__ ) || defined( __thumb__ ) || defined ( __TARGET_ARCH_ARM ) || defined ( __TARGET_ARCH_THUMB ) - #define ARCHITECTURE_ARM + #define ARCHITECTURE_ARM #else - #error Unknown architecture! + #error Unknown architecture! #endif - -#endif // _UTILS_PLATFORM_H_ diff --git a/utils/src/common/rdocommon.cpp b/utils/src/common/rdocommon.cpp index 668df8b5d..278834984 100644 --- a/utils/src/common/rdocommon.cpp +++ b/utils/src/common/rdocommon.cpp @@ -2,71 +2,75 @@ // ----------------------------------------------------------------------- PLATFORM #include "utils/src/common/platform.h" // ----------------------------------------------------------------------- INCLUDES -#include #include #include +#include +#include #ifdef COMPILER_VISUAL_STUDIO -# include -# include +# include +# include #else -# include -# include +# include +# include #endif // ----------------------------------------------------------------------- SYNOPSIS #include "utils/src/common/rdocommon.h" // -------------------------------------------------------------------------------- #ifdef COMPILER_VISUAL_STUDIO -# pragma warning(disable : 4786) +# pragma warning(disable : 4786) #endif namespace rdo { -std::string format(const char* str, ...) +namespace { - va_list params; - va_start(params, str); - std::string res = format(str, params); - va_end(params); - return res; -} std::string format(const char* str, va_list& params) { - std::vector s; - s.resize(256); - int size = -1; - while (size == -1) - { + std::vector s; + s.resize(256); + int size = -1; + while (size == -1) + { #ifdef COMPILER_VISUAL_STUDIO -# pragma warning(disable: 4996) - size = _vsnprintf(&s[0], s.size(), str, params); -# pragma warning(default: 4996) +# pragma warning(disable: 4996) + size = _vsnprintf(&s[0], s.size(), str, params); +# pragma warning(default: 4996) #endif // COMPILER_VISUAL_STUDIO #ifdef COMPILER_GCC - size = vsnprintf(&s[0], s.size(), str, params); + size = vsnprintf(&s[0], s.size(), str, params); #endif // COMPILER_GCC - if (size == -1) - { - s.resize(s.size() + 256); - } - } - s.resize( size ); - return std::string(s.begin(), s.end()); + if (size == -1) + s.resize(s.size() + 256); + } + s.resize(size); + return std::string(s.begin(), s.end()); +} + +} // anonymous namespace + +std::string format(const char* str, ...) +{ + va_list params; + va_start(params, str); + std::string res = format(str, params); + va_end(params); + return res; } int roundDouble(double val) { - if (val >= 0) - { - return (val - (int)val < 0.5) ? (int)val : (int)val + 1; - } - else - { - return (val - (int)val > - 0.5) ? (int)val : (int)val - 1; - } + if (val >= 0) + { + return (val - (int)val < 0.5) ? (int)val : (int)val + 1; + } + else + { + return (val - (int)val > - 0.5) ? (int)val : (int)val - 1; + } } } // namespace rdo diff --git a/utils/src/common/rdocommon.h b/utils/src/common/rdocommon.h index 441296f2a..05f55f761 100644 --- a/utils/src/common/rdocommon.h +++ b/utils/src/common/rdocommon.h @@ -1,84 +1,29 @@ -#ifndef _UTILS_RDOCOMMON_H_ -#define _UTILS_RDOCOMMON_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM #include "utils/src/common/platform.h" // ----------------------------------------------------------------------- INCLUDES -#include -#include #include // ----------------------------------------------------------------------- SYNOPSIS #include "utils/src/common/model_objects.h" // -------------------------------------------------------------------------------- #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(disable : 4786) + #pragma warning(disable : 4786) #endif -namespace rdo { +namespace rdo +{ + std::string format(const char* str, ...); - //! Формирование строки по формату, аналогично printf - //! \param str - исходная строка, которая может содержать символы форматирования - //! \param ... - произвольный набор параметров - //! \result Отформатированная строчка - std::string format(const char* str, ...); + template< class T > + inline std::string toString(const T& value) + { + std::stringstream str; + str << value; + return str.str(); + } - //! Формирование строки по формату - //! \param str - исходная строка, которая может содержать символы форматирования - //! \param params - определенный по формату набор параметров (вытащенный по формату из стека) - //! \result Отформатированная строчка - std::string format(const char* str, va_list& params); - - //! Переводит значение в строку - //! \tparam T - тип значения - //! \param value - значение - //! \result Строковое представление значения - template< class T > - inline std::string toString(const T& value) - { - std::stringstream str; - str << value; - return str.str(); - } - - //! \class vector - //! \tparam T - Тип хранимого элемента - //! \brief Вектор - //! \details Потомок от std::vector, с парой удобных методов. Пример: - //! \code - //! rdo::vector container; - //! container(1)(3)(5)(2); // Размещает в контейнере 4-ре элемента - //! \endcode - template - class vector: public std::vector - { - public: - //! \details Создаёт пустой контейнер - vector() - {} - - //! Создаёт пустой контейнер и помещает в него \ref item - //! \param item - Элемент контейнера - vector(const T& item) - { - std::vector::push_back(item); - } - - //! Добавляет в контейнер новый эелемент, более удобный аналог std::vector::push_back() - //! \param item - Элемент контейнера - //! \result Возвращает сам контейнер, чтобы эту же операцию можно было вызвать снова - vector& operator() (const T& item) - { - std::vector::push_back(item); - return *this; - } - }; - - //! Округляет вещественное число до целого - //! \param value - вещественное значение - //! \result Результат округления - int roundDouble(double val); + int roundDouble(double val); } // namespace rdo - -#endif // _UTILS_RDOCOMMON_H_ diff --git a/utils/src/common/warning_disable.h b/utils/src/common/warning_disable.h index dd71a2e6c..7bd0c7490 100644 --- a/utils/src/common/warning_disable.h +++ b/utils/src/common/warning_disable.h @@ -1,17 +1,17 @@ #include "utils/src/common/platform.h" #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(push) - #pragma warning(disable: 4100) - #pragma warning(disable: 4127) - #pragma warning(disable: 4231) - #pragma warning(disable: 4244) - #pragma warning(disable: 4250) - #pragma warning(disable: 4251) - #pragma warning(disable: 4481) - #pragma warning(disable: 4512) - #pragma warning(disable: 4702) - #pragma warning(disable: 4800) - #pragma warning(disable: 4913) - #pragma warning(disable: 4996) + #pragma warning(push) + #pragma warning(disable: 4100) + #pragma warning(disable: 4127) + #pragma warning(disable: 4231) + #pragma warning(disable: 4244) + #pragma warning(disable: 4250) + #pragma warning(disable: 4251) + #pragma warning(disable: 4481) + #pragma warning(disable: 4512) + #pragma warning(disable: 4702) + #pragma warning(disable: 4800) + #pragma warning(disable: 4913) + #pragma warning(disable: 4996) #endif diff --git a/utils/src/common/warning_enable.h b/utils/src/common/warning_enable.h index c03575eac..383ce6dce 100644 --- a/utils/src/common/warning_enable.h +++ b/utils/src/common/warning_enable.h @@ -1,5 +1,5 @@ #include "utils/src/common/platform.h" #ifdef COMPILER_VISUAL_STUDIO - #pragma warning(pop) + #pragma warning(pop) #endif diff --git a/utils/src/debug/rdodebug.cpp b/utils/src/debug/rdodebug.cpp index c850627c5..c7e917737 100644 --- a/utils/src/debug/rdodebug.cpp +++ b/utils/src/debug/rdodebug.cpp @@ -10,18 +10,18 @@ void StdOutput(const std::string& message) { #ifdef COMPILER_VISUAL_STUDIO - std::wcout << rdo::locale::convertToWStr(message) << std::endl; + std::wcout << rdo::locale::convertToWStr(message) << std::endl; #else - std::cout << message << std::endl; + std::cout << message << std::endl; #endif } void StdError(const std::string& message) { #ifdef COMPILER_VISUAL_STUDIO - std::wcerr << rdo::locale::convertToWStr(message) << std::endl; + std::wcerr << rdo::locale::convertToWStr(message) << std::endl; #else - std::cerr << message << std::endl; + std::cerr << message << std::endl; #endif } diff --git a/utils/src/debug/rdodebug.h b/utils/src/debug/rdodebug.h index ebbade120..2c2bd9c8c 100644 --- a/utils/src/debug/rdodebug.h +++ b/utils/src/debug/rdodebug.h @@ -1,18 +1,13 @@ -#ifndef _UTILS_RDODEBUG_H_ -#define _UTILS_RDODEBUG_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM #include "utils/src/common/platform.h" // ----------------------------------------------------------------------- INCLUDES #ifdef COMPILER_VISUAL_STUDIO - #ifdef RDO_MT - #include - #else - #include - #endif + #include #endif // COMPILER_VISUAL_STUDIO #ifdef COMPILER_GCC - #include + #include #endif // COMPILER_GCC // ----------------------------------------------------------------------- SYNOPSIS @@ -49,16 +44,16 @@ void StdError(const std::string& message); #ifdef COMPILER_VISUAL_STUDIO #define ASSERT(A) \ - if (!(A)) \ - { \ - StdError(rdo::format("ASSERT: line %d, source '%s', condition '%s'\n", __LINE__, __FILE__, #A)); \ - ::DebugBreak(); \ - } + if (!(A)) \ + { \ + StdError(rdo::format("ASSERT: line %d, source '%s', condition '%s'\n", __LINE__, __FILE__, #A)); \ + ::DebugBreak(); \ + } template Type IdentityNeverReachHere(Type value) { - return value; + return value; } #define NEVER_REACH_HERE ASSERT(IdentityNeverReachHere(false)) @@ -81,5 +76,3 @@ Type IdentityNeverReachHere(Type value) #define NEVER_REACH_HERE #endif // _DEBUG - -#endif // _UTILS_RDODEBUG_H_ diff --git a/utils/src/debug/static_assert.h b/utils/src/debug/static_assert.h index 3afd4e4ec..0bb0548f9 100644 --- a/utils/src/debug/static_assert.h +++ b/utils/src/debug/static_assert.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_STATIC_ASSERT_H_ -#define _UTILS_STATIC_ASSERT_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -8,25 +7,13 @@ namespace rdo { -//! \struct rdo::CompileTimeError -//! \brief Шаблонный класс для генерации ошибки компиляции -//! \details Используется через макрос \ref STATIC_ASSERT -//! \tparam bool - если \b true, ошибки нет, если \b false - ошибка есть template struct CompileTimeError; -//! Специализация шаблонного класса \ref rdo::CompileTimeError для описание ситуации \b отсутствия ошибки компиляции template <> struct CompileTimeError {}; -//! Выбрасывает ASSERT на этапе компиляции, когда компилятор доходит до этого макроса, т.е. формирует ошибку компиляции. Пример: -//! \code -//! STATIC_ASSERT(Some_error); -//! \endcode -//! \param expr - текст ошибки, указывается без пробелов -#define STATIC_ASSERT(expr) \ - rdo::CompileTimeError<((expr) != 0)>(); +#define STATIC_ASSERT(expr) \ + rdo::CompileTimeError<((expr) != 0)>(); } // namespace rdo - -#endif // _UTILS_STATIC_ASSERT_H_ diff --git a/utils/src/file/rdofile.cpp b/utils/src/file/rdofile.cpp index 4ca86ab7b..9b8cb087d 100644 --- a/utils/src/file/rdofile.cpp +++ b/utils/src/file/rdofile.cpp @@ -3,10 +3,10 @@ // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" #ifdef COMPILER_VISUAL_STUDIO - #include - #include + #include + #include #elif defined(COMPILER_MINGW) - #include + #include #endif // COMPILER_VISUAL_STUDIO #include #include @@ -24,139 +24,139 @@ namespace rdo { bool File::create(const boost::filesystem::path& name) { - return create(name, ""); + return create(name, ""); } bool File::create(const boost::filesystem::path& name, const std::string& content) { - boost::filesystem::fstream file(name, std::ios::out | std::ios::binary); - file << content << std::endl; - file.close(); - return true; + boost::filesystem::fstream file(name, std::ios::out | std::ios::binary); + file << content << std::endl; + file.close(); + return true; } bool File::exist(const boost::filesystem::path& name) { - return boost::filesystem::exists(name); + return boost::filesystem::exists(name); } bool File::read_only(const boost::filesystem::path& name) { #ifdef COMPILER_VISUAL_STUDIO - return _waccess(name.wstring().c_str(), 04) == 0 && _waccess(name.wstring().c_str(), 06) == -1; + return _waccess(name.wstring().c_str(), 04) == 0 && _waccess(name.wstring().c_str(), 06) == -1; #endif // COMPILER_VISUAL_STUDIO #ifdef COMPILER_GCC - std::string fileName = rdo::locale::convertToCLocale(name.string()); - return access(fileName.c_str(), R_OK) == 0 && access(fileName.c_str(), W_OK) == -1; + std::string fileName = rdo::locale::convertToCLocale(name.string()); + return access(fileName.c_str(), R_OK) == 0 && access(fileName.c_str(), W_OK) == -1; #endif // COMPILER_GCC } bool File::unlink(const boost::filesystem::path& name) { - return boost::filesystem::remove(name); + return boost::filesystem::remove(name); } bool File::splitpath(const boost::filesystem::path& from, boost::filesystem::path& fileDir, boost::filesystem::path& fileName, boost::filesystem::path& fileExt) { - boost::filesystem::path parentDir(from.parent_path()); - boost::filesystem::path rootName = parentDir.root_name(); - boost::filesystem::path rootDirectory = parentDir.root_directory(); - if ((rootName.empty() && rootDirectory.empty()) || parentDir != (rootName / rootDirectory)) - { - parentDir /= boost::filesystem::path("/"); - } - - fileDir = parentDir.make_preferred(); - fileName = from.stem(); - fileExt = from.extension(); - - return true; + boost::filesystem::path parentDir(from.parent_path()); + boost::filesystem::path rootName = parentDir.root_name(); + boost::filesystem::path rootDirectory = parentDir.root_directory(); + if ((rootName.empty() && rootDirectory.empty()) || parentDir != (rootName / rootDirectory)) + { + parentDir /= boost::filesystem::path("/"); + } + + fileDir = parentDir.make_preferred(); + fileName = from.stem(); + fileExt = from.extension(); + + return true; } boost::filesystem::path File::getTempFileName() { #ifdef COMPILER_VISUAL_STUDIO - const std::size_t BUFSIZE = 4096; - char lpPathBuffer[BUFSIZE]; - - if (::GetTempPath(BUFSIZE, lpPathBuffer) == 0) - { - return boost::filesystem::path(); - } - char szTempName[MAX_PATH]; - if (::GetTempFileName(lpPathBuffer, NULL, 0, szTempName) == 0) - { - return boost::filesystem::path(); - } - return boost::filesystem::path(rdo::locale::convertToWStr(szTempName)); + const std::size_t BUFSIZE = 4096; + char lpPathBuffer[BUFSIZE]; + + if (::GetTempPath(BUFSIZE, lpPathBuffer) == 0) + { + return boost::filesystem::path(); + } + char szTempName[MAX_PATH]; + if (::GetTempFileName(lpPathBuffer, NULL, 0, szTempName) == 0) + { + return boost::filesystem::path(); + } + return boost::filesystem::path(rdo::locale::convertToWStr(szTempName)); #endif // COMPILER_VISUAL_STUDIO #ifdef COMPILER_GCC - boost::uuids::random_generator random_gen; - boost::filesystem::path tempFileName; - tempFileName /= "tmp"; - tempFileName /= "rdo_temp_file_num_" + boost::uuids::to_string(random_gen()); - create(tempFileName); - return tempFileName; + boost::uuids::random_generator random_gen; + boost::filesystem::path tempFileName; + tempFileName /= "tmp"; + tempFileName /= "rdo_temp_file_num_" + boost::uuids::to_string(random_gen()); + create(tempFileName); + return tempFileName; #endif // COMPILER_GCC } boost::filesystem::path File::extractFilePath(const boost::filesystem::path& name) { - boost::filesystem::path parentPath = boost::filesystem::path(name).make_preferred().parent_path(); - return parentPath.empty() - ? parentPath - : parentPath / boost::filesystem::path("/").make_preferred(); + boost::filesystem::path parentPath = boost::filesystem::path(name).make_preferred().parent_path(); + return parentPath.empty() + ? parentPath + : parentPath / boost::filesystem::path("/").make_preferred(); } bool File::trimLeft(const boost::filesystem::path& name) { - boost::filesystem::ifstream inputStream(name, std::ios::binary); - std::stringstream sstream; - - if (!inputStream.good()) - { - return false; - } - - bool empty = true; - while (!inputStream.eof()) - { - char byte; - inputStream.get(byte); - - if (empty) - { - if (byte != ' ' && byte != '\t' && byte != '\n' && byte != '\r') - { - empty = false; - } - } - - if (!empty) - { - sstream.write(&byte, 1); - } - } - - inputStream.close(); - - boost::filesystem::path to(name); - - try - { - if (!boost::filesystem::remove(to)) - { - return false; - } - boost::filesystem::ofstream outStream(name, std::ios::binary); - outStream << sstream.str(); - } - catch (const boost::system::error_code&) - { - return false; - } - return true; + boost::filesystem::ifstream inputStream(name, std::ios::binary); + std::stringstream sstream; + + if (!inputStream.good()) + { + return false; + } + + bool empty = true; + while (!inputStream.eof()) + { + char byte; + inputStream.get(byte); + + if (empty) + { + if (byte != ' ' && byte != '\t' && byte != '\n' && byte != '\r') + { + empty = false; + } + } + + if (!empty) + { + sstream.write(&byte, 1); + } + } + + inputStream.close(); + + boost::filesystem::path to(name); + + try + { + if (!boost::filesystem::remove(to)) + { + return false; + } + boost::filesystem::ofstream outStream(name, std::ios::binary); + outStream << sstream.str(); + } + catch (const boost::system::error_code&) + { + return false; + } + return true; } } // namespace rdo diff --git a/utils/src/file/rdofile.h b/utils/src/file/rdofile.h index 7ad774e6f..7a78b03b1 100644 --- a/utils/src/file/rdofile.h +++ b/utils/src/file/rdofile.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_RDOFILE_H_ -#define _UTILS_RDOFILE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include "utils/src/common/warning_disable.h" @@ -11,51 +10,19 @@ namespace rdo { -//! Скорее пространство имён для статических методов, чем класс class File { public: - static bool create(const boost::filesystem::path& name); - static bool create(const boost::filesystem::path& name, const std::string& content); - - //! Проверяет существование файла - //! \param name - имя файла - //! \result \b true, если существует - static bool exist(const boost::filesystem::path& name); - - //! Проверяет признак только чтение - //! \param name - имя файла - //! \result \b true, если у файла установлен атрибут только чтение - static bool read_only(const boost::filesystem::path& name); - - //! Удаляет файл - //! \param name - имя файла - //! \result \b true, если файл удалён удачно - static bool unlink(const boost::filesystem::path& name); - - //! Разбивает полное имя файла на его составляющие - //! \param[in] from - полное имя файла - //! \param[out] fileDir - путь - //! \param[out] fileName - имя - //! \param[out] fileExt - расширение - //! \result \b true, если получилось извлечь данные - static bool splitpath(const boost::filesystem::path& from, boost::filesystem::path& fileDir, boost::filesystem::path& fileName, boost::filesystem::path& fileExt); - - //! Возвращает полное имя временного файла - //! \result полное имя временного файла - static boost::filesystem::path getTempFileName(); - - //! Получение пути файла по его имени - //! \param name - полное имя файла - //! \result Путь к файлу, заканчивающийся '/' или '\' в зависимости от платформы - static boost::filesystem::path extractFilePath(const boost::filesystem::path& name); - - //! Удаляет пустоты (пробелы, табуляцию, переводы строк) в конце файла - //! \param name - имя файла - //! \result \b true, если всё прошло успешно - static bool trimLeft(const boost::filesystem::path& name); + static bool create(const boost::filesystem::path& name); + static bool create(const boost::filesystem::path& name, const std::string& content); + + static bool exist(const boost::filesystem::path& name); + static bool read_only(const boost::filesystem::path& name); + static bool unlink(const boost::filesystem::path& name); + static bool splitpath(const boost::filesystem::path& from, boost::filesystem::path& fileDir, boost::filesystem::path& fileName, boost::filesystem::path& fileExt); + static boost::filesystem::path getTempFileName(); + static boost::filesystem::path extractFilePath(const boost::filesystem::path& name); + static bool trimLeft(const boost::filesystem::path& name); }; } // namespace rdo - -#endif // _UTILS_RDOFILE_H_ diff --git a/utils/src/locale/rdolocale.cpp b/utils/src/locale/rdolocale.cpp index d2ff6e3de..8c29c333f 100644 --- a/utils/src/locale/rdolocale.cpp +++ b/utils/src/locale/rdolocale.cpp @@ -18,111 +18,111 @@ namespace rdo void locale::init() { - initForTest(); + initForTest(); #ifdef OST_WINDOWS - _setmode(_fileno(stdout), _O_U16TEXT); + _setmode(_fileno(stdout), _O_U16TEXT); #endif } void locale::initForTest() { - std::locale globalLocale(get().generate("en_EN.UTF-8"), new boost::math::nonfinite_num_put); - std::locale::global(globalLocale); + std::locale globalLocale(get().generate("en_EN.UTF-8"), new boost::math::nonfinite_num_put); + std::locale::global(globalLocale); - std::cout.imbue(globalLocale); - std::cerr.imbue(globalLocale); - std::clog.imbue(globalLocale); - std::cin.imbue (globalLocale); + std::cout.imbue(globalLocale); + std::cerr.imbue(globalLocale); + std::clog.imbue(globalLocale); + std::cin.imbue (globalLocale); } locale& locale::get() { - static rdo::locale locale; - return locale; + static rdo::locale locale; + return locale; } locale::locale() { #ifdef COMPILER_VISUAL_STUDIO - m_modelLocale = std::locale("Russian_Russia.1251"); + m_modelLocale = std::locale("Russian_Russia.1251"); #endif - m_generator.locale_cache_enabled(true); - system(); - utf8 (); + m_generator.locale_cache_enabled(true); + system(); + utf8 (); } std::locale locale::generate(const std::string& name) { - return m_generator.generate(name); + return m_generator.generate(name); } std::locale locale::system() { - return generate(""); + return generate(""); } std::locale locale::utf8() { - return generate("ru_RU.UTF-8"); + return generate("ru_RU.UTF-8"); } std::string locale::convert(const std::string& txt, const std::locale& to, const std::locale& from) { - return convert(txt, std::use_facet(to).encoding(), std::use_facet(from).encoding()); + return convert(txt, std::use_facet(to).encoding(), std::use_facet(from).encoding()); } std::string locale::convert(const std::string& txt, const std::string& to, const std::string& from) { - std::string result; - try - { - result = boost::locale::conv::between(txt, to, from); - } - catch (const boost::locale::conv::conversion_error&) - {} - catch (const boost::locale::conv::invalid_charset_error&) - {} - return result; + std::string result; + try + { + result = boost::locale::conv::between(txt, to, from); + } + catch (const boost::locale::conv::conversion_error&) + {} + catch (const boost::locale::conv::invalid_charset_error&) + {} + return result; } std::string locale::convertToCLocale(const std::string& txt, const std::locale& from) { - return convert(txt, getCLocaleName(), std::use_facet(from).encoding()); + return convert(txt, getCLocaleName(), std::use_facet(from).encoding()); } std::string locale::convertFromCLocale(const std::string& txt, const std::locale& to) { - return convert(txt, std::use_facet(to).encoding(), getCLocaleName()); + return convert(txt, std::use_facet(to).encoding(), getCLocaleName()); } std::string locale::getCLocaleName() { - return "CP1251"; + return "CP1251"; } unsigned int locale::length(const std::string& txt, const std::locale& locale) { - return convertToWStr(txt, locale).length(); + return convertToWStr(txt, locale).length(); } std::wstring locale::convertToWStr(const std::string& txt, const std::locale& locale) { - return boost::locale::conv::to_utf(txt, locale); + return boost::locale::conv::to_utf(txt, locale); } std::string locale::convertFromWStr(const std::wstring& txt, const std::locale& locale) { - return boost::locale::conv::from_utf(txt, locale); + return boost::locale::conv::from_utf(txt, locale); } void locale::cout(const std::string& txt) { #ifdef OST_WINDOWS - std::wcout << convertToWStr(txt) << std::endl; + std::wcout << convertToWStr(txt) << std::endl; #else - std::cout << txt << std::endl; + std::cout << txt << std::endl; #endif } diff --git a/utils/src/locale/rdolocale.h b/utils/src/locale/rdolocale.h index df245cac9..854e42cd3 100644 --- a/utils/src/locale/rdolocale.h +++ b/utils/src/locale/rdolocale.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_LOCALE_H_ -#define _UTILS_LOCALE_H_ +#pragma once // ----------------------------------------------------------------------- PLATFORM #include "utils/src/common/platform.h" @@ -12,40 +11,38 @@ namespace rdo { - class locale - { - public: - static void init(); - static void initForTest(); - static locale& get (); + class locale + { + public: + static void init(); + static void initForTest(); + static locale& get (); - std::locale generate(const std::string& name); + std::locale generate(const std::string& name); - std::locale system(); - std::locale utf8 (); + std::locale system(); + std::locale utf8 (); - static std::string convert (const std::string& txt, const std::locale& to, const std::locale& from = std::locale()); - static std::string convert (const std::string& txt, const std::string& to, const std::string& from); - static std::string convertToCLocale (const std::string& txt, const std::locale& from = std::locale()); - static std::string convertFromCLocale(const std::string& txt, const std::locale& to = std::locale()); - static unsigned int length (const std::string& txt, const std::locale& locale = std::locale()); - static std::wstring convertToWStr (const std::string& txt, const std::locale& locale = std::locale()); - static std::string convertFromWStr (const std::wstring& txt, const std::locale& locale = std::locale()); + static std::string convert (const std::string& txt, const std::locale& to, const std::locale& from = std::locale()); + static std::string convert (const std::string& txt, const std::string& to, const std::string& from); + static std::string convertToCLocale (const std::string& txt, const std::locale& from = std::locale()); + static std::string convertFromCLocale(const std::string& txt, const std::locale& to = std::locale()); + static unsigned int length (const std::string& txt, const std::locale& locale = std::locale()); + static std::wstring convertToWStr (const std::string& txt, const std::locale& locale = std::locale()); + static std::string convertFromWStr (const std::wstring& txt, const std::locale& locale = std::locale()); - static void cout(const std::string& txt); + static void cout(const std::string& txt); - private: - locale(); + private: + locale(); - boost::locale::generator m_generator; + boost::locale::generator m_generator; #ifdef COMPILER_VISUAL_STUDIO - std::locale m_modelLocale; + std::locale m_modelLocale; #endif - static std::string getCLocaleName(); - }; + static std::string getCLocaleName(); + }; } // namespace rdo - -#endif // _UTILS_LOCALE_H_ diff --git a/utils/src/smart_ptr/factory/factory-inl.h b/utils/src/smart_ptr/factory/factory-inl.h index faa21cdc3..b6099df5f 100644 --- a/utils/src/smart_ptr/factory/factory-inl.h +++ b/utils/src/smart_ptr/factory/factory-inl.h @@ -7,93 +7,93 @@ namespace rdo { template inline intrusive_ptr Factory::create() { - T* pObject = new T(); - return intrusive_ptr(pObject); + T* pObject = new T(); + return intrusive_ptr(pObject); } template template inline intrusive_ptr Factory::create(const P1& p1) { - T* pObject = new T(p1); - return intrusive_ptr(pObject); + T* pObject = new T(p1); + return intrusive_ptr(pObject); } template template inline intrusive_ptr Factory::delegate(const P1& p1) { - return T::template create(p1); + return T::template create(p1); } template template inline intrusive_ptr Factory::create(const P1& p1, const P2& p2) { - T* pObject = new T(p1, p2); - return intrusive_ptr(pObject); + T* pObject = new T(p1, p2); + return intrusive_ptr(pObject); } template template inline intrusive_ptr Factory::create(const P1& p1, const P2& p2, const P3& p3) { - T* pObject = new T(p1, p2, p3); - return intrusive_ptr(pObject); + T* pObject = new T(p1, p2, p3); + return intrusive_ptr(pObject); } template template inline intrusive_ptr Factory::create(const P1& p1, const P2& p2, const P3& p3, const P4& p4) { - T* pObject = new T(p1, p2, p3, p4); - return intrusive_ptr(pObject); + T* pObject = new T(p1, p2, p3, p4); + return intrusive_ptr(pObject); } template template inline intrusive_ptr Factory::create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5) { - T* pObject = new T(p1, p2, p3, p4, p5); - return intrusive_ptr(pObject); + T* pObject = new T(p1, p2, p3, p4, p5); + return intrusive_ptr(pObject); } template template inline intrusive_ptr Factory::create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6) { - T* pObject = new T(p1, p2, p3, p4, p5, p6); - return intrusive_ptr(pObject); + T* pObject = new T(p1, p2, p3, p4, p5, p6); + return intrusive_ptr(pObject); } template template inline intrusive_ptr Factory::create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7) { - T* pObject = new T(p1, p2, p3, p4, p5, p6, p7); - return intrusive_ptr(pObject); + T* pObject = new T(p1, p2, p3, p4, p5, p6, p7); + return intrusive_ptr(pObject); } template template inline intrusive_ptr Factory::create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8) { - T* pObject = new T(p1, p2, p3, p4, p5, p6, p7, p8); - return intrusive_ptr(pObject); + T* pObject = new T(p1, p2, p3, p4, p5, p6, p7, p8); + return intrusive_ptr(pObject); } template template inline intrusive_ptr Factory::create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8, const P9& p9) { - T* pObject = new T(p1, p2, p3, p4, p5, p6, p7, p8, p9); - return intrusive_ptr(pObject); + T* pObject = new T(p1, p2, p3, p4, p5, p6, p7, p8, p9); + return intrusive_ptr(pObject); } template inline void Factory::destroy(T* object) { - delete object; + delete object; } } // namespace rdo diff --git a/utils/src/smart_ptr/factory/factory.h b/utils/src/smart_ptr/factory/factory.h index 9a64914dd..9bc076a40 100644 --- a/utils/src/smart_ptr/factory/factory.h +++ b/utils/src/smart_ptr/factory/factory.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_SMART_PTR_FACTORY_H_ -#define _UTILS_SMART_PTR_FACTORY_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,121 +12,48 @@ class intrusive_ptr; template class RefCounter; -//! Фабрика, используется для создания и удаления объектов -//! \tparam T - Тип создаваемого объекта template class Factory { friend class intrusive_ptr; friend class RefCounter; public: - //! Создает объект класса Т - //! \result Умный указатель на объект - static intrusive_ptr create(); - - //! Создает объект класса Т - //! \param p1 - параметр конструктора - //! \result Умный указатель на объект - template - static intrusive_ptr create(const P1& p1); - - //! Создает объект класса Т через шаблонный статический метод create класса создаваемого объекта - //! \tparam T1 - тип, передаваемый в шаблонный конструтор - //! \param p1 - параметр конструктора - //! \result Умный указатель на объект - template - static intrusive_ptr delegate(const P1& p1); - - //! Создает объект класса Т - //! \param p1 - параметр конструктора - //! \param p2 - параметр конструктора - //! \result Умный указатель на объект - template - static intrusive_ptr create(const P1& p1, const P2& p2); - - //! Создает объект класса Т - //! \param p1 - параметр конструктора - //! \param p2 - параметр конструктора - //! \param p3 - параметр конструктора - //! \result Умный указатель на объект - template - static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3); - - //! Создает объект класса Т - //! \param p1 - параметр конструктора - //! \param p2 - параметр конструктора - //! \param p3 - параметр конструктора - //! \param p4 - параметр конструктора - //! \result Умный указатель на объект - template - static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3, const P4& p4); - - //! Создает объект класса Т - //! \param p1 - параметр конструктора - //! \param p2 - параметр конструктора - //! \param p3 - параметр конструктора - //! \param p4 - параметр конструктора - //! \param p5 - параметр конструктора - //! \result Умный указатель на объект - template - static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5); - - //! Создает объект класса Т - //! \param p1 - параметр конструктора - //! \param p2 - параметр конструктора - //! \param p3 - параметр конструктора - //! \param p4 - параметр конструктора - //! \param p5 - параметр конструктора - //! \param p6 - параметр конструктора - //! \result Умный указатель на объект - template - static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6); - - //! Создает объект класса Т - //! \param p1 - параметр конструктора - //! \param p2 - параметр конструктора - //! \param p3 - параметр конструктора - //! \param p4 - параметр конструктора - //! \param p5 - параметр конструктора - //! \param p6 - параметр конструктора - //! \param p7 - параметр конструктора - //! \result Умный указатель на объект - template - static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7); - - //! Создает объект класса Т - //! \param p1 - параметр конструктора - //! \param p2 - параметр конструктора - //! \param p3 - параметр конструктора - //! \param p4 - параметр конструктора - //! \param p5 - параметр конструктора - //! \param p6 - параметр конструктора - //! \param p7 - параметр конструктора - //! \param p8 - параметр конструктора - //! \result Умный указатель на объект - template - static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8); - - //! Создает объект класса Т - //! \param p1 - параметр конструктора - //! \param p2 - параметр конструктора - //! \param p3 - параметр конструктора - //! \param p4 - параметр конструктора - //! \param p5 - параметр конструктора - //! \param p6 - параметр конструктора - //! \param p7 - параметр конструктора - //! \param p8 - параметр конструктора - //! \param p9 - параметр конструктора - //! \result Умный указатель на объект - template - static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8, const P9& p9); + static intrusive_ptr create(); + + template + static intrusive_ptr create(const P1& p1); + + template + static intrusive_ptr delegate(const P1& p1); + + template + static intrusive_ptr create(const P1& p1, const P2& p2); + + template + static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3); + + template + static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3, const P4& p4); + + template + static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5); + + template + static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6); + + template + static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7); + + template + static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8); + + template + static intrusive_ptr create(const P1& p1, const P2& p2, const P3& p3, const P4& p4, const P5& p5, const P6& p6, const P7& p7, const P8& p8, const P9& p9); private: - static void destroy(T* object); + static void destroy(T* object); }; #define DECLARE_FACTORY(TYPE) friend class rdo::Factory; } // namespace rdo - -#endif // _UTILS_SMART_PTR_FACTORY_H_ diff --git a/utils/src/smart_ptr/interface_ptr/interface_ptr-inl.h b/utils/src/smart_ptr/interface_ptr/interface_ptr-inl.h index 1eee0b76e..80973c299 100644 --- a/utils/src/smart_ptr/interface_ptr/interface_ptr-inl.h +++ b/utils/src/smart_ptr/interface_ptr/interface_ptr-inl.h @@ -8,66 +8,66 @@ namespace rdo { template inline interface_ptr::interface_ptr() - : m_pInterface(NULL) - , m_pCounter (NULL) + : m_pInterface(NULL) + , m_pCounter (NULL) {} template inline interface_ptr::interface_ptr(T* pInterface, LPIRefCounter pCounter) - : m_pInterface(pInterface) - , m_pCounter (pCounter ) + : m_pInterface(pInterface) + , m_pCounter (pCounter ) { - if (m_pInterface) - m_pCounter->addref(); + if (m_pInterface) + m_pCounter->addref(); } template inline interface_ptr::interface_ptr(const this_type& sptr) - : m_pInterface(sptr.m_pInterface) - , m_pCounter (sptr.m_pCounter ) + : m_pInterface(sptr.m_pInterface) + , m_pCounter (sptr.m_pCounter ) { - if (m_pInterface) - m_pCounter->addref(); + if (m_pInterface) + m_pCounter->addref(); } template inline interface_ptr::~interface_ptr() { - if (m_pInterface) - m_pCounter->release(); + if (m_pInterface) + m_pCounter->release(); } template inline typename interface_ptr::this_type& interface_ptr::operator= (const this_type& sptr) { - if (m_pInterface) - m_pCounter->release(); + if (m_pInterface) + m_pCounter->release(); - m_pInterface = sptr.m_pInterface; - m_pCounter = sptr.m_pCounter; + m_pInterface = sptr.m_pInterface; + m_pCounter = sptr.m_pCounter; - if (m_pInterface) - m_pCounter->addref(); + if (m_pInterface) + m_pCounter->addref(); - return *this; + return *this; } template inline interface_ptr::operator bool() const { - return m_pInterface != NULL; + return m_pInterface != NULL; } template inline const T* interface_ptr::operator->() const { - return m_pInterface; + return m_pInterface; } template inline T* interface_ptr::operator-> () { - return m_pInterface; + return m_pInterface; } } // namespace rdo diff --git a/utils/src/smart_ptr/interface_ptr/interface_ptr.h b/utils/src/smart_ptr/interface_ptr/interface_ptr.h index 50dbca6e8..7d2e4dee8 100644 --- a/utils/src/smart_ptr/interface_ptr/interface_ptr.h +++ b/utils/src/smart_ptr/interface_ptr/interface_ptr.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_SMART_PTR_INTERFACE_PTR_H_ -#define _UTILS_SMART_PTR_INTERFACE_PTR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -13,22 +12,22 @@ class interface_ptr { template friend class intrusive_ptr; public: - typedef interface_ptr this_type; + typedef interface_ptr this_type; - interface_ptr (); - interface_ptr (T* pInterface, LPIRefCounter pCounter); - interface_ptr (const this_type& sptr); - ~interface_ptr(); + interface_ptr (); + interface_ptr (T* pInterface, LPIRefCounter pCounter); + interface_ptr (const this_type& sptr); + ~interface_ptr(); - this_type& operator= (const this_type& sptr); + this_type& operator= (const this_type& sptr); - operator bool() const; - const T* operator->() const; - T* operator->(); + operator bool() const; + const T* operator->() const; + T* operator->(); private: - T* m_pInterface; - LPIRefCounter m_pCounter; + T* m_pInterface; + LPIRefCounter m_pCounter; }; #define DECLARE_OBJECT_INTERFACE(TYPE) typedef rdo::interface_ptr LP##TYPE; @@ -37,5 +36,3 @@ template friend class intrusive_ptr; } // namespace rdo #include "utils/src/smart_ptr/interface_ptr/interface_ptr-inl.h" - -#endif // _UTILS_SMART_PTR_INTERFACE_PTR_H_ diff --git a/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr-inl.h b/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr-inl.h index 2ccd46025..615e6852b 100644 --- a/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr-inl.h +++ b/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr-inl.h @@ -11,197 +11,197 @@ namespace rdo { template inline intrusive_ptr::intrusive_ptr() - : m_object(NULL) + : m_object(NULL) {} template inline intrusive_ptr::intrusive_ptr(T* object) - : m_object(object) + : m_object(object) { - if (m_object) - addref(); + if (m_object) + addref(); } template inline intrusive_ptr::intrusive_ptr(const this_type& sptr) - : m_object(sptr.m_object) + : m_object(sptr.m_object) { - if (m_object) - addref(); + if (m_object) + addref(); } template template inline intrusive_ptr::intrusive_ptr(const interface_ptr

    & pInterface) { - m_object = dynamic_cast(pInterface.m_pInterface); - if (m_object) - addref(); + m_object = dynamic_cast(pInterface.m_pInterface); + if (m_object) + addref(); } template inline intrusive_ptr::~intrusive_ptr() { - if (m_object) - release(); + if (m_object) + release(); } template inline intrusive_ptr& intrusive_ptr::operator=(const this_type& sptr) { - if (m_object) - release(); + if (m_object) + release(); - m_object = sptr.m_object; + m_object = sptr.m_object; - if (m_object) - addref(); + if (m_object) + addref(); - return *this; + return *this; } template template inline bool intrusive_ptr::operator== (const intrusive_ptr

    & sptr) const { - if (!m_object && !sptr.m_object) - return true; + if (!m_object && !sptr.m_object) + return true; - if (!m_object || !sptr.m_object) - return false; + if (!m_object || !sptr.m_object) + return false; - return &m_object->m_intrusive_counter == &sptr.m_object->m_intrusive_counter; + return &m_object->m_intrusive_counter == &sptr.m_object->m_intrusive_counter; } template template inline bool intrusive_ptr::operator!= (const intrusive_ptr

    & sptr) const { - return !operator==(sptr); + return !operator==(sptr); } template template inline bool intrusive_ptr::compare(const intrusive_ptr

    & sptr) const { - return *m_object == *sptr.m_object; + return *m_object == *sptr.m_object; } template inline intrusive_ptr::operator bool() const { - return m_object != NULL; + return m_object != NULL; } template inline T* intrusive_ptr::operator->() const { - return m_object; + return m_object; } template inline T* intrusive_ptr::operator->() { - return m_object; + return m_object; } template inline const T& intrusive_ptr::operator* () const { - return *m_object; + return *m_object; } template inline T& intrusive_ptr::operator* () { - return *m_object; + return *m_object; } template template inline intrusive_ptr::operator intrusive_ptr

    () const { - return intrusive_ptr

    (m_object); + return intrusive_ptr

    (m_object); } template template inline intrusive_ptr

    intrusive_ptr::object_parent_cast() const { - return intrusive_ptr

    (m_object); + return intrusive_ptr

    (m_object); } template template inline intrusive_ptr

    intrusive_ptr::object_static_cast() const { - return intrusive_ptr

    (static_cast(m_object)); + return intrusive_ptr

    (static_cast(m_object)); } template template inline intrusive_ptr

    intrusive_ptr::object_dynamic_cast() const { - return intrusive_ptr

    (dynamic_cast(m_object)); + return intrusive_ptr

    (dynamic_cast(m_object)); } template template inline interface_ptr

    intrusive_ptr::interface_cast() const { - return interface_ptr

    (static_cast(m_object), static_cast(m_object)); + return interface_ptr

    (static_cast(m_object), static_cast(m_object)); } template template inline interface_ptr

    intrusive_ptr::interface_dynamic_cast() const { - P* pInterface = dynamic_cast(m_object); - return interface_ptr

    (pInterface, dynamic_cast(pInterface)); + P* pInterface = dynamic_cast(m_object); + return interface_ptr

    (pInterface, dynamic_cast(pInterface)); } template inline T* intrusive_ptr::get() { - return m_object; + return m_object; } template inline const T* intrusive_ptr::get() const { - return m_object; + return m_object; } template inline void intrusive_ptr::addref() { - counter()++; + counter()++; } template inline void intrusive_ptr::release() { - counter()--; - if (counter() == 0) - { - if (m_object) - { - Factory::destroy(m_object); - m_object = NULL; - } - } + counter()--; + if (counter() == 0) + { + if (m_object) + { + Factory::destroy(m_object); + m_object = NULL; + } + } } template inline bool intrusive_ptr::owner() const { - return m_object->m_intrusive_counter == 1; + return m_object->m_intrusive_counter == 1; } template inline std::size_t& intrusive_ptr::counter() { - return m_object->m_intrusive_counter; + return m_object->m_intrusive_counter; } } // namespace rdo diff --git a/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr.h b/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr.h index 60f97ac5e..cf31e0c25 100644 --- a/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr.h +++ b/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_SMART_PTR_INTRUSIVE_PTR_H_ -#define _UTILS_SMART_PTR_INTRUSIVE_PTR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -16,66 +15,64 @@ class intrusive_ptr template friend class intrusive_ptr; template friend class smart_ptr_wrapper; public: - typedef T object_type; - typedef intrusive_ptr this_type; + typedef T object_type; + typedef intrusive_ptr this_type; - intrusive_ptr(); - intrusive_ptr(T* object); - intrusive_ptr(const this_type& sptr); - template - intrusive_ptr(const interface_ptr

    & pInterface); - ~intrusive_ptr(); + intrusive_ptr(); + intrusive_ptr(T* object); + intrusive_ptr(const this_type& sptr); + template + intrusive_ptr(const interface_ptr

    & pInterface); + ~intrusive_ptr(); - this_type& operator=(const this_type& sptr); + this_type& operator=(const this_type& sptr); - //! Сравнивает по указателям - template - bool operator==(const intrusive_ptr

    & sptr) const; - template - bool operator!=(const intrusive_ptr

    & sptr) const; + template + bool operator==(const intrusive_ptr

    & sptr) const; + template + bool operator!=(const intrusive_ptr

    & sptr) const; - //! Сравнивает по значениям - template - bool compare(const intrusive_ptr

    & sptr) const; + template + bool compare(const intrusive_ptr

    & sptr) const; - operator bool() const; - T* operator->() const; - T* operator->(); - const T& operator*() const; - T& operator*(); + operator bool() const; + T* operator->() const; + T* operator->(); + const T& operator*() const; + T& operator*(); - template - operator intrusive_ptr

    () const; + template + operator intrusive_ptr

    () const; - template - intrusive_ptr

    object_parent_cast() const; + template + intrusive_ptr

    object_parent_cast() const; - template - intrusive_ptr

    object_static_cast() const; + template + intrusive_ptr

    object_static_cast() const; - template - intrusive_ptr

    object_dynamic_cast() const; + template + intrusive_ptr

    object_dynamic_cast() const; - template - interface_ptr

    interface_cast() const; + template + interface_ptr

    interface_cast() const; - template - interface_ptr

    interface_dynamic_cast() const; + template + interface_ptr

    interface_dynamic_cast() const; - /// @todo переместить в protected - T* get(); - const T* get() const; + // TODO переместить в protected + T* get(); + const T* get() const; - bool owner() const; + bool owner() const; protected: - void addref(); - void release(); + void addref(); + void release(); private: - T* m_object; + T* m_object; - std::size_t& counter(); + std::size_t& counter(); }; #define DECLARE_POINTER(TYPE) typedef rdo::intrusive_ptr LP##TYPE; @@ -84,5 +81,3 @@ template friend class smart_ptr_wrapper; } // namespace rdo #include "utils/src/smart_ptr/intrusive_ptr/intrusive_ptr-inl.h" - -#endif // _UTILS_SMART_PTR_INTRUSIVE_PTR_H_ diff --git a/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr_interface_wrapper-inl.h b/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr_interface_wrapper-inl.h index 151f6b7d0..88b22a3b0 100644 --- a/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr_interface_wrapper-inl.h +++ b/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr_interface_wrapper-inl.h @@ -11,25 +11,25 @@ namespace rdo { // -------------------------------------------------------------------------------- template inline intrusive_ptr_interface_wrapper::intrusive_ptr_interface_wrapper(const rdo::intrusive_ptr& pPointer) - : parent_type(pPointer) + : parent_type(pPointer) {} template inline void intrusive_ptr_interface_wrapper::addref() { - parent_type::addref(); + parent_type::addref(); } template inline void intrusive_ptr_interface_wrapper::release() { - parent_type::release(); + parent_type::release(); } template inline bool intrusive_ptr_interface_wrapper::owner() const { - return parent_type::owner(); + return parent_type::owner(); } } // namespace rdo diff --git a/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr_interface_wrapper.h b/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr_interface_wrapper.h index dac3c96c5..36336215d 100644 --- a/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr_interface_wrapper.h +++ b/utils/src/smart_ptr/intrusive_ptr/intrusive_ptr_interface_wrapper.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_SMART_PTR_INTRUSIVE_PTR_INTERFACE_WRAPPER_H_ -#define _UTILS_SMART_PTR_INTRUSIVE_PTR_INTERFACE_WRAPPER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,21 +8,17 @@ namespace rdo { -//! Оборачивает умный указатель в интерфейс -//! tparam T - тип объекта, на который ссылается указатель template class intrusive_ptr_interface_wrapper: public rdo::intrusive_ptr, public rdo::IRefCounter { public: - intrusive_ptr_interface_wrapper(const rdo::intrusive_ptr& pPointer); - DECLARE_IRefCounter; + intrusive_ptr_interface_wrapper(const rdo::intrusive_ptr& pPointer); + DECLARE_IRefCounter; private: - typedef rdo::intrusive_ptr parent_type; + typedef rdo::intrusive_ptr parent_type; }; } // namespace rdo #include "utils/src/smart_ptr/intrusive_ptr/intrusive_ptr_interface_wrapper-inl.h" - -#endif // _UTILS_SMART_PTR_INTRUSIVE_PTR_INTERFACE_WRAPPER_H_ diff --git a/utils/src/smart_ptr/ref_counter/counter_reference.cpp b/utils/src/smart_ptr/ref_counter/counter_reference.cpp index f64c37e53..489a5af6d 100644 --- a/utils/src/smart_ptr/ref_counter/counter_reference.cpp +++ b/utils/src/smart_ptr/ref_counter/counter_reference.cpp @@ -6,7 +6,7 @@ namespace rdo { counter_reference::counter_reference() - : m_intrusive_counter(0) + : m_intrusive_counter(0) {} counter_reference::~counter_reference() diff --git a/utils/src/smart_ptr/ref_counter/counter_reference.h b/utils/src/smart_ptr/ref_counter/counter_reference.h index 2f12a848c..4205a222e 100644 --- a/utils/src/smart_ptr/ref_counter/counter_reference.h +++ b/utils/src/smart_ptr/ref_counter/counter_reference.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_SMART_PTR_COUNTER_REFERENCE_H_ -#define _UTILS_SMART_PTR_COUNTER_REFERENCE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -13,14 +12,11 @@ class counter_reference template friend class intrusive_ptr; template friend class RefCounter; public: - //! Инициализиреут счетчик нулём - counter_reference(); - virtual ~counter_reference(); + counter_reference(); + virtual ~counter_reference(); private: - std::size_t m_intrusive_counter; + std::size_t m_intrusive_counter; }; } // namespace rdo - -#endif // _UTILS_SMART_PTR_COUNTER_REFERENCE_H_ diff --git a/utils/src/smart_ptr/ref_counter/ref_counter-inl.h b/utils/src/smart_ptr/ref_counter/ref_counter-inl.h index 013cecef0..5c1d34fb9 100644 --- a/utils/src/smart_ptr/ref_counter/ref_counter-inl.h +++ b/utils/src/smart_ptr/ref_counter/ref_counter-inl.h @@ -9,31 +9,31 @@ namespace rdo { template inline void RefCounter::addref() { - counter_reference* pCounter = dynamic_cast(this); - ASSERT(pCounter); - pCounter->m_intrusive_counter++; + counter_reference* pCounter = dynamic_cast(this); + ASSERT(pCounter); + pCounter->m_intrusive_counter++; } template inline void RefCounter::release() { - counter_reference* pCounter = dynamic_cast(this); - ASSERT(pCounter); - pCounter->m_intrusive_counter--; - if (pCounter->m_intrusive_counter == 0) - { - T* pObject = dynamic_cast(this); - ASSERT(pObject); - Factory::destroy(pObject); - } + counter_reference* pCounter = dynamic_cast(this); + ASSERT(pCounter); + pCounter->m_intrusive_counter--; + if (pCounter->m_intrusive_counter == 0) + { + T* pObject = dynamic_cast(this); + ASSERT(pObject); + Factory::destroy(pObject); + } } template inline bool RefCounter::owner() const { - const counter_reference* pCounter = dynamic_cast(this); - ASSERT(pCounter); - return pCounter->m_intrusive_counter == 1; + const counter_reference* pCounter = dynamic_cast(this); + ASSERT(pCounter); + return pCounter->m_intrusive_counter == 1; } } // namespace rdo diff --git a/utils/src/smart_ptr/ref_counter/ref_counter.h b/utils/src/smart_ptr/ref_counter/ref_counter.h index c65bb8ccd..8eb8adb8c 100644 --- a/utils/src/smart_ptr/ref_counter/ref_counter.h +++ b/utils/src/smart_ptr/ref_counter/ref_counter.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_SMART_PTR_REF_COUNTER_H_ -#define _UTILS_SMART_PTR_REF_COUNTER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -12,9 +11,7 @@ template class RefCounter: public IRefCounter { public: - DECLARE_IRefCounter; + DECLARE_IRefCounter; }; } // namespace rdo - -#endif // _UTILS_SMART_PTR_REF_COUNTER_H_ diff --git a/utils/src/smart_ptr/ref_counter/ref_counter_i.h b/utils/src/smart_ptr/ref_counter/ref_counter_i.h index 4eff84247..6f18e668e 100644 --- a/utils/src/smart_ptr/ref_counter/ref_counter_i.h +++ b/utils/src/smart_ptr/ref_counter/ref_counter_i.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_SMART_PTR_REF_COUNTER_I_H_ -#define _UTILS_SMART_PTR_REF_COUNTER_I_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -9,17 +8,15 @@ namespace rdo { struct IRefCounter { - virtual void addref() = 0; - virtual void release() = 0; - virtual bool owner() const = 0; + virtual void addref() = 0; + virtual void release() = 0; + virtual bool owner() const = 0; }; #define DECLARE_IRefCounter \ - void addref(); \ - void release(); \ - bool owner() const; + void addref(); \ + void release(); \ + bool owner() const; typedef IRefCounter* LPIRefCounter; } // namespace rdo - -#endif // _UTILS_SMART_PTR_REF_COUNTER_I_H_ diff --git a/utils/src/smart_ptr/wrapper/rdosmart_ptr_wrapper.h b/utils/src/smart_ptr/wrapper/rdosmart_ptr_wrapper.h index 1d4e8177a..adc8909da 100644 --- a/utils/src/smart_ptr/wrapper/rdosmart_ptr_wrapper.h +++ b/utils/src/smart_ptr/wrapper/rdosmart_ptr_wrapper.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_RDOSMART_PTR_WRAPPER_H_ -#define _UTILS_RDOSMART_PTR_WRAPPER_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -12,71 +11,69 @@ namespace rdo { class ISmartPtrWrapper { public: - virtual void destroy() = 0; - virtual void* getSmartPtr() = 0; - virtual const counter_reference* getRefCounter() const = 0; + virtual void destroy() = 0; + virtual void* getSmartPtr() = 0; + virtual const counter_reference* getRefCounter() const = 0; }; typedef ISmartPtrWrapper* LPISmartPtrWrapper; #define DECLARE_ISmartPtrWrapper \ - virtual void destroy(); \ - virtual void* getSmartPtr(); \ - virtual const counter_reference* getRefCounter() const; + virtual void destroy(); \ + virtual void* getSmartPtr(); \ + virtual const counter_reference* getRefCounter() const; template class smart_ptr_wrapper: public ISmartPtrWrapper { public: - smart_ptr_wrapper(const intrusive_ptr& intrusive_ptr) - : m_intrusive_ptr(intrusive_ptr) - {} - virtual ~smart_ptr_wrapper() - {} - void destroy() - { - delete this; - } - void* getSmartPtr() - { - return &m_intrusive_ptr; - } - const counter_reference* getRefCounter() const - { - return m_intrusive_ptr.m_object; - } - const intrusive_ptr& get() const - { - return m_intrusive_ptr; - } + smart_ptr_wrapper(const intrusive_ptr& intrusive_ptr) + : m_intrusive_ptr(intrusive_ptr) + {} + virtual ~smart_ptr_wrapper() + {} + void destroy() + { + delete this; + } + void* getSmartPtr() + { + return &m_intrusive_ptr; + } + const counter_reference* getRefCounter() const + { + return m_intrusive_ptr.m_object; + } + const intrusive_ptr& get() const + { + return m_intrusive_ptr; + } private: - intrusive_ptr m_intrusive_ptr; + intrusive_ptr m_intrusive_ptr; }; class smart_ptr_wrapper_caster { public: - smart_ptr_wrapper_caster(const LPISmartPtrWrapper& pISmartPtrWrapper) - : m_pISmartPtrWrapper(pISmartPtrWrapper) - { - ASSERT(m_pISmartPtrWrapper); - } - ~smart_ptr_wrapper_caster() - { - m_pISmartPtrWrapper->destroy(); - } + smart_ptr_wrapper_caster(const LPISmartPtrWrapper& pISmartPtrWrapper) + : m_pISmartPtrWrapper(pISmartPtrWrapper) + { + ASSERT(m_pISmartPtrWrapper); + } + ~smart_ptr_wrapper_caster() + { + m_pISmartPtrWrapper->destroy(); + } - template - intrusive_ptr cast() const - { - rdo::smart_ptr_wrapper* pSmartPtrWrapper = dynamic_cast*>(m_pISmartPtrWrapper); - return pSmartPtrWrapper ? pSmartPtrWrapper->get() : intrusive_ptr(); - } + template + intrusive_ptr cast() const + { + rdo::smart_ptr_wrapper* pSmartPtrWrapper = dynamic_cast*>(m_pISmartPtrWrapper); + return pSmartPtrWrapper ? pSmartPtrWrapper->get() : intrusive_ptr(); + } private: - LPISmartPtrWrapper m_pISmartPtrWrapper; + LPISmartPtrWrapper m_pISmartPtrWrapper; }; } // namespace rdo - -#endif // _UTILS_RDOSMART_PTR_WRAPPER_H_ diff --git a/utils/src/stuff/explicit_value.h b/utils/src/stuff/explicit_value.h index 75a8adffb..c9f3df6ad 100644 --- a/utils/src/stuff/explicit_value.h +++ b/utils/src/stuff/explicit_value.h @@ -1,5 +1,4 @@ -#ifndef _RDO_COMMON_EXPLICIT_VALUE_H_ -#define _RDO_COMMON_EXPLICIT_VALUE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -12,19 +11,17 @@ template class explicit_value { public: - explicit explicit_value(const T& value) - : m_value(value) - {} + explicit explicit_value(const T& value) + : m_value(value) + {} - operator T() const - { - return m_value; - } + operator T() const + { + return m_value; + } private: - T m_value; + T m_value; }; } // namespace rdo - -#endif // _RDO_COMMON_EXPLICIT_VALUE_H_ diff --git a/utils/src/stuff/rdoidgenerator.h b/utils/src/stuff/rdoidgenerator.h index 6d68ecea5..5d7666c86 100644 --- a/utils/src/stuff/rdoidgenerator.h +++ b/utils/src/stuff/rdoidgenerator.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_RDOIDGENERATOR_H_ -#define _UTILS_RDOIDGENERATOR_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -11,21 +10,19 @@ namespace rdo { class IDGenerator { public: - typedef std::size_t ID; + typedef std::size_t ID; - IDGenerator() - : m_id(0) - {} + IDGenerator() + : m_id(0) + {} - ID get() - { - return m_id++; - } + ID get() + { + return m_id++; + } private: - ID m_id; + ID m_id; }; } // namespace rdo - -#endif // _UTILS_RDOIDGENERATOR_H_ diff --git a/utils/src/stuff/rdoindexedstack.h b/utils/src/stuff/rdoindexedstack.h index 866696f7e..0f4a68aa3 100644 --- a/utils/src/stuff/rdoindexedstack.h +++ b/utils/src/stuff/rdoindexedstack.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_RDOINDEXEDSTACK_H_ -#define _UTILS_RDOINDEXEDSTACK_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -15,34 +14,32 @@ template class IndexedStack { public: - typedef IDGenerator::ID ID; - - IndexedStack() - {} - - ID push(const T& object) - { - std::pair result = m_stack.insert( - std::pair(m_generator.get(), object) - ); - ASSERT(result.second); - return result.first->first; - } - T pop(ID index) - { - typename Stack::iterator it = m_stack.find(index); - ASSERT(it != m_stack.end()); - T object = it->second; - m_stack.erase(it); - return object; - } + typedef IDGenerator::ID ID; + + IndexedStack() + {} + + ID push(const T& object) + { + std::pair result = m_stack.insert( + std::pair(m_generator.get(), object) + ); + ASSERT(result.second); + return result.first->first; + } + T pop(ID index) + { + typename Stack::iterator it = m_stack.find(index); + ASSERT(it != m_stack.end()); + T object = it->second; + m_stack.erase(it); + return object; + } protected: - typedef std::map Stack; - Stack m_stack; - IDGenerator m_generator; + typedef std::map Stack; + Stack m_stack; + IDGenerator m_generator; }; } // namespace rdo - -#endif // _UTILS_RDOINDEXEDSTACK_H_ diff --git a/utils/src/stuff/rdosingletone.h b/utils/src/stuff/rdosingletone.h index c52e14e0f..9d8bde3c7 100644 --- a/utils/src/stuff/rdosingletone.h +++ b/utils/src/stuff/rdosingletone.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_RDOSINGLETONE_H_ -#define _UTILS_RDOSINGLETONE_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES // ----------------------------------------------------------------------- SYNOPSIS @@ -12,35 +11,33 @@ template class SingleTone { public: - typedef T object_type; - typedef SingleTone this_type; + typedef T object_type; + typedef SingleTone this_type; - SingleTone() - : m_object(NULL) - {} - ~SingleTone() - { - if (m_object) - delete m_object; - } - T* instance() - { - if (!m_object) - m_object = new T(); - return m_object; - } - template - T* instance(const P1& p1) - { - if (!m_object) - m_object = new T(p1); - return m_object; - } + SingleTone() + : m_object(NULL) + {} + ~SingleTone() + { + if (m_object) + delete m_object; + } + T* instance() + { + if (!m_object) + m_object = new T(); + return m_object; + } + template + T* instance(const P1& p1) + { + if (!m_object) + m_object = new T(p1); + return m_object; + } private: - T* m_object; + T* m_object; }; } // namespace rdo - -#endif // _UTILS_RDOSINGLETONE_H_ diff --git a/utils/src/stuff/stack-inl.h b/utils/src/stuff/stack-inl.h index 1d52712e9..a2cfa1e4e 100644 --- a/utils/src/stuff/stack-inl.h +++ b/utils/src/stuff/stack-inl.h @@ -8,43 +8,43 @@ namespace rdo { template inline void stack::push(const T& item) { - m_container.push_back(item); + m_container.push_back(item); } template inline void stack::pop() { - ASSERT(!empty()); + ASSERT(!empty()); - m_container.pop_back(); + m_container.pop_back(); } template inline bool stack::empty() const { - return m_container.empty(); + return m_container.empty(); } template inline std::size_t stack::size() const { - return m_container.size(); + return m_container.size(); } template inline const T& stack::top() const { - ASSERT(!empty()); + ASSERT(!empty()); - return m_container.back(); + return m_container.back(); } template inline T& stack::top() { - ASSERT(!empty()); + ASSERT(!empty()); - return m_container.back(); + return m_container.back(); } } // namespace rdo diff --git a/utils/src/stuff/stack.h b/utils/src/stuff/stack.h index ff57162d2..3a198b6d6 100644 --- a/utils/src/stuff/stack.h +++ b/utils/src/stuff/stack.h @@ -1,5 +1,4 @@ -#ifndef _RDO_COMMON_STACK_H_ -#define _RDO_COMMON_STACK_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -13,22 +12,20 @@ template class stack { public: - void push(const T& item); - void pop(); + void push(const T& item); + void pop(); - bool empty() const; - std::size_t size() const; + bool empty() const; + std::size_t size() const; - const T& top() const; - T& top(); + const T& top() const; + T& top(); private: - typedef std::list Container; - Container m_container; + typedef std::list Container; + Container m_container; }; } // namespace rdo #include "utils/src/stuff/stack-inl.h" - -#endif // _RDO_COMMON_STACK_H_ diff --git a/utils/src/stuff/supersubclass.h b/utils/src/stuff/supersubclass.h deleted file mode 100644 index ceb072749..000000000 --- a/utils/src/stuff/supersubclass.h +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef _UTILS_SUPERSUBCLASS_H_ -#define _UTILS_SUPERSUBCLASS_H_ - -// ----------------------------------------------------------------------- INCLUDES -// ----------------------------------------------------------------------- SYNOPSIS -#include "utils/src/common/rdocommon.h" -// -------------------------------------------------------------------------------- - -namespace rdo { - -template -class SuperSubClass -{ -private: - typedef char Small; - class Big { char dummy[2]; }; - - static Small Test (const U&); - static Big Test (...); - static T MakeT(); - -public: - enum { exists = sizeof(Test(MakeT())) == sizeof(Small) }; - enum { same = false }; -}; - -template -class SuperSubClass -{ -public: - enum { exists = true }; - enum { same = true }; -}; - -#define SUPERSUBCLASS(T, U) (SuperSubClass::exists) - -} // namespace rdo - -#endif // _UTILS_SUPERSUBCLASS_H_ diff --git a/utils/src/time/rdotime.cpp b/utils/src/time/rdotime.cpp index daade89fa..799c4e20a 100644 --- a/utils/src/time/rdotime.cpp +++ b/utils/src/time/rdotime.cpp @@ -8,57 +8,57 @@ namespace rdo { Time::Time() - : m_value(Time::invalid().value()) + : m_value(Time::invalid().value()) {} Time::Time(const Value& value) - : m_value(value) + : m_value(value) {} bool Time::operator==(const Time& time) { - return m_value == time.m_value; + return m_value == time.m_value; } Time::operator Value() const { - return m_value; + return m_value; } std::string Time::asString() const { - if (m_value == Time::invalid()) - { - return "[INVALID]"; - } - else - { - return boost::posix_time::to_simple_string_type(boost::posix_time::microsec_clock::local_time()); - } + if (m_value == Time::invalid()) + { + return "[INVALID]"; + } + else + { + return boost::posix_time::to_simple_string_type(boost::posix_time::microsec_clock::local_time()); + } } const Time::Value& Time::value() const { - return m_value; + return m_value; } Time Time::utc() { - boost::posix_time::ptime startTime = boost::posix_time::time_from_string("1970-01-01 00:00:00.000"); - Time::Value delta = ( boost::posix_time::microsec_clock::universal_time() - startTime ).total_nanoseconds( ); - return delta; + boost::posix_time::ptime startTime = boost::posix_time::time_from_string("1970-01-01 00:00:00.000"); + Time::Value delta = ( boost::posix_time::microsec_clock::universal_time() - startTime ).total_nanoseconds( ); + return delta; } Time Time::local() { - boost::posix_time::ptime startTime = boost::posix_time::time_from_string("1970-01-01 00:00:00.000"); - Time::Value delta = ( boost::posix_time::microsec_clock::local_time() - startTime ).total_nanoseconds( ); - return delta; + boost::posix_time::ptime startTime = boost::posix_time::time_from_string("1970-01-01 00:00:00.000"); + Time::Value delta = ( boost::posix_time::microsec_clock::local_time() - startTime ).total_nanoseconds( ); + return delta; } Time Time::invalid() { - return Time(Value(~0)); + return Time(Value(~0)); } } // namespace rdo diff --git a/utils/src/time/rdotime.h b/utils/src/time/rdotime.h index 6c7d90522..7c7dc9654 100644 --- a/utils/src/time/rdotime.h +++ b/utils/src/time/rdotime.h @@ -1,5 +1,4 @@ -#ifndef _UTILS_RDOTIME_H_ -#define _UTILS_RDOTIME_H_ +#pragma once // ----------------------------------------------------------------------- INCLUDES #include @@ -12,26 +11,24 @@ namespace rdo { class Time { public: - typedef uint64_t Value; + typedef uint64_t Value; - Time(); - Time(const Value& value); + Time(); + Time(const Value& value); - bool operator==(const Time& time); - operator Value() const; + bool operator==(const Time& time); + operator Value() const; - std::string asString() const; + std::string asString() const; - const Value& value() const; + const Value& value() const; - static Time utc(); // total_nanoseconds - static Time local(); // total_nanoseconds - static Time invalid(); + static Time utc(); // total_nanoseconds + static Time local(); // total_nanoseconds + static Time invalid(); private: - Value m_value; + Value m_value; }; } // namespace rdo - -#endif // _UTILS_RDOTIME_H_ diff --git a/utils/test/animation/main.cpp b/utils/test/animation/main.cpp index 8b791a8a5..b5905ca61 100644 --- a/utils/test/animation/main.cpp +++ b/utils/test/animation/main.cpp @@ -14,242 +14,242 @@ BOOST_AUTO_TEST_SUITE(RDOCommonAnimation_Test) BOOST_AUTO_TEST_CASE(RDOCommonAnimationFrame) { - rdo::animation::FrameItem::Type frameItemType = rdo::animation::FrameItem::FIT_NULL; - rdo::animation::FrameItem frameItem(frameItemType); + rdo::animation::FrameItem::Type frameItemType = rdo::animation::FrameItem::Type::NONE; + rdo::animation::FrameItem frameItem(frameItemType); - BOOST_CHECK(frameItem.getType() == frameItemType); + BOOST_CHECK(frameItem.getType() == frameItemType); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationColor) { - rdo::animation::Color color; + rdo::animation::Color color; - BOOST_CHECK(color.m_transparent); + BOOST_CHECK(color.m_transparent); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationColoredElement) { - rdo::animation::Color background; - rdo::animation::Color foreground; - rdo::animation::ColoredElement elem(background, foreground); + rdo::animation::Color background; + rdo::animation::Color foreground; + rdo::animation::ColoredElement elem(background, foreground); - BOOST_CHECK(elem.m_background.m_transparent == background.m_transparent); - BOOST_CHECK(elem.m_foreground.m_transparent == foreground.m_transparent); + BOOST_CHECK(elem.m_background.m_transparent == background.m_transparent); + BOOST_CHECK(elem.m_foreground.m_transparent == foreground.m_transparent); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationPoint) { - int x = 0; - int y = 0; - rdo::animation::Point point(x,y); + int x = 0; + int y = 0; + rdo::animation::Point point(x,y); - BOOST_CHECK(point.m_x == x); - BOOST_CHECK(point.m_y == y); + BOOST_CHECK(point.m_x == x); + BOOST_CHECK(point.m_y == y); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationSize) { - int width = 10; - int height = 10; - rdo::animation::Size size(width, height); + int width = 10; + int height = 10; + rdo::animation::Size size(width, height); - BOOST_CHECK(size.m_width == width); - BOOST_CHECK(size.m_height == height); + BOOST_CHECK(size.m_width == width); + BOOST_CHECK(size.m_height == height); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationBoundedElement) { - int x = 0; - int y = 5; + int x = 0; + int y = 5; - int width = 10; - int height = 20; + int width = 10; + int height = 20; - rdo::animation::Point point(x, y); - rdo::animation::Size size(width, height); - rdo::animation::BoundedElement boundedElement(point, size); + rdo::animation::Point point(x, y); + rdo::animation::Size size(width, height); + rdo::animation::BoundedElement boundedElement(point, size); - BOOST_CHECK(boundedElement.m_point == point); - BOOST_CHECK(boundedElement.m_size == size); + BOOST_CHECK(boundedElement.m_point == point); + BOOST_CHECK(boundedElement.m_size == size); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationRadius) { - double radiusSize = 100; - rdo::animation::Radius radius(radiusSize); + double radiusSize = 100; + rdo::animation::Radius radius(radiusSize); - BOOST_CHECK(radius.m_radius == radiusSize); + BOOST_CHECK(radius.m_radius == radiusSize); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationTextElement) { - rdo::animation::Color background(0, 0, 0); - rdo::animation::Color foreground(0, 0, 0); - rdo::animation::ColoredElement elem(background, foreground); + rdo::animation::Color background(0, 0, 0); + rdo::animation::Color foreground(0, 0, 0); + rdo::animation::ColoredElement elem(background, foreground); - rdo::animation::Point point(0,0); - rdo::animation::Size size(10, 10); - rdo::animation::BoundedElement boundedElement(point, size); - const std::string text("RDO"); + rdo::animation::Point point(0,0); + rdo::animation::Size size(10, 10); + rdo::animation::BoundedElement boundedElement(point, size); + const std::string text("RDO"); - rdo::animation::TextElement::TextAlign align = rdo::animation::TextElement::TETA_CENTER; + rdo::animation::TextElement::Align align = rdo::animation::TextElement::Align::CENTER; - rdo::animation::TextElement textElement(boundedElement, elem, text, align); + rdo::animation::TextElement textElement(boundedElement, elem, text, align); - BOOST_CHECK(textElement.m_point == point); - BOOST_CHECK(textElement.m_size == size); - BOOST_CHECK(textElement.m_background == background); - BOOST_CHECK(textElement.m_foreground == foreground); - BOOST_CHECK(textElement.m_text == text); - BOOST_CHECK(textElement.m_align == align); + BOOST_CHECK(textElement.m_point == point); + BOOST_CHECK(textElement.m_size == size); + BOOST_CHECK(textElement.m_background == background); + BOOST_CHECK(textElement.m_foreground == foreground); + BOOST_CHECK(textElement.m_text == text); + BOOST_CHECK(textElement.m_align == align); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationLineElement) { - int x1 = 1; - int y1 = 3; - int x2 = 5; - int y2 = 7; + int x1 = 1; + int y1 = 3; + int x2 = 5; + int y2 = 7; - rdo::animation::Point point1(x1, y1); - rdo::animation::Point point2(x2, y2); + rdo::animation::Point point1(x1, y1); + rdo::animation::Point point2(x2, y2); - rdo::animation::Color color; + rdo::animation::Color color; - rdo::animation::LineElement lineElem(point1, point2, color); + rdo::animation::LineElement lineElem(point1, point2, color); - BOOST_CHECK(lineElem.m_color.m_transparent == color.m_transparent); - BOOST_CHECK(lineElem.m_color == color); - BOOST_CHECK(lineElem.m_point1 == point1); - BOOST_CHECK(lineElem.m_point2 == point2); + BOOST_CHECK(lineElem.m_color.m_transparent == color.m_transparent); + BOOST_CHECK(lineElem.m_color == color); + BOOST_CHECK(lineElem.m_point1 == point1); + BOOST_CHECK(lineElem.m_point2 == point2); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationTriangElement) { - rdo::animation::Point point1(0, 0); - rdo::animation::Point point2(10, 0); - rdo::animation::Point point3(0, 10); + rdo::animation::Point point1(0, 0); + rdo::animation::Point point2(10, 0); + rdo::animation::Point point3(0, 10); - rdo::animation::Color background; - rdo::animation::Color foreground; - rdo::animation::ColoredElement elem(background, foreground); + rdo::animation::Color background; + rdo::animation::Color foreground; + rdo::animation::ColoredElement elem(background, foreground); - rdo::animation::TriangElement triangElement(point1, point2, point3, elem); + rdo::animation::TriangElement triangElement(point1, point2, point3, elem); - BOOST_CHECK(triangElement.m_background == background); - BOOST_CHECK(triangElement.m_foreground == foreground); - BOOST_CHECK(triangElement.m_point1 == point1); - BOOST_CHECK(triangElement.m_point2 == point2); - BOOST_CHECK(triangElement.m_point3 == point3); + BOOST_CHECK(triangElement.m_background == background); + BOOST_CHECK(triangElement.m_foreground == foreground); + BOOST_CHECK(triangElement.m_point1 == point1); + BOOST_CHECK(triangElement.m_point2 == point2); + BOOST_CHECK(triangElement.m_point3 == point3); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationRectElements) { - rdo::animation::Color background; - rdo::animation::Color foreground; - rdo::animation::ColoredElement elem(background, foreground); + rdo::animation::Color background; + rdo::animation::Color foreground; + rdo::animation::ColoredElement elem(background, foreground); - rdo::animation::Point point(0,0); - rdo::animation::Size size(10, 10); - rdo::animation::BoundedElement boundedElement(point, size); + rdo::animation::Point point(0,0); + rdo::animation::Size size(10, 10); + rdo::animation::BoundedElement boundedElement(point, size); - rdo::animation::RectElement rectElement(boundedElement, elem); + rdo::animation::RectElement rectElement(boundedElement, elem); - BOOST_CHECK(rectElement.m_background == background); - BOOST_CHECK(rectElement.m_foreground == foreground); - BOOST_CHECK(rectElement.m_point == point); - BOOST_CHECK(rectElement.m_size == size); + BOOST_CHECK(rectElement.m_background == background); + BOOST_CHECK(rectElement.m_foreground == foreground); + BOOST_CHECK(rectElement.m_point == point); + BOOST_CHECK(rectElement.m_size == size); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationCircleElement) { - rdo::animation::Point point(0,0); - rdo::animation::Radius radius(10); + rdo::animation::Point point(0,0); + rdo::animation::Radius radius(10); - rdo::animation::Color background; - rdo::animation::Color foreground; - rdo::animation::ColoredElement elem(background, foreground); + rdo::animation::Color background; + rdo::animation::Color foreground; + rdo::animation::ColoredElement elem(background, foreground); - rdo::animation::CircleElement circle(point ,radius, elem); + rdo::animation::CircleElement circle(point ,radius, elem); - BOOST_CHECK(circle.m_center == point); - BOOST_CHECK(circle.m_radius == radius); - BOOST_CHECK(circle.m_background == background); - BOOST_CHECK(circle.m_foreground == foreground); + BOOST_CHECK(circle.m_center == point); + BOOST_CHECK(circle.m_radius == radius); + BOOST_CHECK(circle.m_background == background); + BOOST_CHECK(circle.m_foreground == foreground); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationEllipseElement) { - rdo::animation::Point point(0,0); - rdo::animation::Size size(10, 10); - rdo::animation::BoundedElement boundedElement(point, size); + rdo::animation::Point point(0,0); + rdo::animation::Size size(10, 10); + rdo::animation::BoundedElement boundedElement(point, size); - rdo::animation::Color background; - rdo::animation::Color foreground; - rdo::animation::ColoredElement elem(background, foreground); + rdo::animation::Color background; + rdo::animation::Color foreground; + rdo::animation::ColoredElement elem(background, foreground); - rdo::animation::EllipseElement ellipse(boundedElement, elem); + rdo::animation::EllipseElement ellipse(boundedElement, elem); - BOOST_CHECK(ellipse.m_background == background); - BOOST_CHECK(ellipse.m_foreground == foreground); - BOOST_CHECK(ellipse.m_point == point); - BOOST_CHECK(ellipse.m_size == size); + BOOST_CHECK(ellipse.m_background == background); + BOOST_CHECK(ellipse.m_foreground == foreground); + BOOST_CHECK(ellipse.m_point == point); + BOOST_CHECK(ellipse.m_size == size); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationBmpElement) { - rdo::animation::Point point(0,0); - const std::string bmp_name("rdo_bmp"); - const std::string mask_name("mask"); + rdo::animation::Point point(0,0); + const std::string bmp_name("rdo_bmp"); + const std::string mask_name("mask"); - rdo::animation::BmpElement bmpElement(point, bmp_name, mask_name); + rdo::animation::BmpElement bmpElement(point, bmp_name, mask_name); - BOOST_CHECK(bmpElement.m_point == point); - BOOST_CHECK(bmpElement.m_bmp_name == bmp_name); - BOOST_CHECK(bmpElement.m_mask_name == mask_name); + BOOST_CHECK(bmpElement.m_point == point); + BOOST_CHECK(bmpElement.m_bmp_name == bmp_name); + BOOST_CHECK(bmpElement.m_mask_name == mask_name); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationSBmpElement) { - const std::string bmp_name("rdo_bmp"); - const std::string mask_name("mask"); + const std::string bmp_name("rdo_bmp"); + const std::string mask_name("mask"); - rdo::animation::Point point(0, 0); - rdo::animation::Size size(10, 10); - rdo::animation::BoundedElement boundedElement(point, size); + rdo::animation::Point point(0, 0); + rdo::animation::Size size(10, 10); + rdo::animation::BoundedElement boundedElement(point, size); - rdo::animation::ScaledBmpElement sbmpElement(boundedElement, bmp_name, mask_name); + rdo::animation::ScaledBmpElement sbmpElement(boundedElement, bmp_name, mask_name); - BOOST_CHECK(sbmpElement.m_bmp_name == bmp_name); - BOOST_CHECK(sbmpElement.m_mask_name == mask_name); - BOOST_CHECK(sbmpElement.m_point == point); - BOOST_CHECK(sbmpElement.m_size == size); + BOOST_CHECK(sbmpElement.m_bmp_name == bmp_name); + BOOST_CHECK(sbmpElement.m_mask_name == mask_name); + BOOST_CHECK(sbmpElement.m_point == point); + BOOST_CHECK(sbmpElement.m_size == size); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationActiveElement) { - const std::string text("RDO"); + const std::string text("RDO"); - rdo::animation::Point point(0, 0); - rdo::animation::Size size(10, 10); - rdo::animation::BoundedElement boundedElement(point, size); + rdo::animation::Point point(0, 0); + rdo::animation::Size size(10, 10); + rdo::animation::BoundedElement boundedElement(point, size); - rdo::animation::ActiveElement actionElement(boundedElement, text); + rdo::animation::ActiveElement actionElement(boundedElement, text); - BOOST_CHECK(actionElement.m_point == point); - BOOST_CHECK(actionElement.m_size == size); + BOOST_CHECK(actionElement.m_point == point); + BOOST_CHECK(actionElement.m_size == size); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationNullElement) { - std::auto_ptr nullElem(new rdo::animation::NullElement); - BOOST_CHECK(nullElem.get()); + std::auto_ptr nullElem(new rdo::animation::NullElement); + BOOST_CHECK(nullElem.get()); } BOOST_AUTO_TEST_CASE(RDOCommonAnimationFramet) { - rdo::animation::Frame frame; - BOOST_CHECK(!frame.hasBgImage()); + rdo::animation::Frame frame; + BOOST_CHECK(!frame.hasBgImage()); } BOOST_AUTO_TEST_SUITE_END() // RDOCommonAnimation_Test diff --git a/utils/test/common/main.cpp b/utils/test/common/main.cpp index 862b37393..f319cfc64 100644 --- a/utils/test/common/main.cpp +++ b/utils/test/common/main.cpp @@ -20,126 +20,126 @@ BOOST_AUTO_TEST_SUITE(RDOCommon_Test) BOOST_AUTO_TEST_CASE(RDOCommon_FileCreate) { - rdo::locale::initForTest(); - BOOST_CHECK(rdo::File::create(s_testFileName)); + rdo::locale::initForTest(); + BOOST_CHECK(rdo::File::create(s_testFileName)); } BOOST_AUTO_TEST_CASE(RDOCommon_FileExist) { - BOOST_CHECK(rdo::File::exist(s_testFileName)); + BOOST_CHECK(rdo::File::exist(s_testFileName)); } BOOST_AUTO_TEST_CASE(RDOCommon_FileReadOnly) { - BOOST_CHECK(!rdo::File::read_only(s_testFileName)); + BOOST_CHECK(!rdo::File::read_only(s_testFileName)); } BOOST_AUTO_TEST_CASE(RDOCommon_FileRemove) { - BOOST_CHECK(rdo::File::unlink(s_testFileName)); + BOOST_CHECK(rdo::File::unlink(s_testFileName)); } #ifdef OST_LINUX BOOST_AUTO_TEST_CASE(RDOCommon_FileSplitPathInLinux) { - boost::filesystem::path file(rdo::locale::convertToWStr("/rdo/русский пробел/files/проект.smr")); - boost::filesystem::path dir; - boost::filesystem::path name; - boost::filesystem::path ext; - - BOOST_CHECK(rdo::File::splitpath(file, dir, name, ext)); - BOOST_CHECK(dir == rdo::locale::convertToWStr("/rdo/русский пробел/files/")); - BOOST_CHECK(name == rdo::locale::convertToWStr("проект")); - BOOST_CHECK(ext == rdo::locale::convertToWStr(".smr")); - BOOST_CHECK(rdo::locale::convertFromWStr(dir.wstring()) == "/rdo/русский пробел/files/"); + boost::filesystem::path file(rdo::locale::convertToWStr("/rdo/русский пробел/files/проект.smr")); + boost::filesystem::path dir; + boost::filesystem::path name; + boost::filesystem::path ext; + + BOOST_CHECK(rdo::File::splitpath(file, dir, name, ext)); + BOOST_CHECK(dir == rdo::locale::convertToWStr("/rdo/русский пробел/files/")); + BOOST_CHECK(name == rdo::locale::convertToWStr("проект")); + BOOST_CHECK(ext == rdo::locale::convertToWStr(".smr")); + BOOST_CHECK(rdo::locale::convertFromWStr(dir.wstring()) == "/rdo/русский пробел/files/"); } BOOST_AUTO_TEST_CASE(RDOCommon_FileSplitByRootPathInLinux) { - boost::filesystem::path file(rdo::locale::convertToWStr("/проект.smr")); - boost::filesystem::path dir; - boost::filesystem::path name; - boost::filesystem::path ext; - - BOOST_CHECK(rdo::File::splitpath(file, dir, name, ext)); - BOOST_CHECK(dir == rdo::locale::convertToWStr("/")); - BOOST_CHECK(name == rdo::locale::convertToWStr("проект")); - BOOST_CHECK(ext == rdo::locale::convertToWStr(".smr")); + boost::filesystem::path file(rdo::locale::convertToWStr("/проект.smr")); + boost::filesystem::path dir; + boost::filesystem::path name; + boost::filesystem::path ext; + + BOOST_CHECK(rdo::File::splitpath(file, dir, name, ext)); + BOOST_CHECK(dir == rdo::locale::convertToWStr("/")); + BOOST_CHECK(name == rdo::locale::convertToWStr("проект")); + BOOST_CHECK(ext == rdo::locale::convertToWStr(".smr")); } #endif #ifdef OST_WINDOWS BOOST_AUTO_TEST_CASE(RDOCommon_FileSplitPathInWindows) { - boost::filesystem::path file(rdo::locale::convertToWStr("C:/rdo/русский пробел/files/проект.smr")); - boost::filesystem::path dir; - boost::filesystem::path name; - boost::filesystem::path ext; - - BOOST_CHECK(rdo::File::splitpath(file, dir, name, ext)); - BOOST_CHECK(dir == rdo::locale::convertToWStr("C:\\rdo\\русский пробел\\files\\")); - BOOST_CHECK(name == rdo::locale::convertToWStr("проект")); - BOOST_CHECK(ext == rdo::locale::convertToWStr(".smr")); + boost::filesystem::path file(rdo::locale::convertToWStr("C:/rdo/русский пробел/files/проект.smr")); + boost::filesystem::path dir; + boost::filesystem::path name; + boost::filesystem::path ext; + + BOOST_CHECK(rdo::File::splitpath(file, dir, name, ext)); + BOOST_CHECK(dir == rdo::locale::convertToWStr("C:\\rdo\\русский пробел\\files\\")); + BOOST_CHECK(name == rdo::locale::convertToWStr("проект")); + BOOST_CHECK(ext == rdo::locale::convertToWStr(".smr")); } BOOST_AUTO_TEST_CASE(RDOCommon_FileSplitByRootPathInWindows) { - boost::filesystem::path file(rdo::locale::convertToWStr("C:/проект.smr")); - boost::filesystem::path dir; - boost::filesystem::path name; - boost::filesystem::path ext; - - BOOST_CHECK(rdo::File::splitpath(file, dir, name, ext)); - BOOST_CHECK(dir == rdo::locale::convertToWStr("C:\\")); - BOOST_CHECK(name == rdo::locale::convertToWStr("проект")); - BOOST_CHECK(ext == rdo::locale::convertToWStr(".smr")); + boost::filesystem::path file(rdo::locale::convertToWStr("C:/проект.smr")); + boost::filesystem::path dir; + boost::filesystem::path name; + boost::filesystem::path ext; + + BOOST_CHECK(rdo::File::splitpath(file, dir, name, ext)); + BOOST_CHECK(dir == rdo::locale::convertToWStr("C:\\")); + BOOST_CHECK(name == rdo::locale::convertToWStr("проект")); + BOOST_CHECK(ext == rdo::locale::convertToWStr(".smr")); } BOOST_AUTO_TEST_CASE(RDOCommon_FileSplitPathInWindows_BackSlash) { - boost::filesystem::path file(rdo::locale::convertToWStr("C:\\rdo\\русский пробел\\files\\проект.smr")); - boost::filesystem::path dir; - boost::filesystem::path name; - boost::filesystem::path ext; - - BOOST_CHECK(rdo::File::splitpath(file, dir, name, ext)); - BOOST_CHECK(dir == rdo::locale::convertToWStr("C:\\rdo\\русский пробел\\files\\")); - BOOST_CHECK(name == rdo::locale::convertToWStr("проект")); - BOOST_CHECK(ext == rdo::locale::convertToWStr(".smr")); - BOOST_CHECK(rdo::locale::convertFromWStr(dir.wstring()) == "C:\\rdo\\русский пробел\\files\\"); + boost::filesystem::path file(rdo::locale::convertToWStr("C:\\rdo\\русский пробел\\files\\проект.smr")); + boost::filesystem::path dir; + boost::filesystem::path name; + boost::filesystem::path ext; + + BOOST_CHECK(rdo::File::splitpath(file, dir, name, ext)); + BOOST_CHECK(dir == rdo::locale::convertToWStr("C:\\rdo\\русский пробел\\files\\")); + BOOST_CHECK(name == rdo::locale::convertToWStr("проект")); + BOOST_CHECK(ext == rdo::locale::convertToWStr(".smr")); + BOOST_CHECK(rdo::locale::convertFromWStr(dir.wstring()) == "C:\\rdo\\русский пробел\\files\\"); } BOOST_AUTO_TEST_CASE(RDOCommon_FileSplitByRootPathInWindows_BackSlash) { - boost::filesystem::path file(rdo::locale::convertToWStr("C:\\проект.smr")); - boost::filesystem::path dir; - boost::filesystem::path name; - boost::filesystem::path ext; - - BOOST_CHECK(rdo::File::splitpath(file, dir, name, ext)); - BOOST_CHECK(dir == rdo::locale::convertToWStr("C:\\")); - BOOST_CHECK(name == rdo::locale::convertToWStr("проект")); - BOOST_CHECK(ext == rdo::locale::convertToWStr(".smr")); + boost::filesystem::path file(rdo::locale::convertToWStr("C:\\проект.smr")); + boost::filesystem::path dir; + boost::filesystem::path name; + boost::filesystem::path ext; + + BOOST_CHECK(rdo::File::splitpath(file, dir, name, ext)); + BOOST_CHECK(dir == rdo::locale::convertToWStr("C:\\")); + BOOST_CHECK(name == rdo::locale::convertToWStr("проект")); + BOOST_CHECK(ext == rdo::locale::convertToWStr(".smr")); } #endif // #endif BOOST_AUTO_TEST_CASE(RDOCommon_GetTempFile) { - std::set nameSet; - for (int i = 0; i < 15; ++i) - { - boost::filesystem::path fileName = rdo::File::getTempFileName(); - rdo::File::unlink(fileName); - BOOST_CHECK(nameSet.find(fileName) == nameSet.end()); - nameSet.insert(fileName); - } + std::set nameSet; + for (int i = 0; i < 15; ++i) + { + boost::filesystem::path fileName = rdo::File::getTempFileName(); + rdo::File::unlink(fileName); + BOOST_CHECK(nameSet.find(fileName) == nameSet.end()); + nameSet.insert(fileName); + } } BOOST_AUTO_TEST_CASE(RDOCommon_Time) { - rdo::Time timeValue = rdo::Time::local(); - BOOST_CHECK(timeValue > s_createTestLocalTime); - std::cout << boost::str(boost::format("Today: %1%, is not it?") % timeValue.asString()) << std::endl; + rdo::Time timeValue = rdo::Time::local(); + BOOST_CHECK(timeValue > s_createTestLocalTime); + std::cout << boost::str(boost::format("Today: %1%, is not it?") % timeValue.asString()) << std::endl; } BOOST_AUTO_TEST_SUITE_END() // RDOCommon_Test diff --git a/utils/test/real_format/main.cpp b/utils/test/real_format/main.cpp index 2cb696b67..f73021bf1 100644 --- a/utils/test/real_format/main.cpp +++ b/utils/test/real_format/main.cpp @@ -13,29 +13,29 @@ BOOST_AUTO_TEST_SUITE(RDORealFormatTest) BOOST_AUTO_TEST_CASE(MantissaPrecisionSet) { -#if defined(COMPILER_VISUAL_STUDIO) or defined(COMPILER_MINGW) - _set_output_format(_TWO_DIGIT_EXPONENT); +#if defined(COMPILER_VISUAL_STUDIO) || defined(COMPILER_MINGW) + _set_output_format(_TWO_DIGIT_EXPONENT); #endif } BOOST_AUTO_TEST_CASE(MantissaPrecision2) { - double value = 10e+37; - std::stringstream stream; + double value = 10e+37; + std::stringstream stream; - stream << value; + stream << value; - BOOST_CHECK(stream.str() == "1e+38"); + BOOST_CHECK(stream.str() == "1e+38"); } BOOST_AUTO_TEST_CASE(MantissaPrecision3) { - double value = 10e+237; - std::stringstream stream; + double value = 10e+237; + std::stringstream stream; - stream << value; + stream << value; - BOOST_CHECK(stream.str() == "1e+238"); + BOOST_CHECK(stream.str() == "1e+238"); } BOOST_AUTO_TEST_SUITE_END() // RDORealFormatTest diff --git a/utils/test/smart_ptr/main.cpp b/utils/test/smart_ptr/main.cpp index 72d777bd7..da3ab1a92 100644 --- a/utils/test/smart_ptr/main.cpp +++ b/utils/test/smart_ptr/main.cpp @@ -20,8 +20,8 @@ Log* g_pLog = NULL; class Log: public std::list { public: - Log() { g_pLog = this; } - ~Log() { g_pLog = NULL; } + Log() { g_pLog = this; } + ~Log() { g_pLog = NULL; } }; const int MULTIPLEXER = 100; @@ -33,50 +33,52 @@ class MyClass: public rdo::counter_reference { DECLARE_FACTORY(MyClass) public: - int m_a; + int m_a; - enum { DAFAUL_VALUE = 1 }; + static const int DEFAULT_VALUE = 1; protected: - MyClass(): m_a(DAFAUL_VALUE) { g_pLog->push_back( m_a); } - ~MyClass() { g_pLog->push_back(-m_a); } + MyClass(): m_a(DEFAULT_VALUE) { g_pLog->push_back( m_a); } + ~MyClass() { g_pLog->push_back(-m_a); } }; PREDECLARE_OBJECT_INTERFACE(IMyClass21) struct IMyClass21: public rdo::RefCounter { - enum { DAFAUL_VALUE = 21 }; + static const int DEFAULT_VALUE; - virtual void ifun21() = 0; + virtual void ifun21() = 0; - IMyClass21() { g_pLog->push_back( DAFAUL_VALUE); } - virtual ~IMyClass21() { g_pLog->push_back(-DAFAUL_VALUE); } + IMyClass21() { g_pLog->push_back( IMyClass21::DEFAULT_VALUE); } + virtual ~IMyClass21() { g_pLog->push_back(-IMyClass21::DEFAULT_VALUE); } }; +const int IMyClass21::DEFAULT_VALUE = 21; + #define DECLARE_IMyClass21 \ public: \ - void ifun21(); + void ifun21(); class MyClass2 - : public IMyClass21 - , public MyClass + : public IMyClass21 + , public MyClass { DECLARE_FACTORY(MyClass2) public: - int m_b; + int m_b; - enum { DAFAUL_VALUE = 2 }; + static const int DEFAULT_VALUE = 2; - bool operator==(const MyClass2& obj) const - { - return m_b == obj.m_b; - } + bool operator==(const MyClass2& obj) const + { + return m_b == obj.m_b; + } protected: - MyClass2(): m_b(DAFAUL_VALUE) { g_pLog->push_back( m_b); } - ~MyClass2() { g_pLog->push_back(-m_b); } + MyClass2(): m_b(DEFAULT_VALUE) { g_pLog->push_back( m_b); } + ~MyClass2() { g_pLog->push_back(-m_b); } - DECLARE_IMyClass21; + DECLARE_IMyClass21; }; DECLARE_POINTER(MyClass2) @@ -87,30 +89,30 @@ PREDECLARE_POINTER(MyClass3); class MyClass3: public rdo::counter_reference { public: - int m_c; + int m_c; - enum { DAFAUL_VALUE = 3 }; + static const int DEFAULT_VALUE = 3; - MyClass3(): m_c(DAFAUL_VALUE) { g_pLog->push_back( m_c); } - ~MyClass3() { g_pLog->push_back(-m_c); } + MyClass3(): m_c(DEFAULT_VALUE) { g_pLog->push_back( m_c); } + ~MyClass3() { g_pLog->push_back(-m_c); } - LPMyClass3 returnThis() - { - return this; - } + LPMyClass3 returnThis() + { + return this; + } }; class MyClass4: public MyClass2 { DECLARE_FACTORY(MyClass4) public: - int m_d; + int m_d; - enum { DAFAUL_VALUE = 4 }; + static const int DEFAULT_VALUE = 4; private: - MyClass4(): m_d(DAFAUL_VALUE) { g_pLog->push_back( m_d); } - ~MyClass4() { g_pLog->push_back(-m_d); } + MyClass4(): m_d(DEFAULT_VALUE) { g_pLog->push_back( m_d); } + ~MyClass4() { g_pLog->push_back(-m_d); } }; DECLARE_POINTER(MyClass4) @@ -118,239 +120,239 @@ BOOST_AUTO_TEST_SUITE(RDOSmartPrtTest) BOOST_AUTO_TEST_CASE(DefaultConstructor) { - Log log; - { - LPMyClass pMyClass = rdo::Factory::create(); - BOOST_CHECK(pMyClass); - BOOST_CHECK(pMyClass->m_a == MyClass::DAFAUL_VALUE); - - pMyClass->m_a = 3; - BOOST_CHECK(pMyClass->m_a == 3); - pMyClass->m_a = MyClass::DAFAUL_VALUE; - } - BOOST_CHECK(log.size() == 2); - auto it = log.begin(); - BOOST_CHECK(*it == MyClass::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -MyClass::DAFAUL_VALUE); + Log log; + { + LPMyClass pMyClass = rdo::Factory::create(); + BOOST_CHECK(pMyClass); + BOOST_CHECK(pMyClass->m_a == MyClass::DEFAULT_VALUE); + + pMyClass->m_a = 3; + BOOST_CHECK(pMyClass->m_a == 3); + pMyClass->m_a = MyClass::DEFAULT_VALUE; + } + BOOST_CHECK(log.size() == 2); + auto it = log.begin(); + BOOST_CHECK(*it == MyClass::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -MyClass::DEFAULT_VALUE); } BOOST_AUTO_TEST_CASE(CastSmartPtrToBool) { - Log log; - { - LPMyClass pMyClass2 = rdo::Factory::create(); - BOOST_CHECK((bool)pMyClass2); - } - BOOST_CHECK(log.size() == 2); - auto it = log.begin(); - BOOST_CHECK(*it == MyClass::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -MyClass::DAFAUL_VALUE); + Log log; + { + LPMyClass pMyClass2 = rdo::Factory::create(); + BOOST_CHECK((bool)pMyClass2); + } + BOOST_CHECK(log.size() == 2); + auto it = log.begin(); + BOOST_CHECK(*it == MyClass::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -MyClass::DEFAULT_VALUE); } BOOST_AUTO_TEST_CASE(OperatorPtrEqual) { - Log log; - { - LPMyClass pMyClass1; - BOOST_CHECK(!pMyClass1); - - LPMyClass pMyClass2 = rdo::Factory::create(); - BOOST_CHECK(pMyClass2); - - pMyClass1 = pMyClass2; - BOOST_CHECK(pMyClass1 == pMyClass2 ); - BOOST_CHECK(pMyClass1->m_a == pMyClass2->m_a); - - pMyClass2 = NULL; - BOOST_CHECK(!pMyClass2); - BOOST_CHECK(pMyClass1); - - LPMyClass pMyClass3 = rdo::Factory::create(); - BOOST_CHECK(pMyClass3); - pMyClass3->m_a *= MULTIPLEXER; - - pMyClass1 = pMyClass3; - BOOST_CHECK(pMyClass1 == pMyClass3 ); - BOOST_CHECK(pMyClass1->m_a == pMyClass3->m_a); - } - BOOST_CHECK(log.size() == 4); - auto it = log.begin(); - BOOST_CHECK(*it == MyClass::DAFAUL_VALUE ); - BOOST_CHECK(*(++it) == MyClass::DAFAUL_VALUE ); - BOOST_CHECK(*(++it) == -MyClass::DAFAUL_VALUE ); - BOOST_CHECK(*(++it) == -MyClass::DAFAUL_VALUE * MULTIPLEXER); + Log log; + { + LPMyClass pMyClass1; + BOOST_CHECK(!pMyClass1); + + LPMyClass pMyClass2 = rdo::Factory::create(); + BOOST_CHECK(pMyClass2); + + pMyClass1 = pMyClass2; + BOOST_CHECK(pMyClass1 == pMyClass2 ); + BOOST_CHECK(pMyClass1->m_a == pMyClass2->m_a); + + pMyClass2 = NULL; + BOOST_CHECK(!pMyClass2); + BOOST_CHECK(pMyClass1); + + LPMyClass pMyClass3 = rdo::Factory::create(); + BOOST_CHECK(pMyClass3); + pMyClass3->m_a *= MULTIPLEXER; + + pMyClass1 = pMyClass3; + BOOST_CHECK(pMyClass1 == pMyClass3 ); + BOOST_CHECK(pMyClass1->m_a == pMyClass3->m_a); + } + BOOST_CHECK(log.size() == 4); + auto it = log.begin(); + BOOST_CHECK(*it == MyClass::DEFAULT_VALUE ); + BOOST_CHECK(*(++it) == MyClass::DEFAULT_VALUE ); + BOOST_CHECK(*(++it) == -MyClass::DEFAULT_VALUE ); + BOOST_CHECK(*(++it) == -MyClass::DEFAULT_VALUE * MULTIPLEXER); } BOOST_AUTO_TEST_CASE(CreateSmartPtrByThis) { - Log log; - { - MyClass3* pMyClass3Raw = new MyClass3(); - BOOST_CHECK(pMyClass3Raw); - - LPMyClass3 pMyClass3_1(pMyClass3Raw); - BOOST_CHECK(pMyClass3_1); - - LPMyClass3 pMyClass3_2 = pMyClass3_1->returnThis(); - BOOST_CHECK(pMyClass3_2); - } - BOOST_CHECK(log.size() == 2); - auto it = log.begin(); - BOOST_CHECK(*it == MyClass3::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -MyClass3::DAFAUL_VALUE); + Log log; + { + MyClass3* pMyClass3Raw = new MyClass3(); + BOOST_CHECK(pMyClass3Raw); + + LPMyClass3 pMyClass3_1(pMyClass3Raw); + BOOST_CHECK(pMyClass3_1); + + LPMyClass3 pMyClass3_2 = pMyClass3_1->returnThis(); + BOOST_CHECK(pMyClass3_2); + } + BOOST_CHECK(log.size() == 2); + auto it = log.begin(); + BOOST_CHECK(*it == MyClass3::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -MyClass3::DEFAULT_VALUE); } BOOST_AUTO_TEST_CASE(StaticCast) { - Log log; - { - LPMyClass2 pMyClass2 = rdo::Factory::create(); - BOOST_CHECK(pMyClass2); - pMyClass2->m_a *= MULTIPLEXER; - pMyClass2->m_b *= MULTIPLEXER; - - LPMyClass pMyClass = pMyClass2.object_static_cast(); - BOOST_CHECK(pMyClass->m_a == MyClass::DAFAUL_VALUE * MULTIPLEXER); - - ++pMyClass->m_a; - BOOST_CHECK(pMyClass->m_a == MyClass::DAFAUL_VALUE * MULTIPLEXER + 1); - BOOST_CHECK(pMyClass->m_a == pMyClass2->m_a); - } - BOOST_CHECK(log.size() == 6); - auto it = log.begin(); - BOOST_CHECK(*it == IMyClass21 ::DAFAUL_VALUE ); - BOOST_CHECK(*(++it) == MyClass ::DAFAUL_VALUE ); - BOOST_CHECK(*(++it) == MyClass2 ::DAFAUL_VALUE ); - BOOST_CHECK(*(++it) == -(MyClass2 ::DAFAUL_VALUE * MULTIPLEXER )); - BOOST_CHECK(*(++it) == -(MyClass ::DAFAUL_VALUE * MULTIPLEXER + 1)); - BOOST_CHECK(*(++it) == -(IMyClass21::DAFAUL_VALUE )); + Log log; + { + LPMyClass2 pMyClass2 = rdo::Factory::create(); + BOOST_CHECK(pMyClass2); + pMyClass2->m_a *= MULTIPLEXER; + pMyClass2->m_b *= MULTIPLEXER; + + LPMyClass pMyClass = pMyClass2.object_static_cast(); + BOOST_CHECK(pMyClass->m_a == MyClass::DEFAULT_VALUE * MULTIPLEXER); + + ++pMyClass->m_a; + BOOST_CHECK(pMyClass->m_a == MyClass::DEFAULT_VALUE * MULTIPLEXER + 1); + BOOST_CHECK(pMyClass->m_a == pMyClass2->m_a); + } + BOOST_CHECK(log.size() == 6); + auto it = log.begin(); + BOOST_CHECK(*it == IMyClass21 ::DEFAULT_VALUE ); + BOOST_CHECK(*(++it) == MyClass ::DEFAULT_VALUE ); + BOOST_CHECK(*(++it) == MyClass2 ::DEFAULT_VALUE ); + BOOST_CHECK(*(++it) == -(MyClass2 ::DEFAULT_VALUE * MULTIPLEXER )); + BOOST_CHECK(*(++it) == -(MyClass ::DEFAULT_VALUE * MULTIPLEXER + 1)); + BOOST_CHECK(*(++it) == -(IMyClass21::DEFAULT_VALUE )); } BOOST_AUTO_TEST_CASE(InterfaceCast) { - Log log; - { - LPMyClass2 pMyClass2 = rdo::Factory::create(); - BOOST_CHECK(pMyClass2); - - LPIMyClass21 pMyClass21 = pMyClass2.interface_cast(); - BOOST_CHECK(pMyClass21); - BOOST_CHECK(pMyClass2 == pMyClass21); - - pMyClass2 = NULL; - BOOST_CHECK(!pMyClass2); - BOOST_CHECK(pMyClass21); - - log.push_back(CHECK1); - pMyClass21 = LPIMyClass21(); - BOOST_CHECK(!pMyClass21); - log.push_back(CHECK2); - } - BOOST_CHECK(log.size() == 8); - auto it = log.begin(); - BOOST_CHECK(*it == IMyClass21::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == MyClass ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == MyClass2 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == CHECK1 ); - BOOST_CHECK(*(++it) == -MyClass2 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -MyClass ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -IMyClass21::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == CHECK2 ); + Log log; + { + LPMyClass2 pMyClass2 = rdo::Factory::create(); + BOOST_CHECK(pMyClass2); + + LPIMyClass21 pMyClass21 = pMyClass2.interface_cast(); + BOOST_CHECK(pMyClass21); + BOOST_CHECK(pMyClass2 == pMyClass21); + + pMyClass2 = NULL; + BOOST_CHECK(!pMyClass2); + BOOST_CHECK(pMyClass21); + + log.push_back(CHECK1); + pMyClass21 = LPIMyClass21(); + BOOST_CHECK(!pMyClass21); + log.push_back(CHECK2); + } + BOOST_CHECK(log.size() == 8); + auto it = log.begin(); + BOOST_CHECK(*it == IMyClass21::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == MyClass ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == MyClass2 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == CHECK1 ); + BOOST_CHECK(*(++it) == -MyClass2 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -MyClass ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -IMyClass21::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == CHECK2 ); } BOOST_AUTO_TEST_CASE(InterfaceCastThroughChild) { - Log log; - { - LPMyClass4 pMyClass4 = rdo::Factory::create(); - BOOST_CHECK(pMyClass4); - - LPIMyClass21 pMyClass21 = pMyClass4.interface_cast(); - BOOST_CHECK(pMyClass4 == pMyClass21); - pMyClass4 = NULL; - BOOST_CHECK(!pMyClass4); - BOOST_CHECK(pMyClass21); - - log.push_back(CHECK1); - pMyClass21 = LPIMyClass21(); - BOOST_CHECK(!pMyClass21); - log.push_back(CHECK2); - } - BOOST_CHECK(log.size() == 10); - auto it = log.begin(); - BOOST_CHECK(*it == IMyClass21::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == MyClass ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == MyClass2 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == MyClass4 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == CHECK1 ); - BOOST_CHECK(*(++it) == -MyClass4 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -MyClass2 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -MyClass ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -IMyClass21::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == CHECK2 ); + Log log; + { + LPMyClass4 pMyClass4 = rdo::Factory::create(); + BOOST_CHECK(pMyClass4); + + LPIMyClass21 pMyClass21 = pMyClass4.interface_cast(); + BOOST_CHECK(pMyClass4 == pMyClass21); + pMyClass4 = NULL; + BOOST_CHECK(!pMyClass4); + BOOST_CHECK(pMyClass21); + + log.push_back(CHECK1); + pMyClass21 = LPIMyClass21(); + BOOST_CHECK(!pMyClass21); + log.push_back(CHECK2); + } + BOOST_CHECK(log.size() == 10); + auto it = log.begin(); + BOOST_CHECK(*it == IMyClass21::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == MyClass ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == MyClass2 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == MyClass4 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == CHECK1 ); + BOOST_CHECK(*(++it) == -MyClass4 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -MyClass2 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -MyClass ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -IMyClass21::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == CHECK2 ); } BOOST_AUTO_TEST_CASE(CompareSmartPtr) { - Log log; - { - LPMyClass2 pMyClass1 = rdo::Factory::create(); - BOOST_CHECK(pMyClass1); - - LPMyClass pMyClass2 = pMyClass1.object_static_cast(); - BOOST_CHECK(pMyClass2); - - BOOST_CHECK(pMyClass1 == pMyClass2); - BOOST_CHECK(!(pMyClass1 != pMyClass2)); - - LPMyClass3 pMyClass3 = rdo::Factory::create(); - BOOST_CHECK(pMyClass3); - - BOOST_CHECK(pMyClass1 != pMyClass3); - BOOST_CHECK(!(pMyClass1 == pMyClass3)); - } - BOOST_CHECK(log.size() == 8); - auto it = log.begin(); - BOOST_CHECK(*it == IMyClass21::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == MyClass ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == MyClass2 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == MyClass3 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -MyClass3 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -MyClass2 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -MyClass ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -IMyClass21::DAFAUL_VALUE); + Log log; + { + LPMyClass2 pMyClass1 = rdo::Factory::create(); + BOOST_CHECK(pMyClass1); + + LPMyClass pMyClass2 = pMyClass1.object_static_cast(); + BOOST_CHECK(pMyClass2); + + BOOST_CHECK(pMyClass1 == pMyClass2); + BOOST_CHECK(!(pMyClass1 != pMyClass2)); + + LPMyClass3 pMyClass3 = rdo::Factory::create(); + BOOST_CHECK(pMyClass3); + + BOOST_CHECK(pMyClass1 != pMyClass3); + BOOST_CHECK(!(pMyClass1 == pMyClass3)); + } + BOOST_CHECK(log.size() == 8); + auto it = log.begin(); + BOOST_CHECK(*it == IMyClass21::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == MyClass ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == MyClass2 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == MyClass3 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -MyClass3 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -MyClass2 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -MyClass ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -IMyClass21::DEFAULT_VALUE); } BOOST_AUTO_TEST_CASE(CompareSmartPtrByValue) { - Log log; - { - LPMyClass2 pMyClass21 = rdo::Factory::create(); - BOOST_CHECK(pMyClass21); - - LPMyClass2 pMyClass22 = rdo::Factory::create(); - BOOST_CHECK(pMyClass22); - - BOOST_CHECK(pMyClass21.compare(pMyClass22)); - - ++pMyClass22->m_b; - BOOST_CHECK(!pMyClass21.compare(pMyClass22)); - --pMyClass22->m_b; - } - BOOST_CHECK(log.size() == 12); - auto it = log.begin(); - BOOST_CHECK(*it == IMyClass21::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == MyClass ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == MyClass2 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == IMyClass21::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == MyClass ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == MyClass2 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -MyClass2 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -MyClass ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -IMyClass21::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -MyClass2 ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -MyClass ::DAFAUL_VALUE); - BOOST_CHECK(*(++it) == -IMyClass21::DAFAUL_VALUE); + Log log; + { + LPMyClass2 pMyClass21 = rdo::Factory::create(); + BOOST_CHECK(pMyClass21); + + LPMyClass2 pMyClass22 = rdo::Factory::create(); + BOOST_CHECK(pMyClass22); + + BOOST_CHECK(pMyClass21.compare(pMyClass22)); + + ++pMyClass22->m_b; + BOOST_CHECK(!pMyClass21.compare(pMyClass22)); + --pMyClass22->m_b; + } + BOOST_CHECK(log.size() == 12); + auto it = log.begin(); + BOOST_CHECK(*it == IMyClass21::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == MyClass ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == MyClass2 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == IMyClass21::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == MyClass ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == MyClass2 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -MyClass2 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -MyClass ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -IMyClass21::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -MyClass2 ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -MyClass ::DEFAULT_VALUE); + BOOST_CHECK(*(++it) == -IMyClass21::DEFAULT_VALUE); } BOOST_AUTO_TEST_SUITE_END() // RDOSmartPrtTest