|
From: <ba...@us...> - 2009-01-31 23:08:43
|
Revision: 181
http://scstudio.svn.sourceforge.net/scstudio/?rev=181&view=rev
Author: babicaj
Date: 2009-01-31 23:08:34 +0000 (Sat, 31 Jan 2009)
Log Message:
-----------
RaceChecker,FifoChecker and duplicators refactored. RaceChecker was missing BMscChecker ancestor.
Modified Paths:
--------------
trunk/src/check/order/fifo_checker.cpp
trunk/src/check/pseudocode/msc_duplicators.cpp
trunk/src/check/pseudocode/msc_duplicators.h
trunk/src/check/race/footprint.cpp
trunk/src/check/race/footprint.h
trunk/src/check/race/race_checker.cpp
trunk/src/check/race/race_checker.h
trunk/src/data/msc.h
trunk/tests/race_checker_test.cpp
Modified: trunk/src/check/order/fifo_checker.cpp
===================================================================
--- trunk/src/check/order/fifo_checker.cpp 2009-01-31 17:35:56 UTC (rev 180)
+++ trunk/src/check/order/fifo_checker.cpp 2009-01-31 23:08:34 UTC (rev 181)
@@ -32,16 +32,8 @@
{
//event is surely complete
Event* copy = duplicator.get_event_copy(events[i]);
- copy->set_marked(true);
copy->get_complete_message()->set_marked(true);
- if(copy->is_send())
- {
- copy->get_complete_message()->get_receive_event()->set_marked(true);
- }
- else
- {
- copy->get_complete_message()->get_send_event()->set_marked(true);
- }
+ copy->get_complete_message()->get_receive_event()->set_marked(true);
}
return new_bmsc;
}
Modified: trunk/src/check/pseudocode/msc_duplicators.cpp
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.cpp 2009-01-31 17:35:56 UTC (rev 180)
+++ trunk/src/check/pseudocode/msc_duplicators.cpp 2009-01-31 23:08:34 UTC (rev 181)
@@ -30,15 +30,21 @@
{
}
-Duplicator::~Duplicator()
+void Duplicator::cleanup_attributes()
{
MscElementPList::const_iterator i;
for(i=m_modified_elements.begin();i!=m_modified_elements.end();i++)
{
(*i)->remove_attribute<MscElement*>(DUPLICATOR_COPY_ATTR);
}
+ m_modified_elements.clear();
}
+Duplicator::~Duplicator()
+{
+ cleanup_attributes();
+}
+
MscElement*& Duplicator::get_copy(MscElement* e)
{
bool just_set;
@@ -225,8 +231,8 @@
////////////////////////////////////////////////////////////////////////
-GraphCreatorListener::GraphCreatorListener(HMsc* hmsc):
-m_hmsc(hmsc)
+GraphCreatorListener::GraphCreatorListener(BMscGraphDuplicator* duplicator,HMsc* hmsc):
+m_duplicator(duplicator),m_hmsc(hmsc)
{
}
@@ -290,7 +296,7 @@
StartNode *new_node = new StartNode(n);
m_hmsc->set_start(new_node);
m_new_nodes.push_back(new_node);
- set_copy(n,new_node);
+ m_duplicator->set_copy(n,new_node);
}
}
@@ -338,7 +344,7 @@
m_hmsc->add_node(new_node);
add_new_successor(new_node.get());
m_new_nodes.push_back(new_node.get());
- set_copy(old_node,new_node.get());
+ m_duplicator->set_copy(old_node,new_node.get());
}
bool GraphCreatorListener::is_root_element(HMscNode* n)
@@ -346,31 +352,19 @@
return n->get_owner()==m_hmsc->get_original();
}
-void GraphCreatorListener::set_copy(HMscNode* n, HMscNode* copy)
+PredecessorNode* GraphCreatorListener::get_predecessor()
{
- HMscNode*& attribute = get_copy(n);
- attribute = copy;
+ return dynamic_cast<PredecessorNode*>(m_new_nodes.back());
}
-HMscNode*& GraphCreatorListener::get_copy(HMscNode* n)
+HMscNode* GraphCreatorListener::get_node_copy(HMscNode* n)
{
- bool just_set;
- HMscNode*& copy = n->get_attribute<HMscNode*>(BMSC_DUPLICATOR_COPY_ATTR,NULL,just_set);
- if(just_set)
- {
- m_modified_elements.push_back(n);
- }
- return copy;
+ return dynamic_cast<HMscNode*>(m_duplicator->get_copy(n));
}
-PredecessorNode* GraphCreatorListener::get_predecessor()
-{
- return dynamic_cast<PredecessorNode*>(m_new_nodes.back());
-}
-
void GraphCreatorListener::process_nonwhite_node(HMscNode* n)
{
- HMscNode* copy = get_copy(n);
+ HMscNode* copy = get_node_copy(n);
add_new_successor(copy);
}
@@ -478,12 +472,6 @@
GraphCreatorListener::~GraphCreatorListener()
{
- while(!m_modified_elements.empty())
- {
- MscElement* e = m_modified_elements.back();
- e->remove_attribute<HMscNode*>(BMSC_DUPLICATOR_COPY_ATTR);
- m_modified_elements.pop_back();
- }
while(!m_modified_hmscs.empty())
{
HMsc* h = m_modified_hmscs.back();
@@ -492,13 +480,13 @@
}
}
-HMscPtr BMscGraphDuplicator::duplicate(HMscPtr& hmsc)
+HMscPtr BMscGraphDuplicator::duplicate_hmsc(HMscPtr& hmsc)
{
HMscPtr new_hmsc;
if(hmsc.get())
{
new_hmsc = new HMsc(hmsc.get());
- GraphCreatorListener listener(new_hmsc.get());
+ GraphCreatorListener listener(this,new_hmsc.get());
DFSBMscGraphTraverser traverser;
traverser.add_black_node_found_listener(&listener);
traverser.add_gray_node_found_listener(&listener);
@@ -509,6 +497,16 @@
return new_hmsc;
}
+HMscPtr BMscGraphDuplicator::duplicate(HMscPtr& hmsc)
+{
+ BMscGraphDuplicator duplicator;
+ return duplicator.duplicate_hmsc(hmsc);
+}
+
+BMscGraphDuplicator::~BMscGraphDuplicator()
+{
+}
+
HMscPtr HMscPathDuplicator::duplicate_path(const MscElementPListList& path)
{
HMscPtr root;
@@ -557,6 +555,7 @@
if(ref_node)
{
ReferenceNode* new_ref = new ReferenceNode(ref_node);
+ new_ref->set_msc(ref_node->get_msc());
new_hmsc->add_node(new_ref);
new_rel = new_ref->add_predecessor(new_pred);
new_pred = new_ref;
Modified: trunk/src/check/pseudocode/msc_duplicators.h
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.h 2009-01-31 17:35:56 UTC (rev 180)
+++ trunk/src/check/pseudocode/msc_duplicators.h 2009-01-31 23:08:34 UTC (rev 181)
@@ -41,6 +41,8 @@
MscElement*& get_copy(MscElement* e);
void set_copy(MscElement* original, MscElement* copy);
+
+ void cleanup_attributes();
};
class BMscDuplicator;
@@ -116,14 +118,32 @@
Event* get_event_copy(Event* e);
};
-///////////////////////////////////////////////////////////
+class BMscGraphDuplicator;
-class GraphCreatorListener: public WhiteNodeFoundListener,public GrayNodeFoundListener,
+/**
+ * \brief Duplicates HMsc like it would be BMsc graph.
+ *
+ * Result of this duplicator is flattened version of HMsc (BMsc graph)
+ * without unreachable HMscNodes and nodes which
+ * man isn't able to get to EndNode from.
+ *
+ * All ReferenceNodes reference only BMsc, moreover each BMsc is
+ * referenced only one time -- each BMsc is duplicated too. Kept elements
+ * references to its original element via attribute m_original.
+ *
+ * Original ReferenceNodes which references HMsc are transformed into
+ * ConnectionNodes referencing the ReferenceNode by m_original. StartNodes
+ * which don't occure in HMsc to be duplicated are removed. EndNodes
+ * of the same kind are transformed into ConnectionNodes referencing original
+ * EndNodes.
+ */
+class SCPSEUDOCODE_EXPORT GraphCreatorListener:public WhiteNodeFoundListener,public GrayNodeFoundListener,
public BlackNodeFoundListener,public NodeFinishedListener
{
protected:
- MscElementPList m_modified_elements;
+ BMscGraphDuplicator* m_duplicator;
+
HMscPList m_modified_hmscs;
MscElementPList m_new_nodes;
@@ -132,10 +152,6 @@
bool is_root_element(HMscNode* n);
- HMscNode*& get_copy(HMscNode* n);
-
- void set_copy(HMscNode* n, HMscNode* copy);
-
void process_new_node(HMscNode* old_node, HMscNodePtr& new_node);
void process_nonwhite_node(HMscNode* n);
@@ -150,9 +166,11 @@
void add_new_successor(HMscNode* new_successor);
+ HMscNode* get_node_copy(HMscNode* n);
+
public:
- GraphCreatorListener(HMsc* hmsc);
+ GraphCreatorListener(BMscGraphDuplicator* duplicator, HMsc* hmsc);
~GraphCreatorListener();
@@ -171,7 +189,6 @@
void on_node_finished(StartNode* n);
void on_node_finished(EndNode* n);
void on_node_finished(ConnectionNode* n);
-
};
/**
@@ -191,13 +208,17 @@
* of the same kind are transformed into ConnectionNodes referencing original
* EndNodes.
*/
-class SCPSEUDOCODE_EXPORT BMscGraphDuplicator
+class SCPSEUDOCODE_EXPORT BMscGraphDuplicator:public Duplicator
{
public:
+ HMscPtr duplicate_hmsc(HMscPtr& hmsc);
+
static HMscPtr duplicate(HMscPtr& hmsc);
+ ~BMscGraphDuplicator();
+
};
/**
Modified: trunk/src/check/race/footprint.cpp
===================================================================
--- trunk/src/check/race/footprint.cpp 2009-01-31 17:35:56 UTC (rev 180)
+++ trunk/src/check/race/footprint.cpp 2009-01-31 23:08:34 UTC (rev 181)
@@ -205,4 +205,14 @@
return dynamic_cast<HMscNode*>(m_path.back());
}
+const MscElementPList& Footprint::get_path() const
+{
+ return m_path;
+}
+
+FootprintPtr Footprint::get_previous()
+{
+ return m_previous;
+}
+
// $Id$
Modified: trunk/src/check/race/footprint.h
===================================================================
--- trunk/src/check/race/footprint.h 2009-01-31 17:35:56 UTC (rev 180)
+++ trunk/src/check/race/footprint.h 2009-01-31 23:08:34 UTC (rev 181)
@@ -201,6 +201,10 @@
const ExtremeEvents& max_events_greater);
HMscNode* get_node();
+
+ const MscElementPList& get_path() const;
+
+ FootprintPtr get_previous();
};
#endif /* _FOOTPRINT_H */
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2009-01-31 17:35:56 UTC (rev 180)
+++ trunk/src/check/race/race_checker.cpp 2009-01-31 23:08:34 UTC (rev 181)
@@ -20,7 +20,6 @@
#include "check/race/race_checker.h"
-#include "check/pseudocode/msc_duplicators.h"
BMscRaceCheckingListener::BMscRaceCheckingListener(RaceChecker* checker, ChannelMapperPtr mapper)
{
@@ -35,7 +34,7 @@
{
BMscPtr example = m_checker->check_bmsc(b,m_mapper);
if(example.get())
- throw RaceInBMscException(b);
+ throw RaceInBMscException(example);
//precompute MinP for b
}
}
@@ -233,8 +232,8 @@
BMscDuplicator duplicator;
BMscPtr original = e1->get_instance()->get_bmsc();
BMscPtr copy = duplicator.duplicate_bmsc(original);
- duplicator.get_copy(e1)->set_marked();
- duplicator.get_copy(e2)->set_marked();
+ duplicator.get_event_copy(e1)->get_complete_message()->get_receive_event()->set_marked();
+ duplicator.get_event_copy(e2)->get_complete_message()->get_receive_event()->set_marked();
duplicator.get_copy(e1->get_message().get())->set_marked();
duplicator.get_copy(e2->get_message().get())->set_marked();
return copy;
@@ -291,6 +290,7 @@
m_instance_marker.cleanup_attributes();
m_min_events_initiator.cleanup_attributes();
m_max_events_initiator.cleanup_attributes();
+ m_graph_duplicator.cleanup_attributes();
}
void RaceChecker::prepare_hmsc(HMscPtr hmsc,ChannelMapperPtr mapper)
@@ -311,7 +311,7 @@
HMscPtr RaceChecker::check(HMscPtr hmsc, ChannelMapperPtr mapper)
{
//transform hmsc into BMsc graph
- HMscPtr transformed = BMscGraphDuplicator::duplicate(hmsc);
+ HMscPtr transformed = m_graph_duplicator.duplicate_hmsc(hmsc);
//compute causal closure of all BMsc and check BMscs to be race free
HMscPtr res = check_bmscs(transformed,mapper);
if(res.get())
@@ -366,8 +366,9 @@
HMscPtr RaceChecker::create_counter_example(const MscElementPListList& path, BMscPtr example)
{
HMscPathDuplicator duplicator;
+ //result contains path in already duplicated HMsc
HMscPtr result = duplicator.duplicate_path(path);
- //set propper msc to last element
+ //set proper msc to last element
ReferenceNode* last_copy = dynamic_cast<ReferenceNode*>(
duplicator.get_copy(path.back().back()));
last_copy->set_msc(example);
@@ -376,13 +377,40 @@
for(h=path.begin();h!=path.end();h++)
{
duplicator.get_copy(h->back())->set_marked(true);
+ //set proper original
+ MscElementPList::const_iterator e;
+ for(e=h->begin();e!=h->end();e++)
+ {
+ MscElement* elem = m_graph_duplicator.get_copy(*e);
+ elem->set_general_original((*e)->get_general_original());
+ }
}
return result;
}
HMscPtr RaceChecker::create_counter_example(RaceInHMscException& e)
{
- //TODO: create counter example
+ //build run in BMsc graph
+ FootprintPtr f = e.get_footprint();
+ MscElementPList path;
+ do
+ {
+ path.insert(path.begin(),f->get_path().begin(),f->get_path().end());
+ f = f->get_previous();
+ }
+ while(f);
+ //make structured path from simple path
+ MscElementPList::const_iterator elem;
+ MscElementPListList structured;
+ for(elem=path.begin();elem!=path.end();elem++)
+ {
+ if(dynamic_cast<StartNode*>(*elem))
+ {
+ MscElementPList empty;
+ structured.push_back(empty);
+ }
+ structured.back().push_back(*elem);
+ }
return HMscPtr(new HMsc());
}
Modified: trunk/src/check/race/race_checker.h
===================================================================
--- trunk/src/check/race/race_checker.h 2009-01-31 17:35:56 UTC (rev 180)
+++ trunk/src/check/race/race_checker.h 2009-01-31 23:08:34 UTC (rev 181)
@@ -29,6 +29,7 @@
#include "check/pseudocode/refnode_finder.h"
#include "check/race/footprint.h"
#include "check/race/export.h"
+#include "check/pseudocode/msc_duplicators.h"
class BMscRaceCheckingListener;
class RaceInBMscException;
@@ -167,7 +168,7 @@
};
-class SCRACE_EXPORT RaceChecker: public Checker, public HMscChecker
+class SCRACE_EXPORT RaceChecker: public Checker, public BMscChecker, public HMscChecker
{
protected:
@@ -181,6 +182,8 @@
MinimalEventsInitiator m_min_events_initiator;
MaximalEventsInitiator m_max_events_initiator;
+
+ BMscGraphDuplicator m_graph_duplicator;
/**
* Checks HMsc to have only race free BMscs
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2009-01-31 17:35:56 UTC (rev 180)
+++ trunk/src/data/msc.h 2009-01-31 23:08:34 UTC (rev 181)
@@ -282,6 +282,19 @@
m_marked = marked;
}
+ /**
+ * \brief See MscElementTmpl for details about attribute original
+ */
+ virtual MscElement* get_general_original() const =0;
+
+ /**
+ * \brief See MscElementTmpl for details about attribute original
+ *
+ * Implementation of this method can throw bad cast exception
+ * in case original is not of appropriate type
+ */
+ virtual void set_general_original(MscElement* original)=0;
+
virtual ~MscElement()
{
@@ -343,6 +356,25 @@
}
public:
+
+ MscElement* get_general_original() const
+ {
+ return m_original.get();
+ }
+
+ void set_general_original(MscElement* original)
+ {
+ T* orig = dynamic_cast<T*>(original);
+ if(orig || !original)
+ {
+ set_original(orig);
+ }
+ else
+ {
+ throw std::bad_cast("Attribute m_original is not of desired type");
+ }
+ }
+
/**
* Getter for m_original.
*/
Modified: trunk/tests/race_checker_test.cpp
===================================================================
--- trunk/tests/race_checker_test.cpp 2009-01-31 17:35:56 UTC (rev 180)
+++ trunk/tests/race_checker_test.cpp 2009-01-31 23:08:34 UTC (rev 181)
@@ -302,12 +302,69 @@
return check(hmsc1,true,true);
}
+bool HMscF()
+{
+ std::cout << "HMscF:" << std::endl;
+
+ BMscPtr bmsc1(new BMsc("BMsc"));
+ InstancePtr instance1(new Instance("NAME"));
+ InstancePtr instance2(new Instance("NAME"));
+ InstancePtr instance3(new Instance("NAME"));
+ bmsc1->add_instance(instance1);
+ bmsc1->add_instance(instance2);
+ bmsc1->add_instance(instance3);
+
+ StrictOrderAreaPtr strict1(new StrictOrderArea());
+ instance1->add_area(strict1);
+
+ StrictOrderAreaPtr strict2(new StrictOrderArea());
+ instance2->add_area(strict2);
+
+ StrictOrderAreaPtr strict3(new StrictOrderArea());
+ instance3->add_area(strict3);
+
+ EventPtr e1 = strict1->add_event();
+ EventPtr e2 = strict2->add_event();
+ CompleteMessagePtr m = new CompleteMessage("NAME");
+ m->glue_events(e1,e2);
+
+ e1 = strict2->add_event();
+ e2 = strict3->add_event();
+ m = new CompleteMessage("NAME");
+ m->glue_events(e1,e2);
+
+ e1 = strict2->add_event();
+ e2 = strict1->add_event();
+ m = new CompleteMessage("NAME");
+ m->glue_events(e1,e2);
+
+ e1 = strict3->add_event();
+ e2 = strict1->add_event();
+ m = new CompleteMessage("NAME");
+ m->glue_events(e1,e2);
+
+ HMscPtr hmsc1(new HMsc("HMsc"));
+ StartNodePtr start1 = new StartNode();
+ hmsc1->set_start(start1);
+ ReferenceNodePtr r1(new ReferenceNode());
+ EndNodePtr end1(new EndNode());
+ hmsc1->add_node(r1);
+ hmsc1->add_node(end1);
+ start1->add_successor(r1.get());
+ r1->add_successor(end1.get());
+
+ r1->set_msc(bmsc1);
+
+ return check(hmsc1,false,false);
+}
+
int main(int argc, char** argv) {
- //RETURN_IF_FAILED(HMscA());
+ RETURN_IF_FAILED(HMscA());
RETURN_IF_FAILED(HMscB());
RETURN_IF_FAILED(HMscC());
RETURN_IF_FAILED(HMscD());
RETURN_IF_FAILED(HMscE());
+ RETURN_IF_FAILED(HMscF());
return 0;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2009-02-01 13:48:42
|
Revision: 183
http://scstudio.svn.sourceforge.net/scstudio/?rev=183&view=rev
Author: gotthardp
Date: 2009-02-01 13:48:38 +0000 (Sun, 01 Feb 2009)
Log Message:
-----------
Updated SVN ignore lists.
Added Paths:
-----------
trunk/src/view/visio/build-setup.bat
Property Changed:
----------------
trunk/
trunk/src/
trunk/src/check/
trunk/src/check/liveness/
trunk/src/check/order/
trunk/src/check/pseudocode/
trunk/src/check/race/
trunk/src/data/
trunk/src/data/Z120/
trunk/src/data/engmann/
trunk/src/view/visio/
trunk/tests/
Property changes on: trunk
___________________________________________________________________
Added: svn:ignore
+ CMakeFiles
CMakeCache.txt
cmake_install.cmake
CTestTestfile.cmake
DartConfiguration.tcl
Testing
*.ncb
*.sln
*.suo
*.dir
Makefile
*.vcproj
debug
release
Property changes on: trunk/src
___________________________________________________________________
Added: svn:ignore
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
Property changes on: trunk/src/check
___________________________________________________________________
Added: svn:ignore
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
Property changes on: trunk/src/check/liveness
___________________________________________________________________
Added: svn:ignore
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
Property changes on: trunk/src/check/order
___________________________________________________________________
Added: svn:ignore
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
Property changes on: trunk/src/check/pseudocode
___________________________________________________________________
Added: svn:ignore
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
Property changes on: trunk/src/check/race
___________________________________________________________________
Added: svn:ignore
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
Property changes on: trunk/src/data
___________________________________________________________________
Added: svn:ignore
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
Property changes on: trunk/src/data/Z120
___________________________________________________________________
Modified: svn:ignore
- .Z120.g.swo
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
.Z120.g.swo
Property changes on: trunk/src/data/engmann
___________________________________________________________________
Added: svn:ignore
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
Property changes on: trunk/src/view/visio
___________________________________________________________________
Modified: svn:ignore
- *.ncb
*.suo
+ *.ncb
*.suo
*.exe
Added: trunk/src/view/visio/build-setup.bat
===================================================================
--- trunk/src/view/visio/build-setup.bat (rev 0)
+++ trunk/src/view/visio/build-setup.bat 2009-02-01 13:48:38 UTC (rev 183)
@@ -0,0 +1 @@
+"C:\Program Files\NSIS\makensis" scstudio.nsi
Property changes on: trunk/src/view/visio/build-setup.bat
___________________________________________________________________
Added: svn:eol-style
+ native
Property changes on: trunk/tests
___________________________________________________________________
Added: svn:ignore
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ba...@us...> - 2009-03-12 19:41:27
|
Revision: 202
http://scstudio.svn.sourceforge.net/scstudio/?rev=202&view=rev
Author: babicaj
Date: 2009-03-12 19:41:00 +0000 (Thu, 12 Mar 2009)
Log Message:
-----------
Bug in HMsc race checking found
Modified Paths:
--------------
trunk/src/check/race/race_checker.cpp
trunk/tests/race_checker_test.cpp
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2009-03-12 19:15:42 UTC (rev 201)
+++ trunk/src/check/race/race_checker.cpp 2009-03-12 19:41:00 UTC (rev 202)
@@ -102,11 +102,16 @@
EventPList::const_iterator f;
for(f=minimal_events.begin();f!=minimal_events.end();f++)
{
- //if f is less than e then Instance of f must be inserted
- BoolVector& closure = m_caus_initiator->get_causal_closure(*f);
- if(closure[e_index])
- e_instances->set_dependent(
- m_instance_marker->get_instance_id((*f)->get_instance()));
+ //if f is less than e (not equal) then Instance of f must be inserted
+ if(e!=f)
+ {
+ BoolVector& closure = m_caus_initiator->get_causal_closure(*f);
+ if(closure[e_index])
+ {
+ size_t f_id = m_instance_marker->get_instance_id((*f)->get_instance());
+ e_instances->set_dependent(f_id);
+ }
+ }
}
extreme_events.add_extreme_event(
m_instance_marker->get_instance_id((*e)->get_instance()),e_instances);
@@ -503,7 +508,8 @@
}
if(j==a_instances.size())
{
- throw new RaceInHMscException(m_footprint,b_event,a_event,get_reached_elements().back());
+ //throw RaceInHMscException(m_footprint,b_event,a_event,get_reached_elements().back());
+ throw RaceInHMscException(f,b_event,a_event,get_reached_elements().back());
}
}
}
Modified: trunk/tests/race_checker_test.cpp
===================================================================
--- trunk/tests/race_checker_test.cpp 2009-03-12 19:15:42 UTC (rev 201)
+++ trunk/tests/race_checker_test.cpp 2009-03-12 19:41:00 UTC (rev 202)
@@ -358,6 +358,56 @@
return check(hmsc1,false,false);
}
+bool HMscG()
+{
+ std::cout << "HMscG:" << std::endl;
+ BMscPtr bmsc1(new BMsc("BMsc1"));
+ InstancePtr instance1_1(new Instance("1"));
+ InstancePtr instance1_2(new Instance("2"));
+ bmsc1->add_instance(instance1_1);
+ bmsc1->add_instance(instance1_2);
+ StrictOrderAreaPtr strict1_1(new StrictOrderArea());
+ StrictOrderAreaPtr strict1_2(new StrictOrderArea());
+ instance1_1->add_area(strict1_1);
+ instance1_2->add_area(strict1_2);
+ EventPtr e1 = strict1_1->add_event();
+ EventPtr e2 = strict1_2->add_event();
+ CompleteMessagePtr m1 = new CompleteMessage("a");
+ m1->glue_events(e1, e2);
+
+ BMscPtr bmsc2(new BMsc("BMsc2"));
+ InstancePtr instance2_1(new Instance("3"));
+ InstancePtr instance2_2(new Instance("1"));
+ bmsc2->add_instance(instance2_1);
+ bmsc2->add_instance(instance2_2);
+ StrictOrderAreaPtr strict2_1(new StrictOrderArea());
+ StrictOrderAreaPtr strict2_2(new StrictOrderArea());
+ instance2_1->add_area(strict2_1);
+ instance2_2->add_area(strict2_2);
+ EventPtr e3 = strict2_1->add_event();
+ EventPtr e4 = strict2_2->add_event();
+ CompleteMessagePtr m2 = new CompleteMessage("b");
+ m2->glue_events(e3, e4);
+
+ HMscPtr hmsc1(new HMsc("HMsc"));
+ StartNodePtr start1 = new StartNode();
+ hmsc1->set_start(start1);
+ ReferenceNodePtr r1(new ReferenceNode());
+ ReferenceNodePtr r2(new ReferenceNode());
+ EndNodePtr end1(new EndNode());
+ hmsc1->add_node(r1);
+ hmsc1->add_node(r2);
+ hmsc1->add_node(end1);
+ start1->add_successor(r1.get());
+ r1->add_successor(r2.get());
+ r2->add_successor(end1.get());
+
+ r1->set_msc(bmsc1);
+ r2->set_msc(bmsc2);
+
+ return check(hmsc1,false,false);
+}
+
int main(int argc, char** argv) {
RETURN_IF_FAILED(HMscA());
RETURN_IF_FAILED(HMscB());
@@ -365,6 +415,7 @@
RETURN_IF_FAILED(HMscD());
RETURN_IF_FAILED(HMscE());
RETURN_IF_FAILED(HMscF());
+ RETURN_IF_FAILED(HMscG());
return 0;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2009-03-14 18:25:47
|
Revision: 203
http://scstudio.svn.sourceforge.net/scstudio/?rev=203&view=rev
Author: gotthardp
Date: 2009-03-14 18:25:33 +0000 (Sat, 14 Mar 2009)
Log Message:
-----------
Based on a subset of VSL reporting functions implemented generic reporting system.
Modified formatter.h interface: 1) integrated with reporting system, 2) load_msc takes filename as a parameter.
Z120 parser integrated into the Visio application.
Implemented z120_test program.
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/src/data/CMakeLists.txt
trunk/src/data/Z120/CMakeLists.txt
trunk/src/data/Z120/z120.h
trunk/src/data/engmann/engmann.cpp
trunk/src/data/engmann/engmann.h
trunk/src/data/formatter.h
trunk/src/view/visio/addon/dllmodule.rc
trunk/src/view/visio/addon/document.cpp
trunk/src/view/visio/addon/document.h
trunk/src/view/visio/addon/reportview.cpp
trunk/src/view/visio/addon/reportview.h
trunk/src/view/visio/scstudio.nsi
trunk/tests/CMakeLists.txt
trunk/tests/engmann_test.cpp
Added Paths:
-----------
trunk/src/data/Z120/z120_load.cpp
trunk/src/data/reporter.h
trunk/tests/z120_test.cpp
Removed Paths:
-------------
trunk/src/data/Z120/Z120.cpp
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/CMakeLists.txt 2009-03-14 18:25:33 UTC (rev 203)
@@ -16,6 +16,10 @@
FIND_PACKAGE(Boost REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
+FIND_PACKAGE(Java)
+# do not make antlr a mandatory prerequisite
+FIND_PACKAGE(ANTLR)
+
INCLUDE_DIRECTORIES(src)
INCLUDE_DIRECTORIES(${CMAKE_INSTALL_PREFIX}/include)
Modified: trunk/src/data/CMakeLists.txt
===================================================================
--- trunk/src/data/CMakeLists.txt 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/src/data/CMakeLists.txt 2009-03-14 18:25:33 UTC (rev 203)
@@ -3,6 +3,7 @@
msc.cpp
msc.h
msc_visual.h
+ reporter.h
formatter.h
checker.h
dfs_area_traverser.cpp
Modified: trunk/src/data/Z120/CMakeLists.txt
===================================================================
--- trunk/src/data/Z120/CMakeLists.txt 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/src/data/Z120/CMakeLists.txt 2009-03-14 18:25:33 UTC (rev 203)
@@ -1,6 +1,3 @@
-FIND_PACKAGE(Java)
-FIND_PACKAGE(ANTLR)
-
# do not make antlr a mandatory prerequisite
IF(ANTLR_FOUND)
ADD_DEFINITIONS(-DHAVE_ANTLR)
@@ -12,6 +9,7 @@
DEPENDS Z120.g)
SET(PARSER_SOURCES
+ z120_load.cpp
Z120.g
Context.cpp
Z120Lexer.c
Deleted: trunk/src/data/Z120/Z120.cpp
===================================================================
--- trunk/src/data/Z120/Z120.cpp 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/src/data/Z120/Z120.cpp 2009-03-14 18:25:33 UTC (rev 203)
@@ -1,109 +0,0 @@
-/*
- * scstudio - Sequence Chart Studio
- * http://scstudio.sourceforge.net
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License version 2.1, as published by the Free Software Foundation.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * Copyright (c) 2008 Petr Gotthard <pet...@ce...>
- *
- * $Id$
- */
-
-#include "Z120.h"
-
-// Process "Z120.g" with antlr-2008-05-07 to produce the following files.
-#include "Z120Lexer.h"
-#include "Z120Parser.h"
-
-#include <assert.h>
-
-inline std::string getTokenString(pANTLR3_COMMON_TOKEN token)
-{
- return std::string((char*)token->getStartIndex(token),
- token->getStopIndex(token)-token->getStartIndex(token)+1);
-}
-
-static void walk(pANTLR3_BASE_TREE tree)
-{
- assert(tree != NULL);
- switch(tree->getType(tree))
- {
- case NAME:
- {
- std::string pp = getTokenString(tree->getToken(tree));
- printf("NAME %s\n", pp.c_str());
- break;
- }
-
- case MSC:
- printf("MSC\n");
- walk((pANTLR3_BASE_TREE)tree->getChild(tree, 0));
- printf(";\n\n");
- break;
-
- default:
- fprintf(stderr, "Unexpected node<%d>\n", tree->getType(tree));
- break;
- }
-}
-
-int Z120::readFile(const std::string& filename)
-{
- pANTLR3_INPUT_STREAM input =
- antlr3AsciiFileStreamNew((pANTLR3_UINT8)filename.c_str());
- if (input == NULL || (int)input < 0)
- {
- fprintf(stderr, "Unable to open file %s\n", filename.c_str());
- exit(1);
- }
-
- pZ120Lexer lxr = Z120LexerNew(input);
-
- if (lxr == NULL)
- {
- fprintf(stderr, "Unable to create the lexer\n");
- exit(1);
- }
-
- pANTLR3_COMMON_TOKEN_STREAM tstream =
- antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, lxr->pLexer->rec->state->tokSource);
- if (tstream == NULL)
- {
- fprintf(stderr, "Out of memory trying to allocate token stream\n");
- exit(1);
- }
-
- pZ120Parser psr = Z120ParserNew(tstream);
- if (psr == NULL)
- {
- fprintf(stderr, "Out of memory trying to allocate parser\n");
- exit(1);
- }
-
- struct Z120Parser_textual_msc_file_return_struct langAST =
- psr->textual_msc_file(psr);
- if (psr->pParser->rec->state->errorCount > 0)
- {
- fprintf(stderr, "The parser returned %d errors, tree walking aborted.\n", psr->pParser->rec->state->errorCount);
- }
- else
- {
- walk(langAST.tree);
- }
-
- psr->free(psr); psr = NULL;
- tstream->free(tstream); tstream = NULL;
- lxr->free(lxr); lxr = NULL;
- input->close(input); input = NULL;
-
- return 0;
-}
-
-// end of file
Modified: trunk/src/data/Z120/z120.h
===================================================================
--- trunk/src/data/Z120/z120.h 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/src/data/Z120/z120.h 2009-03-14 18:25:33 UTC (rev 203)
@@ -22,7 +22,11 @@
#include "data/formatter.h"
#include "data/Z120/export.h"
-class SCZ120_EXPORT Z120 : public Formatter, public ExportFormatter
+class SCZ120_EXPORT Z120 : public Formatter
+#ifdef HAVE_ANTLR
+ , public ImportFormatter
+#endif
+ , public ExportFormatter
{
public:
//! file extension used to distinguish this format
@@ -33,6 +37,10 @@
virtual std::string get_description() const
{ return "Z.120 Textual Format"; }
+#ifdef HAVE_ANTLR
+ //! import MSC document
+ virtual MscPtr load_msc(const std::string &filename);
+#endif
//! export MSC document
virtual int save_msc(std::ostream& stream, const std::string &name, const std::vector<MscPtr>& msc);
Copied: trunk/src/data/Z120/z120_load.cpp (from rev 202, trunk/src/data/Z120/Z120.cpp)
===================================================================
--- trunk/src/data/Z120/z120_load.cpp (rev 0)
+++ trunk/src/data/Z120/z120_load.cpp 2009-03-14 18:25:33 UTC (rev 203)
@@ -0,0 +1,63 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2008-2009 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include "z120.h"
+
+// Process "Z120.g" with ANTLR 3.1.1 to produce the following files.
+#include "Z120Lexer.h"
+#include "Z120Parser.h"
+
+MscPtr Z120::load_msc(const std::string &filename)
+{
+ pANTLR3_INPUT_STREAM input =
+ antlr3AsciiFileStreamNew((pANTLR3_UINT8)filename.c_str());
+ if (input == NULL || (int)input < 0)
+ {
+ print_report(RS_ERROR,
+ stringize() << "Cannot open file '" << filename << "'.");
+ return NULL;
+ }
+
+ pZ120Lexer lxr = Z120LexerNew(input);
+ if (lxr == NULL)
+ return NULL;
+
+ pANTLR3_COMMON_TOKEN_STREAM tstream =
+ antlr3CommonTokenStreamSourceNew(ANTLR3_SIZE_HINT, TOKENSOURCE(lxr));
+ if (tstream == NULL)
+ return NULL;
+
+ pZ120Parser psr = Z120ParserNew(tstream);
+ if (psr == NULL)
+ return NULL;
+
+ Msc* my_msc = static_cast<Msc*>(psr->message_sequence_chart(psr));
+ MscPtr result = my_msc;
+ // my_msc is an extern "C" pointer to an object pointed by smart pointers
+ // the counter was increased in get_msc_fun() to avoid premature delete
+ intrusive_ptr_release(my_msc);
+
+ psr->free(psr); psr = NULL;
+ tstream->free(tstream); tstream = NULL;
+ lxr->free(lxr); lxr = NULL;
+ input->close(input); input = NULL;
+
+ return result;
+}
+
+// end of file
Property changes on: trunk/src/data/Z120/z120_load.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:mergeinfo
+
Added: svn:eol-style
+ native
Modified: trunk/src/data/engmann/engmann.cpp
===================================================================
--- trunk/src/data/engmann/engmann.cpp 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/src/data/engmann/engmann.cpp 2009-03-14 18:25:33 UTC (rev 203)
@@ -18,6 +18,7 @@
#include <string>
#include <iostream>
+#include <fstream>
#include <string.h>
#include "data/engmann/engmann.h"
@@ -137,7 +138,7 @@
return pos->second;
}
-MscPtr Engmann::load_msc(std::istream& stream)
+MscPtr Engmann::load_msc(const std::string &filename)
{
BMscPtr result = new BMsc();
@@ -149,6 +150,15 @@
static const Coordinate y_step = 7.5; // distance between messages [mm]
Coordinate current_y = 7.5;
+ std::ifstream stream;
+ stream.open(filename.c_str(), std::ifstream::in);
+ if(!stream.good())
+ {
+ print_report(RS_ERROR,
+ stringize() << "Cannot open file '" << filename << "'.");
+ return NULL;
+ }
+
while(stream.good())
{
TToken token = get_token(stream);
@@ -219,6 +229,8 @@
}
}
+ stream.close();
+
// set length of the instance lines
for(InstanceAreaMap::const_iterator pos = instances.begin();
pos != instances.end(); pos++)
Modified: trunk/src/data/engmann/engmann.h
===================================================================
--- trunk/src/data/engmann/engmann.h 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/src/data/engmann/engmann.h 2009-03-14 18:25:33 UTC (rev 203)
@@ -34,7 +34,7 @@
{ return "Engmann Message Chart"; }
//! import MSC document
- virtual MscPtr load_msc(std::istream& stream);
+ virtual MscPtr load_msc(const std::string &filename);
protected:
};
Modified: trunk/src/data/formatter.h
===================================================================
--- trunk/src/data/formatter.h 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/src/data/formatter.h 2009-03-14 18:25:33 UTC (rev 203)
@@ -22,13 +22,14 @@
#include <boost/shared_ptr.hpp>
#include "data/msc.h"
+#include "data/reporter.h"
#if defined(_MSC_VER)
// FIXME: to be removed once the Formatter has some implementation in a .cpp file
#pragma warning(disable: 4275)
#endif
-class Formatter
+class Formatter : public Reporter
{
public:
virtual ~Formatter() {}
@@ -45,7 +46,7 @@
{
public:
//! import MSC document
- virtual MscPtr load_msc(std::istream& stream) = 0;
+ virtual MscPtr load_msc(const std::string &filename) = 0;
};
typedef boost::shared_ptr<ImportFormatter> ImportFormatterPtr;
Added: trunk/src/data/reporter.h
===================================================================
--- trunk/src/data/reporter.h (rev 0)
+++ trunk/src/data/reporter.h 2009-03-14 18:25:33 UTC (rev 203)
@@ -0,0 +1,100 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2009 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#ifndef _REPORTER_H
+#define _REPORTER_H
+
+#include <sstream>
+
+enum TReportSeverity
+{
+ RS_REPORT = 0, //! progress reports
+ RS_NOTICE, //! operation succeeded
+ RS_WARNING, //! problem detected, but operation continues
+ RS_ERROR, //! error detected, operation failed
+ __RS_LAST
+};
+
+class ReportPrinter
+{
+public:
+ virtual ~ReportPrinter() {}
+
+ virtual int print(TReportSeverity severity, const std::string& message) = 0;
+};
+
+class StreamReportPrinter : public ReportPrinter
+{
+public:
+ StreamReportPrinter(std::ostream& stream)
+ : m_stream(stream) {}
+
+ virtual int print(TReportSeverity severity, const std::string& message)
+ {
+ m_stream << message << std::endl;
+ return 0;
+ }
+
+private:
+ std::ostream& m_stream;
+};
+
+class Reporter
+{
+public:
+ virtual ~Reporter() {}
+
+ void set_printer(ReportPrinter* printer)
+ { m_printer = printer; }
+
+ int print_report(TReportSeverity severity, const std::string& message)
+ { return m_printer ? m_printer->print(severity, message) : 1; }
+
+private:
+ ReportPrinter* m_printer;
+};
+
+//! Helper class to construct a message for Reporter::print()
+/*!
+ * reporter->print(stringize() << "value: " << number);
+ */
+template<typename C>
+struct basic_stringize
+{
+ template<typename T>
+ basic_stringize<C> & operator << (T const& t)
+ {
+ m_s << t;
+ return *this;
+ }
+
+ // note: must not return reference
+ operator const std::basic_string<C>() const
+ {
+ return m_s.str();
+ }
+
+private:
+ std::basic_stringstream<C> m_s;
+};
+
+typedef basic_stringize<char> stringize;
+
+#endif /* _REPORTER_H */
+
+// $Id$
Property changes on: trunk/src/data/reporter.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/view/visio/addon/dllmodule.rc
===================================================================
--- trunk/src/view/visio/addon/dllmodule.rc 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/src/view/visio/addon/dllmodule.rc 2009-03-14 18:25:33 UTC (rev 203)
@@ -72,8 +72,8 @@
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,2,0,0
- PRODUCTVERSION 0,2,0,0
+ FILEVERSION 0,2,4,0
+ PRODUCTVERSION 0,2,4,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x9L
@@ -90,13 +90,13 @@
BEGIN
VALUE "CompanyName", "Masaryk University Brno"
VALUE "FileDescription", "Microsoft Visio add-on for design and verification of Message Sequence Charts (MSC)."
- VALUE "FileVersion", "0.2.0"
+ VALUE "FileVersion", "0.2.4"
VALUE "InternalName", "scstudio.vsl"
VALUE "LegalCopyright", "(c) Petr Gotthard. All rights reserved."
VALUE "OriginalFilename", "scstudio.vsl"
VALUE "PrivateBuild", "$Revision$"
VALUE "ProductName", "Sequence Chart Studio"
- VALUE "ProductVersion", "0.2.0"
+ VALUE "ProductVersion", "0.2.4"
END
END
BLOCK "VarFileInfo"
Modified: trunk/src/view/visio/addon/document.cpp
===================================================================
--- trunk/src/view/visio/addon/document.cpp 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/src/view/visio/addon/document.cpp 2009-03-14 18:25:33 UTC (rev 203)
@@ -40,7 +40,7 @@
m_vsoDocument = vsoDocument;
m_reportVisible = false;
- m_reportView = NULL;
+ m_reportView = new CReportView(this);
LoadModulesFromRegistry(HKEY_LOCAL_MACHINE);
LoadModulesFromRegistry(HKEY_CURRENT_USER);
@@ -180,6 +180,7 @@
for(Formatter **fpos = formatters; *fpos != NULL; fpos++)
{
boost::shared_ptr<Formatter> formatter(*fpos);
+ formatter->set_printer(m_reportView);
m_formatters.push_back(formatter);
}
// delete the array
@@ -354,9 +355,6 @@
VAORC CDocumentMonitor::OnMenuRun(Visio::IVApplicationPtr vsoApp)
{
- if(!m_reportVisible)
- ShowReportView(vsoApp);
-
// clear the verification report
m_reportView->Reset();
@@ -464,6 +462,9 @@
VAORC CDocumentMonitor::OnMenuImport(Visio::IVApplicationPtr vsoApp)
{
+ // clear the verification report
+ m_reportView->Reset();
+
std::string extension;
std::stringstream filter;
@@ -522,18 +523,7 @@
if(formatter == NULL)
continue;
- std::ifstream stream;
- stream.open(fileName, std::ios::in);
- if(!stream.good())
- {
- MessageBox(GetActiveWindow(),
- _T("Cannot import given file."), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
- return VAORC_FAILURE;
- }
-
- ImportDocument(formatter, stream);
-
- stream.close();
+ ImportDocument(formatter, fileName);
return VAORC_SUCCESS;
}
@@ -544,6 +534,9 @@
VAORC CDocumentMonitor::OnMenuExport(Visio::IVApplicationPtr vsoApp)
{
+ // clear the verification report
+ m_reportView->Reset();
+
std::string extension;
std::stringstream filter;
@@ -624,9 +617,6 @@
VAORC CDocumentMonitor::OnMenuRepaint(Visio::IVApplicationPtr vsoApp)
{
- if(!m_reportVisible)
- ShowReportView(vsoApp);
-
// clear the verification report
m_reportView->Reset();
@@ -665,17 +655,17 @@
// Close() --> CReportView::OnFinalMessage() --> CDocumentMonitor::OnHideReportView()
m_reportWindow->Close();
else
- ShowReportView(vsoApp);
+ ShowReportView();
return VAORC_SUCCESS;
}
-void CDocumentMonitor::ShowReportView(Visio::IVApplicationPtr vsoApp)
+void CDocumentMonitor::ShowReportView()
{
- if (m_reportView == NULL)
- m_reportView = new CReportView(this);
+ if(m_reportVisible)
+ return; // already shown
- Visio::IVWindowPtr vsoWindow = vsoApp->GetActiveWindow();
+ Visio::IVWindowPtr vsoWindow = m_vsoApp->GetActiveWindow();
const int defWidth = 500;
const int defHeight = 150;
@@ -701,9 +691,9 @@
m_reportVisible = false;
}
-void CDocumentMonitor::ImportDocument(const ImportFormatterPtr& formatter, std::istream& stream)
+void CDocumentMonitor::ImportDocument(const ImportFormatterPtr& formatter, const std::string& filename)
{
- MscPtr drawing = formatter->load_msc(stream);
+ MscPtr drawing = formatter->load_msc(filename);
long scope_id = m_vsoApp->BeginUndoScope("Import");
@@ -742,12 +732,6 @@
void CDocumentMonitor::ExportActiveDocument(const ExportFormatterPtr& formatter, std::ostream& stream)
{
- if(!m_reportVisible)
- ShowReportView(m_vsoApp);
-
- // clear the verification report
- m_reportView->Reset();
-
CDrawingExtractor extractor(m_reportView);
std::vector<MscPtr> msc;
Modified: trunk/src/view/visio/addon/document.h
===================================================================
--- trunk/src/view/visio/addon/document.h 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/src/view/visio/addon/document.h 2009-03-14 18:25:33 UTC (rev 203)
@@ -46,10 +46,10 @@
VAORC OnMenuExport(Visio::IVApplicationPtr vsoApp);
VAORC OnMenuRepaint(Visio::IVApplicationPtr vsoApp);
- void ShowReportView(Visio::IVApplicationPtr vsoApp);
+ void ShowReportView();
void OnHideReportView();
- void ImportDocument(const ImportFormatterPtr& formatter, std::istream& stream);
+ void ImportDocument(const ImportFormatterPtr& formatter, const std::string& filename);
void ExportActiveDocument(const ExportFormatterPtr& formatter, std::ostream& stream);
int DisplayDocument(const MscPtr& msc);
Modified: trunk/src/view/visio/addon/reportview.cpp
===================================================================
--- trunk/src/view/visio/addon/reportview.cpp 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/src/view/visio/addon/reportview.cpp 2009-03-14 18:25:33 UTC (rev 203)
@@ -59,8 +59,13 @@
void CReportView::Reset()
{
- // reset the view
- m_edit.SetTextEx(NULL);
+ // window is active
+ if(::IsWindow(m_edit.m_hWnd))
+ {
+ // reset the view
+ m_edit.SetTextEx(NULL);
+ }
+
// reset the internal data
memset(m_statistics, 0, sizeof(m_statistics));
m_references.clear();
@@ -85,8 +90,11 @@
return 0;
}
-int CReportView::__Print(TSeverity severity, const std::string& message, int hasLink)
+int CReportView::__Print(TReportSeverity severity, const std::string& message, int hasLink)
{
+ // display the report view
+ m_documentMonitor->ShowReportView();
+
static const char *rtfPrefix =
"{\\rtf1\\ansi"
"{\\colortbl;\\red255\\green0\\blue0;}"
@@ -104,7 +112,7 @@
// depending on severity, change the text style
switch(severity)
{
- case RS_NORMAL:
+ case RS_REPORT:
default:
sstr += message;
break;
@@ -147,7 +155,7 @@
return 0;
}
-int CReportView::Print(TSeverity severity, const std::string& message, const std::vector<_bstr_t>& shapelist)
+int CReportView::Print(TReportSeverity severity, const std::string& message, const std::vector<_bstr_t>& shapelist)
{
__Print(severity, message, !shapelist.empty());
@@ -159,7 +167,7 @@
return 0;
}
-int CReportView::Print(TSeverity severity, const std::string& message, const MscPtr& msc)
+int CReportView::Print(TReportSeverity severity, const std::string& message, const MscPtr& msc)
{
__Print(severity, message, msc != NULL);
@@ -171,6 +179,12 @@
return 0;
}
+int CReportView::print(TReportSeverity severity, const std::string& message)
+{
+ __Print(severity, message, false);
+ return 0;
+}
+
LRESULT CReportView::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
LRESULT lRet = DefWindowProc(uMsg, wParam, lParam);
Modified: trunk/src/view/visio/addon/reportview.h
===================================================================
--- trunk/src/view/visio/addon/reportview.h 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/src/view/visio/addon/reportview.h 2009-03-14 18:25:33 UTC (rev 203)
@@ -24,10 +24,10 @@
#include <atlctrls.h>
#include <atlwin.h>
-#include <sstream>
#include <vector>
#include "data/msc.h"
+#include "data/reporter.h"
class CReportView;
class CDocumentMonitor;
@@ -56,32 +56,6 @@
CReportView *m_reporter;
};
-//! Helper class to construct a message for CReportView::Print()
-/*!
- * reporter->Print(stringize() << "string" << number);
- */
-template<typename C>
-struct basic_stringize
-{
- template<typename T>
- basic_stringize<C> & operator << (T const& t)
- {
- m_s << t;
- return *this;
- }
-
- // note: must not return reference
- operator const std::basic_string<C>() const
- {
- return m_s.str();
- }
-
-private:
- std::basic_stringstream<C> m_s;
-};
-
-typedef basic_stringize<char> stringize;
-
struct shapelist
{
shapelist & operator << (Visio::IVShapePtr shape)
@@ -101,26 +75,19 @@
std::vector<_bstr_t> m_v;
};
-enum TSeverity
+class CReportView : public ReportPrinter,
+ public ATL::CWindowImpl<CReportView, ATL::CWindow, ATL::CNullTraits>
{
- RS_NORMAL = 0, //! black
- RS_NOTICE, //! black bold
- RS_WARNING, //! red
- RS_ERROR, //! red bold
- __RS_LAST
-};
-
-class CReportView
- : public ATL::CWindowImpl<CReportView, ATL::CWindow, ATL::CNullTraits>
-{
public:
CReportView(CDocumentMonitor *monitor);
void Reset();
- int Print(TSeverity severity, const std::string& message,
+ int Print(TReportSeverity severity, const std::string& message,
const std::vector<_bstr_t>& shapelist = std::vector<_bstr_t>());
- int Print(TSeverity severity, const std::string& message, const MscPtr& msc);
+ int Print(TReportSeverity severity, const std::string& message, const MscPtr& msc);
+ virtual int print(TReportSeverity severity, const std::string& message);
+
protected:
BEGIN_MSG_MAP(CReportView)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
@@ -147,7 +114,7 @@
int m_statistics[__RS_LAST];
- int __Print(TSeverity severity, const std::string& message, int hasLink);
+ int __Print(TReportSeverity severity, const std::string& message, int hasLink);
struct Reference
{
Modified: trunk/src/view/visio/scstudio.nsi
===================================================================
--- trunk/src/view/visio/scstudio.nsi 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/src/view/visio/scstudio.nsi 2009-03-14 18:25:33 UTC (rev 203)
@@ -21,7 +21,7 @@
; -- General ---------------------------
-!define VERSION "0.2.2"
+!define VERSION "0.2.4"
Name "Sequence Chart Studio"
OutFile "scstudio-setup-${VERSION}.exe"
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/tests/CMakeLists.txt 2009-03-14 18:25:33 UTC (rev 203)
@@ -57,4 +57,14 @@
)
ADD_TEST(engmann engmann_test engmann_test01.cfi)
+IF(ANTLR_FOUND)
+ADD_DEFINITIONS(-DHAVE_ANTLR)
+ADD_EXECUTABLE(z120_test
+ z120_test.cpp
+)
+TARGET_LINK_LIBRARIES(z120_test
+ scZ120
+)
+ENDIF(ANTLR_FOUND)
+
# $Id$
Modified: trunk/tests/engmann_test.cpp
===================================================================
--- trunk/tests/engmann_test.cpp 2009-03-12 19:41:00 UTC (rev 202)
+++ trunk/tests/engmann_test.cpp 2009-03-14 18:25:33 UTC (rev 203)
@@ -17,7 +17,6 @@
*/
#include <iostream>
-#include <fstream>
#include "data/engmann/engmann.h"
#include "data/Z120/z120.h"
@@ -31,19 +30,12 @@
Engmann engmann;
- std::ifstream stream;
- stream.open(argv[1], std::ifstream::in);
- if(!stream.good())
- {
- std::cerr << "Cannot open file '" << argv[1] << "'" << std::endl;
- return 1;
- }
+ StreamReportPrinter printer(std::cerr);
+ engmann.set_printer(&printer);
std::vector<MscPtr> msc;
- msc.push_back(engmann.load_msc(stream));
+ msc.push_back(engmann.load_msc(argv[1]));
- stream.close();
-
Z120 z120;
z120.save_msc(std::cout, argv[1], msc);
Added: trunk/tests/z120_test.cpp
===================================================================
--- trunk/tests/z120_test.cpp (rev 0)
+++ trunk/tests/z120_test.cpp 2009-03-14 18:25:33 UTC (rev 203)
@@ -0,0 +1,43 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2009 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include <iostream>
+#include "data/Z120/z120.h"
+
+int main(int argc, char** argv)
+{
+ if(argc < 2)
+ {
+ std::cerr << "Usage: " << argv[0] << " <filename>" << std::endl;
+ return 1;
+ }
+
+ Z120 z120;
+
+ StreamReportPrinter printer(std::cerr);
+ z120.set_printer(&printer);
+
+ std::vector<MscPtr> msc;
+ msc.push_back(z120.load_msc(argv[1]));
+
+ z120.save_msc(std::cout, argv[1], msc);
+
+ return 0;
+}
+
+// $Id$
Property changes on: trunk/tests/z120_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ba...@us...> - 2009-03-22 15:40:07
|
Revision: 205
http://scstudio.svn.sourceforge.net/scstudio/?rev=205&view=rev
Author: babicaj
Date: 2009-03-22 15:39:52 +0000 (Sun, 22 Mar 2009)
Log Message:
-----------
HMsc checking bug fixed
Modified Paths:
--------------
trunk/src/check/pseudocode/utils.cpp
trunk/src/check/race/race_checker.cpp
trunk/tests/race_checker_test.cpp
Modified: trunk/src/check/pseudocode/utils.cpp
===================================================================
--- trunk/src/check/pseudocode/utils.cpp 2009-03-14 18:38:09 UTC (rev 204)
+++ trunk/src/check/pseudocode/utils.cpp 2009-03-22 15:39:52 UTC (rev 205)
@@ -67,16 +67,17 @@
void InstanceIdMarker::set_instance_id(Instance* i)
{
StringSizeTMap::iterator it = m_identifiers.find(i->get_label());
+ size_t id;
if(it!=m_identifiers.end())
{
- i->set_attribute<size_t>(m_instance_id_attribute,(*it).second);
+ id = (*it).second;
}
else
{
- size_t size = m_identifiers.size();
- i->set_attribute<size_t>(m_instance_id_attribute,size);
- m_identifiers[i->get_label()] = size;
+ id = m_identifiers.size();
+ m_identifiers[i->get_label()] = id;
}
+ i->set_attribute<size_t>(m_instance_id_attribute,id);
m_modified_instances.push_back(i);
}
@@ -102,7 +103,8 @@
size_t InstanceIdMarker::get_instance_id(Instance* i)
{
- return i->get_attribute<size_t>(m_instance_id_attribute,0);
+ size_t id = i->get_attribute<size_t>(m_instance_id_attribute,0);
+ return id;
}
void InstanceIdMarker::cleanup_attributes()
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2009-03-14 18:38:09 UTC (rev 204)
+++ trunk/src/check/race/race_checker.cpp 2009-03-22 15:39:52 UTC (rev 205)
@@ -113,8 +113,8 @@
}
}
}
- extreme_events.add_extreme_event(
- m_instance_marker->get_instance_id((*e)->get_instance()),e_instances);
+ size_t e_id = m_instance_marker->get_instance_id((*e)->get_instance());
+ extreme_events.add_extreme_event(e_id,e_instances);
}
}
@@ -156,9 +156,9 @@
EventPList::const_iterator e2 = events->begin();
while(e2!=events->end())
{
- if(e1!=e2)
+ //we are looking only for different events to be greater
+ if(*e1!=*e2)
{
- Event* e = *e2;
size_t e2_index = m_vis_initiator->get_topology_index(*e2);
//e1<<e2 => e1 isn't maximal
if(e1_causal[e2_index]) break;
@@ -196,22 +196,29 @@
*/
for(f=events->begin();f!=events->end();f++)
{
- const BoolVector& f_closure = m_caus_initiator->get_causal_closure(*f);
- size_t f_index = m_vis_initiator->get_topology_index(*f);
- size_t f_instance_id = m_instance_marker->get_instance_id((*f)->get_instance());
- //f is less than e
- if(f_closure[e_index])
+ //we are looking only for events of different instances
+ if((*e)->get_instance()!=(*f)->get_instance())
{
- e_instances_greater->set_dependent(f_instance_id);
+ const BoolVector& f_closure = m_caus_initiator->get_causal_closure(*f);
+ size_t f_index = m_vis_initiator->get_topology_index(*f);
+ size_t f_instance_id = m_instance_marker->get_instance_id((*f)->get_instance());
+ //f is less than e
+ if(f_closure[e_index])
+ {
+ //e_instances_greater->set_dependent(f_instance_id);
+ e_instances_less->set_dependent(f_instance_id);
+ }
+ //e is less than f
+ if(e_closure[f_index])
+ {
+ //e_instances_less->set_dependent(f_instance_id);
+ e_instances_greater->set_dependent(f_instance_id);
+ }
}
- //e is less than f
- if(e_closure[f_index])
- {
- e_instances_less->set_dependent(f_instance_id);
- }
}
- extreme_events_greater.add_extreme_event(
- m_instance_marker->get_instance_id((*e)->get_instance()),e_instances_greater);
+ size_t e_instance_id = m_instance_marker->get_instance_id((*e)->get_instance());
+ extreme_events_greater.add_extreme_event(e_instance_id,e_instances_greater);
+ extreme_events_less.add_extreme_event(e_instance_id,e_instances_less);
}
}
@@ -508,7 +515,6 @@
}
if(j==a_instances.size())
{
- //throw RaceInHMscException(m_footprint,b_event,a_event,get_reached_elements().back());
throw RaceInHMscException(f,b_event,a_event,get_reached_elements().back());
}
}
Modified: trunk/tests/race_checker_test.cpp
===================================================================
--- trunk/tests/race_checker_test.cpp 2009-03-14 18:38:09 UTC (rev 204)
+++ trunk/tests/race_checker_test.cpp 2009-03-22 15:39:52 UTC (rev 205)
@@ -408,6 +408,66 @@
return check(hmsc1,false,false);
}
+bool HMscH()
+{
+ std::cout << "HMscH:" << std::endl;
+ BMscPtr bmsc1(new BMsc("BMsc1"));
+ InstancePtr instance1_1(new Instance("1"));
+ InstancePtr instance1_2(new Instance("2"));
+ bmsc1->add_instance(instance1_1);
+ bmsc1->add_instance(instance1_2);
+ StrictOrderAreaPtr strict1_1(new StrictOrderArea());
+ StrictOrderAreaPtr strict1_2(new StrictOrderArea());
+ instance1_1->add_area(strict1_1);
+ instance1_2->add_area(strict1_2);
+ EventPtr e1 = strict1_1->add_event();
+ EventPtr e2 = strict1_2->add_event();
+ CompleteMessagePtr m1 = new CompleteMessage("b");
+ m1->glue_events(e2, e1);
+
+ BMscPtr bmsc2(new BMsc("BMsc2"));
+ InstancePtr instance2_1(new Instance("1"));
+ InstancePtr instance2_2(new Instance("2"));
+ InstancePtr instance2_3(new Instance("3"));
+ bmsc2->add_instance(instance2_1);
+ bmsc2->add_instance(instance2_2);
+ bmsc2->add_instance(instance2_3);
+ StrictOrderAreaPtr strict2_1(new StrictOrderArea());
+ StrictOrderAreaPtr strict2_2(new StrictOrderArea());
+ StrictOrderAreaPtr strict2_3(new StrictOrderArea());
+ instance2_1->add_area(strict2_1);
+ instance2_2->add_area(strict2_2);
+ instance2_3->add_area(strict2_3);
+
+ EventPtr s = strict2_1->add_event();
+ EventPtr r = strict2_3->add_event();
+ CompleteMessagePtr m2 = new CompleteMessage("b");
+ m2->glue_events(s, r);
+
+ s = strict2_3->add_event();
+ r = strict2_2->add_event();
+ m2 = new CompleteMessage("b");
+ m2->glue_events(s,r);
+
+ HMscPtr hmsc1(new HMsc("HMsc"));
+ StartNodePtr start1 = new StartNode();
+ hmsc1->set_start(start1);
+ ReferenceNodePtr r1(new ReferenceNode());
+ ReferenceNodePtr r2(new ReferenceNode());
+ EndNodePtr end1(new EndNode());
+ hmsc1->add_node(r1);
+ hmsc1->add_node(r2);
+ hmsc1->add_node(end1);
+ start1->add_successor(r1.get());
+ r1->add_successor(r2.get());
+ r2->add_successor(end1.get());
+
+ r1->set_msc(bmsc1);
+ r2->set_msc(bmsc2);
+
+ return check(hmsc1,true,true);
+}
+
int main(int argc, char** argv) {
RETURN_IF_FAILED(HMscA());
RETURN_IF_FAILED(HMscB());
@@ -416,6 +476,7 @@
RETURN_IF_FAILED(HMscE());
RETURN_IF_FAILED(HMscF());
RETURN_IF_FAILED(HMscG());
+ RETURN_IF_FAILED(HMscH());
return 0;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2009-03-27 22:14:35
|
Revision: 208
http://scstudio.svn.sourceforge.net/scstudio/?rev=208&view=rev
Author: gotthardp
Date: 2009-03-27 22:14:22 +0000 (Fri, 27 Mar 2009)
Log Message:
-----------
Implemented HMSC ConditionNode into "msc.h".
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/src/check/pseudocode/msc_duplicators.cpp
trunk/src/check/pseudocode/msc_duplicators.h
trunk/src/data/Z120/Context.cpp
trunk/src/data/Z120/z120_save.cpp
trunk/src/data/dfs_bmsc_graph_traverser.cpp
trunk/src/data/msc.h
trunk/src/data/refnode_finder.cpp
trunk/src/view/visio/addon/extract.cpp
trunk/src/view/visio/addon/visualize.cpp
trunk/src/view/visio/addon/visualize.h
trunk/src/view/visio/scstudio.nsi
Added Paths:
-----------
trunk/FindPCAP.cmake
Property Changed:
----------------
trunk/src/data/Z120/
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2009-03-25 17:11:02 UTC (rev 207)
+++ trunk/CMakeLists.txt 2009-03-27 22:14:22 UTC (rev 208)
@@ -17,7 +17,7 @@
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
FIND_PACKAGE(Java)
-# do not make antlr a mandatory prerequisite
+# keep antlr an optional prerequisite
FIND_PACKAGE(ANTLR)
INCLUDE_DIRECTORIES(src)
Added: trunk/FindPCAP.cmake
===================================================================
--- trunk/FindPCAP.cmake (rev 0)
+++ trunk/FindPCAP.cmake 2009-03-27 22:14:22 UTC (rev 208)
@@ -0,0 +1,25 @@
+# set the default PCAP_ROOT value
+IF(NOT PCAP_ROOT)
+ SET(PCAP_ROOT $ENV{PCAP_ROOT} CACHE PATH "The PCAP directory root.")
+ENDIF(NOT PCAP_ROOT)
+
+FIND_LIBRARY(PCAP_LIBRARY
+ NAMES wpcap
+ PATHS
+ ${PCAP_ROOT}/Lib
+ DOC "The PCAP Library")
+
+FIND_PATH(PCAP_INCLUDE_DIR
+ NAMES pcap.h
+ PATHS
+ ${PCAP_ROOT}/Include
+ DOC "The PCAP Include Files")
+
+IF (PCAP_LIBRARY AND PCAP_INCLUDE_DIR)
+ SET(PCAP_FOUND TRUE)
+ELSE (PCAP_LIBRARY AND PCAP_INCLUDE_DIR)
+ SET(PCAP_FOUND FALSE)
+ IF (PCAP_FIND_REQUIRED)
+ MESSAGE(FATAL_ERROR "PCAP not found! Set PCAP_ROOT to the PCAP-3.1.1 directory.")
+ ENDIF (PCAP_FIND_REQUIRED)
+ENDIF (PCAP_LIBRARY AND PCAP_INCLUDE_DIR)
Property changes on: trunk/FindPCAP.cmake
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/check/pseudocode/msc_duplicators.cpp
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.cpp 2009-03-25 17:11:02 UTC (rev 207)
+++ trunk/src/check/pseudocode/msc_duplicators.cpp 2009-03-27 22:14:22 UTC (rev 208)
@@ -238,36 +238,27 @@
void GraphCreatorListener::on_white_node_found(HMscNode *n)
{
- HMscNodePtr node;
- ReferenceNode* reference = dynamic_cast<ReferenceNode*>(n);
- if(reference)
- {
- on_white_node_found(reference);
- }
- else
- {
- ConnectionNode* connection = dynamic_cast<ConnectionNode*>(n);
- if(connection)
- {
- on_white_node_found(connection);
- }
- else
- {
- EndNode* end = dynamic_cast<EndNode*>(n);
- if(end)
- {
- on_white_node_found(end);
- }
- else
- {
- StartNode* start = dynamic_cast<StartNode*>(n);
- on_white_node_found(start);
- }
- }
- }
+ ReferenceNode* reference_node = dynamic_cast<ReferenceNode*>(n);
+ if(reference_node)
+ return on_white_node_found(reference_node);
+
+ StartNode* start_node = dynamic_cast<StartNode*>(n);
+ if(start_node)
+ return on_white_node_found(start_node);
+
+ EndNode* end_node = dynamic_cast<EndNode*>(n);
+ if(end_node)
+ return on_white_node_found(end_node);
+
+ ConditionNode* condition_node = dynamic_cast<ConditionNode*>(n);
+ if(condition_node)
+ return on_white_node_found(condition_node);
+
+ ConnectionNode* connection_node = dynamic_cast<ConnectionNode*>(n);
+ if(connection_node)
+ return on_white_node_found(connection_node);
}
-
void GraphCreatorListener::on_white_node_found(ReferenceNode* n)
{
BMscPtr bmsc = n->get_bmsc();
@@ -332,6 +323,13 @@
end_list.push_back(new_end);
}
+void GraphCreatorListener::on_white_node_found(ConditionNode* n)
+{
+ PredecessorNode* predecessor = get_predecessor();
+ HMscNodePtr new_node = new ConditionNode(n);
+ process_new_node(n,new_node);
+}
+
void GraphCreatorListener::on_white_node_found(ConnectionNode* n)
{
PredecessorNode* predecessor = get_predecessor();
@@ -380,33 +378,25 @@
void GraphCreatorListener::on_node_finished(HMscNode* n)
{
- HMscNodePtr node;
- ReferenceNode* reference = dynamic_cast<ReferenceNode*>(n);
- if(reference)
- {
- on_node_finished(reference);
- }
- else
- {
- ConnectionNode* connection = dynamic_cast<ConnectionNode*>(n);
- if(connection)
- {
- on_node_finished(connection);
- }
- else
- {
- EndNode* end = dynamic_cast<EndNode*>(n);
- if(end)
- {
- on_node_finished(end);
- }
- else
- {
- StartNode* start = dynamic_cast<StartNode*>(n);
- on_node_finished(start);
- }
- }
- }
+ StartNode* start_node = dynamic_cast<StartNode*>(n);
+ if(start_node)
+ return on_node_finished(start_node);
+
+ EndNode* end_node = dynamic_cast<EndNode*>(n);
+ if(end_node)
+ return on_node_finished(end_node);
+
+ ReferenceNode* reference_node = dynamic_cast<ReferenceNode*>(n);
+ if(reference_node)
+ return on_node_finished(reference_node);
+
+ ConditionNode* condition_node = dynamic_cast<ConditionNode*>(n);
+ if(condition_node)
+ return on_node_finished(condition_node);
+
+ ConnectionNode* connection_node = dynamic_cast<ConnectionNode*>(n);
+ if(connection_node)
+ return on_node_finished(connection_node);
}
void GraphCreatorListener::on_node_finished(ReferenceNode* n)
@@ -428,6 +418,11 @@
m_new_nodes.pop_back();
}
+void GraphCreatorListener::on_node_finished(ConditionNode* n)
+{
+ m_new_nodes.pop_back();
+}
+
void GraphCreatorListener::on_node_finished(ConnectionNode* n)
{
m_new_nodes.pop_back();
@@ -557,9 +552,14 @@
}
else
{
- ReferenceNode* ref_node = dynamic_cast<ReferenceNode*>(*e);
+ ReferenceNode* ref_node;
+ ConditionNode* cond_node;
+ ConnectionNode* conn_node;
+ EndNode* end_node;
+
NodeRelationPtr new_rel;
- if(ref_node)
+
+ if(ref_node = dynamic_cast<ReferenceNode*>(*e))
{
ReferenceNode* new_ref = new ReferenceNode(ref_node);
new_ref->set_msc(ref_node->get_msc());
@@ -568,26 +568,32 @@
new_pred = new_ref;
set_copy(ref_node,new_ref);
}
- else
+ else if(cond_node = dynamic_cast<ConditionNode*>(*e))
{
- ConnectionNode* con_node = dynamic_cast<ConnectionNode*>(*e);
- if(con_node)
- {
- ConnectionNode* new_con = new ConnectionNode(con_node);
- new_hmsc->add_node(new_con);
- new_rel = new_con->add_predecessor(new_pred);
- new_pred = new_con;
- set_copy(con_node,new_con);
- }
- else
- {
- EndNode* end_node = dynamic_cast<EndNode*>(*e);
- EndNode* new_end = new EndNode(end_node);
- new_rel = new_end->add_predecessor(new_pred);
- new_hmsc->add_node(new_end);
- set_copy(end_node,new_end);
- }
+ ConditionNode* new_cond = new ConditionNode(cond_node);
+ new_hmsc->add_node(new_cond);
+ new_rel = new_cond->add_predecessor(new_pred);
+ new_pred = new_cond;
+ set_copy(cond_node,new_cond);
}
+ else if(conn_node = dynamic_cast<ConnectionNode*>(*e))
+ {
+ ConnectionNode* new_conn = new ConnectionNode(conn_node);
+ new_hmsc->add_node(new_conn);
+ new_rel = new_conn->add_predecessor(new_pred);
+ new_pred = new_conn;
+ set_copy(conn_node,new_conn);
+ }
+ else if(end_node = dynamic_cast<EndNode*>(*e))
+ {
+ EndNode* new_end = new EndNode(end_node);
+ new_rel = new_end->add_predecessor(new_pred);
+ new_hmsc->add_node(new_end);
+ set_copy(end_node,new_end);
+ }
+ else
+ throw std::runtime_error("Unknown node type");
+
new_rel->set_original(old_rel);
new_rel->set_line(old_rel->get_line());
set_copy(old_rel,new_rel.get());
@@ -641,9 +647,14 @@
}
else
{
- ReferenceNode* ref_node = dynamic_cast<ReferenceNode*>(*e);
+ ReferenceNode* ref_node;
+ ConditionNode* cond_node;
+ ConnectionNode* conn_node;
+ EndNode* end_node;
+
NodeRelationPtr new_rel;
- if(ref_node)
+
+ if(ref_node = dynamic_cast<ReferenceNode*>(*e))
{
ReferenceNode* new_ref = new ReferenceNode(ref_node);
new_ref->set_msc(ref_node->get_msc());
@@ -652,26 +663,32 @@
new_pred = new_ref;
set_copy(ref_node,new_ref,persist_original);
}
- else
+ else if(cond_node = dynamic_cast<ConditionNode*>(*e))
{
- ConnectionNode* con_node = dynamic_cast<ConnectionNode*>(*e);
- if(con_node)
- {
- ConnectionNode* new_con = new ConnectionNode(con_node);
- root->add_node(new_con);
- new_rel = new_con->add_predecessor(new_pred);
- new_pred = new_con;
- set_copy(con_node,new_con,persist_original);
- }
- else
- {
- EndNode* end_node = dynamic_cast<EndNode*>(*e);
- EndNode* new_end = new EndNode(end_node);
- new_rel = new_end->add_predecessor(new_pred);
- root->add_node(new_end);
- set_copy(end_node,new_end,persist_original);
- }
+ ConditionNode* new_cond = new ConditionNode(cond_node);
+ root->add_node(new_cond);
+ new_rel = new_cond->add_predecessor(new_pred);
+ new_pred = new_cond;
+ set_copy(cond_node,new_cond,persist_original);
}
+ else if(conn_node = dynamic_cast<ConnectionNode*>(*e))
+ {
+ ConnectionNode* new_conn = new ConnectionNode(conn_node);
+ root->add_node(new_conn);
+ new_rel = new_conn->add_predecessor(new_pred);
+ new_pred = new_conn;
+ set_copy(conn_node,new_conn,persist_original);
+ }
+ else if(end_node = dynamic_cast<EndNode*>(*e))
+ {
+ EndNode* new_end = new EndNode(end_node);
+ new_rel = new_end->add_predecessor(new_pred);
+ root->add_node(new_end);
+ set_copy(end_node,new_end,persist_original);
+ }
+ else
+ throw std::runtime_error("Unknown node type");
+
new_rel->set_original(old_rel);
new_rel->set_line(old_rel->get_line());
set_copy(old_rel,new_rel.get(),persist_original);
@@ -687,7 +704,7 @@
FLAT_PATH_INITIAL_Y+current_index*FLAT_PATH_VERTICAL_STEP
)
);
- if(e!=path.begin() && (dynamic_cast<StartNode*>(*e) ||
+ if(e!=path.begin() && (dynamic_cast<StartNode*>(*e) ||
(dynamic_cast<ConnectionNode*>(*e) && dynamic_cast<ReferenceNode*>((*e)->get_general_original()))))
{
current_depth++;
@@ -702,7 +719,7 @@
)
);
}
- current_index++;
+ current_index++;
}
}
}
Modified: trunk/src/check/pseudocode/msc_duplicators.h
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.h 2009-03-25 17:11:02 UTC (rev 207)
+++ trunk/src/check/pseudocode/msc_duplicators.h 2009-03-27 22:14:22 UTC (rev 208)
@@ -182,6 +182,7 @@
void on_white_node_found(ReferenceNode* n);
void on_white_node_found(StartNode* n);
void on_white_node_found(EndNode* n);
+ void on_white_node_found(ConditionNode* n);
void on_white_node_found(ConnectionNode* n);
void on_gray_node_found(HMscNode* n);
@@ -192,6 +193,7 @@
void on_node_finished(ReferenceNode* n);
void on_node_finished(StartNode* n);
void on_node_finished(EndNode* n);
+ void on_node_finished(ConditionNode* n);
void on_node_finished(ConnectionNode* n);
};
Property changes on: trunk/src/data/Z120
___________________________________________________________________
Modified: svn:ignore
- CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
.Z120.g.swo
.Z120Parser.c.swp
.Z120.g.swp
.ParserStruct.cpp.swp
+ CMakeFiles
cmake_install.cmake
CTestTestfile.cmake
*.dir
Makefile
*.vcproj
*.swo
*.swp
Modified: trunk/src/data/Z120/Context.cpp
===================================================================
--- trunk/src/data/Z120/Context.cpp 2009-03-25 17:11:02 UTC (rev 207)
+++ trunk/src/data/Z120/Context.cpp 2009-03-27 22:14:22 UTC (rev 208)
@@ -238,7 +238,7 @@
while (context->connect_name.empty())
{
StartNodePtr node = new StartNode();
- node->set_label(context->connect_name.front());
+// node->set_label(context->connect_name.front());
context->connect_name.pop_front();
context->myHmsc->set_start(node);
}
Modified: trunk/src/data/Z120/z120_save.cpp
===================================================================
--- trunk/src/data/Z120/z120_save.cpp 2009-03-25 17:11:02 UTC (rev 207)
+++ trunk/src/data/Z120/z120_save.cpp 2009-03-27 22:14:22 UTC (rev 208)
@@ -218,6 +218,13 @@
stream << "initial";
}
+ ConditionNodePtr condition_node = boost::dynamic_pointer_cast<ConditionNode>(*npos);
+ if(condition_node != NULL)
+ {
+ stream << "L" << node_id_map.get_id(*npos)
+ << ": condition " << condition_node->get_label();
+ }
+
ConnectionNodePtr connection_node = boost::dynamic_pointer_cast<ConnectionNode>(*npos);
if(connection_node != NULL)
{
Modified: trunk/src/data/dfs_bmsc_graph_traverser.cpp
===================================================================
--- trunk/src/data/dfs_bmsc_graph_traverser.cpp 2009-03-25 17:11:02 UTC (rev 207)
+++ trunk/src/data/dfs_bmsc_graph_traverser.cpp 2009-03-27 22:14:22 UTC (rev 208)
@@ -88,23 +88,15 @@
}
else
{
- ConnectionNode* conn_node = dynamic_cast<ConnectionNode*>(node);
- if(conn_node)
+ PredecessorNode* pred_node = dynamic_cast<PredecessorNode*>(node);
+ if(pred_node)
{
- ending_successors = traverse_successors(conn_node);
+ ending_successors = traverse_successors(pred_node);
}
else
{
- StartNode* start_node = dynamic_cast<StartNode*>(node);
- if(start_node)
- {
- ending_successors = traverse_successors(start_node);
- }
- else
- {
- //node is supposed to be EndNode
- ending_successors = true;
- }
+ //node is supposed to be EndNode
+ ending_successors = true;
}
}
node_finished(node);
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2009-03-25 17:11:02 UTC (rev 207)
+++ trunk/src/data/msc.h 2009-03-27 22:14:22 UTC (rev 208)
@@ -38,6 +38,7 @@
class HMscNode;
class InnerNode;
class ReferenceNode;
+class ConditionNode;
class ConnectionNode;
class EndNode;
class StartNode;
@@ -73,6 +74,8 @@
typedef std::set<ReferenceNode*> ReferenceNodePSet;
typedef std::queue<InnerNode*> InnerNodePQueue;
+typedef boost::intrusive_ptr<ConditionNode> ConditionNodePtr;
+
typedef boost::intrusive_ptr<ConnectionNode> ConnectionNodePtr;
typedef boost::intrusive_ptr<StartNode> StartNodePtr;
@@ -507,9 +510,6 @@
*/
class SCMSC_EXPORT HMscNode:public MscElementTmpl<HMscNode>
{
-
- std::string m_label;
-
Point m_position;
protected:
@@ -520,22 +520,6 @@
public:
- /**
- * Setter of m_label
- */
- void set_label(const std::string label)
- {
- m_label = label;
- }
-
- /**
- * Getter of m_label
- */
- const std::string& get_label() const
- {
- return m_label;
- }
-
HMsc* get_owner() const
{
return m_owner;
@@ -903,6 +887,58 @@
};
/**
+ * \brief HMSC condition node.
+ *
+ * Represents an HMSC condition.
+ */
+class SCMSC_EXPORT ConditionNode:public PredecessorNode, public SuccessorNode, public HMscNode
+{
+ std::string m_label;
+
+public:
+
+ /**
+ * Initializes m_label
+ */
+ ConditionNode(const std::string& label=""):HMscNode(),PredecessorNode(),SuccessorNode(),
+ m_label(label)
+ {
+ }
+
+ /**
+ * ConditionNode is allowed to reference via m_original different types of
+ * HMscNode.
+ */
+ ConditionNode(ConditionNode* original):HMscNode(original),PredecessorNode(),SuccessorNode()
+ {
+ if(original)
+ {
+ m_label = original->m_label;
+ }
+ }
+
+ virtual ~ConditionNode()
+ {
+ }
+
+ /**
+ * Setter of m_label
+ */
+ void set_label(const std::string label)
+ {
+ m_label = label;
+ }
+
+ /**
+ * Getter of m_label
+ */
+ const std::string& get_label() const
+ {
+ return m_label;
+ }
+};
+
+/**
* \brief Represents connection node, empty visual node)
*
* Corresponds to ITU-T's connection node.
@@ -917,12 +953,10 @@
*/
ConnectionNode(HMscNode* original=NULL):HMscNode(original),PredecessorNode(),SuccessorNode()
{
-
}
virtual ~ConnectionNode()
{
-
}
};
Modified: trunk/src/data/refnode_finder.cpp
===================================================================
--- trunk/src/data/refnode_finder.cpp 2009-03-25 17:11:02 UTC (rev 207)
+++ trunk/src/data/refnode_finder.cpp 2009-03-27 22:14:22 UTC (rev 208)
@@ -36,10 +36,10 @@
//traverse successors only if node is not ReferenceNode
if(!dynamic_cast<ReferenceNode*>(node))
{
- if(dynamic_cast<ConnectionNode*>(node)||
- dynamic_cast<StartNode*>(node))
+ PredecessorNode* pred_node = dynamic_cast<PredecessorNode*>(node);
+ if(pred_node)
{
- traverse_successors(dynamic_cast<PredecessorNode*>(node));
+ traverse_successors(pred_node);
}
//else node is supposed to be EndNode
}
Modified: trunk/src/view/visio/addon/extract.cpp
===================================================================
--- trunk/src/view/visio/addon/extract.cpp 2009-03-25 17:11:02 UTC (rev 207)
+++ trunk/src/view/visio/addon/extract.cpp 2009-03-27 22:14:22 UTC (rev 208)
@@ -909,6 +909,7 @@
case ST_HMSC_CONNECTION:
case ST_HMSC_START:
case ST_HMSC_REFERENCE:
+ case ST_HMSC_CONDITION:
{
PredecessorNode *pred = dynamic_cast<PredecessorNode*>(node.get());
if(pred != NULL)
@@ -937,6 +938,7 @@
case ST_HMSC_CONNECTION:
case ST_HMSC_END:
case ST_HMSC_REFERENCE:
+ case ST_HMSC_CONDITION:
{
SuccessorNode *succ = dynamic_cast<SuccessorNode*>(node.get());
if(succ != NULL)
@@ -1044,7 +1046,16 @@
new_node->set_msc(msc);
break;
}
+ case ST_HMSC_CONDITION:
+ {
+ ConditionNode *new_condition = new ConditionNode((const char*)shape->Text);
+ new_condition->set_position(GetPinPos(shape));
+ hmsc->add_node(new_condition);
+ nodes[shape->ID] = new_condition;
+ break;
+ }
+
case ST_HMSC_LINE:
case ST_HMSC_ARROW:
relations[shape->ID] = new NodeRelation();
Modified: trunk/src/view/visio/addon/visualize.cpp
===================================================================
--- trunk/src/view/visio/addon/visualize.cpp 2009-03-25 17:11:02 UTC (rev 207)
+++ trunk/src/view/visio/addon/visualize.cpp 2009-03-27 22:14:22 UTC (rev 208)
@@ -44,6 +44,7 @@
m_start_symbol_master = hmsc_stencil->Masters->Item["Start Symbol"];
m_end_symbol_master = hmsc_stencil->Masters->Item["End Symbol"];
m_msc_reference_master = hmsc_stencil->Masters->Item["MSC Reference"];
+ m_condition_master = hmsc_stencil->Masters->Item["Condition"];
m_connection_point_master = hmsc_stencil->Masters->Item["Connection Point"];
m_connection_arrow_master = hmsc_stencil->Masters->Item["Connection Arrow"];
}
@@ -351,6 +352,13 @@
shape = DropMaster(vsoPage, m_start_symbol_master, start_node->get_position());
}
+ ConditionNodePtr condition_node = boost::dynamic_pointer_cast<ConditionNode>(node);
+ if(condition_node != NULL)
+ {
+ shape = DropMaster(vsoPage, m_condition_master, condition_node->get_position());
+ shape->Text = condition_node->get_label().c_str();
+ }
+
ConnectionNodePtr connection_node = boost::dynamic_pointer_cast<ConnectionNode>(node);
if(connection_node != NULL)
{
Modified: trunk/src/view/visio/addon/visualize.h
===================================================================
--- trunk/src/view/visio/addon/visualize.h 2009-03-25 17:11:02 UTC (rev 207)
+++ trunk/src/view/visio/addon/visualize.h 2009-03-27 22:14:22 UTC (rev 208)
@@ -41,6 +41,7 @@
Visio::IVMasterPtr m_start_symbol_master;
Visio::IVMasterPtr m_end_symbol_master;
Visio::IVMasterPtr m_msc_reference_master;
+ Visio::IVMasterPtr m_condition_master;
Visio::IVMasterPtr m_connection_point_master;
Visio::IVMasterPtr m_connection_arrow_master;
Modified: trunk/src/view/visio/scstudio.nsi
===================================================================
--- trunk/src/view/visio/scstudio.nsi 2009-03-25 17:11:02 UTC (rev 207)
+++ trunk/src/view/visio/scstudio.nsi 2009-03-27 22:14:22 UTC (rev 208)
@@ -21,7 +21,7 @@
; -- General ---------------------------
-!define VERSION "0.2.4"
+!define VERSION "0.2.5"
Name "Sequence Chart Studio"
OutFile "scstudio-setup-${VERSION}.exe"
@@ -129,6 +129,7 @@
DeleteRegKey HKCU "${RegMainPath}"
; register modules
WriteRegStr HKCU '${RegMainPath}' 'ModulesPath' '$INSTDIR\bin'
+ WriteRegStr HKCU '${RegModulesPath}' 'sc_boundedness' 'scboundedness.dll'
WriteRegStr HKCU '${RegModulesPath}' 'sc_liveness' 'scliveness.dll'
WriteRegStr HKCU '${RegModulesPath}' 'sc_order' 'scorder.dll'
WriteRegStr HKCU '${RegModulesPath}' 'sc_race' 'scrace.dll'
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2009-03-28 21:03:22
|
Revision: 211
http://scstudio.svn.sourceforge.net/scstudio/?rev=211&view=rev
Author: gotthardp
Date: 2009-03-28 21:03:15 +0000 (Sat, 28 Mar 2009)
Log Message:
-----------
Added few tests for the Z120 parser.
Modified Paths:
--------------
trunk/tests/CMakeLists.txt
Added Paths:
-----------
trunk/tests/z120_test00.mpr
trunk/tests/z120_test01.mpr
trunk/tests/z120_test02.mpr
Removed Paths:
-------------
trunk/src/data/Z120/test.msc
Deleted: trunk/src/data/Z120/test.msc
===================================================================
--- trunk/src/data/Z120/test.msc 2009-03-28 20:03:05 UTC (rev 210)
+++ trunk/src/data/Z120/test.msc 2009-03-28 21:03:15 UTC (rev 211)
@@ -1,16 +0,0 @@
-msc pok2;
-A: instance;
-B: instance;
-A: in A,1 from found;
-A: out jedna,2 to B;
-B: in jedna,2 from A;
-A: concurrent;
-A: out B1,3 to B;
-B: in B1,3 from A;
-A: out B,4 to lost;
-A: endconcurrent;
-A: in jedna,4 from B;
-B: out jedna,4 to A;
-A: endinstance;
-B: endinstance;
-endmsc;
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2009-03-28 20:03:05 UTC (rev 210)
+++ trunk/tests/CMakeLists.txt 2009-03-28 21:03:15 UTC (rev 211)
@@ -75,6 +75,9 @@
TARGET_LINK_LIBRARIES(z120_test
scZ120
)
+ADD_TEST(z120-01 z120_test z120_test00.mpr)
+ADD_TEST(z120-01 z120_test z120_test01.mpr)
+ADD_TEST(z120-02 z120_test z120_test02.mpr)
ENDIF(ANTLR_FOUND)
# $Id$
Copied: trunk/tests/z120_test00.mpr (from rev 210, trunk/src/data/Z120/test.msc)
===================================================================
--- trunk/tests/z120_test00.mpr (rev 0)
+++ trunk/tests/z120_test00.mpr 2009-03-28 21:03:15 UTC (rev 211)
@@ -0,0 +1,16 @@
+msc pok2;
+A: instance;
+B: instance;
+A: in A,1 from found;
+A: out jedna,2 to B;
+B: in jedna,2 from A;
+A: concurrent;
+A: out B1,3 to B;
+B: in B1,3 from A;
+A: out B,4 to lost;
+A: endconcurrent;
+A: in jedna,4 from B;
+B: out jedna,4 to A;
+A: endinstance;
+B: endinstance;
+endmsc;
Property changes on: trunk/tests/z120_test00.mpr
___________________________________________________________________
Added: svn:mergeinfo
+
Added: svn:eol-style
+ native
Added: trunk/tests/z120_test01.mpr
===================================================================
--- trunk/tests/z120_test01.mpr (rev 0)
+++ trunk/tests/z120_test01.mpr 2009-03-28 21:03:15 UTC (rev 211)
@@ -0,0 +1,45 @@
+/*
+ * Created by Telelogic SDL 4.4
+ * This test contains
+ * - Comments
+ * - Unterminated instance
+ * - Lost, found, loopback and overtaking messages
+ * - Messages of the same name
+ */
+mscdocument z120_test01;
+msc z120_test01;
+/*#SDTREF(MSC,-b 4,109)*/
+ONE: instance;
+/*#SDTREF(MSC,-b 4,110)*/
+TWO: instance;
+text
+/*#SDTREF(MSC,-b 4,108)*/
+'Comment';
+TWO: out
+/*#SDTREF(MSC,-b 4,111)*/
+LOOPBACK,1(parameter) to TWO;
+ONE: in
+/*#SDTREF(MSC,-b 4,114)*/
+LEFT,2(parameter) from found;
+TWO: out
+/*#SDTREF(MSC,-b 4,116)*/
+RIGHT,3(parameter) to lost;
+ONE: out
+/*#SDTREF(MSC,-b 4,119)*/
+NAME,4(parameter) to TWO;
+ONE: out
+/*#SDTREF(MSC,-b 4,121)*/
+NAME,5(parameter) to TWO;
+TWO: in
+/*#SDTREF(MSC,-b 4,122)*/
+NAME,5(parameter) from ONE;
+TWO: in
+/*#SDTREF(MSC,-b 4,120)*/
+NAME,4(parameter) from ONE;
+TWO: in
+/*#SDTREF(MSC,-b 4,112)*/
+LOOPBACK,1(parameter) from TWO;
+ONE: endinstance
+/*#SDTREF(MSC,-b 4,123)*/
+;
+endmsc;
Property changes on: trunk/tests/z120_test01.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
Added: trunk/tests/z120_test02.mpr
===================================================================
--- trunk/tests/z120_test02.mpr (rev 0)
+++ trunk/tests/z120_test02.mpr 2009-03-28 21:03:15 UTC (rev 211)
@@ -0,0 +1,20 @@
+/*
+ * Created by Telelogic SDL 4.4
+ * This test contains
+ * - Comments
+ * - Conditions, references
+ */
+mscdocument z120_test02;
+msc z120_test02;
+expr L2;
+ L1: text 'Comment';
+ L2: connect seq (L3 alt L4);
+ L3: condition STATE1 seq (L5);
+ L4: condition STATE2 seq (L6);
+ L5: (ACTION1) seq (L7);
+ L6: (ACTION2) seq (L8 alt L9);
+ L7: end;
+ L8: (ACTION3A) seq (L2);
+ L9: (ACTION3B) seq (L10);
+ L10: end;
+endmsc;
Property changes on: trunk/tests/z120_test02.mpr
___________________________________________________________________
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <va...@us...> - 2009-04-06 15:33:06
|
Revision: 214
http://scstudio.svn.sourceforge.net/scstudio/?rev=214&view=rev
Author: vacek
Date: 2009-04-06 15:32:54 +0000 (Mon, 06 Apr 2009)
Log Message:
-----------
First functional version of UniversalBoundednessChecker.
Modified Paths:
--------------
trunk/src/check/boundedness/universal_boundedness_checker.cpp
trunk/src/check/boundedness/universal_boundedness_checker.h
trunk/src/check/pseudocode/msc_duplicators.h
trunk/tests/universal_boundedness_checker_test.cpp
Modified: trunk/src/check/boundedness/universal_boundedness_checker.cpp
===================================================================
--- trunk/src/check/boundedness/universal_boundedness_checker.cpp 2009-03-31 16:50:47 UTC (rev 213)
+++ trunk/src/check/boundedness/universal_boundedness_checker.cpp 2009-04-06 15:32:54 UTC (rev 214)
@@ -21,6 +21,9 @@
UniversalBoundednessCheckerPtr UniversalBoundednessChecker::m_instance;
+const std::string UniversalBoundednessChecker::com_graph_attribute = "cograt";
+const std::string UniversalBoundednessChecker::vertex_number_attribute = "venuat";
+
void FindFirstNodeListener::on_white_node_found(HMscNode *n)
{
ReferenceNode* refnode = dynamic_cast<ReferenceNode*>(n);
@@ -75,6 +78,62 @@
{
m_where_to_add->add_node(n);
}
+
+void AssignListener::on_white_node_found(HMscNode *n)
+{
+ CommunicationGraph comgraph;
+ ReferenceNode* refnode;
+ refnode = dynamic_cast<ReferenceNode*>(n);
+ if(refnode)
+ {
+ comgraph.create_from_bmsc(refnode->get_bmsc());
+ refnode->set_attribute<CommunicationGraph>(UniversalBoundednessChecker::com_graph_attribute, comgraph);
+ }
+ n->set_attribute(UniversalBoundednessChecker::vertex_number_attribute, m_node_number++);
+}
+
+void CleanupListener::on_white_node_found(HMscNode *n)
+{
+ n->remove_attribute<CommunicationGraph>(UniversalBoundednessChecker::com_graph_attribute);
+ n->remove_attribute<unsigned>(UniversalBoundednessChecker::vertex_number_attribute);
+}
+
+
+void CycleListener::on_white_node_found(HMscNode *n)
+{
+ if(!dynamic_cast<ReferenceNode*>(n))
+ return;
+
+ TarjanCycles cycle_finder(m_vertex_count);
+ MscElementPListList cycle_list;
+ cycle_list = cycle_finder.circuit_enumeration(n);
+ CommunicationGraph cycle_graph;
+ MscElementPListList::const_iterator cycles;
+ MscElementPList::const_iterator items;
+
+
+ ReferenceNode *current_node;
+ for(cycles = cycle_list.begin(); cycles != cycle_list.end(); cycles++)
+ {
+ for(items = cycles->begin(); items != cycles->end(); items++)
+ {
+ current_node = dynamic_cast<ReferenceNode*>(*items);
+
+ if(current_node == NULL)
+ {
+ continue;
+ }
+
+ if(items == cycles->begin())
+ cycle_graph = current_node->get_attribute(UniversalBoundednessChecker::com_graph_attribute, cycle_graph);
+ else cycle_graph.merge(current_node->get_attribute(UniversalBoundednessChecker::com_graph_attribute, cycle_graph));
+
+ }
+ if(!cycle_graph.is_strongly_connected())
+ throw UnboundedCycleException();
+ }
+
+}
HMscPtr UniversalBoundednessChecker::create_duplicate_counter_example(const MscElementPListList& path)
{
HMscPathDuplicator duplicator;
@@ -102,12 +161,34 @@
return p;
}
+HMscPtr UniversalBoundednessChecker::create_counter_example(const MscElementPList& to_cycle, const MscElementPList& cycle)
+{
+ HMscPtr p;
+ HMscFlatPathDuplicator duplicator;
+ MscElementPList::const_iterator iter;
+ MscElementPList path;
+ for(iter = to_cycle.begin(); iter!=to_cycle.end(); iter++)
+ path.push_back(*iter);
+ for(iter = cycle.begin(); iter!=cycle.end(); iter++)
+ path.push_back(*iter);
+
+ p = duplicator.duplicate_path(path);
+
+ MscElementPList::const_iterator h;
+ for(h=path.begin();h!=path.end();h++)
+ {
+ duplicator.get_copy(*h)->set_marked(true);
+ }
+
+ return p;
+}
+
HMscPtr UniversalBoundednessChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
DFSHMscTraverser name_traverser, first_node_traverser;
NameChecker n_ch;
FindFirstNodeListener ffnl;
- HMscPtr p = NULL;
+ HMscPtr p(NULL);
MscElementPListList path_to_first;
name_traverser.add_white_node_found_listener(&n_ch);
first_node_traverser.add_white_node_found_listener(&ffnl);
@@ -128,16 +209,147 @@
catch(DuplicateNamesException)
{
p = create_duplicate_counter_example(name_traverser.get_reached_elements());
+ name_traverser.cleanup_traversing_attributes();
+ return p;
}
catch(InconsistentNamesException)
{
p = create_inconsistent_counter_example(name_traverser.get_reached_elements(), path_to_first);
+ name_traverser.cleanup_traversing_attributes();
+ return p;
}
- return p;
+
+ /* Here the main part of the checker begins */
+ BMscGraphDuplicator graph_duplicator;
+ HMscPtr transformed = graph_duplicator.duplicate_hmsc(hmsc);
+ DFSHMscTraverser msc_traverser;
+ AssignListener assigner;
+ CleanupListener cleaner;
+
+ //First, communication graphs and numbers are assigned to all the vertices.
+ msc_traverser.add_white_node_found_listener(&assigner);
+ msc_traverser.traverse(transformed);
+ //Notice that the checking traverser takes the number of vertices as a parameter.
+ CycleListener cycles(assigner.get_vertex_count());
+ msc_traverser.remove_all_listeners();
+
+
+ //This is the part performing the actual checking procedure.
+ msc_traverser.add_white_node_found_listener(&cycles);
+ try
+ {
+ msc_traverser.traverse(transformed);
+ }
+ catch(UnboundedCycleException)
+ {
+
+ p = create_counter_example(msc_traverser.get_reached_elements().back(), cycles.get_cycle());
+
+ msc_traverser.cleanup_traversing_attributes();
+ }
+ msc_traverser.remove_all_listeners();
+
+ //Finally, dynamic attributes are removed.
+ msc_traverser.add_white_node_found_listener(&cleaner);
+ msc_traverser.traverse(transformed);
+
+ return p;
}
void UniversalBoundednessChecker::cleanup_attributes()
{
}
+MscElementPListList TarjanCycles::circuit_enumeration(HMscNode *n)
+{
+ m_point_stack.clear();
+ m_marked_stack.clear();
+ m_mark.clear();
+ m_result.clear();
+ m_current_path.clear();
+ m_s = n->get_attribute(UniversalBoundednessChecker::vertex_number_attribute, 0);
+ m_mark.resize(m_vertex_count, false);
+
+ backtrack(n);
+
+
+
+ return m_result;
+}
+
+bool TarjanCycles::backtrack(HMscNode *n)
+{
+ bool f = false, g = false, some_f = false;
+ //The default value 0 is never to be used - the attribute is set for sure.
+ unsigned v = n->get_attribute(UniversalBoundednessChecker::vertex_number_attribute, 0);
+ unsigned j, w;
+
+ m_point_stack.push_back(v);
+ m_current_path.push_back(n); //!!
+ m_mark[v] = true;
+ m_marked_stack.push_back(v);
+ PredecessorNode* predecessor = dynamic_cast<PredecessorNode*>(n);
+ NodeRelationPtrSet::const_iterator relation;
+
+ //for all successors
+ if(predecessor)
+ {
+ for(relation=predecessor->get_successors().begin();
+ relation!=predecessor->get_successors().end();relation++)
+ {
+ const NodeRelationPtr& rel = *relation;
+
+ some_f = some_f || f;
+ f = false;
+ w = dynamic_cast<HMscNode*>(rel->get_successor())->get_attribute(UniversalBoundednessChecker::vertex_number_attribute, 0);
+
+ if(w < m_s)
+ continue;
+
+ if(w == m_s)
+ {
+ m_current_path.push_back(rel.get());
+ m_result.push_back(m_current_path);
+ m_current_path.pop_back();
+ f = true;
+ }
+ else if(!m_mark[w])
+ {
+ m_current_path.push_back(rel.get());
+ g = backtrack(dynamic_cast<HMscNode*>(rel->get_successor()));
+ m_current_path.pop_back();
+ f = f || g;
+ }
+
+ if(f == true)
+ {
+ j = m_marked_stack.size() - 1;
+ while(m_marked_stack[j] != v && j >=0)
+ {
+ m_mark[m_marked_stack[j]] = false;
+ m_marked_stack.pop_back();
+ j--;
+ }
+ if(j >= 0)
+ {
+ m_marked_stack.pop_back();
+ m_mark[v] = false;
+ }
+ }
+ }
+ }
+ if(!m_marked_stack.empty())
+ {
+ if(m_marked_stack.back()==v)
+ {
+ m_mark[v] = false;
+ m_marked_stack.pop_back();
+ }
+ }
+
+ m_point_stack.pop_back();
+ m_current_path.pop_back();
+ return some_f;
+}
+
// $Id$
Modified: trunk/src/check/boundedness/universal_boundedness_checker.h
===================================================================
--- trunk/src/check/boundedness/universal_boundedness_checker.h 2009-03-31 16:50:47 UTC (rev 213)
+++ trunk/src/check/boundedness/universal_boundedness_checker.h 2009-04-06 15:32:54 UTC (rev 214)
@@ -18,17 +18,38 @@
#include <vector>
#include <map>
+#include <iostream>
#include "data/checker.h"
#include "data/msc.h"
#include "check/boundedness/export.h"
#include "data/dfs_hmsc_traverser.h"
#include "data/dfs_bmsc_graph_traverser.h"
#include "check/pseudocode/communication_graph.h"
+#include "check/pseudocode/msc_duplicators.h"
class UniversalBoundednessChecker;
+
typedef boost::shared_ptr<UniversalBoundednessChecker> UniversalBoundednessCheckerPtr;
+class TarjanCycles
+{
+public:
+ MscElementPListList circuit_enumeration(HMscNode *n);
+ TarjanCycles(unsigned vertex_count)
+ :m_vertex_count(vertex_count)
+ {}
+private:
+ unsigned m_s; //the value of the root of the backtracking tree
+ MscElementPListList m_result; //needs to be shared among procedures
+ std::vector<unsigned> m_point_stack;
+ std::vector<unsigned> m_marked_stack;
+ MscElementPList m_current_path;
+ std::vector<bool> m_mark;
+ bool backtrack(HMscNode *n);
+ unsigned m_vertex_count;
+};
+
class InconsistentNamesException: public std::exception
{
public:
@@ -52,13 +73,58 @@
class FirstNodeFoundException: public std::exception
{
public:
-
const char* what()
{
return "First node found.";
}
};
+class UnboundedCycleException: public std::exception
+{
+public:
+ const char* what()
+ {
+ return "An unbounded cycle has been found.";
+ }
+};
+
+class AssignListener: public WhiteNodeFoundListener
+{
+public:
+ void on_white_node_found(HMscNode *n);
+ AssignListener()
+ :m_node_number(0)
+ {}
+ unsigned get_vertex_count(void)
+ {
+ return m_node_number;
+ }
+private:
+ unsigned m_node_number;
+};
+
+class CycleListener: public WhiteNodeFoundListener
+{
+public:
+ void on_white_node_found(HMscNode *n);
+ CycleListener(unsigned vertex_count)
+ :m_vertex_count(vertex_count)
+ {}
+ const MscElementPList get_cycle()
+ {
+ return m_unbounded_cycle;
+ }
+private:
+ unsigned m_vertex_count;
+ MscElementPList m_unbounded_cycle;
+};
+
+class CleanupListener: public WhiteNodeFoundListener
+{
+public:
+ void on_white_node_found(HMscNode *n);
+};
+
class FindFirstNodeListener: public WhiteNodeFoundListener
{
public:
@@ -73,6 +139,9 @@
public:
void on_white_node_found(HMscNode *n);
+ NameChecker()
+ :m_first_node(true)
+ {}
};
@@ -96,16 +165,20 @@
*/
static UniversalBoundednessCheckerPtr m_instance;
- std::map<std::string, HMscNode> m_test;
-
HMscPtr create_duplicate_counter_example(const MscElementPListList& path);
HMscPtr create_inconsistent_counter_example(const MscElementPListList& path1, const MscElementPListList& path2);
+ HMscPtr create_counter_example(const MscElementPList& to_cycle, const MscElementPList& cycle);
+
+
public:
UniversalBoundednessChecker(){};
+ static const std::string com_graph_attribute;
+ static const std::string vertex_number_attribute;
+
/**
* Human readable description of this check.
*/
@@ -131,7 +204,6 @@
return true;
}
- ~UniversalBoundednessChecker(){}
static UniversalBoundednessCheckerPtr instance()
{
Modified: trunk/src/check/pseudocode/msc_duplicators.h
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.h 2009-03-31 16:50:47 UTC (rev 213)
+++ trunk/src/check/pseudocode/msc_duplicators.h 2009-04-06 15:32:54 UTC (rev 214)
@@ -15,7 +15,8 @@
*
* $Id$
*/
-
+#ifndef _MSC_DUPLICATORS_H
+#define _MSC_DUPLICATORS_H
#include "data/msc.h"
#include "data/dfs_area_traverser.h"
#include "data/dfs_bmsc_graph_traverser.h"
@@ -210,7 +211,7 @@
*
* Original ReferenceNodes which references HMsc are transformed into
* ConnectionNodes referencing the ReferenceNode by m_original. StartNodes
- * which don't occure in HMsc to be duplicated are removed. EndNodes
+ * which don't occur in HMsc to be duplicated are removed. EndNodes
* of the same kind are transformed into ConnectionNodes referencing original
* EndNodes.
*/
@@ -230,7 +231,7 @@
/**
* \brief Duplicates path in HMsc.
*
- * The path is supposed to be generated by traversers -- similar srtucture.
+ * The path is supposed to be generated by traversers -- similar structure.
*/
class SCPSEUDOCODE_EXPORT HMscPathDuplicator:public Duplicator
{
@@ -256,4 +257,6 @@
HMscPtr duplicate_path(const MscElementPList& path, bool persist_original=true);
};
+#endif /* _MSC_DUPLICATORS_H */
+
// $Id$
Modified: trunk/tests/universal_boundedness_checker_test.cpp
===================================================================
--- trunk/tests/universal_boundedness_checker_test.cpp 2009-03-31 16:50:47 UTC (rev 213)
+++ trunk/tests/universal_boundedness_checker_test.cpp 2009-04-06 15:32:54 UTC (rev 214)
@@ -11,7 +11,7 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
- * Copyright (c) 2009 V\xE1clav Vacek <va...@ic...>
+ * Copyright (c) 2009 V\xE1clav Vacek <va...@ic...>
*
* $Id$
*/
@@ -44,7 +44,7 @@
if(hmsc.get())
{
result = true;
- std::cout << "OK: HMsc is supposed not to be universally bounded and it isnt't."
+ std::cout << "OK: HMsc is supposed not to be universally bounded and it isn't."
<< std::endl;
}
else
@@ -54,15 +54,17 @@
<< std::endl;
}
std::cout << std::endl;
+
return result;
}
bool check(HMscPtr hmsc,const bool is_bounded)
{
UniversalBoundednessCheckerPtr checker = UniversalBoundednessChecker::instance();
+
SRChannelMapperPtr srm = SRChannelMapper::instance();
- return print_result(checker->check(hmsc,srm),is_bounded);
+ return print_result(checker->check(hmsc,srm),is_bounded);
}
bool HMscA() {
@@ -112,12 +114,18 @@
}
bool HMscB() {
- std::cout << "Checking this bmsc in a cycle:" << std::endl;
+ std::cout << "Checking these bmscs in a cycle:" << std::endl;
std::cout << " p1 p2 " << std::endl;
std::cout << " | | " << std::endl;
std::cout << "e1 O-----a----->O e2" << std::endl;
std::cout << " | | " << std::endl;
std::cout << " | | " << std::endl;
+ std::cout << std::endl;
+ std::cout << " p1 p2 " << std::endl;
+ std::cout << " | | " << std::endl;
+ std::cout << "e3 O<----a------O e4" << std::endl;
+ std::cout << " | | " << std::endl;
+ std::cout << " | | " << std::endl;
BMscPtr bmsc2(new BMsc());
@@ -137,24 +145,95 @@
CompleteMessagePtr m1 = new CompleteMessage("a");
m1->glue_events(e1, e2);
- HMscPtr hmsc2(new HMsc("HMsc1"));
+ //////////////
+ BMscPtr bmsc3(new BMsc());
+
+ InstancePtr i3(new Instance("p1"));
+ bmsc3->add_instance(i3);
+ InstancePtr i4(new Instance("p2"));
+ bmsc3->add_instance(i4);
+
+ EventAreaPtr a3(new StrictOrderArea());
+ i3->add_area(a3);
+ EventAreaPtr a4(new StrictOrderArea());
+ i4->add_area(a4);
+
+ EventPtr e3 = a3->add_event();
+ EventPtr e4 = a4->add_event();
+
+ CompleteMessagePtr m2 = new CompleteMessage("a");
+ m2->glue_events(e4, e3);
+
+ HMscPtr hmsc2(new HMsc("HMsc2"));
StartNodePtr start1 = new StartNode();
hmsc2->set_start(start1);
ReferenceNodePtr r1_1(new ReferenceNode());
+ ReferenceNodePtr r1_2(new ReferenceNode());
EndNodePtr end1(new EndNode());
hmsc2->add_node(r1_1);
+ hmsc2->add_node(r1_2);
hmsc2->add_node(end1);
start1->add_successor(r1_1.get());
+ r1_1->add_successor(r1_2.get());
+ r1_2->add_successor(end1.get());
+ r1_2->add_successor(r1_1.get());
+ r1_1->set_msc(bmsc2);
+ r1_2->set_msc(bmsc3);
+
+ return check(hmsc2,true);
+}
+
+bool HMscC() {
+ std::cout << "Checking this bmsc in a cycle:" << std::endl;
+ std::cout << " p1 p2 " << std::endl;
+ std::cout << " | | " << std::endl;
+ std::cout << "e1 O-----a----->O e2" << std::endl;
+ std::cout << " | | " << std::endl;
+ std::cout << " | | " << std::endl;
+
+ BMscPtr bmsc1(new BMsc());
+
+ InstancePtr i1(new Instance("p1"));
+ bmsc1->add_instance(i1);
+ InstancePtr i2(new Instance("p2"));
+ bmsc1->add_instance(i2);
+
+ EventAreaPtr a1(new StrictOrderArea());
+ i1->add_area(a1);
+ EventAreaPtr a2(new StrictOrderArea());
+ i2->add_area(a2);
+
+ EventPtr e1 = a1->add_event();
+ EventPtr e2 = a2->add_event();
+
+ CompleteMessagePtr m1 = new CompleteMessage("a");
+ m1->glue_events(e1, e2);
+
+
+ HMscPtr hmsc1(new HMsc("HMsc1"));
+ StartNodePtr start1 = new StartNode();
+ hmsc1->set_start(start1);
+ ReferenceNodePtr r1_1(new ReferenceNode());
+ EndNodePtr end1(new EndNode());
+ hmsc1->add_node(r1_1);
+ hmsc1->add_node(end1);
+ start1->add_successor(r1_1.get());
r1_1->add_successor(end1.get());
r1_1->add_successor(r1_1.get());
- r1_1->set_msc(bmsc2);
+ r1_1->set_msc(bmsc1);
- return check(hmsc2,false);
+ return check(hmsc1,false);
}
int main(int argc, char** argv) {
+
RETURN_IF_FAILED(HMscA());
+
RETURN_IF_FAILED(HMscB());
+
+ RETURN_IF_FAILED(HMscC());
+
+ ;
/*CommunicationGraph tester;
std::vector<std::vector<unsigned> > test_graph, test_graph_matrix;
const int g_s = 6;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <koc...@us...> - 2009-04-14 13:22:49
|
Revision: 217
http://scstudio.svn.sourceforge.net/scstudio/?rev=217&view=rev
Author: kocianon
Date: 2009-04-14 13:22:47 +0000 (Tue, 14 Apr 2009)
Log Message:
-----------
adding time and interval data structure
Modified Paths:
--------------
trunk/src/data/CMakeLists.txt
trunk/tests/CMakeLists.txt
Added Paths:
-----------
trunk/src/data/time.h
trunk/tests/decimal_test.cpp
trunk/tests/interval_test.cpp
Modified: trunk/src/data/CMakeLists.txt
===================================================================
--- trunk/src/data/CMakeLists.txt 2009-04-14 08:18:04 UTC (rev 216)
+++ trunk/src/data/CMakeLists.txt 2009-04-14 13:22:47 UTC (rev 217)
@@ -22,6 +22,7 @@
dfs_instance_events_traverser.h
dfs_bmsc_graph_traverser.cpp
dfs_bmsc_graph_traverser.h
+ time.h
)
# build import-export formatters
Added: trunk/src/data/time.h
===================================================================
--- trunk/src/data/time.h (rev 0)
+++ trunk/src/data/time.h 2009-04-14 13:22:47 UTC (rev 217)
@@ -0,0 +1,813 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2008
+ *
+ * $Id:
+ */
+
+#ifndef _TIME_H_
+#define _TIME_H_
+
+#include<limits.h>
+#include<algorithm>
+#include<exception>
+#include<list>
+#include<cstdlib>
+#include<cmath>
+#include<iostream>
+
+/*
+class MscIntervalCoupleException;
+class MscIntervalCouple;
+class MscTimeInterval;
+class DecScaled;
+*/
+//class MscTimeSet;
+
+
+class MscIntervalCoupleException:public std::exception
+{
+public:
+
+ const char* what()
+ {
+ return "undecidable case";
+ }
+};
+
+
+/**
+ * Decimal scaling structure, stands for:
+ * m_mant*10^m_exp;
+ */
+class DecScaled
+{
+private:
+ long m_exp; // exponent
+ long m_mant; // significand, coefficient or mantissa
+
+ void tidy()
+ {
+ while(m_mant%10==0)
+ {
+ m_mant/=10;
+ m_exp++;
+ }
+ }
+public:
+ DecScaled():m_exp(0),m_mant(0){}
+ DecScaled(long mant):m_exp(0),m_mant(mant){}
+ DecScaled(long mant,long exp):m_exp(exp),m_mant(mant)
+ {
+ tidy();
+ }
+
+ DecScaled& operator=(const DecScaled& right)
+ {
+ if(this==&right)
+ return *this;
+ m_mant = right.m_mant;
+ m_exp = right.m_exp;
+ return *this;
+ }
+
+ const DecScaled& operator+() const
+ {
+ return *this;
+ }
+
+ const DecScaled operator-() const
+ {
+ return DecScaled(-m_mant,m_exp);
+ }
+
+ const DecScaled operator+(const DecScaled& right) const
+ {
+ int division = abs(m_exp-right.m_exp);
+ DecScaled a = *this;
+ DecScaled b = right;
+
+ if(a.m_exp>b.m_exp)
+ {
+ a.m_mant*=pow(10,division);
+ a.m_exp-=division;
+ }
+ else
+ {
+ b.m_mant*=pow(10,division);
+ b.m_exp-=division;
+ }
+ return DecScaled(a.m_mant+b.m_mant,a.m_exp);
+ }
+
+ const DecScaled operator-(const DecScaled& right) const
+ {
+ long division = abs(m_exp-right.m_exp);
+ DecScaled a = *this;
+ DecScaled b = right;
+
+ if(a.m_exp>b.m_exp)
+ {
+ a.m_mant*=pow(10,division);
+ a.m_exp-=division;
+ }
+ else
+ {
+ b.m_mant*=pow(10,division);
+ b.m_exp-=division;
+ }
+
+ return DecScaled(a.m_mant-b.m_mant,a.m_exp);
+ }
+
+ const DecScaled operator*(const DecScaled& right) const
+ {
+ return DecScaled(m_mant*right.m_mant,m_exp+right.m_exp);
+ }
+/*
+ const DecScaled operator/(const DecScaled& right) const
+ {
+ return DecScaled(m_mant/right.m_mant,m_ext-right.m_exp,blebleble_tojetezke);
+ }
+*/
+ bool operator==(const DecScaled& right) const
+ {
+ return m_mant==right.m_mant && m_exp==right.m_exp;
+ }
+
+ bool operator!=(const DecScaled& right) const
+ {
+ return m_mant!=right.m_mant || m_exp!=right.m_exp;
+ }
+
+ bool operator>(const DecScaled& right) const
+ {
+ long division = abs(m_exp-right.m_exp);
+ DecScaled a = *this;
+ DecScaled b = right;
+
+ if(a.m_exp>b.m_exp)
+ {
+ a.m_mant*=pow(10,division);
+ a.m_exp-=division;
+ }
+ else
+ {
+ b.m_mant*=pow(10,division);
+ b.m_exp-=division;
+ }
+
+ return a.m_mant>b.m_mant;
+ }
+
+ bool operator<(const DecScaled& right) const
+ {
+ long division = abs(m_exp-right.m_exp);
+ DecScaled a = *this;
+ DecScaled b = right;
+
+ if(a.m_exp>b.m_exp)
+ {
+ a.m_mant*=pow(10,division);
+ a.m_exp-=division;
+ }
+ else
+ {
+ b.m_mant*=pow(10,division);
+ b.m_exp-=division;
+ }
+
+ return a.m_mant<b.m_mant;
+ }
+}; // end of DecScaled class
+
+
+/**
+ * @brief class representing couple value-number and bracket
+ */
+template<class T>
+class MscIntervalCouple
+{
+private:
+ bool m_closed;
+ T m_value;
+
+public:
+ MscIntervalCouple():
+ m_closed(true),m_value(0)
+ {
+ }
+
+ MscIntervalCouple(const bool& b,const T& d): m_closed(b),m_value(d)
+ {
+ }
+
+ const bool& get_closed() const
+ {
+ return m_closed;
+ }
+
+ const T& get_value() const
+ {
+ return m_value;
+ }
+
+ void set_closed(const bool& closed)
+ {
+ m_closed = closed;
+ }
+
+ void set_value(const T& value)
+ {
+ m_value=value;
+ }
+
+ const MscIntervalCouple operator+(const MscIntervalCouple& right)
+ {
+ return MscIntervalCouple(m_closed&&right.m_closed,m_value+right.m_value);
+ }
+
+ const MscIntervalCouple operator-(const MscIntervalCouple& right)
+ {
+ return MscIntervalCouple(m_closed&&right.m_closed,m_value-right.m_value);
+ }
+
+ const MscIntervalCouple operator+(const T& value)
+ {
+ return MscIntervalCouple(m_closed,m_value+value);
+ }
+
+ const MscIntervalCouple operator-(const T& value)
+ {
+ return MscIntervalCouple(m_closed,m_value-value);
+ }
+
+ const MscIntervalCouple operator*(const T& value)
+ {
+ return MscIntervalCouple(m_closed,m_value*value);
+ }
+
+ MscIntervalCouple& operator=(const MscIntervalCouple& right)
+ {
+ if(this==&right)
+ return *this;
+ m_value = right.m_value;
+ m_closed = right.m_closed;
+ return *this;
+ }
+
+ MscIntervalCouple& operator=(const T& value)
+ {
+ m_value = value;
+ return *this;
+ }
+
+ MscIntervalCouple& operator=(const bool& b)
+ {
+ m_closed = b;
+ return *this;
+ }
+
+
+ MscIntervalCouple& operator+=(const MscIntervalCouple& right)
+ {
+ m_value+=right.m_value;
+ m_closed=right.m_closed && m_closed;
+ return *this;
+ }
+
+ MscIntervalCouple& operator-=(const MscIntervalCouple& right)
+ {
+ m_value-=right.m_value;
+ m_closed=right.m_closed && m_closed;
+ return *this;
+ }
+
+ MscIntervalCouple& operator+=(const T& value)
+ {
+ m_value+=value;
+ return *this;
+ }
+
+ MscIntervalCouple& operator-=(const T& value)
+ {
+ m_value-=value;
+ return *this;
+ }
+
+ /**
+ * Warning: does not bother with left and right couple
+ */
+ bool operator==(const MscIntervalCouple& right) const throw()
+ {
+ return m_value==right.m_value && m_closed==right.m_closed;
+ }
+
+ /**
+ * @warning: does not bother with left and right couple
+ */
+ bool operator!=(const MscIntervalCouple& right) const throw()
+ {
+ return !(m_value==right.m_value && m_closed==right.m_closed);
+ }
+
+ /**
+ * @warning bother about left and right
+ * @throw MscIntervalCoupleException in case it cant be decided
+ */
+ bool operator<(const MscIntervalCouple& right) const throw(MscIntervalCoupleException)
+ {
+ if(m_value!=right.m_value)
+ return m_value<right.m_value;
+
+ if(*this==right && m_closed)
+ return false;
+ else
+ throw MscIntervalCoupleException();
+
+ }
+
+ /**
+ * @warning bother about left and right
+ * @throw MscIntervalCoupleException in case it cant be decided
+ */
+ bool operator>(const MscIntervalCouple& right) const throw(MscIntervalCoupleException)
+ {
+ if(m_value!=right.m_value)
+ return m_value>right.m_value;
+
+ if(*this==right && m_closed)
+ return false;
+ else
+ throw MscIntervalCoupleException();
+ }
+
+/**
+ * @return smaller of two MscIntervalCouple
+ * @throw MscIntervalCoupleException
+ */
+static MscIntervalCouple&
+minimum(MscIntervalCouple& right,MscIntervalCouple& left) throw(MscIntervalCoupleException)
+{
+ return (right<left)?right:left;
+}
+
+/**
+ * @return bigger of two MscIntervalCouple
+ * @throw MscIntervalCoupleException
+ */
+static MscIntervalCouple&
+maximum(MscIntervalCouple& right,MscIntervalCouple& left) throw(MscIntervalCoupleException)
+{
+ return (right>left)?right:left;
+}
+
+
+};
+// end of MscIntervalCouple class
+
+
+/**
+ * @brief class representing Interval
+ */
+template<class T>
+class MscTimeInterval
+{
+private:
+ MscIntervalCouple<T> m_begin;
+ MscIntervalCouple<T> m_end;
+
+public:
+ MscTimeInterval()
+ {}
+
+ MscTimeInterval(T value):m_begin(true,value),m_end(true,value)
+ {
+ }
+
+ MscTimeInterval(T left_value, T right_value)
+ :m_begin(true,left_value),m_end(true,right_value)
+ {
+
+ }
+
+ MscTimeInterval(const bool& left_closed,const T& left_value,
+ const T& right_value,const bool& right_closed)
+ :m_begin(left_closed,left_value),m_end(right_closed,right_value)
+ {
+ }
+ MscTimeInterval(const MscIntervalCouple<T>& begin,
+ const MscIntervalCouple<T>& end)
+ :m_begin(begin),m_end(end)
+ {
+ }
+
+ MscIntervalCouple<T> get_begin() const
+ {
+ return m_begin;
+ }
+
+ T get_begin_value() const
+ {
+ return m_begin.get_value();
+ }
+
+ const bool& get_begin_closed() const
+ {
+ return m_begin.get_closed();
+ }
+
+
+ const MscIntervalCouple<T>& get_end() const
+ {
+ return m_end;
+ }
+
+ T get_end_value() const
+ {
+ return m_end.get_value();
+ }
+
+ const bool& get_end_closed() const
+ {
+ return m_end.get_closed();
+ }
+
+ void set(T left_value,T right_value)
+ {
+ m_begin=left_value;
+ m_end=right_value;
+ }
+
+ void set(bool& left,T& b,T& e,bool& right)
+ {
+ m_begin=b;
+ m_begin=left;
+ m_end=e;
+ m_end=right;
+ }
+
+ void set_begin(const MscIntervalCouple<T> begin)
+ {
+ m_begin=begin;
+ }
+
+ void set_begin_closed(const bool& b)
+ {
+ m_begin.set_closed(b);
+ }
+
+ void set_end(const MscIntervalCouple<T> end)
+ {
+ m_end=end;
+ }
+
+ void set_end_closed(const bool& b)
+ {
+ m_end.set_closed(b);
+ }
+
+ MscTimeInterval& operator=(const T& value)
+ {
+ m_begin=m_end=true;
+ m_begin=m_end=value;
+ return *this;
+ }
+
+ MscTimeInterval& operator=(const MscTimeInterval& right)
+ {
+ if(this==&right)
+ return *this;
+
+ m_begin=right.m_begin;
+ m_end=right.m_end;
+
+ return *this;
+ }
+
+ const MscTimeInterval operator+(const MscTimeInterval& right)
+ {
+ return MscTimeInterval(m_begin+right.m_begin,m_end+right.m_end);
+ }
+
+ const MscTimeInterval operator+(const T& value)
+ {
+ return MscTimeInterval(m_begin+value,m_end+value);
+ }
+
+ const MscTimeInterval operator-(const MscTimeInterval& right)
+ {
+ return MscTimeInterval(m_begin-right.m_begin,m_end-right.m_end);
+ }
+
+ const MscTimeInterval operator-(const T& value)
+ {
+ return MscTimeInterval(m_begin-value,m_end-value);
+ }
+
+ const MscTimeInterval operator*(const T& value)
+ {
+ return MscTimeInterval(m_begin*value,m_end*value);
+ }
+
+ bool operator==(const MscTimeInterval& right) const
+ {
+ if(this==&right)
+ return true;
+ return (m_begin==right.m_begin)&&(m_end==right.m_end);
+ }
+
+ bool operator!=(const MscTimeInterval& right) const
+ {
+ return !((m_begin==right.m_begin)&&(m_end==right.m_end));
+ }
+
+ bool is_valid()
+ {
+ try
+ {
+ if(m_begin>m_end)
+ return false;
+ }
+ catch(MscIntervalCoupleException)
+ {
+ return false;
+ }
+ if(m_begin==m_end)
+ return m_begin.get_closed();
+ else
+ return true;
+ }
+
+ void set_empty()
+ {
+ set(1,0);
+ }
+
+
+/**
+ * \brief intersection of two interval
+ * @returns intersection of two intervals
+ * @warning returned interval does have to be valid, is_valid() may return false, CHECK FOR VALIDITY
+ */
+
+static MscTimeInterval interval_intersection(MscTimeInterval& left,MscTimeInterval& right) {
+ MscIntervalCouple<T> begin;
+ try
+ {
+ begin = MscIntervalCouple<T>::maximum(left.m_begin,right.m_begin);
+ }
+ catch(MscIntervalCoupleException){
+ begin = left.m_begin.get_value();
+ begin = false;
+ }
+ MscIntervalCouple<T> end;
+ try
+ {
+ end = MscIntervalCouple<T>::minimum(left.m_end,right.m_end);
+ }
+ catch(MscIntervalCoupleException){
+ end = left.m_end.get_value();
+ end = false;
+ }
+
+ return MscTimeInterval(begin,end);
+}
+
+/**
+ * \brief union of two interval
+ * @returns intersection of two intervals if they have intersection, else return empty interval;
+ * @warning CHECK if the returned interval is not empty!!!
+ */
+
+static MscTimeInterval interval_union(MscTimeInterval& left,MscTimeInterval& right) {
+ // check if they have intersection if not return empty interval
+ if(!interval_intersection(left,right).is_valid())
+ {
+ MscTimeInterval a;
+ a.set_empty();
+ return a;
+ }
+ MscIntervalCouple<T> begin;
+ try
+ {
+ begin = MscIntervalCouple<T>::minimum(left.m_begin,right.m_begin);
+ }
+ catch(MscIntervalCoupleException){
+ begin = left.m_begin.get_value();
+ begin = true;
+ }
+ MscIntervalCouple<T> end;
+ try
+ {
+ end = MscIntervalCouple<T>::maximum(left.m_end,right.m_end);
+ }
+ catch(MscIntervalCoupleException)
+ {
+ end = left.m_end.get_value();
+ end = true;
+ }
+
+ return MscTimeInterval(begin,end);
+}
+
+ friend std::ostream&
+ operator<<(std::ostream& os, const MscTimeInterval<T> interval)
+ {
+ if(interval.get_begin_closed())
+ os << "[";
+ else
+ os << "(";
+ os << interval.get_begin_value();
+ os << ",";
+ os << interval.get_end_value();
+ if(interval.get_end_closed())
+ os << "]";
+ else
+ os << ")";
+ return os;
+ }
+
+}; //end of MscTimeInterval class
+
+template class MscTimeInterval<double>;
+template class MscTimeInterval<DecScaled>;
+
+/**
+ * \brief List of intervals
+ * Keeping sorted list of intervals, dont have intersection
+ */
+template<class T>
+class MscTimeIntervalSet
+{
+private:
+ std::list< MscTimeInterval<T> > m_set;
+
+public:
+ MscTimeInterval<T> insert(const MscTimeInterval<T>& interval)
+ {
+ MscTimeInterval<T> tmp(interval);
+
+ //in case of empty list
+ if(m_set.empty())
+ {
+ m_set.push_back(interval);
+ return m_set.front();
+ }
+
+ typename std::list <MscTimeInterval<T> >::iterator it;
+ for(it=m_set.begin();it!=m_set.end();it++)
+ {
+ try
+ {
+ if(interval.get_begin()<it->get_begin()
+ || interval.get_begin()==it->get_begin())
+ {
+ break;
+ }
+ }
+ catch(MscIntervalCoupleException)
+ {
+ // it closed false
+ // tmp closed true
+ if(tmp.get_begin_closed())
+ break;
+ // it closed true
+ // tmp closed false
+ if(it->get_begin_closed())
+ {
+ tmp.set_begin_closed(true);
+ break;
+ }
+ // it closed false
+ // tmp closed false
+ break;
+ }
+
+ try
+ {
+ if(tmp.get_begin()<it->get_end()
+ || tmp.get_begin()==it->get_end())
+ {
+ tmp.set_begin(it->get_begin());
+ break;
+ }
+ }
+ catch(MscIntervalCoupleException)
+ {
+ if(!tmp.get_begin_closed()&&!it->get_end_closed())
+ {
+ it++;
+ break;
+ }
+ tmp.set_begin(it->get_begin());
+ break;
+ }
+ }
+
+ typename std::list <MscTimeInterval<T> >::iterator it2;
+ it2=it;
+ for(;it2!=m_set.end();m_set.erase(it2++))
+ {
+ try
+ {
+ if(tmp.get_end()<it2->get_begin())
+ {
+ m_set.insert(it2,tmp);
+ return tmp;
+ }
+ if(interval.get_end()==it2->get_begin())
+ {
+ tmp.set_end(it2->get_end());
+ m_set.insert(it2,tmp);
+ m_set.erase(it2);
+ return tmp;
+ }
+ }
+ catch(MscIntervalCoupleException)
+ {
+ if(!tmp.get_end_closed()&&!it2->get_begin_closed())
+ {
+ m_set.insert(it2,tmp);
+ return tmp;
+ }
+
+ tmp.set_end(it2->get_end());
+ m_set.insert(it2,tmp);
+ m_set.erase(it2);
+ return tmp;
+ }
+
+ try
+ {
+ if(interval.get_end()<it2->get_end())
+ {
+ tmp.set_end(it2->get_end());
+ m_set.insert(it2,tmp);
+ m_set.erase(it2);
+ return tmp;
+ }
+ if(interval.get_end()==it2->get_end())
+ {
+ m_set.insert(it2,tmp);
+ m_set.erase(it2);
+ return tmp;
+ }
+ }
+ catch(MscIntervalCoupleException)
+ {
+ if(!tmp.get_end_closed()&&!it2->get_end_closed())
+ {
+ m_set.insert(it2,tmp);
+ m_set.erase(it2);
+ return tmp;
+ }
+
+ tmp.set_end_closed(true);
+ m_set.insert(it2,tmp);
+ m_set.erase(it2);
+ return tmp;
+ }
+ }
+
+ if(it2==m_set.end())
+ {
+ m_set.push_back(tmp);
+ return tmp;
+ }
+ }
+
+ friend std::ostream&
+ operator<<(std::ostream& os, const MscTimeIntervalSet<T> interval)
+ {
+ if(interval.m_set.empty())
+ return os << "";
+ std::list <MscTimeInterval<T> > set;
+ set=interval.m_set;
+ typename std::list <MscTimeInterval<T> >::iterator it;
+ for(it=set.begin();it!=set.end();it++)
+ {
+ os << *it << " ";
+ }
+ return os;
+ }
+
+
+};
+
+template class MscTimeIntervalSet<double>;
+//template class MscTimeIntervalSet<DecScaled>;
+
+
+#endif // _TIME_H_
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2009-04-14 08:18:04 UTC (rev 216)
+++ trunk/tests/CMakeLists.txt 2009-04-14 13:22:47 UTC (rev 217)
@@ -80,4 +80,11 @@
ADD_TEST(z120-02 z120_test z120_test02.mpr)
ENDIF(ANTLR_FOUND)
+ADD_EXECUTABLE(decimal_test
+ decimal_test.cpp
+)
+ADD_EXECUTABLE(interval_test
+ interval_test.cpp
+)
+ADD_TEST(decimal_test interval_test)
# $Id$
Added: trunk/tests/decimal_test.cpp
===================================================================
--- trunk/tests/decimal_test.cpp (rev 0)
+++ trunk/tests/decimal_test.cpp 2009-04-14 13:22:47 UTC (rev 217)
@@ -0,0 +1,42 @@
+#include<cassert>
+
+#include"data/time.h"
+
+int main()
+{
+ // Constructor
+ DecScaled dec1(50,1);
+ DecScaled dec2(5,2);
+ assert(dec1==dec2);
+
+
+ DecScaled dec3(1,0);
+ DecScaled dec4(1,0);
+ DecScaled dec5(1,3);
+ DecScaled dec6(123,5);
+ DecScaled dec7(23000000432,-4);
+ DecScaled dec8(146000000432,-4);
+ DecScaled dec9(1,0);
+
+ // addition
+ dec3 = dec2+dec1;
+ dec4 = dec1+dec2;
+ dec9=dec6+dec7;
+
+ assert(dec9==dec8);
+ assert(dec3==dec4);
+ assert(dec3==dec5);
+
+ // subtraction
+ dec5=dec3-dec1;
+ assert((dec3-dec1)==dec2);
+ assert((dec1-dec3)==-dec2);
+
+ // multiplication
+ DecScaled dec_m1(25,-3);
+ DecScaled dec_m2(25,-3);
+
+
+ return 0;
+}
+
Added: trunk/tests/interval_test.cpp
===================================================================
--- trunk/tests/interval_test.cpp (rev 0)
+++ trunk/tests/interval_test.cpp 2009-04-14 13:22:47 UTC (rev 217)
@@ -0,0 +1,106 @@
+#include<cassert>
+
+
+#include "data/time.h"
+
+int main()
+{
+ /* MscIntervalCouple */
+ MscIntervalCouple<double> couple1(true,9);
+ MscIntervalCouple<double> couple2(true,10);
+ MscIntervalCouple<double> couple3(true,9);
+
+ assert(couple1<couple2);
+ assert(!(couple1<couple3));
+
+ couple3.set_closed(false);
+ try {
+ couple1<couple3;
+ assert(false);
+ }
+ catch(MscIntervalCoupleException ex)
+ {
+ }
+
+ assert(couple1==MscIntervalCouple<double>::minimum(couple1,couple2));
+ assert(couple2==MscIntervalCouple<double>::maximum(couple1,couple2));
+
+ MscIntervalCouple<double> couple4(false,0);
+ couple4=couple1+couple2;
+ assert(couple4.get_closed());
+ assert(couple4.get_value()==19);
+
+ couple3.set_value(98);
+ couple4=couple1+couple3;
+ assert(!couple4.get_closed());
+ assert(couple4.get_value()==107);
+
+ /* MscTimeInterval */
+ MscTimeInterval<double> interval2(10);
+ MscTimeInterval<double> interval3(14,15);
+ MscTimeInterval<double> interval4(9,15);
+ MscTimeInterval<double> interval6(false,14,15,false);
+ MscTimeInterval<double> interval9(14);
+ MscTimeInterval<double> interval11(couple1,couple2);
+
+ assert(10==interval2.get_begin_value());
+ assert(10==interval2.get_end_value());
+ assert(14==interval3.get_begin_value());
+ assert(15==interval3.get_end_value());
+
+ MscTimeInterval<double> interval;
+ interval = interval2+interval3;
+ assert(24==interval.get_begin_value());
+ assert(25==interval.get_end_value());
+
+ MscTimeInterval<double> interval5;
+ MscTimeInterval<double> interval7;
+ MscTimeInterval<double> interval8;
+ MscTimeInterval<double> interval10;
+
+ interval5 = MscTimeInterval<double>::interval_intersection(interval3,interval4);
+ interval7 = MscTimeInterval<double>::interval_intersection(interval4,interval3);
+ interval8 = MscTimeInterval<double>::interval_intersection(interval4,interval6);
+ assert(interval5.is_valid());
+ assert(interval5==interval7);
+ assert(interval7==interval5);
+ assert(14==interval5.get_begin_value());
+ assert(15==interval5.get_end_value());
+
+ assert(interval5.get_begin_closed());
+ assert(interval5.get_end_closed());
+
+
+ assert(interval7!=interval8);
+ assert(interval7.get_begin_value()==interval8.get_begin_value());
+ assert(interval7.get_end_value()==interval8.get_end_value());
+ assert(!interval8.get_begin_closed());
+ assert(!interval8.get_end_closed());
+
+ interval10 = MscTimeInterval<double>::interval_intersection(interval9,interval6);
+ assert(!interval10.is_valid());
+ interval10 = MscTimeInterval<double>::interval_intersection(interval9,interval3);
+ assert(interval10.is_valid());
+ assert(interval10==interval9);
+
+ interval10 = interval10*3;
+ assert(42==interval10.get_begin_value());
+ assert(42==interval10.get_end_value());
+ assert(interval10.get_begin_closed());
+ assert(interval10.get_end_closed());
+
+
+ MscTimeInterval<double> inter1(10,18);
+ MscTimeInterval<double> inter2(4,11);
+ MscTimeInterval<double> inter3(4,9);
+
+ interval10 = MscTimeInterval<double>::interval_union(inter1,inter2);
+ assert(interval10.is_valid());
+ assert(4==interval10.get_begin_value());
+ assert(18==interval10.get_end_value());
+
+ interval10 = MscTimeInterval<double>::interval_union(inter1,inter3);
+ assert(!interval10.is_valid());
+
+ return 0;
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2009-04-14 13:55:55
|
Revision: 218
http://scstudio.svn.sourceforge.net/scstudio/?rev=218&view=rev
Author: gotthardp
Date: 2009-04-14 13:55:52 +0000 (Tue, 14 Apr 2009)
Log Message:
-----------
Fixed properties. Fixed long long literals.
Modified Paths:
--------------
trunk/src/check/boundedness/universal_boundedness_checker.h
trunk/src/data/time.h
trunk/tests/decimal_test.cpp
Property Changed:
----------------
trunk/src/data/time.h
trunk/tests/decimal_test.cpp
trunk/tests/interval_test.cpp
Modified: trunk/src/check/boundedness/universal_boundedness_checker.h
===================================================================
--- trunk/src/check/boundedness/universal_boundedness_checker.h 2009-04-14 13:22:47 UTC (rev 217)
+++ trunk/src/check/boundedness/universal_boundedness_checker.h 2009-04-14 13:55:52 UTC (rev 218)
@@ -214,4 +214,4 @@
};
-// $Id$
\ No newline at end of file
+// $Id$
Modified: trunk/src/data/time.h
===================================================================
--- trunk/src/data/time.h 2009-04-14 13:22:47 UTC (rev 217)
+++ trunk/src/data/time.h 2009-04-14 13:55:52 UTC (rev 218)
@@ -13,7 +13,7 @@
*
* Copyright (c) 2008
*
- * $Id:
+ * $Id$
*/
#ifndef _TIME_H_
@@ -811,3 +811,5 @@
#endif // _TIME_H_
+
+// $Id$
Property changes on: trunk/src/data/time.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/tests/decimal_test.cpp
===================================================================
--- trunk/tests/decimal_test.cpp 2009-04-14 13:22:47 UTC (rev 217)
+++ trunk/tests/decimal_test.cpp 2009-04-14 13:55:52 UTC (rev 218)
@@ -14,8 +14,8 @@
DecScaled dec4(1,0);
DecScaled dec5(1,3);
DecScaled dec6(123,5);
- DecScaled dec7(23000000432,-4);
- DecScaled dec8(146000000432,-4);
+ DecScaled dec7(23000000432LL,-4);
+ DecScaled dec8(146000000432LL,-4);
DecScaled dec9(1,0);
// addition
Property changes on: trunk/tests/decimal_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/tests/interval_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <koc...@us...> - 2009-04-15 22:36:46
|
Revision: 221
http://scstudio.svn.sourceforge.net/scstudio/?rev=221&view=rev
Author: kocianon
Date: 2009-04-15 22:36:36 +0000 (Wed, 15 Apr 2009)
Log Message:
-----------
return in MscTimeIntervalSet fixed, some comments were added,operators, removed assert from tests
Modified Paths:
--------------
trunk/src/data/time.h
trunk/tests/decimal_test.cpp
trunk/tests/interval_test.cpp
Modified: trunk/src/data/time.h
===================================================================
--- trunk/src/data/time.h 2009-04-15 20:46:42 UTC (rev 220)
+++ trunk/src/data/time.h 2009-04-15 22:36:36 UTC (rev 221)
@@ -25,6 +25,8 @@
#include<list>
#include<cstdlib>
#include<iostream>
+#define FOR_LIST(list,it) for(it=list.begin();it!=list.end();it++)
+#define ITERATOR_LIST(type,it) typename std::list<type >::iterator it
#if defined(_MSC_VER)
// Visual C++ does not support functions declared using exception specification.
@@ -32,7 +34,7 @@
#endif
/*
-class MscIntervalCoupleException;
+class MscIntervalCoupleUncomparable;
class MscIntervalCouple;
class MscTimeInterval;
class DecScaled;
@@ -60,7 +62,7 @@
return t;
}
-class MscIntervalCoupleException:public std::exception
+class MscIntervalCoupleUncomparable:public std::exception
{
public:
@@ -81,6 +83,7 @@
long m_exp; // exponent
long m_mant; // significand, coefficient or mantissa
+ // keeps number aligned to the right
void tidy()
{
while(m_mant%10==0)
@@ -341,7 +344,7 @@
}
/**
- * Warning: does not bother with left and right couple
+ * @warning: does not bother with left and right couple
*/
bool operator==(const MscIntervalCouple& right) const throw()
{
@@ -358,9 +361,9 @@
/**
* @warning bother about left and right
- * @throw MscIntervalCoupleException in case it cant be decided
+ * @throw MscIntervalCoupleUncomparable in case it cant be decided
*/
- bool operator<(const MscIntervalCouple& right) const throw(MscIntervalCoupleException)
+ bool operator<(const MscIntervalCouple& right) const throw(MscIntervalCoupleUncomparable)
{
if(m_value!=right.m_value)
return m_value<right.m_value;
@@ -368,15 +371,15 @@
if(*this==right && m_closed)
return false;
else
- throw MscIntervalCoupleException();
+ throw MscIntervalCoupleUncomparable();
}
/**
* @warning bother about left and right
- * @throw MscIntervalCoupleException in case it cant be decided
+ * @throw MscIntervalCoupleUncomparable in case it cant be decided
*/
- bool operator>(const MscIntervalCouple& right) const throw(MscIntervalCoupleException)
+ bool operator>(const MscIntervalCouple& right) const throw(MscIntervalCoupleUncomparable)
{
if(m_value!=right.m_value)
return m_value>right.m_value;
@@ -384,25 +387,25 @@
if(*this==right && m_closed)
return false;
else
- throw MscIntervalCoupleException();
+ throw MscIntervalCoupleUncomparable();
}
/**
* @return smaller of two MscIntervalCouple
- * @throw MscIntervalCoupleException
+ * @throw MscIntervalCoupleUncomparable
*/
static MscIntervalCouple&
-minimum(MscIntervalCouple& right,MscIntervalCouple& left) throw(MscIntervalCoupleException)
+minimum(MscIntervalCouple& right,MscIntervalCouple& left) throw(MscIntervalCoupleUncomparable)
{
return (right<left)?right:left;
}
/**
* @return bigger of two MscIntervalCouple
- * @throw MscIntervalCoupleException
+ * @throw MscIntervalCoupleUncomparable
*/
static MscIntervalCouple&
-maximum(MscIntervalCouple& right,MscIntervalCouple& left) throw(MscIntervalCoupleException)
+maximum(MscIntervalCouple& right,MscIntervalCouple& left) throw(MscIntervalCoupleUncomparable)
{
return (right>left)?right:left;
}
@@ -540,9 +543,13 @@
return MscTimeInterval(m_begin+value,m_end+value);
}
+ /**
+ * @warning: inteval minus
+ * (a,b) - (c,d) = (a-d, b-c)
+ */
const MscTimeInterval operator-(const MscTimeInterval& right)
{
- return MscTimeInterval(m_begin-right.m_begin,m_end-right.m_end);
+ return MscTimeInterval(m_begin-right.m_end,m_end-right.m_begin);
}
const MscTimeInterval operator-(const T& value)
@@ -574,7 +581,7 @@
if(m_begin>m_end)
return false;
}
- catch(MscIntervalCoupleException)
+ catch(MscIntervalCoupleUncomparable)
{
return false;
}
@@ -602,7 +609,7 @@
{
begin = MscIntervalCouple<T>::maximum(left.m_begin,right.m_begin);
}
- catch(MscIntervalCoupleException){
+ catch(MscIntervalCoupleUncomparable){
begin = left.m_begin.get_value();
begin = false;
}
@@ -611,7 +618,7 @@
{
end = MscIntervalCouple<T>::minimum(left.m_end,right.m_end);
}
- catch(MscIntervalCoupleException){
+ catch(MscIntervalCoupleUncomparable){
end = left.m_end.get_value();
end = false;
}
@@ -638,7 +645,7 @@
{
begin = MscIntervalCouple<T>::minimum(left.m_begin,right.m_begin);
}
- catch(MscIntervalCoupleException){
+ catch(MscIntervalCoupleUncomparable){
begin = left.m_begin.get_value();
begin = true;
}
@@ -647,7 +654,7 @@
{
end = MscIntervalCouple<T>::maximum(left.m_end,right.m_end);
}
- catch(MscIntervalCoupleException)
+ catch(MscIntervalCoupleUncomparable)
{
end = left.m_end.get_value();
end = true;
@@ -688,7 +695,18 @@
private:
std::list< MscTimeInterval<T> > m_set;
-public:
+public:
+ MscTimeIntervalSet(){}
+
+ MscTimeIntervalSet(const MscTimeIntervalSet& set):m_set(set.m_set)
+ {
+ }
+
+ /**
+ *\brief inserts interval to the list on the right possition
+ * find the right place in the list for m_begin and eats all
+ * the interval on the way to the right place of m_end
+ */
MscTimeInterval<T> insert(const MscTimeInterval<T>& interval)
{
MscTimeInterval<T> tmp(interval);
@@ -699,10 +717,11 @@
m_set.push_back(interval);
return m_set.front();
}
-
+ // Dealing with the right place for m_begin
typename std::list <MscTimeInterval<T> >::iterator it;
for(it=m_set.begin();it!=m_set.end();it++)
{
+ // interval.m_begin x it->m_begin
try
{
if(interval.get_begin()<it->get_begin()
@@ -711,7 +730,7 @@
break;
}
}
- catch(MscIntervalCoupleException)
+ catch(MscIntervalCoupleUncomparable)
{
// it closed false
// tmp closed true
@@ -728,7 +747,7 @@
// tmp closed false
break;
}
-
+ // interval.m_begin x it->m_end
try
{
if(tmp.get_begin()<it->get_end()
@@ -738,7 +757,7 @@
break;
}
}
- catch(MscIntervalCoupleException)
+ catch(MscIntervalCoupleUncomparable)
{
if(!tmp.get_begin_closed()&&!it->get_end_closed())
{
@@ -748,12 +767,15 @@
tmp.set_begin(it->get_begin());
break;
}
- }
+ } // end of for
+ // Dealing with the end of interval
typename std::list <MscTimeInterval<T> >::iterator it2;
- it2=it;
+ it2=it; // keeping position iterator, just in case
+
for(;it2!=m_set.end();m_set.erase(it2++))
{
+ // interval.m_end x it2->m_begin
try
{
if(tmp.get_end()<it2->get_begin())
@@ -769,7 +791,7 @@
return tmp;
}
}
- catch(MscIntervalCoupleException)
+ catch(MscIntervalCoupleUncomparable)
{
if(!tmp.get_end_closed()&&!it2->get_begin_closed())
{
@@ -783,6 +805,7 @@
return tmp;
}
+ // interval.m_end x it2->m_end
try
{
if(interval.get_end()<it2->get_end())
@@ -799,7 +822,7 @@
return tmp;
}
}
- catch(MscIntervalCoupleException)
+ catch(MscIntervalCoupleUncomparable)
{
if(!tmp.get_end_closed()&&!it2->get_end_closed())
{
@@ -815,15 +838,51 @@
}
}
- if(it2==m_set.end())
- {
+ // it2==m_set.end()
m_set.push_back(tmp);
return tmp;
+ }
+
+ const MscTimeIntervalSet<T> operator+(MscTimeIntervalSet<T>& set)
+ {
+ MscTimeIntervalSet<T> new_set;
+ ITERATOR_LIST(MscTimeInterval<T>,it);
+ ITERATOR_LIST(MscTimeInterval<T>,it2);
+ FOR_LIST(m_set,it)
+ {
+ FOR_LIST(set.m_set,it2)
+ {
+ new_set.insert(*it+*it2);
+ }
}
- // FIXME: return what?
+ return new_set;
}
+
+ const MscTimeIntervalSet<T> operator-(MscTimeIntervalSet<T>& set)
+ {
+ MscTimeIntervalSet<T> new_set;
+ ITERATOR_LIST(MscTimeInterval<T>,it);
+ ITERATOR_LIST(MscTimeInterval<T>,it2);
+ FOR_LIST(m_set,it)
+ {
+ FOR_LIST(set.m_set,it2)
+ {
+ new_set.insert(*it-*it2);
+ }
+ }
+ return new_set;
+ }
+
+ const MscTimeIntervalSet<T>& operator=(const MscTimeIntervalSet<T>& set)
+ {
+ if(this==&set)
+ return *this;
+ m_set=set.m_set;
+ return *this;
+ }
+
friend std::ostream&
operator<<(std::ostream& os, const MscTimeIntervalSet<T> interval)
{
@@ -841,7 +900,7 @@
};
template class MscTimeIntervalSet<double>;
-//template class MscTimeIntervalSet<DecScaled>;
+template class MscTimeIntervalSet<DecScaled>;
#endif // _TIME_H_
Modified: trunk/tests/decimal_test.cpp
===================================================================
--- trunk/tests/decimal_test.cpp 2009-04-15 20:46:42 UTC (rev 220)
+++ trunk/tests/decimal_test.cpp 2009-04-15 22:36:36 UTC (rev 221)
@@ -1,13 +1,18 @@
-#include<cassert>
-
#include"data/time.h"
+#define TEST_ASSERT(x) if(!(x)) \
+{ \
+ std::cerr << __FILE__ \
+ << ": Assertion " #x " failed on line " \
+ << __LINE__ << std::endl; return 1; \
+}
+
int main()
{
// Constructor
DecScaled dec1(50,1);
DecScaled dec2(5,2);
- assert(dec1==dec2);
+ TEST_ASSERT(dec1==dec2);
DecScaled dec3(1,0);
@@ -23,14 +28,14 @@
dec4 = dec1+dec2;
dec9=dec6+dec7;
- assert(dec9==dec8);
- assert(dec3==dec4);
- assert(dec3==dec5);
+ TEST_ASSERT(dec9==dec8);
+ TEST_ASSERT(dec3==dec4);
+ TEST_ASSERT(dec3==dec5);
// subtraction
dec5=dec3-dec1;
- assert((dec3-dec1)==dec2);
- assert((dec1-dec3)==-dec2);
+ TEST_ASSERT((dec3-dec1)==dec2);
+ TEST_ASSERT((dec1-dec3)==-dec2);
// multiplication
DecScaled dec_m1(25,-3);
Modified: trunk/tests/interval_test.cpp
===================================================================
--- trunk/tests/interval_test.cpp 2009-04-15 20:46:42 UTC (rev 220)
+++ trunk/tests/interval_test.cpp 2009-04-15 22:36:36 UTC (rev 221)
@@ -1,8 +1,12 @@
-#include<cassert>
+#include "data/time.h"
+#define TEST_ASSERT(x) if(!(x)) \
+{ \
+ std::cerr << __FILE__ \
+ << ": Assertion " #x " failed on line " \
+ << __LINE__ << std::endl; return 1; \
+}
-#include "data/time.h"
-
int main()
{
/* MscIntervalCouple */
@@ -10,31 +14,29 @@
MscIntervalCouple<double> couple2(true,10);
MscIntervalCouple<double> couple3(true,9);
- assert(couple1<couple2);
- assert(!(couple1<couple3));
+ TEST_ASSERT(couple1<couple2)
+ TEST_ASSERT(!(couple1<couple3))
couple3.set_closed(false);
try {
couple1<couple3;
- assert(false);
+ TEST_ASSERT(false)
}
- catch(MscIntervalCoupleException ex)
+ catch(MscIntervalCoupleUncomparable ex)
{
}
+ TEST_ASSERT(couple1==MscIntervalCouple<double>::minimum(couple1,couple2))
+ TEST_ASSERT(couple2==MscIntervalCouple<double>::maximum(couple1,couple2))
- assert(couple1==MscIntervalCouple<double>::minimum(couple1,couple2));
- assert(couple2==MscIntervalCouple<double>::maximum(couple1,couple2));
-
MscIntervalCouple<double> couple4(false,0);
couple4=couple1+couple2;
- assert(couple4.get_closed());
- assert(couple4.get_value()==19);
+ TEST_ASSERT(couple4.get_closed())
+ TEST_ASSERT(couple4.get_value()==19)
couple3.set_value(98);
couple4=couple1+couple3;
- assert(!couple4.get_closed());
- assert(couple4.get_value()==107);
-
+ TEST_ASSERT(!couple4.get_closed())
+ TEST_ASSERT(couple4.get_value()==107)
/* MscTimeInterval */
MscTimeInterval<double> interval2(10);
MscTimeInterval<double> interval3(14,15);
@@ -43,15 +45,15 @@
MscTimeInterval<double> interval9(14);
MscTimeInterval<double> interval11(couple1,couple2);
- assert(10==interval2.get_begin_value());
- assert(10==interval2.get_end_value());
- assert(14==interval3.get_begin_value());
- assert(15==interval3.get_end_value());
+ TEST_ASSERT(10==interval2.get_begin_value())
+ TEST_ASSERT(10==interval2.get_end_value())
+ TEST_ASSERT(14==interval3.get_begin_value())
+ TEST_ASSERT(15==interval3.get_end_value())
MscTimeInterval<double> interval;
interval = interval2+interval3;
- assert(24==interval.get_begin_value());
- assert(25==interval.get_end_value());
+ TEST_ASSERT(24==interval.get_begin_value())
+ TEST_ASSERT(25==interval.get_end_value())
MscTimeInterval<double> interval5;
MscTimeInterval<double> interval7;
@@ -61,33 +63,33 @@
interval5 = MscTimeInterval<double>::interval_intersection(interval3,interval4);
interval7 = MscTimeInterval<double>::interval_intersection(interval4,interval3);
interval8 = MscTimeInterval<double>::interval_intersection(interval4,interval6);
- assert(interval5.is_valid());
- assert(interval5==interval7);
- assert(interval7==interval5);
- assert(14==interval5.get_begin_value());
- assert(15==interval5.get_end_value());
+ TEST_ASSERT(interval5.is_valid())
+ TEST_ASSERT(interval5==interval7)
+ TEST_ASSERT(interval7==interval5)
+ TEST_ASSERT(14==interval5.get_begin_value())
+ TEST_ASSERT(15==interval5.get_end_value())
- assert(interval5.get_begin_closed());
- assert(interval5.get_end_closed());
+ TEST_ASSERT(interval5.get_begin_closed())
+ TEST_ASSERT(interval5.get_end_closed())
- assert(interval7!=interval8);
- assert(interval7.get_begin_value()==interval8.get_begin_value());
- assert(interval7.get_end_value()==interval8.get_end_value());
- assert(!interval8.get_begin_closed());
- assert(!interval8.get_end_closed());
+ TEST_ASSERT(interval7!=interval8)
+ TEST_ASSERT(interval7.get_begin_value()==interval8.get_begin_value())
+ TEST_ASSERT(interval7.get_end_value()==interval8.get_end_value())
+ TEST_ASSERT(!interval8.get_begin_closed())
+ TEST_ASSERT(!interval8.get_end_closed())
interval10 = MscTimeInterval<double>::interval_intersection(interval9,interval6);
- assert(!interval10.is_valid());
+ TEST_ASSERT(!interval10.is_valid())
interval10 = MscTimeInterval<double>::interval_intersection(interval9,interval3);
- assert(interval10.is_valid());
- assert(interval10==interval9);
+ TEST_ASSERT(interval10.is_valid())
+ TEST_ASSERT(interval10==interval9)
interval10 = interval10*3;
- assert(42==interval10.get_begin_value());
- assert(42==interval10.get_end_value());
- assert(interval10.get_begin_closed());
- assert(interval10.get_end_closed());
+ TEST_ASSERT(42==interval10.get_begin_value())
+ TEST_ASSERT(42==interval10.get_end_value())
+ TEST_ASSERT(interval10.get_begin_closed())
+ TEST_ASSERT(interval10.get_end_closed())
MscTimeInterval<double> inter1(10,18);
@@ -95,12 +97,11 @@
MscTimeInterval<double> inter3(4,9);
interval10 = MscTimeInterval<double>::interval_union(inter1,inter2);
- assert(interval10.is_valid());
- assert(4==interval10.get_begin_value());
- assert(18==interval10.get_end_value());
+ TEST_ASSERT(interval10.is_valid())
+ TEST_ASSERT(4==interval10.get_begin_value())
+ TEST_ASSERT(18==interval10.get_end_value())
interval10 = MscTimeInterval<double>::interval_union(inter1,inter3);
- assert(!interval10.is_valid());
-
+ TEST_ASSERT(!interval10.is_valid())
return 0;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <koc...@us...> - 2009-04-19 20:45:42
|
Revision: 224
http://scstudio.svn.sourceforge.net/scstudio/?rev=224&view=rev
Author: kocianon
Date: 2009-04-19 20:45:31 +0000 (Sun, 19 Apr 2009)
Log Message:
-----------
new interval set operation, test
Modified Paths:
--------------
trunk/src/data/time.h
trunk/tests/CMakeLists.txt
Added Paths:
-----------
trunk/tests/interval_set_test.cpp
Modified: trunk/src/data/time.h
===================================================================
--- trunk/src/data/time.h 2009-04-19 18:25:38 UTC (rev 223)
+++ trunk/src/data/time.h 2009-04-19 20:45:31 UTC (rev 224)
@@ -25,8 +25,6 @@
#include<list>
#include<cstdlib>
#include<iostream>
-#define FOR_LIST(list,it) for(it=list.begin();it!=list.end();it++)
-#define ITERATOR_LIST(type,it) typename std::list<type >::iterator it
#if defined(_MSC_VER)
// Visual C++ does not support functions declared using exception specification.
@@ -603,7 +601,9 @@
* @warning returned interval does have to be valid, is_valid() may return false, CHECK FOR VALIDITY
*/
-static MscTimeInterval interval_intersection(MscTimeInterval& left,MscTimeInterval& right) {
+static MscTimeInterval interval_intersection(MscTimeInterval& left,
+ MscTimeInterval& right)
+{
MscIntervalCouple<T> begin;
try
{
@@ -632,7 +632,9 @@
* @warning CHECK if the returned interval is not empty!!!
*/
-static MscTimeInterval interval_union(MscTimeInterval& left,MscTimeInterval& right) {
+static MscTimeInterval interval_union(MscTimeInterval& left,
+ MscTimeInterval& right)
+{
// check if they have intersection if not return empty interval
if(!interval_intersection(left,right).is_valid())
{
@@ -662,7 +664,38 @@
return MscTimeInterval(begin,end);
}
+/**
+ *@brief return max(begins) and max(ends) Interval
+ * Takes two itervals (a,b) (c,d) and returns Inerval(max(a,c),max(b,d))
+ */
+static MscTimeInterval components_max(MscTimeInterval left,
+ MscTimeInterval right)
+{
+ MscIntervalCouple<T> begin;
+ MscIntervalCouple<T> end;
+ try
+ {
+ begin = MscIntervalCouple<T>::maximum(left.m_begin,right.m_begin);
+ }
+ catch(MscIntervalCoupleUncomparable)
+ {
+ begin = left.m_begin.get_value();
+ begin = false;
+ }
+ try
+ {
+ end = MscIntervalCouple<T>::maximum(left.m_end,right.m_end);
+ }
+ catch(MscIntervalCoupleUncomparable)
+ {
+ end = left.m_end.get_value();
+ end = true;
+ }
+
+ return MscTimeInterval(begin,end);
+}
+
friend std::ostream&
operator<<(std::ostream& os, const MscTimeInterval<T> interval)
{
@@ -846,11 +879,12 @@
const MscTimeIntervalSet<T> operator+(MscTimeIntervalSet<T>& set)
{
MscTimeIntervalSet<T> new_set;
- ITERATOR_LIST(MscTimeInterval<T>,it);
- ITERATOR_LIST(MscTimeInterval<T>,it2);
- FOR_LIST(m_set,it)
+ typename std::list<MscTimeInterval<T> >::iterator it;
+ typename std::list<MscTimeInterval<T> >::iterator it2;
+
+ for(it=m_set.begin();it!=m_set.end();it++)
{
- FOR_LIST(set.m_set,it2)
+ for(it2=set.m_set.begin();it2!=set.m_set.end();it2++)
{
new_set.insert(*it+*it2);
}
@@ -862,11 +896,12 @@
const MscTimeIntervalSet<T> operator-(MscTimeIntervalSet<T>& set)
{
MscTimeIntervalSet<T> new_set;
- ITERATOR_LIST(MscTimeInterval<T>,it);
- ITERATOR_LIST(MscTimeInterval<T>,it2);
- FOR_LIST(m_set,it)
+ typename std::list<MscTimeInterval<T> >::iterator it;
+ typename std::list<MscTimeInterval<T> >::iterator it2;
+
+ for(it=m_set.begin();it!=m_set.end();it++)
{
- FOR_LIST(set.m_set,it2)
+ for(it2=set.m_set.begin();it2!=set.m_set.end();it2++)
{
new_set.insert(*it-*it2);
}
@@ -882,7 +917,68 @@
m_set=set.m_set;
return *this;
}
+
+ const bool operator==(const MscTimeIntervalSet& set)
+ {
+ if(this==&set)
+ return true;
+ return set.m_set==this->m_set;
+ }
+ void clear(){
+ m_set.clear();
+ }
+
+
+ static MscTimeIntervalSet<T> set_union(MscTimeIntervalSet<T> left,
+ MscTimeIntervalSet<T> right)
+ {
+ MscTimeIntervalSet<T> new_set;
+ new_set.m_set = left.m_set;
+ typename std::list<MscTimeInterval<T> >::iterator it;
+ for(it=right.m_set.begin();it!=right.m_set.end();it++)
+ new_set.insert(*it);
+ return new_set;
+ }
+
+ static MscTimeIntervalSet<T> set_intersection(MscTimeIntervalSet<T> left,
+ MscTimeIntervalSet<T> right)
+ {
+ MscTimeIntervalSet<T> new_set;
+ typename std::list<MscTimeInterval<T> >::iterator it;
+ typename std::list<MscTimeInterval<T> >::iterator it2;
+ for(it=left.m_set.begin();it!=left.m_set.end();it++)\
+ {
+ for(it2=right.m_set.begin();it2!=right.m_set.end();it2++)
+ {
+ MscTimeInterval<T> tmp;
+ tmp = MscTimeInterval<T>::interval_intersection(*it,*it2);
+ if(tmp.is_valid())
+ new_set.insert(tmp);
+ }
+ }
+ return new_set;
+ }
+
+ static MscTimeIntervalSet<T> components_max(MscTimeIntervalSet<T> left,
+ MscTimeIntervalSet<T> right)
+ {
+ MscTimeIntervalSet<T> new_set;
+ typename std::list<MscTimeInterval<T> >::iterator it;
+ typename std::list<MscTimeInterval<T> >::iterator it2;
+ for(it=left.m_set.begin();it!=left.m_set.end();it++)\
+ {
+ for(it2=right.m_set.begin();it2!=right.m_set.end();it2++)
+ {
+ MscTimeInterval<T> tmp;
+ tmp = MscTimeInterval<T>::components_max(*it,*it2);
+ if(tmp.is_valid())
+ new_set.insert(tmp);
+ }
+ }
+ return new_set;
+ }
+
friend std::ostream&
operator<<(std::ostream& os, const MscTimeIntervalSet<T> interval)
{
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2009-04-19 18:25:38 UTC (rev 223)
+++ trunk/tests/CMakeLists.txt 2009-04-19 20:45:31 UTC (rev 224)
@@ -86,5 +86,8 @@
ADD_EXECUTABLE(interval_test
interval_test.cpp
)
-ADD_TEST(decimal_test interval_test)
+ADD_EXECUTABLE(interval_set_test
+ interval_set_test.cpp
+)
+ADD_TEST(decimal_test interval_test interval_set_test)
# $Id$
Added: trunk/tests/interval_set_test.cpp
===================================================================
--- trunk/tests/interval_set_test.cpp (rev 0)
+++ trunk/tests/interval_set_test.cpp 2009-04-19 20:45:31 UTC (rev 224)
@@ -0,0 +1,113 @@
+#include "data/time.h"
+#define TEST_ASSERT(x) if(!(x)) \
+{ \
+ std::cerr << __FILE__ \
+ << ": Assertion " #x " failed on line " \
+ << __LINE__ << std::endl; return 1; \
+}
+
+using namespace std;
+
+
+int main()
+{
+ MscTimeIntervalSet<double> set1;
+ MscTimeIntervalSet<double> set2;
+ MscTimeIntervalSet<double> control;
+ MscTimeIntervalSet<double> result;
+
+ MscTimeInterval<double> inter1(1,4);
+ MscTimeInterval<double> inter2(6,8);
+
+ MscTimeInterval<double> inter3(0,1);
+ MscTimeInterval<double> inter4(3,5);
+ MscTimeInterval<double> inter5(6,7);
+
+
+ MscTimeInterval<double> inter6(1,1);
+ MscTimeInterval<double> inter7(3,4);
+
+
+ set1.insert(inter1);
+ set1.insert(inter2);
+
+ set2.insert(inter3);
+ set2.insert(inter4);
+ set2.insert(inter5);
+
+ control.insert(inter6);
+ control.insert(inter7);
+ control.insert(inter5);
+
+ result = MscTimeIntervalSet<double>::set_intersection(set1,set2);
+ cout << result << endl;
+ cout << control << endl;
+
+ TEST_ASSERT(control==result);
+
+ set1.clear();
+ set2.clear();
+ result.clear();
+ control.clear();
+
+ inter1.set(1,2);
+ inter2.set(4,5);
+ inter3.set(7,9);
+
+
+ inter4.set(1,5);
+ inter5.set(10,12);
+
+ inter6.set(1,5);
+
+ control.insert(inter5);
+ control.insert(inter3);
+ control.insert(inter6);
+
+ set1.insert(inter1);
+ set1.insert(inter2);
+ set1.insert(inter3);
+
+ set2.insert(inter4);
+ set2.insert(inter5);
+
+ result=MscTimeIntervalSet<double>::components_max(set1,set2);
+
+ cout << result << endl;
+ cout << control << endl;
+ TEST_ASSERT(result==control);
+
+
+ set1.clear();
+ set2.clear();
+ result.clear();
+ control.clear();
+
+ inter1.set(-1,0);
+ inter2.set(2,4);
+
+ inter4.set(0,1);
+ inter5.set(4,4);
+
+ inter6.set(-1,1);
+ inter7.set(2,5);
+ inter3.set(6,8);
+
+ control.insert(inter6);
+ control.insert(inter7);
+ control.insert(inter3);
+
+ set1.insert(inter1);
+ set1.insert(inter2);
+
+ set2.insert(inter4);
+ set2.insert(inter5);
+
+ result=set1+set2;
+
+ cout << result << endl;
+ cout << control << endl;
+ TEST_ASSERT(result==control);
+
+ return 0;
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2009-04-19 21:37:17
|
Revision: 225
http://scstudio.svn.sourceforge.net/scstudio/?rev=225&view=rev
Author: gotthardp
Date: 2009-04-19 21:37:05 +0000 (Sun, 19 Apr 2009)
Log Message:
-----------
typename construct simplified, properties fixed
Modified Paths:
--------------
trunk/src/data/time.h
Property Changed:
----------------
trunk/tests/interval_set_test.cpp
Modified: trunk/src/data/time.h
===================================================================
--- trunk/src/data/time.h 2009-04-19 20:45:31 UTC (rev 224)
+++ trunk/src/data/time.h 2009-04-19 21:37:05 UTC (rev 225)
@@ -726,7 +726,8 @@
class MscTimeIntervalSet
{
private:
- std::list< MscTimeInterval<T> > m_set;
+ typedef std::list< MscTimeInterval<T> > IntervalList;
+ IntervalList m_set;
public:
MscTimeIntervalSet(){}
@@ -751,7 +752,7 @@
return m_set.front();
}
// Dealing with the right place for m_begin
- typename std::list <MscTimeInterval<T> >::iterator it;
+ typename IntervalList::iterator it;
for(it=m_set.begin();it!=m_set.end();it++)
{
// interval.m_begin x it->m_begin
@@ -803,7 +804,7 @@
} // end of for
// Dealing with the end of interval
- typename std::list <MscTimeInterval<T> >::iterator it2;
+ typename IntervalList::iterator it2;
it2=it; // keeping position iterator, just in case
for(;it2!=m_set.end();m_set.erase(it2++))
@@ -879,12 +880,12 @@
const MscTimeIntervalSet<T> operator+(MscTimeIntervalSet<T>& set)
{
MscTimeIntervalSet<T> new_set;
- typename std::list<MscTimeInterval<T> >::iterator it;
- typename std::list<MscTimeInterval<T> >::iterator it2;
- for(it=m_set.begin();it!=m_set.end();it++)
+ for(typename IntervalList::iterator it=m_set.begin();
+ it != m_set.end(); it++)
{
- for(it2=set.m_set.begin();it2!=set.m_set.end();it2++)
+ for(typename IntervalList::iterator it2 = set.m_set.begin();
+ it2 != set.m_set.end(); it2++)
{
new_set.insert(*it+*it2);
}
@@ -896,12 +897,12 @@
const MscTimeIntervalSet<T> operator-(MscTimeIntervalSet<T>& set)
{
MscTimeIntervalSet<T> new_set;
- typename std::list<MscTimeInterval<T> >::iterator it;
- typename std::list<MscTimeInterval<T> >::iterator it2;
- for(it=m_set.begin();it!=m_set.end();it++)
+ for(typename IntervalList::iterator it = m_set.begin();
+ it != m_set.end(); it++)
{
- for(it2=set.m_set.begin();it2!=set.m_set.end();it2++)
+ for(typename IntervalList::iterator it2 = set.m_set.begin();
+ it2 != set.m_set.end(); it2++)
{
new_set.insert(*it-*it2);
}
@@ -935,9 +936,11 @@
{
MscTimeIntervalSet<T> new_set;
new_set.m_set = left.m_set;
- typename std::list<MscTimeInterval<T> >::iterator it;
- for(it=right.m_set.begin();it!=right.m_set.end();it++)
- new_set.insert(*it);
+ for(typename IntervalList::iterator it = right.m_set.begin();
+ it != right.m_set.end(); it++)
+ {
+ new_set.insert(*it);
+ }
return new_set;
}
@@ -945,11 +948,11 @@
MscTimeIntervalSet<T> right)
{
MscTimeIntervalSet<T> new_set;
- typename std::list<MscTimeInterval<T> >::iterator it;
- typename std::list<MscTimeInterval<T> >::iterator it2;
- for(it=left.m_set.begin();it!=left.m_set.end();it++)\
+ for(typename IntervalList::iterator it = left.m_set.begin();
+ it != left.m_set.end(); it++)
{
- for(it2=right.m_set.begin();it2!=right.m_set.end();it2++)
+ for(typename IntervalList::iterator it2 = right.m_set.begin();
+ it2 != right.m_set.end(); it2++)
{
MscTimeInterval<T> tmp;
tmp = MscTimeInterval<T>::interval_intersection(*it,*it2);
@@ -964,11 +967,11 @@
MscTimeIntervalSet<T> right)
{
MscTimeIntervalSet<T> new_set;
- typename std::list<MscTimeInterval<T> >::iterator it;
- typename std::list<MscTimeInterval<T> >::iterator it2;
- for(it=left.m_set.begin();it!=left.m_set.end();it++)\
+ for(typename IntervalList::iterator it = left.m_set.begin();
+ it != left.m_set.end(); it++)
{
- for(it2=right.m_set.begin();it2!=right.m_set.end();it2++)
+ for(typename IntervalList::iterator it2 = right.m_set.begin();
+ it2 != right.m_set.end(); it2++)
{
MscTimeInterval<T> tmp;
tmp = MscTimeInterval<T>::components_max(*it,*it2);
@@ -986,8 +989,8 @@
return os << "";
std::list <MscTimeInterval<T> > set;
set=interval.m_set;
- typename std::list <MscTimeInterval<T> >::iterator it;
- for(it=set.begin();it!=set.end();it++)
+ for(typename IntervalList::iterator it = set.begin();
+ it != set.end(); it++)
{
os << *it << " ";
}
Property changes on: trunk/tests/interval_set_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2009-04-22 21:29:13
|
Revision: 228
http://scstudio.svn.sourceforge.net/scstudio/?rev=228&view=rev
Author: gotthardp
Date: 2009-04-22 21:28:52 +0000 (Wed, 22 Apr 2009)
Log Message:
-----------
Initial implementation of dependency checks (feature request #2556693). Next step: add the actual dependency data.
Enhanced the Z.120 output to correctly print msc.h with ReferenceNodes.
Modified Paths:
--------------
trunk/CMakeLists.txt
trunk/src/check/boundedness/universal_boundedness_checker.cpp
trunk/src/check/boundedness/universal_boundedness_checker.h
trunk/src/check/liveness/deadlock_checker.cpp
trunk/src/check/liveness/deadlock_checker.h
trunk/src/check/liveness/livelock_checker.cpp
trunk/src/check/liveness/livelock_checker.h
trunk/src/check/order/acyclic_checker.cpp
trunk/src/check/order/acyclic_checker.h
trunk/src/check/order/fifo_checker.cpp
trunk/src/check/order/fifo_checker.h
trunk/src/check/race/race_checker.cpp
trunk/src/check/race/race_checker.h
trunk/src/check/structure/name_checker.cpp
trunk/src/check/structure/name_checker.h
trunk/src/data/Z120/z120.h
trunk/src/data/Z120/z120_save.cpp
trunk/src/data/checker.h
trunk/src/data/msc.h
trunk/src/view/visio/addon/dllmodule.rc
trunk/src/view/visio/addon/document.cpp
trunk/src/view/visio/addon/document.h
trunk/src/view/visio/scstudio.nsi
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/CMakeLists.txt 2009-04-22 21:28:52 UTC (rev 228)
@@ -13,6 +13,12 @@
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_INSTALL_PREFIX}/share/scripts)
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR})
+INCLUDE(TestBigEndian)
+TEST_BIG_ENDIAN(BIG_ENDIAN)
+IF(BIG_ENDIAN)
+ ADD_DEFINITIONS(-DHOST_IS_BIG_ENDIAN)
+ENDIF(BIG_ENDIAN)
+
FIND_PACKAGE(Boost REQUIRED)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR})
@@ -23,7 +29,7 @@
INCLUDE_DIRECTORIES(src)
INCLUDE_DIRECTORIES(${CMAKE_INSTALL_PREFIX}/include)
-IF (WIN32)
+IF (WIN32)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})
SET(LIBRARY_OUTPUT_PATH ${EXECUTABLE_OUTPUT_PATH})
ENDIF(WIN32)
Modified: trunk/src/check/boundedness/universal_boundedness_checker.cpp
===================================================================
--- trunk/src/check/boundedness/universal_boundedness_checker.cpp 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/boundedness/universal_boundedness_checker.cpp 2009-04-22 21:28:52 UTC (rev 228)
@@ -105,6 +105,14 @@
}
+Checker::PreconditionList UniversalBoundednessChecker::get_preconditions(MscPtr msc) const
+{
+ Checker::PreconditionList result;
+ result.push_back(CheckerPrecondition("Unique instance names", CP_RECOMMENDED));
+
+ return result;
+}
+
HMscPtr UniversalBoundednessChecker::create_counter_example(const MscElementPList& to_cycle, const MscElementPList& cycle)
{
HMscPtr p;
Modified: trunk/src/check/boundedness/universal_boundedness_checker.h
===================================================================
--- trunk/src/check/boundedness/universal_boundedness_checker.h 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/boundedness/universal_boundedness_checker.h 2009-04-22 21:28:52 UTC (rev 228)
@@ -138,12 +138,14 @@
static const std::string vertex_number_attribute;
/**
- * Human readable description of this check.
+ * Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_description() const
+ virtual std::string get_property_name() const
{ return "Universal Boundedness"; }
+ virtual PreconditionList get_preconditions(MscPtr msc) const;
+
/**
* Checks whether hmsc satisfy universal boundedness property.
*/
Modified: trunk/src/check/liveness/deadlock_checker.cpp
===================================================================
--- trunk/src/check/liveness/deadlock_checker.cpp 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/liveness/deadlock_checker.cpp 2009-04-22 21:28:52 UTC (rev 228)
@@ -123,6 +123,13 @@
}
}
+Checker::PreconditionList DeadlockChecker::get_preconditions(MscPtr msc) const
+{
+ Checker::PreconditionList result;
+ // no preconditions
+ return result;
+}
+
HMscPtr DeadlockChecker::create_counter_example(const MscElementPListList& path)
{
HMscPathDuplicator duplicator;
Modified: trunk/src/check/liveness/deadlock_checker.h
===================================================================
--- trunk/src/check/liveness/deadlock_checker.h 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/liveness/deadlock_checker.h 2009-04-22 21:28:52 UTC (rev 228)
@@ -126,12 +126,14 @@
DeadlockChecker(){};
/**
- * Human readable description of this check.
+ * Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_description() const
+ virtual std::string get_property_name() const
{ return "Deadlock"; }
+ virtual PreconditionList get_preconditions(MscPtr msc) const;
+
/**
* Checks whether hmsc satisfy deadlock free property.
*/
Modified: trunk/src/check/liveness/livelock_checker.cpp
===================================================================
--- trunk/src/check/liveness/livelock_checker.cpp 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/liveness/livelock_checker.cpp 2009-04-22 21:28:52 UTC (rev 228)
@@ -87,6 +87,13 @@
return reachable;
}
+Checker::PreconditionList LivelockChecker::get_preconditions(MscPtr msc) const
+{
+ Checker::PreconditionList result;
+ // no preconditions
+ return result;
+}
+
HMscPtr LivelockChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
HMscPtr p;
Modified: trunk/src/check/liveness/livelock_checker.h
===================================================================
--- trunk/src/check/liveness/livelock_checker.h 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/liveness/livelock_checker.h 2009-04-22 21:28:52 UTC (rev 228)
@@ -108,12 +108,14 @@
LivelockChecker();
/**
- * Human readable description of this check.
+ * Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_description() const
+ virtual std::string get_property_name() const
{ return "Livelock"; }
+ virtual PreconditionList get_preconditions(MscPtr msc) const;
+
static LivelockCheckerPtr instance();
bool is_supported(ChannelMapperPtr chm);
Modified: trunk/src/check/order/acyclic_checker.cpp
===================================================================
--- trunk/src/check/order/acyclic_checker.cpp 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/order/acyclic_checker.cpp 2009-04-22 21:28:52 UTC (rev 228)
@@ -21,6 +21,13 @@
AcyclicCheckerPtr AcyclicChecker::m_instance;
+Checker::PreconditionList AcyclicChecker::get_preconditions(MscPtr msc) const
+{
+ Checker::PreconditionList result;
+ // no preconditions
+ return result;
+}
+
BMscPtr AcyclicChecker::create_counter_example(BMscPtr& bmsc, const MscElementPList& path)
{
MscElement* last_event = path.back();
Modified: trunk/src/check/order/acyclic_checker.h
===================================================================
--- trunk/src/check/order/acyclic_checker.h 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/order/acyclic_checker.h 2009-04-22 21:28:52 UTC (rev 228)
@@ -61,12 +61,14 @@
}
/**
- * Human readable description of this check.
+ * Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_description() const
+ virtual std::string get_property_name() const
{ return "Acyclic"; }
-
+
+ virtual PreconditionList get_preconditions(MscPtr msc) const;
+
/**
* Checks whether bmsc has acyclic events' dependecy
*/
Modified: trunk/src/check/order/fifo_checker.cpp
===================================================================
--- trunk/src/check/order/fifo_checker.cpp 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/order/fifo_checker.cpp 2009-04-22 21:28:52 UTC (rev 228)
@@ -23,6 +23,13 @@
const std::string FifoChecker::channel_id_attribute = "fifo_channel_id";
FifoCheckerPtr FifoChecker::m_instance;
+Checker::PreconditionList FifoChecker::get_preconditions(MscPtr msc) const
+{
+ Checker::PreconditionList result;
+ // no preconditions
+ return result;
+}
+
BMscPtr FifoChecker::create_counter_example(BMscPtr& bmsc, Event* e_1, Event* e_2)
{
BMscDuplicator duplicator;
Modified: trunk/src/check/order/fifo_checker.h
===================================================================
--- trunk/src/check/order/fifo_checker.h 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/order/fifo_checker.h 2009-04-22 21:28:52 UTC (rev 228)
@@ -65,12 +65,14 @@
public:
/**
- * Human readable description of this check.
+ * Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_description() const
+ virtual std::string get_property_name() const
{ return "FIFO"; }
-
+
+ virtual PreconditionList get_preconditions(MscPtr msc) const;
+
/**
* Name of channel id attribute
*/
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/race/race_checker.cpp 2009-04-22 21:28:52 UTC (rev 228)
@@ -239,6 +239,13 @@
&m_visual_initiator,&m_causal_initiator,&m_instance_marker);
}
+Checker::PreconditionList RaceChecker::get_preconditions(MscPtr msc) const
+{
+ Checker::PreconditionList result;
+ // no preconditions
+ return result;
+}
+
BMscPtr RaceChecker::create_counter_example(Event* e1, Event* e2)
{
BMscDuplicator duplicator;
Modified: trunk/src/check/race/race_checker.h
===================================================================
--- trunk/src/check/race/race_checker.h 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/race/race_checker.h 2009-04-22 21:28:52 UTC (rev 228)
@@ -222,12 +222,14 @@
RaceChecker();
/**
- * Human readable description of this check.
+ * Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_description() const
+ virtual std::string get_property_name() const
{ return "Race Conditions"; }
-
+
+ virtual PreconditionList get_preconditions(MscPtr msc) const;
+
BMscPtr check_bmsc(BMscPtr bmsc, ChannelMapperPtr mapper);
BMscPtr check(BMscPtr bmsc, ChannelMapperPtr mapper);
Modified: trunk/src/check/structure/name_checker.cpp
===================================================================
--- trunk/src/check/structure/name_checker.cpp 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/structure/name_checker.cpp 2009-04-22 21:28:52 UTC (rev 228)
@@ -76,6 +76,13 @@
}
+Checker::PreconditionList NameChecker::get_preconditions(MscPtr msc) const
+{
+ Checker::PreconditionList result;
+ // no preconditions
+ return result;
+}
+
HMscPtr NameChecker::create_duplicate_counter_example(const MscElementPListList& path)
{
HMscPathDuplicator duplicator;
Modified: trunk/src/check/structure/name_checker.h
===================================================================
--- trunk/src/check/structure/name_checker.h 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/check/structure/name_checker.h 2009-04-22 21:28:52 UTC (rev 228)
@@ -115,12 +115,14 @@
NameChecker(){};
/**
- * Human readable description of this check.
+ * Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_description() const
- { return "Instance names"; }
+ virtual std::string get_property_name() const
+ { return "Unique instance names"; }
+ virtual PreconditionList get_preconditions(MscPtr msc) const;
+
/**
* Checks whether a given hmsc contains consistent set of instances.
*/
Modified: trunk/src/data/Z120/z120.h
===================================================================
--- trunk/src/data/Z120/z120.h 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/data/Z120/z120.h 2009-04-22 21:28:52 UTC (rev 228)
@@ -45,6 +45,10 @@
virtual int save_msc(std::ostream& stream, const std::string &name, const std::vector<MscPtr>& msc);
protected:
+ int save_msc(std::ostream& stream, const MscPtr& msc);
+ // note: insertion to m_printing must not invalidate iterators
+ std::list<MscPtr> m_printing;
+
//! export a basic MSC drawing
int save_bmsc(std::ostream& stream, const BMscPtr& bmsc);
//! export a HMSC drawing
Modified: trunk/src/data/Z120/z120_save.cpp
===================================================================
--- trunk/src/data/Z120/z120_save.cpp 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/data/Z120/z120_save.cpp 2009-04-22 21:28:52 UTC (rev 228)
@@ -29,26 +29,40 @@
int result = 0; // error count
stream << "mscdocument " << name << ";" << std::endl;
- for(std::vector<MscPtr>::const_iterator pos = msc.begin();
- pos != msc.end(); pos++)
+ std::set<std::string> printed;
+
+ // list of MSC to be printed
+ // new references may be added to m_printing by save_hmsc()
+ std::copy(msc.begin(), msc.end(), std::back_inserter(m_printing));
+
+ for(std::list<MscPtr>::const_iterator pos = m_printing.begin();
+ pos != m_printing.end(); pos++)
{
- BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(*pos);
- HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc>(*pos);
-
- if(bmsc != NULL)
- result += save_bmsc(stream, bmsc);
- else if(hmsc != NULL)
- result += save_hmsc(stream, hmsc);
- else
+ // if not already generated
+ if(printed.find((*pos)->get_label()) == printed.end())
{
- // unexpected pointer
- result++;
+ result += save_msc(stream, *pos);
+ printed.insert((*pos)->get_label());
}
}
+ m_printing.clear();
return 0;
}
+int Z120::save_msc(std::ostream& stream, const MscPtr& msc)
+{
+ BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc);
+ HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc>(msc);
+
+ if(bmsc != NULL)
+ return save_bmsc(stream, bmsc);
+ else if(hmsc != NULL)
+ return save_hmsc(stream, hmsc);
+ else
+ return 1; // unexpected pointer
+}
+
template <class Ptr>
class PtrIDMap
{
@@ -78,12 +92,33 @@
list.push_back(item);
}
+// for debugging purposes
+void print_element_attributes(std::ostream& stream, const MscElementPtr& element)
+{
+ stream << "/* ";
+
+ std::set<std::string> attributes = element->get_attribute_names();
+ stream << "[";
+ for(std::set<std::string>::const_iterator pos = attributes.begin();
+ pos != attributes.end(); pos++)
+ {
+ stream << *pos;
+ }
+ stream << "]";
+
+ stream << " */" << std::endl;
+}
+
void print_event(std::ostream& stream, PtrIDMap<MscMessagePtr>& message_id_map,
const EventPtr& event)
{
+ // print_element_attributes(stream, event);
+
CompleteMessagePtr complete_message = event->get_complete_message();
if(complete_message != NULL)
{
+ // print_element_attributes(stream, complete_message);
+
if(complete_message->get_send_event() == event)
stream << "out " << complete_message->get_label()
<< "," << message_id_map.get_id(complete_message)
@@ -97,6 +132,8 @@
IncompleteMessagePtr incomplete_message = event->get_incomplete_message();
if(incomplete_message != NULL)
{
+ // print_element_attributes(stream, incomplete_message);
+
if(incomplete_message->is_lost())
stream << "out " << incomplete_message->get_label()
<< "," << message_id_map.get_id(incomplete_message)
@@ -113,6 +150,7 @@
PtrIDMap<MscMessagePtr> message_id_map; // message instance identifiers
PtrIDMap<EventPtr> event_id_map; // event identifiers
+ // print_element_attributes(stream, bmsc);
stream << "msc " << bmsc->get_label() << ";" << std::endl;
// declare instances
@@ -126,12 +164,15 @@
for(InstancePtrList::const_iterator ipos = bmsc->get_instances().begin();
ipos != bmsc->get_instances().end(); ipos++)
{
+ // print_element_attributes(stream, *ipos);
stream << (*ipos)->get_label() << ": instance;" << std::endl;
// walk through event areas
for(EventAreaPtr area = (*ipos)->get_first();
area != NULL; area = area->get_next())
{
+ // print_element_attributes(stream, area);
+
StrictOrderAreaPtr strict_area = boost::dynamic_pointer_cast<StrictOrderArea>(area);
if(strict_area != NULL)
{
@@ -203,6 +244,7 @@
// nodes to be processed; this is to avoid recursion
std::list<HMscNodePtr> node_stack;
+ // print_element_attributes(stream, hmsc);
stream << "msc " << hmsc->get_label() << ";" << std::endl;
// initialize the stack with the start node
@@ -212,6 +254,8 @@
for(std::list<HMscNodePtr>::const_iterator npos = node_stack.begin();
npos != node_stack.end(); npos++)
{
+ // print_element_attributes(stream, *npos);
+
StartNodePtr start_node = boost::dynamic_pointer_cast<StartNode>(*npos);
if(start_node != NULL)
{
@@ -237,6 +281,7 @@
{
stream << "L" << node_id_map.get_id(*npos)
<< ": reference " << reference_node->get_msc()->get_label();
+ m_printing.push_back(reference_node->get_msc());
}
EndNodePtr end_node = boost::dynamic_pointer_cast<EndNode>(*npos);
@@ -252,6 +297,8 @@
for(NodeRelationPtrSet::const_iterator spos = predecessor_node->get_successors().begin();
spos != predecessor_node->get_successors().end(); spos++)
{
+ // print_element_attributes(stream, *spos);
+
SuccessorNode *successor = (*spos)->get_successor();
// is it a first item being printed?
Modified: trunk/src/data/checker.h
===================================================================
--- trunk/src/data/checker.h 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/data/checker.h 2009-04-22 21:28:52 UTC (rev 228)
@@ -45,11 +45,35 @@
public:
/**
- * Human readable description of this check.
+ * Human readable name of the property being checked.
*/
- virtual std::string get_description() const = 0;
-
+ virtual std::string get_property_name() const = 0;
+
+ enum CheckerPriority
+ {
+ CP_REQUIRED, //! error if not satisfied
+ CP_RECOMMENDED, //! warning if not satisfied
+ CP_DISREGARDED //! may not be satisfied
+ };
+
+ struct CheckerPrecondition
+ {
+ CheckerPrecondition(const std::string& name, CheckerPriority prio)
+ : property_name(name), priority(prio)
+ { }
+
+ std::string property_name;
+ CheckerPriority priority;
+ };
+ //! List of properties that must be satisfied before executing the check.
+ typedef std::vector<CheckerPrecondition> PreconditionList;
+
/**
+ * Returns a list of preconditions for the check.
+ */
+ virtual PreconditionList get_preconditions(MscPtr msc) const = 0;
+
+ /**
* Removes no more needed attributes.
*
* Descendat of this class should remove attributes of MscElements that are no
Modified: trunk/src/data/msc.h
===================================================================
--- trunk/src/data/msc.h 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/data/msc.h 2009-04-22 21:28:52 UTC (rev 228)
@@ -172,7 +172,6 @@
return (m_attributes.find(name)!=m_attributes.end());
}
-
/**
* \brief Returns dynamic attribute of MscElement.
*
@@ -274,7 +273,23 @@
m_attributes.erase(i);
}
}
-
+
+ /**
+ * \brief List all attributes of MscElement.
+ */
+ std::set<std::string> get_attribute_names()
+ {
+ std::set<std::string> result;
+
+ for(AttributePMap::const_iterator i = m_attributes.begin();
+ i != m_attributes.end(); i++)
+ {
+ result.insert(i->first);
+ }
+
+ return result;
+ }
+
bool get_marked() const
{
return m_marked;
Modified: trunk/src/view/visio/addon/dllmodule.rc
===================================================================
--- trunk/src/view/visio/addon/dllmodule.rc 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/view/visio/addon/dllmodule.rc 2009-04-22 21:28:52 UTC (rev 228)
@@ -72,8 +72,8 @@
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 0,2,9,0
- PRODUCTVERSION 0,2,9,0
+ FILEVERSION 0,2,10,0
+ PRODUCTVERSION 0,2,10,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x9L
@@ -90,13 +90,13 @@
BEGIN
VALUE "CompanyName", "Masaryk University Brno"
VALUE "FileDescription", "Microsoft Visio add-on for design and verification of Message Sequence Charts (MSC)."
- VALUE "FileVersion", "0.2.9"
+ VALUE "FileVersion", "0.2.10"
VALUE "InternalName", "scstudio.vsl"
VALUE "LegalCopyright", "(c) Petr Gotthard. All rights reserved."
VALUE "OriginalFilename", "scstudio.vsl"
VALUE "PrivateBuild", "$Revision$"
VALUE "ProductName", "Sequence Chart Studio"
- VALUE "ProductVersion", "0.2.9"
+ VALUE "ProductVersion", "0.2.10"
END
END
BLOCK "VarFileInfo"
Modified: trunk/src/view/visio/addon/document.cpp
===================================================================
--- trunk/src/view/visio/addon/document.cpp 2009-04-22 09:56:16 UTC (rev 227)
+++ trunk/src/view/visio/addon/document.cpp 2009-04-22 21:28:52 UTC (rev 228)
@@ -32,6 +32,9 @@
// Install WTL80 under e.g. "C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\"
#include <atldlgs.h>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/topological_sort.hpp>
+
CDocumentMonitor::CDocumentMonitor(CStudioAddon *addon,
Visio::IVApplicationPtr vsoApp, Visio::IVDocumentPtr vsoDocument)
{
@@ -353,6 +356,31 @@
vsoDocument->SetCustomMenus(vsoMenus);
}
+struct CheckExecutionStatus
+{
+ CheckExecutionStatus()
+ : executed(false), satisfied(false)
+ { }
+
+ bool executed;
+ bool satisfied;
+};
+typedef std::vector<CheckExecutionStatus> CheckExecutionStatusList;
+
+CheckerPtrList::const_iterator CDocumentMonitor::find_checker(const std::string& property_name) const
+{
+ nocase_comparator is_equal;
+
+ for(CheckerPtrList::const_iterator cpos = m_checkers.begin();
+ cpos != m_checkers.end(); cpos++)
+ {
+ if(is_equal((*cpos)->get_property_name(), property_name))
+ return cpos;
+ }
+
+ return m_checkers.end();
+}
+
VAORC CDocumentMonitor::OnMenuRun(Visio::IVApplicationPtr vsoApp)
{
// clear the verification report
@@ -362,73 +390,163 @@
Visio::IVPagePtr vsoPage = vsoApp->GetActivePage();
MscPtr msc = extractor.extract_msc(vsoPage);
- if(msc != NULL)
+ if(msc == NULL)
{
- BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc);
- HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc>(msc);
+ m_reportView->Print(RS_NOTICE, stringize() << vsoPage->Name << ": "
+ << "Graphical error(s) in drawing. No properties verified.");
+ return VAORC_FAILURE;
+ }
- SRChannelMapperPtr srm = SRChannelMapper::instance();
+ CheckExecutionStatusList status;
+ // initialize status for each checker
+ status.insert(status.begin(), m_checkers.size(), CheckExecutionStatus());
- int satisfied_count = 0;
- int violated_count = 0;
+ typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,
+ boost::property<boost::vertex_color_t, boost::default_color_type> > Graph;
+ Graph G(m_checkers.size());
- for(CheckerPtrList::const_iterator cpos = m_checkers.begin();
- cpos != m_checkers.end(); cpos++)
+ for(CheckerPtrList::const_iterator cpos = m_checkers.begin();
+ cpos != m_checkers.end(); cpos++)
+ {
+ size_t icheck = cpos - m_checkers.begin();
+
+ Checker::PreconditionList preconditions = (*cpos)->get_preconditions(msc);
+ // check the preconditions
+ for(Checker::PreconditionList::const_iterator ppos = preconditions.begin();
+ ppos != preconditions.end(); ppos++)
{
- BMscCheckerPtr bmsc_checker = boost::dynamic_pointer_cast<BMscChecker>(*cpos);
- HMscCheckerPtr hmsc_checker = boost::dynamic_pointer_cast<HMscChecker>(*cpos);
+ CheckerPtrList::const_iterator checker = find_checker(ppos->property_name);
+ if(checker != m_checkers.end())
+ {
+ size_t idep = checker - m_checkers.begin();
+ // add dependency to the graph
+ // if edge (u,v) appears in the graph, then v comes before u in the ordering
+ boost::add_edge(icheck, idep, G);
+ }
+ }
+ }
- if(bmsc_checker != NULL && bmsc != NULL)
+ typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;
+ typedef std::vector<Vertex> Container;
+ Container check_order;
+
+ try
+ {
+ // output iterator in reverse topological order
+ boost::topological_sort(G, std::back_inserter(check_order));
+ }
+ catch(boost::not_a_dag)
+ {
+ m_reportView->Print(RS_ERROR, stringize() << "internal error: broken dependencies");
+ return VAORC_FAILURE;
+ }
+
+ BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc);
+ HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc>(msc);
+
+ SRChannelMapperPtr srm = SRChannelMapper::instance();
+
+ int satisfied_count = 0;
+ int violated_count = 0;
+
+ for(Container::const_iterator cpos = check_order.begin();
+ cpos != check_order.end(); cpos++)
+ {
+ CheckerPtr msc_checker = m_checkers[*cpos];
+ bool all_preconditions = true;
+
+ Checker::PreconditionList preconditions = msc_checker->get_preconditions(msc);
+ // check the preconditions
+ for(Checker::PreconditionList::const_iterator ppos = preconditions.begin();
+ ppos != preconditions.end(); ppos++)
+ {
+ CheckerPtrList::const_iterator checker = find_checker(ppos->property_name);
+ if(checker != m_checkers.end())
{
- BMscPtr result = bmsc_checker->check(bmsc, srm);
- if(result != NULL)
+ size_t idep = checker - m_checkers.begin();
+
+ if((!status[idep].executed || !status[idep].satisfied)
+ && ppos->priority == Checker::CP_REQUIRED)
{
- m_reportView->Print(RS_ERROR, stringize() << vsoPage->Name << ": "
- << (*cpos)->get_description() << " violated.", result);
- violated_count++;
+ all_preconditions = false;
}
- else
- {
- m_reportView->Print(RS_NOTICE, stringize() << vsoPage->Name << ": "
- << (*cpos)->get_description() << " satisfied.");
- satisfied_count++;
- }
}
+ else
+ {
+ if(ppos->priority == Checker::CP_REQUIRED)
+ all_preconditions = false;
- if(hmsc_checker != NULL && hmsc != NULL)
+ m_reportView->Print(RS_WARNING, stringize() << vsoPage->Name << ": "
+ << "skipping " << msc_checker->get_property_name()
+ << " due to unknown dependency: " << ppos->property_name);
+ }
+ }
+
+ if(!all_preconditions)
+ {
+ m_reportView->Print(RS_WARNING, stringize() << vsoPage->Name << ": "
+ << msc_checker->get_property_name() << " skipped.");
+ continue;
+ }
+
+ BMscCheckerPtr bmsc_checker = boost::dynamic_pointer_cast<BMscChecker>(msc_checker);
+ if(bmsc_checker != NULL && bmsc != NULL)
+ {
+ BMscPtr result = bmsc_checker->check(bmsc, srm);
+ status[*cpos].executed = true;
+
+ if(result != NULL)
{
- HMscPtr result = hmsc_checker->check(hmsc, srm);
- if(result != NULL)
- {
- m_reportView->Print(RS_ERROR, stringize() << vsoPage->Name << ": "
- << (*cpos)->get_description() << " violated.", result);
- violated_count++;
- }
- else
- {
- m_reportView->Print(RS_NOTICE, stringize() << vsoPage->Name << ": "
- << (*cpos)->get_description() << " satisfied.");
- satisfied_count++;
- }
+ status[*cpos].satisfied = false;
+ violated_count++;
+
+ m_reportView->Print(RS_ERROR, stringize() << vsoPage->Name << ": "
+ << msc_checker->get_property_name() << " violated.", result);
}
+ else
+ {
+ status[*cpos].satisfied = true;
+ satisfied_count++;
- (*cpos)->cleanup_attributes();
+ m_reportView->Print(RS_NOTICE, stringize() << vsoPage->Name << ": "
+ << msc_checker->get_property_name() << " satisfied.");
+ }
}
- if(satisfied_count == 0 && violated_count == 0)
+ HMscCheckerPtr hmsc_checker = boost::dynamic_pointer_cast<HMscChecker>(msc_checker);
+ if(hmsc_checker != NULL && hmsc != NULL)
{
- m_reportView->Print(RS_NOTICE, stringize() << vsoPage->Name << ": "
- << "No verification algorithms applicable. No properties verified.");
+ HMscPtr result = hmsc_checker->check(hmsc, srm);
+ status[*cpos].executed = true;
+
+ if(result != NULL)
+ {
+ status[*cpos].satisfied = false;
+ violated_count++;
+
+ m_reportView->Print(RS_ERROR, stringize() << vsoPage->Name << ": "
+ << msc_checker->get_property_name() << " violated.", result);
+ }
+ else
+ {
+ status[*cpos].satisfied = true;
+ satisfied_count++;
+
+ m_reportView->Print(RS_NOTICE, stringize() << vsoPage->Name << ": "
+ << msc_checker->get_property_name() << " satisfied.");
+ }
}
- return VAORC_SUCCESS;
+ msc_checker->cleanup_attributes();
}
- else
+
+ if(satisfied_count == 0 && violated_count == 0)
{
- m_reportView->Print(RS_NOTICE, stringize() << vsoPage->Name << ": "
- << "Graphical error(s) in drawing. No properties verified.");
- return VAORC_FAILURE;
+ m_reportView->Print(RS_NOTICE, stringize() << vsoPage->Name << ": "
+ << "No verification algorithms applicable. No properties verified.");
}
+
+ return VAORC_SUCCESS;
}
std::wstring filter_to_wstring(const std::string& str)
Modified: trunk/src/view/visio/addon/document.h
================================================================...
[truncated message content] |
|
From: <ba...@us...> - 2009-04-26 19:48:13
|
Revision: 231
http://scstudio.svn.sourceforge.net/scstudio/?rev=231&view=rev
Author: babicaj
Date: 2009-04-26 19:48:01 +0000 (Sun, 26 Apr 2009)
Log Message:
-----------
LivelockChecker bug fixed
Modified Paths:
--------------
trunk/src/check/liveness/livelock_checker.cpp
trunk/src/check/liveness/livelock_checker.h
trunk/src/data/dfsb_hmsc_traverser.cpp
trunk/src/data/dfsb_hmsc_traverser.h
trunk/tests/livelock_checker_test.cpp
Modified: trunk/src/check/liveness/livelock_checker.cpp
===================================================================
--- trunk/src/check/liveness/livelock_checker.cpp 2009-04-26 19:30:44 UTC (rev 230)
+++ trunk/src/check/liveness/livelock_checker.cpp 2009-04-26 19:48:01 UTC (rev 231)
@@ -24,44 +24,23 @@
LivelockCheckerPtr LivelockChecker::m_instance;
-LivelockReachableMarker::LivelockReachableMarker(LivelockListener* ll):
- m_ll(ll)
+LivelockMarker::LivelockMarker(WhiteNodeMarker *marker):
+m_traverser("LLM_color")
{
+ m_traverser.add_white_node_found_listener(marker);
}
-void LivelockReachableMarker::on_white_node_found(HMscNode* n)
+void LivelockMarker::on_white_node_found(HMscNode *n)
{
- bool& reachable = m_ll->get_reachable(n);
- reachable = true;
-}
-
-LivelockListener::LivelockListener()
-{
- m_marker = LivelockReachableMarker(this);
- m_traverser = DFSBHMscTraverser("LL_color");
- m_traverser.add_white_node_found_listener(&m_marker);
-}
-
-void LivelockListener::mark_reachable(HMscNode* node)
-{
- m_traverser.traverse(node);
-}
-
-void LivelockListener::cleanup_attributes(){
- while(!m_marked_elements.empty())
+ if(dynamic_cast<EndNode*>(n))
{
- HMscNode* p = m_marked_elements.back();
- p->remove_attribute<bool>(ATTRIBUTE_REACHABLE);
- m_marked_elements.pop_back();
+ m_traverser.traverse(n,false);
}
}
-void LivelockListener::on_white_node_found(HMscNode* node)
+LivelockListener::LivelockListener(WhiteNodeMarker *marker):
+m_marker(marker)
{
- if(dynamic_cast<EndNode*>(node))
- {
- mark_reachable(node);
- }
}
void LivelockListener::on_gray_node_found(HMscNode* n)
@@ -73,18 +52,11 @@
LivelockListener::~LivelockListener()
{
- cleanup_attributes();
}
-bool& LivelockListener::get_reachable(HMscNode* node)
+bool LivelockListener::get_reachable(HMscNode* node)
{
- bool just_set;
- bool& reachable = node->get_attribute<bool>(ATTRIBUTE_REACHABLE,false,just_set);
- if(just_set)
- {
- m_marked_elements.push_back(node);
- }
- return reachable;
+ return m_marker->get_mark(node);
}
Checker::PreconditionList LivelockChecker::get_preconditions(MscPtr msc) const
@@ -97,9 +69,15 @@
HMscPtr LivelockChecker::check(HMscPtr hmsc, ChannelMapperPtr chm)
{
HMscPtr p;
+ //mark nodes that path to EndNode exists from
+ DFSHMscTraverser hmsc_traverser("M_color");
+ WhiteNodeMarker marker;
+ LivelockMarker livelock_marker(&marker);
+ hmsc_traverser.add_white_node_found_listener(&livelock_marker);
+ hmsc_traverser.traverse(hmsc);
+ //check cycles of non-marked nodes
DFSRefNodeHMscTraverser traverser("LC_color");
- LivelockListener listener;
- traverser.add_white_node_found_listener(&listener);
+ LivelockListener listener(&marker);
traverser.add_gray_node_found_listener(&listener);
try
{
Modified: trunk/src/check/liveness/livelock_checker.h
===================================================================
--- trunk/src/check/liveness/livelock_checker.h 2009-04-26 19:30:44 UTC (rev 230)
+++ trunk/src/check/liveness/livelock_checker.h 2009-04-26 19:48:01 UTC (rev 231)
@@ -21,6 +21,7 @@
#include "data/dfs_hmsc_traverser.h"
#include "data/dfsb_hmsc_traverser.h"
#include "check/liveness/export.h"
+#include "check/pseudocode/utils.h"
#include <string>
#include <stack>
@@ -47,44 +48,35 @@
}
};
-class LivelockReachableMarker:public WhiteNodeFoundListener
+class LivelockMarker:public WhiteNodeFoundListener
{
+private:
- LivelockListener* m_ll;
+ WhiteNodeMarker *m_marker;
+ DFSBHMscTraverser m_traverser;
public:
- LivelockReachableMarker(LivelockListener* ll=NULL);
+ LivelockMarker(WhiteNodeMarker *marker);
- void on_white_node_found(HMscNode* n);
-
+ void on_white_node_found(HMscNode *n);
};
-class LivelockListener:public WhiteNodeFoundListener, public GrayNodeFoundListener
+class LivelockListener:public GrayNodeFoundListener
{
private:
-
- HMscNodePList m_marked_elements;
- LivelockReachableMarker m_marker;
-
- DFSBHMscTraverser m_traverser;
-
- void mark_reachable(HMscNode* node);
-
- void cleanup_attributes();
+ WhiteNodeMarker *m_marker;
public:
- LivelockListener();
+ LivelockListener(WhiteNodeMarker *marker);
~LivelockListener();
- void on_white_node_found(HMscNode* node);
-
virtual void on_gray_node_found(HMscNode* n);
- bool& get_reachable(HMscNode* node);
+ bool get_reachable(HMscNode* node);
};
Modified: trunk/src/data/dfsb_hmsc_traverser.cpp
===================================================================
--- trunk/src/data/dfsb_hmsc_traverser.cpp 2009-04-26 19:30:44 UTC (rev 230)
+++ trunk/src/data/dfsb_hmsc_traverser.cpp 2009-04-26 19:48:01 UTC (rev 231)
@@ -39,10 +39,13 @@
cleanup_traversing_attributes();
}
-void DFSBHMscTraverser::traverse(HMscNode* node)
+void DFSBHMscTraverser::traverse(HMscNode* node, bool cleanup)
{
traverse_node(node);
- cleanup_traversing_attributes();
+ if(cleanup)
+ {
+ cleanup_traversing_attributes();
+ }
}
bool DFSBHMscTraverser::traverse_node(HMscNode* node)
Modified: trunk/src/data/dfsb_hmsc_traverser.h
===================================================================
--- trunk/src/data/dfsb_hmsc_traverser.h 2009-04-26 19:30:44 UTC (rev 230)
+++ trunk/src/data/dfsb_hmsc_traverser.h 2009-04-26 19:48:01 UTC (rev 231)
@@ -52,7 +52,7 @@
*/
virtual void traverse(HMscPtr hmsc);
- virtual void traverse(HMscNode* node);
+ virtual void traverse(HMscNode* node, bool cleanup=true);
/**
* Cleans up traversing attributes
Modified: trunk/tests/livelock_checker_test.cpp
===================================================================
--- trunk/tests/livelock_checker_test.cpp 2009-04-26 19:30:44 UTC (rev 230)
+++ trunk/tests/livelock_checker_test.cpp 2009-04-26 19:48:01 UTC (rev 231)
@@ -3,8 +3,11 @@
#include <string>
#include <iostream>
-int main() {
- std::cout << "Test of livelock: " << std::endl;
+#define RETURN_IF_FAILED(test) if(!(test)) return 1;
+
+bool TestA()
+{
+ std::cout << "Test of livelock A: " << std::endl;
std::cout << "h1: h2: " << std::endl;
std::cout << " start start " << std::endl;
std::cout << " | | " << std::endl;
@@ -51,10 +54,85 @@
if(path_h1.get())
{
std::cerr << "OK: h1 contains livelock" << std::endl;
- return 0;
+ return true;
}
std::cerr << "ERROR: h1 doesn't contain livelock" << std::endl;
- return 1;
+ return false;
}
+bool TestB()
+{
+ std::cout << "Test of livelock B:" << std::endl;
+ std::cout << " start " << std::endl;
+ std::cout << " | " << std::endl;
+ std::cout << " p2 = p1 " << std::endl;
+ std::cout << " \\ " << std::endl;
+ std::cout << " end " << std::endl;
+
+ HMscPtr h1(new HMsc("h1"));
+
+ StartNodePtr start1 = new StartNode(); h1->set_start(start1);
+ EndNodePtr end1(new EndNode);h1->add_node(end1);
+ ReferenceNodePtr p1(new ReferenceNode());h1->add_node(p1);
+ ReferenceNodePtr p2(new ReferenceNode());h1->add_node(p2);
+
+ start1->add_successor(p1.get());
+ p1->add_successor(p2.get());
+ p1->add_successor(end1.get());
+ p2->add_successor(p1.get());
+
+ ChannelMapperPtr chm;
+ LivelockCheckerPtr live = LivelockChecker::instance();
+
+ HMscPtr path_h1 = live->check(h1,chm);
+ if(path_h1.get())
+ {
+ std::cerr << "ERROR: h1 contains livelock" << std::endl;
+ return false;
+ }
+ std::cerr << "OK: h1 doesn't contain livelock" << std::endl;
+ return true;
+}
+
+bool TestC()
+{
+ std::cout << "Test of livelock C:" << std::endl;
+ std::cout << " start " << std::endl;
+ std::cout << " | " << std::endl;
+ std::cout << " p2 = p1 " << std::endl;
+ std::cout << " \\ " << std::endl;
+ std::cout << " end " << std::endl;
+
+ HMscPtr h1(new HMsc("h1"));
+
+ StartNodePtr start1 = new StartNode(); h1->set_start(start1);
+ EndNodePtr end1(new EndNode);h1->add_node(end1);
+ ReferenceNodePtr p1(new ReferenceNode());h1->add_node(p1);
+ ReferenceNodePtr p2(new ReferenceNode());h1->add_node(p2);
+
+ start1->add_successor(p1.get());
+ p1->add_successor(end1.get());
+ p1->add_successor(p2.get());
+ p2->add_successor(p1.get());
+
+ ChannelMapperPtr chm;
+ LivelockCheckerPtr live = LivelockChecker::instance();
+
+ HMscPtr path_h1 = live->check(h1,chm);
+ if(path_h1.get())
+ {
+ std::cerr << "ERROR: h1 contains livelock" << std::endl;
+ return false;
+ }
+ std::cerr << "OK: h1 doesn't contain livelock" << std::endl;
+ return true;
+}
+
+int main() {
+ RETURN_IF_FAILED(TestA());
+ RETURN_IF_FAILED(TestB());
+ RETURN_IF_FAILED(TestC());
+ return 0;
+}
+
// $Id$
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2009-05-02 14:22:25
|
Revision: 240
http://scstudio.svn.sourceforge.net/scstudio/?rev=240&view=rev
Author: madzin
Date: 2009-05-02 13:42:24 +0000 (Sat, 02 May 2009)
Log Message:
-----------
add new functionality: many msc in one file, recognize first line from Visio file ('mscdocument'), error reports
fix bugs: many coregions on one instance
Modified Paths:
--------------
trunk/src/data/Z120/CMakeLists.txt
trunk/src/data/Z120/Context.cpp
trunk/src/data/Z120/Context.h
trunk/src/data/Z120/Z120.g
trunk/src/data/Z120/main.cpp
trunk/src/data/Z120/z120.h
trunk/src/data/Z120/z120_load.cpp
trunk/tests/z120_test.cpp
Modified: trunk/src/data/Z120/CMakeLists.txt
===================================================================
--- trunk/src/data/Z120/CMakeLists.txt 2009-05-01 13:25:31 UTC (rev 239)
+++ trunk/src/data/Z120/CMakeLists.txt 2009-05-02 13:42:24 UTC (rev 240)
@@ -28,6 +28,7 @@
# Petr: to be removed after proper integration
TARGET_LINK_LIBRARIES(parser
scmsc
+ scZ120
${PARSER_LIBRARIES})
ENDIF(ANTLR_FOUND)
Modified: trunk/src/data/Z120/Context.cpp
===================================================================
--- trunk/src/data/Z120/Context.cpp 2009-05-01 13:25:31 UTC (rev 239)
+++ trunk/src/data/Z120/Context.cpp 2009-05-02 13:42:24 UTC (rev 240)
@@ -32,6 +32,7 @@
#include <list>
#include <set>
#include "data/msc.h"
+#include "z120.h"
struct Context
{
@@ -44,15 +45,23 @@
std::string element_name;
/*
+ * Textual file
+ */
+ std::map<std::string, MscPtr> mscs; //map of msc in the file
+ std::set<std::string> nonpointed; //msc which is not refered
+ std::map<std::string, std::set<ReferenceNodePtr> > future_reference; //map of name of nodes on which was refered and does not exist
+ Z120* z;
+
+ /*
* BMsc
*/
BMscPtr myBmsc;
std::set<std::string> coregion_area_finished; // set of instances which has currently finished coregion area
+ std::set<std::string> coregion_area_opened; //set of instances which has currently opend coregion area
std::map<std::string, InstancePtr> instances; // map of instances (key: name of instance, value: smart pointer to instance)
- std::map<std::string, CompleteMessagePtr> messages; // map of complete messages
-// std::map<std::string, EventPtr> coregion_events; // map of events in coregions
+ std::multimap<std::string, CompleteMessagePtr> messages; // map of future complete messages
std::map<std::string, EventPtr> future_events; // map of name of events on which was pointed before they were created
- std::map<std::string, CoregionEvent*> named_events; // map of name of events
+ std::map<std::string, CoregionEventPtr> named_events; // map of name of events
std::set<std::string> order_events; //set of name of events which takes place after keywords 'before', 'after'
EventPtr current_event; //event which was currently created
std::string event_name; //name of event
@@ -61,9 +70,11 @@
* HMsc
*/
HMscPtr myHmsc;
+ StartNodePtr start_node;
std::pair<std::string, EndNodePtr> end_node;
- std::list<std::string> connect_name; // name of HMsc nodes to which node is connected
+ std::list<std::string> connect_name; // name of HMsc nodes which are successors of actual node
std::string reference_name;
+ std::string condition_name;
std::map<std::string, HMscNodePtr> hmsc_nodes; // map of hmsc nodes (key: name of node, value: smart pointer to node)
std::map<std::string, std::set<std::string> > future_connections; // map of nodes to which node will be connected
int node_type; //flag to recognize HMsc nodes (ConnectionNode, ReferenceNode, ConditionNode). Used in Z120.g
@@ -84,30 +95,74 @@
*/
void init(struct Context* context)
{
+ context->myBmsc = new BMsc("");
+ context->myHmsc = new HMsc("");
context->myBmsc = NULL;
context->myHmsc = NULL;
context->element_name = "";
context->reference_name = "";
+ context->condition_name = "";
context->node_type = 0;
context->event_name = "";
+ context->coregion_area_finished.clear();
+ context->instances.clear();
+ context->messages.clear();
+ context->future_events.clear();
+ context->named_events.clear();
+ context->current_event = NULL;
+
+ context->start_node = NULL;
+ context->end_node = std::make_pair("", context->end_node.second); //replaice context->end_node.second with NULL
+ context->connect_name.clear();
+ context->hmsc_nodes.clear();
+ context->future_connections.clear();
}
/*
* Return Msc structure.
*/
-struct s_Msc* get_msc_fun(struct Context* context)
+MscPtr get_msc_fun(struct Context* context)
{
- Msc* my_msc;
if (context->myBmsc == NULL)
{
- my_msc = context->myHmsc.get();
+ return context->myHmsc;
}
else
{
- my_msc = context->myBmsc.get();
+ return context->myBmsc;
}
- intrusive_ptr_add_ref(my_msc);
+ return NULL;
+}
+
+struct s_Msc* get_total_msc_fun(struct Context* context)
+{
+ Msc* my_msc = NULL;
+ if(context->nonpointed.size() == 1){
+ if(context->mscs.find(*(context->nonpointed.begin())) == context->mscs.end())
+ {
+ context->z->print_report(RS_ERROR, "Internal Error 01: MSC was not found \n");
+ }
+ else{
+ my_msc = context->mscs.find(*(context->nonpointed.begin()))->second.get();
+ }
+ }
+ else
+ {
+ if(context->nonpointed.size() > 1)
+ {
+ context->z->print_report(RS_ERROR, "Error 02: There are more unreferenced MSC\n");
+ }
+ else
+ {
+ context->z->print_report(RS_ERROR, "Error 03: There is no MSC without reference \n");
+ }
+ }
+
+ if(my_msc != NULL)
+ {
+ intrusive_ptr_add_ref(my_msc);
+ }
return static_cast<s_Msc*> (my_msc);
}
@@ -117,12 +172,14 @@
struct Context* new_context()
{
Context* context = new Context;
- context->myBmsc = new BMsc("");
- context->myHmsc = new HMsc("");
- init(context);
return context;
}
+void add_z_fun(struct Context* context, struct s_Z120* z)
+{
+ context->z = static_cast<Z120*> (z);
+}
+
/*
* Free memory space
*/
@@ -131,21 +188,64 @@
delete context;
}
-// nothing importatn only for my check
+/*
+ * Check if all collections are empty
+ */
+void check_collections_fun(struct Context* context)
+{
+ if(!context->coregion_area_opened.empty())
+ context->z->print_report(RS_ERROR, stringize() << "Warning 04: Instance " << context->element_name << "does not have finished some coregion\n");
-void print(struct Context* context)
+ if(!context->messages.empty())
+ context->z->print_report(RS_ERROR, "Error 05: There is complete message without receiver\n");
+
+ if(!context->future_events.empty())
+ context->z->print_report(RS_ERROR, "Error 06: There is dependency on nonexisted event\n");
+
+ if(!context->order_events.empty())
+ context->z->print_report(RS_ERROR, "Error 07: There is reference to nonexisted event\n");
+
+ if(!context->future_connections.empty())
+ context->z->print_report(RS_ERROR, "Error 08: There is reference to nonexisted node\n");
+}
+
+void check_references_fun(struct Context* context)
{
- if (context->myBmsc == NULL)
+ if(!context->future_reference.empty())
+ context->z->print_report(RS_ERROR, "Error 09: There is references to nonexisted MSC\n");
+}
+
+void msc_was_read_fun(struct Context* context)
+{
+ context->mscs.insert(std::make_pair(context->msc_name, get_msc_fun(context)));
+
+ std::map<std::string, std::set<ReferenceNodePtr> >::iterator future_ref_it;
+ future_ref_it = context->future_reference.find(context->msc_name);
+
+ if(future_ref_it == context->future_reference.end())
{
- std::cout << "node's number " << context->myHmsc->get_nodes().size() << std::endl;
+ context->nonpointed.insert(context->msc_name);
}
else
{
- std::cout << "instance's number " << context->myBmsc->get_instances().size() << std::endl;
+ MscPtr msc = get_msc_fun(context);
+ std::set<ReferenceNodePtr>::iterator references = future_ref_it->second.begin();
+ for(; references != future_ref_it->second.end(); ++references)
+ {
+ (*references)->set_msc(msc);
+ }
+ context->future_reference.erase(future_ref_it);
}
}
/*
+ * Bug report from grammar
+ */
+void bug_report(struct Context* context, char* report){
+ context->z->print_report(RS_ERROR, report);
+}
+
+/*
* Create new BMsc structure
*/
void new_bmsc_fun(struct Context* context)
@@ -159,18 +259,25 @@
void incomplete_message_output_fun(struct Context* context, char* msg_identifications)
{
std::string msg_identification(msg_identifications);
+ std::string msg_name;
size_t pos = msg_identification.rfind(',');
if(pos != 0)
{
- msg_identification = msg_identification.substr(0, pos);
+ msg_name = msg_identification.substr(0, pos);
}
+ else
+ {
+ msg_name = msg_identification;
+ }
InstancePtr instance = context->instances.find(context->element_name)->second;
- if (instance->get_last() == NULL)
+ if (instance->get_last() == NULL ||
+ context->coregion_area_finished.find(context->element_name) != context->coregion_area_finished.end())
{
StrictOrderAreaPtr strict(new StrictOrderArea());
instance->add_area(strict);
+ context->coregion_area_finished.erase(context->element_name);
}
std::map<std::string, EventPtr>::iterator event_it;
@@ -185,19 +292,20 @@
else
{
event = event_it->second;
+ context->future_events.erase(event_it);
}
context->current_event = event;
- IncompleteMessagePtr message = new IncompleteMessage(LOST, msg_identification);
+ IncompleteMessagePtr message = new IncompleteMessage(LOST, msg_name);
message->glue_event(event);
//if event is named, it adds event to named_events
if(context->event_name != "")
{
- CoregionEvent* event1 = dynamic_cast<CoregionEvent*> (event.get());
+ CoregionEventPtr event1 = boost::dynamic_pointer_cast<CoregionEvent>(event);
if(event1 != NULL){
- context->named_events.insert(std::make_pair(context->event_name, event1));
+// context->named_events.insert(std::make_pair(context->event_name, event1));
}
}
@@ -210,18 +318,25 @@
void incomplete_message_input_fun(struct Context* context, char* msg_identifications)
{
std::string msg_identification(msg_identifications);
+ std::string msg_name;
size_t pos = msg_identification.rfind(',');
if(pos != 0)
{
- msg_identification = msg_identification.substr(0, pos);
+ msg_name = msg_identification.substr(0, pos);
}
+ else
+ {
+ msg_name = msg_identification;
+ }
InstancePtr instance = context->instances.find(context->element_name)->second;
- if (instance->get_last() == NULL)
+ if (instance->get_last() == NULL ||
+ context->coregion_area_finished.find(context->element_name) != context->coregion_area_finished.end())
{
StrictOrderAreaPtr strict(new StrictOrderArea());
instance->add_area(strict);
+ context->coregion_area_finished.erase(context->element_name);
}
std::map<std::string, EventPtr>::iterator event_it;
@@ -236,17 +351,18 @@
else
{
event = event_it->second;
+ context->future_events.erase(event_it);
}
context->current_event = event;
- IncompleteMessagePtr message = new IncompleteMessage(FOUND, msg_identification);
+ IncompleteMessagePtr message = new IncompleteMessage(FOUND, msg_name);
message->glue_event(event);
//if event is named, it adds event to named_events
if(context->event_name != "")
{
- CoregionEvent* event1 = dynamic_cast<CoregionEvent*> (event.get());
+ CoregionEventPtr event1 = boost::dynamic_pointer_cast<CoregionEvent>(event);
if(event1 != NULL){
context->named_events.insert(std::make_pair(context->event_name, event1));
}
@@ -277,9 +393,23 @@
*/
void start_coregion_fun(struct Context* context)
{
- InstancePtr instance = context->instances.find(context->element_name)->second;
- CoregionAreaPtr coregion(new CoregionArea());
- instance->add_area(coregion);
+ std::set<std::string>::iterator it = context->coregion_area_finished.find(context->element_name);
+ if(it != context->coregion_area_finished.end())
+ {
+ context->coregion_area_finished.erase(it);
+ }
+
+ if(context->coregion_area_opened.find(context->element_name) == context->coregion_area_opened.end())
+ {
+ InstancePtr instance = context->instances.find(context->element_name)->second;
+ CoregionAreaPtr coregion(new CoregionArea());
+ instance->add_area(coregion);
+ context->coregion_area_opened.insert(context->element_name);
+ }
+ else
+ {
+ context->z->print_report(RS_ERROR, stringize() << "Error 10: Instance " << context->element_name << " has already had opened some coregion\n");
+ }
}
/*
@@ -287,8 +417,16 @@
*/
void end_coregion_fun(struct Context* context)
{
- InstancePtr instance = context->instances.find(context->element_name)->second;
- context->coregion_area_finished.insert(context->element_name);
+ if(context->coregion_area_opened.find(context->element_name) != context->coregion_area_opened.end())
+ {
+ InstancePtr instance = context->instances.find(context->element_name)->second;
+ context->coregion_area_finished.insert(context->element_name);
+ context->coregion_area_opened.erase(context->element_name);
+ }
+ else
+ {
+ context->z->print_report(RS_ERROR, stringize() << "Error 11: Instance " << context->element_name << " does not have opened any coregion\n"); //check
+ }
}
/*
@@ -296,15 +434,22 @@
*/
void message_output_fun(struct Context* context, char* msg_identifications)
{
+ //message identification
std::string msg_identification(msg_identifications);
+ std::string msg_name;
size_t pos = msg_identification.rfind(',');
if(pos != 0)
{
- msg_identification = msg_identification.substr(0, pos);
+ msg_name = msg_identification.substr(0, pos);
}
+ else
+ {
+ msg_name = msg_identification;
+ }
InstancePtr instance = context->instances.find(context->element_name)->second;
-
+
+ //add new strict area to instance if it is needed
if (instance->get_last() == NULL ||
context->coregion_area_finished.find(context->element_name) != context->coregion_area_finished.end())
{
@@ -325,18 +470,28 @@
else
{
event = event_it->second;
+ context->future_events.erase(event_it);
}
context->current_event = event;
- if (context->messages.find(msg_identification) != context->messages.end())
- {
- context->messages.find(msg_identification)->second->glue_send_event(event);
- context->messages.erase(msg_identification);
+ std::multimap<std::string, CompleteMessagePtr>::iterator message_it;
+ message_it = context->messages.find(msg_identification);
+
+ if (message_it != context->messages.end()
+&& message_it->second->get_send_event() == NULL)
+ {
+ message_it->second->glue_send_event(event);
+ context->messages.erase(message_it);
}
else
{
- CompleteMessagePtr message = new CompleteMessage(msg_identification);
+ if(message_it != context->messages.end())
+ {
+ context->z->print_report(RS_ERROR, "Error 12: Message has already had specified the sender\n"); //warning
+
+ }
+ CompleteMessagePtr message = new CompleteMessage(msg_name);
message->glue_send_event(event);
context->messages.insert(std::make_pair(msg_identification, message));
}
@@ -344,7 +499,7 @@
//if event is named, it adds event to named_events
if(context->event_name != "")
{
- CoregionEvent* event1 = dynamic_cast<CoregionEvent*> (event.get());
+ CoregionEventPtr event1 = boost::dynamic_pointer_cast<CoregionEvent>(event);
if(event1 != NULL){
context->named_events.insert(std::make_pair(context->event_name, event1));
}
@@ -359,11 +514,16 @@
void message_input_fun(struct Context* context, char* msg_identifications)
{
std::string msg_identification(msg_identifications);
+ std::string msg_name;
size_t pos = msg_identification.rfind(',');
if(pos != 0)
{
- msg_identification = msg_identification.substr(0, pos);
+ msg_name = msg_identification.substr(0, pos);
}
+ else
+ {
+ msg_name = msg_identification;
+ }
InstancePtr instance = context->instances.find(context->element_name)->second;
@@ -372,11 +532,12 @@
{
StrictOrderAreaPtr strict(new StrictOrderArea());
instance->add_area(strict);
+ context->coregion_area_finished.erase(context->element_name);
}
std::map<std::string, EventPtr>::iterator event_it;
EventPtr event;
-
+
//if the event was created prematurely
if(context->event_name == "" ||
(event_it = context->future_events.find(context->event_name)) == context->future_events.end())
@@ -386,18 +547,27 @@
else
{
event = event_it->second;
+ context->future_events.erase(event_it);
}
context->current_event = event;
- if (context->messages.find(msg_identification) != context->messages.end())
+ std::multimap<std::string, CompleteMessagePtr>::iterator message_it;
+ message_it = context->messages.find(msg_identification);
+
+ if(message_it != context->messages.end()
+&& message_it->second->get_receive_event() == NULL)
{
- context->messages.find(msg_identification)->second->glue_receive_event(event);
- context->messages.erase(msg_identification);
+ message_it->second->glue_receive_event(event);
+ context->messages.erase(message_it);
}
else
{
- CompleteMessagePtr message = new CompleteMessage(msg_identification);
+ if(message_it != context->messages.end())
+ {
+ std::cout << "get receive event nieje null " <<std::endl;
+ }
+ CompleteMessagePtr message = new CompleteMessage(msg_name);
message->glue_receive_event(event);
context->messages.insert(std::make_pair(msg_identification, message));
}
@@ -405,7 +575,7 @@
//if event is named, it adds event to named_events
if(context->event_name != "")
{
- CoregionEvent* event1 = dynamic_cast<CoregionEvent*> (event.get());
+ CoregionEventPtr event1 = boost::dynamic_pointer_cast<CoregionEvent>(event);
if(event1 != NULL){
context->named_events.insert(std::make_pair(context->event_name, event1));
}
@@ -419,26 +589,26 @@
*/
void add_before_relation_fun(struct Context* context){
std::set<std::string>::iterator it;
- std::map<std::string, CoregionEvent*>::iterator named_event_it;
- CoregionEvent* event = dynamic_cast<CoregionEvent*> (context->current_event.get());
+ std::map<std::string, CoregionEventPtr>::iterator named_event_it;
+ CoregionEventPtr event = boost::dynamic_pointer_cast<CoregionEvent>(context->current_event);
if(event == NULL){
-// bug report
+ context->z->print_report(RS_ERROR, "Internal Error 13: Typecast failed\n");
return;
}
for(it = context->order_events.begin(); it != context->order_events.end(); ++it){
if((named_event_it = context->named_events.find(*it)) != context->named_events.end()){
-// CoregEventRelPtr rel = new CoregionEventRelation(NULL, named_event_it->second);
-// event->add_successor(rel);
- event->add_successor(named_event_it->second);
+ event->add_successor(named_event_it->second.get());
}
else{
- CoregionEventPtr event1 = new CoregionEvent();
- context->future_events.insert(std::make_pair(*it, event1));
-// CoregEventRelPtr rel = new CoregionEventRelation(NULL, event1.get());
-// event->add_successor(rel);
- event->add_successor(event1.get());
+ InstancePtr instance = context->instances.find(context->element_name)->second;
+
+ EventPtr event1 = instance->get_last()->add_event();
+ CoregionEventPtr event2 = boost::dynamic_pointer_cast<CoregionEvent>(event1);
+ context->future_events.insert(std::make_pair(*it, event2));
+ event->add_successor(event2.get());
}
}
+ context->order_events.clear();
}
/*
@@ -446,28 +616,26 @@
*/
void add_after_relation_fun(struct Context* context){
std::set<std::string>::iterator it;
- std::map<std::string, CoregionEvent*>::iterator named_event_it;
- CoregionEvent* event = dynamic_cast<CoregionEvent*> (context->current_event.get());
+ std::map<std::string, CoregionEventPtr>::iterator named_event_it;
+ CoregionEventPtr event = boost::dynamic_pointer_cast<CoregionEvent> (context->current_event);
if(event == NULL){
-// bug report
+ context->z->print_report(RS_ERROR, "Internal Error 13: Typecast failed\n");
return;
}
for(it = context->order_events.begin(); it != context->order_events.end(); ++it){
if((named_event_it = context->named_events.find(*it)) != context->named_events.end()){
-// CoregEventRelPtr rel = new CoregionEventRelation(NULL, named_event_it->second);
-// event->add_predecessor(rel);
-//TODO bol by som najradsej keby sa to fungovalo iba so spodnym riadkom na to je potrebne zmenit msc.h msc.cpp
-// event->add_predecessor(named_event_it->second);
+ named_event_it->second->add_successor(event.get());
}
else{
- CoregionEventPtr event1 = new CoregionEvent();
- context->future_events.insert(std::make_pair(*it, event1));
-// CoregEventRelPtr rel = new CoregionEventRelation(NULL, event1.get());
-// event->add_predecessor(rel);
-//TODO bol by som najradsej keby sa to fungovalo iba so spodnym riadkom na to je potrebne zmenit msc.h msc.cpp
-// event->add_predecessor(event1.get());
+ InstancePtr instance = context->instances.find(context->element_name)->second;
+
+ EventPtr event1 = instance->get_last()->add_event();
+ CoregionEventPtr event2 = boost::dynamic_pointer_cast<CoregionEvent>(event1);
+ context->future_events.insert(std::make_pair(*it, event2));
+ event2->add_successor(event.get());
}
}
+ context->order_events.clear();
}
/*
* Set name of instance
@@ -477,7 +645,7 @@
context->element_name = name;
}
-void add_event_name_fun(struct Context* context, char* name)
+void set_event_name_fun(struct Context* context, char* name)
{
context->event_name = name;
}
@@ -492,8 +660,6 @@
void new_hmsc_fun(struct Context* context)
{
context->myHmsc = new HMsc(context->msc_name);
-
- std::cout << "HMscPtr myHmsc(new Hmsc(" << context->msc_name << "));" << std::endl << std::endl;
}
/*
@@ -501,38 +667,28 @@
*/
void new_start_node_fun(struct Context* context)
{
- if (context->connect_name.size() == 1)
- {
- StartNodePtr node = new StartNode();
- context->myHmsc->set_start(node);
- future_connection_fill_in_fun(context);
- }
- else
- {
- std::cout << "error: new_start_node_fun" << std::endl;
- //bug report
- }
- std::cout << "myHmsc->set_start(new StartNode());" << std::endl;
+ StartNodePtr node = new StartNode();
+ context->myHmsc->set_start(node);
+ context->start_node = node;
+ future_connection_fill_in_fun(context);
}
/*
* Create end node of HMsc
*/
-void new_end_node_fun(struct Context* context, char* name)
+void new_end_node_fun(struct Context* context)
{
if (context->connect_name.size() == 0)
{
EndNodePtr node = new EndNode();
context->myHmsc->add_node(node);
- context->end_node = make_pair(context->element_name, node);
+ context->end_node = std::make_pair(context->element_name, node);
+ create_future_connections_fun(context, node.get());
}
else
{
- std::cout << "error: new_end_node_fun" << std::endl;
- //bug report
+ context->z->print_report(RS_ERROR, "Error 14: There is node which is successor of end node\n");
}
-
- std::cout << "myHmsc->add_node(new EndNode());" << std::endl;
}
/*
@@ -544,6 +700,14 @@
}
/*
+ * Set condition name
+ */
+void set_condition_name_fun(struct Context* context, char* name)
+{
+ context->condition_name = name;
+}
+
+/*
* Set name of node
*/
void set_node_name_fun(struct Context* context, char* name)
@@ -565,20 +729,47 @@
void new_reference_node_fun(struct Context* context)
{
std::map<std::string, HMscNodePtr>::iterator it = context->hmsc_nodes.find(context->element_name);
+ std::map<std::string, MscPtr>::iterator msc_it = context->mscs.find(context->reference_name);
+
if (it == context->hmsc_nodes.end())
{
ReferenceNodePtr node = new ReferenceNode();
- BMscPtr bmsc = new BMsc (context->reference_name);
- node->set_msc(bmsc);
+ std::map<std::string, MscPtr>::iterator msc_it = context->mscs.find(context->reference_name);
+
+ if(msc_it == context->mscs.end())
+ {
+ std::map<std::string, std::set<ReferenceNodePtr> >::iterator ref_it = context->future_reference.find(context->reference_name);
+
+ if(ref_it != context->future_reference.end())
+ {
+ ref_it->second.insert(node);
+ }
+ else
+ {
+ std::set<ReferenceNodePtr> my_set;
+ my_set.insert(node);
+ context->future_reference.insert(std::make_pair(context->reference_name, my_set));
+ }
+ }
+ else
+ {
+ node->set_msc(msc_it->second);
+
+ std::set<std::string>::iterator erase_it = context->nonpointed.find(context->reference_name);
+ if(erase_it != context->nonpointed.end())
+ {
+ context->nonpointed.erase(erase_it);
+ }
+ }
+
context->hmsc_nodes.insert(make_pair(context->element_name, node));
context->myHmsc->add_node(node);
future_connection_fill_in_fun(context);
create_future_connections_fun(context, node.get());
- std::cout << "new_referenceNode()" << std::endl;
}
else
{
- //bug report
+ context->z->print_report(RS_ERROR, stringize() << "Error 15: The node " << context->element_name << " has already been existing\n");
}
}
@@ -596,11 +787,10 @@
context->myHmsc->add_node(node);
future_connection_fill_in_fun(context);
create_future_connections_fun(context, node.get());
- std::cout << "new_connectionNode()" << std::endl;
}
else
{
- //bug report
+ context->z->print_report(RS_ERROR, stringize() << "Error 15: The node " << context->element_name << " has already been existing\n");
}
context->node_type = 0;
}
@@ -614,16 +804,15 @@
if (it == context->hmsc_nodes.end())
{
- ConditionNodePtr node = new ConditionNode();
+ ConditionNodePtr node = new ConditionNode(context->condition_name);
context->hmsc_nodes.insert(std::make_pair(context->element_name, node));
context->myHmsc->add_node(node);
future_connection_fill_in_fun(context);
create_future_connections_fun(context, node.get());
- std::cout << "new_conditionNode()" << std::endl;
}
else
{
- //bug report
+ context->z->print_report(RS_ERROR, stringize() << "Error 15: The node " << context->element_name << " has already been existing\n");
}
context->node_type = 0;
}
@@ -633,13 +822,18 @@
*/
void future_connection_fill_in_fun(struct Context* context)
{
+ if(context->element_name == "")
+ {
+ context->element_name = "start";
+ }
+
while (!context->connect_name.empty())
{
std::map<std::string, std::set<std::string> >::iterator future_it;
std::map<std::string, HMscNodePtr>::iterator hmsc_it;
future_it = context->future_connections.find(context->connect_name.front());
- hmsc_it = context->hmsc_nodes.find(context->connect_name.front());
+ hmsc_it = context->hmsc_nodes.find(context->connect_name.front()); //node which has to be connected to current node
if (hmsc_it == context->hmsc_nodes.end() && context->connect_name.front() != context->end_node.first)
{
@@ -647,7 +841,7 @@
{ //check of record existence in future connections for this node
std::set<std::string> my_set;
my_set.insert(context->element_name);
- context->future_connections.insert(std::make_pair(context->element_name, my_set));
+ context->future_connections.insert(std::make_pair(context->connect_name.front(), my_set));
context->connect_name.pop_front();
}
else
@@ -664,12 +858,14 @@
{
SuccessorNode* succ = dynamic_cast<SuccessorNode*> (hmsc_it->second.get());
node->add_successor(succ);
+ context->connect_name.pop_front();
}
else
{
if (context->connect_name.front() == context->end_node.first)
{
node->add_successor(context->end_node.second.get());
+ context->connect_name.pop_front();
}
}
}
@@ -695,7 +891,14 @@
PredecessorNode* node = dynamic_cast<PredecessorNode*> (hmsc_node_it->second.get());
node->add_successor(succ);
}
+ else
+ {
+ PredecessorNode* node = dynamic_cast<PredecessorNode*> (context->start_node.get());
+ node->add_successor(succ);
+ }
}
+
+ context->future_connections.erase(future_it);
}
}
Modified: trunk/src/data/Z120/Context.h
===================================================================
--- trunk/src/data/Z120/Context.h 2009-05-01 13:25:31 UTC (rev 239)
+++ trunk/src/data/Z120/Context.h 2009-05-02 13:42:24 UTC (rev 240)
@@ -30,19 +30,28 @@
struct Context;
struct s_Msc;
+struct s_Z120;
void set_msc_name_fun(struct Context* context, char* name);
void init(struct Context* context);
-struct s_Msc* get_msc_fun(struct Context* context);
+struct s_Msc* get_total_msc_fun(struct Context* context);
struct Context* new_context();
+void add_z_fun(struct Context* context, struct s_Z120* z);
+
void delete_context(struct Context* context);
-void print(struct Context* context);
+void check_collections_fun(struct Context* context);
+void check_references_fun(struct Context* context);
+
+void msc_was_read_fun(struct Context* context);
+
+void bug_report(struct Context* context, char* report);
+
//BMsc
void new_bmsc_fun(struct Context* context);
@@ -68,7 +77,7 @@
void set_instance_name_fun(struct Context* context, char* name);
-void add_event_name_fun(struct Context* context, char* name);
+void set_event_name_fun(struct Context* context, char* name);
// BMscStruct* get_bmsc();
//HMsc
@@ -76,10 +85,12 @@
void new_start_node_fun(struct Context* context);
-void new_end_node_fun(struct Context* context, char* name);
+void new_end_node_fun(struct Context* context);
void set_reference_name_fun(struct Context* context, char* name);
+void set_condition_name_fun(struct Context* context, char*...
[truncated message content] |
|
From: <got...@us...> - 2009-05-03 14:23:03
|
Revision: 241
http://scstudio.svn.sourceforge.net/scstudio/?rev=241&view=rev
Author: gotthardp
Date: 2009-05-03 13:33:40 +0000 (Sun, 03 May 2009)
Log Message:
-----------
Implemented universal check tester. Currently for Linux only.
Modified Paths:
--------------
trunk/src/check/pseudocode/communication_graph.cpp
trunk/src/data/Z120/z120_save.cpp
trunk/tests/CMakeLists.txt
Added Paths:
-----------
trunk/tests/checker_test.cpp
Modified: trunk/src/check/pseudocode/communication_graph.cpp
===================================================================
--- trunk/src/check/pseudocode/communication_graph.cpp 2009-05-02 13:42:24 UTC (rev 240)
+++ trunk/src/check/pseudocode/communication_graph.cpp 2009-05-03 13:33:40 UTC (rev 241)
@@ -185,4 +185,4 @@
return true;
}
-// $Id$
\ No newline at end of file
+// $Id$
Modified: trunk/src/data/Z120/z120_save.cpp
===================================================================
--- trunk/src/data/Z120/z120_save.cpp 2009-05-02 13:42:24 UTC (rev 240)
+++ trunk/src/data/Z120/z120_save.cpp 2009-05-03 13:33:40 UTC (rev 241)
@@ -38,6 +38,9 @@
for(std::list<MscPtr>::const_iterator pos = m_printing.begin();
pos != m_printing.end(); pos++)
{
+ if(*pos == NULL)
+ continue;
+
// if not already generated
if(printed.find((*pos)->get_label()) == printed.end())
{
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2009-05-02 13:42:24 UTC (rev 240)
+++ trunk/tests/CMakeLists.txt 2009-05-03 13:33:40 UTC (rev 241)
@@ -78,6 +78,26 @@
ADD_TEST(z120-01 ${EXECUTABLE_OUTPUT_PATH}/z120_test z120_test00.mpr)
ADD_TEST(z120-01 ${EXECUTABLE_OUTPUT_PATH}/z120_test z120_test01.mpr)
ADD_TEST(z120-02 ${EXECUTABLE_OUTPUT_PATH}/z120_test z120_test02.mpr)
+
+ADD_EXECUTABLE(checker_test
+ checker_test.cpp
+)
+TARGET_LINK_LIBRARIES(checker_test
+ scZ120
+ ${CMAKE_DL_LIBS}
+)
+
+SET(CHECKER_SEQUENCE 0)
+MACRO(ADD_CHECKER_TEST LIBRARY PROPERTY FILE SATISFIED)
+ GET_TARGET_PROPERTY(LIBRARY_LOCATION ${LIBRARY} LOCATION)
+ ADD_TEST("checker-${CHECKER_SEQUENCE}-${LIBRARY}"
+ ${EXECUTABLE_OUTPUT_PATH}/checker_test ${LIBRARY_LOCATION} ${PROPERTY} ${FILE} ${SATISFIED})
+ MATH(EXPR CHECKER_SEQUENCE ${CHECKER_SEQUENCE}+1)
+ENDMACRO(ADD_CHECKER_TEST)
+
+ADD_CHECKER_TEST(scorder "FIFO" z120_test00.mpr 1)
+ADD_CHECKER_TEST(scorder "Acyclic" z120_test00.mpr 1)
+ADD_CHECKER_TEST(scrace "Race Free" z120_test00.mpr 1)
ENDIF(ANTLR_FOUND)
ADD_EXECUTABLE(decimal_test
Added: trunk/tests/checker_test.cpp
===================================================================
--- trunk/tests/checker_test.cpp (rev 0)
+++ trunk/tests/checker_test.cpp 2009-05-03 13:33:40 UTC (rev 241)
@@ -0,0 +1,157 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2009 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#include <iostream>
+#include "data/checker.h"
+#include "data/Z120/z120.h"
+
+#include <stdexcept>
+#include <dlfcn.h>
+
+MscPtr run_check(const FInitCheckers& init_checkers,
+ const std::string& property, MscPtr msc)
+{
+ boost::shared_ptr<Checker> checker;
+
+ Checker **checkers = init_checkers();
+ for(Checker **fpos = checkers; *fpos != NULL; fpos++)
+ {
+ if((*fpos)->get_property_name() == property)
+ {
+ checker = boost::shared_ptr<Checker>(*fpos);
+ break;
+ }
+
+ delete *fpos;
+ }
+ delete[] checkers;
+
+ if(checker == NULL)
+ {
+ std::cerr << "ERROR: Checker for property " << property << " not found" << std::endl;
+ throw std::runtime_error("invalid checker");
+ }
+
+ SRChannelMapperPtr srm(new SRChannelMapper());
+
+ BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc);
+ BMscCheckerPtr bmsc_checker = boost::dynamic_pointer_cast<BMscChecker>(checker);
+ if(bmsc_checker != NULL && bmsc != NULL)
+ {
+ return bmsc_checker->check(bmsc, srm);
+ }
+
+ HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc>(msc);
+ HMscCheckerPtr hmsc_checker = boost::dynamic_pointer_cast<HMscChecker>(checker);
+ if(hmsc_checker != NULL && hmsc != NULL)
+ {
+ return hmsc_checker->check(hmsc, srm);
+ }
+
+ std::cerr << "ERROR: No relevant checker for " << property << std::endl;
+ throw std::runtime_error("invalid checker");
+}
+
+int main(int argc, char** argv)
+{
+ if(argc < 5)
+ {
+ std::cerr << "Usage: " << argv[0] << " <library> <property> <msc> <satisfied>" << std::endl;
+ return 1;
+ }
+
+ void *handle = dlopen(argv[1], RTLD_LAZY);
+ if(handle == NULL)
+ {
+ std::cerr << "ERROR: Cannot open " << argv[1] << ": " << dlerror() << std::endl;
+ return 1;
+ }
+
+ FInitCheckers init_checkers = (FInitCheckers)dlsym(handle, "init_checkers");
+ if(init_checkers == NULL)
+ {
+ std::cerr << "ERROR: Initializer not found in " << argv[1] << std::endl;
+ dlclose(handle);
+ return 1;
+ }
+
+ Z120 z120;
+
+ StreamReportPrinter printer(std::cerr);
+ z120.set_printer(&printer);
+
+ MscPtr msc = z120.load_msc(argv[3]);
+ if(msc == NULL)
+ {
+ std::cerr << "ERROR: Cannot open " << argv[3] << std::endl;
+ dlclose(handle);
+ return 1;
+ }
+
+ int errors = 0;
+
+ char *endptr;
+ int satisfied = strtol(argv[4], &endptr, 10);
+ if(*argv[4] == '\0' || *endptr != '\0')
+ {
+ std::cerr << "ERROR: Not a boolean value: " << argv[4] << std::endl;
+ dlclose(handle);
+ return 1;
+ }
+
+ try
+ {
+ MscPtr result = run_check(init_checkers, argv[2], msc);
+ if(result == NULL)
+ {
+ if(satisfied)
+ std::cout << argv[2] << " satisfied, should be satisfied" << std::endl;
+ else
+ {
+ std::cerr << "ERROR: " << argv[2] << " satisfied, should NOT be satisfied" << std::endl;
+ errors = 1;
+ }
+ }
+ else
+ {
+ std::cout << argv[2] << " violated" << std::endl;
+
+ if(satisfied)
+ {
+ std::cerr << "ERROR: " << argv[2] << " violated, should NOT be violated" << std::endl;
+ errors = 1;
+ }
+ else
+ std::cout << argv[2] << " violated, should be violated" << std::endl;
+
+ std::vector<MscPtr> results;
+ results.push_back(result);
+ z120.save_msc(std::cout, "counter_example", results);
+ }
+ }
+ catch(...)
+ {
+ std::cerr << "ERROR: Exception catched" << std::endl;
+ errors = 1;
+ }
+
+ dlclose(handle);
+ return errors;
+}
+
+// $Id$
Property changes on: trunk/tests/checker_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2009-05-03 19:05:27
|
Revision: 243
http://scstudio.svn.sourceforge.net/scstudio/?rev=243&view=rev
Author: gotthardp
Date: 2009-05-03 19:05:14 +0000 (Sun, 03 May 2009)
Log Message:
-----------
Implemented UNICODE support.
Modified Paths:
--------------
trunk/src/check/boundedness/universal_boundedness_checker.cpp
trunk/src/check/boundedness/universal_boundedness_checker.h
trunk/src/check/liveness/deadlock_checker.h
trunk/src/check/liveness/livelock_checker.h
trunk/src/check/order/acyclic_checker.h
trunk/src/check/order/fifo_checker.cpp
trunk/src/check/order/fifo_checker.h
trunk/src/check/pseudocode/communication_graph.cpp
trunk/src/check/pseudocode/communication_graph.h
trunk/src/check/pseudocode/msc_duplicators.cpp
trunk/src/check/pseudocode/utils.h
trunk/src/check/race/race_checker.cpp
trunk/src/check/race/race_checker.h
trunk/src/check/structure/name_checker.cpp
trunk/src/check/structure/name_checker.h
trunk/src/data/CMakeLists.txt
trunk/src/data/Z120/Context.cpp
trunk/src/data/Z120/main.cpp
trunk/src/data/Z120/z120.h
trunk/src/data/Z120/z120_load.cpp
trunk/src/data/Z120/z120_save.cpp
trunk/src/data/checker.h
trunk/src/data/engmann/engmann.cpp
trunk/src/data/formatter.h
trunk/src/data/msc.cpp
trunk/src/data/msc.h
trunk/src/data/reporter.h
trunk/src/view/visio/addon/document.cpp
trunk/src/view/visio/addon/document.h
trunk/src/view/visio/addon/extract.cpp
trunk/src/view/visio/addon/extract.h
trunk/src/view/visio/addon/optionsdlg.cpp
trunk/src/view/visio/addon/optionsdlg.h
trunk/src/view/visio/addon/reportview.cpp
trunk/src/view/visio/addon/reportview.h
trunk/src/view/visio/addon/visualize.cpp
trunk/src/view/visio/addon/visualize.h
trunk/tests/CMakeLists.txt
trunk/tests/acyclic_checker_test.cpp
trunk/tests/checker_test.cpp
trunk/tests/deadlock_checker_test.cpp
trunk/tests/engmann_test.cpp
trunk/tests/fifo_checker_test.cpp
trunk/tests/livelock_checker_test.cpp
trunk/tests/race_checker_test.cpp
trunk/tests/universal_boundedness_checker_test.cpp
trunk/tests/z120_test.cpp
Added Paths:
-----------
trunk/src/data/diacritics_build.py
trunk/src/data/msc_types.cpp
trunk/src/data/msc_types.h
trunk/src/data/strip_diacritics.cpp
Removed Paths:
-------------
trunk/src/data/msc_visual.h
Modified: trunk/src/check/boundedness/universal_boundedness_checker.cpp
===================================================================
--- trunk/src/check/boundedness/universal_boundedness_checker.cpp 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/boundedness/universal_boundedness_checker.cpp 2009-05-03 19:05:14 UTC (rev 243)
@@ -108,7 +108,7 @@
Checker::PreconditionList UniversalBoundednessChecker::get_preconditions(MscPtr msc) const
{
Checker::PreconditionList result;
- result.push_back(CheckerPrecondition("Unique Instance Names", PP_RECOMMENDED));
+ result.push_back(CheckerPrecondition(L"Unique Instance Names", PP_RECOMMENDED));
return result;
}
Modified: trunk/src/check/boundedness/universal_boundedness_checker.h
===================================================================
--- trunk/src/check/boundedness/universal_boundedness_checker.h 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/boundedness/universal_boundedness_checker.h 2009-05-03 19:05:14 UTC (rev 243)
@@ -62,7 +62,7 @@
{
public:
void on_white_node_found(HMscNode *n);
- AssignListener(const std::map<std::string, unsigned> &map)
+ AssignListener(const std::map<std::wstring, unsigned> &map)
:m_node_number(0), m_label_map(map)
{}
unsigned get_vertex_count(void)
@@ -71,7 +71,7 @@
}
private:
unsigned m_node_number;
- const std::map<std::string, unsigned>& m_label_map;
+ const std::map<std::wstring, unsigned>& m_label_map;
};
class CycleListener: public WhiteNodeFoundListener
@@ -100,7 +100,7 @@
class NameCollector: public WhiteNodeFoundListener
{
private:
- std::map<std::string, unsigned> m_instance_map;
+ std::map<std::wstring, unsigned> m_instance_map;
public:
@@ -109,7 +109,7 @@
{
return m_instance_map.size();
}
- const std::map<std::string, unsigned> & get_instance_map(void)
+ const std::map<std::wstring, unsigned> & get_instance_map(void)
{
return m_instance_map;
}
@@ -141,8 +141,8 @@
* Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_property_name() const
- { return "Universally Bounded"; }
+ virtual std::wstring get_property_name() const
+ { return L"Universally Bounded"; }
virtual PreconditionList get_preconditions(MscPtr msc) const;
Modified: trunk/src/check/liveness/deadlock_checker.h
===================================================================
--- trunk/src/check/liveness/deadlock_checker.h 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/liveness/deadlock_checker.h 2009-05-03 19:05:14 UTC (rev 243)
@@ -129,8 +129,8 @@
* Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_property_name() const
- { return "Deadlock Free"; }
+ virtual std::wstring get_property_name() const
+ { return L"Deadlock Free"; }
virtual PreconditionList get_preconditions(MscPtr msc) const;
Modified: trunk/src/check/liveness/livelock_checker.h
===================================================================
--- trunk/src/check/liveness/livelock_checker.h 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/liveness/livelock_checker.h 2009-05-03 19:05:14 UTC (rev 243)
@@ -103,8 +103,8 @@
* Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_property_name() const
- { return "Livelock Free"; }
+ virtual std::wstring get_property_name() const
+ { return L"Livelock Free"; }
virtual PreconditionList get_preconditions(MscPtr msc) const;
Modified: trunk/src/check/order/acyclic_checker.h
===================================================================
--- trunk/src/check/order/acyclic_checker.h 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/order/acyclic_checker.h 2009-05-03 19:05:14 UTC (rev 243)
@@ -64,8 +64,8 @@
* Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_property_name() const
- { return "Acyclic"; }
+ virtual std::wstring get_property_name() const
+ { return L"Acyclic"; }
virtual PreconditionList get_preconditions(MscPtr msc) const;
Modified: trunk/src/check/order/fifo_checker.cpp
===================================================================
--- trunk/src/check/order/fifo_checker.cpp 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/order/fifo_checker.cpp 2009-05-03 19:05:14 UTC (rev 243)
@@ -26,7 +26,7 @@
Checker::PreconditionList FifoChecker::get_preconditions(MscPtr msc) const
{
Checker::PreconditionList result;
- result.push_back(CheckerPrecondition("Acyclic", PP_REQUIRED));
+ result.push_back(CheckerPrecondition(L"Acyclic", PP_REQUIRED));
return result;
}
Modified: trunk/src/check/order/fifo_checker.h
===================================================================
--- trunk/src/check/order/fifo_checker.h 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/order/fifo_checker.h 2009-05-03 19:05:14 UTC (rev 243)
@@ -68,8 +68,8 @@
* Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_property_name() const
- { return "FIFO"; }
+ virtual std::wstring get_property_name() const
+ { return L"FIFO"; }
virtual PreconditionList get_preconditions(MscPtr msc) const;
Modified: trunk/src/check/pseudocode/communication_graph.cpp
===================================================================
--- trunk/src/check/pseudocode/communication_graph.cpp 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/pseudocode/communication_graph.cpp 2009-05-03 19:05:14 UTC (rev 243)
@@ -33,7 +33,7 @@
m_graph.at(from).at(to) = 1;
}
}
-void CommunicationGraph::create_from_bmsc_with_map(BMscPtr bmsc, const std::map<std::string, unsigned> & instance_map)
+void CommunicationGraph::create_from_bmsc_with_map(BMscPtr bmsc, const std::map<std::wstring, unsigned> & instance_map)
{
m_graph.clear();
m_graph.resize(instance_map.size());
@@ -66,8 +66,8 @@
void CommunicationGraph::create_from_bmsc(BMscPtr bmsc)
{
m_graph.clear();
- std::map<std::string, InstancePtr> instance_map;
- std::map<std::string, InstancePtr>::iterator instance_map_iterator;
+ std::map<std::wstring, InstancePtr> instance_map;
+ std::map<std::wstring, InstancePtr>::iterator instance_map_iterator;
const InstancePtrList& instance_list = bmsc->get_instances();
InstancePtrList::const_iterator instance_list_iterator;
Modified: trunk/src/check/pseudocode/communication_graph.h
===================================================================
--- trunk/src/check/pseudocode/communication_graph.h 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/pseudocode/communication_graph.h 2009-05-03 19:05:14 UTC (rev 243)
@@ -49,7 +49,7 @@
this->create_from_bmsc(bmsc);
}
void create_from_bmsc(BMscPtr bmsc);
- void create_from_bmsc_with_map(BMscPtr bmsc, const std::map<std::string, unsigned> & instance_map);
+ void create_from_bmsc_with_map(BMscPtr bmsc, const std::map<std::wstring, unsigned> & instance_map);
void clear(void)
{
m_graph.clear();
Modified: trunk/src/check/pseudocode/msc_duplicators.cpp
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.cpp 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/pseudocode/msc_duplicators.cpp 2009-05-03 19:05:14 UTC (rev 243)
@@ -740,7 +740,7 @@
if(n && new_elem)
{
dynamic_cast<HMscNode*>(get_copy(*e))->set_position(
- Point(
+ MscPoint(
FLAT_PATH_INITIAL_X+current_depth*FLAT_PATH_HORIZONTAL_STEP,
FLAT_PATH_INITIAL_Y+current_index*FLAT_PATH_VERTICAL_STEP
)
@@ -754,7 +754,7 @@
{
current_depth--;
dynamic_cast<HMscNode*>(get_copy(*e))->set_position(
- Point(
+ MscPoint(
FLAT_PATH_INITIAL_X+current_depth*FLAT_PATH_HORIZONTAL_STEP,
FLAT_PATH_INITIAL_Y+current_index*FLAT_PATH_VERTICAL_STEP
)
Modified: trunk/src/check/pseudocode/utils.h
===================================================================
--- trunk/src/check/pseudocode/utils.h 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/pseudocode/utils.h 2009-05-03 19:05:14 UTC (rev 243)
@@ -8,7 +8,7 @@
#include "data/dfsb_hmsc_traverser.h"
#include "check/pseudocode/export.h"
-typedef std::map<std::string,size_t> StringSizeTMap;
+typedef std::map<std::wstring,size_t> StringSizeTMap;
/**
* Marks Instances with apropriate identifiers
Modified: trunk/src/check/race/race_checker.cpp
===================================================================
--- trunk/src/check/race/race_checker.cpp 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/race/race_checker.cpp 2009-05-03 19:05:14 UTC (rev 243)
@@ -247,16 +247,16 @@
HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc>(msc);
if(hmsc != NULL)
{
- result.push_back(CheckerPrecondition("Deadlock Free", PP_REQUIRED));
- result.push_back(CheckerPrecondition("Livelock Free", PP_REQUIRED));
+ result.push_back(CheckerPrecondition(L"Deadlock Free", PP_REQUIRED));
+ result.push_back(CheckerPrecondition(L"Livelock Free", PP_REQUIRED));
}
// FIXME: Acylic and FIFO cannot check HMSC (bug #2557089)
BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc);
if(bmsc != NULL)
{
- result.push_back(CheckerPrecondition("Acyclic", PP_REQUIRED));
- result.push_back(CheckerPrecondition("FIFO", PP_REQUIRED));
+ result.push_back(CheckerPrecondition(L"Acyclic", PP_REQUIRED));
+ result.push_back(CheckerPrecondition(L"FIFO", PP_REQUIRED));
}
return result;
Modified: trunk/src/check/race/race_checker.h
===================================================================
--- trunk/src/check/race/race_checker.h 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/race/race_checker.h 2009-05-03 19:05:14 UTC (rev 243)
@@ -225,8 +225,8 @@
* Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_property_name() const
- { return "Race Free"; }
+ virtual std::wstring get_property_name() const
+ { return L"Race Free"; }
virtual PreconditionList get_preconditions(MscPtr msc) const;
Modified: trunk/src/check/structure/name_checker.cpp
===================================================================
--- trunk/src/check/structure/name_checker.cpp 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/structure/name_checker.cpp 2009-05-03 19:05:14 UTC (rev 243)
@@ -36,7 +36,7 @@
void NameListener::on_white_node_found(HMscNode *n)
{
size_t num_of_instances;
- std::vector<std::string> current_labels;
+ std::vector<std::wstring> current_labels;
InstancePtrList::const_iterator instance_iterator;
ReferenceNode* refnode = dynamic_cast<ReferenceNode*>(n);
@@ -147,7 +147,7 @@
BMscPtr NameChecker::check(BMscPtr bmsc, ChannelMapperPtr chm)
{
- HMscPtr hmsc1(new HMsc("HMsc1"));
+ HMscPtr hmsc1(new HMsc(L"HMsc1"));
StartNodePtr start1 = new StartNode();
hmsc1->set_start(start1);
ReferenceNodePtr r1_1(new ReferenceNode());
Modified: trunk/src/check/structure/name_checker.h
===================================================================
--- trunk/src/check/structure/name_checker.h 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/check/structure/name_checker.h 2009-05-03 19:05:14 UTC (rev 243)
@@ -45,14 +45,14 @@
class DuplicateNamesException: public std::exception
{
public:
- DuplicateNamesException(const std::string& name)
+ DuplicateNamesException(const std::wstring& name)
: m_name(name)
{ }
virtual ~DuplicateNamesException() throw()
{ }
- const std::string& get_name() const
+ const std::wstring& get_name() const
{
return m_name;
}
@@ -63,7 +63,7 @@
}
private:
- std::string m_name;
+ std::wstring m_name;
};
class FindFirstNodeListener:public WhiteNodeFoundListener
@@ -86,7 +86,7 @@
{
private:
bool m_first_node;
- std::vector<std::string> m_instance_names;
+ std::vector<std::wstring> m_instance_names;
public:
void on_white_node_found(HMscNode *n);
@@ -132,8 +132,8 @@
* Human readable name of the property being checked.
*/
// note: DLL in Windows cannot return pointers to static data
- virtual std::string get_property_name() const
- { return "Unique instance names"; }
+ virtual std::wstring get_property_name() const
+ { return L"Unique instance names"; }
virtual PreconditionList get_preconditions(MscPtr msc) const;
Modified: trunk/src/data/CMakeLists.txt
===================================================================
--- trunk/src/data/CMakeLists.txt 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/data/CMakeLists.txt 2009-05-03 19:05:14 UTC (rev 243)
@@ -1,8 +1,10 @@
ADD_LIBRARY(scmsc SHARED
export.h
+ msc_types.cpp
+ msc_types.h
+ strip_diacritics.cpp
msc.cpp
msc.h
- msc_visual.h
reporter.h
formatter.h
checker.h
Modified: trunk/src/data/Z120/Context.cpp
===================================================================
--- trunk/src/data/Z120/Context.cpp 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/data/Z120/Context.cpp 2009-05-03 19:05:14 UTC (rev 243)
@@ -95,8 +95,8 @@
*/
void init(struct Context* context)
{
- context->myBmsc = new BMsc("");
- context->myHmsc = new HMsc("");
+ context->myBmsc = new BMsc();
+ context->myHmsc = new HMsc();
context->myBmsc = NULL;
context->myHmsc = NULL;
context->element_name = "";
@@ -141,7 +141,7 @@
if(context->nonpointed.size() == 1){
if(context->mscs.find(*(context->nonpointed.begin())) == context->mscs.end())
{
- context->z->print_report(RS_ERROR, "Internal Error 01: MSC was not found \n");
+ context->z->print_report(RS_ERROR, L"Internal Error 01: MSC was not found \n");
}
else{
my_msc = context->mscs.find(*(context->nonpointed.begin()))->second.get();
@@ -151,11 +151,11 @@
{
if(context->nonpointed.size() > 1)
{
- context->z->print_report(RS_ERROR, "Error 02: There are more unreferenced MSC\n");
+ context->z->print_report(RS_ERROR, L"Error 02: There are more unreferenced MSC\n");
}
else
{
- context->z->print_report(RS_ERROR, "Error 03: There is no MSC without reference \n");
+ context->z->print_report(RS_ERROR, L"Error 03: There is no MSC without reference \n");
}
}
@@ -194,25 +194,25 @@
void check_collections_fun(struct Context* context)
{
if(!context->coregion_area_opened.empty())
- context->z->print_report(RS_ERROR, stringize() << "Warning 04: Instance " << context->element_name << "does not have finished some coregion\n");
+ context->z->print_report(RS_ERROR, stringize() << "Warning 04: Instance " << TOWSTRING(context->element_name) << "does not have finished some coregion\n");
if(!context->messages.empty())
- context->z->print_report(RS_ERROR, "Error 05: There is complete message without receiver\n");
+ context->z->print_report(RS_ERROR, L"Error 05: There is complete message without receiver\n");
if(!context->future_events.empty())
- context->z->print_report(RS_ERROR, "Error 06: There is dependency on nonexisted event\n");
+ context->z->print_report(RS_ERROR, L"Error 06: There is dependency on nonexisted event\n");
if(!context->order_events.empty())
- context->z->print_report(RS_ERROR, "Error 07: There is reference to nonexisted event\n");
+ context->z->print_report(RS_ERROR, L"Error 07: There is reference to nonexisted event\n");
if(!context->future_connections.empty())
- context->z->print_report(RS_ERROR, "Error 08: There is reference to nonexisted node\n");
+ context->z->print_report(RS_ERROR, L"Error 08: There is reference to nonexisted node\n");
}
void check_references_fun(struct Context* context)
{
if(!context->future_reference.empty())
- context->z->print_report(RS_ERROR, "Error 09: There is references to nonexisted MSC\n");
+ context->z->print_report(RS_ERROR, L"Error 09: There is references to nonexisted MSC\n");
}
void msc_was_read_fun(struct Context* context)
@@ -242,7 +242,7 @@
* Bug report from grammar
*/
void bug_report(struct Context* context, char* report){
- context->z->print_report(RS_ERROR, report);
+ context->z->print_report(RS_ERROR, TOWSTRING(report));
}
/*
@@ -250,7 +250,7 @@
*/
void new_bmsc_fun(struct Context* context)
{
- context->myBmsc = new BMsc(context->msc_name);
+ context->myBmsc = new BMsc(TOWSTRING(context->msc_name));
}
/*
@@ -297,7 +297,7 @@
context->current_event = event;
- IncompleteMessagePtr message = new IncompleteMessage(LOST, msg_name);
+ IncompleteMessagePtr message = new IncompleteMessage(LOST, TOWSTRING(msg_name));
message->glue_event(event);
//if event is named, it adds event to named_events
@@ -356,7 +356,7 @@
context->current_event = event;
- IncompleteMessagePtr message = new IncompleteMessage(FOUND, msg_name);
+ IncompleteMessagePtr message = new IncompleteMessage(FOUND, TOWSTRING(msg_name));
message->glue_event(event);
//if event is named, it adds event to named_events
@@ -383,7 +383,7 @@
*/
void new_instance_fun(struct Context* context)
{
- InstancePtr instance(new Instance(context->element_name));
+ InstancePtr instance(new Instance(TOWSTRING(context->element_name)));
context->instances.insert(std::make_pair(context->element_name, instance));
context->myBmsc->add_instance(instance);
}
@@ -408,7 +408,7 @@
}
else
{
- context->z->print_report(RS_ERROR, stringize() << "Error 10: Instance " << context->element_name << " has already had opened some coregion\n");
+ context->z->print_report(RS_ERROR, stringize() << "Error 10: Instance " << TOWSTRING(context->element_name) << " has already had opened some coregion\n");
}
}
@@ -425,7 +425,7 @@
}
else
{
- context->z->print_report(RS_ERROR, stringize() << "Error 11: Instance " << context->element_name << " does not have opened any coregion\n"); //check
+ context->z->print_report(RS_ERROR, stringize() << "Error 11: Instance " << TOWSTRING(context->element_name) << " does not have opened any coregion\n"); //check
}
}
@@ -488,10 +488,10 @@
{
if(message_it != context->messages.end())
{
- context->z->print_report(RS_ERROR, "Error 12: Message has already had specified the sender\n"); //warning
+ context->z->print_report(RS_ERROR, L"Error 12: Message has already had specified the sender\n"); //warning
}
- CompleteMessagePtr message = new CompleteMessage(msg_name);
+ CompleteMessagePtr message = new CompleteMessage(TOWSTRING(msg_name));
message->glue_send_event(event);
context->messages.insert(std::make_pair(msg_identification, message));
}
@@ -567,7 +567,7 @@
{
std::cout << "get receive event nieje null " <<std::endl;
}
- CompleteMessagePtr message = new CompleteMessage(msg_name);
+ CompleteMessagePtr message = new CompleteMessage(TOWSTRING(msg_name));
message->glue_receive_event(event);
context->messages.insert(std::make_pair(msg_identification, message));
}
@@ -592,7 +592,7 @@
std::map<std::string, CoregionEventPtr>::iterator named_event_it;
CoregionEventPtr event = boost::dynamic_pointer_cast<CoregionEvent>(context->current_event);
if(event == NULL){
- context->z->print_report(RS_ERROR, "Internal Error 13: Typecast failed\n");
+ context->z->print_report(RS_ERROR, L"Internal Error 13: Typecast failed\n");
return;
}
for(it = context->order_events.begin(); it != context->order_events.end(); ++it){
@@ -619,7 +619,7 @@
std::map<std::string, CoregionEventPtr>::iterator named_event_it;
CoregionEventPtr event = boost::dynamic_pointer_cast<CoregionEvent> (context->current_event);
if(event == NULL){
- context->z->print_report(RS_ERROR, "Internal Error 13: Typecast failed\n");
+ context->z->print_report(RS_ERROR, L"Internal Error 13: Typecast failed\n");
return;
}
for(it = context->order_events.begin(); it != context->order_events.end(); ++it){
@@ -659,7 +659,7 @@
*/
void new_hmsc_fun(struct Context* context)
{
- context->myHmsc = new HMsc(context->msc_name);
+ context->myHmsc = new HMsc(TOWSTRING(context->msc_name));
}
/*
@@ -687,7 +687,7 @@
}
else
{
- context->z->print_report(RS_ERROR, "Error 14: There is node which is successor of end node\n");
+ context->z->print_report(RS_ERROR, L"Error 14: There is node which is successor of end node\n");
}
}
@@ -769,7 +769,7 @@
}
else
{
- context->z->print_report(RS_ERROR, stringize() << "Error 15: The node " << context->element_name << " has already been existing\n");
+ context->z->print_report(RS_ERROR, stringize() << "Error 15: The node " << TOWSTRING(context->element_name) << " has already been existing\n");
}
}
@@ -790,7 +790,7 @@
}
else
{
- context->z->print_report(RS_ERROR, stringize() << "Error 15: The node " << context->element_name << " has already been existing\n");
+ context->z->print_report(RS_ERROR, stringize() << "Error 15: The node " << TOWSTRING(context->element_name) << " has already been existing\n");
}
context->node_type = 0;
}
@@ -804,7 +804,7 @@
if (it == context->hmsc_nodes.end())
{
- ConditionNodePtr node = new ConditionNode(context->condition_name);
+ ConditionNodePtr node = new ConditionNode(TOWSTRING(context->condition_name));
context->hmsc_nodes.insert(std::make_pair(context->element_name, node));
context->myHmsc->add_node(node);
future_connection_fill_in_fun(context);
@@ -812,7 +812,7 @@
}
else
{
- context->z->print_report(RS_ERROR, stringize() << "Error 15: The node " << context->element_name << " has already been existing\n");
+ context->z->print_report(RS_ERROR, stringize() << "Error 15: The node " << TOWSTRING(context->element_name) << " has already been existing\n");
}
context->node_type = 0;
}
Modified: trunk/src/data/Z120/main.cpp
===================================================================
--- trunk/src/data/Z120/main.cpp 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/data/Z120/main.cpp 2009-05-03 19:05:14 UTC (rev 243)
@@ -13,7 +13,7 @@
std::string filename = argv[1];
Z120 z;
- StreamReportPrinter printer(std::cerr);
+ StreamReportPrinter printer(std::wcerr);
z.set_printer(&printer);
MscPtr msc = z.load_msc(filename);
// BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc);
Modified: trunk/src/data/Z120/z120.h
===================================================================
--- trunk/src/data/Z120/z120.h 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/data/Z120/z120.h 2009-05-03 19:05:14 UTC (rev 243)
@@ -45,7 +45,7 @@
virtual MscPtr load_msc(const std::string &filename);
#endif
//! export MSC document
- virtual int save_msc(std::ostream& stream, const std::string &name, const std::vector<MscPtr>& msc);
+ virtual int save_msc(std::ostream& stream, const std::wstring &name, const std::vector<MscPtr>& msc);
protected:
int save_msc(std::ostream& stream, const MscPtr& msc);
Modified: trunk/src/data/Z120/z120_load.cpp
===================================================================
--- trunk/src/data/Z120/z120_load.cpp 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/data/Z120/z120_load.cpp 2009-05-03 19:05:14 UTC (rev 243)
@@ -28,7 +28,7 @@
if (input == NULL || (int)input < 0)
{
print_report(RS_ERROR,
- stringize() << "Cannot open file '" << filename << "'.");
+ stringize() << "Cannot open file '" << TOWSTRING(filename) << "'.");
return NULL;
}
Modified: trunk/src/data/Z120/z120_save.cpp
===================================================================
--- trunk/src/data/Z120/z120_save.cpp 2009-05-03 15:45:34 UTC (rev 242)
+++ trunk/src/data/Z120/z120_save.cpp 2009-05-03 19:05:14 UTC (rev 243)
@@ -24,12 +24,71 @@
#include "data/Z120/z120.h"
-int Z120::save_msc(std::ostream& stream, const std::string &name, const std::vector<MscPtr>& msc)
+/* String modifier to print Z.120 names in a correct character set.
+ *
+ * This is a last resort correction. Invalid characters are replaced by underscore.
+ * More sophisticated transliteration should be done in the front-ends using platform
+ * specific functions.
+ *
+ * Note: Naming conventions violated for 'code prettiness' reasons.
+ */
+class VALID_NAME
{
+public:
+ VALID_NAME(const std::wstring &name)
+ : m_name(name)
+ { }
+
+ friend std::ostream&
+ operator<<(std::ostream& os, const VALID_NAME& value)
+ {
+ static const char replacement = '_';
+ bool was_replacement = false;
+
+ for(std::wstring::const_iterator pos = value.m_name.begin();
+ pos != value.m_name.end(); pos++)
+ {
+ char stripped;
+
+ if(*pos >= 'A' && *pos <= 'Z' || *pos >= 'a' && *pos <= 'z'
+ || *pos >= '0' && *pos <= '9'
+ || *pos == '_' || *pos == '.')
+ {
+ // print valid characters
+ os << (char)*pos;
+
+ was_replacement = false;
+ }
+ else if((stripped = strip_diacritics(*pos)) != 0)
+ {
+ // use the transliteration table
+ os << stripped;
+ was_replacement = false;
+ }
+ else
+ {
+ // replace invalid characters by the 'replacement'
+ // shrink multiple replacements into a single characters
+ if(!was_replacement)
+ os << replacement;
+
+ was_replacement = true;
+ }
+ }
+
+ return os;
+ }
+
+private:
+ std::wstring m_name;
+};
+
+int Z120::save_msc(std::ostream& stream, const std::wstring &name, const std::vector<MscPtr>& msc)
+{
int result = 0; // error count
- stream << "mscdocument " << name << ";" << std::endl;
+ stream << "mscdocument " << VALID_NAME(name) << ";" << std::endl;
- std::set<std::string> printed;
+ std::set<std::wstring> printed;
// list of MSC to be printed
// new references may be added to m_printing by save_hmsc()
@@ -95,54 +154,55 @@
list.push_back(item);
}
-// for debugging purposes
void print_element_attributes(std::ostream& stream, const MscElementPtr& element)
{
- stream << "/* ";
+ if(element->get_marked())
+ stream << "/* MARKED */" << std::endl;
std::set<std::string> attributes = element->get_attribute_names();
- stream << "[";
- for(std::set<std::string>::const_iterator pos = attributes.begin();
- pos != attributes.end(); pos++)
+ if(!attributes.empty())
{
- stream << *pos;
+ stream << "/* ATTRIBUTES: [";
+ for(std::set<std::string>::const_iterator pos = attributes.begin();
+ pos != attributes.end(); pos++)
+ {
+ stream << *pos;
+ }
+ stream << "] */" << std::endl;
}
- stream << "]";
-
- stream << " */" << std::endl;
}
void print_event(std::ostream& stream, PtrIDMap<MscMessagePtr>& message_id_map,
const EventPtr& event)
{
- // print_element_attributes(stream, event);
+ print_element_attributes(stream, event);
CompleteMessagePtr complete_message = event->get_complete_message();
if(complete_message != NULL)
{
- // print_element_attributes(stream, complete_message);
+ print_element_attributes(stream, complete_message);
if(complete_message->get_send_event() == event)
- stream << "out " << complete_message->get_label()
+ stream << "out " << VALID_NAME(complete_message->get_label())
<< "," << message_id_map.get_id(complete_message)
- << " to " << complete_message->get_receiver()->get_label();
+ << " to " << VALID_NAME(complete_message->get_receiver()->get_label());
if(complete_message->get_r...
[truncated message content] |
|
From: <got...@us...> - 2009-05-13 08:17:58
|
Revision: 247
http://scstudio.svn.sourceforge.net/scstudio/?rev=247&view=rev
Author: gotthardp
Date: 2009-05-13 08:17:40 +0000 (Wed, 13 May 2009)
Log Message:
-----------
Fixed compilation errors for gcc 4.3 at 64b platforms.
Modified Paths:
--------------
trunk/src/data/Z120/z120_load.cpp
trunk/tests/z120_test.cpp
Modified: trunk/src/data/Z120/z120_load.cpp
===================================================================
--- trunk/src/data/Z120/z120_load.cpp 2009-05-13 07:46:16 UTC (rev 246)
+++ trunk/src/data/Z120/z120_load.cpp 2009-05-13 08:17:40 UTC (rev 247)
@@ -25,7 +25,7 @@
{
pANTLR3_INPUT_STREAM input =
antlr3AsciiFileStreamNew((pANTLR3_UINT8)filename.c_str());
- if (input == NULL || (int)input < 0)
+ if (input == NULL || input < 0)
{
print_report(RS_ERROR,
stringize() << "Cannot open file '" << TOWSTRING(filename) << "'.");
Modified: trunk/tests/z120_test.cpp
===================================================================
--- trunk/tests/z120_test.cpp 2009-05-13 07:46:16 UTC (rev 246)
+++ trunk/tests/z120_test.cpp 2009-05-13 08:17:40 UTC (rev 247)
@@ -16,7 +16,9 @@
* $Id$
*/
+#include <string.h>
#include <iostream>
+
#include "data/Z120/z120.h"
char* extract_filename(char* filename)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <ma...@us...> - 2009-06-01 13:02:57
|
Revision: 248
http://scstudio.svn.sourceforge.net/scstudio/?rev=248&view=rev
Author: madzin
Date: 2009-06-01 13:02:54 +0000 (Mon, 01 Jun 2009)
Log Message:
-----------
Bachelor's thesis
Modified Paths:
--------------
trunk/src/data/Z120/Context.cpp
trunk/src/data/Z120/Context.h
trunk/src/data/Z120/Z120.g
trunk/tests/z120_test.cpp
Modified: trunk/src/data/Z120/Context.cpp
===================================================================
--- trunk/src/data/Z120/Context.cpp 2009-05-13 08:17:40 UTC (rev 247)
+++ trunk/src/data/Z120/Context.cpp 2009-06-01 13:02:54 UTC (rev 248)
@@ -90,6 +90,10 @@
context->msc_name = name;
}
+void my_print(char* a){
+ std::cerr << a << std::endl;
+}
+
/*
* Set beginning values
*/
@@ -305,7 +309,7 @@
{
CoregionEventPtr event1 = boost::dynamic_pointer_cast<CoregionEvent>(event);
if(event1 != NULL){
-// context->named_events.insert(std::make_pair(context->event_name, event1));
+ context->named_events.insert(std::make_pair(context->event_name, event1));
}
}
Modified: trunk/src/data/Z120/Context.h
===================================================================
--- trunk/src/data/Z120/Context.h 2009-05-13 08:17:40 UTC (rev 247)
+++ trunk/src/data/Z120/Context.h 2009-06-01 13:02:54 UTC (rev 248)
@@ -32,6 +32,8 @@
struct s_Msc;
struct s_Z120;
+void my_print(char* a);
+
void set_msc_name_fun(struct Context* context, char* name);
void init(struct Context* context);
@@ -78,7 +80,6 @@
void set_instance_name_fun(struct Context* context, char* name);
void set_event_name_fun(struct Context* context, char* name);
-// BMscStruct* get_bmsc();
//HMsc
void new_hmsc_fun(struct Context* context);
Modified: trunk/src/data/Z120/Z120.g
===================================================================
--- trunk/src/data/Z120/Z120.g 2009-05-13 08:17:40 UTC (rev 247)
+++ trunk/src/data/Z120/Z120.g 2009-06-01 13:02:54 UTC (rev 248)
@@ -99,7 +99,7 @@
'}'
;
-fragment
+//fragment
Left_Open:
'('
;
@@ -109,7 +109,7 @@
Left_Square_Bracket
;
-fragment
+//fragment
Right_Open:
')'
;
@@ -165,7 +165,7 @@
| Other_Character
| Special
| '.' | '_' | ' '
- | Apostrophe Apostrophe)* Apostrophe
+ | Apostrophe Apostrophe)* Apostrophe
;
fragment
@@ -268,7 +268,6 @@
'text' Character_String end
;
-
// ----- Message Sequence Chart Document
// non-standard: Z.120 doesn't define top-level nonterminal
@@ -280,7 +279,7 @@
add_z_fun(context, $my_z120);
}
}
- (('mscdocument' instance_kind end)? (message_sequence_chart)*)
+ ((document_head | 'mscdocument' instance_kind end)? (message_sequence_chart)*)
{
check_references_fun(context);
$my_msc = get_total_msc_fun(context);
@@ -1000,7 +999,7 @@
;
Escapechar:
-// Delim Character_String Delim
+ Delim Character_String Delim
;
@@ -1501,7 +1500,7 @@
{
add_connect_name_fun(context, (char*) ($NAME.text->chars));
}
- (',' label_list)* //POZOR!!! upravena gramatika
+ (',' label_list)*
;
intermediate_node:
@@ -1532,7 +1531,6 @@
intermediate_node_type:
timeable_node | untimeable_node
-// untimeable_node | timeable_node //the rules have to be replaced because the connection_node is empty and timenode can be empty too because in the timeable_node is each of non-terminal in ()?
;
untimeable_node:
Modified: trunk/tests/z120_test.cpp
===================================================================
--- trunk/tests/z120_test.cpp 2009-05-13 08:17:40 UTC (rev 247)
+++ trunk/tests/z120_test.cpp 2009-06-01 13:02:54 UTC (rev 248)
@@ -61,6 +61,10 @@
std::cerr << "ERROR: Syntax error in " << argv[1] << std::endl;
return 1;
}
+ else
+ {
+// std::cerr << "Reading of MSC failed" << std::endl;
+ }
char *path = strdup(argv[1]);
char *filename = extract_filename(path);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2009-06-01 17:10:05
|
Revision: 249
http://scstudio.svn.sourceforge.net/scstudio/?rev=249&view=rev
Author: gotthardp
Date: 2009-06-01 17:09:56 +0000 (Mon, 01 Jun 2009)
Log Message:
-----------
Removed z120/test application. Replaced by tests/z120_test.
Modified Paths:
--------------
trunk/src/data/Z120/CMakeLists.txt
trunk/src/view/visio/scstudio.nsi
trunk/tests/z120_test.cpp
Removed Paths:
-------------
trunk/src/data/Z120/main.cpp
Modified: trunk/src/data/Z120/CMakeLists.txt
===================================================================
--- trunk/src/data/Z120/CMakeLists.txt 2009-06-01 13:02:54 UTC (rev 248)
+++ trunk/src/data/Z120/CMakeLists.txt 2009-06-01 17:09:56 UTC (rev 249)
@@ -17,19 +17,6 @@
SET(PARSER_LIBRARIES
${ANTLR_LIBRARY})
-
- # Petr: to be removed after proper integration
- ADD_EXECUTABLE(parser
- main.cpp
- Context.cpp
- Z120Lexer.c
- Z120Parser.c)
-
- # Petr: to be removed after proper integration
- TARGET_LINK_LIBRARIES(parser
- scmsc
- scZ120
- ${PARSER_LIBRARIES})
ENDIF(ANTLR_FOUND)
ADD_LIBRARY(scZ120 SHARED
Deleted: trunk/src/data/Z120/main.cpp
===================================================================
--- trunk/src/data/Z120/main.cpp 2009-06-01 13:02:54 UTC (rev 248)
+++ trunk/src/data/Z120/main.cpp 2009-06-01 17:09:56 UTC (rev 249)
@@ -1,29 +0,0 @@
-#include <iostream>
-#include "data/Z120/z120.h"
-
-int main(int argc, char** argv)
-{
-
- if(argc < 2)
- {
- std::cerr << "Usage: " << argv[0] << " <filename>" << std::endl;
- return 1;
- }
-
- std::string filename = argv[1];
-
- Z120 z;
- StreamReportPrinter printer(std::wcerr);
- z.set_printer(&printer);
- MscPtr msc = z.load_msc(filename);
-// BMscPtr bmsc = boost::dynamic_pointer_cast<BMsc>(msc);
-// HMscPtr hmsc = boost::dynamic_pointer_cast<HMsc>(msc);
-// if(hmsc != NULL){
-// std::set<HMscNodePtr> my_set = hmsc->get_nodes();
-// ReferenceNodePtr ref_msc = boost::dynamic_pointer_cast<ReferenceNode>(*(my_set.begin()));
-// BMscPtr ref_bmsc = boost::dynamic_pointer_cast<BMsc>(ref_msc->get_msc());
-// }
-
- return 0;
-}
-
Modified: trunk/src/view/visio/scstudio.nsi
===================================================================
--- trunk/src/view/visio/scstudio.nsi 2009-06-01 13:02:54 UTC (rev 248)
+++ trunk/src/view/visio/scstudio.nsi 2009-06-01 17:09:56 UTC (rev 249)
@@ -21,7 +21,7 @@
; -- General ---------------------------
-!define VERSION "0.3.0"
+!define VERSION "0.3.2"
Name "Sequence Chart Studio"
OutFile "scstudio-setup-${VERSION}.exe"
Modified: trunk/tests/z120_test.cpp
===================================================================
--- trunk/tests/z120_test.cpp 2009-06-01 13:02:54 UTC (rev 248)
+++ trunk/tests/z120_test.cpp 2009-06-01 17:09:56 UTC (rev 249)
@@ -61,10 +61,6 @@
std::cerr << "ERROR: Syntax error in " << argv[1] << std::endl;
return 1;
}
- else
- {
-// std::cerr << "Reading of MSC failed" << std::endl;
- }
char *path = strdup(argv[1]);
char *filename = extract_filename(path);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <koc...@us...> - 2009-06-21 21:11:28
|
Revision: 254
http://scstudio.svn.sourceforge.net/scstudio/?rev=254&view=rev
Author: kocianon
Date: 2009-06-21 21:11:26 +0000 (Sun, 21 Jun 2009)
Log Message:
-----------
string to number, DecScaled bug fixed
Modified Paths:
--------------
trunk/src/data/time.cpp
trunk/src/data/time.h
Added Paths:
-----------
trunk/tests/interval_string.cpp
Modified: trunk/src/data/time.cpp
===================================================================
--- trunk/src/data/time.cpp 2009-06-10 11:25:10 UTC (rev 253)
+++ trunk/src/data/time.cpp 2009-06-21 21:11:26 UTC (rev 254)
@@ -52,42 +52,81 @@
template <>
MscIntervalCouple<double>::MscIntervalCouple(const std::string& number, \
-const char& closed):
-m_value(0),m_closed(true)
+const bool& closed):
+m_value(0),m_closed(closed)
{
const char* pos = number.c_str();
m_value = atof(pos);
- if(closed == '(' || closed == ')')
- m_closed = false;
-
}
template <>
MscIntervalCouple<DecScaled>::MscIntervalCouple(const std::string &number, \
- const char& closed):
-m_value(0),m_closed(true)
+ const bool& closed):
+m_value(0),m_closed(closed)
{
DecScaled tmp(number);
- m_value = number;
- if(closed == '(' || closed == ')')
- m_closed = false;
+ m_value = tmp;
+}
+inline bool isNotIn(const char& znak,const std::string& set = "[](),")
+{
+ return set.find(znak)==std::string::npos;
}
+inline bool clean(char znak)
+{
+ return isdigit(znak)==0&&isNotIn(znak);
+}
+
template<class T>
-MscTimeInterval<T>::MscTimeInterval(const std::string& interval)
+MscTimeInterval<T>::MscTimeInterval(const std::string& interval)
+throw(MscIntervalStringConversionError)
{
- std::string tmp(interval.begin()+1,interval.end()-1);
- size_t comma_pos = tmp.find(',');
+ std::string tmp(interval);
+ bool b_closed = true;
+ bool e_closed = true;
- std::string e(tmp.substr(comma_pos+1));
- tmp.erase(comma_pos);
+ // remove all unsuitable characters; letting just numbers,commas,brackets
+ tmp.erase(remove_if(tmp.begin(),tmp.end(),clean),tmp.end());
+
+ // detect starting bracket
+ if(isNotIn(tmp[0],std::string("([")))
+ throw MscIntervalStringConversionError("No starting bracket [ or (\n");
+ if(tmp[0]=='(')
+ b_closed = false;
+ // erase it
+ tmp.erase(tmp.begin());
+
+ //detect ending bracket
+ if(isNotIn(tmp[tmp.length()-1],")]"))
+ throw MscIntervalStringConversionError("No ending bracket ) or ]\n");
+ if(tmp[tmp.length()-1]==')')
+ e_closed = false;
+ // erase it
+ tmp.erase(tmp.end()-1);
+
+
std::string b(tmp);
+ std::string e(tmp);
+
+ size_t comma_pos= tmp.find(',');
+ if(comma_pos!=std::string::npos)
+ {
+ e = std::string(tmp.substr(comma_pos+1));
+ tmp.erase(comma_pos); // erase all from comma including comma
+ b = std::string(tmp);
+ }
- MscIntervalCouple<T> begin(b,interval[0]);
- MscIntervalCouple<T> end(e,interval[interval.size()-1]);
+ MscIntervalCouple<T> begin(b,b_closed);
+ MscIntervalCouple<T> end(e,e_closed);
m_begin = begin;
m_end = end;
}
+template class MscTimeInterval<double>;
+template class MscTimeInterval<DecScaled>;
+
+
+//template MscTimeInterval<double>::MscTimeInterval();
+//template MscTimeInterval<DecScaled>::MscTimeInterval();
// $Id$
Modified: trunk/src/data/time.h
===================================================================
--- trunk/src/data/time.h 2009-06-10 11:25:10 UTC (rev 253)
+++ trunk/src/data/time.h 2009-06-21 21:11:26 UTC (rev 254)
@@ -25,6 +25,8 @@
#include<list>
#include<cstdlib>
#include<iostream>
+#include<cctype>
+#include<string>
#if defined(_MSC_VER)
// Visual C++ does not support functions declared using exception specification.
@@ -70,7 +72,27 @@
}
};
+class MscIntervalStringConversionError:public std::exception
+{
+private:
+ std::string msg;
+public:
+
+ MscIntervalStringConversionError(const std::string& m = ""):
+ msg(std::string("Problems during string to interval conversion\n") + m)
+ {}
+
+ const char* what()
+ {
+ return msg.c_str();
+ }
+
+ ~MscIntervalStringConversionError() throw()
+ {}
+
+};
+
/**
* Decimal scaling structure, stands for:
* m_mant*10^m_exp;
@@ -84,15 +106,19 @@
// keeps number aligned to the right
void tidy()
{
- while(m_mant%10==0)
- {
- m_mant/=10;
+ while(m_mant%10==0 && m_mant!=0)
+ {
+ m_mant=m_mant/10;
m_exp++;
}
}
public:
DecScaled():m_exp(0),m_mant(0){}
- DecScaled(long mant):m_exp(0),m_mant(mant){}
+ DecScaled(long mant):m_exp(0),m_mant(mant)
+ {
+ tidy();
+ }
+
DecScaled(long mant,long exp):m_exp(exp),m_mant(mant)
{
tidy();
@@ -245,7 +271,7 @@
{
}
- MscIntervalCouple(const std::string&,const char&);
+ MscIntervalCouple(const std::string&,const bool&);
MscIntervalCouple(const bool& b,const T& d): m_closed(b),m_value(d)
{
@@ -430,8 +456,6 @@
MscTimeInterval()
{}
- MscTimeInterval(const std::string&);
-
MscTimeInterval(T value):m_begin(true,value),m_end(true,value)
{
}
@@ -453,6 +477,9 @@
{
}
+ MscTimeInterval(const std::string& interval) throw(MscIntervalStringConversionError);
+
+
MscIntervalCouple<T> get_begin() const
{
return m_begin;
@@ -720,9 +747,6 @@
}; //end of MscTimeInterval class
-template class MscTimeInterval<double>;
-template class MscTimeInterval<DecScaled>;
-
/**
* \brief List of intervals
* Keeping sorted list of intervals, dont have intersection
Added: trunk/tests/interval_string.cpp
===================================================================
--- trunk/tests/interval_string.cpp (rev 0)
+++ trunk/tests/interval_string.cpp 2009-06-21 21:11:26 UTC (rev 254)
@@ -0,0 +1,52 @@
+#include "data/time.h"
+#include<string>
+
+
+#define TEST_ASSERT(x) if(!(x)) \
+{ \
+ std::cerr << __FILE__ \
+ << ": Assertion " #x " failed on line " \
+ << __LINE__ << std::endl; return 1; \
+}
+
+int main()
+{
+ MscTimeInterval<double> dou(false,10,18,true);
+ MscTimeInterval<DecScaled> dec(false,10,18,true);
+
+ MscTimeInterval<double> inter_double(std::string("( 10 , 18] sd "));
+ MscTimeInterval<DecScaled> inter_dec(std::string(" ( 1 0 , 1 8] "));
+ std::cerr << inter_double << std::endl;
+ std::cerr << dou << std::endl;
+
+ TEST_ASSERT(dou==inter_double);
+
+ std::cerr << inter_dec << std::endl;
+ std::cerr << dec << std::endl;
+
+ TEST_ASSERT(dec==inter_dec);
+
+
+ try {
+ MscTimeInterval<double> a(std::string(" 9 9 "));
+ TEST_ASSERT(false);
+ }
+ catch(MscIntervalStringConversionError){}
+
+ try {
+ MscTimeInterval<DecScaled> b(std::string("5,4]"));
+ TEST_ASSERT(false);
+ }
+ catch(MscIntervalStringConversionError){}
+
+ try {
+ MscTimeInterval<DecScaled> c(std::string("[5,4"));
+ TEST_ASSERT(false);
+ }
+ catch(MscIntervalStringConversionError){}
+
+ MscTimeInterval<DecScaled> d("[10]");
+ std::cerr << d << std::endl;
+
+ return 0;
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <koc...@us...> - 2009-07-05 16:44:43
|
Revision: 256
http://scstudio.svn.sourceforge.net/scstudio/?rev=256&view=rev
Author: kocianon
Date: 2009-07-05 16:44:41 +0000 (Sun, 05 Jul 2009)
Log Message:
-----------
adding time algorithms for hmsc and bmsc
Modified Paths:
--------------
trunk/src/check/CMakeLists.txt
trunk/src/check/pseudocode/msc_duplicators.cpp
trunk/src/check/pseudocode/msc_duplicators.h
trunk/src/data/CMakeLists.txt
trunk/src/data/msc.cpp
trunk/src/data/msc.h
trunk/src/data/time.cpp
trunk/src/data/time.h
trunk/tests/CMakeLists.txt
trunk/tests/interval_set_test.cpp
Added Paths:
-----------
trunk/src/check/time/
trunk/src/check/time/CMakeLists.txt
trunk/src/check/time/bmsc_tightening.h
trunk/src/check/time/hmsc_all_paths.cpp
trunk/src/check/time/hmsc_all_paths.h
trunk/src/check/time/hmsc_tighten.cpp
trunk/src/check/time/hmsc_tighten.h
trunk/src/check/time/time_consistency.cpp
trunk/src/check/time/time_consistency.h
trunk/tests/bmsc_matrix_converter_test.cpp
trunk/tests/bmsc_tightening_test.cpp
trunk/tests/hmsc_all_paths_test.cpp
trunk/tests/incon_test.cpp
trunk/tests/max_tightener_test.cpp
trunk/tests/tighten_msc_test.cpp
Property Changed:
----------------
trunk/src/data/
Modified: trunk/src/check/CMakeLists.txt
===================================================================
--- trunk/src/check/CMakeLists.txt 2009-06-21 21:12:06 UTC (rev 255)
+++ trunk/src/check/CMakeLists.txt 2009-07-05 16:44:41 UTC (rev 256)
@@ -6,5 +6,6 @@
ADD_SUBDIRECTORY(race)
ADD_SUBDIRECTORY(boundedness)
ADD_SUBDIRECTORY(structure)
+ADD_SUBDIRECTORY(time)
# $Id$
Modified: trunk/src/check/pseudocode/msc_duplicators.cpp
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.cpp 2009-06-21 21:12:06 UTC (rev 255)
+++ trunk/src/check/pseudocode/msc_duplicators.cpp 2009-07-05 16:44:41 UTC (rev 256)
@@ -82,7 +82,9 @@
traverser.traverse(bmsc);
traverser.remove_all_listeners();
MessagesCreatorListener messages_creator(this);
+ TimeRelationCreatorListener time_creator(this);
traverser.add_white_event_found_listener(&messages_creator);
+ traverser.add_white_event_found_listener(&time_creator);
traverser.traverse(bmsc);
for(instances = bmsc->get_instances().begin();
@@ -247,6 +249,32 @@
////////////////////////////////////////////////////////////////////////
+TimeRelationCreatorListener::TimeRelationCreatorListener(BMscDuplicator* duplicator):
+m_duplicator(duplicator)
+{
+
+}
+
+void TimeRelationCreatorListener::on_white_event_found(Event* e)
+{
+ TimeRelationEventPtrList relations = e->get_time_relations();
+ TimeRelationEventPtrList::iterator it;
+ for(it=relations.begin();it!=relations.end();it++)
+ {
+ if((*it)->get_event_a()!=e)
+ continue;
+
+ Event* a_copy = m_duplicator->get_event_copy((*it)->get_event_a());
+ Event* b_copy = m_duplicator->get_event_copy((*it)->get_event_b());
+ TimeRelationEventPtr relation=TimeRelationEvent::create(a_copy,b_copy,(*it)->get_interval_set(),(*it).get());
+ m_duplicator->set_copy((*it).get(),relation.get());
+
+ }
+
+}
+
+////////////////////////////////////////////////////////////////////////
+
GraphCreatorListener::GraphCreatorListener(BMscGraphDuplicator* duplicator, DFSBMscGraphTraverser* traverser,HMsc* hmsc):
m_duplicator(duplicator),m_traverser(traverser),m_hmsc(hmsc)
{
Modified: trunk/src/check/pseudocode/msc_duplicators.h
===================================================================
--- trunk/src/check/pseudocode/msc_duplicators.h 2009-06-21 21:12:06 UTC (rev 255)
+++ trunk/src/check/pseudocode/msc_duplicators.h 2009-07-05 16:44:41 UTC (rev 256)
@@ -97,6 +97,20 @@
};
+class TimeRelationCreatorListener:public WhiteEventFoundListener
+{
+protected:
+
+ BMscDuplicator* m_duplicator;
+
+public:
+
+ TimeRelationCreatorListener(BMscDuplicator* duplicator);
+
+ void on_white_event_found(Event* e);
+
+};
+
/**
* \brief Duplicates BMsc
*
Added: trunk/src/check/time/CMakeLists.txt
===================================================================
--- trunk/src/check/time/CMakeLists.txt (rev 0)
+++ trunk/src/check/time/CMakeLists.txt 2009-07-05 16:44:41 UTC (rev 256)
@@ -0,0 +1,15 @@
+ADD_LIBRARY(sctimeconsistency SHARED
+ time_consistency.cpp
+ time_consistency.h
+ bmsc_tightening.h
+ hmsc_all_paths.cpp
+ hmsc_all_paths.h
+ hmsc_tighten.h
+ hmsc_tighten.cpp
+)
+
+TARGET_LINK_LIBRARIES(sctimeconsistency
+ scmsc
+ sctime
+)
+
Added: trunk/src/check/time/bmsc_tightening.h
===================================================================
--- trunk/src/check/time/bmsc_tightening.h (rev 0)
+++ trunk/src/check/time/bmsc_tightening.h 2009-07-05 16:44:41 UTC (rev 256)
@@ -0,0 +1,259 @@
+#ifndef _TIME_TIGHTENING_H_
+#define _TIME_TIGHTENING_H_
+#include "time_consistency.h"
+
+typedef std::pair<Event*,Event*> EventPair;
+typedef std::list<EventPair> EventPairsList;
+typedef std::pair<MscTimeIntervalSetD,IntervalSetMatrix> ConstMatrixPair;
+typedef boost::intrusive_ptr<BmscMatrixConverter*> BmscMatrixConverterPtr;
+
+class TightenBMsc
+{
+private:
+ BmscMatrixConverter m_converter;
+ BMscPtr m_bmsc;
+ IntervalSetMatrix m_matrix;
+
+ EventPList m_mins;
+ EventPList m_maxs;
+
+ int get_number(Event* e)
+ {
+ return m_converter.get_number(e);
+ }
+
+ int is_leq(Event* e,Event* f)
+ {
+ return m_converter.is_leq(e,f);
+ }
+
+ EventPVector get_events()
+ {
+ return m_converter.get_events();
+ }
+
+public:
+
+ TightenBMsc(BMscPtr bmsc):m_bmsc(bmsc)
+ {
+ m_matrix = m_converter.compute_matrix(bmsc);
+ m_mins = find_minimal_events();
+ m_maxs = find_maximal_events();
+ }
+
+ EventPList find_minimal_events()
+ {
+ EventPList minimals;
+ EventPVector events = get_events();
+ EventPVector::iterator it;
+ EventPVector::iterator it_b;
+
+ for(it=events.begin();it!=events.end();it++)
+ {
+ bool is_minimal = true;
+ for(it_b=events.begin();it_b!=events.end();it_b++)
+ {
+ if(it_b != it && is_leq(*it_b,*it))
+ {
+ is_minimal =false;
+ break;
+ }
+
+ }
+ if(is_minimal)
+ {
+ minimals.push_back(*it);
+ }
+ }
+ return minimals;
+ }
+
+ EventPList find_maximal_events()
+ {
+ EventPList maximals;
+ EventPVector events = get_events();
+ EventPVector::iterator it;
+ EventPVector::iterator it_b;
+
+ for(it=events.begin();it!=events.end();it++)
+ {
+ bool is_maximal = true;
+ for(it_b=events.begin();it_b!=events.end();it_b++)
+ {
+ if(it_b != it && is_leq(*it,*it_b)){
+ is_maximal =false;
+ break;
+ }
+
+ }
+ if(is_maximal)
+ {
+ maximals.push_back(*it);
+ }
+ }
+ return maximals;
+ }
+
+ ConstMatrixPair max_tightener(
+ IntervalSetMatrix t_matrix,
+ MscTimeIntervalSetD i
+ )
+ {
+ MscTimeIntervalSetD z;
+ z.insert(MscTimeIntervalD(0,0));
+
+ EventPairsList pairs;
+
+ EventPList::iterator it_min;
+ EventPList::iterator it_max;
+
+ for(it_min=m_mins.begin();it_min!=m_mins.end();it_min++)
+ {
+ for(it_max=m_maxs.begin();it_max!=m_maxs.end();it_max++)
+ {
+ z = MscTimeIntervalSetD::components_max(z,
+ t_matrix(get_number(*it_min),get_number(*it_max)));
+ if(!MscTimeIntervalSetD::set_intersection(i,
+ t_matrix(get_number(*it_min),get_number(*it_max))).is_empty())
+ pairs.push_back(std::make_pair(*it_min,*it_max));
+ }
+ }
+
+ //TODO check WeaklyCommConnected
+ bool is_on_common_path;
+ EventPSet nodes_on_common_path;
+ EventPVector::iterator it_v;
+ EventPVector events = get_events();
+ for(it_v = events.begin();it_v!=events.end();it_v++)
+ {
+ is_on_common_path=true;
+ EventPairsList::iterator it_a;
+ for(it_a=pairs.begin();it_a!=pairs.end();it_a++)
+ {
+ if(!is_leq(it_a->first,(*it_v)) || !is_leq(*it_v,it_a->second))
+ {
+ is_on_common_path = false;
+ break;
+ }
+ }
+
+ if(is_on_common_path)
+ {
+ nodes_on_common_path.insert(*it_v);
+ }
+ }
+
+ if(nodes_on_common_path.empty())
+ return std::make_pair(z,t_matrix);
+
+ Event* min_random;
+ Event* max_random;
+
+ EventPSet::iterator it_set;
+ EventPSet::iterator it_set_b;
+
+ for(it_set=nodes_on_common_path.begin();it_set!=nodes_on_common_path.end();it_set++)
+ {
+ bool is_minimal = true;
+ for(it_set_b=nodes_on_common_path.begin();it_set_b!=nodes_on_common_path.end();it_set_b++)
+ {
+ if(it_set_b != it_set && is_leq(*it_set_b,*it_set))
+ {
+ is_minimal =false;
+ break;
+ }
+
+ }
+ if(is_minimal)
+ {
+ min_random = *it_set;
+ break;
+ }
+ }
+
+ for(it_set=nodes_on_common_path.begin();it_set!=nodes_on_common_path.end();it_set++)
+ {
+ if(*it_set == min_random || is_leq(*it_set,min_random))
+ continue;
+ bool is_maximal = true;
+ for(it_set_b=nodes_on_common_path.begin();it_set_b!=nodes_on_common_path.end();it_set_b++)
+ {
+ if(it_set_b != it_set && is_leq(*it_set,*it_set_b))
+ {
+ is_maximal =false;
+ break;
+ }
+
+ }
+ if(is_maximal)
+ {
+ max_random = *it_set;
+ break;
+ }
+ }
+ MscTimeIntervalSetD from_min;
+ MscTimeIntervalSetD from_max;
+ from_min.insert(MscTimeIntervalD(0,0));
+ from_max.insert(MscTimeIntervalD(0,0));
+
+ for(it_min=m_mins.begin();it_min!=m_mins.end();it_min++)
+ {
+ from_min = MscTimeIntervalSetD::components_max(from_min,
+ t_matrix(get_number(*it_min),get_number(min_random)));
+ }
+
+ for(it_max=m_maxs.begin();it_max!=m_maxs.end();it_max++)
+ {
+ from_max = MscTimeIntervalSetD::components_max(from_max,
+ t_matrix(get_number(*it_max),get_number(max_random)));
+ }
+
+ t_matrix(get_number(min_random),get_number(max_random))= \
+ MscTimeIntervalSetD::set_intersection(
+ t_matrix(get_number(min_random),get_number(max_random)),
+ ((i - from_min) - from_max));
+
+ return std::make_pair(z,t_matrix);
+ }
+
+ static MscTimeIntervalSetD tight(BMscPtr bmsc,MscTimeIntervalSetD i)
+ {
+ TightenBMsc tightening(bmsc);
+ ConstMatrixPair pair = tightening.tighten_msc(i);
+ tightening.modificate(pair.second);
+ return pair.first;
+ }
+
+ void modificate(IntervalSetMatrix matrix)
+ {
+ m_converter.modificate(matrix);
+ }
+
+
+
+ ConstMatrixPair tighten_msc(MscTimeIntervalSetD i)
+ {
+
+ MscSolveTCSP solve;
+ IntervalSetMatrix s;
+ IntervalSetMatrix t;
+ ConstMatrixPair pair;
+
+ t = m_matrix;
+
+ do {
+ s = t;
+ t = solve.solve(t); // TODO complete
+ pair = max_tightener(t,i);
+ i = MscTimeIntervalSetD::set_intersection(i,pair.first);
+
+ } while (!MatrixFunc::is_equal(s,t));
+
+ pair.first = i;
+ return pair;
+ }
+
+}; // class TightenBMsc
+
+
+#endif // _TIME_TIGHTENING_H_
Added: trunk/src/check/time/hmsc_all_paths.cpp
===================================================================
--- trunk/src/check/time/hmsc_all_paths.cpp (rev 0)
+++ trunk/src/check/time/hmsc_all_paths.cpp 2009-07-05 16:44:41 UTC (rev 256)
@@ -0,0 +1,2 @@
+#include "check/time/hmsc_all_paths.h"
+
Added: trunk/src/check/time/hmsc_all_paths.h
===================================================================
--- trunk/src/check/time/hmsc_all_paths.h (rev 0)
+++ trunk/src/check/time/hmsc_all_paths.h 2009-07-05 16:44:41 UTC (rev 256)
@@ -0,0 +1,119 @@
+#ifndef _AllPaths_
+#define _AllPaths_
+
+#include "check/time/time_consistency.h"
+
+
+typedef std::pair<std::list<HMscNodePtr>,bool> HMscPath;
+typedef std::pair<std::list<HMscPath>,bool> HMscAllPaths;
+class AllPaths
+{
+private:
+ HMscNodePtrSet m_nodes_set;
+ std::string m_number;
+ bool m_contains_cycle_globally;
+ TimeRelationRefNodePtr m_relation;
+ HMscPtr m_hmsc;
+ std::list<HMscPath> m_paths;
+public:
+ AllPaths(HMscPtr hmsc, TimeRelationRefNodePtr relation,
+ const std::string& number="AllPathAlg"):m_hmsc(hmsc),m_relation(relation),m_number(number)
+ {
+
+ }
+
+ ~AllPaths()
+ {
+ cleanup_attributes();
+ }
+
+ void set_number(HMscNodePtr e,int number)
+ {
+ return e->set_attribute<int>(m_number,number);
+ }
+
+ int get_number(HMscNodePtr e)
+ {
+ return e->get_attribute<int>(m_number,0);
+ }
+
+ void cleanup_attributes()
+ {
+ HMscNodePtrSet::iterator node;
+ for(node=m_nodes_set.begin();node!=m_nodes_set.end();node++)
+ (*node)->remove_attribute<int>(m_number);
+ }
+
+
+ static HMscAllPaths get_all_paths(HMscPtr hmsc, TimeRelationRefNodePtr relation)
+ {
+ AllPaths allpaths(hmsc,relation);
+ return allpaths.get_set_of_paths();
+ }
+
+ HMscAllPaths get_set_of_paths()
+ {
+
+ m_paths.clear();
+ m_contains_cycle_globally=false;
+ bool contains_cycle_locally = false;
+ std::list<HMscNodePtr> path_prefix;
+ m_nodes_set = m_hmsc->get_nodes();
+
+ HMscNodePtrSet::iterator it;
+ for(it=m_nodes_set.begin();it!=m_nodes_set.end();it++)
+ set_number(*it,0);
+
+ // TODO check origin of relation
+ all_paths(m_relation->get_ref_node_a(),path_prefix,contains_cycle_locally);
+
+ return std::make_pair(m_paths,m_contains_cycle_globally);
+ }
+
+
+ void all_paths(HMscNodePtr node, std::list<HMscNodePtr> path_prefix, bool contains_cycle_locally)
+ {
+
+ path_prefix.push_back(node);
+ if(node == m_relation->get_ref_node_b())
+ {
+ m_paths.push_back(std::make_pair(path_prefix,contains_cycle_locally));
+ }
+
+ set_number(node,get_number(node)+1);
+ PredecessorNode * pre;
+ pre = dynamic_cast<PredecessorNode*>(node.get());
+
+ if(pre == NULL)
+ {
+ path_prefix.pop_back();
+ set_number(node, 0);
+ return;
+ }
+
+
+ NodeRelationPtrSet set_succ = pre->get_successors();
+ NodeRelationPtrSet::const_iterator rel;
+ for(rel=set_succ.begin(); rel!=set_succ.end();rel++)
+ {
+ const NodeRelationPtr& node_relation = *rel;
+ HMscNodePtr new_node(dynamic_cast<HMscNode*>(node_relation.get()->get_successor()));
+ if(get_number(new_node)<=1)
+ {
+ bool contains_cycle_locally_new = contains_cycle_locally;
+ if(get_number(new_node)==1)
+ {
+ contains_cycle_locally_new = true;
+ m_contains_cycle_globally = true;
+ }
+ all_paths(new_node,path_prefix, contains_cycle_locally_new);
+
+ }
+
+ }
+ path_prefix.pop_back();
+ set_number(node, get_number(node)-1);
+ return;
+ }
+};
+#endif
Added: trunk/src/check/time/hmsc_tighten.cpp
===================================================================
--- trunk/src/check/time/hmsc_tighten.cpp (rev 0)
+++ trunk/src/check/time/hmsc_tighten.cpp 2009-07-05 16:44:41 UTC (rev 256)
@@ -0,0 +1 @@
+#include "check/time/hmsc_tighten.h"
Added: trunk/src/check/time/hmsc_tighten.h
===================================================================
--- trunk/src/check/time/hmsc_tighten.h (rev 0)
+++ trunk/src/check/time/hmsc_tighten.h 2009-07-05 16:44:41 UTC (rev 256)
@@ -0,0 +1,296 @@
+#include "check/time/time_consistency.h"
+#include "check/pseudocode/msc_duplicators.h"
+#include "check/time/hmsc_all_paths.h"
+#include "check/time/bmsc_tightening.h"
+
+//typedef std::pair<std::list<HMscNodePtr>,bool> HMscPath;
+//typedef std::pair<std::list<HMscPath>,bool> HMscAllPaths;
+typedef std::list<HMscNodePtr> HMscNodePtrList;
+
+class TightenSetOfPaths
+{
+private:
+// std::set<BMscPtr> m_bmsc_on_path_set;
+// std::set<BMscPtr> m_bmsc_all_set;
+ std::set<BMscPtr> m_bmsc_copy1;
+ std::set<BMscPtr> m_bmsc_copy2;
+
+ std::list<BMscPtr> m_msc_list;
+ std::list<TimeRelationRefNodePtr> m_constr;
+ IntervalSetMatrix m_t;
+ BMscPtr m_msc;
+ MscTimeIntervalSetD i_prime_prime;
+public:
+// HMscAllPaths
+/*
+ BMscPtr return_inner_bmsc(HmscNodePtr node)
+ {
+
+ }
+*/
+ MscTimeIntervalSetD tighten(HMscAllPaths paths, MscTimeIntervalSetD i, HMscPtr hmsc)
+ {
+
+
+ //initialization of both copies
+ BMscDuplicator bmsc_duplicator_1;
+ std::list<HMscPath>::iterator it;
+ for(it=paths.first.begin();it!=paths.first.end();it++)
+ {
+ std::list<HMscNodePtr>::iterator node;
+ for(node=(*it).first.begin();node!=(*it).first.end();node++)
+ {
+ ReferenceNode* ref_node = dynamic_cast<ReferenceNode*>((*node).get());
+ BMscPtr bmsc_ptr = ref_node->get_bmsc();
+ m_bmsc_copy1.insert(bmsc_duplicator_1.duplicate_bmsc(bmsc_ptr)); //in case that on paths are reference nodes only
+ }
+ }
+
+ BMscDuplicator bmsc_duplicator_2;
+ HMscNodePtrSet all_nodes = hmsc->get_nodes();
+ HMscNodePtrSet::iterator hmsc_node;
+ for(hmsc_node=all_nodes.begin();hmsc_node!=all_nodes.end();hmsc_node++)
+ {
+ ReferenceNode* ref_node = dynamic_cast<ReferenceNode*>((*hmsc_node).get());
+ if(!ref_node)
+ continue;
+ BMscPtr bmsc = ref_node->get_bmsc();
+ if(!bmsc)
+ continue;
+ m_bmsc_copy2.insert(bmsc_duplicator_2.duplicate_bmsc(bmsc));
+ }
+
+
+
+ // std::list<HMscPath>::iterator it;
+ for(it=paths.first.begin();it!=paths.first.end();it++)
+ {
+
+ if(!(*it).second)
+ {
+ m_msc_list.clear();
+ m_constr.clear();
+ HMscNodePtrList::iterator n_path;
+ HMscNodePtrList::iterator n_path_previous;
+ n_path = it->first.begin();
+ ReferenceNode* ref_node = dynamic_cast<ReferenceNode*>((*n_path).get());
+ BMscPtr from_node = ref_node->get_bmsc();
+ if(from_node)
+ m_msc = from_node;
+ n_path_previous = n_path;
+ n_path++;
+ for(;n_path!=it->first.end();n_path++)
+ {
+ n_path_previous++;
+ ReferenceNode* ref_node = dynamic_cast<ReferenceNode*>((*n_path).get());
+ if(!ref_node)
+ continue;
+
+ TimeRelationRefNodePtrSet constr_set = ref_node->get_time_relation_top();
+ TimeRelationRefNodePtrSet::iterator it_c;
+ bool has_constraint = false;
+ for(it_c=constr_set.begin();it_c!=constr_set.end();it_c++)
+ {
+ if((*it_c)->get_ref_node_b() == (*n_path_previous).get() ) //Warning: we assume that nodes in time relation ref node are ordered
+ {
+ has_constraint = true;
+ break;
+ }
+
+ }
+ if(has_constraint)
+ {
+ m_constr.push_back(*it_c);
+ m_msc_list.push_back(m_msc);
+
+ ReferenceNode* ref_node = dynamic_cast<ReferenceNode*>((*n_path).get());
+ BMscPtr from_node = ref_node->get_bmsc();
+ if(from_node)
+ m_msc = from_node;
+
+
+ }
+ else
+ {
+
+ BMscPtr msc_tmp;
+ ReferenceNode* ref_node = dynamic_cast<ReferenceNode*>((*n_path).get());
+ BMscPtr from_node = ref_node->get_bmsc();
+ if(from_node)
+ msc_tmp = from_node;
+
+// m_msc = concatenate(m_msc, msc_tmp); //TODO:concatenation
+ }
+
+
+
+ }
+
+
+
+ ConstMatrixPair pair;
+ if(m_msc_list.empty())
+ {
+
+ TightenBMsc tighten_msc(m_msc);
+ pair = tighten_msc.tighten_msc(i);
+ m_t = pair.second;
+ i_prime_prime = MscTimeIntervalSetD::set_intersection(i_prime_prime,pair.first);
+
+ }
+ else
+ {
+ m_msc_list.push_back(m_msc);
+ MscTimeIntervalSetD i_prime_prime_prime;
+// TightenMsgPath tighten_msg_path(m_msc_list); //TODO: MSG PATH
+ i_prime_prime_prime = tighten_msg_path(m_msc_list,m_constr,i);
+
+ i_prime_prime = MscTimeIntervalSetD::set_intersection(i_prime_prime,pair.first);
+ }
+
+ }
+
+
+ HMscNodePtrList::iterator path_it;
+
+ for(path_it = it->first.begin(); path_it!= it->first.end(); path_it++)
+ {
+ //TODO:write get_all_constraints
+ std::set<TimeRelationEventPtr> constraints;
+// constraints = get_all_constraints(*path_it);
+ std::set<TimeRelationEventPtr>::iterator tr_it;
+ for(tr_it = constraints.begin(); tr_it != constraints.end(); tr_it++)
+ {
+ TimeRelationEvent* relation_copy = dynamic_cast<TimeRelationEvent*>(bmsc_duplicator_1.get_copy((*tr_it).get()));
+ MscTimeIntervalSetD interval_set = MscTimeIntervalSetD::set_union(relation_copy->get_interval_set(), (*tr_it)->get_interval_set());
+ relation_copy->set_interval_set(interval_set);
+
+ }
+
+ }
+
+ //TODO:upravit nakopirovat povodne obmedzenia naspat
+// m_bmsc_all_set = m_bmsc_copy2;
+ for(path_it = it->first.begin(); path_it!= it->first.end(); path_it++)
+ {
+ //TODO:write get_all_constraints
+ std::set<TimeRelationEventPtr> constraints;
+// constraints = get_all_constraints(*path_it);
+ std::set<TimeRelationEventPtr>::iterator tr_it;
+ for(tr_it = constraints.begin(); tr_it != constraints.end(); tr_it++)
+ {
+
+ //TODO:upravit
+ TimeRelationEvent* relation_copy = dynamic_cast<TimeRelationEvent*>(bmsc_duplicator_2.get_copy((*tr_it).get()));
+ (*tr_it)->set_interval_set(relation_copy->get_interval_set());
+
+ }
+ }
+ }
+
+
+ std::set<BMscPtr>::iterator b_it2;
+ for(b_it2 = m_bmsc_copy2.begin(); b_it2!= m_bmsc_copy2.end(); b_it2++)
+ {
+ //TODO:write get_all_constraints
+ std::set<TimeRelationEventPtr> constraints;
+// constraints = get_all_constraints(*b_it);
+ std::set<TimeRelationEventPtr>::iterator tr_it2;
+
+ for(tr_it2 = constraints.begin(); tr_it2 != constraints.end(); tr_it2++)
+ {
+ TimeRelationEvent* relation_copy = dynamic_cast<TimeRelationEvent*>((*tr_it2)->get_original());
+
+ //TODO:upravit
+ relation_copy->set_interval_set((*tr_it2)->get_interval_set());
+
+ }
+
+ }
+
+return i_prime_prime;
+
+ }
+
+ MscTimeIntervalSetD tighten_msg_path(std::list<BMscPtr> list_bmsc,std::list<TimeRelationRefNodePtr> constr,MscTimeIntervalSetD interval)
+ {
+ MscTimeIntervalSetD tmp_interval(interval);
+ std::vector<MscTimeIntervalSetD> durations;
+ for(int i=0;i<list_bmsc.size();i++)
+ {
+ MscTimeIntervalSetD tmp;
+
+ tmp.insert(MscTimeIntervalD(0,D::infinity()));
+ durations.push_back(tmp);
+ }
+ MscTimeIntervalSetD s_interval;
+ do {
+ s_interval = tmp_interval;
+ std::list<BMscPtr>::iterator bmsc;
+ int i=0;
+ for(bmsc=list_bmsc.begin();bmsc!=list_bmsc.end();bmsc++,i++)
+ {
+ MscTimeIntervalSetD tmp_i=tmp_interval;
+ for(int j=0;j<list_bmsc.size();j++)
+ {
+ if(i==j)
+ continue;
+ tmp_i = tmp_i - durations[j];
+ }
+ std::list<TimeRelationRefNodePtr>::iterator c_it;
+ for(c_it=constr.begin();c_it!=constr.end();c_it++)
+ tmp_i = tmp_i - (*c_it)->get_interval_set();
+
+ durations[i]=TightenBMsc::tight(*bmsc,MscTimeIntervalSetD::set_intersection(tmp_i,durations[i]));
+ }
+ MscTimeIntervalSetD interval_set;
+
+ std::list<TimeRelationRefNodePtr>::iterator c_it2;
+ for(c_it2=constr.begin();c_it2!=constr.end();c_it2++)
+ {
+ interval_set = (*c_it2)->get_interval_set();
+ MscTimeIntervalSetD tmp_i=tmp_interval;
+ for(int j=0;j<list_bmsc.size();j++)
+ {
+ tmp_i = tmp_i - durations[j];
+ }
+ interval_set = (*c_it2)->get_interval_set();
+ std::list<TimeRelationRefNodePtr>::iterator c_it;
+ for(c_it=constr.begin();c_it!=constr.end();c_it++)
+ {
+ interval_set = (*c_it2)->get_interval_set();
+ if(*c_it==*c_it2)
+ continue;
+ tmp_i = tmp_i - (*c_it)->get_interval_set();
+ }
+ interval_set = (*c_it2)->get_interval_set();
+ (*c_it2)->set_interval_set(MscTimeIntervalSetD::set_intersection((*c_it2)->get_interval_set(),tmp_i));
+ interval_set = (*c_it2)->get_interval_set();
+ }
+
+ MscTimeIntervalSetD tmp;
+ tmp.insert(MscTimeIntervalD(0,0));
+
+ for(int j=0;j<list_bmsc.size();j++)
+ {
+ tmp = tmp + durations[j];
+ }
+
+ std::list<TimeRelationRefNodePtr>::iterator c_it;
+ for(c_it=constr.begin();c_it!=constr.end();c_it++)
+ {
+ MscTimeIntervalSetD uu = (*c_it)->get_interval_set();
+ tmp = uu + tmp;
+ }
+
+ tmp_interval = MscTimeIntervalSetD::set_intersection(tmp_interval,tmp);
+
+
+
+ } while(s_interval!=tmp_interval);
+
+ return tmp_interval;
+ }
+
+};
+
Added: trunk/src/check/time/time_consistency.cpp
===================================================================
--- trunk/src/check/time/time_consistency.cpp (rev 0)
+++ trunk/src/check/time/time_consistency.cpp 2009-07-05 16:44:41 UTC (rev 256)
@@ -0,0 +1,314 @@
+#include "check/time/time_consistency.h"
+
+const IntervalMatrix FloydWarshall::tight(const IntervalMatrix& matrix)
+throw(MscTimeInconsistencyException)
+{
+ IntervalMatrix copy(matrix);
+ for(unsigned k=0; k < matrix.size1(); k++)
+ {
+ for(unsigned i=0; i < matrix.size1(); i++)
+ {
+ for(unsigned j=0; j < matrix.size1(); j++)
+ {
+ copy(i,j) = MscTimeIntervalD::interval_intersection(copy(i,j), \
+ copy(i,k)+copy(k,j));
+ if(!copy(i,j).is_valid())
+ {
+ DEBUG(copy(i,j));
+ throw MscTimeInconsistencyException();
+ }
+ }
+ }
+ }
+ return copy;
+}
+
+
+bool FloydWarshall::check_consistency(const IntervalMatrix& matrix)
+{
+ IntervalMatrix copy(matrix);
+ for(unsigned k=0; k < matrix.size1(); k++)
+ {
+ for(unsigned i=0; i < matrix.size1(); i++)
+ {
+ for(unsigned j=0; j < matrix.size1(); j++)
+ {
+ copy(i,j) = MscTimeIntervalD::interval_intersection(copy(i,j), \
+ copy(i,k)+copy(k,j));
+ if(!copy(i,j).is_valid())
+ {
+ return false;
+ }
+ }
+ }
+ }
+ return true;
+}
+/////////////////////////////////////////////////////////////////
+void MscSolveTCSP::forward(IntervalMatrix matrix,int i, int j)
+{
+ int new_j;
+ int new_i;
+ DEBUG_(i,j);
+ if(matrix.size1()==i+1 && matrix.size1()== j+1)
+ {
+ IntervalMatrix tmp = tightener->tight(matrix);
+ for(unsigned g=0;g<matrix.size1();g++)
+ for(unsigned h=0;h<matrix.size2();h++)
+ m_result_matrix(g,h).insert(tmp(g,h));
+
+ go_back(matrix,i,j);
+ }
+ else
+ {
+ std::list<MscTimeIntervalD> interval_list;
+ if(j+1==matrix.size1())
+ {
+ new_i = i+1;
+ new_j = new_i;
+ }
+ else
+ {
+ new_j = j+1;
+ new_i =i;
+ }
+ IntervalList list = m_solve_matrix(new_i,new_j).get_set();
+ IntervalList::iterator it;
+ for(it=list.begin();it!=list.end();it++)
+ {
+ MatrixFunc::fill_matrix(matrix,*it,(unsigned)new_i,(unsigned)new_j);
+ if(con_checker->check_consistency(matrix))
+ m_to_go_matrix(new_i,new_j).insert(*it);
+
+ }
+ DEBUG(m_to_go_matrix);
+ IntervalList& to_go = m_to_go_matrix(new_i,new_j).get_set();
+ if(!to_go.empty())
+ {
+ DEBUG(m_to_go_matrix(new_i,new_j).get_set().size());
+ MscTimeIntervalD tmp = to_go.front();
+ to_go.pop_front();
+ DEBUG(m_to_go_matrix(new_i,new_j).get_set().size());
+ DEBUG(to_go.size());
+
+
+ matrix(new_i,new_j) = tmp;
+ matrix(new_j,new_i) = MscTimeIntervalD::interval_inverse(tmp);
+
+ forward(matrix,new_i,new_j);
+ }
+ else
+ {
+ matrix(new_i,new_j) = MscTimeIntervalD(-D::infinity(),D::infinity());
+ matrix(new_j,new_i) = MscTimeIntervalD(-D::infinity(),D::infinity());
+ go_back(matrix,i,j);
+ }
+ }
+}
+
+void MscSolveTCSP::go_back(IntervalMatrix matrix,int i,int j)
+{
+ DEBUG_(i,j);
+ if(i==-1){
+ DEBUG(m_result_matrix);
+ return;
+ }
+ IntervalList& to_go = m_to_go_matrix(i,j).get_set();
+ if(!to_go.empty())
+ {
+ DEBUG(m_to_go_matrix(i,j).get_set().size());
+ MscTimeIntervalD tmp = to_go.front();
+ to_go.pop_front();
+ DEBUG(m_to_go_matrix(i,j).get_set().size());
+ DEBUG(to_go.size());
+
+ matrix(i,j) = tmp;
+ matrix(j,i) = MscTimeIntervalD::interval_inverse(tmp);
+ forward(matrix,i,j);
+ }
+ else
+ {
+ matrix(i,j) = MscTimeIntervalD(-D::infinity(),D::infinity());
+ matrix(j,i) = MscTimeIntervalD(-D::infinity(),D::infinity());
+ if(i==j)
+ {
+ i--;
+ j = matrix.size1()-1;
+ }
+ else
+ {
+ j--;
+ }
+ go_back(matrix,i,j);
+ }
+}
+
+void MscSolveTCSP::init(unsigned size)
+{
+ m_result_matrix.resize(size,size);
+ m_to_go_matrix.resize(size,size);
+
+ for(unsigned i=0;i<size;i++)
+ {
+ for(unsigned j=0;j<size;j++)
+ {
+ m_result_matrix(i,j)=MscTimeIntervalDSet();
+ m_to_go_matrix(i,j)=MscTimeIntervalDSet();
+ }
+ }
+}
+
+IntervalSetMatrix MscSolveTCSP::solve(const IntervalSetMatrix& m)
+{
+ init(m.size1());
+ m_solve_matrix=m;
+
+ IntervalMatrix matrix(m_solve_matrix.size1(),m_solve_matrix.size2());
+ for(unsigned i=0;i<m_solve_matrix.size1();i++)
+ {
+ for(unsigned j=0;j<m_solve_matrix.size2();j++){
+ if(i==j)
+ matrix(i,j) = MscTimeIntervalD(0,0);
+ else
+ matrix(i,j)=MscTimeIntervalD(-D::infinity(),D::infinity()); //TODO:infinity
+
+ }
+ }
+ DEBUG(m_solve_matrix);
+ forward(matrix,0,-1);
+
+ return m_result_matrix;
+}
+
+//////////////////////////////////////////////////////////////////
+
+void BmscMatrixConverter::get_first_area_events(EventArea* area,Event* e)
+{
+ if(!area)
+ return;
+
+ StrictOrderArea* strict = dynamic_cast<StrictOrderArea*>(area);
+ if(strict)
+ {
+ if(strict->is_empty())
+ get_first_area_events(strict->get_next().get(),e);
+ else
+ m_succs[e].insert(strict->get_first().get());
+ }
+ else
+ {
+ CoregionArea* coregion = dynamic_cast<CoregionArea*>(area);
+ if(coregion->is_empty())
+ get_first_area_events(coregion->get_next().get(),e);
+ else
+ {
+ const CoregionEventPSet& minimals = coregion->get_minimal_events();
+ CoregionEventPSet::const_iterator min;
+ for(min=minimals.begin(); min!=minimals.end(); min++)
+ m_succs[e].insert(*min);
+ }
+ }
+}
+
+void BmscMatrixConverter::get_strict_successors(StrictEvent *e)
+{
+ if(e->get_successor().get())
+ m_succs[e].insert(e->get_successor().get());
+ else
+ get_first_area_events(e->get_area()->get...
[truncated message content] |
|
From: <koc...@us...> - 2009-07-05 21:55:10
|
Revision: 257
http://scstudio.svn.sourceforge.net/scstudio/?rev=257&view=rev
Author: kocianon
Date: 2009-07-05 21:55:09 +0000 (Sun, 05 Jul 2009)
Log Message:
-----------
scstime library fix
Modified Paths:
--------------
trunk/src/check/time/CMakeLists.txt
trunk/src/data/CMakeLists.txt
trunk/tests/CMakeLists.txt
Modified: trunk/src/check/time/CMakeLists.txt
===================================================================
--- trunk/src/check/time/CMakeLists.txt 2009-07-05 16:44:41 UTC (rev 256)
+++ trunk/src/check/time/CMakeLists.txt 2009-07-05 21:55:09 UTC (rev 257)
@@ -1,4 +1,4 @@
-ADD_LIBRARY(sctimeconsistency SHARED
+ADD_LIBRARY(sctime SHARED
time_consistency.cpp
time_consistency.h
bmsc_tightening.h
@@ -8,8 +8,7 @@
hmsc_tighten.cpp
)
-TARGET_LINK_LIBRARIES(sctimeconsistency
+TARGET_LINK_LIBRARIES(sctime
scmsc
- sctime
)
Modified: trunk/src/data/CMakeLists.txt
===================================================================
--- trunk/src/data/CMakeLists.txt 2009-07-05 16:44:41 UTC (rev 256)
+++ trunk/src/data/CMakeLists.txt 2009-07-05 21:55:09 UTC (rev 257)
@@ -1,12 +1,9 @@
-ADD_LIBRARY(sctime SHARED
- time.cpp
- time.h
-)
-
ADD_LIBRARY(scmsc SHARED
export.h
msc_types.cpp
msc_types.h
+ time.cpp
+ time.h
strip_diacritics.cpp
msc.cpp
msc.h
@@ -32,9 +29,9 @@
hmsc_reference_checker.h
)
-TARGET_LINK_LIBRARIES(scmsc
- sctime
-)
+#TARGET_LINK_LIBRARIES(scmsc
+# sctime
+#)
# build import-export formatters
ADD_SUBDIRECTORY(engmann)
Modified: trunk/tests/CMakeLists.txt
===================================================================
--- trunk/tests/CMakeLists.txt 2009-07-05 16:44:41 UTC (rev 256)
+++ trunk/tests/CMakeLists.txt 2009-07-05 21:55:09 UTC (rev 257)
@@ -119,7 +119,7 @@
interval_string.cpp
)
TARGET_LINK_LIBRARIES(interval_string
- sctime
+ scmsc
)
ADD_TEST(decimal_test ${EXECUTABLE_OUTPUT_PATH}/decimal_test)
@@ -133,7 +133,7 @@
TARGET_LINK_LIBRARIES(bmsc_matrix_converter_test
scmsc
- sctimeconsistency
+ sctime
scpseudocode
)
@@ -143,7 +143,7 @@
TARGET_LINK_LIBRARIES(incon_test
scmsc
- sctimeconsistency
+ sctime
scpseudocode
)
@@ -153,7 +153,7 @@
TARGET_LINK_LIBRARIES(tighten_msc_test
scmsc
- sctimeconsistency
+ sctime
scpseudocode
)
@@ -164,7 +164,7 @@
TARGET_LINK_LIBRARIES(bmsc_tightening_test
scmsc
- sctimeconsistency
+ sctime
scpseudocode
)
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <got...@us...> - 2009-07-06 07:12:27
|
Revision: 258
http://scstudio.svn.sourceforge.net/scstudio/?rev=258&view=rev
Author: gotthardp
Date: 2009-07-06 07:12:18 +0000 (Mon, 06 Jul 2009)
Log Message:
-----------
First fixes for Win32 platform.
Modified Paths:
--------------
trunk/src/check/time/time_consistency.h
trunk/tests/bmsc_matrix_converter_test.cpp
trunk/tests/bmsc_tightening_test.cpp
trunk/tests/max_tightener_test.cpp
trunk/tests/tighten_msc_test.cpp
Added Paths:
-----------
trunk/src/check/time/export.h
Property Changed:
----------------
trunk/src/check/time/CMakeLists.txt
trunk/src/check/time/bmsc_tightening.h
trunk/src/check/time/hmsc_all_paths.cpp
trunk/src/check/time/hmsc_all_paths.h
trunk/src/check/time/hmsc_tighten.cpp
trunk/src/check/time/hmsc_tighten.h
trunk/src/check/time/time_consistency.cpp
trunk/src/check/time/time_consistency.h
trunk/tests/bmsc_matrix_converter_test.cpp
trunk/tests/bmsc_tightening_test.cpp
trunk/tests/hmsc_all_paths_test.cpp
trunk/tests/incon_test.cpp
trunk/tests/interval_string.cpp
trunk/tests/max_tightener_test.cpp
trunk/tests/tighten_msc_test.cpp
Property changes on: trunk/src/check/time/CMakeLists.txt
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/src/check/time/bmsc_tightening.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Added: trunk/src/check/time/export.h
===================================================================
--- trunk/src/check/time/export.h (rev 0)
+++ trunk/src/check/time/export.h 2009-07-06 07:12:18 UTC (rev 258)
@@ -0,0 +1,37 @@
+/*
+ * scstudio - Sequence Chart Studio
+ * http://scstudio.sourceforge.net
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * Copyright (c) 2008 Petr Gotthard <pet...@ce...>
+ *
+ * $Id$
+ */
+
+#ifndef _SCTIME_EXPORT_H
+#define _SCTIME_EXPORT_H
+
+#if defined(_MSC_VER)
+#pragma warning(disable: 4251)
+
+#if defined(sctime_EXPORTS)
+#define SCTIME_EXPORT __declspec(dllexport)
+#else
+#define SCTIME_EXPORT __declspec(dllimport)
+#endif
+
+#else
+#define SCTIME_EXPORT
+#endif
+
+#endif /* _SCTIME_EXPORT_H */
+
+// $Id$
Property changes on: trunk/src/check/time/export.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/src/check/time/hmsc_all_paths.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/src/check/time/hmsc_all_paths.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/src/check/time/hmsc_tighten.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/src/check/time/hmsc_tighten.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/src/check/time/time_consistency.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/src/check/time/time_consistency.h
===================================================================
--- trunk/src/check/time/time_consistency.h 2009-07-05 21:55:09 UTC (rev 257)
+++ trunk/src/check/time/time_consistency.h 2009-07-06 07:12:18 UTC (rev 258)
@@ -4,6 +4,7 @@
#include "data/msc.h"
#include "data/dfs_events_traverser.h"
#include "check/pseudocode/visual_closure_initiator.h"
+#include "check/time/export.h"
#include <limits>
#include <set>
#include <list>
Property changes on: trunk/src/check/time/time_consistency.h
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/tests/bmsc_matrix_converter_test.cpp
===================================================================
--- trunk/tests/bmsc_matrix_converter_test.cpp 2009-07-05 21:55:09 UTC (rev 257)
+++ trunk/tests/bmsc_matrix_converter_test.cpp 2009-07-06 07:12:18 UTC (rev 258)
@@ -13,7 +13,7 @@
*
* Copyright (c) 2008 Jindra Babica <ba...@ma...>
*
- * $Id: race_checker_test.cpp 243 2009-05-03 19:05:14Z gotthardp $
+ * $Id$
*/
#include <iostream>
@@ -97,4 +97,4 @@
return 0;
}
-// $Id: race_checker_test.cpp 243 2009-05-03 19:05:14Z gotthardp $
+// $Id$
Property changes on: trunk/tests/bmsc_matrix_converter_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/tests/bmsc_tightening_test.cpp
===================================================================
--- trunk/tests/bmsc_tightening_test.cpp 2009-07-05 21:55:09 UTC (rev 257)
+++ trunk/tests/bmsc_tightening_test.cpp 2009-07-06 07:12:18 UTC (rev 258)
@@ -141,4 +141,4 @@
return 0;
}
-// $Id: race_checker_test.cpp 243 2009-05-03 19:05:14Z gotthardp $
+// $Id$
Property changes on: trunk/tests/bmsc_tightening_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/tests/hmsc_all_paths_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/tests/incon_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Property changes on: trunk/tests/interval_string.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/tests/max_tightener_test.cpp
===================================================================
--- trunk/tests/max_tightener_test.cpp 2009-07-05 21:55:09 UTC (rev 257)
+++ trunk/tests/max_tightener_test.cpp 2009-07-06 07:12:18 UTC (rev 258)
@@ -13,7 +13,7 @@
*
* Copyright (c) 2008 Jindra Babica <ba...@ma...>
*
- * $Id: race_checker_test.cpp 243 2009-05-03 19:05:14Z gotthardp $
+ * $Id$
*/
#include <iostream>
@@ -124,4 +124,4 @@
return 0;
}
-// $Id: race_checker_test.cpp 243 2009-05-03 19:05:14Z gotthardp $
+// $Id$
Property changes on: trunk/tests/max_tightener_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
Modified: trunk/tests/tighten_msc_test.cpp
===================================================================
--- trunk/tests/tighten_msc_test.cpp 2009-07-05 21:55:09 UTC (rev 257)
+++ trunk/tests/tighten_msc_test.cpp 2009-07-06 07:12:18 UTC (rev 258)
@@ -13,7 +13,7 @@
*
* Copyright (c) 2008 Jindra Babica <ba...@ma...>
*
- * $Id: race_checker_test.cpp 243 2009-05-03 19:05:14Z gotthardp $
+ * $Id$
*/
#include <iostream>
@@ -129,4 +129,4 @@
return 0;
}
-// $Id: race_checker_test.cpp 243 2009-05-03 19:05:14Z gotthardp $
+// $Id$
Property changes on: trunk/tests/tighten_msc_test.cpp
___________________________________________________________________
Added: svn:keywords
+ Id
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|