Remove dependency on <new> header (#484, #504)

(Now expecting something to fail somewhere..)
This commit is contained in:
ocornut 2016-01-25 21:26:53 +00:00
parent 3ee50af57e
commit 595684e08c
3 changed files with 17 additions and 8 deletions

View File

@ -529,13 +529,13 @@
#include "imgui.h" #include "imgui.h"
#define IMGUI_DEFINE_MATH_OPERATORS #define IMGUI_DEFINE_MATH_OPERATORS
#define IMGUI_DEFINE_PLACEMENT_NEW
#include "imgui_internal.h" #include "imgui_internal.h"
#include <ctype.h> // toupper, isprint #include <ctype.h> // toupper, isprint
#include <math.h> // sqrtf, fabsf, fmodf, powf, cosf, sinf, floorf, ceilf #include <math.h> // sqrtf, fabsf, fmodf, powf, cosf, sinf, floorf, ceilf
#include <stdlib.h> // NULL, malloc, free, qsort, atoi #include <stdlib.h> // NULL, malloc, free, qsort, atoi
#include <stdio.h> // vsnprintf, sscanf, printf #include <stdio.h> // vsnprintf, sscanf, printf
#include <new> // new (ptr)
#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier #if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
#include <stddef.h> // intptr_t #include <stddef.h> // intptr_t
#else #else
@ -1555,7 +1555,7 @@ ImGuiWindow::ImGuiWindow(const char* name)
FontWindowScale = 1.0f; FontWindowScale = 1.0f;
DrawList = (ImDrawList*)ImGui::MemAlloc(sizeof(ImDrawList)); DrawList = (ImDrawList*)ImGui::MemAlloc(sizeof(ImDrawList));
new(DrawList) ImDrawList(); IM_PLACEMENT_NEW(DrawList) ImDrawList();
DrawList->_OwnerName = Name; DrawList->_OwnerName = Name;
RootWindow = NULL; RootWindow = NULL;
RootNonPopupWindow = NULL; RootNonPopupWindow = NULL;
@ -1829,7 +1829,7 @@ size_t ImGui::GetInternalStateSize()
void ImGui::SetInternalState(void* state, bool construct) void ImGui::SetInternalState(void* state, bool construct)
{ {
if (construct) if (construct)
new (state) ImGuiState(); IM_PLACEMENT_NEW(state) ImGuiState();
GImGui = (ImGuiState*)state; GImGui = (ImGuiState*)state;
} }
@ -1874,7 +1874,7 @@ void ImGui::NewFrame()
{ {
// Initialize on first frame // Initialize on first frame
g.LogClipboard = (ImGuiTextBuffer*)ImGui::MemAlloc(sizeof(ImGuiTextBuffer)); g.LogClipboard = (ImGuiTextBuffer*)ImGui::MemAlloc(sizeof(ImGuiTextBuffer));
new(g.LogClipboard) ImGuiTextBuffer(); IM_PLACEMENT_NEW(g.LogClipboard) ImGuiTextBuffer();
IM_ASSERT(g.Settings.empty()); IM_ASSERT(g.Settings.empty());
LoadSettings(); LoadSettings();
@ -3461,7 +3461,7 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl
// Create window the first time // Create window the first time
ImGuiWindow* window = (ImGuiWindow*)ImGui::MemAlloc(sizeof(ImGuiWindow)); ImGuiWindow* window = (ImGuiWindow*)ImGui::MemAlloc(sizeof(ImGuiWindow));
new(window) ImGuiWindow(name); IM_PLACEMENT_NEW(window) ImGuiWindow(name);
window->Flags = flags; window->Flags = flags;
if (flags & ImGuiWindowFlags_NoSavedSettings) if (flags & ImGuiWindowFlags_NoSavedSettings)

View File

@ -14,10 +14,10 @@
#include "imgui.h" #include "imgui.h"
#define IMGUI_DEFINE_MATH_OPERATORS #define IMGUI_DEFINE_MATH_OPERATORS
#define IMGUI_DEFINE_PLACEMENT_NEW
#include "imgui_internal.h" #include "imgui_internal.h"
#include <stdio.h> // vsnprintf, sscanf, printf #include <stdio.h> // vsnprintf, sscanf, printf
#include <new> // new (ptr)
#if !defined(alloca) && !defined(__FreeBSD__) #if !defined(alloca) && !defined(__FreeBSD__)
#ifdef _WIN32 #ifdef _WIN32
#include <malloc.h> // alloca #include <malloc.h> // alloca
@ -266,7 +266,7 @@ void ImDrawList::ChannelsSplit(int channels_count)
{ {
if (i >= old_channels_count) if (i >= old_channels_count)
{ {
new(&_Channels[i]) ImDrawChannel(); IM_PLACEMENT_NEW(&_Channels[i]) ImDrawChannel();
} }
else else
{ {
@ -1097,7 +1097,7 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg)
if (!font_cfg->MergeMode) if (!font_cfg->MergeMode)
{ {
ImFont* font = (ImFont*)ImGui::MemAlloc(sizeof(ImFont)); ImFont* font = (ImFont*)ImGui::MemAlloc(sizeof(ImFont));
new (font) ImFont(); IM_PLACEMENT_NEW(font) ImFont();
Fonts.push_back(font); Fonts.push_back(font);
} }

View File

@ -137,6 +137,15 @@ static inline float ImLengthSqr(const ImVec4& lhs)
static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = lhs.x*lhs.x + lhs.y*lhs.y; if (d > 0.0f) return 1.0f / sqrtf(d); return fail_value; } static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = lhs.x*lhs.x + lhs.y*lhs.y; if (d > 0.0f) return 1.0f / sqrtf(d); return fail_value; }
static inline ImVec2 ImRound(ImVec2 v) { return ImVec2((float)(int)v.x, (float)(int)v.y); } static inline ImVec2 ImRound(ImVec2 v) { return ImVec2((float)(int)v.x, (float)(int)v.y); }
// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax.
// Defining a custom placement new() with a dummy parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions.
#ifdef IMGUI_DEFINE_PLACEMENT_NEW
struct ImPlacementNewDummy {};
static inline void* operator new(size_t, ImPlacementNewDummy, void* ptr) { return ptr; }
static inline void operator delete(void*, ImPlacementNewDummy, void*) {}
#define IM_PLACEMENT_NEW(_PTR) new(ImPlacementNewDummy() ,_PTR)
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Types // Types
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------