mirror of
https://github.com/boostorg/detail.git
synced 2025-07-31 12:57:14 +02:00
Fixed inconsistent linkage specification on MSVC. Code cleanup.
cc32906071
introduced inconsistent
BOOST_UTF8_DECL markup between function declarations and definitions,
which caused MSVC build errors. This commit fixes this.
Also, replaced unneeded BOOST_UTF8_DECL markup with inline for functions
that are only used internally. Made get_cont_octet_out_count static.
Additionally, removed duplicate octet1_modifier_table definitions
and moved it to a function-local static.
Whitespace and formatting cleanup.
Closes https://github.com/boostorg/filesystem/issues/204.
This commit is contained in:
@ -113,10 +113,11 @@ struct BOOST_SYMBOL_VISIBLE utf8_codecvt_facet :
|
|||||||
public std::codecvt<wchar_t, char, std::mbstate_t>
|
public std::codecvt<wchar_t, char, std::mbstate_t>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit utf8_codecvt_facet(std::size_t no_locale_manage=0);
|
BOOST_UTF8_DECL explicit utf8_codecvt_facet(std::size_t no_locale_manage = 0);
|
||||||
virtual ~utf8_codecvt_facet();
|
BOOST_UTF8_DECL virtual ~utf8_codecvt_facet();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual std::codecvt_base::result do_in(
|
BOOST_UTF8_DECL virtual std::codecvt_base::result do_in(
|
||||||
std::mbstate_t& state,
|
std::mbstate_t& state,
|
||||||
const char * from,
|
const char * from,
|
||||||
const char * from_end,
|
const char * from_end,
|
||||||
@ -126,7 +127,7 @@ protected:
|
|||||||
wchar_t * & to_next
|
wchar_t * & to_next
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
virtual std::codecvt_base::result do_out(
|
BOOST_UTF8_DECL virtual std::codecvt_base::result do_out(
|
||||||
std::mbstate_t & state,
|
std::mbstate_t & state,
|
||||||
const wchar_t * from,
|
const wchar_t * from,
|
||||||
const wchar_t * from_end,
|
const wchar_t * from_end,
|
||||||
@ -150,11 +151,11 @@ protected:
|
|||||||
return get_octet_count(lead_octet) - 1;
|
return get_octet_count(lead_octet) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int get_octet_count(unsigned char lead_octet);
|
BOOST_UTF8_DECL static unsigned int get_octet_count(unsigned char lead_octet);
|
||||||
|
|
||||||
// How many "continuing octets" will be needed for this word
|
// How many "continuing octets" will be needed for this word
|
||||||
// == total octets - 1.
|
// == total octets - 1.
|
||||||
int get_cont_octet_out_count(wchar_t word) const ;
|
BOOST_UTF8_DECL static int get_cont_octet_out_count(wchar_t word);
|
||||||
|
|
||||||
virtual bool do_always_noconv() const BOOST_NOEXCEPT_OR_NOTHROW {
|
virtual bool do_always_noconv() const BOOST_NOEXCEPT_OR_NOTHROW {
|
||||||
return false;
|
return false;
|
||||||
@ -178,7 +179,7 @@ protected:
|
|||||||
|
|
||||||
// How many char objects can I process to get <= max_limit
|
// How many char objects can I process to get <= max_limit
|
||||||
// wchar_t objects?
|
// wchar_t objects?
|
||||||
virtual int do_length(
|
BOOST_UTF8_DECL virtual int do_length(
|
||||||
std::mbstate_t &,
|
std::mbstate_t &,
|
||||||
const char * from,
|
const char * from,
|
||||||
const char * from_end,
|
const char * from_end,
|
||||||
|
@ -30,6 +30,19 @@ BOOST_UTF8_BEGIN_NAMESPACE
|
|||||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||||
// implementation for wchar_t
|
// implementation for wchar_t
|
||||||
|
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
inline const wchar_t * get_octet1_modifier_table() BOOST_NOEXCEPT
|
||||||
|
{
|
||||||
|
static const wchar_t octet1_modifier_table[] = {
|
||||||
|
0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
|
||||||
|
};
|
||||||
|
return octet1_modifier_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
|
||||||
BOOST_UTF8_DECL utf8_codecvt_facet::utf8_codecvt_facet(
|
BOOST_UTF8_DECL utf8_codecvt_facet::utf8_codecvt_facet(
|
||||||
std::size_t no_locale_manage
|
std::size_t no_locale_manage
|
||||||
) :
|
) :
|
||||||
@ -57,6 +70,7 @@ BOOST_UTF8_DECL std::codecvt_base::result utf8_codecvt_facet::do_in(
|
|||||||
// then mash the whole lot together. Note that each continuing
|
// then mash the whole lot together. Note that each continuing
|
||||||
// octet only uses 6 bits as unique values, so only shift by
|
// octet only uses 6 bits as unique values, so only shift by
|
||||||
// multiples of 6 to combine.
|
// multiples of 6 to combine.
|
||||||
|
const wchar_t * const octet1_modifier_table = detail::get_octet1_modifier_table();
|
||||||
while (from != from_end && to != to_end) {
|
while (from != from_end && to != to_end) {
|
||||||
|
|
||||||
// Error checking on the first octet
|
// Error checking on the first octet
|
||||||
@ -69,9 +83,6 @@ BOOST_UTF8_DECL std::codecvt_base::result utf8_codecvt_facet::do_in(
|
|||||||
// The first octet is adjusted by a value dependent upon
|
// The first octet is adjusted by a value dependent upon
|
||||||
// the number of "continuing octets" encoding the character
|
// the number of "continuing octets" encoding the character
|
||||||
const int cont_octet_count = get_cont_octet_count(*from);
|
const int cont_octet_count = get_cont_octet_count(*from);
|
||||||
const wchar_t octet1_modifier_table[] = {
|
|
||||||
0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
|
|
||||||
};
|
|
||||||
|
|
||||||
// The unsigned char conversion is necessary in case char is
|
// The unsigned char conversion is necessary in case char is
|
||||||
// signed (I learned this the hard way)
|
// signed (I learned this the hard way)
|
||||||
@ -113,8 +124,10 @@ BOOST_UTF8_DECL std::codecvt_base::result utf8_codecvt_facet::do_in(
|
|||||||
to_next = to;
|
to_next = to;
|
||||||
|
|
||||||
// Were we done converting or did we run out of destination space?
|
// Were we done converting or did we run out of destination space?
|
||||||
if(from == from_end) return std::codecvt_base::ok;
|
if (from == from_end)
|
||||||
else return std::codecvt_base::partial;
|
return std::codecvt_base::ok;
|
||||||
|
else
|
||||||
|
return std::codecvt_base::partial;
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_UTF8_DECL std::codecvt_base::result utf8_codecvt_facet::do_out(
|
BOOST_UTF8_DECL std::codecvt_base::result utf8_codecvt_facet::do_out(
|
||||||
@ -127,11 +140,7 @@ BOOST_UTF8_DECL std::codecvt_base::result utf8_codecvt_facet::do_out(
|
|||||||
char * & to_next
|
char * & to_next
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
// RG - consider merging this table with the other one
|
const wchar_t * const octet1_modifier_table = detail::get_octet1_modifier_table();
|
||||||
const wchar_t octet1_modifier_table[] = {
|
|
||||||
0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc
|
|
||||||
};
|
|
||||||
|
|
||||||
wchar_t max_wchar = (std::numeric_limits<wchar_t>::max)();
|
wchar_t max_wchar = (std::numeric_limits<wchar_t>::max)();
|
||||||
while (from != from_end && to != to_end) {
|
while (from != from_end && to != to_end) {
|
||||||
|
|
||||||
@ -145,7 +154,7 @@ BOOST_UTF8_DECL std::codecvt_base::result utf8_codecvt_facet::do_out(
|
|||||||
int cont_octet_count = get_cont_octet_out_count(*from);
|
int cont_octet_count = get_cont_octet_out_count(*from);
|
||||||
|
|
||||||
// RG - comment this formula better
|
// RG - comment this formula better
|
||||||
int shift_exponent = (cont_octet_count) * 6;
|
int shift_exponent = cont_octet_count * 6;
|
||||||
|
|
||||||
// Process the first character
|
// Process the first character
|
||||||
*to++ = static_cast<char>(octet1_modifier_table[cont_octet_count] +
|
*to++ = static_cast<char>(octet1_modifier_table[cont_octet_count] +
|
||||||
@ -172,9 +181,12 @@ BOOST_UTF8_DECL std::codecvt_base::result utf8_codecvt_facet::do_out(
|
|||||||
}
|
}
|
||||||
from_next = from;
|
from_next = from;
|
||||||
to_next = to;
|
to_next = to;
|
||||||
|
|
||||||
// Were we done or did we run out of destination space
|
// Were we done or did we run out of destination space
|
||||||
if(from == from_end) return std::codecvt_base::ok;
|
if (from == from_end)
|
||||||
else return std::codecvt_base::partial;
|
return std::codecvt_base::ok;
|
||||||
|
else
|
||||||
|
return std::codecvt_base::partial;
|
||||||
}
|
}
|
||||||
|
|
||||||
// How many char objects can I process to get <= max_limit
|
// How many char objects can I process to get <= max_limit
|
||||||
@ -220,7 +232,7 @@ BOOST_UTF8_DECL unsigned int utf8_codecvt_facet::get_octet_count(
|
|||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
template<std::size_t s>
|
template<std::size_t s>
|
||||||
BOOST_UTF8_DECL int get_cont_octet_out_count_impl(wchar_t word){
|
inline int get_cont_octet_out_count_impl(wchar_t word) {
|
||||||
if (word < 0x80) {
|
if (word < 0x80) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -231,7 +243,7 @@ BOOST_UTF8_DECL int get_cont_octet_out_count_impl(wchar_t word){
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
BOOST_UTF8_DECL int get_cont_octet_out_count_impl<4>(wchar_t word){
|
inline int get_cont_octet_out_count_impl<4>(wchar_t word) {
|
||||||
if (word < 0x80) {
|
if (word < 0x80) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -275,9 +287,10 @@ BOOST_UTF8_DECL int get_cont_octet_out_count_impl<4>(wchar_t word){
|
|||||||
// == total octets - 1.
|
// == total octets - 1.
|
||||||
BOOST_UTF8_DECL int utf8_codecvt_facet::get_cont_octet_out_count(
|
BOOST_UTF8_DECL int utf8_codecvt_facet::get_cont_octet_out_count(
|
||||||
wchar_t word
|
wchar_t word
|
||||||
) const {
|
) {
|
||||||
return detail::get_cont_octet_out_count_impl<sizeof(wchar_t)>(word);
|
return detail::get_cont_octet_out_count_impl<sizeof(wchar_t)>(word);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_UTF8_END_NAMESPACE
|
BOOST_UTF8_END_NAMESPACE
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user