需要帮助设计带有约束的比较器

Need help designing a comparator with constraints

我正在尝试编写一个比较器来比较两个“签名”。所以我在想我可以写一个函数,给它一个“签名”returns一个整数值。

int *signature_to_integer(Signature *sig) {
   // TODO
}

但是,我有两个限制:

所以我想我可以做这样的事情:

int val = is_input * 1 + is_var * 10 + line_number(source_class) * 100 + num_actuals * 1000 + ...;

但这是个坏主意,因为行号可能大于 1000,这会打乱我的逻辑。我感谢任何提示或想法。

谢谢。

“签名”结构:

struct Signature_type
{
  bool is_input;
  bool is_var;
  ASTNode source_class;
  int num_actuals;
  ASTNode actuals[];
};

typedef struct Signature_type Signature;

I was thinking I can write a function that given a "Signature" it returns an integer value.

I appreciate any hint or ideas.

不要编写将对象转换为整数值的函数。相反:

I trying to write a comparator to compare two "Signature"s

这样做。模仿传递给 qsort.

的函数指针的 return 值
// return an integer less than, equal to, or greater than zero 
// if the first argument is considered to
// be respectively less than, equal to, or greater than the second.
int signature_compare(const Signature *sig1, const Signature *sig2) {
    if (sig1->is_input != sig2->is_input) {
          // decide ordering. Should sig1 be _before_ sig2_?
          // return sig1->is_input < sig2->is_input ? -1 : 1;
          return sig1->is_input < sig2->is_input ? 1 : -1;
    }
    if (sig1->is_var != sig2->is_var) {
          return sig1->is_var - sig2->is_var;
    }
    if (line_number(sig1->source_class) != line_number(sig2->source_class)) {
           // note: substraction with int's may overflow
           // handle specific cases
           return line_number(sig1->source_class) - line_number(sig2->source_class);
    }
    // etc. etc. etc.
    return 0;
}