google_hash 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +21 -0
- data/Rakefile +11 -0
- data/VERSION +1 -0
- data/ext/extconf.rb +15 -0
- data/ext/go.cpp +109 -0
- data/ext/sparsehash-1.5.2/AUTHORS +2 -0
- data/ext/sparsehash-1.5.2/COPYING +28 -0
- data/ext/sparsehash-1.5.2/ChangeLog +167 -0
- data/ext/sparsehash-1.5.2/INSTALL +236 -0
- data/ext/sparsehash-1.5.2/Makefile.am +157 -0
- data/ext/sparsehash-1.5.2/Makefile.in +1019 -0
- data/ext/sparsehash-1.5.2/NEWS +0 -0
- data/ext/sparsehash-1.5.2/README +149 -0
- data/ext/sparsehash-1.5.2/README.windows +25 -0
- data/ext/sparsehash-1.5.2/TODO +28 -0
- data/ext/sparsehash-1.5.2/aclocal.m4 +868 -0
- data/ext/sparsehash-1.5.2/compile +99 -0
- data/ext/sparsehash-1.5.2/config.guess +1516 -0
- data/ext/sparsehash-1.5.2/config.sub +1626 -0
- data/ext/sparsehash-1.5.2/configure +8054 -0
- data/ext/sparsehash-1.5.2/configure.ac +74 -0
- data/ext/sparsehash-1.5.2/depcomp +530 -0
- data/ext/sparsehash-1.5.2/doc/dense_hash_map.html +1591 -0
- data/ext/sparsehash-1.5.2/doc/dense_hash_set.html +1445 -0
- data/ext/sparsehash-1.5.2/doc/designstyle.css +115 -0
- data/ext/sparsehash-1.5.2/doc/implementation.html +365 -0
- data/ext/sparsehash-1.5.2/doc/index.html +69 -0
- data/ext/sparsehash-1.5.2/doc/performance.html +96 -0
- data/ext/sparsehash-1.5.2/doc/sparse_hash_map.html +1527 -0
- data/ext/sparsehash-1.5.2/doc/sparse_hash_set.html +1376 -0
- data/ext/sparsehash-1.5.2/doc/sparsetable.html +1393 -0
- data/ext/sparsehash-1.5.2/experimental/Makefile +9 -0
- data/ext/sparsehash-1.5.2/experimental/README +14 -0
- data/ext/sparsehash-1.5.2/experimental/example.c +54 -0
- data/ext/sparsehash-1.5.2/experimental/libchash.c +1537 -0
- data/ext/sparsehash-1.5.2/experimental/libchash.h +252 -0
- data/ext/sparsehash-1.5.2/google-sparsehash.sln +47 -0
- data/ext/sparsehash-1.5.2/install-sh +323 -0
- data/ext/sparsehash-1.5.2/m4/acx_pthread.m4 +363 -0
- data/ext/sparsehash-1.5.2/m4/google_namespace.m4 +42 -0
- data/ext/sparsehash-1.5.2/m4/namespaces.m4 +15 -0
- data/ext/sparsehash-1.5.2/m4/stl_hash.m4 +70 -0
- data/ext/sparsehash-1.5.2/m4/stl_hash_fun.m4 +36 -0
- data/ext/sparsehash-1.5.2/m4/stl_namespace.m4 +25 -0
- data/ext/sparsehash-1.5.2/missing +360 -0
- data/ext/sparsehash-1.5.2/mkinstalldirs +158 -0
- data/ext/sparsehash-1.5.2/packages/deb.sh +74 -0
- data/ext/sparsehash-1.5.2/packages/deb/README +7 -0
- data/ext/sparsehash-1.5.2/packages/deb/changelog +107 -0
- data/ext/sparsehash-1.5.2/packages/deb/compat +1 -0
- data/ext/sparsehash-1.5.2/packages/deb/control +17 -0
- data/ext/sparsehash-1.5.2/packages/deb/copyright +35 -0
- data/ext/sparsehash-1.5.2/packages/deb/docs +16 -0
- data/ext/sparsehash-1.5.2/packages/deb/rules +117 -0
- data/ext/sparsehash-1.5.2/packages/deb/sparsehash.dirs +2 -0
- data/ext/sparsehash-1.5.2/packages/deb/sparsehash.install +2 -0
- data/ext/sparsehash-1.5.2/packages/rpm.sh +86 -0
- data/ext/sparsehash-1.5.2/packages/rpm/rpm.spec +61 -0
- data/ext/sparsehash-1.5.2/src/config.h.in +131 -0
- data/ext/sparsehash-1.5.2/src/config.h.include +23 -0
- data/ext/sparsehash-1.5.2/src/google/dense_hash_map +310 -0
- data/ext/sparsehash-1.5.2/src/google/dense_hash_set +287 -0
- data/ext/sparsehash-1.5.2/src/google/sparse_hash_map +294 -0
- data/ext/sparsehash-1.5.2/src/google/sparse_hash_set +275 -0
- data/ext/sparsehash-1.5.2/src/google/sparsehash/densehashtable.h +1062 -0
- data/ext/sparsehash-1.5.2/src/google/sparsehash/sparsehashtable.h +1015 -0
- data/ext/sparsehash-1.5.2/src/google/sparsetable +1468 -0
- data/ext/sparsehash-1.5.2/src/google/type_traits.h +250 -0
- data/ext/sparsehash-1.5.2/src/hashtable_unittest.cc +1375 -0
- data/ext/sparsehash-1.5.2/src/simple_test.cc +103 -0
- data/ext/sparsehash-1.5.2/src/sparsetable_unittest.cc +696 -0
- data/ext/sparsehash-1.5.2/src/time_hash_map.cc +488 -0
- data/ext/sparsehash-1.5.2/src/type_traits_unittest.cc +492 -0
- data/ext/sparsehash-1.5.2/src/windows/config.h +149 -0
- data/ext/sparsehash-1.5.2/src/windows/google/sparsehash/sparseconfig.h +32 -0
- data/ext/sparsehash-1.5.2/src/windows/port.cc +63 -0
- data/ext/sparsehash-1.5.2/src/windows/port.h +81 -0
- data/ext/sparsehash-1.5.2/src/words +8944 -0
- data/ext/sparsehash-1.5.2/vsprojects/hashtable_unittest/hashtable_unittest.vcproj +187 -0
- data/ext/sparsehash-1.5.2/vsprojects/sparsetable_unittest/sparsetable_unittest.vcproj +172 -0
- data/ext/sparsehash-1.5.2/vsprojects/time_hash_map/time_hash_map.vcproj +187 -0
- data/ext/sparsehash-1.5.2/vsprojects/type_traits_unittest/type_traits_unittest.vcproj +169 -0
- data/ext/test.rb +10 -0
- data/test/spec.go +70 -0
- metadata +147 -0
@@ -0,0 +1,252 @@
|
|
1
|
+
/* Copyright (c) 1998 - 2005, Google Inc.
|
2
|
+
* All rights reserved.
|
3
|
+
*
|
4
|
+
* Redistribution and use in source and binary forms, with or without
|
5
|
+
* modification, are permitted provided that the following conditions are
|
6
|
+
* met:
|
7
|
+
*
|
8
|
+
* * Redistributions of source code must retain the above copyright
|
9
|
+
* notice, this list of conditions and the following disclaimer.
|
10
|
+
* * Redistributions in binary form must reproduce the above
|
11
|
+
* copyright notice, this list of conditions and the following disclaimer
|
12
|
+
* in the documentation and/or other materials provided with the
|
13
|
+
* distribution.
|
14
|
+
* * Neither the name of Google Inc. nor the names of its
|
15
|
+
* contributors may be used to endorse or promote products derived from
|
16
|
+
* this software without specific prior written permission.
|
17
|
+
*
|
18
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
19
|
+
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
20
|
+
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
21
|
+
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
22
|
+
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24
|
+
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
25
|
+
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
26
|
+
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
27
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
28
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
29
|
+
*
|
30
|
+
* ---
|
31
|
+
* Author: Craig Silverstein
|
32
|
+
*
|
33
|
+
* This library is intended to be used for in-memory hash tables,
|
34
|
+
* though it provides rudimentary permanent-storage capabilities.
|
35
|
+
* It attempts to be fast, portable, and small. The best algorithm
|
36
|
+
* to fulfill these goals is an internal probing hashing algorithm,
|
37
|
+
* as in Knuth, _Art of Computer Programming_, vol III. Unlike
|
38
|
+
* chained (open) hashing, it doesn't require a pointer for every
|
39
|
+
* item, yet it is still constant time lookup in practice.
|
40
|
+
*
|
41
|
+
* Also to save space, we let the contents (both data and key) that
|
42
|
+
* you insert be a union: if the key/data is small, we store it
|
43
|
+
* directly in the hashtable, otherwise we store a pointer to it.
|
44
|
+
* To keep you from having to figure out which, use KEY_PTR and
|
45
|
+
* PTR_KEY to convert between the arguments to these functions and
|
46
|
+
* a pointer to the real data. For instance:
|
47
|
+
* char key[] = "ab", *key2;
|
48
|
+
* HTItem *bck; HashTable *ht;
|
49
|
+
* HashInsert(ht, PTR_KEY(ht, key), 0);
|
50
|
+
* bck = HashFind(ht, PTR_KEY(ht, "ab"));
|
51
|
+
* key2 = KEY_PTR(ht, bck->key);
|
52
|
+
*
|
53
|
+
* There are a rich set of operations supported:
|
54
|
+
* AllocateHashTable() -- Allocates a hashtable structure and
|
55
|
+
* returns it.
|
56
|
+
* cchKey: if it's a positive number, then each key is a
|
57
|
+
* fixed-length record of that length. If it's 0,
|
58
|
+
* the key is assumed to be a \0-terminated string.
|
59
|
+
* fSaveKey: normally, you are responsible for allocating
|
60
|
+
* space for the key. If this is 1, we make a
|
61
|
+
* copy of the key for you.
|
62
|
+
* ClearHashTable() -- Removes everything from a hashtable
|
63
|
+
* FreeHashTable() -- Frees memory used by a hashtable
|
64
|
+
*
|
65
|
+
* HashFind() -- takes a key (use PTR_KEY) and returns the
|
66
|
+
* HTItem containing that key, or NULL if the
|
67
|
+
* key is not in the hashtable.
|
68
|
+
* HashFindLast() -- returns the item found by last HashFind()
|
69
|
+
* HashFindOrInsert() -- inserts the key/data pair if the key
|
70
|
+
* is not already in the hashtable, or
|
71
|
+
* returns the appropraite HTItem if it is.
|
72
|
+
* HashFindOrInsertItem() -- takes key/data as an HTItem.
|
73
|
+
* HashInsert() -- adds a key/data pair to the hashtable. What
|
74
|
+
* it does if the key is already in the table
|
75
|
+
* depends on the value of SAMEKEY_OVERWRITE.
|
76
|
+
* HashInsertItem() -- takes key/data as an HTItem.
|
77
|
+
* HashDelete() -- removes a key/data pair from the hashtable,
|
78
|
+
* if it's there. RETURNS 1 if it was there,
|
79
|
+
* 0 else.
|
80
|
+
* If you use sparse tables and never delete, the full data
|
81
|
+
* space is available. Otherwise we steal -2 (maybe -3),
|
82
|
+
* so you can't have data fields with those values.
|
83
|
+
* HashDeleteLast() -- deletes the item returned by the last Find().
|
84
|
+
*
|
85
|
+
* HashFirstBucket() -- used to iterate over the buckets in a
|
86
|
+
* hashtable. DON'T INSERT OR DELETE WHILE
|
87
|
+
* ITERATING! You can't nest iterations.
|
88
|
+
* HashNextBucket() -- RETURNS NULL at the end of iterating.
|
89
|
+
*
|
90
|
+
* HashSetDeltaGoalSize() -- if you're going to insert 1000 items
|
91
|
+
* at once, call this fn with arg 1000.
|
92
|
+
* It grows the table more intelligently.
|
93
|
+
*
|
94
|
+
* HashSave() -- saves the hashtable to a file. It saves keys ok,
|
95
|
+
* but it doesn't know how to interpret the data field,
|
96
|
+
* so if the data field is a pointer to some complex
|
97
|
+
* structure, you must send a function that takes a
|
98
|
+
* file pointer and a pointer to the structure, and
|
99
|
+
* write whatever you want to write. It should return
|
100
|
+
* the number of bytes written. If the file is NULL,
|
101
|
+
* it should just return the number of bytes it would
|
102
|
+
* write, without writing anything.
|
103
|
+
* If your data field is just an integer, not a
|
104
|
+
* pointer, just send NULL for the function.
|
105
|
+
* HashLoad() -- loads a hashtable. It needs a function that takes
|
106
|
+
* a file and the size of the structure, and expects
|
107
|
+
* you to read in the structure and return a pointer
|
108
|
+
* to it. You must do memory allocation, etc. If
|
109
|
+
* the data is just a number, send NULL.
|
110
|
+
* HashLoadKeys() -- unlike HashLoad(), doesn't load the data off disk
|
111
|
+
* until needed. This saves memory, but if you look
|
112
|
+
* up the same key a lot, it does a disk access each
|
113
|
+
* time.
|
114
|
+
* You can't do Insert() or Delete() on hashtables that were loaded
|
115
|
+
* from disk.
|
116
|
+
*/
|
117
|
+
|
118
|
+
#include <sys/types.h> /* includes definition of "ulong", we hope */
|
119
|
+
#define ulong u_long
|
120
|
+
|
121
|
+
#define MAGIC_KEY "CHsh" /* when we save the file */
|
122
|
+
|
123
|
+
#ifndef LOG_WORD_SIZE /* 5 for 32 bit words, 6 for 64 */
|
124
|
+
#if defined (__LP64__) || defined (_LP64)
|
125
|
+
#define LOG_WORD_SIZE 6 /* log_2(sizeof(ulong)) [in bits] */
|
126
|
+
#else
|
127
|
+
#define LOG_WORD_SIZE 5 /* log_2(sizeof(ulong)) [in bits] */
|
128
|
+
#endif
|
129
|
+
#endif
|
130
|
+
|
131
|
+
/* The following gives a speed/time tradeoff: how many buckets are *
|
132
|
+
* in each bin. 0 gives 32 buckets/bin, which is a good number. */
|
133
|
+
#ifndef LOG_BM_WORDS
|
134
|
+
#define LOG_BM_WORDS 0 /* each group has 2^L_B_W * 32 buckets */
|
135
|
+
#endif
|
136
|
+
|
137
|
+
/* The following are all parameters that affect performance. */
|
138
|
+
#ifndef JUMP
|
139
|
+
#define JUMP(key, offset) ( ++(offset) ) /* ( 1 ) for linear hashing */
|
140
|
+
#endif
|
141
|
+
#ifndef Table
|
142
|
+
#define Table(x) Sparse##x /* Dense##x for dense tables */
|
143
|
+
#endif
|
144
|
+
#ifndef FAST_DELETE
|
145
|
+
#define FAST_DELETE 0 /* if it's 1, we never shrink the ht */
|
146
|
+
#endif
|
147
|
+
#ifndef SAMEKEY_OVERWRITE
|
148
|
+
#define SAMEKEY_OVERWRITE 1 /* overwrite item with our key on insert? */
|
149
|
+
#endif
|
150
|
+
#ifndef OCCUPANCY_PCT
|
151
|
+
#define OCCUPANCY_PCT 0.5 /* large PCT means smaller and slower */
|
152
|
+
#endif
|
153
|
+
#ifndef MIN_HASH_SIZE
|
154
|
+
#define MIN_HASH_SIZE 512 /* ht size when first created */
|
155
|
+
#endif
|
156
|
+
/* When deleting a bucket, we can't just empty it (future hashes *
|
157
|
+
* may fail); instead we set the data field to DELETED. Thus you *
|
158
|
+
* should set DELETED to a data value you never use. Better yet, *
|
159
|
+
* if you don't need to delete, define INSERT_ONLY. */
|
160
|
+
#ifndef INSERT_ONLY
|
161
|
+
#define DELETED -2UL
|
162
|
+
#define IS_BCK_DELETED(bck) ( (bck) && (bck)->data == DELETED )
|
163
|
+
#define SET_BCK_DELETED(ht, bck) do { (bck)->data = DELETED; \
|
164
|
+
FREE_KEY(ht, (bck)->key); } while ( 0 )
|
165
|
+
#else
|
166
|
+
#define IS_BCK_DELETED(bck) 0
|
167
|
+
#define SET_BCK_DELETED(ht, bck) \
|
168
|
+
do { fprintf(stderr, "Deletion not supported for insert-only hashtable\n");\
|
169
|
+
exit(2); } while ( 0 )
|
170
|
+
#endif
|
171
|
+
|
172
|
+
/* We need the following only for dense buckets (Dense##x above). *
|
173
|
+
* If you need to, set this to a value you'll never use for data. */
|
174
|
+
#define EMPTY -3UL /* steal more of the bck->data space */
|
175
|
+
|
176
|
+
|
177
|
+
/* This is what an item is. Either can be cast to a pointer. */
|
178
|
+
typedef struct {
|
179
|
+
ulong data; /* 4 bytes for data: either a pointer or an integer */
|
180
|
+
ulong key; /* 4 bytes for the key: either a pointer or an int */
|
181
|
+
} HTItem;
|
182
|
+
|
183
|
+
struct Table(Bin); /* defined in chash.c, I hope */
|
184
|
+
struct Table(Iterator);
|
185
|
+
typedef struct Table(Bin) Table; /* Expands to SparseBin, etc */
|
186
|
+
typedef struct Table(Iterator) TableIterator;
|
187
|
+
|
188
|
+
/* for STORES_PTR to work ok, cchKey MUST BE DEFINED 1st, cItems 2nd! */
|
189
|
+
typedef struct HashTable {
|
190
|
+
ulong cchKey; /* the length of the key, or if it's \0 terminated */
|
191
|
+
ulong cItems; /* number of items currently in the hashtable */
|
192
|
+
ulong cDeletedItems; /* # of buckets holding DELETE in the hashtable */
|
193
|
+
ulong cBuckets; /* size of the table */
|
194
|
+
Table *table; /* The actual contents of the hashtable */
|
195
|
+
int fSaveKeys; /* 1 if we copy keys locally; 2 if keys in one block */
|
196
|
+
int cDeltaGoalSize; /* # of coming inserts (or deletes, if <0) we expect */
|
197
|
+
HTItem *posLastFind; /* position of last Find() command */
|
198
|
+
TableIterator *iter; /* used in First/NextBucket */
|
199
|
+
|
200
|
+
FILE *fpData; /* if non-NULL, what item->data points into */
|
201
|
+
char * (*dataRead)(FILE *, int); /* how to load data from disk */
|
202
|
+
HTItem bckData; /* holds data after being loaded from disk */
|
203
|
+
} HashTable;
|
204
|
+
|
205
|
+
/* Small keys are stored and passed directly, but large keys are
|
206
|
+
* stored and passed as pointers. To make it easier to remember
|
207
|
+
* what to pass, we provide two functions:
|
208
|
+
* PTR_KEY: give it a pointer to your data, and it returns
|
209
|
+
* something appropriate to send to Hash() functions or
|
210
|
+
* be stored in a data field.
|
211
|
+
* KEY_PTR: give it something returned by a Hash() routine, and
|
212
|
+
* it returns a (char *) pointer to the actual data.
|
213
|
+
*/
|
214
|
+
#define HashKeySize(ht) ( ((ulong *)(ht))[0] ) /* this is how we inline */
|
215
|
+
#define HashSize(ht) ( ((ulong *)(ht))[1] ) /* ...a la C++ :-) */
|
216
|
+
|
217
|
+
#define STORES_PTR(ht) ( HashKeySize(ht) == 0 || \
|
218
|
+
HashKeySize(ht) > sizeof(ulong) )
|
219
|
+
#define KEY_PTR(ht, key) ( STORES_PTR(ht) ? (char *)(key) : (char *)&(key) )
|
220
|
+
#ifdef DONT_HAVE_TO_WORRY_ABOUT_BUS_ERRORS
|
221
|
+
#define PTR_KEY(ht, ptr) ( STORES_PTR(ht) ? (ulong)(ptr) : *(ulong *)(ptr) )
|
222
|
+
#else
|
223
|
+
#define PTR_KEY(ht, ptr) ( STORES_PTR(ht) ? (ulong)(ptr) : HTcopy((char *)ptr))
|
224
|
+
#endif
|
225
|
+
|
226
|
+
|
227
|
+
/* Function prototypes */
|
228
|
+
unsigned long HTcopy(char *pul); /* for PTR_KEY, not for users */
|
229
|
+
|
230
|
+
struct HashTable *AllocateHashTable(int cchKey, int fSaveKeys);
|
231
|
+
void ClearHashTable(struct HashTable *ht);
|
232
|
+
void FreeHashTable(struct HashTable *ht);
|
233
|
+
|
234
|
+
HTItem *HashFind(struct HashTable *ht, ulong key);
|
235
|
+
HTItem *HashFindLast(struct HashTable *ht);
|
236
|
+
HTItem *HashFindOrInsert(struct HashTable *ht, ulong key, ulong dataInsert);
|
237
|
+
HTItem *HashFindOrInsertItem(struct HashTable *ht, HTItem *pItem);
|
238
|
+
|
239
|
+
HTItem *HashInsert(struct HashTable *ht, ulong key, ulong data);
|
240
|
+
HTItem *HashInsertItem(struct HashTable *ht, HTItem *pItem);
|
241
|
+
|
242
|
+
int HashDelete(struct HashTable *ht, ulong key);
|
243
|
+
int HashDeleteLast(struct HashTable *ht);
|
244
|
+
|
245
|
+
HTItem *HashFirstBucket(struct HashTable *ht);
|
246
|
+
HTItem *HashNextBucket(struct HashTable *ht);
|
247
|
+
|
248
|
+
int HashSetDeltaGoalSize(struct HashTable *ht, int delta);
|
249
|
+
|
250
|
+
void HashSave(FILE *fp, struct HashTable *ht, int (*write)(FILE *, char *));
|
251
|
+
struct HashTable *HashLoad(FILE *fp, char * (*read)(FILE *, int));
|
252
|
+
struct HashTable *HashLoadKeys(FILE *fp, char * (*read)(FILE *, int));
|
@@ -0,0 +1,47 @@
|
|
1
|
+
Microsoft Visual Studio Solution File, Format Version 8.00
|
2
|
+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "type_traits_unittest", "vsprojects\type_traits_unittest\type_traits_unittest.vcproj", "{008CCFED-7D7B-46F8-8E13-03837A2258B3}"
|
3
|
+
ProjectSection(ProjectDependencies) = postProject
|
4
|
+
EndProjectSection
|
5
|
+
EndProject
|
6
|
+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "sparsetable_unittest", "vsprojects\sparsetable_unittest\sparsetable_unittest.vcproj", "{E420867B-8BFA-4739-99EC-E008AB762FF9}"
|
7
|
+
ProjectSection(ProjectDependencies) = postProject
|
8
|
+
EndProjectSection
|
9
|
+
EndProject
|
10
|
+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hashtable_unittest", "vsprojects\hashtable_unittest\hashtable_unittest.vcproj", "{FCDB3718-F01C-4DE4-B9F5-E10F2C5C0535}"
|
11
|
+
ProjectSection(ProjectDependencies) = postProject
|
12
|
+
EndProjectSection
|
13
|
+
EndProject
|
14
|
+
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "time_hash_map", "vsprojects\time_hash_map\time_hash_map.vcproj", "{A74E5DB8-5295-487A-AB1D-23859F536F45}"
|
15
|
+
ProjectSection(ProjectDependencies) = postProject
|
16
|
+
EndProjectSection
|
17
|
+
EndProject
|
18
|
+
Global
|
19
|
+
GlobalSection(SolutionConfiguration) = preSolution
|
20
|
+
Debug = Debug
|
21
|
+
Release = Release
|
22
|
+
EndGlobalSection
|
23
|
+
GlobalSection(ProjectDependencies) = postSolution
|
24
|
+
EndGlobalSection
|
25
|
+
GlobalSection(ProjectConfiguration) = postSolution
|
26
|
+
{008CCFED-7D7B-46F8-8E13-03837A2258B3}.Debug.ActiveCfg = Debug|Win32
|
27
|
+
{008CCFED-7D7B-46F8-8E13-03837A2258B3}.Debug.Build.0 = Debug|Win32
|
28
|
+
{008CCFED-7D7B-46F8-8E13-03837A2258B3}.Release.ActiveCfg = Release|Win32
|
29
|
+
{008CCFED-7D7B-46F8-8E13-03837A2258B3}.Release.Build.0 = Release|Win32
|
30
|
+
{E420867B-8BFA-4739-99EC-E008AB762FF9}.Debug.ActiveCfg = Debug|Win32
|
31
|
+
{E420867B-8BFA-4739-99EC-E008AB762FF9}.Debug.Build.0 = Debug|Win32
|
32
|
+
{E420867B-8BFA-4739-99EC-E008AB762FF9}.Release.ActiveCfg = Release|Win32
|
33
|
+
{E420867B-8BFA-4739-99EC-E008AB762FF9}.Release.Build.0 = Release|Win32
|
34
|
+
{FCDB3718-F01C-4DE4-B9F5-E10F2C5C0535}.Debug.ActiveCfg = Debug|Win32
|
35
|
+
{FCDB3718-F01C-4DE4-B9F5-E10F2C5C0535}.Debug.Build.0 = Debug|Win32
|
36
|
+
{FCDB3718-F01C-4DE4-B9F5-E10F2C5C0535}.Release.ActiveCfg = Release|Win32
|
37
|
+
{FCDB3718-F01C-4DE4-B9F5-E10F2C5C0535}.Release.Build.0 = Release|Win32
|
38
|
+
{A74E5DB8-5295-487A-AB1D-23859F536F45}.Debug.ActiveCfg = Debug|Win32
|
39
|
+
{A74E5DB8-5295-487A-AB1D-23859F536F45}.Debug.Build.0 = Debug|Win32
|
40
|
+
{A74E5DB8-5295-487A-AB1D-23859F536F45}.Release.ActiveCfg = Release|Win32
|
41
|
+
{A74E5DB8-5295-487A-AB1D-23859F536F45}.Release.Build.0 = Release|Win32
|
42
|
+
EndGlobalSection
|
43
|
+
GlobalSection(ExtensibilityGlobals) = postSolution
|
44
|
+
EndGlobalSection
|
45
|
+
GlobalSection(ExtensibilityAddIns) = postSolution
|
46
|
+
EndGlobalSection
|
47
|
+
EndGlobal
|
@@ -0,0 +1,323 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
# install - install a program, script, or datafile
|
3
|
+
|
4
|
+
scriptversion=2005-05-14.22
|
5
|
+
|
6
|
+
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
7
|
+
# later released in X11R6 (xc/config/util/install.sh) with the
|
8
|
+
# following copyright and license.
|
9
|
+
#
|
10
|
+
# Copyright (C) 1994 X Consortium
|
11
|
+
#
|
12
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
13
|
+
# of this software and associated documentation files (the "Software"), to
|
14
|
+
# deal in the Software without restriction, including without limitation the
|
15
|
+
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
16
|
+
# sell copies of the Software, and to permit persons to whom the Software is
|
17
|
+
# furnished to do so, subject to the following conditions:
|
18
|
+
#
|
19
|
+
# The above copyright notice and this permission notice shall be included in
|
20
|
+
# all copies or substantial portions of the Software.
|
21
|
+
#
|
22
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
23
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
24
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
25
|
+
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
26
|
+
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
27
|
+
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
28
|
+
#
|
29
|
+
# Except as contained in this notice, the name of the X Consortium shall not
|
30
|
+
# be used in advertising or otherwise to promote the sale, use or other deal-
|
31
|
+
# ings in this Software without prior written authorization from the X Consor-
|
32
|
+
# tium.
|
33
|
+
#
|
34
|
+
#
|
35
|
+
# FSF changes to this file are in the public domain.
|
36
|
+
#
|
37
|
+
# Calling this script install-sh is preferred over install.sh, to prevent
|
38
|
+
# `make' implicit rules from creating a file called install from it
|
39
|
+
# when there is no Makefile.
|
40
|
+
#
|
41
|
+
# This script is compatible with the BSD install script, but was written
|
42
|
+
# from scratch. It can only install one file at a time, a restriction
|
43
|
+
# shared with many OS's install programs.
|
44
|
+
|
45
|
+
# set DOITPROG to echo to test this script
|
46
|
+
|
47
|
+
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
48
|
+
doit="${DOITPROG-}"
|
49
|
+
|
50
|
+
# put in absolute paths if you don't have them in your path; or use env. vars.
|
51
|
+
|
52
|
+
mvprog="${MVPROG-mv}"
|
53
|
+
cpprog="${CPPROG-cp}"
|
54
|
+
chmodprog="${CHMODPROG-chmod}"
|
55
|
+
chownprog="${CHOWNPROG-chown}"
|
56
|
+
chgrpprog="${CHGRPPROG-chgrp}"
|
57
|
+
stripprog="${STRIPPROG-strip}"
|
58
|
+
rmprog="${RMPROG-rm}"
|
59
|
+
mkdirprog="${MKDIRPROG-mkdir}"
|
60
|
+
|
61
|
+
chmodcmd="$chmodprog 0755"
|
62
|
+
chowncmd=
|
63
|
+
chgrpcmd=
|
64
|
+
stripcmd=
|
65
|
+
rmcmd="$rmprog -f"
|
66
|
+
mvcmd="$mvprog"
|
67
|
+
src=
|
68
|
+
dst=
|
69
|
+
dir_arg=
|
70
|
+
dstarg=
|
71
|
+
no_target_directory=
|
72
|
+
|
73
|
+
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
74
|
+
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
75
|
+
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
76
|
+
or: $0 [OPTION]... -d DIRECTORIES...
|
77
|
+
|
78
|
+
In the 1st form, copy SRCFILE to DSTFILE.
|
79
|
+
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
80
|
+
In the 4th, create DIRECTORIES.
|
81
|
+
|
82
|
+
Options:
|
83
|
+
-c (ignored)
|
84
|
+
-d create directories instead of installing files.
|
85
|
+
-g GROUP $chgrpprog installed files to GROUP.
|
86
|
+
-m MODE $chmodprog installed files to MODE.
|
87
|
+
-o USER $chownprog installed files to USER.
|
88
|
+
-s $stripprog installed files.
|
89
|
+
-t DIRECTORY install into DIRECTORY.
|
90
|
+
-T report an error if DSTFILE is a directory.
|
91
|
+
--help display this help and exit.
|
92
|
+
--version display version info and exit.
|
93
|
+
|
94
|
+
Environment variables override the default commands:
|
95
|
+
CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
|
96
|
+
"
|
97
|
+
|
98
|
+
while test -n "$1"; do
|
99
|
+
case $1 in
|
100
|
+
-c) shift
|
101
|
+
continue;;
|
102
|
+
|
103
|
+
-d) dir_arg=true
|
104
|
+
shift
|
105
|
+
continue;;
|
106
|
+
|
107
|
+
-g) chgrpcmd="$chgrpprog $2"
|
108
|
+
shift
|
109
|
+
shift
|
110
|
+
continue;;
|
111
|
+
|
112
|
+
--help) echo "$usage"; exit $?;;
|
113
|
+
|
114
|
+
-m) chmodcmd="$chmodprog $2"
|
115
|
+
shift
|
116
|
+
shift
|
117
|
+
continue;;
|
118
|
+
|
119
|
+
-o) chowncmd="$chownprog $2"
|
120
|
+
shift
|
121
|
+
shift
|
122
|
+
continue;;
|
123
|
+
|
124
|
+
-s) stripcmd=$stripprog
|
125
|
+
shift
|
126
|
+
continue;;
|
127
|
+
|
128
|
+
-t) dstarg=$2
|
129
|
+
shift
|
130
|
+
shift
|
131
|
+
continue;;
|
132
|
+
|
133
|
+
-T) no_target_directory=true
|
134
|
+
shift
|
135
|
+
continue;;
|
136
|
+
|
137
|
+
--version) echo "$0 $scriptversion"; exit $?;;
|
138
|
+
|
139
|
+
*) # When -d is used, all remaining arguments are directories to create.
|
140
|
+
# When -t is used, the destination is already specified.
|
141
|
+
test -n "$dir_arg$dstarg" && break
|
142
|
+
# Otherwise, the last argument is the destination. Remove it from $@.
|
143
|
+
for arg
|
144
|
+
do
|
145
|
+
if test -n "$dstarg"; then
|
146
|
+
# $@ is not empty: it contains at least $arg.
|
147
|
+
set fnord "$@" "$dstarg"
|
148
|
+
shift # fnord
|
149
|
+
fi
|
150
|
+
shift # arg
|
151
|
+
dstarg=$arg
|
152
|
+
done
|
153
|
+
break;;
|
154
|
+
esac
|
155
|
+
done
|
156
|
+
|
157
|
+
if test -z "$1"; then
|
158
|
+
if test -z "$dir_arg"; then
|
159
|
+
echo "$0: no input file specified." >&2
|
160
|
+
exit 1
|
161
|
+
fi
|
162
|
+
# It's OK to call `install-sh -d' without argument.
|
163
|
+
# This can happen when creating conditional directories.
|
164
|
+
exit 0
|
165
|
+
fi
|
166
|
+
|
167
|
+
for src
|
168
|
+
do
|
169
|
+
# Protect names starting with `-'.
|
170
|
+
case $src in
|
171
|
+
-*) src=./$src ;;
|
172
|
+
esac
|
173
|
+
|
174
|
+
if test -n "$dir_arg"; then
|
175
|
+
dst=$src
|
176
|
+
src=
|
177
|
+
|
178
|
+
if test -d "$dst"; then
|
179
|
+
mkdircmd=:
|
180
|
+
chmodcmd=
|
181
|
+
else
|
182
|
+
mkdircmd=$mkdirprog
|
183
|
+
fi
|
184
|
+
else
|
185
|
+
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
186
|
+
# might cause directories to be created, which would be especially bad
|
187
|
+
# if $src (and thus $dsttmp) contains '*'.
|
188
|
+
if test ! -f "$src" && test ! -d "$src"; then
|
189
|
+
echo "$0: $src does not exist." >&2
|
190
|
+
exit 1
|
191
|
+
fi
|
192
|
+
|
193
|
+
if test -z "$dstarg"; then
|
194
|
+
echo "$0: no destination specified." >&2
|
195
|
+
exit 1
|
196
|
+
fi
|
197
|
+
|
198
|
+
dst=$dstarg
|
199
|
+
# Protect names starting with `-'.
|
200
|
+
case $dst in
|
201
|
+
-*) dst=./$dst ;;
|
202
|
+
esac
|
203
|
+
|
204
|
+
# If destination is a directory, append the input filename; won't work
|
205
|
+
# if double slashes aren't ignored.
|
206
|
+
if test -d "$dst"; then
|
207
|
+
if test -n "$no_target_directory"; then
|
208
|
+
echo "$0: $dstarg: Is a directory" >&2
|
209
|
+
exit 1
|
210
|
+
fi
|
211
|
+
dst=$dst/`basename "$src"`
|
212
|
+
fi
|
213
|
+
fi
|
214
|
+
|
215
|
+
# This sed command emulates the dirname command.
|
216
|
+
dstdir=`echo "$dst" | sed -e 's,/*$,,;s,[^/]*$,,;s,/*$,,;s,^$,.,'`
|
217
|
+
|
218
|
+
# Make sure that the destination directory exists.
|
219
|
+
|
220
|
+
# Skip lots of stat calls in the usual case.
|
221
|
+
if test ! -d "$dstdir"; then
|
222
|
+
defaultIFS='
|
223
|
+
'
|
224
|
+
IFS="${IFS-$defaultIFS}"
|
225
|
+
|
226
|
+
oIFS=$IFS
|
227
|
+
# Some sh's can't handle IFS=/ for some reason.
|
228
|
+
IFS='%'
|
229
|
+
set x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
|
230
|
+
shift
|
231
|
+
IFS=$oIFS
|
232
|
+
|
233
|
+
pathcomp=
|
234
|
+
|
235
|
+
while test $# -ne 0 ; do
|
236
|
+
pathcomp=$pathcomp$1
|
237
|
+
shift
|
238
|
+
if test ! -d "$pathcomp"; then
|
239
|
+
$mkdirprog "$pathcomp"
|
240
|
+
# mkdir can fail with a `File exist' error in case several
|
241
|
+
# install-sh are creating the directory concurrently. This
|
242
|
+
# is OK.
|
243
|
+
test -d "$pathcomp" || exit
|
244
|
+
fi
|
245
|
+
pathcomp=$pathcomp/
|
246
|
+
done
|
247
|
+
fi
|
248
|
+
|
249
|
+
if test -n "$dir_arg"; then
|
250
|
+
$doit $mkdircmd "$dst" \
|
251
|
+
&& { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
|
252
|
+
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
|
253
|
+
&& { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
|
254
|
+
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
|
255
|
+
|
256
|
+
else
|
257
|
+
dstfile=`basename "$dst"`
|
258
|
+
|
259
|
+
# Make a couple of temp file names in the proper directory.
|
260
|
+
dsttmp=$dstdir/_inst.$$_
|
261
|
+
rmtmp=$dstdir/_rm.$$_
|
262
|
+
|
263
|
+
# Trap to clean up those temp files at exit.
|
264
|
+
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
265
|
+
trap '(exit $?); exit' 1 2 13 15
|
266
|
+
|
267
|
+
# Copy the file name to the temp name.
|
268
|
+
$doit $cpprog "$src" "$dsttmp" &&
|
269
|
+
|
270
|
+
# and set any options; do chmod last to preserve setuid bits.
|
271
|
+
#
|
272
|
+
# If any of these fail, we abort the whole thing. If we want to
|
273
|
+
# ignore errors from any of these, just make sure not to ignore
|
274
|
+
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
275
|
+
#
|
276
|
+
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
|
277
|
+
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
|
278
|
+
&& { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
|
279
|
+
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
|
280
|
+
|
281
|
+
# Now rename the file to the real destination.
|
282
|
+
{ $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
|
283
|
+
|| {
|
284
|
+
# The rename failed, perhaps because mv can't rename something else
|
285
|
+
# to itself, or perhaps because mv is so ancient that it does not
|
286
|
+
# support -f.
|
287
|
+
|
288
|
+
# Now remove or move aside any old file at destination location.
|
289
|
+
# We try this two ways since rm can't unlink itself on some
|
290
|
+
# systems and the destination file might be busy for other
|
291
|
+
# reasons. In this case, the final cleanup might fail but the new
|
292
|
+
# file should still install successfully.
|
293
|
+
{
|
294
|
+
if test -f "$dstdir/$dstfile"; then
|
295
|
+
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
|
296
|
+
|| $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
|
297
|
+
|| {
|
298
|
+
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
|
299
|
+
(exit 1); exit 1
|
300
|
+
}
|
301
|
+
else
|
302
|
+
:
|
303
|
+
fi
|
304
|
+
} &&
|
305
|
+
|
306
|
+
# Now rename the file to the real destination.
|
307
|
+
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
|
308
|
+
}
|
309
|
+
}
|
310
|
+
fi || { (exit 1); exit 1; }
|
311
|
+
done
|
312
|
+
|
313
|
+
# The final little trick to "correctly" pass the exit status to the exit trap.
|
314
|
+
{
|
315
|
+
(exit 0); exit 0
|
316
|
+
}
|
317
|
+
|
318
|
+
# Local variables:
|
319
|
+
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
320
|
+
# time-stamp-start: "scriptversion="
|
321
|
+
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
322
|
+
# time-stamp-end: "$"
|
323
|
+
# End:
|