2020-08-11 11:10:23 +02:00
|
|
|
// © 2019 and later: Unicode, Inc. and others.
|
|
|
|
// License & terms of use: http://www.unicode.org/copyright.html
|
|
|
|
|
|
|
|
// lsr.h
|
|
|
|
// created: 2019may08 Markus W. Scherer
|
|
|
|
|
|
|
|
#ifndef __LSR_H__
|
|
|
|
#define __LSR_H__
|
|
|
|
|
2023-11-01 07:56:12 +01:00
|
|
|
#include "unicode/stringpiece.h"
|
2020-08-11 11:10:23 +02:00
|
|
|
#include "unicode/utypes.h"
|
|
|
|
#include "unicode/uobject.h"
|
|
|
|
#include "cstring.h"
|
|
|
|
|
|
|
|
U_NAMESPACE_BEGIN
|
|
|
|
|
|
|
|
struct LSR final : public UMemory {
|
|
|
|
static constexpr int32_t REGION_INDEX_LIMIT = 1001 + 26 * 26;
|
|
|
|
|
|
|
|
static constexpr int32_t EXPLICIT_LSR = 7;
|
|
|
|
static constexpr int32_t EXPLICIT_LANGUAGE = 4;
|
|
|
|
static constexpr int32_t EXPLICIT_SCRIPT = 2;
|
|
|
|
static constexpr int32_t EXPLICIT_REGION = 1;
|
|
|
|
static constexpr int32_t IMPLICIT_LSR = 0;
|
|
|
|
static constexpr int32_t DONT_CARE_FLAGS = 0;
|
|
|
|
|
|
|
|
const char *language;
|
|
|
|
const char *script;
|
|
|
|
const char *region;
|
|
|
|
char *owned = nullptr;
|
|
|
|
/** Index for region, 0 if ill-formed. @see indexForRegion */
|
|
|
|
int32_t regionIndex = 0;
|
|
|
|
int32_t flags = 0;
|
|
|
|
/** Only set for LSRs that will be used in a hash table. */
|
|
|
|
int32_t hashCode = 0;
|
|
|
|
|
|
|
|
LSR() : language("und"), script(""), region("") {}
|
|
|
|
|
|
|
|
/** Constructor which aliases all subtag pointers. */
|
|
|
|
LSR(const char *lang, const char *scr, const char *r, int32_t f) :
|
|
|
|
language(lang), script(scr), region(r),
|
|
|
|
regionIndex(indexForRegion(region)), flags(f) {}
|
|
|
|
/**
|
|
|
|
* Constructor which prepends the prefix to the language and script,
|
|
|
|
* copies those into owned memory, and aliases the region.
|
|
|
|
*/
|
|
|
|
LSR(char prefix, const char *lang, const char *scr, const char *r, int32_t f,
|
|
|
|
UErrorCode &errorCode);
|
2023-11-01 07:56:12 +01:00
|
|
|
LSR(StringPiece lang, StringPiece scr, StringPiece r, int32_t f,
|
|
|
|
UErrorCode &errorCode);
|
2023-05-23 02:05:01 +02:00
|
|
|
LSR(LSR &&other) noexcept;
|
2020-08-11 11:10:23 +02:00
|
|
|
LSR(const LSR &other) = delete;
|
|
|
|
inline ~LSR() {
|
|
|
|
// Pure inline code for almost all instances.
|
|
|
|
if (owned != nullptr) {
|
|
|
|
deleteOwned();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-05-23 02:05:01 +02:00
|
|
|
LSR &operator=(LSR &&other) noexcept;
|
2020-08-11 11:10:23 +02:00
|
|
|
LSR &operator=(const LSR &other) = delete;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns a positive index (>0) for a well-formed region code.
|
|
|
|
* Do not rely on a particular region->index mapping; it may change.
|
|
|
|
* Returns 0 for ill-formed strings.
|
|
|
|
*/
|
|
|
|
static int32_t indexForRegion(const char *region);
|
|
|
|
|
|
|
|
UBool isEquivalentTo(const LSR &other) const;
|
2021-10-28 08:15:28 +02:00
|
|
|
bool operator==(const LSR &other) const;
|
2020-08-11 11:10:23 +02:00
|
|
|
|
2021-10-28 08:15:28 +02:00
|
|
|
inline bool operator!=(const LSR &other) const {
|
2020-08-11 11:10:23 +02:00
|
|
|
return !operator==(other);
|
|
|
|
}
|
|
|
|
|
|
|
|
LSR &setHashCode();
|
|
|
|
|
|
|
|
private:
|
|
|
|
void deleteOwned();
|
|
|
|
};
|
|
|
|
|
|
|
|
U_NAMESPACE_END
|
|
|
|
|
|
|
|
#endif // __LSR_H__
|