00001
00002
00003 #include "ChangeTimeline.h"
00004 #include "Changelist.h"
00005
00006 namespace VGServer {
00007
00008 ChangeTimeline::ChangeTimeline(const class GraphData &_graph)
00009 : graph(_graph)
00010 {
00011 clstart = clend = new Changelist(graph);
00012 }
00013
00014 ChangeTimeline::~ChangeTimeline()
00015 {
00016 if (clstart == clend)
00017 {
00018 delete clstart;
00019 }
00020 else
00021 {
00022 delete clstart;
00023 delete clend;
00024 }
00025 }
00026
00027 void ChangeTimeline::clear()
00028 {
00029 if (clstart == clend)
00030 {
00031 clstart->clear();
00032 frames.clear();
00033 }
00034 else
00035 {
00036 delete clend;
00037 clstart->clear();
00038 frames.clear();
00039 clend = clstart;
00040 }
00041 }
00042
00043 unsigned int ChangeTimeline::advanceTimeFrame()
00044 {
00045 if (getFrameCount() == 0)
00046 {
00047
00048 clend = new Changelist(*clstart);
00049 }
00050
00051 frames.push_back(ChangeFrame());
00052 return getFrameCount();
00053 }
00054
00055 bool ChangeTimeline::addVertex(vertexid_t id)
00056 {
00057 if ( clend->addVertex(id) )
00058 {
00059 if (getFrameCount() > 0) frames.back().addVertex(id, clend->getVertexChange(id));
00060 return true;
00061 }
00062 return false;
00063 }
00064
00065 bool ChangeTimeline::setVertexAttr(vertexid_t id, unsigned int attrid, const AnyType &value)
00066 {
00067 if ( clend->setVertexAttr(id, attrid, value) )
00068 {
00069 if (getFrameCount() > 0) frames.back().setVertexAttr(id, clend->getVertexChange(id));
00070 return true;
00071 }
00072 return false;
00073 }
00074
00075 bool ChangeTimeline::delVertex(vertexid_t id)
00076 {
00077 if ( clend->delVertex(id) )
00078 {
00079 if (getFrameCount() > 0) frames.back().delVertex(id);
00080 return true;
00081 }
00082 return false;
00083 }
00084
00085 bool ChangeTimeline::addEdge(vertexid_t src, vertexid_t tgt)
00086 {
00087 if ( clend->addEdge(src, tgt) )
00088 {
00089 if (getFrameCount() > 0) frames.back().addEdge(src, tgt, clend->getEdgeChange(src,tgt));
00090 return true;
00091 }
00092 return false;
00093 }
00094
00095 bool ChangeTimeline::setEdgeAttr(vertexid_t src, vertexid_t tgt, unsigned int attrid, const AnyType &value)
00096 {
00097 if ( clend->setEdgeAttr(src, tgt, attrid, value) )
00098 {
00099 if (getFrameCount() > 0) frames.back().setEdgeAttr(src, tgt, clend->getEdgeChange(src,tgt));
00100 return true;
00101 }
00102 return false;
00103 }
00104
00105 bool ChangeTimeline::delEdge(vertexid_t src, vertexid_t tgt)
00106 {
00107 if ( clend->delEdge(src, tgt) )
00108 {
00109 if (getFrameCount() > 0) frames.back().delEdge(src, tgt);
00110 return true;
00111 }
00112 return false;
00113 }
00114
00115
00116
00117 void ChangeFrame::addVertex(vertexid_t id, const AttributeVertexTinyBlob &b)
00118 {
00119 chgoplist.push_back( ChangeEntry(CHG_ADDVERTEX, id, b) );
00120 }
00121
00122 void ChangeFrame::setVertexAttr(vertexid_t id, const AttributeVertexTinyBlob &b)
00123 {
00124 chgoplist.push_back( ChangeEntry(CHG_SETVERTEX, id, b) );
00125 }
00126
00127 void ChangeFrame::delVertex(vertexid_t id)
00128 {
00129 chgoplist.push_back( ChangeEntry(CHG_DELVERTEX, id, 0) );
00130 }
00131
00132 void ChangeFrame::addEdge(vertexid_t src, vertexid_t tgt, const AttributeEdgeTinyBlob &b)
00133 {
00134 chgoplist.push_back( ChangeEntry(CHG_ADDEDGE, src, tgt, b) );
00135 }
00136
00137 void ChangeFrame::setEdgeAttr(vertexid_t src, vertexid_t tgt, const AttributeEdgeTinyBlob &b)
00138 {
00139 chgoplist.push_back( ChangeEntry(CHG_SETEDGE, src, tgt, b) );
00140 }
00141
00142 void ChangeFrame::delEdge(vertexid_t src, vertexid_t tgt)
00143 {
00144 chgoplist.push_back( ChangeEntry(CHG_DELEDGE, src, tgt) );
00145 }
00146
00147
00148 }