/***************************************************************************
 * Copyright (c)  2014  Zephyr Software LLC. All rights reserved.
 *
 * This software is furnished under a license and/or other restrictive
 * terms and may be used and copied only in accordance with such terms
 * and the inclusion of the above copyright notice. This software or
 * any other copies thereof may not be provided or otherwise made
 * available to any other person without the express written consent
 * of an authorized representative of Zephyr Software LCC. Title to,
 * ownership of, and all rights in the software is retained by
 * Zephyr Software LCC.
 *
 * Zephyr Software LLC. Proprietary Information
 *
 * Unless otherwise specified, the information contained in this
 * directory, following this legend, and/or referenced herein is
 * Zephyr Software LLC. (Zephyr) Proprietary Information. 
 *
 * CONTACT
 *
 * For technical assistance, contact Zephyr Software LCC. at:
 *      
 *
 * Zephyr Software, LLC
 * 2040 Tremont Rd
 * Charlottesville, VA 22911
 *
 * E-mail: jwd@zephyr-software.com
 **************************************************************************/

#ifndef zipr_h
#define zipr_h

#include <memory_space.h>
#include <dollop_man.h>
#include <set>
#include <utility>


namespace Zipr_SDK
{

typedef std::set< std::pair<Dollop_t*,RangeAddress_t> > PlacementQueue_t;

class Zipr_t
{
	public:
		/*
		 * These are public functions that the SDK user way want to use.
		 */
		virtual size_t DetermineDollopEntrySize(
				DollopEntry_t*, 
				bool account_for_fallthrough) = 0;

		virtual RangeAddress_t PlopDollopEntry(
				DollopEntry_t *,
				RangeAddress_t = 0,
				RangeAddress_t = 0) = 0;

		virtual RangeAddress_t PlopDollopEntryWithTarget(
				DollopEntry_t *,
				RangeAddress_t = 0,
				RangeAddress_t = 0) = 0;

		virtual RangeAddress_t PlopDollopEntryWithCallback(
				DollopEntry_t *,
				RangeAddress_t = 0) = 0;

        	virtual MemorySpace_t *GetMemorySpace()=0;
        	virtual ELFIO::elfio *getELFIO()=0;
        	virtual IRDB_SDK::FileIR_t *getFileIR()=0;
        	virtual InstructionLocationMap_t *GetLocationMap()=0; 
		virtual DollopManager_t *getDollopManager()=0;
		virtual PlacementQueue_t* GetPlacementQueue()=0;
		virtual void ApplyPatch(
				RangeAddress_t from_addr, 
				RangeAddress_t to_addr)=0;

};

};

#endif