/* * The MIT License (MIT) * * Copyright (C) 2013 Yanyi Wu * Copyright (C) 2023, KylinSoft Co., Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef LIMONP_STD_EXTEMSION_HPP #define LIMONP_STD_EXTEMSION_HPP #include #ifdef __APPLE__ #include #include #elif(__cplusplus >= 201103L) #include #include #elif defined _MSC_VER #include #include #else #include #include namespace std { using std::tr1::unordered_map; using std::tr1::unordered_set; } #endif #include #include #include #include #include #include namespace std { template ostream& operator << (ostream& os, const vector& v) { if(v.empty()) { return os << "[]"; } os<<"["< inline ostream& operator << (ostream& os, const vector& v) { if(v.empty()) { return os << "[]"; } os<<"[\""< ostream& operator << (ostream& os, const deque& dq) { if(dq.empty()) { return os << "[]"; } os<<"[\""< ostream& operator << (ostream& os, const pair& pr) { os << pr.first << ":" << pr.second ; return os; } template string& operator << (string& str, const T& obj) { stringstream ss; ss << obj; // call ostream& operator << (ostream& os, return str = ss.str(); } template ostream& operator << (ostream& os, const map& mp) { if(mp.empty()) { os<<"{}"; return os; } os<<'{'; typename map::const_iterator it = mp.begin(); os<<*it; it++; while(it != mp.end()) { os<<", "<<*it; it++; } os<<'}'; return os; } template ostream& operator << (ostream& os, const std::unordered_map& mp) { if(mp.empty()) { return os << "{}"; } os<<'{'; typename std::unordered_map::const_iterator it = mp.begin(); os<<*it; it++; while(it != mp.end()) { os<<", "<<*it++; } return os<<'}'; } template ostream& operator << (ostream& os, const set& st) { if(st.empty()) { os << "{}"; return os; } os<<'{'; typename set::const_iterator it = st.begin(); os<<*it; it++; while(it != st.end()) { os<<", "<<*it; it++; } os<<'}'; return os; } template bool IsIn(const ContainType& contain, const KeyType& key) { return contain.end() != contain.find(key); } template basic_string & operator << (basic_string & s, ifstream & ifs) { return s.assign((istreambuf_iterator(ifs)), istreambuf_iterator()); } template ofstream & operator << (ofstream & ofs, const basic_string& s) { ostreambuf_iterator itr (ofs); copy(s.begin(), s.end(), itr); return ofs; } } // namespace std #endif