如何设计一个返回oid数组的函数

时间:2014-03-30 12:50:05

标签: c libgit2

正如已经在issue#2217写的那样,我想设计一个函数,它在第一个输出参数中返回一个oid列表。

我应该:

  • 返回oid列表作为指针的指针?

int git_commit_tree_last_commit_id(git_oid **out, git_repository *repo, const git_commit *commit, char *path)

  • 或者返回oid列表作为指向自定义结构的指针?

int git_commit_tree_last_commit_id(git_oid_xx_struct *out, git_repository *repo, const git_commit *commit, char *path)

你有什么建议?

1 个答案:

答案 0 :(得分:0)

问题是,您如何知道返回数组中有多少OID,以及谁分配底层内存。

第一部分有几种可能性,

  • 在单独的返回参数中返回数字
  • 使用sentinel值终止列表。
  • 返回一个新的结构类型,如git_strarray,其中包含计数和 原始数据。

对于第二部分,要么

  • 调用者可以分配底层内存
  • 该功能可以分配内存
  • 新的结构类型可以管理内存。

你走哪条路取决于你希望代码看起来像什么,你期望它重用多少,性能如何关键等等。

首先,我选择最简单的,IMO是函数返回计数并分配内存。

这意味着我的功能必须如下所示:

int get_some_oids_in_an_array(OID** array, int * count, ... ) {
  ...
  *count = number_of_oids;
  *array = (OID*)malloc( sizeof(OID)*number_of_oids);
  for(i=0; i<number_of_oids; ++i) {
    *array[i]=...;
  }
  ...
  return 0;
}

/* Example of usage */
void use_get_oids() {
  OID* oids;
  int n_oids;
  int ok = get_some_oids_in_an_array(&oids, &n_oids, ...);
  for(i=0; i<n_oids; ++i ) {
    ... use oids[i] ...
  }
  free(oids);
}

注意:我正在返回一个OID数组,而不是一个OID *数组,要么是一个有效的选项,哪个最适合你将会有所不同。

如果事实证明我经常使用这种模式,那么会考虑切换到struct route。

int get_some_oids( oidarray * oids, ... ) {
  int i;
  oidarray_ensure_size(number_of_oids);
  for(i=0; i<number_of_oids; ++i) {
    oidarray_set_value(i, ...);
  }
  return 0;
}

typedef struct oidarray {
  size_t count;
  OID* oids;
};

/* Example of usage */
void use_get_oids() {
  oid_array oids = {0};
  get_some_oids(&oids);
  for(i=0; i<oids.count; ++i) {
    ... use oids.oids[i] ...
  }
  oidarray_release(&oids);
}