core/logic/Native.h
author Scott Ehlert <ds@alliedmods.net>
Sun Feb 09 22:50:20 2014 -0600 (2014-02-09)
changeset 4241 46fdb8cd9883
parent 4109 10eb68d668af
permissions -rw-r--r--
Use == instead of is operator for checking string equality in AMBuild scripts (bug 6043, r=dvander).
dvander@4109
     1
/**
dvander@4109
     2
 * vim: set ts=4 sw=4 tw=99 noet :
dvander@4109
     3
 * =============================================================================
dvander@4109
     4
 * SourceMod
dvander@4109
     5
 * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
dvander@4109
     6
 * =============================================================================
dvander@4109
     7
 *
dvander@4109
     8
 * This program is free software; you can redistribute it and/or modify it under
dvander@4109
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@4109
    10
 * Free Software Foundation.
dvander@4109
    11
 * 
dvander@4109
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@4109
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@4109
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@4109
    15
 * details.
dvander@4109
    16
 *
dvander@4109
    17
 * You should have received a copy of the GNU General Public License along with
dvander@4109
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@4109
    19
 *
dvander@4109
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@4109
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@4109
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@4109
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@4109
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@4109
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@4109
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@4109
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@4109
    28
 *
dvander@4109
    29
 * Version: $Id$
dvander@4109
    30
 */
dvander@4109
    31
#ifndef _include_sourcemod_native_h_
dvander@4109
    32
#define _include_sourcemod_native_h_
dvander@4109
    33
dvander@4109
    34
#include <IShareSys.h>
dvander@4109
    35
#include <IHandleSys.h>
dvander@4109
    36
#include <am-string.h>
dvander@4109
    37
#include <am-utility.h>
dvander@4109
    38
#include <am-refcounting.h>
dvander@4109
    39
#include "common_logic.h"
dvander@4109
    40
dvander@4109
    41
struct FakeNative
dvander@4109
    42
{
dvander@4109
    43
	FakeNative(const char *name, IPluginFunction *fun)
dvander@4109
    44
		: name(name),
dvander@4109
    45
		  ctx(fun->GetParentContext()),
dvander@4109
    46
		  call(fun),
dvander@4109
    47
		  gate(NULL)
dvander@4109
    48
	{
dvander@4109
    49
	}
dvander@4109
    50
	~FakeNative();
dvander@4109
    51
dvander@4109
    52
	ke::AString name;
dvander@4109
    53
	IPluginContext *ctx;
dvander@4109
    54
	IPluginFunction *call;
dvander@4109
    55
	SPVM_NATIVE_FUNC gate;
dvander@4109
    56
};
dvander@4109
    57
dvander@4109
    58
struct Native : public ke::Refcounted<Native>
dvander@4109
    59
{
dvander@4109
    60
	Native(CNativeOwner *owner, const sp_nativeinfo_t *native)
dvander@4109
    61
		: owner(owner),
dvander@4109
    62
		  native(native),
dvander@4109
    63
		  fake(NULL)
dvander@4109
    64
	{
dvander@4109
    65
	}
dvander@4109
    66
	Native(CNativeOwner *owner, FakeNative *fake)
dvander@4109
    67
		: owner(owner),
dvander@4109
    68
		  native(NULL),
dvander@4109
    69
		  fake(fake)
dvander@4109
    70
	{
dvander@4109
    71
	}
dvander@4109
    72
dvander@4109
    73
	CNativeOwner *owner;
dvander@4109
    74
	const sp_nativeinfo_t *native;
dvander@4109
    75
	ke::AutoPtr<FakeNative> fake;
dvander@4109
    76
dvander@4109
    77
	SPVM_NATIVE_FUNC func() const
dvander@4109
    78
	{
dvander@4109
    79
		if (native)
dvander@4109
    80
			return native->func;
dvander@4109
    81
		return fake->gate;
dvander@4109
    82
	}
dvander@4109
    83
	const char *name() const
dvander@4109
    84
	{
dvander@4109
    85
		if (native)
dvander@4109
    86
			return native->name;
dvander@4109
    87
		return fake->name.chars();
dvander@4109
    88
	}
dvander@4109
    89
dvander@4109
    90
	static inline bool matches(const char *name, const ke::Ref<Native> &entry)
dvander@4109
    91
	{
dvander@4109
    92
		return strcmp(name, entry->name()) == 0;
dvander@4109
    93
	}
dvander@4109
    94
};
dvander@4109
    95
dvander@4109
    96
dvander@4109
    97
#endif // _include_sourcemod_native_h_
dvander@4109
    98