OCMPassByRefSetter.m 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /*
  2. * Copyright (c) 2009-2015 Erik Doernenburg and contributors
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may
  5. * not use these files except in compliance with the License. You may obtain
  6. * a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations
  14. * under the License.
  15. */
  16. #import "OCMPassByRefSetter.h"
  17. static NSHashTable *gPointerTable = nil;
  18. @implementation OCMPassByRefSetter
  19. + (void)initialize {
  20. if (self == [OCMPassByRefSetter class])
  21. {
  22. gPointerTable = [[NSHashTable hashTableWithOptions:NSPointerFunctionsOpaqueMemory | NSPointerFunctionsOpaquePersonality] retain];
  23. }
  24. }
  25. - (id)initWithValue:(id)aValue
  26. {
  27. if ((self = [super init]))
  28. {
  29. value = [aValue retain];
  30. @synchronized(gPointerTable) {
  31. NSHashInsertKnownAbsent(gPointerTable, self);
  32. }
  33. }
  34. return self;
  35. }
  36. - (void)dealloc
  37. {
  38. [value release];
  39. @synchronized(gPointerTable) {
  40. NSAssert(NSHashGet(gPointerTable, self) != NULL, @"self should be in the hash table");
  41. NSHashRemove(gPointerTable, self);
  42. }
  43. [super dealloc];
  44. }
  45. - (id)value
  46. {
  47. return value;
  48. }
  49. + (BOOL)ptrIsPassByRefSetter:(void*)ptr {
  50. @synchronized(gPointerTable) {
  51. return NSHashGet(gPointerTable, ptr) != NULL;
  52. }
  53. }
  54. @end