void print_func_directives(Output& out, const FuncInfo& finfo) { const Func* func = finfo.func; if (auto const niters = func->numIterators()) { out.fmtln(".numiters {};", niters); } if (func->numNamedLocals() > func->numParams()) { std::vector<std::string> locals; for (int i = func->numParams(); i < func->numNamedLocals(); i++) { locals.push_back(loc_name(finfo, i)); } out.fmtln(".declvars {};", folly::join(" ", locals)); } }
std::string func_param_list(const FuncInfo& finfo) { auto ret = std::string{}; auto const func = finfo.func; for (auto i = uint32_t{0}; i < func->numParams(); ++i) { if (i != 0) ret += ", "; if (func->byRef(i)) ret += "&"; ret += folly::format("${}", loc_name(finfo, i)).str(); if (func->params()[i].hasDefaultValue()) { auto const off = func->params()[i].funcletOff(); ret += folly::format(" = {}", jmp_label(finfo, off)).str(); if (auto const code = func->params()[i].phpCode()) { ret += folly::format("({})", escaped_long(code)).str(); } } } return ret; }
int main() { std::ios ios(0); std::string loc_name("en_US"); ios.imbue(std::locale(ios.getloc(), new std::moneypunct_byname<char, false>(loc_name))); ios.imbue(std::locale(ios.getloc(), new std::moneypunct_byname<char, true>(loc_name))); ios.imbue(std::locale(ios.getloc(), new std::moneypunct_byname<wchar_t, false>(loc_name))); ios.imbue(std::locale(ios.getloc(), new std::moneypunct_byname<wchar_t, true>(loc_name))); { const my_facet f(1); // char, national { // zero long double v = 0; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "0.00"); } { // negative one long double v = -1; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-0.01"); } { // positive long double v = 123456789; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "1,234,567.89"); } { // negative long double v = -123456789; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-1,234,567.89"); } { // zero, showbase long double v = 0; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "$0.00"); } { // negative one, showbase long double v = -1; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-$0.01"); } { // positive, showbase long double v = 123456789; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "$1,234,567.89"); } { // negative, showbase long double v = -123456789; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-$1,234,567.89"); } { // negative, showbase, left long double v = -123456789; showbase(ios); ios.width(20); left(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, ' ', v); std::string ex(str, iter.base()); assert(ex == "-$1,234,567.89 "); assert(ios.width() == 0); } { // negative, showbase, internal long double v = -123456789; showbase(ios); ios.width(20); internal(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, ' ', v); std::string ex(str, iter.base()); assert(ex == "-$ 1,234,567.89"); assert(ios.width() == 0); } { // negative, showbase, right long double v = -123456789; showbase(ios); ios.width(20); right(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, ' ', v); std::string ex(str, iter.base()); assert(ex == " -$1,234,567.89"); assert(ios.width() == 0); } // char, international noshowbase(ios); ios.unsetf(std::ios_base::adjustfield); { // zero long double v = 0; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "0.00"); } { // negative one long double v = -1; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-0.01"); } { // positive long double v = 123456789; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "1,234,567.89"); } { // negative long double v = -123456789; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-1,234,567.89"); } { // zero, showbase long double v = 0; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "USD 0.00"); } { // negative one, showbase long double v = -1; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-USD 0.01"); } { // positive, showbase long double v = 123456789; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "USD 1,234,567.89"); } { // negative, showbase long double v = -123456789; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-USD 1,234,567.89"); } { // negative, showbase, left long double v = -123456789; showbase(ios); ios.width(20); left(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, ' ', v); std::string ex(str, iter.base()); assert(ex == "-USD 1,234,567.89 "); assert(ios.width() == 0); } { // negative, showbase, internal long double v = -123456789; showbase(ios); ios.width(20); internal(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, ' ', v); std::string ex(str, iter.base()); assert(ex == "-USD 1,234,567.89"); assert(ios.width() == 0); } { // negative, showbase, right long double v = -123456789; showbase(ios); ios.width(20); right(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, ' ', v); std::string ex(str, iter.base()); assert(ex == " -USD 1,234,567.89"); assert(ios.width() == 0); } } { const my_facetw f(1); // wchar_t, national noshowbase(ios); ios.unsetf(std::ios_base::adjustfield); { // zero long double v = 0; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"0.00"); } { // negative one long double v = -1; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-0.01"); } { // positive long double v = 123456789; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"1,234,567.89"); } { // negative long double v = -123456789; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-1,234,567.89"); } { // zero, showbase long double v = 0; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"$0.00"); } { // negative one, showbase long double v = -1; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-$0.01"); } { // positive, showbase long double v = 123456789; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"$1,234,567.89"); } { // negative, showbase long double v = -123456789; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-$1,234,567.89"); } { // negative, showbase, left long double v = -123456789; showbase(ios); ios.width(20); left(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, ' ', v); std::wstring ex(str, iter.base()); assert(ex == L"-$1,234,567.89 "); assert(ios.width() == 0); } { // negative, showbase, internal long double v = -123456789; showbase(ios); ios.width(20); internal(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, ' ', v); std::wstring ex(str, iter.base()); assert(ex == L"-$ 1,234,567.89"); assert(ios.width() == 0); } { // negative, showbase, right long double v = -123456789; showbase(ios); ios.width(20); right(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, ' ', v); std::wstring ex(str, iter.base()); assert(ex == L" -$1,234,567.89"); assert(ios.width() == 0); } // wchar_t, international noshowbase(ios); ios.unsetf(std::ios_base::adjustfield); { // zero long double v = 0; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"0.00"); } { // negative one long double v = -1; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-0.01"); } { // positive long double v = 123456789; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"1,234,567.89"); } { // negative long double v = -123456789; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-1,234,567.89"); } { // zero, showbase long double v = 0; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"USD 0.00"); } { // negative one, showbase long double v = -1; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-USD 0.01"); } { // positive, showbase long double v = 123456789; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"USD 1,234,567.89"); } { // negative, showbase long double v = -123456789; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-USD 1,234,567.89"); } { // negative, showbase, left long double v = -123456789; showbase(ios); ios.width(20); left(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, ' ', v); std::wstring ex(str, iter.base()); assert(ex == L"-USD 1,234,567.89 "); assert(ios.width() == 0); } { // negative, showbase, internal long double v = -123456789; showbase(ios); ios.width(20); internal(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, ' ', v); std::wstring ex(str, iter.base()); assert(ex == L"-USD 1,234,567.89"); assert(ios.width() == 0); } { // negative, showbase, right long double v = -123456789; showbase(ios); ios.width(20); right(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, ' ', v); std::wstring ex(str, iter.base()); assert(ex == L" -USD 1,234,567.89"); assert(ios.width() == 0); } } }
void print_instr(Output& out, const FuncInfo& finfo, PC pc) { auto const startPc = pc; auto rel_label = [&] (Offset off) { auto const tgt = startPc - finfo.unit->at(0) + off; return jmp_label(finfo, tgt); }; auto print_minstr = [&] { auto const immVec = ImmVector::createFromStream(pc); pc += immVec.size() + sizeof(int32_t) + sizeof(int32_t); auto vec = immVec.vec(); auto const lcode = static_cast<LocationCode>(*vec++); out.fmt(" <{}", locationCodeString(lcode)); if (numLocationCodeImms(lcode)) { always_assert(numLocationCodeImms(lcode) == 1); out.fmt(":${}", loc_name(finfo, decodeVariableSizeImm(&vec))); } while (vec < pc) { auto const mcode = static_cast<MemberCode>(*vec++); out.fmt(" {}", memberCodeString(mcode)); auto const imm = [&] { return decodeMemberCodeImm(&vec, mcode); }; switch (memberCodeImmType(mcode)) { case MCodeImm::None: break; case MCodeImm::Local: out.fmt(":${}", loc_name(finfo, imm())); break; case MCodeImm::String: out.fmt(":{}", escaped(finfo.unit->lookupLitstrId(imm()))); break; case MCodeImm::Int: out.fmt(":{}", imm()); break; } } assert(vec == pc); out.fmt(">"); }; auto print_switch = [&] { auto const vecLen = decode<int32_t>(pc); out.fmt(" <"); for (auto i = int32_t{0}; i < vecLen; ++i) { auto const off = decode<Offset>(pc); FTRACE(1, "sw label: {}\n", off); out.fmt("{}{}", i != 0 ? " " : "", rel_label(off)); } out.fmt(">"); }; auto print_sswitch = [&] { auto const vecLen = decode<int32_t>(pc); out.fmt(" <"); for (auto i = int32_t{0}; i < vecLen; ++i) { auto const strId = decode<Id>(pc); auto const offset = decode<Offset>(pc); out.fmt("{}{}:{}", i != 0 ? " " : "", strId == -1 ? "-" : escaped(finfo.unit->lookupLitstrId(strId)), rel_label(offset) ); } out.fmt(">"); }; auto print_itertab = [&] { auto const vecLen = decode<int32_t>(pc); out.fmt(" <"); for (auto i = int32_t{0}; i < vecLen; ++i) { auto const kind = static_cast<IterKind>(decode<int32_t>(pc)); auto const id = decode<int32_t>(pc); auto const kindStr = [&]() -> const char* { switch (kind) { case KindOfIter: return "(Iter)"; case KindOfMIter: return "(MIter)"; case KindOfCIter: return "(CIter)"; } not_reached(); }(); out.fmt("{}{} {}", i != 0 ? ", " : "", kindStr, id); } out.fmt(">"); }; auto print_stringvec = [&] { auto const vecLen = decode<int32_t>(pc); out.fmt(" <"); for (auto i = uint32_t{0}; i < vecLen; ++i) { auto const str = finfo.unit->lookupLitstrId(decode<int32_t>(pc)); out.fmt("{}{}", i != 0 ? " " : "", escaped(str)); } out.fmt(">"); }; #define IMM_MA print_minstr(); #define IMM_BLA print_switch(); #define IMM_SLA print_sswitch(); #define IMM_ILA print_itertab(); #define IMM_IVA out.fmt(" {}", decodeVariableSizeImm(&pc)); #define IMM_I64A out.fmt(" {}", decode<int64_t>(pc)); #define IMM_LA out.fmt(" ${}", loc_name(finfo, decodeVariableSizeImm(&pc))); #define IMM_IA out.fmt(" {}", decodeVariableSizeImm(&pc)); #define IMM_DA out.fmt(" {}", decode<double>(pc)); #define IMM_SA out.fmt(" {}", \ escaped(finfo.unit->lookupLitstrId(decode<Id>(pc)))); #define IMM_AA out.fmt(" @A_{}", decode<Id>(pc)); #define IMM_BA out.fmt(" {}", rel_label(decode<Offset>(pc))); #define IMM_OA(ty) out.fmt(" {}", \ subopToName(static_cast<ty>(decode<uint8_t>(pc)))); #define IMM_VSA print_stringvec(); #define IMM_NA #define IMM_ONE(x) IMM_##x #define IMM_TWO(x,y) IMM_ONE(x) IMM_ONE(y) #define IMM_THREE(x,y,z) IMM_TWO(x,y) IMM_ONE(z) #define IMM_FOUR(x,y,z,l) IMM_THREE(x,y,z) IMM_ONE(l) out.indent(); #define O(opcode, imms, ...) \ case Op::opcode: \ ++pc; \ out.fmt("{}", #opcode); \ IMM_##imms \ break; switch (*reinterpret_cast<const Op*>(pc)) { OPCODES } #undef O assert(pc == startPc + instrLen(reinterpret_cast<const Op*>(startPc))); #undef IMM_NA #undef IMM_ONE #undef IMM_TWO #undef IMM_THREE #undef IMM_FOUR #undef IMM_MA #undef IMM_BLA #undef IMM_SLA #undef IMM_ILA #undef IMM_IVA #undef IMM_I64A #undef IMM_LA #undef IMM_IA #undef IMM_DA #undef IMM_SA #undef IMM_AA #undef IMM_BA #undef IMM_OA #undef IMM_VSA out.nl(); }
int main(int, char**) { std::ios ios(0); std::string loc_name(LOCALE_ru_RU_UTF_8); ios.imbue(std::locale(ios.getloc(), new std::moneypunct_byname<char, false>(loc_name))); ios.imbue(std::locale(ios.getloc(), new std::moneypunct_byname<char, true>(loc_name))); ios.imbue(std::locale(ios.getloc(), new std::moneypunct_byname<wchar_t, false>(loc_name))); ios.imbue(std::locale(ios.getloc(), new std::moneypunct_byname<wchar_t, true>(loc_name))); { const my_facet f(1); // char, national { // zero long double v = 0; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "0,00 "); } { // negative one long double v = -1; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-0,01 "); } { // positive long double v = 123456789; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "1 234 567,89 "); } { // negative long double v = -123456789; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-1 234 567,89 "); } { // zero, showbase long double v = 0; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "0,00 \xD1\x80\xD1\x83\xD0\xB1""."); } { // negative one, showbase long double v = -1; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-0,01 \xD1\x80\xD1\x83\xD0\xB1""."); } { // positive, showbase long double v = 123456789; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "1 234 567,89 \xD1\x80\xD1\x83\xD0\xB1""."); } { // negative, showbase long double v = -123456789; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-1 234 567,89 \xD1\x80\xD1\x83\xD0\xB1""."); } { // negative, showbase, left long double v = -123456789; showbase(ios); ios.width(20); left(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, ' ', v); std::string ex(str, iter.base()); assert(ex == "-1 234 567,89 \xD1\x80\xD1\x83\xD0\xB1""."); assert(ios.width() == 0); } { // negative, showbase, internal long double v = -123456789; showbase(ios); ios.width(20); internal(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, ' ', v); std::string ex(str, iter.base()); assert(ex == "-1 234 567,89 \xD1\x80\xD1\x83\xD0\xB1""."); assert(ios.width() == 0); } { // negative, showbase, right long double v = -123456789; showbase(ios); ios.width(20); right(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), false, ios, ' ', v); std::string ex(str, iter.base()); assert(ex == "-1 234 567,89 \xD1\x80\xD1\x83\xD0\xB1""."); assert(ios.width() == 0); } // char, international noshowbase(ios); ios.unsetf(std::ios_base::adjustfield); { // zero long double v = 0; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "0,00 "); } { // negative one long double v = -1; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-0,01 "); } { // positive long double v = 123456789; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "1 234 567,89 "); } { // negative long double v = -123456789; char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-1 234 567,89 "); } { // zero, showbase long double v = 0; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "0,00 RUB "); } { // negative one, showbase long double v = -1; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-0,01 RUB "); } { // positive, showbase long double v = 123456789; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "1 234 567,89 RUB "); } { // negative, showbase long double v = -123456789; showbase(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, '*', v); std::string ex(str, iter.base()); assert(ex == "-1 234 567,89 RUB "); } { // negative, showbase, left long double v = -123456789; showbase(ios); ios.width(20); left(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, ' ', v); std::string ex(str, iter.base()); assert(ex == "-1 234 567,89 RUB "); assert(ios.width() == 0); } { // negative, showbase, internal long double v = -123456789; showbase(ios); ios.width(20); internal(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, ' ', v); std::string ex(str, iter.base()); assert(ex == "-1 234 567,89 RUB "); assert(ios.width() == 0); } { // negative, showbase, right long double v = -123456789; showbase(ios); ios.width(20); right(ios); char str[100]; output_iterator<char*> iter = f.put(output_iterator<char*>(str), true, ios, ' ', v); std::string ex(str, iter.base()); assert(ex == " -1 234 567,89 RUB "); assert(ios.width() == 0); } } { const my_facetw f(1); // wchar_t, national noshowbase(ios); ios.unsetf(std::ios_base::adjustfield); { // zero long double v = 0; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"0,00 "); } { // negative one long double v = -1; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-0,01 "); } { // positive long double v = 123456789; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"1 234 567,89 "); } { // negative long double v = -123456789; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-1 234 567,89 "); } { // zero, showbase long double v = 0; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"0,00 \x440\x443\x431""."); } { // negative one, showbase long double v = -1; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-0,01 \x440\x443\x431""."); } { // positive, showbase long double v = 123456789; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"1 234 567,89 \x440\x443\x431""."); } { // negative, showbase long double v = -123456789; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-1 234 567,89 \x440\x443\x431""."); } { // negative, showbase, left long double v = -123456789; showbase(ios); ios.width(20); left(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, ' ', v); std::wstring ex(str, iter.base()); assert(ex == L"-1 234 567,89 \x440\x443\x431"". "); assert(ios.width() == 0); } { // negative, showbase, internal long double v = -123456789; showbase(ios); ios.width(20); internal(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, ' ', v); std::wstring ex(str, iter.base()); assert(ex == L"-1 234 567,89 \x440\x443\x431""."); assert(ios.width() == 0); } { // negative, showbase, right long double v = -123456789; showbase(ios); ios.width(20); right(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), false, ios, ' ', v); std::wstring ex(str, iter.base()); assert(ex == L" -1 234 567,89 \x440\x443\x431""."); assert(ios.width() == 0); } // wchar_t, international noshowbase(ios); ios.unsetf(std::ios_base::adjustfield); { // zero long double v = 0; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"0,00 "); } { // negative one long double v = -1; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-0,01 "); } { // positive long double v = 123456789; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"1 234 567,89 "); } { // negative long double v = -123456789; wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-1 234 567,89 "); } { // zero, showbase long double v = 0; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"0,00 RUB "); } { // negative one, showbase long double v = -1; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-0,01 RUB "); } { // positive, showbase long double v = 123456789; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"1 234 567,89 RUB "); } { // negative, showbase long double v = -123456789; showbase(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, '*', v); std::wstring ex(str, iter.base()); assert(ex == L"-1 234 567,89 RUB "); } { // negative, showbase, left long double v = -123456789; showbase(ios); ios.width(20); left(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, ' ', v); std::wstring ex(str, iter.base()); assert(ex == L"-1 234 567,89 RUB "); assert(ios.width() == 0); } { // negative, showbase, internal long double v = -123456789; showbase(ios); ios.width(20); internal(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, ' ', v); std::wstring ex(str, iter.base()); assert(ex == L"-1 234 567,89 RUB "); assert(ios.width() == 0); } { // negative, showbase, right long double v = -123456789; showbase(ios); ios.width(20); right(ios); wchar_t str[100]; output_iterator<wchar_t*> iter = f.put(output_iterator<wchar_t*>(str), true, ios, ' ', v); std::wstring ex(str, iter.base()); assert(ex == L" -1 234 567,89 RUB "); assert(ios.width() == 0); } } return 0; }
int main() { std::ios ios(0); std::string loc_name(LOCALE_zh_CN_UTF_8); ios.imbue(std::locale(ios.getloc(), new std::moneypunct_byname<char, false>(loc_name))); ios.imbue(std::locale(ios.getloc(), new std::moneypunct_byname<char, true>(loc_name))); ios.imbue(std::locale(ios.getloc(), new std::moneypunct_byname<wchar_t, false>(loc_name))); ios.imbue(std::locale(ios.getloc(), new std::moneypunct_byname<wchar_t, true>(loc_name))); { const my_facet f(1); // char, national { // zero std::string v = "0.00"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 0); } { // negative one std::string v = "-0.01"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -1); } { // positive std::string v = "1,234,567.89"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 123456789); } { // negative std::string v = "-1,234,567.89"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -123456789); } { // negative std::string v = "-1234567.89"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -123456789); } { // zero, showbase std::string v = "\xEF\xBF\xA5""0.00"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 0); } { // zero, showbase std::string v = "\xEF\xBF\xA5""0.00"; showbase(ios); typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 0); noshowbase(ios); } { // negative one, showbase std::string v = "\xEF\xBF\xA5""-0.01"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -1); } { // negative one, showbase std::string v = "\xEF\xBF\xA5""-0.01"; showbase(ios); typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -1); noshowbase(ios); } { // positive, showbase std::string v = "\xEF\xBF\xA5""1,234,567.89"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 123456789); } { // positive, showbase std::string v = "\xEF\xBF\xA5""1,234,567.89"; showbase(ios); typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 123456789); noshowbase(ios); } { // negative, showbase std::string v = "\xEF\xBF\xA5""-1,234,567.89"; showbase(ios); typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -123456789); noshowbase(ios); } { // negative, showbase std::string v = "CNY -1,234,567.89"; showbase(ios); typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + 0); assert(err == std::ios_base::failbit); noshowbase(ios); } { // negative, showbase std::string v = "CNY -1,234,567.89"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + 0); assert(err == std::ios_base::failbit); } } { const my_facet f(1); // char, international { // zero std::string v = "0.00"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 0); } { // negative one std::string v = "-0.01"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -1); } { // positive std::string v = "1,234,567.89"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 123456789); } { // negative std::string v = "-1,234,567.89"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -123456789); } { // negative std::string v = "-1234567.89"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -123456789); } { // zero, showbase std::string v = "CNY 0.00"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 0); } { // zero, showbase std::string v = "CNY 0.00"; showbase(ios); typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 0); noshowbase(ios); } { // negative one, showbase std::string v = "CNY -0.01"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -1); } { // negative one, showbase std::string v = "CNY -0.01"; showbase(ios); typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -1); noshowbase(ios); } { // positive, showbase std::string v = "CNY 1,234,567.89"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 123456789); } { // positive, showbase std::string v = "CNY 1,234,567.89"; showbase(ios); typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 123456789); noshowbase(ios); } { // negative, showbase std::string v = "CNY -1,234,567.89"; showbase(ios); typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -123456789); noshowbase(ios); } { // negative, showbase std::string v = "\xEF\xBF\xA5""-1,234,567.89"; showbase(ios); typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + 0); assert(err == std::ios_base::failbit); noshowbase(ios); } { // negative, showbase std::string v = "\xEF\xBF\xA5""-1,234,567.89"; typedef input_iterator<const char*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + 0); assert(err == std::ios_base::failbit); } } { const my_facetw f(1); // wchar_t, national { // zero std::wstring v = L"0.00"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 0); } { // negative one std::wstring v = L"-0.01"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -1); } { // positive std::wstring v = L"1,234,567.89"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 123456789); } { // negative std::wstring v = L"-1,234,567.89"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -123456789); } { // negative std::wstring v = L"-1234567.89"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -123456789); } { // zero, showbase std::wstring v = L"\xFFE5""0.00"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 0); } { // zero, showbase std::wstring v = L"\xFFE5""0.00"; showbase(ios); typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 0); noshowbase(ios); } { // negative one, showbase std::wstring v = L"\xFFE5""-0.01"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -1); } { // negative one, showbase std::wstring v = L"\xFFE5""-0.01"; showbase(ios); typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -1); noshowbase(ios); } { // positive, showbase std::wstring v = L"\xFFE5""1,234,567.89"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 123456789); } { // positive, showbase std::wstring v = L"\xFFE5""1,234,567.89"; showbase(ios); typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 123456789); noshowbase(ios); } { // negative, showbase std::wstring v = L"\xFFE5""-1,234,567.89"; showbase(ios); typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -123456789); noshowbase(ios); } { // negative, showbase std::wstring v = L"CNY -1,234,567.89"; showbase(ios); typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + 0); assert(err == std::ios_base::failbit); noshowbase(ios); } { // negative, showbase std::wstring v = L"CNY -1,234,567.89"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), false, ios, err, ex); assert(iter.base() == v.data() + 0); assert(err == std::ios_base::failbit); } } { const my_facetw f(1); // wchar_t, international { // zero std::wstring v = L"0.00"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 0); } { // negative one std::wstring v = L"-0.01"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -1); } { // positive std::wstring v = L"1,234,567.89"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 123456789); } { // negative std::wstring v = L"-1,234,567.89"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -123456789); } { // negative std::wstring v = L"-1234567.89"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -123456789); } { // zero, showbase std::wstring v = L"CNY 0.00"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 0); } { // zero, showbase std::wstring v = L"CNY 0.00"; showbase(ios); typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 0); noshowbase(ios); } { // negative one, showbase std::wstring v = L"CNY -0.01"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -1); } { // negative one, showbase std::wstring v = L"CNY -0.01"; showbase(ios); typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -1); noshowbase(ios); } { // positive, showbase std::wstring v = L"CNY 1,234,567.89"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 123456789); } { // positive, showbase std::wstring v = L"CNY 1,234,567.89"; showbase(ios); typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == 123456789); noshowbase(ios); } { // negative, showbase std::wstring v = L"CNY -1,234,567.89"; showbase(ios); typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + v.size()); assert(err == std::ios_base::eofbit); assert(ex == -123456789); noshowbase(ios); } { // negative, showbase std::wstring v = L"\xFFE5""-1,234,567.89"; showbase(ios); typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + 0); assert(err == std::ios_base::failbit); noshowbase(ios); } { // negative, showbase std::wstring v = L"\xFFE5""-1,234,567.89"; typedef input_iterator<const wchar_t*> I; long double ex; std::ios_base::iostate err = std::ios_base::goodbit; I iter = f.get(I(v.data()), I(v.data() + v.size()), true, ios, err, ex); assert(iter.base() == v.data() + 0); assert(err == std::ios_base::failbit); } } }