// This file references classes for each study
#include <windows.h> 
#include <string>
#include "sierrachart.h"

//Example class
class ClassA
{
public:
	ClassA::ClassA(SCStudyInterfaceRef sc) :IntegerVariable(0) {}
	ClassA::~ClassA() {};
	int IntegerVariable;
};


void DeleteClassA(SCStudyInterfaceRef sc, ClassA* p_ClassA)
{
	if (p_ClassA != NULL)
	{
		SCString message;
		message.Format("Deleting p_ClassA=%p", p_ClassA);
		sc.AddMessageToLog(message, 0);
		delete p_ClassA;
		p_ClassA = NULL;
		sc.SetPersistentPointer(1, p_ClassA);
	}
}

bool RequireClassA(SCStudyInterfaceRef sc, ClassA* p_ClassA)
{
	if (p_ClassA == NULL)
	{
		p_ClassA = new ClassA(sc);
		if (p_ClassA != NULL)
		{
			SCString message;
			message.Format("Created new p_ClassA=%p", p_ClassA);
			sc.AddMessageToLog(message, 0);
			sc.SetPersistentPointer(1, p_ClassA);
		}
		else
		{
			sc.AddMessageToLog("Unable to new a ClassA class", 1);
			return false;
		}
	}
	return true;
}

SCSFExport scsf_PersistentPointerCrash(SCStudyInterfaceRef sc)
{
	ClassA* p_ClassA;
	if (sc.SetDefaults)
	{
		// Set the configuration and defaults

		sc.GraphName = "Dynamic Memory Allocation Example (new/delete)";

		sc.AutoLoop = 1;

		// This must be set to 0 when using new and delete in a study function.
		sc.FreeDLL = 0;
		return;
	}

	if (sc.LastCallToFunction)
	{
		sc.AddMessageToLog("Entered LastCallToFunction", 1);
		p_ClassA = static_cast<ClassA*>(sc.GetPersistentPointer(1));
		DeleteClassA(sc, p_ClassA);
		return;
	}
	if (sc.UpdateStartIndex == 0)
	{
		// Start a new ClassA class. Symbol or Account might have changed
		p_ClassA = static_cast<ClassA*>(sc.GetPersistentPointer(1));
		DeleteClassA(sc, p_ClassA);
		p_ClassA = static_cast<ClassA*>(sc.GetPersistentPointer(1));
		if (!RequireClassA(sc, p_ClassA))
		{
			return;
		}
	}
	p_ClassA = static_cast<ClassA*>(sc.GetPersistentPointer(1));
	if (!RequireClassA(sc, p_ClassA))
	{
		return;
	}
	int IntegerVariable = p_ClassA->IntegerVariable;
}

