author | alpar |
Tue, 31 Oct 2006 08:39:01 +0000 | |
changeset 2279 | 2c3fee01d3ed |
child 2288 | ef8af928c54e |
permissions | -rw-r--r-- |
alpar@2195 | 1 |
/** |
alpar@2195 | 2 |
\page getting_started Getting Started |
alpar@2195 | 3 |
|
alpar@2195 | 4 |
At the beginning we hardly suggest that you open your favorite text editor |
alpar@2195 | 5 |
and enter the code simultaneously as you read it. Compiling the demos is also |
alpar@2195 | 6 |
a good exercise. |
alpar@2195 | 7 |
|
alpar@2195 | 8 |
As the first example we show you a lemon style "Hello World" program. Now we |
alpar@2195 | 9 |
explain almost every line, but later we will skip the basics and focus on new |
alpar@2195 | 10 |
things. |
alpar@2195 | 11 |
|
alpar@2195 | 12 |
\section hello_world Hello World in LEMON |
alpar@2195 | 13 |
|
alpar@2195 | 14 |
In this little program we give you a taste of the LEMON programming. |
alpar@2195 | 15 |
|
alpar@2195 | 16 |
Let's see the code fragment to fragment! |
alpar@2195 | 17 |
|
alpar@2195 | 18 |
\dontinclude hello_world.cc |
alpar@2195 | 19 |
\skip include |
alpar@2195 | 20 |
\until iostream |
alpar@2195 | 21 |
|
alpar@2195 | 22 |
We want to use a \c lemon::ListGraph so the include goes like this: |
alpar@2195 | 23 |
\skip include |
alpar@2195 | 24 |
\until list_graph |
alpar@2195 | 25 |
|
alpar@2195 | 26 |
The next few lines are not necessary but useful shortcuts, if you don't |
alpar@2195 | 27 |
want to type \c lemon::ListGraph::Node every time. |
alpar@2195 | 28 |
\skip using |
alpar@2195 | 29 |
\until Edge |
alpar@2195 | 30 |
|
alpar@2195 | 31 |
For this demo we need to declare a ListGraph and a special NodeMap to store the |
alpar@2195 | 32 |
characters associated to the graph's nodes. |
alpar@2195 | 33 |
\skip main |
alpar@2195 | 34 |
\until char_map |
alpar@2195 | 35 |
|
alpar@2195 | 36 |
Adding nodes to the graph is very easy. |
alpar@2195 | 37 |
\skip new_node |
alpar@2195 | 38 |
\until addNode |
alpar@2195 | 39 |
|
alpar@2195 | 40 |
When a new node or edge to the graph the assigned maps are automatically resized. |
alpar@2195 | 41 |
So graphs can be build dynamically. The usage of a map is very natural. |
alpar@2195 | 42 |
\skip char_map |
alpar@2195 | 43 |
\until char_map |
alpar@2195 | 44 |
|
alpar@2195 | 45 |
Notice that no reference or additional assignment needed to work with nodes. |
alpar@2195 | 46 |
They won't become illegal or won't lead to throwing any exceptions. |
alpar@2195 | 47 |
You can declare and handle node like every other basic type such as \c int. |
alpar@2195 | 48 |
\skip Store |
alpar@2195 | 49 |
\until char_map |
alpar@2195 | 50 |
|
alpar@2195 | 51 |
As one expects adding an Edge is similar. You need to define the \b source node |
alpar@2195 | 52 |
and the \b destination node. The nodes must belong to the graph of course. The |
alpar@2195 | 53 |
Edge has the direction from the source to the destination. In some case you don't |
alpar@2195 | 54 |
want the edges to be directed - then you use an undirected graph. For example |
alpar@2195 | 55 |
lemon::ListUGraph. |
alpar@2195 | 56 |
\skip addEdge |
alpar@2195 | 57 |
\until addEdge |
alpar@2195 | 58 |
|
alpar@2195 | 59 |
In the next few lines we add some more nodes and edges and to the graph we need. |
alpar@2195 | 60 |
Those lines are not very interesting so we skip them, but you find the whole |
alpar@2195 | 61 |
working program in file hello_lemon.cc in the demo section. |
alpar@2195 | 62 |
|
alpar@2195 | 63 |
The next statement must be familiar. But what is that INVALID in the \c while |
alpar@2195 | 64 |
test statement? In LEMON we usually use the INVALID to check if an object |
alpar@2195 | 65 |
contains valid information. |
alpar@2195 | 66 |
\skip current_node |
alpar@2195 | 67 |
\until { |
alpar@2195 | 68 |
|
alpar@2195 | 69 |
We take the current node and write out the character assigned to it. Is's easy |
alpar@2195 | 70 |
with the \c char_map. |
alpar@2195 | 71 |
\skip std |
alpar@2195 | 72 |
\until std |
alpar@2195 | 73 |
|
alpar@2195 | 74 |
And here comes the trick. OutEdgeIt iterates on outgoing edges of a given node. |
alpar@2195 | 75 |
We pass the current node as argument to it, so the \c edge iterator will stand |
alpar@2195 | 76 |
on the first outgoing edge of the current node, or will be INVALID if the node |
alpar@2195 | 77 |
has no outgoing edges. |
alpar@2195 | 78 |
\skip edge |
alpar@2195 | 79 |
\until edge |
alpar@2195 | 80 |
|
alpar@2195 | 81 |
The graph we built before is linear, so we know that it ends, when no more outgoing |
alpar@2195 | 82 |
edges found. Otherwise the current node must be the node the edge points to. |
alpar@2195 | 83 |
Basic information about an edge can be requested from the graph. |
alpar@2195 | 84 |
\skip if |
alpar@2195 | 85 |
\until } |
alpar@2195 | 86 |
|
alpar@2195 | 87 |
Finish the code, just to be precise. |
alpar@2195 | 88 |
\skip return |
alpar@2195 | 89 |
\until } |
alpar@2195 | 90 |
|
alpar@2195 | 91 |
|
alpar@2195 | 92 |
\section compile_hw Compiling Hello World |
alpar@2195 | 93 |
To compile this program all you have to do is type in |
alpar@2195 | 94 |
\code g++ -ohw hello_world.cc \endcode |
alpar@2195 | 95 |
and press \c Enter! This is the case if you installed LEMON on your system. |
alpar@2195 | 96 |
(For more information see the LEMON installation instructions.) |
alpar@2195 | 97 |
|
alpar@2195 | 98 |
This is because LEMON is template library and most of it's code has to be available |
alpar@2195 | 99 |
as source code during compilation. |
alpar@2195 | 100 |
|
alpar@2195 | 101 |
Most programs using LEMON will compile as easy as this one unless you want to |
alpar@2195 | 102 |
use some performance measuring tools LEMON can provide. Then you need to link |
alpar@2195 | 103 |
an additional library against your program. |
alpar@2195 | 104 |
*/ |