EFL 1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. data/README.txt +36 -0
  2. data/lib/EFL.rb +494 -0
  3. data/lib/EFL_array.rb +20 -0
  4. data/lib/EFL_errors.rb +48 -0
  5. data/lib/EFL_hash.rb +18 -0
  6. data/lib/EFL_production.rb +49 -0
  7. data/lib/EFL_regexp.rb +112 -0
  8. data/lib/EFL_regexp_generator.rb +70 -0
  9. data/lib/EFL_substitution.rb +221 -0
  10. data/lib/EFL_syntactic_sugar.rb +67 -0
  11. data/lib/Hash Doc.doc +0 -0
  12. data/lib/Limitaciones.txt +3 -0
  13. data/lib/doc/classes/Generator.html +634 -0
  14. data/lib/doc/classes/Generator.src/M000008.html +18 -0
  15. data/lib/doc/classes/Generator.src/M000009.html +18 -0
  16. data/lib/doc/classes/Generator.src/M000010.html +18 -0
  17. data/lib/doc/classes/Generator.src/M000011.html +18 -0
  18. data/lib/doc/classes/Generator.src/M000012.html +18 -0
  19. data/lib/doc/classes/Generator.src/M000013.html +18 -0
  20. data/lib/doc/classes/Generator.src/M000014.html +18 -0
  21. data/lib/doc/classes/Generator.src/M000015.html +18 -0
  22. data/lib/doc/classes/Generator.src/M000016.html +28 -0
  23. data/lib/doc/classes/Generator.src/M000017.html +24 -0
  24. data/lib/doc/classes/Generator.src/M000018.html +157 -0
  25. data/lib/doc/classes/Generator.src/M000019.html +25 -0
  26. data/lib/doc/classes/Generator.src/M000020.html +30 -0
  27. data/lib/doc/classes/Generator.src/M000021.html +32 -0
  28. data/lib/doc/classes/Generator.src/M000022.html +22 -0
  29. data/lib/doc/classes/Generator.src/M000023.html +18 -0
  30. data/lib/doc/classes/Generator.src/M000024.html +27 -0
  31. data/lib/doc/classes/Generator.src/M000025.html +22 -0
  32. data/lib/doc/classes/Generator.src/M000026.html +18 -0
  33. data/lib/doc/classes/Generator.src/M000027.html +27 -0
  34. data/lib/doc/classes/Regexp.html +271 -0
  35. data/lib/doc/classes/Regexp.src/M000028.html +37 -0
  36. data/lib/doc/classes/Regexp.src/M000029.html +29 -0
  37. data/lib/doc/classes/Regexp.src/M000030.html +32 -0
  38. data/lib/doc/created.rid +1 -0
  39. data/lib/doc/files/EFL_rb.html +147 -0
  40. data/lib/doc/files/EFL_regexp_generator_rb.html +242 -0
  41. data/lib/doc/files/EFL_regexp_generator_rb.src/M000003.html +27 -0
  42. data/lib/doc/files/EFL_regexp_generator_rb.src/M000004.html +27 -0
  43. data/lib/doc/files/EFL_regexp_generator_rb.src/M000005.html +19 -0
  44. data/lib/doc/files/EFL_regexp_generator_rb.src/M000006.html +20 -0
  45. data/lib/doc/files/EFL_regexp_generator_rb.src/M000007.html +19 -0
  46. data/lib/doc/files/EFL_regexp_rb.html +139 -0
  47. data/lib/doc/files/EFL_syntactic_sugar_rb.html +208 -0
  48. data/lib/doc/files/EFL_syntactic_sugar_rb.src/M000001.html +29 -0
  49. data/lib/doc/files/EFL_syntactic_sugar_rb.src/M000002.html +19 -0
  50. data/lib/doc/fr_class_index.html +28 -0
  51. data/lib/doc/fr_file_index.html +30 -0
  52. data/lib/doc/fr_method_index.html +56 -0
  53. data/lib/doc/index.html +24 -0
  54. data/tests/Add_Sup_1.rb +223 -0
  55. data/tests/Add_Sup_1.rb.bak +223 -0
  56. data/tests/Add_Sup_1_NI.rb +25 -0
  57. data/tests/Add_Sup_2.rb +142 -0
  58. data/tests/Add_Sup_2.rb.bak +140 -0
  59. data/tests/All.rb +2 -0
  60. data/tests/All_1.rb +7 -0
  61. data/tests/All_2.rb +7 -0
  62. data/tests/All_2.rb.bak +5 -0
  63. data/tests/BeforeAfter.rb +83 -0
  64. data/tests/Bloques.rb +34 -0
  65. data/tests/Bloques.rb.bak +34 -0
  66. data/tests/Complementary.rb +144 -0
  67. data/tests/ComplementaryZoom.rb +78 -0
  68. data/tests/Del.rb +126 -0
  69. data/tests/Dup.rb +55 -0
  70. data/tests/Dup.rb.bak +54 -0
  71. data/tests/Error.rb +11 -0
  72. data/tests/ErrorArgClass.rb +169 -0
  73. data/tests/ErrorArgClass.rb.bak +158 -0
  74. data/tests/ErrorCollision.rb +218 -0
  75. data/tests/ErrorCollision.rb.bak +219 -0
  76. data/tests/ErrorWithoutDeclaration.rb +60 -0
  77. data/tests/ErrorWithoutDeclaration.rb.bak +60 -0
  78. data/tests/Extract.rb +56 -0
  79. data/tests/ExtractDollar.rb +17 -0
  80. data/tests/HashTest.rb +54 -0
  81. data/tests/HashTest.rb.bak +54 -0
  82. data/tests/Lista Czarnecki/AntiguaInterfaz/List.cpp +75 -0
  83. data/tests/Lista Czarnecki/AntiguaInterfaz/ListTransformer.rb +69 -0
  84. data/tests/Lista Czarnecki/AntiguaInterfaz/ListTransformer.rb.bak +100 -0
  85. data/tests/Lista Czarnecki/AntiguaInterfaz/ejecutame.bat +1 -0
  86. data/tests/Lista Czarnecki/AntiguaInterfaz/outDir/MyClassList.cpp +75 -0
  87. data/tests/Lista Czarnecki/AntiguaInterfaz/runme.bat +1 -0
  88. data/tests/Lista Czarnecki/AntiguaInterfaz/specification1.txt +5 -0
  89. data/tests/Lista Czarnecki/AntiguaInterfaz/specification2.txt +3 -0
  90. data/tests/Lista Czarnecki/AntiguaInterfaz/specification3.txt +5 -0
  91. data/tests/Lista Czarnecki/NuevaInterfaz/List.cpp +75 -0
  92. data/tests/Lista Czarnecki/NuevaInterfaz/ListTransformer.rb +58 -0
  93. data/tests/Lista Czarnecki/NuevaInterfaz/ListTransformer.rb.bak +57 -0
  94. data/tests/Lista Czarnecki/NuevaInterfaz/ejecutame.bat +1 -0
  95. data/tests/Lista Czarnecki/NuevaInterfaz/outDir/MyClassList.cpp +75 -0
  96. data/tests/Lista Czarnecki/NuevaInterfaz/outDir/NewClassList.cpp +75 -0
  97. data/tests/Lista Czarnecki/NuevaInterfaz/specification1.txt +5 -0
  98. data/tests/Lista Czarnecki/NuevaInterfaz/specification1.txt.bak +5 -0
  99. data/tests/Lista Czarnecki/NuevaInterfaz/specification2.txt +3 -0
  100. data/tests/Lista Czarnecki/NuevaInterfaz/specification3.txt +5 -0
  101. data/tests/Minus.rb +89 -0
  102. data/tests/Plus.rb.bak +48 -0
  103. data/tests/REVit.rb +84 -0
  104. data/tests/RenameTest.rb +46 -0
  105. data/tests/RenameTest.rb.bak +46 -0
  106. data/tests/SubCrash.rb +26 -0
  107. data/tests/SubList.rb.bak +43 -0
  108. data/tests/archAuxiliares/1.txt +328 -0
  109. data/tests/archAuxiliares/2.txt +328 -0
  110. data/tests/archAuxiliares/Bloques/s1.txt +328 -0
  111. data/tests/archAuxiliares/Copia de Matriz.java +19 -0
  112. data/tests/archAuxiliares/Gen/Tesis_156_1.lgi +10 -0
  113. data/tests/archAuxiliares/Gen/Tesis_156_2.lgi +10 -0
  114. data/tests/archAuxiliares/Gen/t01.txt +328 -0
  115. data/tests/archAuxiliares/Gen/t01.txt.bak +328 -0
  116. data/tests/archAuxiliares/Gen/t02.txt +328 -0
  117. data/tests/archAuxiliares/Gen/t02.txt.bak +328 -0
  118. data/tests/archAuxiliares/Gen/t03.txt +328 -0
  119. data/tests/archAuxiliares/Gen/t03.txt.bak +328 -0
  120. data/tests/archAuxiliares/Gen/t04.txt +328 -0
  121. data/tests/archAuxiliares/Gen/t04.txt.bak +328 -0
  122. data/tests/archAuxiliares/Gen/t1.txt +328 -0
  123. data/tests/archAuxiliares/Gen/t1.txt.bak +328 -0
  124. data/tests/archAuxiliares/Gen/t2.txt +328 -0
  125. data/tests/archAuxiliares/Gen/t2.txt.bak +328 -0
  126. data/tests/archAuxiliares/Gen/t5.txt +328 -0
  127. data/tests/archAuxiliares/Gen/t9.txt +328 -0
  128. data/tests/archAuxiliares/Gen/t9.txt.bak +328 -0
  129. data/tests/archAuxiliares/GenTesis_156_1.lgi +10 -0
  130. data/tests/archAuxiliares/Matriz.java +74 -0
  131. data/tests/archAuxiliares/MatrizOut.java +74 -0
  132. data/tests/archAuxiliares/MatrizOut10.java +68 -0
  133. data/tests/archAuxiliares/MatrizOut11.java +86 -0
  134. data/tests/archAuxiliares/MatrizOut2.java +74 -0
  135. data/tests/archAuxiliares/MatrizOut3.java +74 -0
  136. data/tests/archAuxiliares/MatrizOut4.java +74 -0
  137. data/tests/archAuxiliares/MatrizOut5.java +21 -0
  138. data/tests/archAuxiliares/MatrizOut6.java +21 -0
  139. data/tests/archAuxiliares/MatrizOut7.java +21 -0
  140. data/tests/archAuxiliares/MatrizOut8.java +16 -0
  141. data/tests/archAuxiliares/MatrizOut9.java +86 -0
  142. data/tests/archAuxiliares/MatrizOut_9.java +86 -0
  143. data/tests/archAuxiliares/Matriz_1.java +74 -0
  144. data/tests/archAuxiliares/Matriz_10.java +68 -0
  145. data/tests/archAuxiliares/Matriz_11.java +86 -0
  146. data/tests/archAuxiliares/Matriz_2.java +74 -0
  147. data/tests/archAuxiliares/Matriz_3.java +74 -0
  148. data/tests/archAuxiliares/Matriz_4.java +74 -0
  149. data/tests/archAuxiliares/Matriz_5.java +21 -0
  150. data/tests/archAuxiliares/Matriz_6.java +21 -0
  151. data/tests/archAuxiliares/Matriz_7.java +21 -0
  152. data/tests/archAuxiliares/Matriz_8.java +16 -0
  153. data/tests/archAuxiliares/Matriz_9.java +86 -0
  154. data/tests/archAuxiliares/Matriz_N_1.java +21 -0
  155. data/tests/archAuxiliares/Matriz_N_2.java +91 -0
  156. data/tests/archAuxiliares/N1.txt +18 -0
  157. data/tests/archAuxiliares/N1_EXPECTED.txt +18 -0
  158. data/tests/archAuxiliares/N1_OUT.txt +18 -0
  159. data/tests/archAuxiliares/N2_EXPECTED.txt +18 -0
  160. data/tests/archAuxiliares/N2_OUT.txt +18 -0
  161. data/tests/archAuxiliares/N3.txt +23 -0
  162. data/tests/archAuxiliares/N3_EXPECTED.txt +22 -0
  163. data/tests/archAuxiliares/N3_OUT.txt +22 -0
  164. data/tests/archAuxiliares/N4_EXPECTED.txt +10 -0
  165. data/tests/archAuxiliares/N4_OUT.txt +10 -0
  166. data/tests/archAuxiliares/N5_OUT.txt +18 -0
  167. data/tests/archAuxiliares/N6_OUT.txt +18 -0
  168. data/tests/archAuxiliares/PedidorTerceroWS.jsp +142 -0
  169. data/tests/archAuxiliares/Tesis_156.lgi +7 -0
  170. data/tests/archAuxiliares/aspectgen.rb +328 -0
  171. data/tests/archAuxiliares/aspectgenCopy.rb +328 -0
  172. data/tests/archAuxiliares/extract_dollar.txt +1 -0
  173. data/tests/archAuxiliares/minus.txt +26 -0
  174. data/tests/archAuxiliares/minus_expected_1.txt +26 -0
  175. data/tests/archAuxiliares/minus_expected_2.txt +26 -0
  176. data/tests/archAuxiliares/minus_out_1.txt +26 -0
  177. data/tests/archAuxiliares/minus_out_2.txt +26 -0
  178. data/tests/archAuxiliares/p1.txt +328 -0
  179. data/tests/archAuxiliares/p2.txt +328 -0
  180. data/tests/archAuxiliares/s1.txt +328 -0
  181. data/tests/archAuxiliares/s2.txt +328 -0
  182. data/tests/archAuxiliares/s3.txt +328 -0
  183. data/tests/archAuxiliares/s4.txt +328 -0
  184. data/tests/archAuxiliares/s5.txt +328 -0
  185. data/tests/archAuxiliares/s7.txt +328 -0
  186. data/tests/archAuxiliares/s8.txt +328 -0
  187. data/tests/archAuxiliares/s9.txt +328 -0
  188. data/tests/archAuxiliares/text.txt +1 -0
  189. data/tests/delay.rb +33 -0
  190. data/tests/delay.rb.bak +33 -0
  191. data/tests/satisfy.rb +44 -0
  192. data/tests/satisfy.rb.bak +34 -0
  193. metadata +252 -0
@@ -0,0 +1,54 @@
1
+ require 'test/unit'
2
+ require "EFL.rb"
3
+
4
+ ########################################################
5
+ # Bateria de pruebas para los m�todos incorporados a Hash
6
+ #
7
+ # Ultima actualizacion: 1-10-2004
8
+ ########################################################
9
+
10
+ class HashTest < Test::Unit::TestCase
11
+ def setup
12
+ @hash1 = {
13
+ 'clave1' => ['1', '2'],
14
+ 'clave2' => ['3']
15
+ }
16
+
17
+ @hash2 = {
18
+ 'clave1_texto' => ['1', '2'],
19
+ 'clave2_texto' => ['3']
20
+ }
21
+
22
+ @hash3 = {
23
+ 'clave1' => ['texto_1', 'texto_2'],
24
+ 'clave2' => ['texto_3']
25
+ }
26
+
27
+ @hash4 = {
28
+ 'clave1_texto' => ['texto_1', 'texto_2'],
29
+ 'clave2_texto' => ['texto_3']
30
+ }
31
+
32
+ end #setup
33
+
34
+ def test_collect
35
+ assert_equal(@hash2,
36
+ @hash1.collect {|k, v|
37
+ ["#{k}_texto", v]
38
+ },
39
+ '')
40
+
41
+ assert_equal(@hash3,
42
+ @hash1.collect {|k, v|
43
+ [k, v.collect!{|e| "texto_#{e}"}]
44
+ },
45
+ '')
46
+
47
+ assert_equal(@hash4,
48
+ @hash1.collect {|k, v|
49
+ ["#{k}_texto", v.collect!{|e| "texto_#{e}"}]
50
+ },
51
+ '')
52
+ end #test_collect
53
+
54
+ end #HashTest
@@ -0,0 +1,75 @@
1
+ #include <iostream>
2
+ using namespace std;
3
+
4
+ class MyClass {};
5
+
6
+ ostream& operator<<(ostream& os, const MyClass &e)
7
+ {
8
+ os<<"- MyClass -";
9
+ return os;
10
+ };
11
+
12
+
13
+ ////////////////////////////////////////////////
14
+ // List
15
+ ////////////////////////////////////////////////
16
+
17
+ class List
18
+ {
19
+ private:
20
+ MyClass* head_;
21
+ List* tail_;
22
+ int length_;
23
+ public:
24
+ List(MyClass&h, List *t=0):
25
+ head_(0), tail_(t), length_(computedLength())
26
+ { setHead(h); }
27
+
28
+ ~List()
29
+ { delete head_; }
30
+
31
+ void setHead(MyClass& h)
32
+ {
33
+ cout << "setHead(" << h <<")" << endl;
34
+ head_ = new MyClass(h);
35
+ }
36
+
37
+ MyClass& head()
38
+ { cout << "head()" << endl;
39
+ return *head_;
40
+ }
41
+
42
+ void setTail(List *t)
43
+ {
44
+ cout << "setTail(t)" << endl;
45
+ tail_ = t;
46
+ length_ = computedLength();
47
+ }
48
+
49
+ List *tail() const
50
+ {
51
+ cout << "setTail(t)" << endl;
52
+ return tail_;
53
+ }
54
+
55
+ const int& length() const
56
+ { return length_; }
57
+
58
+ private:
59
+ int computedLength() const
60
+ { return tail()?tail()->length()+1:1; }
61
+
62
+ };
63
+
64
+
65
+
66
+ int main()
67
+ {
68
+ MyClass e1, e2;
69
+ List l1(e1);
70
+ List l2(e2, &l1);
71
+ List l3(e1);
72
+
73
+ l3.setHead(e1);
74
+ l3.setTail(&l2);
75
+ }
@@ -0,0 +1,69 @@
1
+ require 'EFL'
2
+ EXEMPLAR = 'List.cpp'
3
+
4
+ ######################################
5
+ # Generators
6
+ ######################################
7
+
8
+ class ElementType < Generator
9
+ def initialize(exemplar, out, element_type)
10
+ gsub(/MyClass/, element_type)
11
+ prod(exemplar, out)
12
+ end
13
+ end
14
+
15
+ class Ownership < Generator
16
+ def initialize(exemplar, out, ownership_type)
17
+ case ownership_type
18
+ when 'External reference'
19
+ sub /delete head_;/, ''
20
+ sub /new MyClass\(h\)/ , '&h'
21
+ when 'Owned reference'
22
+ sub /new MyClass\(h\)/ , '&h'
23
+ when 'Copy'
24
+ # no change
25
+ end
26
+ prod(exemplar, out)
27
+ end
28
+ end
29
+
30
+ class LengthCounter < Generator
31
+ def initialize(exemplar, out, length_counter_type)
32
+ if length_counter_type
33
+ gsub(/int/, length_counter_type)
34
+ else
35
+ gsub(/^.*length.*$/i, '')
36
+ gsub(/\)\:/, '\0head_(0), tail_(t)')
37
+ end
38
+ prod(exemplar, out)
39
+ end
40
+ end
41
+
42
+ class Tracing < Generator
43
+ def initialize(exemplar, out, tracing)
44
+ gsub(/cout.+$/, '') if !tracing
45
+ prod(exemplar, out)
46
+ end
47
+ end
48
+
49
+ ######################################
50
+ # Analyzer
51
+ ######################################
52
+
53
+ unless ARGV[0]
54
+ print "You should specify the list specification file"
55
+ exit
56
+ end
57
+ eval "SPECIFICATION = {#{File.open("#{ARGV[0]}").read}}"
58
+
59
+
60
+ ######################################
61
+ # Generator Combination
62
+ ######################################
63
+
64
+ ElementType.new(EXEMPLAR, SPECIFICATION['Out File'], SPECIFICATION['Element Type']).gen
65
+ (
66
+ Ownership.new(SPECIFICATION['Out File'], SPECIFICATION['Out File'], SPECIFICATION['Ownership']) +
67
+ LengthCounter.new(SPECIFICATION['Out File'], SPECIFICATION['Out File'], SPECIFICATION['Length Counter Type']) +
68
+ Tracing.new(SPECIFICATION['Out File'], SPECIFICATION['Out File'], SPECIFICATION['Tracing'])
69
+ ).gen
@@ -0,0 +1,100 @@
1
+ require '..\..\..\ETL\ETL'
2
+
3
+ ######################################
4
+ # generators
5
+ ######################################
6
+
7
+ class ElementType < Generator
8
+ def initialize(exemplar, out, elementType)
9
+ gsub(/Exemplar/, elementType)
10
+ prod(exemplar, out)
11
+ end
12
+ end
13
+
14
+ class Ownership < Generator
15
+ def initialize(exemplar, out, ownershipType)
16
+ case ownershipType
17
+ when 'External reference'
18
+ externalReference
19
+ when 'Owned reference'
20
+ ownedReference
21
+ when 'Copy'
22
+ copy
23
+ end
24
+ prod(exemplar, out)
25
+ end
26
+
27
+ def externalReference
28
+ sub(/delete head_;/, '')
29
+ sub(/new Exemplar\(h\)/ , '&h')
30
+ end
31
+
32
+ def ownedReference
33
+ sub(/new Exemplar\(h\)/ , '&h')
34
+ end
35
+
36
+ def copy
37
+ end
38
+ end
39
+
40
+ class LengthCounter < Generator
41
+ def initialize(exemplar, out, lengthType)
42
+ if lengthType
43
+ with(lengthType)
44
+ else
45
+ without
46
+ end
47
+ prod(exemplar, out)
48
+ end
49
+
50
+ def with(lengthType)
51
+ gsub(/int/, lengthType)
52
+ end
53
+
54
+ def without
55
+ gsub(/^.*length.*$/i, '')
56
+ gsub(/\)\:/, '\0head_(0), tail_(t)')
57
+ end
58
+ end
59
+
60
+ class Tracing < Generator
61
+ def initialize(exemplar, out, tracing)
62
+ if tracing
63
+ with
64
+ else
65
+ without
66
+ end
67
+ prod(exemplar, out)
68
+ end
69
+
70
+ def with
71
+ end
72
+
73
+ def without
74
+ gsub(/cout.+$/, '')
75
+ end
76
+ end
77
+
78
+ ######################################
79
+ # Configuration Knowledge
80
+ ######################################
81
+
82
+ unless ARGV[0]
83
+ print "You should specify the list specification file"
84
+ exit
85
+ end
86
+
87
+ # analyzer
88
+
89
+ eval "@list_specificacion = {#{File.open("#{ARGV[0]}").read}}"
90
+
91
+ # running generators
92
+
93
+ ElementType.new('List.cpp', @list_specificacion['Out File'], @list_specificacion['Element Type']).gen
94
+
95
+ (
96
+ Ownership.new(@list_specificacion['Out File'], @list_specificacion['Out File'], @list_specificacion['Ownership']) +
97
+ LengthCounter.new(@list_specificacion['Out File'], @list_specificacion['Out File'],
98
+ @list_specificacion['Length Type']) +
99
+ Tracing.new(@list_specificacion['Out File'], @list_specificacion['Out File'], @list_specificacion['Tracing'])
100
+ ).gen
@@ -0,0 +1 @@
1
+ ruby ListTransformer.rb specification1.txt
@@ -0,0 +1,75 @@
1
+ #include <iostream>
2
+ using namespace std;
3
+
4
+ class MyClass {};
5
+
6
+ ostream& operator<<(ostream& os, const MyClass &e)
7
+ {
8
+ os<<"- MyClass -";
9
+ return os;
10
+ };
11
+
12
+
13
+ ////////////////////////////////////////////////
14
+ // List
15
+ ////////////////////////////////////////////////
16
+
17
+ class List
18
+ {
19
+ private:
20
+ MyClass* head_;
21
+ List* tail_;
22
+
23
+ public:
24
+ List(MyClass&h, List *t=0):head_(0), tail_(t)
25
+
26
+ { setHead(h); }
27
+
28
+ ~List()
29
+ { delete head_; }
30
+
31
+ void setHead(MyClass& h)
32
+ {
33
+ cout << "setHead(" << h <<")" << endl;
34
+ head_ = new MyClass(h);
35
+ }
36
+
37
+ MyClass& head()
38
+ { cout << "head()" << endl;
39
+ return *head_;
40
+ }
41
+
42
+ void setTail(List *t)
43
+ {
44
+ cout << "setTail(t)" << endl;
45
+ tail_ = t;
46
+
47
+ }
48
+
49
+ List *tail() const
50
+ {
51
+ cout << "setTail(t)" << endl;
52
+ return tail_;
53
+ }
54
+
55
+
56
+
57
+
58
+ private:
59
+
60
+
61
+
62
+ };
63
+
64
+
65
+
66
+ int main()
67
+ {
68
+ MyClass e1, e2;
69
+ List l1(e1);
70
+ List l2(e2, &l1);
71
+ List l3(e1);
72
+
73
+ l3.setHead(e1);
74
+ l3.setTail(&l2);
75
+ }
@@ -0,0 +1 @@
1
+ ruby ListTransformer.rb specification1.txt
@@ -0,0 +1,5 @@
1
+ "Out File" => "outDir/List.cpp",
2
+ "Element Type" => "AnotherClass",
3
+ "Ownership" => "External reference",
4
+ "Length Counter Type" => "short",
5
+ "Tracing" => "yes"
@@ -0,0 +1,3 @@
1
+ "Out File" => "outDir/List.cpp",
2
+ "Element Type" => "MyClass",
3
+ "Ownership" => "Owned reference"
@@ -0,0 +1,5 @@
1
+ "Out File" => "outDir/List.cpp",
2
+ "Element Type" => "MyClass",
3
+ "Ownership" => "External reference",
4
+ "Length Counter Type" => "integer",
5
+ "Tracing" => "yes"
@@ -0,0 +1,75 @@
1
+ #include <iostream>
2
+ using namespace std;
3
+
4
+ class MyClass {};
5
+
6
+ ostream& operator<<(ostream& os, const MyClass &e)
7
+ {
8
+ os<<"- MyClass -";
9
+ return os;
10
+ };
11
+
12
+
13
+ ////////////////////////////////////////////////
14
+ // List
15
+ ////////////////////////////////////////////////
16
+
17
+ class List
18
+ {
19
+ private:
20
+ MyClass* head_;
21
+ List* tail_;
22
+ int length_;
23
+ public:
24
+ List(MyClass&h, List *t=0):
25
+ head_(0), tail_(t), length_(computedLength())
26
+ { setHead(h); }
27
+
28
+ ~List()
29
+ { delete head_; }
30
+
31
+ void setHead(MyClass& h)
32
+ {
33
+ cout << "setHead(" << h <<")" << endl;
34
+ head_ = new MyClass(h);
35
+ }
36
+
37
+ MyClass& head()
38
+ { cout << "head()" << endl;
39
+ return *head_;
40
+ }
41
+
42
+ void setTail(List *t)
43
+ {
44
+ cout << "setTail(t)" << endl;
45
+ tail_ = t;
46
+ length_ = computedLength();
47
+ }
48
+
49
+ List *tail() const
50
+ {
51
+ cout << "setTail(t)" << endl;
52
+ return tail_;
53
+ }
54
+
55
+ const int& length() const
56
+ { return length_; }
57
+
58
+ private:
59
+ int computedLength() const
60
+ { return tail()?tail()->length()+1:1; }
61
+
62
+ };
63
+
64
+
65
+
66
+ int main()
67
+ {
68
+ MyClass e1, e2;
69
+ List l1(e1);
70
+ List l2(e2, &l1);
71
+ List l3(e1);
72
+
73
+ l3.setHead(e1);
74
+ l3.setTail(&l2);
75
+ }