* Author: Alejandro Aguilar Sierra <asierra@servidor.unam.mx>
* Created: August 1996
*
- * Copyright: (c) 1996, 1997 Alejandro Aguilar Sierra
+ * Copyright: 1996, 1997 Alejandro Aguilar Sierra
*
* License: GNU GPL version 2 or later
*/
#include <config.h>
-#include <cstdlib>
+#include <algorithm>
#include "math_defs.h"
#include "symbol_def.h"
+using std::sort;
+using std::lower_bound;
// This table includes all binary operators and relations
-struct binary_op_pair { short id, isrel; } binary_op_table[] = {
+struct binary_op_pair {
+ short id;
+ short isrel;
+};
+
+binary_op_pair binary_op_table[] = {
{ LM_leq, LMB_RELATION }, { LM_geq, LMB_RELATION },
{ LM_equiv, LMB_RELATION }, { LM_models, LMB_RELATION },
{ LM_prec, LMB_RELATION }, { LM_succ, LMB_RELATION },
{ LM_ddagger, LMB_OPERATOR }
};
-extern "C" int compara(const void *a, const void *b)
-{
- int i = ((binary_op_pair const *)a)->id, j = ((binary_op_pair const*)b)->id;
- return i - j;
-}
-int MathedLookupBOP(short id)
-{
- static int bopCount = sizeof(binary_op_table) / sizeof(binary_op_pair);
- static bool issorted = false;
+struct compara {
+ // used by sort
+ inline
+ int operator()(binary_op_pair const & a,
+ binary_op_pair const & b) const {
+ return a.id < b.id;
+ }
+ // used by lower_bound
+ inline
+ int operator()(binary_op_pair const & a, short int id) const {
+ return a.id < id;
+ }
+};
- if (!issorted) {
- qsort(binary_op_table, bopCount, sizeof(binary_op_pair), compara);
- issorted = true;
- }
-
- int result= 0, m, k, l= 0, r = bopCount;
-
- while (l < r) {
- m = (l+r)/2;
- k = binary_op_table[m].id - id;
- if (k == 0) {
- result = binary_op_table[m].isrel;
- break;
- } else
- if (k<0) l = m+1; else r = m;
- }
- return result;
+int MathedLookupBOP(short id)
+{
+ static int const bopCount =
+ sizeof(binary_op_table) / sizeof(binary_op_pair);
+ static bool issorted = false;
+
+ if (!issorted) {
+ sort(binary_op_table, binary_op_table + bopCount, compara());
+ issorted = true;
+ }
+
+ binary_op_pair * res = lower_bound(binary_op_table,
+ binary_op_table + bopCount,
+ id, compara());
+ if (res != binary_op_table + bopCount && res->id == id)
+ return res->isrel;
+ else
+ return LMB_NONE;
}
-