2009-02-10 19:47:01 +00:00
|
|
|
/**Interface for NSConcretePointerFunctions for GNUStep
|
|
|
|
Copyright (C) 2009 Free Software Foundation, Inc.
|
|
|
|
|
|
|
|
Written by: Richard Frith-Macdonald <rfm@gnu.org>
|
|
|
|
Date: 2009
|
|
|
|
|
|
|
|
This file is part of the GNUstep Base Library.
|
|
|
|
|
|
|
|
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; either
|
|
|
|
version 2 of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
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
|
|
|
|
Library 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 02111 USA.
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#import "Foundation/NSPointerFunctions.h"
|
|
|
|
|
|
|
|
@interface NSConcretePointerFunctions : NSPointerFunctions
|
|
|
|
{
|
|
|
|
@public
|
|
|
|
NSUInteger _options;
|
|
|
|
|
|
|
|
void* (*_acquireFunction)(const void *item,
|
|
|
|
NSUInteger (*size)(const void *item), BOOL shouldCopy);
|
|
|
|
|
|
|
|
NSString *(*_descriptionFunction)(const void *item);
|
|
|
|
|
|
|
|
NSUInteger (*_hashFunction)(const void *item,
|
|
|
|
NSUInteger (*size)(const void *item));
|
|
|
|
|
|
|
|
BOOL (*_isEqualFunction)(const void *item1, const void *item2,
|
|
|
|
NSUInteger (*size)(const void *item));
|
|
|
|
|
|
|
|
void (*_relinquishFunction)(const void *item,
|
|
|
|
NSUInteger (*size)(const void *item));
|
|
|
|
|
|
|
|
NSUInteger (*_sizeFunction)(const void *item);
|
|
|
|
|
|
|
|
BOOL _shouldCopyIn;
|
|
|
|
|
|
|
|
BOOL _usesStrongWriteBarrier;
|
|
|
|
|
|
|
|
BOOL _usesWeakReadAndWriteBarriers;
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
2009-02-14 18:18:26 +00:00
|
|
|
/* Wrapper functions to make use of the pointer functions.
|
2009-02-14 16:38:59 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
/* Acquire the pointer value to store for the specified item.
|
|
|
|
*/
|
2009-02-14 18:18:26 +00:00
|
|
|
static inline void
|
|
|
|
pointerFunctionsAcquire(NSConcretePointerFunctions *PF, void **dst, void *src)
|
|
|
|
{
|
|
|
|
if (PF->_acquireFunction != 0)
|
|
|
|
src = (*PF->_acquireFunction)(src, PF->_sizeFunction, PF->_shouldCopyIn);
|
|
|
|
#if GS_WITH_GC
|
|
|
|
if (PF->usesWeakReadAndWriteBarriers)
|
|
|
|
GSAssignZeroingWeakPointer(dst, src);
|
|
|
|
else
|
|
|
|
#endif
|
|
|
|
*dst = src;
|
|
|
|
}
|
2009-02-14 16:38:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* Generate an NSString description of the item
|
|
|
|
*/
|
2009-02-14 18:18:26 +00:00
|
|
|
static inline NSString *
|
|
|
|
pointerFunctionsDescribe(NSConcretePointerFunctions *PF, void *item)
|
|
|
|
{
|
|
|
|
if (PF->_descriptionFunction != 0)
|
|
|
|
return (*PF->_descriptionFunction)(item);
|
|
|
|
return nil;
|
|
|
|
}
|
2009-02-14 16:38:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* Generate the hash of the item
|
|
|
|
*/
|
2009-02-14 18:18:26 +00:00
|
|
|
static inline NSUInteger
|
|
|
|
pointerFunctionsHash(NSConcretePointerFunctions *PF, void *item)
|
|
|
|
{
|
|
|
|
if (PF->_hashFunction != 0)
|
|
|
|
return (*PF->_hashFunction)(item, PF->_sizeFunction);
|
|
|
|
return (NSUInteger)item;
|
|
|
|
}
|
2009-02-14 16:38:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* Compare two items for equality
|
|
|
|
*/
|
2009-02-14 18:18:26 +00:00
|
|
|
static inline BOOL
|
|
|
|
pointerFunctionsEqual(NSConcretePointerFunctions *PF, void *item1, void *item2)
|
|
|
|
{
|
|
|
|
if (PF->_isEqualFunction != 0)
|
|
|
|
return (*PF->_isEqualFunction)(item1, item2, PF->_sizeFunction);
|
|
|
|
if (item1 == item2)
|
|
|
|
return YES;
|
|
|
|
return NO;
|
|
|
|
}
|
2009-02-14 16:38:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
/* Relinquish the specified item and set it to zero.
|
|
|
|
*/
|
2009-02-14 18:18:26 +00:00
|
|
|
static inline void
|
|
|
|
pointerFunctionsRelinquish(NSConcretePointerFunctions *PF, void **itemptr)
|
|
|
|
{
|
|
|
|
if (PF->_relinquishFunction != 0)
|
|
|
|
(*PF->_relinquishFunction)(*itemptr, PF->_sizeFunction);
|
|
|
|
if (PF->_usesWeakReadAndWriteBarriers)
|
|
|
|
GSAssignZeroingWeakPointer(itemptr, (void*)0);
|
|
|
|
else
|
|
|
|
*itemptr = 0;
|
|
|
|
}
|
2009-02-14 16:38:59 +00:00
|
|
|
|