SFB::InputSource::unique_ptr SFB::InputSource::CreateForURL(CFURLRef url, int flags, CFErrorRef *error) { if(nullptr == url) return nullptr; // If there is no scheme the URL is invalid SFB::CFString scheme = CFURLCopyScheme(url); if(!scheme) { if(error) *error = CFErrorCreate(kCFAllocatorDefault, kCFErrorDomainPOSIX, EINVAL, nullptr); return nullptr; } if(kCFCompareEqualTo == CFStringCompare(CFSTR("file"), scheme, kCFCompareCaseInsensitive)) { if(InputSource::MemoryMapFiles & flags) return unique_ptr(new MemoryMappedFileInputSource(url)); else if(InputSource::LoadFilesInMemory & flags) return unique_ptr(new InMemoryFileInputSource(url)); else return unique_ptr(new FileInputSource(url)); } else if(kCFCompareEqualTo == CFStringCompare(CFSTR("http"), scheme, kCFCompareCaseInsensitive)) return unique_ptr(new HTTPInputSource(url)); return nullptr; }
SFB::Audio::Decoder::unique_ptr SFB::Audio::LoopableRegionDecoder::CreateForDecoderRegion(Decoder::unique_ptr decoder, SInt64 startingFrame, UInt32 frameCount, UInt32 repeatCount, CFErrorRef *) { if(!decoder) return nullptr; return unique_ptr(new LoopableRegionDecoder(std::move(decoder), startingFrame, frameCount, repeatCount)); }
SFB::Audio::Decoder::unique_ptr SFB::Audio::LoopableRegionDecoder::CreateForDecoderRegion(Decoder::unique_ptr decoder, SInt64 startingFrame, CFErrorRef */*error*/) { if(!decoder) return nullptr; return unique_ptr(new LoopableRegionDecoder(std::move(decoder), startingFrame)); }
SFB::InputSource::unique_ptr SFB::InputSource::CreateWithMemory(const void *bytes, SInt64 byteCount, bool copyBytes, CFErrorRef *error) { if(nullptr == bytes || 0 >= byteCount) return nullptr; return unique_ptr(new MemoryInputSource(bytes, byteCount, copyBytes)); }
//! Loading std::unique_ptr, case when user provides load_and_allocate for polymorphic types template <class Archive, class T, class D> inline typename std::enable_if<std::is_polymorphic<T>::value, void>::type load( Archive & ar, std::unique_ptr<T, D> & ptr ) { std::uint32_t nameid; ar( nameid ); // Check to see if we can skip all of this polymorphism business if(polymorphic_detail::serialize_wrapper(ar, ptr, nameid)) return; auto binding = polymorphic_detail::getInputBinding(ar, nameid); std::unique_ptr<void, ::cereal::detail::EmptyDeleter<void>> result; binding.unique_ptr(&ar, result); ptr.reset(static_cast<T*>(result.release())); }
unique_ptr<T> make_unique(Args&& ...args) { using lifecycle = typename traits<T>::lifecycle; using unique_ptr = unique_ptr<T>; return unique_ptr(lifecycle::ctor(std::forward<Args>(args)...), lifecycle::dtor); }
SFB::Audio::Metadata::unique_ptr SFB::Audio::WAVEMetadata::CreateMetadata(CFURLRef url) { return unique_ptr(new WAVEMetadata(url)); }
SFB::Audio::Metadata::unique_ptr SFB::Audio::Musepack::CreateMetadata(CFURLRef url) { return unique_ptr(new Musepack(url)); }
SFB::Audio::Decoder::unique_ptr SFB::Audio::MusepackDecoder::CreateDecoder(InputSource::unique_ptr inputSource) { return unique_ptr(new MusepackDecoder(std::move(inputSource))); }
SFB::Audio::Decoder::unique_ptr SFB::Audio::TrueAudioDecoder::CreateDecoder(InputSource::unique_ptr inputSource) { return unique_ptr(new TrueAudioDecoder(std::move(inputSource))); }
SFB::Audio::Metadata::unique_ptr SFB::Audio::OggFLACMetadata::CreateMetadata(CFURLRef url) { return unique_ptr(new OggFLACMetadata(url)); }
SFB::Audio::Decoder::unique_ptr SFB::Audio::LibsndfileDecoder::CreateDecoder(InputSource::unique_ptr inputSource) { return unique_ptr(new LibsndfileDecoder(std::move(inputSource))); }
SFB::Audio::Decoder::unique_ptr SFB::Audio::OggSpeexDecoder::CreateDecoder(InputSource::unique_ptr inputSource) { return unique_ptr(new OggSpeexDecoder(std::move(inputSource))); }
SFB::Audio::Metadata::unique_ptr SFB::Audio::TrueAudioMetadata::CreateMetadata(CFURLRef url) { return unique_ptr(new TrueAudioMetadata(url)); }