Format::ItemGroup::ItemGroup(std::basic_ifstream<Char> &from, const String &nam) : Item(nam) //Deserialize { String n; int c; items_t::size_type size; from.read((Char*)&size, sizeof(size)/sizeof(Char)); for(items_t::size_type i = 0; i < size; ++i) { for(n.clear(); c = from.get(); n += char(c)); if((c = from.get()) == ItemGroup::TypeID) { items.push_back(new ItemGroup(from, n)); } else if(c == Integer::TypeID) { items.push_back(new Integer(from, n)); } else if(c == Float::TypeID) { items.push_back(new Float(from, n)); } else if(c == Str::TypeID) { items.push_back(new Str(from, n)); } else if(c == Raw::TypeID) { items.push_back(new Raw(from, n)); } else { throw this; } } }
template<typename CharType>void skip_utf8_bom(std::basic_ifstream<CharType>& fs) { int dst[3]; for (auto& i : dst) i = fs.get(); constexpr int utf8[] = { 0xEF, 0xBB, 0xBF }; if (!std::equal(std::begin(dst), std::end(dst), utf8)) fs.seekg(0); }