00001 #pragma once
00002
00003 namespace YAML
00004 {
00005
00006
00007
00008
00009
00010
00011
00012 #if __GNUC__ && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ <= 3))
00013
00014
00015 template <typename T>
00016 inline bool Node::Read(T& value) const {
00017 return ConvertScalar(*this, value);
00018 }
00019 #else
00020
00021 template<bool>
00022 struct read_impl;
00023
00024
00025 template<>
00026 struct read_impl<true> {
00027 template<typename T>
00028 static bool read(const Node& node, T& value) {
00029 return ConvertScalar(node, value);
00030 }
00031 };
00032
00033
00034 template<>
00035 struct read_impl<false> {
00036 template<typename T>
00037 static bool read(const Node& node, T& value) {
00038 try {
00039 node >> value;
00040 } catch(const Exception&) {
00041 return false;
00042 }
00043 return true;
00044 }
00045 };
00046
00047 namespace fallback {
00048
00049 struct flag { char c[2]; };
00050 flag Convert(...);
00051
00052 int operator,(flag, flag);
00053
00054 template<typename T>
00055 char operator,(flag, T const&);
00056
00057 char operator,(int, flag);
00058 int operator,(char, flag);
00059 }
00060
00061 template <typename T>
00062 inline bool Node::Read(T& value) const {
00063 using namespace fallback;
00064
00065 return read_impl<sizeof (fallback::flag(), Convert(std::string(), value), fallback::flag()) != 1>::read(*this, value);
00066 }
00067 #endif // done with trick
00068
00069
00070 template <typename T>
00071 inline bool ConvertScalar(const Node& node, T& value) {
00072 std::string scalar;
00073 if(!node.GetScalar(scalar))
00074 return false;
00075
00076 return Convert(scalar, value);
00077 }
00078 }