-
Notifications
You must be signed in to change notification settings - Fork 31
Expand file tree
/
Copy pathaarray.ch
More file actions
executable file
·114 lines (109 loc) · 3.6 KB
/
aarray.ch
File metadata and controls
executable file
·114 lines (109 loc) · 3.6 KB
1
2
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/*----------------------------------------------------------------------*\
* Associative Arrays for AdvPL
* Copyright (C) 2013 Arthur Helfstein Fragoso
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* The SHASH class is an adapted version of Marinaldo de Jesus' THASH Class.
*
*----------------------------------------------------------------------*
*
* -- How to install this program:
*
* 1 - Add the file SHash.prg to your project.
*
* 2 - Compile SHash.prg.
*
* 3 - Include the header file to any project you want to use it:
*
* #Include "aarray.ch"
*
* 4 - Use it. ;)
*
*
* -- How to use Associative Arrays:
*
* It's easier to learn from examples, isn't it?
*
* Example:
*
* // Start an Associative Array
* aaFriends := Array(#)
*
* // Start another another Associative Array on top of the other
* aaFriends[#"Arthur"] := Array(#)
*
* // Set values:
* aaFriends[#"Arthur"][#"Name"] := "Arthur"
* aaFriends[#"Arthur"][#"Account"] := 230251
* aaFriends[#"Arthur"][#"Work"] := "Software Developer"
*
* // Start a new Associative Array and set values
* aaFriends[#"David"] := Array(#)
* aaFriends[#"David"][#"Name"] := "David"
* aaFriends[#"David"][#"Account"] := 187204
* aaFriends[#"David"][#"Work"] := "Web Designer"
*
* // Let's do something interesting:
*
* aaFriends[#"David"][#"Best Friend"] := aaFriends[#"Arthur"]
*
* // And test it:
*
* Alert (aaFriends[#"David"][#"Best Friend"][#"Name"])
* Alert (aaFriends[#"David"][#"Best Friend"][#"Work"])
*
* // We can also mix it with the regular Array:
* aaFriends[#"Arthur"][#"Friends"] := Array(1)
* aaFriends[#"Arthur"][#"Friends"][1] := aaFriends[#"David"]
*
* Alert (aaFriends[#"Arthur"][#"Friends"][1][#"Name"])
*
*
* -- How does it work on the background?
*
* When we create an Associative Array, we are in reality instantiating
* a Class and creating an Object.
*
* Take a look at it working, this:
* aaFriends := Array(#)
* aaFriends[#"David"] := Array(#)
* aaFriends[#"David"][#"Account"] := 187204
*
* is translated to this by the precompiler:
* aaFriends := SHash():New()
* aaFriends:Set("David", SHash():New())
* aaFriends:Get("David"):Set("Account", 187204)
*
* The SHash object has the aData array that stores all the data, so you
* can easily access all the data thought a loop:
*
* For i := 1 to len(aaFriends:aData)
* QOut( aaFriends:aData[i][1] +': '+ aaFriends:aData[i][2] )
* Next
*
\*----------------------------------------------------------------------*/
#IFNDEF _AARRAY_CH
#DEFINE _AARRAY_CH
#IFNDEF __HARBOUR__
#include "shash.ch"
#xtranslate \[\#<k>\] := <v> => :Set(<k>,<v>)
#xtranslate \[\#<k>\] => :Get(<k>)
#xtranslate Array(\#) => SHash():New()
#ELSE
#xtranslate \[\#<k>\] := <v> => \[<k>\] := <v>
#xtranslate \[\#<k>\] => \[<k>\]
#xtranslate Array(\#) => \{\=\>\}
#ENDIF
#ENDIF