1/* 2 * Copyright (c) 2000-2001,2003-2004,2006,2011,2014 Apple Inc. All Rights Reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. Please obtain a copy of the License at 10 * http://www.opensource.apple.com/apsl/ and read it before using this 11 * file. 12 * 13 * The Original Code and all software distributed under the License are 14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 18 * Please see the License for the specific language governing rights and 19 * limitations under the License. 20 * 21 * @APPLE_LICENSE_HEADER_END@ 22 */ 23 24 25// 26// constdata - shared constant binary data objects 27// 28#ifndef _H_CONSTDATA 29#define _H_CONSTDATA 30 31#include <security_utilities/utilities.h> 32#include <security_utilities/refcount.h> 33 34 35namespace Security { 36 37 38// 39// ConstData represents a contiguous, binary blob of constant data. 40// Assignment is by sharing (thus cheap). 41// ConstData is a (constant) Dataoid type. 42// 43class ConstData { 44private: 45 class Blob : public RefCount { 46 public: 47 Blob() : mData(NULL), mSize(0) { } 48 Blob(const void *base, size_t size, bool takeOwnership = false); 49 ~Blob() { delete[] reinterpret_cast<const char *>(mData); } 50 51 const void *data() const { return mData; } 52 size_t length() const { return mSize; } 53 54 private: 55 const void *mData; 56 size_t mSize; 57 }; 58 59public: 60 ConstData() { } //@@@ use a nullBlob? 61 ConstData(const void *base, size_t size, bool takeOwnership = false) 62 : mBlob(new Blob(base, size, takeOwnership)) { } 63 64 template <class T> 65 static ConstData wrap(const T &obj, bool takeOwnership) 66 { return ConstData(&obj, sizeof(obj), takeOwnership); } 67 68public: 69 const void *data() const { return mBlob ? mBlob->data() : NULL; } 70 size_t length() const { return mBlob ? mBlob->length() : 0; } 71 72 operator bool() const { return mBlob; } 73 bool operator !() const { return !mBlob; } 74 75 template <class T> operator const T *() const 76 { return reinterpret_cast<const T *>(data()); } 77 78 template <class T> const T &as() const 79 { return *static_cast<const T *>(reinterpret_cast<const T *>(data())); } 80 81private: 82 RefPointer<Blob> mBlob; 83}; 84 85 86} // end namespace Security 87 88 89#endif //_H_CONSTDATA 90