Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
ccan
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
mirror
ccan
Commits
09bb99b9
Commit
09bb99b9
authored
Feb 26, 2018
by
Rusty Russell
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
intmap: implement uintmap_last/sintmap_last.
Signed-off-by:
Rusty Russell
<
rusty@rustcorp.com.au
>
parent
8502a66a
Changes
6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
88 additions
and
10 deletions
+88
-10
ccan/intmap/intmap.c
ccan/intmap/intmap.c
+18
-0
ccan/intmap/intmap.h
ccan/intmap/intmap.h
+36
-0
ccan/intmap/test/run-order-smallsize.c
ccan/intmap/test/run-order-smallsize.c
+8
-4
ccan/intmap/test/run-order.c
ccan/intmap/test/run-order.c
+8
-4
ccan/intmap/test/run-signed-int.c
ccan/intmap/test/run-signed-int.c
+4
-1
ccan/intmap/test/run.c
ccan/intmap/test/run.c
+14
-1
No files found.
ccan/intmap/intmap.c
View file @
09bb99b9
...
@@ -197,6 +197,24 @@ void *intmap_after_(const struct intmap *map, intmap_index_t *indexp)
...
@@ -197,6 +197,24 @@ void *intmap_after_(const struct intmap *map, intmap_index_t *indexp)
return
intmap_first_
(
&
prev
->
u
.
n
->
child
[
1
],
indexp
);
return
intmap_first_
(
&
prev
->
u
.
n
->
child
[
1
],
indexp
);
}
}
void
*
intmap_last_
(
const
struct
intmap
*
map
,
intmap_index_t
*
indexp
)
{
const
struct
intmap
*
n
;
if
(
intmap_empty_
(
map
))
{
errno
=
ENOENT
;
return
NULL
;
}
n
=
map
;
/* Anything with NULL value is a node. */
while
(
!
n
->
v
)
n
=
&
n
->
u
.
n
->
child
[
1
];
errno
=
0
;
*
indexp
=
n
->
u
.
i
;
return
n
->
v
;
}
static
void
clear
(
struct
intmap
n
)
static
void
clear
(
struct
intmap
n
)
{
{
if
(
!
n
.
v
)
{
if
(
!
n
.
v
)
{
...
...
ccan/intmap/intmap.h
View file @
09bb99b9
...
@@ -309,6 +309,32 @@ void *intmap_after_(const struct intmap *map, intmap_index_t *indexp);
...
@@ -309,6 +309,32 @@ void *intmap_after_(const struct intmap *map, intmap_index_t *indexp);
tcon_cast((smap), sintmap_canary, \
tcon_cast((smap), sintmap_canary, \
sintmap_after_(sintmap_unwrap_(smap), (indexp)))
sintmap_after_(sintmap_unwrap_(smap), (indexp)))
/**
* uintmap_last - get last value in an unsigned intmap
* @umap: the typed intmap to iterate through.
* @indexp: a pointer to store the index.
*
* Returns NULL if the map is empty, otherwise populates *@indexp and
* returns the highest entry.
*/
#define uintmap_last(umap, indexp) \
tcon_cast((umap), uintmap_canary, \
intmap_last_(uintmap_unwrap_(umap), (indexp)))
void
*
intmap_last_
(
const
struct
intmap
*
map
,
intmap_index_t
*
indexp
);
/**
* sintmap_last - get last value in a signed intmap
* @smap: the typed intmap to iterate through.
* @indexp: a pointer to store the index.
*
* Returns NULL if the map is empty, otherwise populates *@indexp and
* returns the highest entry.
*/
#define sintmap_last(smap, indexp) \
tcon_cast((smap), sintmap_canary, \
sintmap_last_(sintmap_unwrap_(smap), (indexp)))
/* TODO: We could implement intmap_prefix. */
/* TODO: We could implement intmap_prefix. */
/* These make sure it really is a uintmap/sintmap */
/* These make sure it really is a uintmap/sintmap */
...
@@ -339,4 +365,14 @@ static inline void *sintmap_after_(const struct intmap *map,
...
@@ -339,4 +365,14 @@ static inline void *sintmap_after_(const struct intmap *map,
*
indexp
=
SINTMAP_UNOFF
(
i
);
*
indexp
=
SINTMAP_UNOFF
(
i
);
return
ret
;
return
ret
;
}
}
static
inline
void
*
sintmap_last_
(
const
struct
intmap
*
map
,
sintmap_index_t
*
indexp
)
{
intmap_index_t
i
;
void
*
ret
=
intmap_last_
(
map
,
&
i
);
*
indexp
=
SINTMAP_UNOFF
(
i
);
return
ret
;
}
#endif
/* CCAN_INTMAP_H */
#endif
/* CCAN_INTMAP_H */
ccan/intmap/test/run-order-smallsize.c
View file @
09bb99b9
...
@@ -14,8 +14,9 @@ static bool check_umap(const umap *map)
...
@@ -14,8 +14,9 @@ static bool check_umap(const umap *map)
{
{
/* This is a larger type than unsigned, and allows negative */
/* This is a larger type than unsigned, and allows negative */
int64_t
prev
;
int64_t
prev
;
intmap_index_t
i
;
intmap_index_t
i
,
last_idx
;
uint8_t
*
v
;
uint8_t
*
v
;
bool
last
=
true
;
/* Must be in order, must contain value. */
/* Must be in order, must contain value. */
prev
=
-
1
;
prev
=
-
1
;
...
@@ -25,16 +26,18 @@ static bool check_umap(const umap *map)
...
@@ -25,16 +26,18 @@ static bool check_umap(const umap *map)
if
(
*
v
!=
i
)
if
(
*
v
!=
i
)
return
false
;
return
false
;
prev
=
i
;
prev
=
i
;
last
=
(
uintmap_last
(
map
,
&
last_idx
)
==
v
);
}
}
return
true
;
return
last
;
}
}
static
bool
check_smap
(
const
smap
*
map
)
static
bool
check_smap
(
const
smap
*
map
)
{
{
/* This is a larger type than int, and allows negative */
/* This is a larger type than int, and allows negative */
int64_t
prev
;
int64_t
prev
;
sintmap_index_t
i
;
sintmap_index_t
i
,
last_idx
;
int8_t
*
v
;
int8_t
*
v
;
bool
last
=
true
;
/* Must be in order, must contain value. */
/* Must be in order, must contain value. */
prev
=
-
0x80000001ULL
;
prev
=
-
0x80000001ULL
;
...
@@ -44,8 +47,9 @@ static bool check_smap(const smap *map)
...
@@ -44,8 +47,9 @@ static bool check_smap(const smap *map)
if
(
*
v
!=
i
)
if
(
*
v
!=
i
)
return
false
;
return
false
;
prev
=
i
;
prev
=
i
;
last
=
(
sintmap_last
(
map
,
&
last_idx
)
==
v
);
}
}
return
true
;
return
last
;
}
}
int
main
(
void
)
int
main
(
void
)
...
...
ccan/intmap/test/run-order.c
View file @
09bb99b9
...
@@ -11,8 +11,9 @@ static bool check_umap(const umap *map)
...
@@ -11,8 +11,9 @@ static bool check_umap(const umap *map)
{
{
/* This is a larger type than unsigned, and allows negative */
/* This is a larger type than unsigned, and allows negative */
int64_t
prev
;
int64_t
prev
;
uint64_t
i
;
uint64_t
i
,
last_idx
;
unsigned
int
*
v
;
unsigned
int
*
v
;
bool
last
=
true
;
/* Must be in order, must contain value. */
/* Must be in order, must contain value. */
prev
=
-
1
;
prev
=
-
1
;
...
@@ -22,15 +23,17 @@ static bool check_umap(const umap *map)
...
@@ -22,15 +23,17 @@ static bool check_umap(const umap *map)
if
(
*
v
!=
i
)
if
(
*
v
!=
i
)
return
false
;
return
false
;
prev
=
i
;
prev
=
i
;
last
=
(
uintmap_last
(
map
,
&
last_idx
)
==
v
);
}
}
return
true
;
return
last
;
}
}
static
bool
check_smap
(
const
smap
*
map
)
static
bool
check_smap
(
const
smap
*
map
)
{
{
/* This is a larger type than int, and allows negative */
/* This is a larger type than int, and allows negative */
int64_t
prev
,
i
;
int64_t
prev
,
i
,
last_idx
;
int
*
v
;
int
*
v
;
bool
last
=
true
;
/* Must be in order, must contain value. */
/* Must be in order, must contain value. */
prev
=
-
0x80000001ULL
;
prev
=
-
0x80000001ULL
;
...
@@ -39,9 +42,10 @@ static bool check_smap(const smap *map)
...
@@ -39,9 +42,10 @@ static bool check_smap(const smap *map)
return
false
;
return
false
;
if
(
*
v
!=
i
)
if
(
*
v
!=
i
)
return
false
;
return
false
;
last
=
(
sintmap_last
(
map
,
&
last_idx
)
==
v
);
prev
=
i
;
prev
=
i
;
}
}
return
true
;
return
last
;
}
}
int
main
(
void
)
int
main
(
void
)
...
...
ccan/intmap/test/run-signed-int.c
View file @
09bb99b9
...
@@ -9,13 +9,14 @@ int main(void)
...
@@ -9,13 +9,14 @@ int main(void)
int64_t
s
;
int64_t
s
;
/* This is how many tests you plan to run */
/* This is how many tests you plan to run */
plan_tests
(
3
5
);
plan_tests
(
3
8
);
sintmap_init
(
&
map
);
sintmap_init
(
&
map
);
/* Test boundaries. */
/* Test boundaries. */
ok1
(
!
sintmap_get
(
&
map
,
0x7FFFFFFFFFFFFFFFLL
));
ok1
(
!
sintmap_get
(
&
map
,
0x7FFFFFFFFFFFFFFFLL
));
ok1
(
!
sintmap_get
(
&
map
,
-
0x8000000000000000LL
));
ok1
(
!
sintmap_get
(
&
map
,
-
0x8000000000000000LL
));
ok1
(
sintmap_first
(
&
map
,
&
s
)
==
NULL
);
ok1
(
sintmap_first
(
&
map
,
&
s
)
==
NULL
);
ok1
(
sintmap_last
(
&
map
,
&
s
)
==
NULL
);
ok1
(
errno
==
ENOENT
);
ok1
(
errno
==
ENOENT
);
s
=
0x7FFFFFFFFFFFFFFFLL
;
s
=
0x7FFFFFFFFFFFFFFFLL
;
ok1
(
sintmap_after
(
&
map
,
&
s
)
==
NULL
);
ok1
(
sintmap_after
(
&
map
,
&
s
)
==
NULL
);
...
@@ -29,12 +30,14 @@ int main(void)
...
@@ -29,12 +30,14 @@ int main(void)
ok1
(
sintmap_add
(
&
map
,
0x7FFFFFFFFFFFFFFFLL
,
first
));
ok1
(
sintmap_add
(
&
map
,
0x7FFFFFFFFFFFFFFFLL
,
first
));
ok1
(
sintmap_get
(
&
map
,
0x7FFFFFFFFFFFFFFFLL
)
==
first
);
ok1
(
sintmap_get
(
&
map
,
0x7FFFFFFFFFFFFFFFLL
)
==
first
);
ok1
(
sintmap_first
(
&
map
,
&
s
)
==
first
&&
s
==
0x7FFFFFFFFFFFFFFFLL
);
ok1
(
sintmap_first
(
&
map
,
&
s
)
==
first
&&
s
==
0x7FFFFFFFFFFFFFFFLL
);
ok1
(
sintmap_last
(
&
map
,
&
s
)
==
first
&&
s
==
0x7FFFFFFFFFFFFFFFLL
);
ok1
(
errno
==
0
);
ok1
(
errno
==
0
);
ok1
(
sintmap_add
(
&
map
,
-
0x8000000000000000LL
,
second
));
ok1
(
sintmap_add
(
&
map
,
-
0x8000000000000000LL
,
second
));
ok1
(
sintmap_get
(
&
map
,
0x7FFFFFFFFFFFFFFFLL
)
==
first
);
ok1
(
sintmap_get
(
&
map
,
0x7FFFFFFFFFFFFFFFLL
)
==
first
);
ok1
(
sintmap_get
(
&
map
,
-
0x8000000000000000LL
)
==
second
);
ok1
(
sintmap_get
(
&
map
,
-
0x8000000000000000LL
)
==
second
);
ok1
(
sintmap_first
(
&
map
,
&
s
)
==
second
&&
s
==
-
0x8000000000000000LL
);
ok1
(
sintmap_first
(
&
map
,
&
s
)
==
second
&&
s
==
-
0x8000000000000000LL
);
ok1
(
sintmap_after
(
&
map
,
&
s
)
==
first
&&
s
==
0x7FFFFFFFFFFFFFFFLL
);
ok1
(
sintmap_after
(
&
map
,
&
s
)
==
first
&&
s
==
0x7FFFFFFFFFFFFFFFLL
);
ok1
(
sintmap_last
(
&
map
,
&
s
)
==
first
&&
s
==
0x7FFFFFFFFFFFFFFFLL
);
ok1
(
errno
==
0
);
ok1
(
errno
==
0
);
s
=
0x7FFFFFFFFFFFFFFELL
;
s
=
0x7FFFFFFFFFFFFFFELL
;
ok1
(
sintmap_after
(
&
map
,
&
s
)
==
first
&&
s
==
0x7FFFFFFFFFFFFFFFLL
);
ok1
(
sintmap_after
(
&
map
,
&
s
)
==
first
&&
s
==
0x7FFFFFFFFFFFFFFFLL
);
...
...
ccan/intmap/test/run.c
View file @
09bb99b9
...
@@ -7,9 +7,10 @@ int main(void)
...
@@ -7,9 +7,10 @@ int main(void)
UINTMAP
(
char
*
)
map
;
UINTMAP
(
char
*
)
map
;
const
char
val
[]
=
"there"
;
const
char
val
[]
=
"there"
;
const
char
none
[]
=
""
;
const
char
none
[]
=
""
;
uint64_t
idx
;
/* This is how many tests you plan to run */
/* This is how many tests you plan to run */
plan_tests
(
28
);
plan_tests
(
40
);
uintmap_init
(
&
map
);
uintmap_init
(
&
map
);
...
@@ -21,11 +22,19 @@ int main(void)
...
@@ -21,11 +22,19 @@ int main(void)
ok1
(
errno
==
ENOENT
);
ok1
(
errno
==
ENOENT
);
ok1
(
!
uintmap_del
(
&
map
,
0
));
ok1
(
!
uintmap_del
(
&
map
,
0
));
ok1
(
errno
==
ENOENT
);
ok1
(
errno
==
ENOENT
);
ok1
(
!
uintmap_first
(
&
map
,
&
idx
));
ok1
(
errno
==
ENOENT
);
ok1
(
!
uintmap_last
(
&
map
,
&
idx
));
ok1
(
errno
==
ENOENT
);
ok1
(
uintmap_add
(
&
map
,
1
,
val
));
ok1
(
uintmap_add
(
&
map
,
1
,
val
));
ok1
(
uintmap_get
(
&
map
,
1
)
==
val
);
ok1
(
uintmap_get
(
&
map
,
1
)
==
val
);
ok1
(
!
uintmap_get
(
&
map
,
0
));
ok1
(
!
uintmap_get
(
&
map
,
0
));
ok1
(
errno
==
ENOENT
);
ok1
(
errno
==
ENOENT
);
ok1
(
uintmap_first
(
&
map
,
&
idx
)
==
val
);
ok1
(
idx
==
1
);
ok1
(
uintmap_last
(
&
map
,
&
idx
)
==
val
);
ok1
(
idx
==
1
);
/* Add a duplicate should fail. */
/* Add a duplicate should fail. */
ok1
(
!
uintmap_add
(
&
map
,
1
,
val
));
ok1
(
!
uintmap_add
(
&
map
,
1
,
val
));
...
@@ -43,6 +52,10 @@ int main(void)
...
@@ -43,6 +52,10 @@ int main(void)
ok1
(
uintmap_add
(
&
map
,
1
,
val
));
ok1
(
uintmap_add
(
&
map
,
1
,
val
));
ok1
(
uintmap_get
(
&
map
,
1
)
==
val
);
ok1
(
uintmap_get
(
&
map
,
1
)
==
val
);
ok1
(
uintmap_get
(
&
map
,
0
)
==
none
);
ok1
(
uintmap_get
(
&
map
,
0
)
==
none
);
ok1
(
uintmap_first
(
&
map
,
&
idx
)
==
none
);
ok1
(
idx
==
0
);
ok1
(
uintmap_last
(
&
map
,
&
idx
)
==
val
);
ok1
(
idx
==
1
);
ok1
(
!
uintmap_del
(
&
map
,
2
));
ok1
(
!
uintmap_del
(
&
map
,
2
));
ok1
(
uintmap_del
(
&
map
,
0
)
==
none
);
ok1
(
uintmap_del
(
&
map
,
0
)
==
none
);
ok1
(
uintmap_get
(
&
map
,
1
)
==
val
);
ok1
(
uintmap_get
(
&
map
,
1
)
==
val
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment