You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

360 lines
12 KiB

/* /////////////////////////////////////////////////////////////////////////
* 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 //////////////////////////// */