/** 
 * @file llmemtype.h
 * @brief Runtime memory usage debugging utilities.
 *
 * $LicenseInfo:firstyear=2005&license=viewerlgpl$
 * Second Life Viewer Source Code
 * Copyright (C) 2010, Linden Research, Inc.
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation;
 * version 2.1 of the License only.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 * 
 * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 * $/LicenseInfo$
 */

#ifndef LL_MEMTYPE_H
#define LL_MEMTYPE_H

//----------------------------------------------------------------------------
//----------------------------------------------------------------------------

//----------------------------------------------------------------------------

#include "linden_common.h"
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// WARNING: Never commit with MEM_TRACK_MEM == 1
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define MEM_TRACK_MEM (0 && LL_WINDOWS)

#include <vector>

#define MEM_TYPE_NEW(T)

class LL_COMMON_API LLMemType
{
public:

	// class we'll initialize all instances of as
	// static members of MemType.  Then use
	// to construct any new mem type.
	class LL_COMMON_API DeclareMemType
	{
	public:
		DeclareMemType(char const * st);
		~DeclareMemType();
	
		S32 mID;
		char const * mName;
		
		// array so we can map an index ID to Name
		static std::vector<char const *> mNameList;
	};

	LLMemType(DeclareMemType& dt);
	~LLMemType();

	static char const * getNameFromID(S32 id);

	static DeclareMemType MTYPE_INIT;
	static DeclareMemType MTYPE_STARTUP;
	static DeclareMemType MTYPE_MAIN;
	static DeclareMemType MTYPE_FRAME;

	static DeclareMemType MTYPE_GATHER_INPUT;
	static DeclareMemType MTYPE_JOY_KEY;

	static DeclareMemType MTYPE_IDLE;
	static DeclareMemType MTYPE_IDLE_PUMP;
	static DeclareMemType MTYPE_IDLE_NETWORK;
	static DeclareMemType MTYPE_IDLE_UPDATE_REGIONS;
	static DeclareMemType MTYPE_IDLE_UPDATE_VIEWER_REGION;
	static DeclareMemType MTYPE_IDLE_UPDATE_SURFACE;
	static DeclareMemType MTYPE_IDLE_UPDATE_PARCEL_OVERLAY;
	static DeclareMemType MTYPE_IDLE_AUDIO;

	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING;
	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_ASKS;
	static DeclareMemType MTYPE_CACHE_PROCESS_PENDING_REPLIES;

	static DeclareMemType MTYPE_MESSAGE_CHECK_ALL;
	static DeclareMemType MTYPE_MESSAGE_PROCESS_ACKS;

	static DeclareMemType MTYPE_RENDER;
	static DeclareMemType MTYPE_SLEEP;

	static DeclareMemType MTYPE_NETWORK;
	static DeclareMemType MTYPE_PHYSICS;
	static DeclareMemType MTYPE_INTERESTLIST;

	static DeclareMemType MTYPE_IMAGEBASE;
	static DeclareMemType MTYPE_IMAGERAW;
	static DeclareMemType MTYPE_IMAGEFORMATTED;
	
	static DeclareMemType MTYPE_APPFMTIMAGE;
	static DeclareMemType MTYPE_APPRAWIMAGE;
	static DeclareMemType MTYPE_APPAUXRAWIMAGE;
	
	static DeclareMemType MTYPE_DRAWABLE;
	
	static DeclareMemType MTYPE_OBJECT;
	static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE;
	static DeclareMemType MTYPE_OBJECT_PROCESS_UPDATE_CORE;

	static DeclareMemType MTYPE_DISPLAY;
	static DeclareMemType MTYPE_DISPLAY_UPDATE;
	static DeclareMemType MTYPE_DISPLAY_UPDATE_CAMERA;
	static DeclareMemType MTYPE_DISPLAY_UPDATE_GEOM;
	static DeclareMemType MTYPE_DISPLAY_SWAP;
	static DeclareMemType MTYPE_DISPLAY_UPDATE_HUD;
	static DeclareMemType MTYPE_DISPLAY_GEN_REFLECTION;
	static DeclareMemType MTYPE_DISPLAY_IMAGE_UPDATE;
	static DeclareMemType MTYPE_DISPLAY_STATE_SORT;
	static DeclareMemType MTYPE_DISPLAY_SKY;
	static DeclareMemType MTYPE_DISPLAY_RENDER_GEOM;
	static DeclareMemType MTYPE_DISPLAY_RENDER_FLUSH;
	static DeclareMemType MTYPE_DISPLAY_RENDER_UI;
	static DeclareMemType MTYPE_DISPLAY_RENDER_ATTACHMENTS;

	static DeclareMemType MTYPE_VERTEX_DATA;
	static DeclareMemType MTYPE_VERTEX_CONSTRUCTOR;
	static DeclareMemType MTYPE_VERTEX_DESTRUCTOR;
	static DeclareMemType MTYPE_VERTEX_CREATE_VERTICES;
	static DeclareMemType MTYPE_VERTEX_CREATE_INDICES;
	static DeclareMemType MTYPE_VERTEX_DESTROY_BUFFER;	
	static DeclareMemType MTYPE_VERTEX_DESTROY_INDICES;
	static DeclareMemType MTYPE_VERTEX_UPDATE_VERTS;
	static DeclareMemType MTYPE_VERTEX_UPDATE_INDICES;
	static DeclareMemType MTYPE_VERTEX_ALLOCATE_BUFFER;
	static DeclareMemType MTYPE_VERTEX_RESIZE_BUFFER;
	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER;
	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_VERTICES;
	static DeclareMemType MTYPE_VERTEX_MAP_BUFFER_INDICES;
	static DeclareMemType MTYPE_VERTEX_UNMAP_BUFFER;
	static DeclareMemType MTYPE_VERTEX_SET_STRIDE;
	static DeclareMemType MTYPE_VERTEX_SET_BUFFER;
	static DeclareMemType MTYPE_VERTEX_SETUP_VERTEX_BUFFER;
	static DeclareMemType MTYPE_VERTEX_CLEANUP_CLASS;

	static DeclareMemType MTYPE_SPACE_PARTITION;

	static DeclareMemType MTYPE_PIPELINE;
	static DeclareMemType MTYPE_PIPELINE_INIT;
	static DeclareMemType MTYPE_PIPELINE_CREATE_BUFFERS;
	static DeclareMemType MTYPE_PIPELINE_RESTORE_GL;
	static DeclareMemType MTYPE_PIPELINE_UNLOAD_SHADERS;
	static DeclareMemType MTYPE_PIPELINE_LIGHTING_DETAIL;
	static DeclareMemType MTYPE_PIPELINE_GET_POOL_TYPE;
	static DeclareMemType MTYPE_PIPELINE_ADD_POOL;
	static DeclareMemType MTYPE_PIPELINE_ALLOCATE_DRAWABLE;
	static DeclareMemType MTYPE_PIPELINE_ADD_OBJECT;
	static DeclareMemType MTYPE_PIPELINE_CREATE_OBJECTS;
	static DeclareMemType MTYPE_PIPELINE_UPDATE_MOVE;
	static DeclareMemType MTYPE_PIPELINE_UPDATE_GEOM;
	static DeclareMemType MTYPE_PIPELINE_MARK_VISIBLE;
	static DeclareMemType MTYPE_PIPELINE_MARK_MOVED;
	static DeclareMemType MTYPE_PIPELINE_MARK_SHIFT;
	static DeclareMemType MTYPE_PIPELINE_SHIFT_OBJECTS;
	static DeclareMemType MTYPE_PIPELINE_MARK_TEXTURED;
	static DeclareMemType MTYPE_PIPELINE_MARK_REBUILD;
	static DeclareMemType MTYPE_PIPELINE_UPDATE_CULL;
	static DeclareMemType MTYPE_PIPELINE_STATE_SORT;
	static DeclareMemType MTYPE_PIPELINE_POST_SORT;
	
	static DeclareMemType MTYPE_PIPELINE_RENDER_HUD_ELS;
	static DeclareMemType MTYPE_PIPELINE_RENDER_HL;
	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM;
	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_DEFFERRED;
	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_POST_DEF;
	static DeclareMemType MTYPE_PIPELINE_RENDER_GEOM_SHADOW;
	static DeclareMemType MTYPE_PIPELINE_RENDER_SELECT;
	static DeclareMemType MTYPE_PIPELINE_REBUILD_POOLS;
	static DeclareMemType MTYPE_PIPELINE_QUICK_LOOKUP;
	static DeclareMemType MTYPE_PIPELINE_RENDER_OBJECTS;
	static DeclareMemType MTYPE_PIPELINE_GENERATE_IMPOSTOR;
	static DeclareMemType MTYPE_PIPELINE_RENDER_BLOOM;

	static DeclareMemType MTYPE_UPKEEP_POOLS;

	static DeclareMemType MTYPE_AVATAR;
	static DeclareMemType MTYPE_AVATAR_MESH;
	static DeclareMemType MTYPE_PARTICLES;
	static DeclareMemType MTYPE_REGIONS;

	static DeclareMemType MTYPE_INVENTORY;
	static DeclareMemType MTYPE_INVENTORY_DRAW;
	static DeclareMemType MTYPE_INVENTORY_BUILD_NEW_VIEWS;
	static DeclareMemType MTYPE_INVENTORY_DO_FOLDER;
	static DeclareMemType MTYPE_INVENTORY_POST_BUILD;
	static DeclareMemType MTYPE_INVENTORY_FROM_XML;
	static DeclareMemType MTYPE_INVENTORY_CREATE_NEW_ITEM;
	static DeclareMemType MTYPE_INVENTORY_VIEW_INIT;
	static DeclareMemType MTYPE_INVENTORY_VIEW_SHOW;
	static DeclareMemType MTYPE_INVENTORY_VIEW_TOGGLE;

	static DeclareMemType MTYPE_ANIMATION;
	static DeclareMemType MTYPE_VOLUME;
	static DeclareMemType MTYPE_PRIMITIVE;
	
	static DeclareMemType MTYPE_SCRIPT;
	static DeclareMemType MTYPE_SCRIPT_RUN;
	static DeclareMemType MTYPE_SCRIPT_BYTECODE;
	
	static DeclareMemType MTYPE_IO_PUMP;
	static DeclareMemType MTYPE_IO_TCP;
	static DeclareMemType MTYPE_IO_BUFFER;
	static DeclareMemType MTYPE_IO_HTTP_SERVER;
	static DeclareMemType MTYPE_IO_SD_SERVER;
	static DeclareMemType MTYPE_IO_SD_CLIENT;
	static DeclareMemType MTYPE_IO_URL_REQUEST;

	static DeclareMemType MTYPE_DIRECTX_INIT;

	static DeclareMemType MTYPE_TEMP1;
	static DeclareMemType MTYPE_TEMP2;
	static DeclareMemType MTYPE_TEMP3;
	static DeclareMemType MTYPE_TEMP4;
	static DeclareMemType MTYPE_TEMP5;
	static DeclareMemType MTYPE_TEMP6;
	static DeclareMemType MTYPE_TEMP7;
	static DeclareMemType MTYPE_TEMP8;
	static DeclareMemType MTYPE_TEMP9;

	static DeclareMemType MTYPE_OTHER; // Special; used by display code

	S32 mTypeIndex;
};

//----------------------------------------------------------------------------

#endif