From f2dd043daaa992003f7865aafc2c8aa8fb6b0dbb Mon Sep 17 00:00:00 2001 From: Shane Date: Sun, 14 Jul 2013 19:29:12 -0700 Subject: [PATCH] Working on type traits compatability for visual studio, not as terrible as I thought --- include/cereal/access.hpp | 6 +- include/cereal/details/traits.hpp | 739 ++++++++++++++++-------------- sandbox_vs2012.cpp | 61 +++ vs2012/vs2012.sln | 20 + vs2012/vs2012.vcxproj | 128 ++++++ vs2012/vs2012.vcxproj.filters | 171 +++++++ 6 files changed, 783 insertions(+), 342 deletions(-) create mode 100644 sandbox_vs2012.cpp create mode 100644 vs2012/vs2012.sln create mode 100644 vs2012/vs2012.vcxproj create mode 100644 vs2012/vs2012.vcxproj.filters diff --git a/include/cereal/access.hpp b/include/cereal/access.hpp index 7a4ca0ff..51f66995 100644 --- a/include/cereal/access.hpp +++ b/include/cereal/access.hpp @@ -30,6 +30,7 @@ #define CEREAL_ACCESS_HPP_ #include +#include namespace cereal { @@ -86,7 +87,7 @@ namespace cereal static void load_and_allocate(...) { } }; - + //! A class that can be made a friend to give cereal access to non public functions /*! If you desire non-public serialization functions within a class, cereal can only access these if you declare cereal::access a friend. @@ -112,6 +113,9 @@ namespace cereal static auto member_serialize(Archive & ar, T & t) -> decltype(t.serialize(ar)) { t.serialize(ar); } + //template inline + // static traits::no member_serialize(...); + template inline static auto member_save(Archive & ar, T const & t) -> decltype(t.save(ar)) { t.save(ar); } diff --git a/include/cereal/details/traits.hpp b/include/cereal/details/traits.hpp index f4890e42..75ff2fc4 100644 --- a/include/cereal/details/traits.hpp +++ b/include/cereal/details/traits.hpp @@ -40,373 +40,430 @@ namespace cereal { namespace traits { + typedef std::true_type yes; + typedef std::false_type no; + + namespace + { + //! Tests whether a type has a const member save function + template + struct has_const_member_save_impl + { + template + static auto test(int) -> decltype( cereal::access::non_member_save( std::declval(), std::declval() ) == 1, yes()); + static no test(...); + static const bool value = std::is_same(0)), yes>::value; + }; + } // end anon namespace + + template + struct has_const_member_save : std::integral_constant::value> {}; + + //! Tests whether a type has a non const member save function + namespace + { + template + struct has_non_const_member_save_impl + { + template + static auto test(int) -> decltype( cereal::access::non_const_member_save( std::declval(), std::declval() ) == 1, yes()); + static no test(...); + static const bool value = std::is_same(0)), yes>::value; + }; + } // end anon namespace + + template + struct has_non_const_member_save : std::integral_constant::value> {}; + + //! Creates a test for whether a non const member function exists + /*! This should be used to create tests for things that have access + through cereal::access adn begin with the name "member_". name will + be combined with this to create the name of the function that is tested. */ +#define CEREAL_MAKE_HAS_MEMBER_TEST(name) \ + namespace \ + { \ + template \ + struct has_member_##name##_impl \ + { \ + template \ + static auto test(int) -> decltype( cereal::access::member_##name( std::declval(), std::declval() ) == 1, yes()); \ + template \ + static no test(...); \ + static const bool value = std::is_same(0)), yes>::value; \ + }; \ + } /* end anon namespace */ \ + template \ + struct has_member_##name## : std::integral_constant::value> {}; + template struct Void { typedef void type; }; // ###################################################################### // Member load_and_allocate template - bool constexpr has_member_load_and_allocate() - { return std::is_same( std::declval() ) ), T*>::value; } + struct has_member_load_and_allocate : + std::integral_constant( std::declval() ) ), T*>::value> {}; // ###################################################################### // Non Member load_and_allocate template - bool constexpr has_non_member_load_and_allocate() - { return std::is_same::load_and_allocate( std::declval() ) ), T*>::value; } + struct has_non_member_load_and_allocate : std::integral_constant::load_and_allocate( std::declval() ) ), T*>::value> {}; // ###################################################################### // Has either a member or non member allocate template - bool constexpr has_load_and_allocate() - { return has_member_load_and_allocate() || has_non_member_load_and_allocate(); } - + struct has_load_and_allocate : std::integral_constant::value || has_non_member_load_and_allocate::value> + { }; + // ###################################################################### // Member Serialize - template - struct has_member_serialize: std::false_type {}; - - template - struct has_member_serialize< T, A, - typename Void< - decltype( access::member_serialize(std::declval(), std::declval() ) ) - >::type - >: std::true_type {}; + CEREAL_MAKE_HAS_MEMBER_TEST(serialize); // ###################################################################### // Non Member Serialize - char & serialize(...); + template char & serialize(...); template - bool constexpr has_non_member_serialize() - { return std::is_void(), std::declval()))>::value; }; + struct has_non_member_serialize : std::integral_constant(), std::declval()))>::value> {}; // ###################################################################### - // Member Load - template - struct has_member_load: std::false_type {}; - - template - struct has_member_load< T, A, - typename Void< - decltype( access::member_load(std::declval(), std::declval() ) ) - >::type - >: std::true_type {}; - - // ###################################################################### - // Non Member Load - char & load(...); - template - bool constexpr has_non_member_load() - { return std::is_void(), std::declval()))>::value; }; - - // ###################################################################### - // Member Save - template - struct has_member_save: std::false_type {}; - - template - struct has_member_save< T, A, - typename Void< - decltype( access::member_save(std::declval(), std::declval() ) ) - >::type - >: std::true_type {}; - - // ###################################################################### - // Non-const Member Save - namespace detail - { - // Detection of any (const or non const) member save - template - struct has_member_save_any: std::false_type {}; - - template - struct has_member_save_any< T, A, - typename Void< - decltype( access::non_const_member_save(std::declval(), std::declval::type &>() ) ) - >::type - >: std::true_type {}; - } - - // Returns true if we detect a member save function that is not const - template - constexpr bool is_non_const_member_save() - { - return !has_member_save() && detail::has_member_save_any(); - } - - // ###################################################################### - // Non Member Save - char & save(...); - template - bool constexpr has_non_member_save() - { return std::is_void(), std::declval()))>::value; } - - // ###################################################################### - // Non-const Non member Save - namespace detail - { - template - bool constexpr has_non_member_save_any() - { return std::is_void(), std::declval::type &>()))>::value; } - } - - // Returns true if we detect a non-member save function that is not const - template - bool constexpr is_non_const_non_member_save() - { return !has_non_member_save() && detail::has_non_member_save_any(); } - - // ###################################################################### - // Returns true if we have an invalid save function (non const) - template - bool constexpr has_non_const_save() - { return is_non_const_member_save() || is_non_const_non_member_save(); } - - // ###################################################################### - template - constexpr bool has_member_split() - { return has_member_load() && has_member_save(); } - - // ###################################################################### - template - constexpr bool has_non_member_split() - { return has_non_member_load() && has_non_member_save(); } - - // ###################################################################### - template - constexpr bool is_output_serializable() - { - static_assert( !has_non_const_save(), - "cereal detected a non const save. \n " - "save functions must either be const member functions or accept const type aguments if non-member" ); - - return - has_member_save() ^ - has_non_member_save() ^ - has_member_serialize() ^ - has_non_member_serialize(); - } - - // ###################################################################### - template - constexpr bool is_input_serializable() - { - return - has_member_load() ^ - has_non_member_load() ^ - has_member_serialize() ^ - has_non_member_serialize(); - } - - // ###################################################################### - - namespace detail - { - template - constexpr auto is_specialized_member_serialize() -> bool - { return !std::is_base_of>(); } - - template - constexpr auto is_specialized_member_load_save() -> bool - { return !std::is_base_of>(); } - - template - constexpr auto is_specialized_non_member_serialize() -> bool - { return !std::is_base_of>(); } - - template - constexpr auto is_specialized_non_member_load_save() -> bool - { return !std::is_base_of>(); } - - // Considered an error if specialization exists for more than one type - template - constexpr auto is_specialized_error() -> bool - { - return (is_specialized_member_serialize() + - is_specialized_member_load_save() + - is_specialized_non_member_serialize() + - is_specialized_non_member_load_save()) <= 1; - } - } // namespace detail - - template - constexpr auto is_specialized() -> bool - { - static_assert(detail::is_specialized_error(), "More than one explicit specialization detected for type."); - return detail::is_specialized_member_serialize() || - detail::is_specialized_member_load_save() || - detail::is_specialized_non_member_serialize() || - detail::is_specialized_non_member_load_save(); - } - - template - constexpr auto is_specialized_member_serialize() -> bool - { - static_assert( (is_specialized() && detail::is_specialized_member_serialize() && has_member_serialize()) - || !(is_specialized() && detail::is_specialized_member_serialize()), - "cereal detected member serialization specialization but no member serialize function" ); - return is_specialized() && detail::is_specialized_member_serialize(); - } - - template - constexpr auto is_specialized_member_load() -> bool - { - static_assert( (is_specialized() && detail::is_specialized_member_load_save() && has_member_load()) - || !(is_specialized() && detail::is_specialized_member_load_save()), - "cereal detected member load specialization but no member load function" ); - return is_specialized() && detail::is_specialized_member_load_save(); - } - - template - constexpr auto is_specialized_member_save() -> bool - { - static_assert( (is_specialized() && detail::is_specialized_member_load_save() && has_member_save()) - || !(is_specialized() && detail::is_specialized_member_load_save()), - "cereal detected member save specialization but no member save function" ); - return is_specialized() && detail::is_specialized_member_load_save(); - } - - template - constexpr auto is_specialized_non_member_serialize() -> bool - { - static_assert( (is_specialized() && detail::is_specialized_non_member_serialize() && has_non_member_serialize()) - || !(is_specialized() && detail::is_specialized_non_member_serialize()), - "cereal detected non-member serialization specialization but no non-member serialize function" ); - return is_specialized() && detail::is_specialized_non_member_serialize(); - } - - template - constexpr auto is_specialized_non_member_load() -> bool - { - static_assert( (is_specialized() && detail::is_specialized_non_member_load_save() && has_non_member_load()) - || !(is_specialized() && detail::is_specialized_non_member_load_save()), - "cereal detected non-member load specialization but no non-member load function" ); - return is_specialized() && detail::is_specialized_non_member_load_save(); - } - - template - constexpr auto is_specialized_non_member_save() -> bool - { - static_assert( (is_specialized() && detail::is_specialized_non_member_load_save() && has_non_member_save()) - || !(is_specialized() && detail::is_specialized_non_member_load_save()), - "cereal detected non-member save specialization but no non-member save function" ); - return is_specialized() && detail::is_specialized_non_member_load_save(); - } - - // ###################################################################### - template - constexpr size_t sizeof_array( size_t rank = std::rank::value ) - { - return rank == 0 ? 1 : std::extent::value * sizeof_array::type>( rank - 1 ); - } - - // ###################################################################### - namespace detail - { - template - struct is_empty_class_impl - { static constexpr bool value = false; }; - - template - struct is_empty_class_impl::value>::type> - { - struct S : T - { uint8_t t; }; - - static constexpr bool value = sizeof(S) == sizeof(uint8_t); - }; - - struct base_class_id - { - template - base_class_id(T const * const t) : - type(typeid(T)), - ptr(t), - hash(std::hash()(typeid(T)) ^ (std::hash()(t) << 1)) - { } - - bool operator==(base_class_id const & other) const - { return (type == other.type) && (ptr == other.ptr); } - - std::type_index type; - void const * ptr; - size_t hash; - }; - struct base_class_id_hash { size_t operator()(base_class_id const & id) const { return id.hash; } }; - } - - template - using is_empty_class = std::integral_constant::value>; - - // ###################################################################### - //! A macro to use to restrict which types of archives your function will work for. - /*! This requires you to have a template class parameter named Archive and replaces the void return - type for your function. - - INTYPE refers to the input archive type you wish to restrict on. - OUTTYPE refers to the output archive type you wish to restrict on. - - For example, if we want to limit a serialize to only work with binary serialization: - - @code{.cpp} - template - CEREAL_ARCHIVE_RESTRICT(BinaryInputArchive, BinaryOutputArchive) - serialize( Archive & ar, MyCoolType & m ) - { - ar & m; - } - @endcode - - If you need to do more restrictions in your enable_if, you will need to do this by hand. - */ - #define CEREAL_ARCHIVE_RESTRICT(INTYPE, OUTTYPE) \ - typename std::enable_if::value || std::is_same::value, void>::type + // Non Member Serialize + //char & serialize(...); + //template + //struct has_non_member_serialize : std::integral_constant(), std::declval()))>::value> + //{ }; } // namespace traits - namespace detail - { - template (), bool NonMember = traits::has_non_member_load_and_allocate()> - struct Load - { - static_assert( !sizeof(T), "Cereal detected both member and non member load_and_allocate functions!" ); - static T * load_andor_allocate( A & ar ) - { return nullptr; } - }; + // // ###################################################################### + // // Member Load + // template + // struct has_member_load: std::false_type {}; - template - struct Load - { - static_assert( std::is_default_constructible::value, - "Trying to serialize a an object with no default constructor.\n\n" - "Types must either be default constructible or define either a member or non member Construct function.\n" - "Construct functions generally have the signature:\n\n" - "template \n" - "static T * load_and_allocate(Archive & ar)\n" - "{\n" - " var a;\n" - " ar & a\n" - " return new T(a);\n" - "}\n\n" ); - static T * load_andor_allocate( A & ar ) - { return new T(); } - }; + // template + // struct has_member_load< T, A, + // typename Void< + // decltype( access::member_load(std::declval(), std::declval() ) ) + // >::type + // >: std::true_type {}; - template - struct Load - { - static T * load_andor_allocate( A & ar ) - { - return access::load_and_allocate( ar ); - } - }; + // // ###################################################################### + // // Non Member Load + // char & load(...); + // template + // bool constexpr has_non_member_load() + // { return std::is_void(), std::declval()))>::value; }; - template - struct Load - { - static T * load_andor_allocate( A & ar ) - { - return LoadAndAllocate::load_and_allocate( ar ); - } - }; - } // namespace detail + // // ###################################################################### + // // Member Save + // template + // struct has_member_save: std::false_type {}; + + // template + // struct has_member_save< T, A, + // typename Void< + // decltype( access::member_save(std::declval(), std::declval() ) ) + // >::type + // >: std::true_type {}; + + // // ###################################################################### + // // Non-const Member Save + // namespace detail + // { + // // Detection of any (const or non const) member save + // template + // struct has_member_save_any: std::false_type {}; + + // template + // struct has_member_save_any< T, A, + // typename Void< + // decltype( access::non_const_member_save(std::declval(), std::declval::type &>() ) ) + // >::type + // >: std::true_type {}; + // } + + // // Returns true if we detect a member save function that is not const + // template + // constexpr bool is_non_const_member_save() + // { + // return !has_member_save() && detail::has_member_save_any(); + // } + + // // ###################################################################### + // // Non Member Save + // char & save(...); + // template + // bool constexpr has_non_member_save() + // { return std::is_void(), std::declval()))>::value; } + + // // ###################################################################### + // // Non-const Non member Save + // namespace detail + // { + // template + // bool constexpr has_non_member_save_any() + // { return std::is_void(), std::declval::type &>()))>::value; } + // } + + // // Returns true if we detect a non-member save function that is not const + // template + // bool constexpr is_non_const_non_member_save() + // { return !has_non_member_save() && detail::has_non_member_save_any(); } + + // // ###################################################################### + // // Returns true if we have an invalid save function (non const) + // template + // bool constexpr has_non_const_save() + // { return is_non_const_member_save() || is_non_const_non_member_save(); } + + // // ###################################################################### + // template + // constexpr bool has_member_split() + // { return has_member_load() && has_member_save(); } + + // // ###################################################################### + // template + // constexpr bool has_non_member_split() + // { return has_non_member_load() && has_non_member_save(); } + + // // ###################################################################### + // template + // constexpr bool is_output_serializable() + // { + // static_assert( !has_non_const_save(), + // "cereal detected a non const save. \n " + // "save functions must either be const member functions or accept const type aguments if non-member" ); + + // return + // has_member_save() ^ + // has_non_member_save() ^ + // has_member_serialize() ^ + // has_non_member_serialize(); + // } + + // // ###################################################################### + // template + // constexpr bool is_input_serializable() + // { + // return + // has_member_load() ^ + // has_non_member_load() ^ + // has_member_serialize() ^ + // has_non_member_serialize(); + // } + + // // ###################################################################### + + // namespace detail + // { + // template + // constexpr auto is_specialized_member_serialize() -> bool + // { return !std::is_base_of>(); } + + // template + // constexpr auto is_specialized_member_load_save() -> bool + // { return !std::is_base_of>(); } + + // template + // constexpr auto is_specialized_non_member_serialize() -> bool + // { return !std::is_base_of>(); } + + // template + // constexpr auto is_specialized_non_member_load_save() -> bool + // { return !std::is_base_of>(); } + + // // Considered an error if specialization exists for more than one type + // template + // constexpr auto is_specialized_error() -> bool + // { + // return (is_specialized_member_serialize() + + // is_specialized_member_load_save() + + // is_specialized_non_member_serialize() + + // is_specialized_non_member_load_save()) <= 1; + // } + // } // namespace detail + + // template + // constexpr auto is_specialized() -> bool + // { + // static_assert(detail::is_specialized_error(), "More than one explicit specialization detected for type."); + // return detail::is_specialized_member_serialize() || + // detail::is_specialized_member_load_save() || + // detail::is_specialized_non_member_serialize() || + // detail::is_specialized_non_member_load_save(); + // } + + // template + // constexpr auto is_specialized_member_serialize() -> bool + // { + // static_assert( (is_specialized() && detail::is_specialized_member_serialize() && has_member_serialize()) + // || !(is_specialized() && detail::is_specialized_member_serialize()), + // "cereal detected member serialization specialization but no member serialize function" ); + // return is_specialized() && detail::is_specialized_member_serialize(); + // } + + // template + // constexpr auto is_specialized_member_load() -> bool + // { + // static_assert( (is_specialized() && detail::is_specialized_member_load_save() && has_member_load()) + // || !(is_specialized() && detail::is_specialized_member_load_save()), + // "cereal detected member load specialization but no member load function" ); + // return is_specialized() && detail::is_specialized_member_load_save(); + // } + + // template + // constexpr auto is_specialized_member_save() -> bool + // { + // static_assert( (is_specialized() && detail::is_specialized_member_load_save() && has_member_save()) + // || !(is_specialized() && detail::is_specialized_member_load_save()), + // "cereal detected member save specialization but no member save function" ); + // return is_specialized() && detail::is_specialized_member_load_save(); + // } + + // template + // constexpr auto is_specialized_non_member_serialize() -> bool + // { + // static_assert( (is_specialized() && detail::is_specialized_non_member_serialize() && has_non_member_serialize()) + // || !(is_specialized() && detail::is_specialized_non_member_serialize()), + // "cereal detected non-member serialization specialization but no non-member serialize function" ); + // return is_specialized() && detail::is_specialized_non_member_serialize(); + // } + + // template + // constexpr auto is_specialized_non_member_load() -> bool + // { + // static_assert( (is_specialized() && detail::is_specialized_non_member_load_save() && has_non_member_load()) + // || !(is_specialized() && detail::is_specialized_non_member_load_save()), + // "cereal detected non-member load specialization but no non-member load function" ); + // return is_specialized() && detail::is_specialized_non_member_load_save(); + // } + + // template + // constexpr auto is_specialized_non_member_save() -> bool + // { + // static_assert( (is_specialized() && detail::is_specialized_non_member_load_save() && has_non_member_save()) + // || !(is_specialized() && detail::is_specialized_non_member_load_save()), + // "cereal detected non-member save specialization but no non-member save function" ); + // return is_specialized() && detail::is_specialized_non_member_load_save(); + // } + + // // ###################################################################### + // template + // constexpr size_t sizeof_array( size_t rank = std::rank::value ) + // { + // return rank == 0 ? 1 : std::extent::value * sizeof_array::type>( rank - 1 ); + // } + + // // ###################################################################### + // namespace detail + // { + // template + // struct is_empty_class_impl + // { static constexpr bool value = false; }; + + // template + // struct is_empty_class_impl::value>::type> + // { + // struct S : T + // { uint8_t t; }; + + // static constexpr bool value = sizeof(S) == sizeof(uint8_t); + // }; + + // struct base_class_id + // { + // template + // base_class_id(T const * const t) : + // type(typeid(T)), + // ptr(t), + // hash(std::hash()(typeid(T)) ^ (std::hash()(t) << 1)) + // { } + + // bool operator==(base_class_id const & other) const + // { return (type == other.type) && (ptr == other.ptr); } + + // std::type_index type; + // void const * ptr; + // size_t hash; + // }; + // struct base_class_id_hash { size_t operator()(base_class_id const & id) const { return id.hash; } }; + // } + + // template + // using is_empty_class = std::integral_constant::value>; + + // // ###################################################################### + // //! A macro to use to restrict which types of archives your function will work for. + // /*! This requires you to have a template class parameter named Archive and replaces the void return + // type for your function. + + // INTYPE refers to the input archive type you wish to restrict on. + // OUTTYPE refers to the output archive type you wish to restrict on. + + // For example, if we want to limit a serialize to only work with binary serialization: + + // @code{.cpp} + // template + // CEREAL_ARCHIVE_RESTRICT(BinaryInputArchive, BinaryOutputArchive) + // serialize( Archive & ar, MyCoolType & m ) + // { + // ar & m; + // } + // @endcode + + // If you need to do more restrictions in your enable_if, you will need to do this by hand. + // */ + // #define CEREAL_ARCHIVE_RESTRICT(INTYPE, OUTTYPE) \ + // typename std::enable_if::value || std::is_same::value, void>::type + //} // namespace traits + + //namespace detail + //{ + // template (), bool NonMember = traits::has_non_member_load_and_allocate()> + // struct Load + // { + // static_assert( !sizeof(T), "Cereal detected both member and non member load_and_allocate functions!" ); + // static T * load_andor_allocate( A & ar ) + // { return nullptr; } + // }; + + // template + // struct Load + // { + // static_assert( std::is_default_constructible::value, + // "Trying to serialize a an object with no default constructor.\n\n" + // "Types must either be default constructible or define either a member or non member Construct function.\n" + // "Construct functions generally have the signature:\n\n" + // "template \n" + // "static T * load_and_allocate(Archive & ar)\n" + // "{\n" + // " var a;\n" + // " ar & a\n" + // " return new T(a);\n" + // "}\n\n" ); + // static T * load_andor_allocate( A & ar ) + // { return new T(); } + // }; + + // template + // struct Load + // { + // static T * load_andor_allocate( A & ar ) + // { + // return access::load_and_allocate( ar ); + // } + // }; + + // template + // struct Load + // { + // static T * load_andor_allocate( A & ar ) + // { + // return LoadAndAllocate::load_and_allocate( ar ); + // } + // }; + //} // namespace detail } // namespace cereal #endif // CEREAL_DETAILS_TRAITS_HPP_ diff --git a/sandbox_vs2012.cpp b/sandbox_vs2012.cpp new file mode 100644 index 00000000..ad480f67 --- /dev/null +++ b/sandbox_vs2012.cpp @@ -0,0 +1,61 @@ +//#include +#include + +#include +#include + +struct Archive {}; + +struct Test +{ + template + void serialize( Archive & ar ) + { + std::cout << "hey there" << std::endl; + } + + template + void save( Archive & ar ) const + { + std::cout << "saved by the bell" << std::endl; + } + + template + static Test * load_and_allocate( Archive & ar ) + { } +}; + +template +void serialize( Archive & ar, Test & t ) +{ } + +//namespace cereal +//{ +// template <> +// struct LoadAndAllocate +// { +// template +// static Test * load_and_allocate( Archive & ar ) +// { } +// }; +//} + +int main() +{ + std::cout << std::boolalpha; + //std::cout << cereal::traits::has_member_serialize::value << std::endl; + + Test t; Archive a; + + // Test Load and Allocate internal/external + std::cout << "load_and_allocate" << std::endl; + std::cout << cereal::traits::has_member_load_and_allocate::value << std::endl; + std::cout << cereal::traits::has_non_member_load_and_allocate::value << std::endl; + + // serialize + std::cout << "serialize" << std::endl; + std::cout << cereal::traits::has_member_serialize::value << std::endl; + std::cout << cereal::traits::has_non_member_serialize::value << std::endl; + + return 0; +} \ No newline at end of file diff --git a/vs2012/vs2012.sln b/vs2012/vs2012.sln new file mode 100644 index 00000000..4ebe652c --- /dev/null +++ b/vs2012/vs2012.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vs2012", "vs2012.vcxproj", "{097C6C5A-7E3A-4831-A32C-B76BC5BD2315}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {097C6C5A-7E3A-4831-A32C-B76BC5BD2315}.Debug|Win32.ActiveCfg = Debug|Win32 + {097C6C5A-7E3A-4831-A32C-B76BC5BD2315}.Debug|Win32.Build.0 = Debug|Win32 + {097C6C5A-7E3A-4831-A32C-B76BC5BD2315}.Release|Win32.ActiveCfg = Release|Win32 + {097C6C5A-7E3A-4831-A32C-B76BC5BD2315}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/vs2012/vs2012.vcxproj b/vs2012/vs2012.vcxproj new file mode 100644 index 00000000..88c7d2fd --- /dev/null +++ b/vs2012/vs2012.vcxproj @@ -0,0 +1,128 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {097C6C5A-7E3A-4831-A32C-B76BC5BD2315} + vs2012 + + + + Application + true + v120_CTP_Nov2012 + MultiByte + + + Application + false + v120_CTP_Nov2012 + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\include;$(IncludePath) + + + $(SolutionDir)\..\include;$(IncludePath) + + + + Level3 + Disabled + true + + + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vs2012/vs2012.vcxproj.filters b/vs2012/vs2012.vcxproj.filters new file mode 100644 index 00000000..9092fd90 --- /dev/null +++ b/vs2012/vs2012.vcxproj.filters @@ -0,0 +1,171 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file