Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
F
fmt
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
fmt
Commits
9a21728b
Commit
9a21728b
authored
Nov 26, 2019
by
Victor Zverovich
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove gen_digits_params
parent
3de36e93
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
31 additions
and
40 deletions
+31
-40
include/fmt/format.h
include/fmt/format.h
+31
-40
No files found.
include/fmt/format.h
View file @
9a21728b
...
@@ -1070,20 +1070,15 @@ enum class float_format {
...
@@ -1070,20 +1070,15 @@ enum class float_format {
};
};
struct
float_spec
{
struct
float_spec
{
int
precision
;
float_format
format
;
float_format
format
;
sign_t
sign
:
3
;
bool
upper
;
bool
upper
;
bool
locale
;
bool
locale
;
bool
percent
;
bool
percent
;
bool
alt
;
bool
alt
;
bool
binary32
;
bool
binary32
;
bool
use_grisu
;
bool
use_grisu
;
};
struct
gen_digits_params
{
int
num_digits
;
sign_t
sign
:
3
;
float_format
format
;
bool
upper
;
bool
trailing_zeros
;
bool
trailing_zeros
;
};
};
...
@@ -1115,7 +1110,7 @@ template <typename Char> class float_writer {
...
@@ -1115,7 +1110,7 @@ template <typename Char> class float_writer {
int
num_digits_
;
int
num_digits_
;
int
exp_
;
int
exp_
;
size_t
size_
;
size_t
size_
;
gen_digits_params
params_
;
float_spec
params_
;
Char
decimal_point_
;
Char
decimal_point_
;
template
<
typename
It
>
It
prettify
(
It
it
)
const
{
template
<
typename
It
>
It
prettify
(
It
it
)
const
{
...
@@ -1126,7 +1121,7 @@ template <typename Char> class float_writer {
...
@@ -1126,7 +1121,7 @@ template <typename Char> class float_writer {
*
it
++
=
static_cast
<
Char
>
(
*
digits_
);
*
it
++
=
static_cast
<
Char
>
(
*
digits_
);
if
(
num_digits_
>
1
)
*
it
++
=
decimal_point_
;
if
(
num_digits_
>
1
)
*
it
++
=
decimal_point_
;
it
=
copy_str
<
Char
>
(
digits_
+
1
,
digits_
+
num_digits_
,
it
);
it
=
copy_str
<
Char
>
(
digits_
+
1
,
digits_
+
num_digits_
,
it
);
int
num_zeros
=
params_
.
num_digits
-
num_digits_
;
int
num_zeros
=
params_
.
precision
-
num_digits_
;
if
(
num_zeros
>
0
&&
params_
.
trailing_zeros
)
if
(
num_zeros
>
0
&&
params_
.
trailing_zeros
)
it
=
std
::
fill_n
(
it
,
num_zeros
,
static_cast
<
Char
>
(
'0'
));
it
=
std
::
fill_n
(
it
,
num_zeros
,
static_cast
<
Char
>
(
'0'
));
*
it
++
=
static_cast
<
Char
>
(
params_
.
upper
?
'E'
:
'e'
);
*
it
++
=
static_cast
<
Char
>
(
params_
.
upper
?
'E'
:
'e'
);
...
@@ -1138,7 +1133,7 @@ template <typename Char> class float_writer {
...
@@ -1138,7 +1133,7 @@ template <typename Char> class float_writer {
it
=
std
::
fill_n
(
it
,
full_exp
-
num_digits_
,
static_cast
<
Char
>
(
'0'
));
it
=
std
::
fill_n
(
it
,
full_exp
-
num_digits_
,
static_cast
<
Char
>
(
'0'
));
if
(
params_
.
trailing_zeros
)
{
if
(
params_
.
trailing_zeros
)
{
*
it
++
=
decimal_point_
;
*
it
++
=
decimal_point_
;
int
num_zeros
=
params_
.
num_digits
-
full_exp
;
int
num_zeros
=
params_
.
precision
-
full_exp
;
if
(
num_zeros
<=
0
)
{
if
(
num_zeros
<=
0
)
{
if
(
params_
.
format
!=
float_format
::
fixed
)
if
(
params_
.
format
!=
float_format
::
fixed
)
*
it
++
=
static_cast
<
Char
>
(
'0'
);
*
it
++
=
static_cast
<
Char
>
(
'0'
);
...
@@ -1163,17 +1158,17 @@ template <typename Char> class float_writer {
...
@@ -1163,17 +1158,17 @@ template <typename Char> class float_writer {
}
}
*
it
++
=
decimal_point_
;
*
it
++
=
decimal_point_
;
it
=
copy_str
<
Char
>
(
digits_
+
full_exp
,
digits_
+
num_digits_
,
it
);
it
=
copy_str
<
Char
>
(
digits_
+
full_exp
,
digits_
+
num_digits_
,
it
);
if
(
params_
.
num_digits
>
num_digits_
)
{
if
(
params_
.
precision
>
num_digits_
)
{
// Add trailing zeros.
// Add trailing zeros.
int
num_zeros
=
params_
.
num_digits
-
num_digits_
;
int
num_zeros
=
params_
.
precision
-
num_digits_
;
it
=
std
::
fill_n
(
it
,
num_zeros
,
static_cast
<
Char
>
(
'0'
));
it
=
std
::
fill_n
(
it
,
num_zeros
,
static_cast
<
Char
>
(
'0'
));
}
}
}
else
{
}
else
{
// 1234e-6 -> 0.001234
// 1234e-6 -> 0.001234
*
it
++
=
static_cast
<
Char
>
(
'0'
);
*
it
++
=
static_cast
<
Char
>
(
'0'
);
int
num_zeros
=
-
full_exp
;
int
num_zeros
=
-
full_exp
;
if
(
params_
.
num_digits
>=
0
&&
params_
.
num_digits
<
num_zeros
)
if
(
params_
.
precision
>=
0
&&
params_
.
precision
<
num_zeros
)
num_zeros
=
params_
.
num_digits
;
num_zeros
=
params_
.
precision
;
int
num_digits
=
num_digits_
;
int
num_digits
=
num_digits_
;
if
(
!
params_
.
trailing_zeros
)
if
(
!
params_
.
trailing_zeros
)
while
(
num_digits
>
0
&&
digits_
[
num_digits
-
1
]
==
'0'
)
--
num_digits
;
while
(
num_digits
>
0
&&
digits_
[
num_digits
-
1
]
==
'0'
)
--
num_digits
;
...
@@ -1187,21 +1182,21 @@ template <typename Char> class float_writer {
...
@@ -1187,21 +1182,21 @@ template <typename Char> class float_writer {
}
}
public:
public:
float_writer
(
const
char
*
digits
,
int
num_digits
,
int
exp
,
float_writer
(
const
char
*
digits
,
int
num_digits
,
int
exp
,
float_spec
spec
,
gen_digits_params
params
,
Char
decimal_point
)
Char
decimal_point
)
:
digits_
(
digits
),
:
digits_
(
digits
),
num_digits_
(
num_digits
),
num_digits_
(
num_digits
),
exp_
(
exp
),
exp_
(
exp
),
params_
(
params
),
params_
(
spec
),
decimal_point_
(
decimal_point
)
{
decimal_point_
(
decimal_point
)
{
int
full_exp
=
num_digits
+
exp
-
1
;
int
full_exp
=
num_digits
+
exp
-
1
;
int
precision
=
params
.
num_digits
>
0
?
params
.
num_digits
:
16
;
int
precision
=
spec
.
precision
>
0
?
spec
.
precision
:
16
;
if
(
params_
.
format
==
float_format
::
general
&&
if
(
params_
.
format
==
float_format
::
general
&&
!
(
full_exp
>=
-
4
&&
full_exp
<
precision
))
{
!
(
full_exp
>=
-
4
&&
full_exp
<
precision
))
{
params_
.
format
=
float_format
::
exp
;
params_
.
format
=
float_format
::
exp
;
}
}
size_
=
prettify
(
counting_iterator
()).
count
();
size_
=
prettify
(
counting_iterator
()).
count
();
size_
+=
params_
.
sign
?
1
:
0
;
size_
+=
spec
.
sign
?
1
:
0
;
}
}
size_t
size
()
const
{
return
size_
;
}
size_t
size
()
const
{
return
size_
;
}
...
@@ -1695,28 +1690,28 @@ template <typename Range> class basic_writer {
...
@@ -1695,28 +1690,28 @@ template <typename Range> class basic_writer {
template
<
typename
T
,
FMT_ENABLE_IF
(
std
::
is_floating_point
<
T
>
::
value
)
>
template
<
typename
T
,
FMT_ENABLE_IF
(
std
::
is_floating_point
<
T
>
::
value
)
>
void
write
(
T
value
,
format_specs
specs
=
{})
{
void
write
(
T
value
,
format_specs
specs
=
{})
{
auto
sign
=
specs
.
sign
;
float_spec
fspec
=
parse_float_type_spec
(
specs
.
type
);
fspec
.
sign
=
specs
.
sign
;
if
(
std
::
signbit
(
value
))
{
// value < 0 is false for NaN so use signbit.
if
(
std
::
signbit
(
value
))
{
// value < 0 is false for NaN so use signbit.
sign
=
sign
::
minus
;
fspec
.
sign
=
sign
::
minus
;
value
=
-
value
;
value
=
-
value
;
}
else
if
(
sign
==
sign
::
minus
)
{
}
else
if
(
fspec
.
sign
==
sign
::
minus
)
{
sign
=
sign
::
none
;
fspec
.
sign
=
sign
::
none
;
}
}
float_spec
fspec
=
parse_float_type_spec
(
specs
.
type
);
if
(
!
std
::
isfinite
(
value
))
{
if
(
!
std
::
isfinite
(
value
))
{
auto
str
=
std
::
isinf
(
value
)
?
(
fspec
.
upper
?
"INF"
:
"inf"
)
auto
str
=
std
::
isinf
(
value
)
?
(
fspec
.
upper
?
"INF"
:
"inf"
)
:
(
fspec
.
upper
?
"NAN"
:
"nan"
);
:
(
fspec
.
upper
?
"NAN"
:
"nan"
);
return
write_padded
(
specs
,
inf_or_nan_writer
<
char_type
>
{
sign
,
str
});
return
write_padded
(
specs
,
inf_or_nan_writer
<
char_type
>
{
fspec
.
sign
,
str
});
}
}
if
(
specs
.
align
==
align
::
none
)
{
if
(
specs
.
align
==
align
::
none
)
{
specs
.
align
=
align
::
right
;
specs
.
align
=
align
::
right
;
}
else
if
(
specs
.
align
==
align
::
numeric
)
{
}
else
if
(
specs
.
align
==
align
::
numeric
)
{
if
(
sign
)
{
if
(
fspec
.
sign
)
{
auto
&&
it
=
reserve
(
1
);
auto
&&
it
=
reserve
(
1
);
*
it
++
=
static_cast
<
char_type
>
(
data
::
signs
[
sign
]);
*
it
++
=
static_cast
<
char_type
>
(
data
::
signs
[
fspec
.
sign
]);
sign
=
sign
::
none
;
fspec
.
sign
=
sign
::
none
;
if
(
specs
.
width
!=
0
)
--
specs
.
width
;
if
(
specs
.
width
!=
0
)
--
specs
.
width
;
}
}
specs
.
align
=
align
::
right
;
specs
.
align
=
align
::
right
;
...
@@ -1724,7 +1719,7 @@ template <typename Range> class basic_writer {
...
@@ -1724,7 +1719,7 @@ template <typename Range> class basic_writer {
memory_buffer
buffer
;
memory_buffer
buffer
;
if
(
fspec
.
format
==
float_format
::
hex
)
{
if
(
fspec
.
format
==
float_format
::
hex
)
{
if
(
sign
)
buffer
.
push_back
(
data
::
signs
[
sign
]);
if
(
fspec
.
sign
)
buffer
.
push_back
(
data
::
signs
[
fspec
.
sign
]);
fspec
.
alt
=
specs
.
alt
;
fspec
.
alt
=
specs
.
alt
;
snprintf_float
(
promote_float
(
value
),
specs
.
precision
,
fspec
,
buffer
);
snprintf_float
(
promote_float
(
value
),
specs
.
precision
,
fspec
,
buffer
);
write_padded
(
specs
,
str_writer
<
char
>
{
buffer
.
data
(),
buffer
.
size
()});
write_padded
(
specs
,
str_writer
<
char
>
{
buffer
.
data
(),
buffer
.
size
()});
...
@@ -1732,6 +1727,11 @@ template <typename Range> class basic_writer {
...
@@ -1732,6 +1727,11 @@ template <typename Range> class basic_writer {
}
}
int
precision
=
specs
.
precision
>=
0
||
!
specs
.
type
?
specs
.
precision
:
6
;
int
precision
=
specs
.
precision
>=
0
||
!
specs
.
type
?
specs
.
precision
:
6
;
if
(
fspec
.
format
==
float_format
::
exp
)
++
precision
;
if
(
fspec
.
format
==
float_format
::
exp
)
++
precision
;
fspec
.
trailing_zeros
=
(
precision
!=
0
&&
(
!
specs
.
type
||
fspec
.
format
==
float_format
::
fixed
||
fspec
.
format
==
float_format
::
exp
))
||
specs
.
alt
;
if
(
const_check
(
std
::
is_same
<
T
,
float
>
()))
fspec
.
binary32
=
true
;
if
(
const_check
(
std
::
is_same
<
T
,
float
>
()))
fspec
.
binary32
=
true
;
fspec
.
use_grisu
=
use_grisu
<
T
>
();
fspec
.
use_grisu
=
use_grisu
<
T
>
();
if
(
const_check
(
FMT_DEPRECATED_PERCENT
)
&&
fspec
.
percent
)
value
*=
100
;
if
(
const_check
(
FMT_DEPRECATED_PERCENT
)
&&
fspec
.
percent
)
value
*=
100
;
...
@@ -1740,21 +1740,12 @@ template <typename Range> class basic_writer {
...
@@ -1740,21 +1740,12 @@ template <typename Range> class basic_writer {
buffer
.
push_back
(
'%'
);
buffer
.
push_back
(
'%'
);
--
exp
;
// Adjust decimal place position.
--
exp
;
// Adjust decimal place position.
}
}
auto
params
=
gen_digits_params
();
fspec
.
precision
=
precision
;
params
.
sign
=
sign
;
params
.
format
=
fspec
.
format
;
params
.
num_digits
=
precision
;
params
.
trailing_zeros
=
(
precision
!=
0
&&
(
!
specs
.
type
||
fspec
.
format
==
float_format
::
fixed
||
fspec
.
format
==
float_format
::
exp
))
||
specs
.
alt
;
params
.
upper
=
fspec
.
upper
;
char_type
point
=
fspec
.
locale
?
decimal_point
<
char_type
>
(
locale_
)
char_type
point
=
fspec
.
locale
?
decimal_point
<
char_type
>
(
locale_
)
:
static_cast
<
char_type
>
(
'.'
);
:
static_cast
<
char_type
>
(
'.'
);
write_padded
(
specs
,
float_writer
<
char_type
>
(
buffer
.
data
(),
write_padded
(
specs
,
float_writer
<
char_type
>
(
buffer
.
data
(),
static_cast
<
int
>
(
buffer
.
size
()),
static_cast
<
int
>
(
buffer
.
size
()),
exp
,
params
,
point
));
exp
,
fspec
,
point
));
}
}
void
write
(
char
value
)
{
void
write
(
char
value
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment