|
|
/* /////////////////////////////////////////////////////////////////////////
* File: winstl/util/struct_initialisers.hpp * * Purpose: Functions for initialising Win32 structures. * * Created: 20th October 1994 * Updated: 10th August 2009 * * Home: http://stlsoft.org/
* * Copyright (c) 1994-2009, Matthew Wilson and Synesis Software * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name(s) of Matthew Wilson and Synesis Software nor the names of * any contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * ////////////////////////////////////////////////////////////////////// */
/** \file winstl/util/struct_initialisers.hpp
* * \brief [C++ only] Definition of the winstl::zero_struct and * winstl::init_struct structure initialiser functions * (\ref group__library__utility "Utility" Library). */
#ifndef WINSTL_INCL_WINSTL_UTIL_HPP_STRUCT_INITIALISERS
#define WINSTL_INCL_WINSTL_UTIL_HPP_STRUCT_INITIALISERS
#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
# define WINSTL_VER_WINSTL_UTIL_HPP_STRUCT_INITIALISERS_MAJOR 4
# define WINSTL_VER_WINSTL_UTIL_HPP_STRUCT_INITIALISERS_MINOR 0
# define WINSTL_VER_WINSTL_UTIL_HPP_STRUCT_INITIALISERS_REVISION 4
# define WINSTL_VER_WINSTL_UTIL_HPP_STRUCT_INITIALISERS_EDIT 220
#endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
/* /////////////////////////////////////////////////////////////////////////
* Includes */
#ifndef WINSTL_INCL_WINSTL_H_WINSTL
# include <winstl/winstl.h>
#endif /* !WINSTL_INCL_WINSTL_H_WINSTL */
/* /////////////////////////////////////////////////////////////////////////
* Namespace */
#ifndef _WINSTL_NO_NAMESPACE
# if defined(_STLSOFT_NO_NAMESPACE) || \
defined(STLSOFT_DOCUMENTATION_SKIP_SECTION) /* There is no stlsoft namespace, so must define ::winstl */ namespace winstl { # else
/* Define stlsoft::winstl_project */
namespace stlsoft {
namespace winstl_project {
# endif /* _STLSOFT_NO_NAMESPACE */
#endif /* !_WINSTL_NO_NAMESPACE */
/* /////////////////////////////////////////////////////////////////////////
* Functions */
/** \brief Initialises all elements of a structure to zero
* * \ingroup group__library__utility */ template <ss_typename_param_k T> inline void zero_struct(T &t) { ::ZeroMemory(&t, sizeof(T)); }
template <ss_typename_param_k T> struct init_traits;
#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
struct struct_has { struct no_init_member_type {};
struct cb_member_type {};
struct cBytes_member_type {};
struct cbSize_member_type {};
struct dwLength_member_type {};
struct dwOSVersionInfoSize_member_type {};
struct dwSize_member_type {};
struct nLength_member_type {};
struct uSize_member_type {};
template <ss_typename_param_k T> static void init(T &t, no_init_member_type) { zero_struct(t); }
template <ss_typename_param_k T> static void init(T &t, cb_member_type) { zero_struct(t); t.cb = sizeof(T); }
template <ss_typename_param_k T> static void init(T &t, cBytes_member_type) { zero_struct(t); t.cBytes = sizeof(T); }
template <ss_typename_param_k T> static void init(T &t, cbSize_member_type) { zero_struct(t); t.cbSize = sizeof(T); }
template <ss_typename_param_k T> static void init(T &t, dwLength_member_type) { zero_struct(t); t.dwLength = sizeof(T); }
template <ss_typename_param_k T> static void init(T &t, dwOSVersionInfoSize_member_type) { zero_struct(t); t.dwOSVersionInfoSize = sizeof(T); }
template <ss_typename_param_k T> static void init(T &t, dwSize_member_type) { zero_struct(t); t.dwSize = sizeof(T); }
template <ss_typename_param_k T> static void init(T &t, nLength_member_type) { zero_struct(t); t.nLength = sizeof(T); }
template <ss_typename_param_k T> static void init(T &t, uSize_member_type) { zero_struct(t); t.uSize = sizeof(T); } };
#endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
/** \brief Initialises all members of a structure to zero, and
* sets the size member to the size of the structure. * * \ingroup group__library__utility */ template <ss_typename_param_k T> inline void init_struct(T &t) { typedef ss_typename_type_k init_traits<T>::type discriminator_t;
struct_has::init(t, discriminator_t()); }
// Specialisations
#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
# define WINSTL_The_structure_(S, t) \
\ STLSOFT_TEMPLATE_SPECIALISATION \ struct init_traits<S> \ { \ typedef struct_##t type; \ }
// WinBase.h:
WINSTL_The_structure_(PROCESS_INFORMATION, has::no_init_member_type); WINSTL_The_structure_(OVERLAPPED, has::no_init_member_type); WINSTL_The_structure_(FILETIME, has::no_init_member_type); WINSTL_The_structure_(SYSTEMTIME, has::no_init_member_type); WINSTL_The_structure_(COMMPROP, has::no_init_member_type); WINSTL_The_structure_(COMSTAT, has::no_init_member_type); WINSTL_The_structure_(COMMTIMEOUTS, has::no_init_member_type); WINSTL_The_structure_(SYSTEM_INFO, has::no_init_member_type); WINSTL_The_structure_(EXCEPTION_DEBUG_INFO, has::no_init_member_type); WINSTL_The_structure_(CREATE_THREAD_DEBUG_INFO, has::no_init_member_type); WINSTL_The_structure_(CREATE_PROCESS_DEBUG_INFO, has::no_init_member_type); WINSTL_The_structure_(EXIT_THREAD_DEBUG_INFO, has::no_init_member_type); WINSTL_The_structure_(LOAD_DLL_DEBUG_INFO, has::no_init_member_type); WINSTL_The_structure_(UNLOAD_DLL_DEBUG_INFO, has::no_init_member_type); WINSTL_The_structure_(OUTPUT_DEBUG_STRING_INFO, has::no_init_member_type); WINSTL_The_structure_(RIP_INFO, has::no_init_member_type); WINSTL_The_structure_(DEBUG_EVENT, has::no_init_member_type); WINSTL_The_structure_(PROCESS_HEAP_ENTRY, has::no_init_member_type); WINSTL_The_structure_(BY_HANDLE_FILE_INFORMATION, has::no_init_member_type); WINSTL_The_structure_(TIME_ZONE_INFORMATION, has::no_init_member_type); WINSTL_The_structure_(WIN32_STREAM_ID, has::no_init_member_type); WINSTL_The_structure_(WIN32_FIND_DATAA, has::no_init_member_type); WINSTL_The_structure_(WIN32_FIND_DATAW, has::no_init_member_type); WINSTL_The_structure_(WIN32_FILE_ATTRIBUTE_DATA, has::no_init_member_type); WINSTL_The_structure_(SYSTEM_POWER_STATUS, has::no_init_member_type); #ifdef WINTRUST_H
WINSTL_The_structure_(WIN_CERTIFICATE, has::no_init_member_type); WINSTL_The_structure_(WIN_TRUST_ACTDATA_CONTEXT_WITH_SUBJECT, has::no_init_member_type); WINSTL_The_structure_(WIN_TRUST_ACTDATA_SUBJECT_ONLY, has::no_init_member_type); WINSTL_The_structure_(WIN_TRUST_SUBJECT_FILE, has::no_init_member_type); WINSTL_The_structure_(WIN_TRUST_SUBJECT_FILE_AND_DISPLAY, has::no_init_member_type); WINSTL_The_structure_(WIN_SPUB_TRUSTED_PUBLISHER_DATA, has::no_init_member_type); #endif /* WINTRUST_H */
WINSTL_The_structure_(STARTUPINFOA, has::cb_member_type); WINSTL_The_structure_(STARTUPINFOW, has::cb_member_type);
WINSTL_The_structure_(OFSTRUCT, has::cBytes_member_type);
WINSTL_The_structure_(MEMORYSTATUS, has::dwLength_member_type);
WINSTL_The_structure_(OSVERSIONINFOA, has::dwOSVersionInfoSize_member_type); WINSTL_The_structure_(OSVERSIONINFOW, has::dwOSVersionInfoSize_member_type); #if !defined(STLSOFT_COMPILER_IS_DMC) && \
( !defined(STLSOFT_COMPILER_IS_MSVC) || \ _MSC_VER >= 1200) WINSTL_The_structure_(OSVERSIONINFOEXA, has::dwOSVersionInfoSize_member_type); WINSTL_The_structure_(OSVERSIONINFOEXW, has::dwOSVersionInfoSize_member_type); #endif /* compiler */
WINSTL_The_structure_(COMMCONFIG, has::dwSize_member_type);
WINSTL_The_structure_(SECURITY_ATTRIBUTES, has::nLength_member_type);
inline void init_struct(DCB &dcb) { zero_struct(dcb); dcb.DCBlength = sizeof(dcb); }
// ShellApi.h
#if defined(_INC_SHELLAPI) || \
defined(_SHELLAPI_H) || \ !defined(WIN32_LEAN_AND_MEAN)
WINSTL_The_structure_(SHFILEOPSTRUCTA, has::no_init_member_type); WINSTL_The_structure_(SHFILEOPSTRUCTW, has::no_init_member_type); #if !defined(STLSOFT_COMPILER_IS_GCC)
WINSTL_The_structure_(SHNAMEMAPPINGA, has::no_init_member_type); WINSTL_The_structure_(SHNAMEMAPPINGW, has::no_init_member_type); #endif /* compiler */
WINSTL_The_structure_(SHFILEINFOA, has::no_init_member_type); WINSTL_The_structure_(SHFILEINFOW, has::no_init_member_type);
#if !defined(STLSOFT_COMPILER_IS_DMC) && \
!defined(STLSOFT_COMPILER_IS_GCC) && \ ( !defined(STLSOFT_COMPILER_IS_MSVC) || \ _MSC_VER >= 1200) && \ defined(WINVER) && \ WINVER >= 0x0400 WINSTL_The_structure_(DRAGINFOA, has::uSize_member_type); WINSTL_The_structure_(DRAGINFOW, has::uSize_member_type); #endif /* WINVER */
WINSTL_The_structure_(APPBARDATA, has::cbSize_member_type); WINSTL_The_structure_(SHELLEXECUTEINFOA, has::cbSize_member_type); WINSTL_The_structure_(SHELLEXECUTEINFOW, has::cbSize_member_type); #if !defined(STLSOFT_COMPILER_IS_DMC) && \
( !defined(STLSOFT_COMPILER_IS_GCC) || \ __GNUC__ > 3 || \ ( __GNUC__ == 3 && \ __GNUC_MINOR__ > 2)) && \ ( !defined(STLSOFT_COMPILER_IS_MSVC) || \ _MSC_VER >= 1200) WINSTL_The_structure_(SHQUERYRBINFO, has::cbSize_member_type); #endif /* compiler */
WINSTL_The_structure_(NOTIFYICONDATAA, has::cbSize_member_type); WINSTL_The_structure_(NOTIFYICONDATAW, has::cbSize_member_type);
#endif /* _INC_SHELLAPI || _SHELLAPI_H || !WIN32_LEAN_AND_MEAN */
#endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
////////////////////////////////////////////////////////////////////////////
// Unit-testing
#ifdef STLSOFT_UNITTEST
# include "./unittest/struct_initialisers_unittest_.h"
#endif /* STLSOFT_UNITTEST */
/* ////////////////////////////////////////////////////////////////////// */
#ifndef _WINSTL_NO_NAMESPACE
# if defined(_STLSOFT_NO_NAMESPACE) || \
defined(STLSOFT_DOCUMENTATION_SKIP_SECTION) } // namespace winstl
# else
} // namespace winstl_project
} // namespace stlsoft
# endif /* _STLSOFT_NO_NAMESPACE */
#endif /* !_WINSTL_NO_NAMESPACE */
/* ////////////////////////////////////////////////////////////////////// */
#endif /* !WINSTL_INCL_WINSTL_UTIL_HPP_STRUCT_INITIALISERS */
/* ///////////////////////////// end of file //////////////////////////// */
|