Digging on smart pointers

This commit is contained in:
Vitor Fernandes 2020-07-06 14:32:37 +01:00
parent d6e5f494ff
commit eabc20a2e3
No known key found for this signature in database
GPG key ID: EBFB4EE09F348A26
6 changed files with 141 additions and 108 deletions

View file

@ -1,2 +1,3 @@
add_subdirectory(core)
add_subdirectory(opengl)
add_subdirectory(misc)

4
src/misc/CMakeLists.txt Normal file
View file

@ -0,0 +1,4 @@
add_executable(
spointer
smartpointer.cpp
)

71
src/misc/smartpointer.cpp Normal file
View file

@ -0,0 +1,71 @@
#include "smartpointer.h"
#include <memory>
#define UPtr std::unique_ptr
#define SPtr std::shared_ptr
DummyObject::DummyObject(int num_elements)
{
std::cout << "Constructor called " << num_elements << std::endl;
size = num_elements;
list_of_numbers = new int[size];
}
DummyObject::~DummyObject()
{
std::cout << "Destructor called " << size << std::endl;
delete[] list_of_numbers;
}
DummyObject::DummyObject(const DummyObject &other)
{
std::cout << "Copy constructor called " << other.size << std::endl;
list_of_numbers = new int[other.size];
for (int i = 0; i < other.size; i++)
{
list_of_numbers[i] = other.list_of_numbers[i];
}
size = other.size;
}
DummyObject::DummyObject(DummyObject&& moved)
{
std::cout << "Move constructor called " << moved.size << std::endl;
}
void DummyObject::doSomething()
{
std::cout << "This do amazing stuff: " << size << std::endl;
}
DummyObject createDummy(int size)
{
DummyObject d(size);
return d;
}
int main(void)
{
std::cout << "Smart pointer examples" << std::endl;
DummyObject d(15);
DummyObject copy = d;
DummyObject *dmtPtr = new DummyObject(20);
UPtr<DummyObject> dmySmtPtr = UPtr<DummyObject>(new DummyObject(30));
dmySmtPtr->doSomething();
dmtPtr->doSomething();
SPtr<DummyObject> firstSmtPtr = SPtr<DummyObject>(dmtPtr);
SPtr<DummyObject> secondSmtPtr = firstSmtPtr;
DummyObject retDummy = createDummy(32);
DummyObject secondDummy = std::move(retDummy);
retDummy.doSomething();
secondDummy.doSomething();
firstSmtPtr->doSomething();
secondSmtPtr->doSomething();
}

19
src/misc/smartpointer.h Normal file
View file

@ -0,0 +1,19 @@
#pragma once
#include <iostream>
class DummyObject {
public:
DummyObject(int); //Constructor
~DummyObject(); //destructor
DummyObject(const DummyObject&); //copy constructor
DummyObject(DummyObject&&); //move constructor
void doSomething();
private:
int size;
int* list_of_numbers;
};

View file

@ -1,7 +1,7 @@
# Search for glfw
find_package(glfw3 3.3 REQUIRED)
# Search for glew
find_package(GLEW REQUIRED)
find_package(glew REQUIRED)
# Search for OpenGL
find_package(OpenGL REQUIRED)
add_compile_definitions(IS_DEBUG=1)
@ -22,9 +22,10 @@ add_executable(
)
# Link gl1 with glew
#target_link_libraries(gl1 glew)
target_link_libraries(gl1 /usr/local/lib/libGLEW.2.2.0.dylib)
# Link gl1 with glfw lib
target_link_libraries(gl1 glfw)
# Link gl1 with glew
#target_link_libraries(gl1 glew)
# Link gl1 with OpenGL
target_link_libraries(gl1 OpenGL::GL)

View file

@ -15,127 +15,64 @@
const std::string SHADERS_PATH = "src/opengl/res/shaders/Basic.shader";
static void error_callback(int error, const char *description)
{
fputs(description, stderr);
}
static void key_callback(GLFWwindow *window, int key, int scancode, int action, int mods)
{
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
int main(void)
{
LOG("Start OpenGL Demo");
GLFWwindow *window;
//glDebugMessageCallback(ErrorGLCallback,0); Enable when glew installed properly
/* Initialize the library */
LOG("Initialize glfw");
glfwSetErrorCallback(error_callback);
if (!glfwInit())
return -1;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
/* Create a windowed mode window and its OpenGL context */
LOG("Create Window");
//glfwCreateWindow(640, 480, "OpenGL Window", NULL, NULL);
//GLCall(window = glfwCreateWindow(640, 480, "OpenGL Window", NULL, NULL));
window = glfwCreateWindow(640, 480, "OpenGL Window", NULL, NULL);
exit(EXIT_FAILURE);
window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
if (!window)
{
LOG("Terminate because not window");
glfwTerminate();
return -1;
exit(EXIT_FAILURE);
}
/* Make the window's context current */
LOG("GLFW Make context");
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glfwSetKeyCallback(window, key_callback);
GLPrintVersion();
int major, minor, revision;
glfwGetVersion(&major, &minor, &revision);
float positions[] =
{
-0.5f, -0.5f,
0.5f, -0.5f,
0.5f, 0.5f,
-0.5f, 0.5f};
printf("Running against GLFW %i.%i.%i\n", major, minor, revision);
LOG(glfwGetVersionString());
unsigned int indexes[] = {
0, 1, 2, 2, 3, 0};
//Create buffer
//Buffer id
VertexArray va;
LOG("VertexBuffer to be created");
VertexBuffer vb(positions, 4 * 2 * sizeof(float));
//LOG("Create VertexBuffer: " << vb);
VertexBufferLayout layout;
layout.Push<float>(2);
va.AddBuffer(vb,layout);
IndexBuffer ib(indexes,6);
Shader shader(SHADERS_PATH);
shader.Bind();
shader.SetUniform4f("u_Color",0.2f, 0.3f, 0.8f, 1.0f);
va.Unbind();
vb.Unbind();
ib.Unbind();
shader.Unbind();
Renderer renderer;
float red = 0.0f;
float increment = 0.05f;
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
{
/* Render here */
GLCall(glClear(GL_COLOR_BUFFER_BIT));
// Legacy OpenGL
//glBegin(GL_TRIANGLES);
//glVertex2f(-1.0f, -1.0f);
//glVertex2f(0.0f, 1.0f);
//glVertex2f(1.0f, -1.0f);
//glEnd();
//Modern OpenGL
//without index buffer
//glDrawArrays(GL_TRIANGLES, 0, 12);
//GLClearError();
//GLCall(glUseProgram(shader));
//GLCall(glUniform4f(uniform_location, 0.2f, 0.3f, 0.8f, 1.0f));
//ib.Bind();
//GLCall(glDrawElements(GL_TRIANGLES, 6 * sizeof(uint), GL_UNSIGNED_INT, nullptr));
shader.Bind();
shader.SetUniform4f("u_Color",red, 0.3f, 0.8f, 1.0f);
renderer.draw(va,ib,shader);
if (red > 1.0f)
increment = -0.05f;
else if (red < 0.0f)
increment = 0.05f;
red += increment;
//GLCheckError();
/* Swap front and back buffers */
float ratio;
int width, height;
glfwGetFramebufferSize(window, &width, &height);
ratio = width / (float)height;
glViewport(0, 0, width, height);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef((float)glfwGetTime() * 50.f, 0.f, 0.f, 1.f);
glBegin(GL_TRIANGLES);
glColor3f(1.f, 0.f, 0.f);
glVertex3f(-0.6f, -0.4f, 0.f);
glColor3f(0.f, 1.f, 0.f);
glVertex3f(0.6f, -0.4f, 0.f);
glColor3f(0.f, 0.f, 1.f);
glVertex3f(0.f, 0.6f, 0.f);
glEnd();
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
exit(EXIT_SUCCESS);
}