1 /* compare.h -*- mode:c; coding:utf-8; -*- 2 * 3 * Copyright (c) 2010-2021 Takashi Kato <ktakashi@ymail.com> 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 22 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 23 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 24 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 25 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * $Id: $ 29 */ 30 #ifndef SAGITTARIUS_PRIVATE_COMPARE_H_ 31 #define SAGITTARIUS_PRIVATE_COMPARE_H_ 32 33 #include "sagittariusdefs.h" 34 #include "clos.h" 35 36 SG_CLASS_DECL(Sg_ComparatorClass); 37 #define SG_CLASS_COMPARATOR (&Sg_ComparatorClass) 38 39 /* 40 <comparator> 41 - type-test 42 - equality 43 - comparison 44 - hash 45 - comparison? 46 - hash? 47 */ 48 struct SgComparatorRec 49 { 50 SG_HEADER; 51 SgObject name; /* for debugging */ 52 SgObject typeFn; /* type-test */ 53 SgObject eqFn; /* equality */ 54 SgObject compFn; /* comparison */ 55 SgObject hashFn; /* hash*/ 56 unsigned long flags; /* comparison?, hash? and so */ 57 }; 58 59 #define SG_COMPARATORP(obj) SG_XTYPEP(obj, SG_CLASS_COMPARATOR) 60 #define SG_COMPARATOR(obj) ((SgComparator *)obj) 61 62 enum SgComparatorFlags { 63 SG_COMPARATOR_NO_ORDER = (1L << 0), /* no comparison procedure */ 64 SG_COMPARATOR_NO_HASH = (1L << 1), /* no hash procedure */ 65 SG_COMPARATOR_ANY_TYPE = (1L << 2), /* type-test returns always #t */ 66 }; 67 68 enum { 69 SG_CMP_EQ, 70 SG_CMP_EQV, 71 SG_CMP_EQUAL 72 }; 73 74 #define SG_EQ(x, y) ((x) == (y)) 75 76 SG_CDECL_BEGIN 77 78 SG_EXTERN SgObject Sg_MakeComparator(SgObject typeFn, SgObject eqFn, 79 SgObject compFn, SgObject hashFn, 80 SgObject name); 81 /* pre-defined comparators. 82 The returning value should be const SgObject but I'm lazy... 83 */ 84 SG_EXTERN SgObject Sg_EqComparator(); 85 SG_EXTERN SgObject Sg_EqvComparator(); 86 SG_EXTERN SgObject Sg_EqualComparator(); 87 SG_EXTERN SgObject Sg_StringComparator(); 88 89 SG_EXTERN int Sg_EqP(SgObject x, SgObject y); 90 SG_EXTERN int Sg_EqvP(SgObject x, SgObject y); 91 SG_EXTERN int Sg_EqualP(SgObject x, SgObject y); 92 SG_EXTERN int Sg_EqualM(SgObject x, SgObject y, int mode); 93 SG_EXTERN int Sg_Compare(SgObject x, SgObject y); 94 95 SG_CDECL_END 96 97 #endif /* SAGITTARIUS_COMPARE_H_ */ 98 99 /* 100 end of file 101 Local Variables: 102 coding: utf-8-unix 103 End 104 */ 105