1// Copyright (C) 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3/*
4**********************************************************************
5* Copyright (c) 2004-2014, International Business Machines
6* Corporation and others.  All Rights Reserved.
7**********************************************************************
8* Author: Alan Liu
9* Created: January 16 2004
10* Since: ICU 2.8
11**********************************************************************
12*/
13#ifndef LOCBASED_H
14#define LOCBASED_H
15
16#include "unicode/locid.h"
17#include "unicode/uobject.h"
18
19/**
20 * Macro to declare a locale LocaleBased wrapper object for the given
21 * object, which must have two members named `validLocale' and
22 * `actualLocale' of size ULOC_FULLNAME_CAPACITY
23 */
24#define U_LOCALE_BASED(varname, objname) \
25  LocaleBased varname((objname).validLocale, (objname).actualLocale);
26
27U_NAMESPACE_BEGIN
28
29/**
30 * A utility class that unifies the implementation of getLocale() by
31 * various ICU services.  This class is likely to be removed in the
32 * ICU 3.0 time frame in favor of an integrated approach with the
33 * services framework.
34 * @since ICU 2.8
35 */
36class U_COMMON_API LocaleBased : public UMemory {
37
38 public:
39
40    /**
41     * Construct a LocaleBased wrapper around the two pointers.  These
42     * will be aliased for the lifetime of this object.
43     */
44    inline LocaleBased(char* validAlias, char* actualAlias);
45
46    /**
47     * Construct a LocaleBased wrapper around the two const pointers.
48     * These will be aliased for the lifetime of this object.
49     */
50    inline LocaleBased(const char* validAlias, const char* actualAlias);
51
52    /**
53     * Return locale meta-data for the service object wrapped by this
54     * object.  Either the valid or the actual locale may be
55     * retrieved.
56     * @param type either ULOC_VALID_LOCALE or ULOC_ACTUAL_LOCALE
57     * @param status input-output error code
58     * @return the indicated locale
59     */
60    Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
61
62    /**
63     * Return the locale ID for the service object wrapped by this
64     * object.  Either the valid or the actual locale may be
65     * retrieved.
66     * @param type either ULOC_VALID_LOCALE or ULOC_ACTUAL_LOCALE
67     * @param status input-output error code
68     * @return the indicated locale ID
69     */
70    const char* getLocaleID(ULocDataLocaleType type, UErrorCode& status) const;
71
72    /**
73     * Set the locale meta-data for the service object wrapped by this
74     * object.  If either parameter is zero, it is ignored.
75     * @param valid the ID of the valid locale
76     * @param actual the ID of the actual locale
77     */
78    void setLocaleIDs(const char* valid, const char* actual);
79
80    /**
81     * Set the locale meta-data for the service object wrapped by this
82     * object.
83     * @param valid the ID of the valid locale
84     * @param actual the ID of the actual locale
85     */
86    void setLocaleIDs(const Locale& valid, const Locale& actual);
87
88 private:
89
90    char* valid;
91
92    char* actual;
93};
94
95inline LocaleBased::LocaleBased(char* validAlias, char* actualAlias) :
96    valid(validAlias), actual(actualAlias) {
97}
98
99inline LocaleBased::LocaleBased(const char* validAlias,
100                                const char* actualAlias) :
101    // ugh: cast away const
102    valid((char*)validAlias), actual((char*)actualAlias) {
103}
104
105U_NAMESPACE_END
106
107#endif
108