Plusieurs versions d'un bout de code
	
	
		Bonjour :mrgreen:,
Je me demandais comment on pouvait copié/ collé un bout de code :mrgreen:
Précision: quel compilateur? Je dirais C++03
Un exemple: Prenons l'exemple de l'algo de Morris, Joseph H. pour traverser un arbre de façon itérative
Et je voudrais:
- Une version brute/ optimale -> la version originale
- À partir de la version originale, rajouté des logs
- À partir de la version originale, rajouté des traces pour le débogage
	Code:
	
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 
 | iterativeInorder(node)
  s <- empty stack
  while (not s.isEmpty() or node != null)
    if (node != null)
      s.push(node) // action
      node <- node.left
    else
      node <- s.pop()
      visit(node)
      node <- node.right
 
 
iterativeInorder_log(node)
  s <- empty stack
  while (not s.isEmpty() or node != null)
    if (node != null)
      s.push(node) // action
      display(node) // log
      node <- node.left
    else
      node <- s.pop()
      visit(node)
      node <- node.right
 
 
iterativeInorder_debug(node)
  s <- empty stack
  while (not s.isEmpty() or node != null)
    if (node != null)
      s.push(node) // action
      display("Here node " + node) // debug
      node <- node.left
      display("Go left, node " + node) // debug
    else
      node <- s.pop()
      display("Pop node " + node) // debug
      visit(node)
      node <- node.right
      display("Go right, node " + node) // debug | 
 
Une solution "template" existe, mais cela nécessite
- De tout mettre dans les entêtes. Et pour un algo de XXX lignes avec XXX entêtes, c'est moche :aie: :aie:
- D'avoir des alertes parce que le compilateur détecte du "code mort" (*). Et en espérant que le compilateur/ linker le supprime (avec les tests), sinon on perd un peu d'optimal avec tout un tas de tests inutiles :aie: :aie:
*, édit: plus exactement, des alertes "expression constante". Et donc, un if (false) { ... } produit du "code mort" 
	Code:
	
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | tempate<bool with_debug, bool with_log>
iterativeInorder(node)
  s <- empty stack
  while (not s.isEmpty() or node != null)
    if (node != null)
      s.push(node) // action
      if (with_log) { display(node) }
      if (with_debug) { display("Here node " + node) }
      node <- node.left
      if (with_debug) { display("Go left, node " + node) }
    else
      node <- s.pop()
      if (with_debug) { display("Pop node " + node) }
      visit(node)
      node <- node.right
      if (with_debug) { display("Go right, node " + node) }
 
 
version originale: iterativeInorder<false, false> (...)
version log:  iterativeInorder<false, true> (...)
version debug:  iterativeInorder<true, false> (...) |