summaryrefslogtreecommitdiff
path: root/include/swkey.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/swkey.h')
-rw-r--r--include/swkey.h232
1 files changed, 232 insertions, 0 deletions
diff --git a/include/swkey.h b/include/swkey.h
new file mode 100644
index 0000000..89786f0
--- /dev/null
+++ b/include/swkey.h
@@ -0,0 +1,232 @@
+/******************************************************************************
+ *
+ * swkey.h - code for base class 'swkey'. swkey is the basis for all
+ * types of keys for indexing into modules (e.g. verse, word,
+ * place, etc.)
+ *
+ * $Id: swkey.h 2926 2013-07-31 02:06:33Z scribe $
+ *
+ * Copyright 1998-2013 CrossWire Bible Society (http://www.crosswire.org)
+ * CrossWire Bible Society
+ * P. O. Box 2528
+ * Tempe, AZ 85280-2528
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation version 2.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ */
+
+#ifndef SWKEY_H
+#define SWKEY_H
+
+#include <swobject.h>
+
+#include <defs.h>
+#include <sysdata.h>
+#include <utilstr.h>
+
+SWORD_NAMESPACE_START
+
+#define KEYERR_OUTOFBOUNDS 1
+
+#define SWKEY_OPERATORS \
+ SWKey &operator =(const char *ikey) { setText(ikey); return *this; } \
+ SWKey &operator =(const SWKey &ikey) { positionFrom(ikey); return *this; } \
+ SWKey &operator =(SW_POSITION pos) { setPosition(pos); return *this; } \
+ operator const char *() const { return getText(); } \
+ bool operator ==(const SWKey &ikey) { return equals(ikey); } \
+ bool operator !=(const SWKey &ikey) { return !equals(ikey); } \
+ virtual bool operator >(const SWKey &ikey) { return (compare(ikey) > 0); } \
+ virtual bool operator <(const SWKey &ikey) { return (compare(ikey) < 0); } \
+ virtual bool operator >=(const SWKey &ikey) { return (compare(ikey) > -1); } \
+ virtual bool operator <=(const SWKey &ikey) { return (compare(ikey) < 1); } \
+ SWKey &operator -=(int steps) { decrement(steps); return *this; } \
+ SWKey &operator +=(int steps) { increment(steps); return *this; } \
+ SWKey &operator ++() { increment(1); return *this; } \
+ SWKey operator ++(int) { SWKey temp = *this; increment(1); return temp; } \
+ SWKey &operator --() { decrement(1); return *this; } \
+ SWKey operator --(int) { SWKey temp = *this; decrement(1); return temp; }
+
+
+/** For use with = operator to position key.
+*/
+class SW_POSITION {
+ char pos;
+public:
+ SW_POSITION(char ipos) { pos = ipos; }
+ operator char() { return pos; }
+};
+
+#define POS_TOP ((char)1)
+#define POS_BOTTOM ((char)2)
+
+#define TOP SW_POSITION(POS_TOP)
+#define BOTTOM SW_POSITION(POS_BOTTOM)
+
+class SWLocale;
+
+/** SWKey is used for positioning an SWModule to a specific entry.
+ * It always represents a possible location into a module and can additionally represent
+ * a domain of entries (e.g. "John 3:16" in the domain "John 1:1 - Mark 5:25")
+ */
+class SWDLLEXPORT SWKey : public SWObject {
+
+ class LocaleCache {
+ public:
+ char *name;
+ SWLocale *locale;
+ LocaleCache() {
+ name = 0;
+ locale = 0;
+ }
+ virtual ~LocaleCache() {
+ if (name)
+ delete[]name;
+ }
+ };
+ static LocaleCache localeCache;
+ // for caching; don't use directly, call getPrivateLocale()
+ mutable SWLocale *locale;
+
+
+ long index;
+ static SWClass classdef;
+ void init();
+
+
+protected:
+ char *keytext;
+ mutable char *rangeText;
+ mutable bool boundSet;
+ bool persist;
+ mutable char error;
+
+ char *localeName;
+ SWLocale *getPrivateLocale() const;
+
+
+public:
+
+ // misc storage for whatever
+ __u64 userData;
+
+ /** initializes instance of SWKey from a string
+ * All keys can be reduced to a string representation which should be able
+ * to be used to again set the key to the same position
+ * @param ikey string to use for initializing this new key
+ */
+ SWKey(const char *ikey = 0);
+
+ /** Copy Constructor
+ * @param k The SWKey object to copy.
+ */
+ SWKey(const SWKey &k);
+
+ /** Destructor, cleans up this instance of SWKey
+ */
+ virtual ~SWKey();
+
+ /** Returns a new exact clone of this SWKey object. This allocates
+ * a new SWKey which must be deleted by the caller
+ * @return new clone of this key
+ */
+ virtual SWKey *clone() const;
+
+
+ /** Gets whether this key should persist in any module to which it is set
+ * otherwise just a copy will be used in the module.
+ * @return 1 - persists in module; 0 - a copy is attempted
+ */
+ bool isPersist() const;
+ SWDEPRECATED char Persist() const { return isPersist(); }
+
+ /** Sets whether this key should persist in any module to which it is set
+ * otherwise just a copy will be used in the module.
+ * @param ipersist value which to set persist;
+ * @return 1 - persists in module; 0 - a copy is attempted
+ */
+ SWDEPRECATED char Persist(signed char ipersist) { setPersist(ipersist!=0); return isPersist(); }
+ void setPersist(bool ipersist);
+
+ /** Gets and clears error status
+ * @return error status
+ */
+ SWDEPRECATED char Error() { return popError(); }
+ virtual char popError();
+ virtual void setError(char err) { error = err; }
+
+ /** Sets this SWKey with a character string
+ * @param ikey string used to set this key
+ */
+ virtual void setText(const char *ikey);
+
+ /** Copies as much info (position, range, etc.) as possible from another SWKey object
+ * @param ikey other SWKey object from which to copy
+ */
+ virtual void copyFrom(const SWKey &ikey);
+ virtual void positionFrom(const SWKey &ikey) { copyFrom(ikey); }
+
+ /** returns string representation of this key
+ */
+ virtual const char *getText() const;
+ virtual const char *getShortText() const { return getText(); }
+ virtual const char *getRangeText() const;
+ virtual const char *getOSISRefRangeText() const;
+ virtual bool isBoundSet() const { return boundSet; }
+ virtual void clearBound() const { boundSet = false; }
+
+ /** Compares this key object to another SWKey object
+ * @param ikey key to compare with this one
+ * @return >0 if this key is greater than compare key;
+ * <0 if this key is smaller than compare key;
+ * 0 if the keys are the same
+ */
+ virtual int compare(const SWKey &ikey);
+
+ /** test equality of this SWKey object's position with another SWKey
+ * @param ikey key to compare with this one
+ * @return true if the key positions are equal
+ */
+ virtual bool equals(const SWKey &ikey) { return !compare(ikey); }
+
+ virtual void setPosition(SW_POSITION);
+
+ /** Decrements key a number of entry positions
+ * This is only valid if isTraversable is true
+ * @param steps Number of entries to jump backward
+ */
+ virtual void decrement(int steps = 1);
+
+ /** Increments key a number of entry positions
+ * This is only valid if isTraversable is true
+ * @param steps Number of entries to jump forward
+ */
+ virtual void increment(int steps = 1);
+
+ /** Whether or not this key can be ++ -- incremented
+ */
+ virtual bool isTraversable() const { return false; }
+
+ char *getLocale() const { return localeName; }
+ void setLocale(const char *name) { stdstr(&localeName, name); locale = 0; } // this will force an on demand lookup of our locale
+
+ /** Use this function to get an index position within a module.
+ */
+ virtual long getIndex() const { return index; }
+
+ /** See documentation for @ref Index()
+ */
+ virtual void setIndex(long iindex) { index = iindex; }
+
+ SWKEY_OPERATORS
+
+ };
+
+SWORD_NAMESPACE_END
+#endif