]> AND Private Git Repository - blast.git/blobdiff - Graph.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
started adding delta comput
[blast.git] / Graph.cpp
index 8cd0f99904f7f31f764810ce8a03d9e7615f8bf2..d3fd276d6dc9e6191a5485863cb4e0aae6f0ac9d 100644 (file)
--- a/Graph.cpp
+++ b/Graph.cpp
@@ -6,9 +6,11 @@
 Graph::Graph() {
   topGroup = new GroupBlock(NULL);
   topGroup->setName("top group");
+  groups.append(topGroup);
 }
 
 Graph::~Graph() {
+  
   delete topGroup;
 }
 
@@ -16,12 +18,27 @@ QList<AbstractInterface *> Graph::getOutsideInterfaces() {
   return topGroup->getInterfaces();
 }
 
-GroupBlock* Graph::createChildBlock(GroupBlock* parent) {
+GroupBlock* Graph::createChildGroupBlock(GroupBlock* parent) {
   GroupBlock* b = new GroupBlock(parent);
+  groups.append(b);
   return b;
 }
 
-FunctionalBlock* Graph::addFunctionalBlock(GroupBlock* group, ReferenceBlock* ref) {
+bool Graph::removeGroupBlock(GroupBlock *group) {
+  group->removeAllBlocks();
+  GroupBlock* parent = AB_TO_GRP(group->getParent());
+  parent->removeBlock(group);
+  groups.removeAll(group);
+}
+
+GroupBlock* Graph::getGroupBlockByName(QString name) {
+  foreach(GroupBlock* group, groups) {
+    if (group->getName() == name) return group;
+  }
+  return NULL;
+}
+
+FunctionalBlock* Graph::createFunctionalBlock(GroupBlock* group, ReferenceBlock* ref) {
 
   FunctionalBlock* newBlock = new FunctionalBlock(group,ref);
   newBlock->populate();
@@ -30,12 +47,97 @@ FunctionalBlock* Graph::addFunctionalBlock(GroupBlock* group, ReferenceBlock* re
   return newBlock;
 }
 
-bool Graph::removeFunctionalBlock(FunctionalBlock* block, GroupBlock *group) {
+FunctionalBlock* Graph::duplicateFunctionalBlock(FunctionalBlock *block) {
+
+  ReferenceBlock* ref = block->getReference();
+  GroupBlock* group = AB_TO_GRP(block->getParent());
+
+  // adding to the graph
+  FunctionalBlock* newBlock = createFunctionalBlock(group,ref);
+  return newBlock;
+}
+
+
+bool Graph::removeFunctionalBlock(FunctionalBlock* block) {
+  GroupBlock* group = AB_TO_GRP(block->getParent());
   group->removeBlock(block);
+  return true;
 }
 
-bool Graph::removeGroupBlock(GroupBlock *group) {
-  group->removeAllBlocks();
-  GroupBlock* parent = AB_TO_GRP(group->getParent());
-  parent->removeBlock(group);
+FunctionalBlock* Graph::getFunctionalBlockByName(QString name, GroupBlock* parent) {
+  FunctionalBlock* block = NULL;
+  if (parent != NULL) {
+    block = AB_TO_FUN(parent->getFunctionalBlockByName(name));
+  }
+  else {
+    foreach(GroupBlock* group, groups) {
+      block = AB_TO_FUN(group->getFunctionalBlockByName(name));
+      if (block != NULL) return block;
+    }
+  }
+  return block;
+}
+
+FunctionalBlock* Graph::createSourceBlock(ReferenceBlock* ref) {
+
+  FunctionalBlock* newBlock = new FunctionalBlock(NULL,ref);
+  newBlock->populate();
+  sources.append(newBlock);
+  return newBlock;
+}
+
+FunctionalBlock* Graph::duplicateSourceBlock(FunctionalBlock *block) {
+
+  ReferenceBlock* ref = block->getReference();
+  GroupBlock* group = AB_TO_GRP(block->getParent());
+
+  // adding to the graph
+  FunctionalBlock* newBlock = createSourceBlock(ref);
+  return newBlock;
+}
+
+FunctionalBlock* Graph::getSourceBlockByName(QString name) {
+  foreach(FunctionalBlock* block, sources) {
+    if (block->getName() == name) return block;
+  }
+  return NULL;
+}
+
+bool Graph::removeSourceBlock(FunctionalBlock *block) {
+  sources.removeAll(block);
+  return true;
+}
+
+bool Graph::createPatterns() {
+  bool ok = true;
+  foreach(AbstractBlock* block, sources) {
+    FunctionalBlock* funBlock = AB_TO_FUN(block);
+    ok = funBlock->createPatterns();
+    if (!ok) return false;
+  }
+  
+  foreach(AbstractBlock* block, groups) {
+    GroupBlock* group = AB_TO_GRP(block);    
+    foreach(AbstractBlock* inBlock, group->getBlocks()) {
+      if (inBlock->isFunctionalBlock()) {
+        FunctionalBlock* funBlock = AB_TO_FUN(inBlock);
+        ok = funBlock->createPatterns();
+        if (!ok) return false;
+      }
+    }
+  }
+  return true;
+}
+
+void Graph::resetPatternComputed() {
+  foreach(AbstractBlock* block, sources) {
+    block->setPatternComputed(false);
+  }
+  foreach(AbstractBlock* block, groups) {
+    GroupBlock* group = AB_TO_GRP(block);
+    group->setPatternComputed(false);
+    foreach(AbstractBlock* inBlock, group->getBlocks()) {
+      inBlock->setPatternComputed(false);
+    }
+  }
 }