[Lemon-commits] [lemon_svn] marci: r307 - in hugo/trunk/src/work: . marci
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:38:38 CET 2006
Author: marci
Date: Sat Mar 20 12:19:00 2004
New Revision: 307
Modified:
hugo/trunk/src/work/list_graph.h
hugo/trunk/src/work/marci/graph_wrapper.h
Log:
.
Modified: hugo/trunk/src/work/list_graph.h
==============================================================================
--- hugo/trunk/src/work/list_graph.h (original)
+++ hugo/trunk/src/work/list_graph.h Sat Mar 20 12:19:00 2004
@@ -428,7 +428,7 @@
friend class ListGraph;
//protected:
public: //for alpar
- EdgeIt(const ListGraph&) {
+ EdgeIt(const ListGraph& G) {
node_item* v=G._first_node;
if (v) edge=v->_first_out_edge; else edge=0;
while (v && !edge) { v=v->_next_node; if (v) edge=v->_first_out_edge; }
Modified: hugo/trunk/src/work/marci/graph_wrapper.h
==============================================================================
--- hugo/trunk/src/work/marci/graph_wrapper.h (original)
+++ hugo/trunk/src/work/marci/graph_wrapper.h Sat Mar 20 12:19:00 2004
@@ -29,19 +29,19 @@
void setGraph(Graph& _graph) { graph = &_graph; }
Graph& getGraph() const { return (*graph); }
- template<typename I> I& /*getF*/first(I& i) const { return graph->/*getF*/first(i); }
- template<typename I, typename P> I& /*getF*/first(I& i, const P& p) const {
- return graph->/*getF*/first(i, p); }
+ template<typename I> I& first(I& i) const { return graph->first(i); }
+ template<typename I, typename P> I& first(I& i, const P& p) const {
+ return graph->first(i, p); }
template<typename I> I getNext(const I& i) const {
return graph->getNext(i); }
template<typename I> I& next(I &i) const { return graph->next(i); }
template< typename It > It first() const {
- It e; /*getF*/first(e); return e; }
+ It e; first(e); return e; }
template< typename It > It first(const Node& v) const {
- It e; /*getF*/first(e, v); return e; }
+ It e; first(e, v); return e; }
Node head(const Edge& e) const { return graph->head(e); }
Node tail(const Edge& e) const { return graph->tail(e); }
@@ -85,6 +85,81 @@
};
};
+ template<typename GraphWrapper>
+ class GraphWrapperSkeleton {
+ protected:
+ GraphWrapper gw;
+
+ public:
+ typedef typename GraphWrapper::BaseGraph BaseGraph;
+
+ typedef typename GraphWrapper::Node Node;
+ typedef typename GraphWrapper::NodeIt NodeIt;
+
+ typedef typename GraphWrapper::Edge Edge;
+ typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;
+ typedef typename GraphWrapper::InEdgeIt InEdgeIt;
+ //typedef typename GraphWrapper::SymEdgeIt SymEdgeIt;
+ typedef typename GraphWrapper::EdgeIt EdgeIt;
+
+ //GraphWrapperSkeleton() : gw() { }
+ GraphWrapperSkeleton(GraphWrapper& _gw) : gw(_gw) { }
+
+ void setGraph(BaseGraph& _graph) { gw.setGraph(_graph); }
+ BaseGraph& getGraph() const { return gw.getGraph(); }
+
+ template<typename I> I& first(I& i) const { return gw.first(i); }
+ template<typename I, typename P> I& first(I& i, const P& p) const {
+ return gw.first(i, p); }
+
+ template<typename I> I getNext(const I& i) const { return gw.getNext(i); }
+ template<typename I> I& next(I &i) const { return gw.next(i); }
+
+ template< typename It > It first() const {
+ It e; this->first(e); return e; }
+
+ template< typename It > It first(const Node& v) const {
+ It e; this->first(e, v); return e; }
+
+ Node head(const Edge& e) const { return gw.head(e); }
+ Node tail(const Edge& e) const { return gw.tail(e); }
+
+ template<typename I> bool valid(const I& i) const { return gw.valid(i); }
+
+ //template<typename I> void setInvalid(const I &i);
+ //{ return graph->setInvalid(i); }
+
+ int nodeNum() const { return gw.nodeNum(); }
+ int edgeNum() const { return gw.edgeNum(); }
+
+ template<typename I> Node aNode(const I& e) const { return gw.aNode(e); }
+ template<typename I> Node bNode(const I& e) const { return gw.bNode(e); }
+
+ Node addNode() const { return gw.addNode(); }
+ Edge addEdge(const Node& tail, const Node& head) const {
+ return gw.addEdge(tail, head); }
+
+ template<typename I> void erase(const I& i) const { gw.erase(i); }
+
+ void clear() const { gw.clear(); }
+
+ template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> {
+ public:
+ NodeMap(const GraphWrapperSkeleton<GraphWrapper>& _G) :
+ GraphWrapper::NodeMap<T>(_G.gw) { }
+ NodeMap(const GraphWrapperSkeleton<GraphWrapper>& _G, T a) :
+ GraphWrapper::NodeMap<T>(_G.gw, a) { }
+ };
+
+ template<typename T> class EdgeMap : public GraphWrapper::EdgeMap<T> {
+ public:
+ EdgeMap(const GraphWrapperSkeleton<GraphWrapper>& _G) :
+ GraphWrapper::EdgeMap<T>(_G.gw) { }
+ EdgeMap(const GraphWrapperSkeleton<GraphWrapper>& _G, T a) :
+ GraphWrapper::EdgeMap<T>(_G.gw, a) { }
+ };
+ };
+
template<typename Graph>
class RevGraphWrapper
{
@@ -109,19 +184,19 @@
void setGraph(Graph& _graph) { graph = &_graph; }
Graph& getGraph() const { return (*graph); }
- template<typename I> I& /*getF*/first(I& i) const { return graph->/*getF*/first(i); }
- template<typename I, typename P> I& /*getF*/first(I& i, const P& p) const {
- return graph->/*getF*/first(i, p); }
+ template<typename I> I& first(I& i) const { return graph->first(i); }
+ template<typename I, typename P> I& first(I& i, const P& p) const {
+ return graph->first(i, p); }
template<typename I> I getNext(const I& i) const {
return graph->getNext(i); }
template<typename I> I& next(I &i) const { return graph->next(i); }
template< typename It > It first() const {
- It e; /*getF*/first(e); return e; }
+ It e; first(e); return e; }
template< typename It > It first(const Node& v) const {
- It e; /*getF*/first(e, v); return e; }
+ It e; first(e, v); return e; }
Node head(const Edge& e) const { return graph->tail(e); }
Node tail(const Edge& e) const { return graph->head(e); }
@@ -227,20 +302,20 @@
OutEdgeIt(const Invalid& i) : Edge(i) { }
OutEdgeIt(const UndirGraphWrapper& _G, const Node& n) : Edge() {
out_or_in=true;
- _G.graph->/*getF*/first(out, n);
+ _G.graph->first(out, n);
if (!(_G.graph->valid(out))) {
out_or_in=false;
- _G.graph->/*getF*/first(in, n);
+ _G.graph->first(in, n);
}
}
};
- OutEdgeIt& /*getF*/first(OutEdgeIt& e, const Node& n) const {
+ OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
e.out_or_in=true;
- graph->/*getF*/first(e.out, n);
+ graph->first(e.out, n);
if (!(graph->valid(e.out))) {
e.out_or_in=false;
- graph->/*getF*/first(e.in, n);
+ graph->first(e.in, n);
}
return e;
}
@@ -251,7 +326,7 @@
graph->next(e.out);
if (!graph->valid(e.out)) {
e.out_or_in=false;
- graph->/*getF*/first(e.in, n);
+ graph->first(e.in, n);
}
} else {
graph->next(e.in);
@@ -266,19 +341,19 @@
typedef OutEdgeIt InEdgeIt;
- template<typename I> I& /*getF*/first(I& i) const { return graph->/*getF*/first(i); }
-// template<typename I, typename P> I& /*getF*/first(I& i, const P& p) const {
-// return graph->/*getF*/first(i, p); }
+ template<typename I> I& first(I& i) const { return graph->first(i); }
+// template<typename I, typename P> I& first(I& i, const P& p) const {
+// return graph->first(i, p); }
template<typename I> I getNext(const I& i) const {
return graph->getNext(i); }
template<typename I> I& next(I &i) const { return graph->next(i); }
template< typename It > It first() const {
- It e; /*getF*/first(e); return e; }
+ It e; first(e); return e; }
template< typename It > It first(const Node& v) const {
- It e; /*getF*/first(e, v); return e; }
+ It e; first(e, v); return e; }
Node head(const Edge& e) const { return graph->head(e); }
Node tail(const Edge& e) const { return graph->tail(e); }
@@ -348,17 +423,17 @@
// int nodeNum() const { return graph->nodeNum(); }
// int edgeNum() const { return graph->edgeNum(); }
-// template<typename I> I& /*getF*/first(I& i) const { return graph->/*getF*/first(i); }
-// template<typename I, typename P> I& /*getF*/first(I& i, const P& p) const {
-// return graph->/*getF*/first(i, p); }
+// template<typename I> I& first(I& i) const { return graph->first(i); }
+// template<typename I, typename P> I& first(I& i, const P& p) const {
+// return graph->first(i, p); }
// //template<typename I> I next(const I i); { return graph->goNext(i); }
// //template<typename I> I &goNext(I &i); { return graph->goNext(i); }
// template< typename It > It first() const {
-// It e; /*getF*/first(e); return e; }
+// It e; first(e); return e; }
// template< typename It > It first(Node v) const {
-// It e; /*getF*/first(e, v); return e; }
+// It e; first(e, v); return e; }
// Node head(const Edge& e) const { return graph->head(e); }
// Node tail(const Edge& e) const { return graph->tail(e); }
@@ -455,11 +530,11 @@
OutEdgeIt(const Invalid& i) : Edge(i) { }
private:
OutEdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG, Node v) : Edge() {
- resG.graph->/*getF*/first(out, v);
+ resG.graph->first(out, v);
while( resG.graph->valid(out) && !(resG.free(out)>0) ) { resG.graph->next(out); }
if (!resG.graph->valid(out)) {
out_or_in=0;
- resG.graph->/*getF*/first(in, v);
+ resG.graph->first(in, v);
while( resG.graph->valid(in) && !(resG.free(in)>0) ) { resG.graph->next(in); }
}
}
@@ -471,7 +546,7 @@
// while( out.valid() && !(Edge::free()>0) ) { ++out; }
// if (!out.valid()) {
// out_or_in=0;
-// G->/*getF*/first(in, v);
+// G->first(in, v);
// while( in.valid() && !(Edge::free()>0) ) { ++in; }
// }
// } else {
@@ -490,22 +565,22 @@
//EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { }
EdgeIt(const Invalid& i) : Edge(i) { }
EdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG) : Edge() {
- resG.graph->/*getF*/first(v);
- if (resG.graph->valid(v)) resG.graph->/*getF*/first(out, v); else out=OldOutEdgeIt(INVALID);
+ resG.graph->first(v);
+ if (resG.graph->valid(v)) resG.graph->first(out, v); else out=OldOutEdgeIt(INVALID);
while (resG.graph->valid(out) && !(resG.free(out)>0) ) { resG.graph->next(out); }
while (resG.graph->valid(v) && !resG.graph->valid(out)) {
resG.graph->next(v);
- if (resG.graph->valid(v)) resG.graph->/*getF*/first(out, v);
+ if (resG.graph->valid(v)) resG.graph->first(out, v);
while (resG.graph->valid(out) && !(resG.free(out)>0) ) { resG.graph->next(out); }
}
if (!resG.graph->valid(out)) {
out_or_in=0;
- resG.graph->/*getF*/first(v);
- if (resG.graph->valid(v)) resG.graph->/*getF*/first(in, v); else in=OldInEdgeIt(INVALID);
+ resG.graph->first(v);
+ if (resG.graph->valid(v)) resG.graph->first(in, v); else in=OldInEdgeIt(INVALID);
while (resG.graph->valid(in) && !(resG.free(in)>0) ) { resG.graph->next(in); }
while (resG.graph->valid(v) && !resG.graph->valid(in)) {
resG.graph->next(v);
- if (resG.graph->valid(v)) resG.graph->/*getF*/first(in, v);
+ if (resG.graph->valid(v)) resG.graph->first(in, v);
while (resG.graph->valid(in) && !(resG.free(in)>0) ) { resG.graph->next(in); }
}
}
@@ -516,17 +591,17 @@
// while (out.valid() && !(Edge::free()>0) ) { ++out; }
// while (v.valid() && !out.valid()) {
// ++v;
-// if (v.valid()) G->/*getF*/first(out, v);
+// if (v.valid()) G->first(out, v);
// while (out.valid() && !(Edge::free()>0) ) { ++out; }
// }
// if (!out.valid()) {
// out_or_in=0;
-// G->/*getF*/first(v);
-// if (v.valid()) G->/*getF*/first(in, v); else in=OldInEdgeIt();
+// G->first(v);
+// if (v.valid()) G->first(in, v); else in=OldInEdgeIt();
// while (in.valid() && !(Edge::free()>0) ) { ++in; }
// while (v.valid() && !in.valid()) {
// ++v;
-// if (v.valid()) G->/*getF*/first(in, v);
+// if (v.valid()) G->first(in, v);
// while (in.valid() && !(Edge::free()>0) ) { ++in; }
// }
// }
@@ -535,7 +610,7 @@
// while (in.valid() && !(Edge::free()>0) ) { ++in; }
// while (v.valid() && !in.valid()) {
// ++v;
-// if (v.valid()) G->/*getF*/first(in, v);
+// if (v.valid()) G->first(in, v);
// while (in.valid() && !(Edge::free()>0) ) { ++in; }
// }
// }
@@ -543,12 +618,12 @@
// }
};
- NodeIt& /*getF*/first(NodeIt& v) const { return graph->/*getF*/first(v); }
- OutEdgeIt& /*getF*/first(OutEdgeIt& e, Node v) const {
+ NodeIt& first(NodeIt& v) const { return graph->first(v); }
+ OutEdgeIt& first(OutEdgeIt& e, Node v) const {
e=OutEdgeIt(*this, v);
return e;
}
- EdgeIt& /*getF*/first(EdgeIt& e) const {
+ EdgeIt& first(EdgeIt& e) const {
e=EdgeIt(*this);
return e;
}
@@ -562,7 +637,7 @@
while( graph->valid(e.out) && !(free(e.out)>0) ) { graph->next(e.out); }
if (!graph->valid(e.out)) {
e.out_or_in=0;
- graph->/*getF*/first(e.in, v);
+ graph->first(e.in, v);
while( graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
}
} else {
@@ -578,17 +653,17 @@
while (graph->valid(e.out) && !(free(e.out)>0) ) { graph->next(e.out); }
while (graph->valid(e.v) && !graph->valid(e.out)) {
graph->next(e.v);
- if (graph->valid(e.v)) graph->/*getF*/first(e.out, e.v);
+ if (graph->valid(e.v)) graph->first(e.out, e.v);
while (graph->valid(e.out) && !(free(e.out)>0) ) { graph->next(e.out); }
}
if (!graph->valid(e.out)) {
e.out_or_in=0;
- graph->/*getF*/first(e.v);
- if (graph->valid(e.v)) graph->/*getF*/first(e.in, e.v); else e.in=OldInEdgeIt(INVALID);
+ graph->first(e.v);
+ if (graph->valid(e.v)) graph->first(e.in, e.v); else e.in=OldInEdgeIt(INVALID);
while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
while (graph->valid(e.v) && !graph->valid(e.in)) {
graph->next(e.v);
- if (graph->valid(e.v)) graph->/*getF*/first(e.in, e.v);
+ if (graph->valid(e.v)) graph->first(e.in, e.v);
while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
}
}
@@ -597,7 +672,7 @@
while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
while (graph->valid(e.v) && !graph->valid(e.in)) {
graph->next(e.v);
- if (graph->valid(e.v)) graph->/*getF*/first(e.in, e.v);
+ if (graph->valid(e.v)) graph->first(e.in, e.v);
while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); }
}
}
@@ -608,14 +683,14 @@
template< typename It >
It first() const {
It e;
- /*getF*/first(e);
+ first(e);
return e;
}
template< typename It >
It first(Node v) const {
It e;
- /*getF*/first(e, v);
+ first(e, v);
return e;
}
@@ -708,7 +783,7 @@
first_out_edges(*this) /*, dist(*this)*/ {
for(NodeIt n=this->template first<NodeIt>(); this->valid(n); this->next(n)) {
OutEdgeIt e;
- ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::/*getF*/first(e, n);
+ ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(e, n);
first_out_edges.set(n, e);
}
}
@@ -739,28 +814,28 @@
//typedef typename Graph::SymEdgeIt SymEdgeIt;
//typedef typename ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::EdgeIt EdgeIt;
- NodeIt& /*getF*/first(NodeIt& n) const {
- return ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::/*getF*/first(n);
+ NodeIt& first(NodeIt& n) const {
+ return ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(n);
}
- OutEdgeIt& /*getF*/first(OutEdgeIt& e, const Node& n) const {
+ OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
e=first_out_edges.get(n);
return e;
}
- //ROSSZ template<typename I> I& /*getF*/first(I& i) const { return /*getF*/first(i); }
- //ROSSZ template<typename I, typename P> I& /*getF*/first(I& i, const P& p) const {
- // return /*getF*/first(i, p); }
+ //ROSSZ template<typename I> I& first(I& i) const { return first(i); }
+ //ROSSZ template<typename I, typename P> I& first(I& i, const P& p) const {
+ // return first(i, p); }
//template<typename I> I getNext(const I& i) const {
// return graph->getNext(i); }
//template<typename I> I& next(I &i) const { return graph->next(i); }
template< typename It > It first() const {
- It e; /*getF*/first(e); return e; }
+ It e; first(e); return e; }
template< typename It > It first(const Node& v) const {
- It e; /*getF*/first(e, v); return e; }
+ It e; first(e, v); return e; }
//Node head(const Edge& e) const { return graph->head(e); }
//Node tail(const Edge& e) const { return graph->tail(e); }
@@ -838,8 +913,8 @@
ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>(_G, _flow, _capacity), dist(*this, graph->nodeNum()) {
}
- OutEdgeIt& /*getF*/first(OutEdgeIt& e, const Node& n) const {
- ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::/*getF*/first(e, n);
+ OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
+ ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(e, n);
while (valid(e) && (dist.get(tail(e))/*+1!=*/>=dist.get(head(e))))
ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::next(e);
return e;
@@ -856,8 +931,8 @@
return e;
}
- NodeIt& /*getF*/first(NodeIt& n) const {
- return ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::/*getF*/first(n);
+ NodeIt& first(NodeIt& n) const {
+ return ErasingResGraphWrapper<Graph, Number, FlowMap, CapacityMap>::first(n);
}
void erase(const Edge& e) {
@@ -874,19 +949,19 @@
//void setGraph(Graph& _graph) { graph = &_graph; }
//Graph& getGraph() const { return (*graph); }
- //template<typename I> I& /*getF*/first(I& i) const { return graph->/*getF*/first(i); }
- //template<typename I, typename P> I& /*getF*/first(I& i, const P& p) const {
- // return graph->/*getF*/first(i, p); }
+ //template<typename I> I& first(I& i) const { return graph->first(i); }
+ //template<typename I, typename P> I& first(I& i, const P& p) const {
+ // return graph->first(i, p); }
//template<typename I> I getNext(const I& i) const {
// return graph->getNext(i); }
//template<typename I> I& next(I &i) const { return graph->next(i); }
template< typename It > It first() const {
- It e; /*getF*/first(e); return e; }
+ It e; first(e); return e; }
template< typename It > It first(const Node& v) const {
- It e; /*getF*/first(e, v); return e; }
+ It e; first(e, v); return e; }
//Node head(const Edge& e) const { return graph->head(e); }
//Node tail(const Edge& e) const { return graph->tail(e); }
@@ -970,20 +1045,20 @@
// int nodeNum() const { return graph->nodeNum(); }
// int edgeNum() const { return graph->edgeNum(); }
-// Node& /*getF*/first(Node& n) const { return graph->/*getF*/first(n); }
+// Node& first(Node& n) const { return graph->first(n); }
// // Edge and SymEdge is missing!!!!
// // Edge <-> In/OutEdgeIt conversion is missing!!!!
// //FIXME
-// OutEdgeIt& /*getF*/first(OutEdgeIt& e, const Node& n) const
+// OutEdgeIt& first(OutEdgeIt& e, const Node& n) const
// {
// e.n=n;
-// graph->/*getF*/first(e.o,n);
+// graph->first(e.o,n);
// while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
// graph->goNext(e.o);
// if(!graph->valid(e.o)) {
-// graph->/*getF*/first(e.i,n);
+// graph->first(e.i,n);
// while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
// graph->goNext(e.i);
// }
@@ -996,7 +1071,7 @@
// while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
// graph->goNext(e.o);
// if(graph->valid(e.o)) return e;
-// else graph->/*getF*/first(e.i,e.n);
+// else graph->first(e.i,e.n);
// }
// else {
// while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
@@ -1009,14 +1084,14 @@
// //bool valid(const OutEdgeIt e) { return graph->valid(e.o)||graph->valid(e.i);}
// //FIXME
-// InEdgeIt& /*getF*/first(InEdgeIt& e, const Node& n) const
+// InEdgeIt& first(InEdgeIt& e, const Node& n) const
// {
// e.n=n;
-// graph->/*getF*/first(e.i,n);
+// graph->first(e.i,n);
// while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
// graph->goNext(e.i);
// if(!graph->valid(e.i)) {
-// graph->/*getF*/first(e.o,n);
+// graph->first(e.o,n);
// while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
// graph->goNext(e.o);
// }
@@ -1029,7 +1104,7 @@
// while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
// graph->goNext(e.i);
// if(graph->valid(e.i)) return e;
-// else graph->/*getF*/first(e.o,e.n);
+// else graph->first(e.o,e.n);
// }
// else {
// while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
@@ -1045,10 +1120,10 @@
// //template<typename I> I next(const I i); { return graph->goNext(i); }
// template< typename It > It first() const {
-// It e; /*getF*/first(e); return e; }
+// It e; first(e); return e; }
// template< typename It > It first(Node v) const {
-// It e; /*getF*/first(e, v); return e; }
+// It e; first(e, v); return e; }
// Node head(const Edge& e) const { return graph->head(e); }
// Node tail(const Edge& e) const { return graph->tail(e); }
More information about the Lemon-commits
mailing list