#pragma once // Note : std::vector, std::list, std::map¿¡¼­¸¸ µ¿ÀÛÀ» º¸Áõ. // ´Ù¸¥ ÄÁÅ×À̳ʿ¡¼­´Â Å×½ºÆ®¸¦ ÇØº¸°í »ç¿ëÇØ¾ß ÇÑ´Ù. // struct YES {}; struct NO {}; template struct is_ptr { enum { result = false }; typedef NO Result; }; template struct is_ptr { enum { result = true }; typedef YES Result; }; template struct is_ptr { enum { result = true }; typedef YES Result; }; template struct is_ptr { enum { result = true }; typedef YES Result; }; template struct is_ptr { enum { result = true }; typedef YES Result; }; template class is_pair { private: template struct is_pair_imp { enum { value = false }; typedef NO Result; }; template struct is_pair_imp < std::pair > { enum { value = true }; typedef YES Result; }; public: enum { value = is_pair_imp::value }; typedef typename is_pair_imp::Result Result; }; template struct do_delete {}; template <> struct do_delete { template void operator()(U param) { delete param; } }; template <> struct do_delete { template void operator()(U param) {} }; template struct delete_if_imp {}; template <> struct delete_if_imp { template void operator()(C& con, P comp) { do_delete< is_ptr::Result > doDelete; for (C::iterator itr(con.begin()); itr != con.end();) { if (comp(itr->second)) { doDelete(itr->second); con.erase(itr++); } else ++itr; } } }; template <> struct delete_if_imp { template void operator()(C& con, P comp) { do_delete< is_ptr::Result > doDelete; for (C::iterator itr(con.begin()); itr != con.end();) { if (comp(*itr)) { doDelete(*itr); itr = con.erase(itr); } else ++itr; } } }; template inline void delete_if(C& con, P comp) { delete_if_imp< is_pair::Result > imp; imp(con, comp); }