Skip to content

Commit bc5b19e

Browse files
authored
Merge pull request libgit2#4561 from pks-t/pks/downcasting
[RFC] util: introduce GIT_DOWNCAST macro
2 parents af95615 + 431601f commit bc5b19e

File tree

7 files changed

+79
-64
lines changed

7 files changed

+79
-64
lines changed

src/config_file.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,9 +227,9 @@ static void backend_free(git_config_backend *_backend)
227227

228228
static int config_iterator_new(
229229
git_config_iterator **iter,
230-
struct git_config_backend* backend)
230+
struct git_config_backend *backend)
231231
{
232-
diskfile_header *bh = (diskfile_header *) backend;
232+
diskfile_header *bh = GIT_CONTAINER_OF(backend, diskfile_header, parent);
233233
git_config_entries *entries;
234234
int error;
235235

src/iterator.c

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1521,7 +1521,7 @@ static void filesystem_iterator_set_current(
15211521
static int filesystem_iterator_current(
15221522
const git_index_entry **out, git_iterator *i)
15231523
{
1524-
filesystem_iterator *iter = (filesystem_iterator *)i;
1524+
filesystem_iterator *iter = GIT_CONTAINER_OF(i, filesystem_iterator, base);
15251525

15261526
if (!iterator__has_been_accessed(i))
15271527
return iter->base.cb->advance(out, i);
@@ -1568,7 +1568,7 @@ static int filesystem_iterator_is_dir(
15681568
static int filesystem_iterator_advance(
15691569
const git_index_entry **out, git_iterator *i)
15701570
{
1571-
filesystem_iterator *iter = (filesystem_iterator *)i;
1571+
filesystem_iterator *iter = GIT_CONTAINER_OF(i, filesystem_iterator, base);
15721572
bool is_dir;
15731573
int error = 0;
15741574

@@ -1627,7 +1627,7 @@ static int filesystem_iterator_advance(
16271627
static int filesystem_iterator_advance_into(
16281628
const git_index_entry **out, git_iterator *i)
16291629
{
1630-
filesystem_iterator *iter = (filesystem_iterator *)i;
1630+
filesystem_iterator *iter = GIT_CONTAINER_OF(i, filesystem_iterator, base);
16311631
filesystem_iterator_frame *frame;
16321632
filesystem_iterator_entry *prev_entry;
16331633
int error;
@@ -1664,7 +1664,7 @@ static int filesystem_iterator_advance_into(
16641664

16651665
int git_iterator_current_workdir_path(git_buf **out, git_iterator *i)
16661666
{
1667-
filesystem_iterator *iter = (filesystem_iterator *)i;
1667+
filesystem_iterator *iter = GIT_CONTAINER_OF(i, filesystem_iterator, base);
16681668
const git_index_entry *entry;
16691669

16701670
if (i->type != GIT_ITERATOR_TYPE_FS &&
@@ -1724,15 +1724,19 @@ GIT_INLINE(bool) filesystem_iterator_current_is_ignored(
17241724

17251725
bool git_iterator_current_is_ignored(git_iterator *i)
17261726
{
1727+
filesystem_iterator *iter = NULL;
1728+
17271729
if (i->type != GIT_ITERATOR_TYPE_WORKDIR)
17281730
return false;
17291731

1730-
return filesystem_iterator_current_is_ignored((filesystem_iterator *)i);
1732+
iter = GIT_CONTAINER_OF(i, filesystem_iterator, base);
1733+
1734+
return filesystem_iterator_current_is_ignored(iter);
17311735
}
17321736

17331737
bool git_iterator_current_tree_is_ignored(git_iterator *i)
17341738
{
1735-
filesystem_iterator *iter = (filesystem_iterator *)i;
1739+
filesystem_iterator *iter = GIT_CONTAINER_OF(i, filesystem_iterator, base);
17361740
filesystem_iterator_frame *frame;
17371741

17381742
if (i->type != GIT_ITERATOR_TYPE_WORKDIR)
@@ -1747,7 +1751,7 @@ static int filesystem_iterator_advance_over(
17471751
git_iterator_status_t *status,
17481752
git_iterator *i)
17491753
{
1750-
filesystem_iterator *iter = (filesystem_iterator *)i;
1754+
filesystem_iterator *iter = GIT_CONTAINER_OF(i, filesystem_iterator, base);
17511755
filesystem_iterator_frame *current_frame;
17521756
filesystem_iterator_entry *current_entry;
17531757
const git_index_entry *entry = NULL;
@@ -1866,15 +1870,15 @@ static int filesystem_iterator_init(filesystem_iterator *iter)
18661870

18671871
static int filesystem_iterator_reset(git_iterator *i)
18681872
{
1869-
filesystem_iterator *iter = (filesystem_iterator *)i;
1873+
filesystem_iterator *iter = GIT_CONTAINER_OF(i, filesystem_iterator, base);
18701874

18711875
filesystem_iterator_clear(iter);
18721876
return filesystem_iterator_init(iter);
18731877
}
18741878

18751879
static void filesystem_iterator_free(git_iterator *i)
18761880
{
1877-
filesystem_iterator *iter = (filesystem_iterator *)i;
1881+
filesystem_iterator *iter = GIT_CONTAINER_OF(i, filesystem_iterator, base);
18781882
git__free(iter->root);
18791883
git_buf_dispose(&iter->current_path);
18801884
git_tree_free(iter->tree);
@@ -2083,7 +2087,7 @@ static int index_iterator_skip_pseudotree(index_iterator *iter)
20832087
static int index_iterator_advance(
20842088
const git_index_entry **out, git_iterator *i)
20852089
{
2086-
index_iterator *iter = (index_iterator *)i;
2090+
index_iterator *iter = GIT_CONTAINER_OF(i, index_iterator, base);
20872091
const git_index_entry *entry = NULL;
20882092
bool is_submodule;
20892093
int error = 0;
@@ -2156,7 +2160,7 @@ static int index_iterator_advance(
21562160
static int index_iterator_advance_into(
21572161
const git_index_entry **out, git_iterator *i)
21582162
{
2159-
index_iterator *iter = (index_iterator *)i;
2163+
index_iterator *iter = GIT_CONTAINER_OF(i, index_iterator, base);
21602164

21612165
if (! S_ISDIR(iter->tree_entry.mode)) {
21622166
if (out)
@@ -2174,7 +2178,7 @@ static int index_iterator_advance_over(
21742178
git_iterator_status_t *status,
21752179
git_iterator *i)
21762180
{
2177-
index_iterator *iter = (index_iterator *)i;
2181+
index_iterator *iter = GIT_CONTAINER_OF(i, index_iterator, base);
21782182
const git_index_entry *entry;
21792183
int error;
21802184

@@ -2203,15 +2207,15 @@ static int index_iterator_init(index_iterator *iter)
22032207

22042208
static int index_iterator_reset(git_iterator *i)
22052209
{
2206-
index_iterator *iter = (index_iterator *)i;
2210+
index_iterator *iter = GIT_CONTAINER_OF(i, index_iterator, base);
22072211

22082212
index_iterator_clear(iter);
22092213
return index_iterator_init(iter);
22102214
}
22112215

22122216
static void index_iterator_free(git_iterator *i)
22132217
{
2214-
index_iterator *iter = (index_iterator *)i;
2218+
index_iterator *iter = GIT_CONTAINER_OF(i, index_iterator, base);
22152219

22162220
git_index_snapshot_release(&iter->entries, iter->base.index);
22172221
git_buf_dispose(&iter->tree_buf);

src/refdb_fs.c

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ static int refdb_fs_backend__exists(
327327
git_refdb_backend *_backend,
328328
const char *ref_name)
329329
{
330-
refdb_fs_backend *backend = (refdb_fs_backend *)_backend;
330+
refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
331331
git_buf ref_path = GIT_BUF_INIT;
332332
int error;
333333

@@ -469,7 +469,7 @@ static int refdb_fs_backend__lookup(
469469
git_refdb_backend *_backend,
470470
const char *ref_name)
471471
{
472-
refdb_fs_backend *backend = (refdb_fs_backend *)_backend;
472+
refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
473473
int error;
474474

475475
assert(backend);
@@ -502,7 +502,7 @@ typedef struct {
502502

503503
static void refdb_fs_backend__iterator_free(git_reference_iterator *_iter)
504504
{
505-
refdb_fs_iter *iter = (refdb_fs_iter *) _iter;
505+
refdb_fs_iter *iter = GIT_CONTAINER_OF(_iter, refdb_fs_iter, parent);
506506

507507
git_vector_free(&iter->loose);
508508
git_pool_clear(&iter->pool);
@@ -591,8 +591,8 @@ static int refdb_fs_backend__iterator_next(
591591
git_reference **out, git_reference_iterator *_iter)
592592
{
593593
int error = GIT_ITEROVER;
594-
refdb_fs_iter *iter = (refdb_fs_iter *)_iter;
595-
refdb_fs_backend *backend = (refdb_fs_backend *)iter->parent.db->backend;
594+
refdb_fs_iter *iter = GIT_CONTAINER_OF(_iter, refdb_fs_iter, parent);
595+
refdb_fs_backend *backend = GIT_CONTAINER_OF(iter->parent.db->backend, refdb_fs_backend, parent);
596596
struct packref *ref;
597597

598598
while (iter->loose_pos < iter->loose.length) {
@@ -632,8 +632,8 @@ static int refdb_fs_backend__iterator_next_name(
632632
const char **out, git_reference_iterator *_iter)
633633
{
634634
int error = GIT_ITEROVER;
635-
refdb_fs_iter *iter = (refdb_fs_iter *)_iter;
636-
refdb_fs_backend *backend = (refdb_fs_backend *)iter->parent.db->backend;
635+
refdb_fs_iter *iter = GIT_CONTAINER_OF(_iter, refdb_fs_iter, parent);
636+
refdb_fs_backend *backend = GIT_CONTAINER_OF(iter->parent.db->backend, refdb_fs_backend, parent);
637637
struct packref *ref;
638638

639639
while (iter->loose_pos < iter->loose.length) {
@@ -674,7 +674,7 @@ static int refdb_fs_backend__iterator_next_name(
674674
static int refdb_fs_backend__iterator(
675675
git_reference_iterator **out, git_refdb_backend *_backend, const char *glob)
676676
{
677-
refdb_fs_backend *backend = (refdb_fs_backend *)_backend;
677+
refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
678678
refdb_fs_iter *iter = NULL;
679679
int error;
680680

@@ -838,7 +838,7 @@ static int refdb_fs_backend__lock(void **out, git_refdb_backend *_backend, const
838838
{
839839
int error;
840840
git_filebuf *lock;
841-
refdb_fs_backend *backend = (refdb_fs_backend *) _backend;
841+
refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
842842

843843
lock = git__calloc(1, sizeof(git_filebuf));
844844
GIT_ERROR_CHECK_ALLOC(lock);
@@ -1248,7 +1248,7 @@ static int refdb_fs_backend__write(
12481248
const git_oid *old_id,
12491249
const char *old_target)
12501250
{
1251-
refdb_fs_backend *backend = (refdb_fs_backend *)_backend;
1251+
refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
12521252
git_filebuf file = GIT_FILEBUF_INIT;
12531253
int error = 0;
12541254

@@ -1274,7 +1274,7 @@ static int refdb_fs_backend__write_tail(
12741274
const git_oid *old_id,
12751275
const char *old_target)
12761276
{
1277-
refdb_fs_backend *backend = (refdb_fs_backend *)_backend;
1277+
refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
12781278
int error = 0, cmp = 0, should_write;
12791279
const char *new_target = NULL;
12801280
const git_oid *new_id = NULL;
@@ -1364,7 +1364,7 @@ static int refdb_fs_backend__delete(
13641364
const char *ref_name,
13651365
const git_oid *old_id, const char *old_target)
13661366
{
1367-
refdb_fs_backend *backend = (refdb_fs_backend *)_backend;
1367+
refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
13681368
git_filebuf file = GIT_FILEBUF_INIT;
13691369
int error = 0;
13701370

@@ -1387,7 +1387,7 @@ static int refdb_fs_backend__delete_tail(
13871387
const char *ref_name,
13881388
const git_oid *old_id, const char *old_target)
13891389
{
1390-
refdb_fs_backend *backend = (refdb_fs_backend *)_backend;
1390+
refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
13911391
git_buf loose_path = GIT_BUF_INIT;
13921392
size_t pack_pos;
13931393
int error = 0, cmp = 0;
@@ -1455,7 +1455,7 @@ static int refdb_fs_backend__rename(
14551455
const git_signature *who,
14561456
const char *message)
14571457
{
1458-
refdb_fs_backend *backend = (refdb_fs_backend *)_backend;
1458+
refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
14591459
git_reference *old, *new;
14601460
git_filebuf file = GIT_FILEBUF_INIT;
14611461
int error;
@@ -1511,7 +1511,7 @@ static int refdb_fs_backend__rename(
15111511
static int refdb_fs_backend__compress(git_refdb_backend *_backend)
15121512
{
15131513
int error;
1514-
refdb_fs_backend *backend = (refdb_fs_backend *)_backend;
1514+
refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
15151515

15161516
assert(backend);
15171517

@@ -1525,7 +1525,7 @@ static int refdb_fs_backend__compress(git_refdb_backend *_backend)
15251525

15261526
static void refdb_fs_backend__free(git_refdb_backend *_backend)
15271527
{
1528-
refdb_fs_backend *backend = (refdb_fs_backend *)_backend;
1528+
refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
15291529

15301530
assert(backend);
15311531

@@ -1703,7 +1703,7 @@ static int refdb_reflog_fs__ensure_log(git_refdb_backend *_backend, const char *
17031703

17041704
assert(_backend && name);
17051705

1706-
backend = (refdb_fs_backend *) _backend;
1706+
backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
17071707
repo = backend->repo;
17081708

17091709
if ((error = retrieve_reflog_path(&path, repo, name)) < 0)
@@ -1736,7 +1736,7 @@ static int refdb_reflog_fs__has_log(git_refdb_backend *_backend, const char *nam
17361736

17371737
assert(_backend && name);
17381738

1739-
backend = (refdb_fs_backend *) _backend;
1739+
backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
17401740

17411741
return has_reflog(backend->repo, name);
17421742
}
@@ -1752,7 +1752,7 @@ static int refdb_reflog_fs__read(git_reflog **out, git_refdb_backend *_backend,
17521752

17531753
assert(out && _backend && name);
17541754

1755-
backend = (refdb_fs_backend *) _backend;
1755+
backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
17561756
repo = backend->repo;
17571757

17581758
if (reflog_alloc(&log, name) < 0)
@@ -1862,7 +1862,7 @@ static int refdb_reflog_fs__write(git_refdb_backend *_backend, git_reflog *reflo
18621862

18631863
assert(_backend && reflog);
18641864

1865-
backend = (refdb_fs_backend *) _backend;
1865+
backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
18661866

18671867
if ((error = lock_reflog(&fbuf, backend, reflog->ref_name)) < 0)
18681868
return -1;
@@ -1984,7 +1984,7 @@ static int refdb_reflog_fs__rename(git_refdb_backend *_backend, const char *old_
19841984

19851985
assert(_backend && old_name && new_name);
19861986

1987-
backend = (refdb_fs_backend *) _backend;
1987+
backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
19881988
repo = backend->repo;
19891989

19901990
if ((error = git_reference__normalize_name(
@@ -2055,7 +2055,7 @@ static int refdb_reflog_fs__rename(git_refdb_backend *_backend, const char *old_
20552055

20562056
static int refdb_reflog_fs__delete(git_refdb_backend *_backend, const char *name)
20572057
{
2058-
refdb_fs_backend *backend = (refdb_fs_backend *) _backend;
2058+
refdb_fs_backend *backend = GIT_CONTAINER_OF(_backend, refdb_fs_backend, parent);
20592059
git_buf path = GIT_BUF_INIT;
20602060
int error;
20612061

src/transports/http.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,7 +1144,7 @@ static int http_stream_write_chunked(
11441144
const char *buffer,
11451145
size_t len)
11461146
{
1147-
http_stream *s = (http_stream *)stream;
1147+
http_stream *s = GIT_CONTAINER_OF(stream, http_stream, parent);
11481148
http_subtransport *t = OWNING_SUBTRANSPORT(s);
11491149

11501150
assert(t->connected);
@@ -1218,7 +1218,7 @@ static int http_stream_write_single(
12181218
const char *buffer,
12191219
size_t len)
12201220
{
1221-
http_stream *s = (http_stream *)stream;
1221+
http_stream *s = GIT_CONTAINER_OF(stream, http_stream, parent);
12221222
http_subtransport *t = OWNING_SUBTRANSPORT(s);
12231223
git_buf request = GIT_BUF_INIT;
12241224

@@ -1252,7 +1252,7 @@ static int http_stream_write_single(
12521252

12531253
static void http_stream_free(git_smart_subtransport_stream *stream)
12541254
{
1255-
http_stream *s = (http_stream *)stream;
1255+
http_stream *s = GIT_CONTAINER_OF(stream, http_stream, parent);
12561256

12571257
if (s->chunk_buffer)
12581258
git__free(s->chunk_buffer);
@@ -1365,7 +1365,7 @@ static int http_action(
13651365
const char *url,
13661366
git_smart_service_t action)
13671367
{
1368-
http_subtransport *t = (http_subtransport *)subtransport;
1368+
http_subtransport *t = GIT_CONTAINER_OF(subtransport, http_subtransport, parent);
13691369
int ret;
13701370

13711371
assert(stream);
@@ -1419,7 +1419,7 @@ static void free_auth_contexts(git_vector *contexts)
14191419

14201420
static int http_close(git_smart_subtransport *subtransport)
14211421
{
1422-
http_subtransport *t = (http_subtransport *) subtransport;
1422+
http_subtransport *t = GIT_CONTAINER_OF(subtransport, http_subtransport, parent);
14231423

14241424
clear_parser_state(t);
14251425

@@ -1459,7 +1459,7 @@ static int http_close(git_smart_subtransport *subtransport)
14591459

14601460
static void http_free(git_smart_subtransport *subtransport)
14611461
{
1462-
http_subtransport *t = (http_subtransport *) subtransport;
1462+
http_subtransport *t = GIT_CONTAINER_OF(subtransport, http_subtransport, parent);
14631463

14641464
http_close(subtransport);
14651465

0 commit comments

Comments
 (0)