void callback(std::ios_base::event ev, std::ios_base& strm, int idx) { if (ev == std::ios_base::erase_event) { try { delete static_cast<NewFormat*>(strm.pword(idx)); strm.pword(idx) = 0; } catch (...) { } } else if (ev == std::ios_base::copyfmt_event) { NewFormat* old(static_cast<NewFormat*>(strm.pword(idx))); if (old != 0) { try { strm.pword(idx) = new NewFormat(*old); } catch (std::bad_alloc&) { } } } }
void replace_pword(std::ios_base& iob, int idx, const T& x) { iob.register_callback(callback<NewFormat>, idx); NewFormat* new_format(new NewFormat(x)); OldFormat* old_format(static_cast<OldFormat*>(iob.pword(idx))); iob.pword(idx) = new_format; delete old_format; }
// Stream format gets copied or destroyed static void my_ios_callback(std::ios_base::event ev, std::ios_base & s, int i) { print_context *p = static_cast<print_context *>(s.pword(i)); if (ev == std::ios_base::erase_event) { delete p; s.pword(i) = nullptr; } else if (ev == std::ios_base::copyfmt_event && p != nullptr) s.pword(i) = p->duplicate(); }
// Set print_context associated with stream, retain options static void set_print_context(std::ios_base & s, const print_context & c) { int i = my_ios_index(); long flags = s.iword(i); if (!(flags & callback_registered)) { s.register_callback(my_ios_callback, i); s.iword(i) = flags | callback_registered; } print_context *p = static_cast<print_context *>(s.pword(i)); unsigned options = p ? p->options : c.options; delete p; p = c.duplicate(); p->options = options; s.pword(i) = p; }
void cleanup(std::ios_base::event evt, std::ios_base& str, int idx) { if (str.iword(separatorEnabled()) && evt == std::ios_base::erase_event) { void*& p = str.pword(idx); delete static_cast<std::string*>(p); str.iword(separatorEnabled()) = false; } }
void TimeStreamFormater::setStreamInfo(std::ios_base & theStream) const { theStream.iword(ourIsFormatedFlagIndex) = true; theStream.pword(ourFormatStringIndex) = (void *) _myFormatString ; }