From 5de934285e9abc6368da4185f4825c84d1ac498b Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Tue, 25 Apr 2017 00:34:43 +0200 Subject: [PATCH] Over-matching template operators << and >> replaced with variants for selected data-types only --- include/MSICALib.h | 67 +++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/include/MSICALib.h b/include/MSICALib.h index d1f61e8..0ed95b9 100644 --- a/include/MSICALib.h +++ b/include/MSICALib.h @@ -621,7 +621,7 @@ public: friend inline BOOL operator <<(CStream &f, const COpList &list); friend inline BOOL operator >>(CStream &f, COpList &list); -protected: +public: enum OPERATION { OP_ROLLBACK_ENABLE = 1, OP_FILE_DELETE, @@ -760,35 +760,48 @@ namespace MSICA { // Inline operators //////////////////////////////////////////////////////////////////////////// -template -inline BOOL operator <<(CStream &f, const T &val) -{ - DWORD dwWritten; - - if (!::WriteFile(f, &val, sizeof(T), &dwWritten, NULL)) return FALSE; - if (dwWritten != sizeof(T)) { - ::SetLastError(ERROR_WRITE_FAULT); - return FALSE; - } - - return TRUE; +#define MSICALIB_STREAM_DATA(T) \ +inline BOOL operator <<(CStream &f, const T &val) \ +{ \ + DWORD dwWritten; \ + \ + if (!::WriteFile(f, &val, sizeof(T), &dwWritten, NULL)) return FALSE; \ + if (dwWritten != sizeof(T)) { \ + ::SetLastError(ERROR_WRITE_FAULT); \ + return FALSE; \ + } \ + \ + return TRUE; \ +} \ + \ +inline BOOL operator >>(CStream &f, T &val) \ +{ \ + DWORD dwRead; \ + \ + if (!::ReadFile(f, &val, sizeof(T), &dwRead, NULL)) return FALSE; \ + if (dwRead != sizeof(T)) { \ + ::SetLastError(ERROR_READ_FAULT); \ + return FALSE; \ + } \ + \ + return TRUE; \ } +MSICALIB_STREAM_DATA(short) +MSICALIB_STREAM_DATA(unsigned short) +MSICALIB_STREAM_DATA(long) +MSICALIB_STREAM_DATA(unsigned long) +MSICALIB_STREAM_DATA(int) +MSICALIB_STREAM_DATA(size_t) +#ifndef _WIN64 +MSICALIB_STREAM_DATA(DWORDLONG) +#endif +MSICALIB_STREAM_DATA(HKEY) +MSICALIB_STREAM_DATA(GUID) +MSICALIB_STREAM_DATA(TASK_TRIGGER) +MSICALIB_STREAM_DATA(COpList::OPERATION) -template -inline BOOL operator >>(CStream &f, T &val) -{ - DWORD dwRead; - - if (!::ReadFile(f, &val, sizeof(T), &dwRead, NULL)) return FALSE; - if (dwRead != sizeof(T)) { - ::SetLastError(ERROR_READ_FAULT); - return FALSE; - } - - return TRUE; -} - +#undef MSICALIB_STREAM_DATA template inline BOOL operator <<(CStream &f, const std::vector<_Ty, _Ax> &val)