1#include <NumberFormatParameters.h>
2
3// defaults
4static const bool kDefaultUseGrouping = false;
5static const number_format_sign_policy kDefaultSignPolicy
6	= B_USE_NEGATIVE_SIGN_ONLY;
7static const number_format_base kDefaultBase = B_DEFAULT_BASE;
8static const bool kDefaultUseBasePrefix = false;
9static const size_t kDefaultMinimalIntegerDigits = 1;
10static const bool kDefaultUseZeroPadding = false;
11
12// flags
13enum {
14	USE_GROUPING_SET			= 0x01,
15	SIGN_POLICY_SET				= 0x02,
16	BASE_SET					= 0x04,
17	USE_BASE_PREFIX_SET			= 0x08,
18	MINIMAL_INTEGER_DIGITS_SET	= 0x10,
19	USE_ZERO_PADDING_SET		= 0x20,
20};
21
22// constructor
23BNumberFormatParameters::BNumberFormatParameters(
24	const BNumberFormatParameters *parent)
25	: BFormatParameters(parent),
26	  fParent(parent),
27	  fFlags(0)
28{
29}
30
31// copy constructor
32BNumberFormatParameters::BNumberFormatParameters(
33	const BNumberFormatParameters &other)
34	: BFormatParameters(other),
35	  fParent(other.fParent),
36	  fUseGrouping(other.fUseGrouping),
37	  fSignPolicy(other.fSignPolicy),
38	  fBase(other.fBase),
39	  fUseBasePrefix(other.fUseBasePrefix),
40	  fMinimalIntegerDigits(other.fMinimalIntegerDigits),
41	  fFlags(other.fFlags)
42{
43}
44
45// destructor
46BNumberFormatParameters::~BNumberFormatParameters()
47{
48}
49
50// SetUseGrouping
51void
52BNumberFormatParameters::SetUseGrouping(bool useGrouping)
53{
54	fUseGrouping = useGrouping;
55	fFlags |= USE_GROUPING_SET;
56}
57
58// UseGrouping
59bool
60BNumberFormatParameters::UseGrouping() const
61{
62	if (fFlags & USE_GROUPING_SET)
63		return fUseGrouping;
64	if (fParent)
65		return fParent->UseGrouping();
66	return kDefaultUseGrouping;
67}
68
69// SetSignPolicy
70void
71BNumberFormatParameters::SetSignPolicy(number_format_sign_policy policy)
72{
73	fSignPolicy = policy;
74	fFlags |= SIGN_POLICY_SET;
75}
76
77// SignPolicy
78number_format_sign_policy
79BNumberFormatParameters::SignPolicy() const
80{
81	if (fFlags & SIGN_POLICY_SET)
82		return fSignPolicy;
83	if (fParent)
84		return fParent->SignPolicy();
85	return kDefaultSignPolicy;
86}
87
88// SetBase
89void
90BNumberFormatParameters::SetBase(number_format_base base)
91{
92	fBase = base;
93	fFlags |= BASE_SET;
94}
95
96// Base
97number_format_base
98BNumberFormatParameters::Base() const
99{
100	if (fFlags & BASE_SET)
101		return fBase;
102	if (fParent)
103		return fParent->Base();
104	return kDefaultBase;
105}
106
107// SetUseBasePrefix
108void
109BNumberFormatParameters::SetUseBasePrefix(bool useBasePrefix)
110{
111	fUseBasePrefix = useBasePrefix;
112	fFlags |= USE_BASE_PREFIX_SET;
113}
114
115// UseBasePrefix
116bool
117BNumberFormatParameters::UseBasePrefix() const
118{
119	if (fFlags & USE_BASE_PREFIX_SET)
120		return fUseBasePrefix;
121	if (fParent)
122		return fParent->UseBasePrefix();
123	return kDefaultUseBasePrefix;
124}
125
126// SetMinimalIntegerDigits
127void
128BNumberFormatParameters::SetMinimalIntegerDigits(size_t minIntegerDigits)
129{
130	fMinimalIntegerDigits = minIntegerDigits;
131	fFlags |= MINIMAL_INTEGER_DIGITS_SET;
132}
133
134// MinimalIntegerDigits
135size_t
136BNumberFormatParameters::MinimalIntegerDigits() const
137{
138	if (fFlags & MINIMAL_INTEGER_DIGITS_SET)
139		return fMinimalIntegerDigits;
140	if (fParent)
141		return fParent->MinimalIntegerDigits();
142	return kDefaultMinimalIntegerDigits;
143}
144
145// SetUseZeroPadding
146void
147BNumberFormatParameters::SetUseZeroPadding(bool useZeroPadding)
148{
149	fUseZeroPadding = useZeroPadding;
150	fFlags |= USE_ZERO_PADDING_SET;
151}
152
153// UseZeroPadding
154bool
155BNumberFormatParameters::UseZeroPadding() const
156{
157	if (fFlags & USE_ZERO_PADDING_SET)
158		return fUseZeroPadding;
159	if (fParent)
160		return fParent->UseZeroPadding();
161	return kDefaultUseZeroPadding;
162}
163
164// SetParentNumberParameters
165void
166BNumberFormatParameters::SetParentNumberParameters(
167	const BNumberFormatParameters *parent)
168{
169	fParent = parent;
170	SetParentParameters(parent);
171}
172
173// ParentNumberParameters
174const BNumberFormatParameters *
175BNumberFormatParameters::ParentNumberParameters() const
176{
177	return fParent;
178}
179
180// =
181BNumberFormatParameters &
182BNumberFormatParameters::operator=(const BNumberFormatParameters &other)
183{
184	BFormatParameters::operator=(other);
185	fParent = other.fParent;
186	fUseGrouping = other.fUseGrouping;
187	fSignPolicy = other.fSignPolicy;
188	fBase = other.fBase;
189	fUseBasePrefix = other.fUseBasePrefix;
190	fMinimalIntegerDigits = other.fMinimalIntegerDigits;
191	fFlags = other.fFlags;
192	fUseZeroPadding = other.fUseZeroPadding;
193	return *this;
194}
195
196