Use StringRef and ArrayRef return values when buf passed.

For functions where a SmallVector is passed to be used as a stack buffer for
the return value, have the return value be the appropriate StringRef or
ArrayRef type.  This allows for both more natural usage and enables directly
returning (rather than copying) a permanently stored or constant string.
This commit is contained in:
Peter Johnson
2016-09-10 21:30:39 -07:00
parent c4ceec145a
commit 052f746c68
11 changed files with 141 additions and 125 deletions

View File

@@ -14,6 +14,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "llvm/ArrayRef.h"
#include "llvm/SmallVector.h" #include "llvm/SmallVector.h"
#include "llvm/StringRef.h" #include "llvm/StringRef.h"
@@ -50,8 +51,9 @@ struct USBCameraInfo {
CS_PropertyType GetPropertyType(CS_Property property, CS_Status* status); CS_PropertyType GetPropertyType(CS_Property property, CS_Status* status);
std::string GetPropertyName(CS_Property property, CS_Status* status); std::string GetPropertyName(CS_Property property, CS_Status* status);
void GetPropertyName(CS_Property property, llvm::SmallVectorImpl<char>& name, llvm::StringRef GetPropertyName(CS_Property property,
CS_Status* status); llvm::SmallVectorImpl<char>& buf,
CS_Status* status);
bool GetBooleanProperty(CS_Property property, CS_Status* status); bool GetBooleanProperty(CS_Property property, CS_Status* status);
void SetBooleanProperty(CS_Property property, bool value, CS_Status* status); void SetBooleanProperty(CS_Property property, bool value, CS_Status* status);
double GetDoubleProperty(CS_Property property, CS_Status* status); double GetDoubleProperty(CS_Property property, CS_Status* status);
@@ -59,8 +61,9 @@ void SetDoubleProperty(CS_Property property, double value, CS_Status* status);
double GetDoublePropertyMin(CS_Property property, CS_Status* status); double GetDoublePropertyMin(CS_Property property, CS_Status* status);
double GetDoublePropertyMax(CS_Property property, CS_Status* status); double GetDoublePropertyMax(CS_Property property, CS_Status* status);
std::string GetStringProperty(CS_Property property, CS_Status* status); std::string GetStringProperty(CS_Property property, CS_Status* status);
void GetStringProperty(CS_Property property, llvm::SmallVectorImpl<char>& value, llvm::StringRef GetStringProperty(CS_Property property,
CS_Status* status); llvm::SmallVectorImpl<char>& buf,
CS_Status* status);
void SetStringProperty(CS_Property property, llvm::StringRef value, void SetStringProperty(CS_Property property, llvm::StringRef value,
CS_Status* status); CS_Status* status);
int GetEnumProperty(CS_Property property, CS_Status* status); int GetEnumProperty(CS_Property property, CS_Status* status);
@@ -83,19 +86,21 @@ CS_Source CreateCvSource(llvm::StringRef name, int numChannels,
// Source Functions // Source Functions
// //
std::string GetSourceName(CS_Source source, CS_Status* status); std::string GetSourceName(CS_Source source, CS_Status* status);
void GetSourceName(CS_Source source, llvm::SmallVectorImpl<char>& name, llvm::StringRef GetSourceName(CS_Source source,
CS_Status* status); llvm::SmallVectorImpl<char>& buf,
CS_Status* status);
std::string GetSourceDescription(CS_Source source, CS_Status* status); std::string GetSourceDescription(CS_Source source, CS_Status* status);
void GetSourceDescription(CS_Source source, llvm::SmallVectorImpl<char>& desc, llvm::StringRef GetSourceDescription(CS_Source source,
CS_Status* status); llvm::SmallVectorImpl<char>& buf,
CS_Status* status);
uint64_t GetSourceLastFrameTime(CS_Source source, CS_Status* status); uint64_t GetSourceLastFrameTime(CS_Source source, CS_Status* status);
int GetSourceNumChannels(CS_Source source, CS_Status* status); int GetSourceNumChannels(CS_Source source, CS_Status* status);
bool IsSourceConnected(CS_Source source, CS_Status* status); bool IsSourceConnected(CS_Source source, CS_Status* status);
CS_Property GetSourceProperty(CS_Source source, llvm::StringRef name, CS_Property GetSourceProperty(CS_Source source, llvm::StringRef name,
CS_Status* status); CS_Status* status);
void EnumerateSourceProperties(CS_Source source, llvm::ArrayRef<CS_Property> EnumerateSourceProperties(
llvm::SmallVectorImpl<CS_Property>& properties, CS_Source source, llvm::SmallVectorImpl<CS_Property>& vec,
CS_Status* status); CS_Status* status);
CS_Source CopySource(CS_Source source, CS_Status* status); CS_Source CopySource(CS_Source source, CS_Status* status);
void ReleaseSource(CS_Source source, CS_Status* status); void ReleaseSource(CS_Source source, CS_Status* status);
@@ -133,11 +138,12 @@ CS_Sink CreateCvSinkCallback(llvm::StringRef name,
// Sink Functions // Sink Functions
// //
std::string GetSinkName(CS_Sink sink, CS_Status* status); std::string GetSinkName(CS_Sink sink, CS_Status* status);
void GetSinkName(CS_Sink sink, llvm::SmallVectorImpl<char>& name, llvm::StringRef GetSinkName(CS_Sink sink, llvm::SmallVectorImpl<char>& buf,
CS_Status* status); CS_Status* status);
std::string GetSinkDescription(CS_Sink sink, CS_Status* status); std::string GetSinkDescription(CS_Sink sink, CS_Status* status);
void GetSinkDescription(CS_Sink sink, llvm::SmallVectorImpl<char>& desc, llvm::StringRef GetSinkDescription(CS_Sink sink,
CS_Status* status); llvm::SmallVectorImpl<char>& buf,
CS_Status* status);
void SetSinkSource(CS_Sink sink, CS_Source source, CS_Status* status); void SetSinkSource(CS_Sink sink, CS_Source source, CS_Status* status);
CS_Property GetSinkSourceProperty(CS_Sink sink, llvm::StringRef name, CS_Property GetSinkSourceProperty(CS_Sink sink, llvm::StringRef name,
CS_Status* status); CS_Status* status);
@@ -157,8 +163,8 @@ uint64_t SinkWaitForFrame(CS_Sink sink, CS_Status* status);
bool GetSinkImage(CS_Sink sink, int channel, cv::Mat* image, CS_Status* status); bool GetSinkImage(CS_Sink sink, int channel, cv::Mat* image, CS_Status* status);
uint64_t GrabSinkFrame(CS_Sink sink, cv::Mat* image, CS_Status* status); uint64_t GrabSinkFrame(CS_Sink sink, cv::Mat* image, CS_Status* status);
std::string GetSinkError(CS_Sink sink, CS_Status* status); std::string GetSinkError(CS_Sink sink, CS_Status* status);
void GetSinkError(CS_Sink sink, llvm::SmallVectorImpl<char>& msg, llvm::StringRef GetSinkError(CS_Sink sink, llvm::SmallVectorImpl<char>& buf,
CS_Status* status); CS_Status* status);
void SetSinkEnabled(CS_Sink sink, bool enabled, CS_Status* status); void SetSinkEnabled(CS_Sink sink, bool enabled, CS_Status* status);
// //
@@ -182,10 +188,10 @@ void RemoveSinkListener(CS_Listener handle, CS_Status* status);
// //
std::vector<USBCameraInfo> EnumerateUSBCameras(CS_Status* status); std::vector<USBCameraInfo> EnumerateUSBCameras(CS_Status* status);
void EnumerateSourceHandles(llvm::SmallVectorImpl<CS_Source>& handles, llvm::ArrayRef<CS_Source> EnumerateSourceHandles(
CS_Status* status); llvm::SmallVectorImpl<CS_Source>& vec, CS_Status* status);
void EnumerateSinkHandles(llvm::SmallVectorImpl<CS_Sink>& handles, llvm::ArrayRef<CS_Sink> EnumerateSinkHandles(
CS_Status* status); llvm::SmallVectorImpl<CS_Sink>& vec, CS_Status* status);
} // namespace cs } // namespace cs

View File

@@ -63,7 +63,7 @@ class VideoProperty {
// String-specific functions // String-specific functions
std::string GetString() const; std::string GetString() const;
void GetString(llvm::SmallVectorImpl<char>& value) const; llvm::StringRef GetString(llvm::SmallVectorImpl<char>& buf) const;
void SetString(llvm::StringRef value); void SetString(llvm::StringRef value);
// Enum-specific functions // Enum-specific functions

View File

@@ -50,9 +50,10 @@ inline std::string VideoProperty::GetString() const {
return GetStringProperty(m_handle, &m_status); return GetStringProperty(m_handle, &m_status);
} }
inline void VideoProperty::GetString(llvm::SmallVectorImpl<char>& value) const { inline llvm::StringRef VideoProperty::GetString(
llvm::SmallVectorImpl<char>& buf) const {
m_status = 0; m_status = 0;
GetStringProperty(m_handle, value, &m_status); return GetStringProperty(m_handle, buf, &m_status);
} }
inline void VideoProperty::SetString(llvm::StringRef value) { inline void VideoProperty::SetString(llvm::StringRef value) {

View File

@@ -99,8 +99,8 @@ JNIEXPORT jstring JNICALL Java_edu_wpi_cameraserver_CameraServerJNI_getPropertyN
(JNIEnv *env, jclass, jint property) (JNIEnv *env, jclass, jint property)
{ {
CS_Status status; CS_Status status;
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetPropertyName(property, str, &status); auto str = cs::GetPropertyName(property, buf, &status);
if (!CheckStatus(env, status)) return nullptr; if (!CheckStatus(env, status)) return nullptr;
return MakeJString(env, str); return MakeJString(env, str);
} }
@@ -196,8 +196,8 @@ JNIEXPORT jstring JNICALL Java_edu_wpi_cameraserver_CameraServerJNI_getStringPro
(JNIEnv *env, jclass, jint property) (JNIEnv *env, jclass, jint property)
{ {
CS_Status status; CS_Status status;
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetStringProperty(property, str, &status); auto str = cs::GetStringProperty(property, buf, &status);
if (!CheckStatus(env, status)) return nullptr; if (!CheckStatus(env, status)) return nullptr;
return MakeJString(env, str); return MakeJString(env, str);
} }
@@ -323,8 +323,8 @@ JNIEXPORT jstring JNICALL Java_edu_wpi_cameraserver_CameraServerJNI_getSourceNam
(JNIEnv *env, jclass, jint source) (JNIEnv *env, jclass, jint source)
{ {
CS_Status status; CS_Status status;
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetSourceName(source, str, &status); auto str = cs::GetSourceName(source, buf, &status);
if (!CheckStatus(env, status)) return nullptr; if (!CheckStatus(env, status)) return nullptr;
return MakeJString(env, str); return MakeJString(env, str);
} }
@@ -338,8 +338,8 @@ JNIEXPORT jstring JNICALL Java_edu_wpi_cameraserver_CameraServerJNI_getSourceDes
(JNIEnv *env, jclass, jint source) (JNIEnv *env, jclass, jint source)
{ {
CS_Status status; CS_Status status;
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetSourceDescription(source, str, &status); auto str = cs::GetSourceDescription(source, buf, &status);
if (!CheckStatus(env, status)) return nullptr; if (!CheckStatus(env, status)) return nullptr;
return MakeJString(env, str); return MakeJString(env, str);
} }
@@ -409,8 +409,8 @@ JNIEXPORT jintArray JNICALL Java_edu_wpi_cameraserver_CameraServerJNI_enumerateS
(JNIEnv *env, jclass, jint source) (JNIEnv *env, jclass, jint source)
{ {
CS_Status status; CS_Status status;
llvm::SmallVector<CS_Property, 32> arr; llvm::SmallVector<CS_Property, 32> buf;
cs::EnumerateSourceProperties(source, arr, &status); auto arr = cs::EnumerateSourceProperties(source, buf, &status);
if (!CheckStatus(env, status)) return nullptr; if (!CheckStatus(env, status)) return nullptr;
return MakeJIntArray(env, arr); return MakeJIntArray(env, arr);
} }
@@ -562,8 +562,8 @@ JNIEXPORT jstring JNICALL Java_edu_wpi_cameraserver_CameraServerJNI_getSinkName
(JNIEnv *env, jclass, jint sink) (JNIEnv *env, jclass, jint sink)
{ {
CS_Status status; CS_Status status;
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetSinkName(sink, str, &status); auto str = cs::GetSinkName(sink, buf, &status);
if (!CheckStatus(env, status)) return nullptr; if (!CheckStatus(env, status)) return nullptr;
return MakeJString(env, str); return MakeJString(env, str);
} }
@@ -577,8 +577,8 @@ JNIEXPORT jstring JNICALL Java_edu_wpi_cameraserver_CameraServerJNI_getSinkDescr
(JNIEnv *env, jclass, jint sink) (JNIEnv *env, jclass, jint sink)
{ {
CS_Status status; CS_Status status;
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetSinkDescription(sink, str, &status); auto str = cs::GetSinkDescription(sink, buf, &status);
if (!CheckStatus(env, status)) return nullptr; if (!CheckStatus(env, status)) return nullptr;
return MakeJString(env, str); return MakeJString(env, str);
} }
@@ -687,8 +687,8 @@ JNIEXPORT jstring JNICALL Java_edu_wpi_cameraserver_CameraServerJNI_getSinkError
(JNIEnv *env, jclass, jint sink) (JNIEnv *env, jclass, jint sink)
{ {
CS_Status status; CS_Status status;
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetSinkError(sink, str, &status); auto str = cs::GetSinkError(sink, buf, &status);
if (!CheckStatus(env, status)) return nullptr; if (!CheckStatus(env, status)) return nullptr;
return MakeJString(env, str); return MakeJString(env, str);
} }
@@ -762,8 +762,8 @@ JNIEXPORT jintArray JNICALL Java_edu_wpi_cameraserver_CameraServerJNI_enumerateS
(JNIEnv *env, jclass) (JNIEnv *env, jclass)
{ {
CS_Status status; CS_Status status;
llvm::SmallVector<CS_Source, 16> arr; llvm::SmallVector<CS_Source, 16> buf;
cs::EnumerateSourceHandles(arr, &status); auto arr = cs::EnumerateSourceHandles(buf, &status);
if (!CheckStatus(env, status)) return nullptr; if (!CheckStatus(env, status)) return nullptr;
return MakeJIntArray(env, arr); return MakeJIntArray(env, arr);
} }
@@ -777,8 +777,8 @@ JNIEXPORT jintArray JNICALL Java_edu_wpi_cameraserver_CameraServerJNI_enumerateS
(JNIEnv *env, jclass) (JNIEnv *env, jclass)
{ {
CS_Status status; CS_Status status;
llvm::SmallVector<CS_Sink, 16> arr; llvm::SmallVector<CS_Sink, 16> buf;
cs::EnumerateSinkHandles(arr, &status); auto arr = cs::EnumerateSinkHandles(buf, &status);
if (!CheckStatus(env, status)) return nullptr; if (!CheckStatus(env, status)) return nullptr;
return MakeJIntArray(env, arr); return MakeJIntArray(env, arr);
} }

View File

@@ -258,9 +258,9 @@ HTTPSinkImpl::HTTPSinkImpl(llvm::StringRef name, llvm::StringRef description,
HTTPSinkImpl::~HTTPSinkImpl() { Stop(); } HTTPSinkImpl::~HTTPSinkImpl() { Stop(); }
void HTTPSinkImpl::GetDescription(llvm::SmallVectorImpl<char>& desc) const { llvm::StringRef HTTPSinkImpl::GetDescription(
llvm::raw_svector_ostream oss{desc}; llvm::SmallVectorImpl<char>& buf) const {
oss << m_description; return m_description;
} }
void HTTPSinkImpl::Stop() { void HTTPSinkImpl::Stop() {

View File

@@ -35,7 +35,8 @@ class HTTPSinkImpl : public SinkImpl {
std::unique_ptr<wpi::NetworkAcceptor> acceptor); std::unique_ptr<wpi::NetworkAcceptor> acceptor);
~HTTPSinkImpl() override; ~HTTPSinkImpl() override;
void GetDescription(llvm::SmallVectorImpl<char>& desc) const override; llvm::StringRef GetDescription(
llvm::SmallVectorImpl<char>& buf) const override;
void SetSourceChannel(int channel) { m_sourceChannel.store(channel); } void SetSourceChannel(int channel) { m_sourceChannel.store(channel); }

View File

@@ -28,7 +28,8 @@ class SinkImpl {
SinkImpl& operator=(const SinkImpl& queue) = delete; SinkImpl& operator=(const SinkImpl& queue) = delete;
llvm::StringRef GetName() const { return m_name; } llvm::StringRef GetName() const { return m_name; }
virtual void GetDescription(llvm::SmallVectorImpl<char>& desc) const = 0; virtual llvm::StringRef GetDescription(
llvm::SmallVectorImpl<char>& buf) const = 0;
void Enable() { void Enable() {
std::lock_guard<std::mutex> lock(m_mutex); std::lock_guard<std::mutex> lock(m_mutex);

View File

@@ -15,6 +15,7 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "llvm/ArrayRef.h"
#include "llvm/StringRef.h" #include "llvm/StringRef.h"
#include "cameraserver_c.h" #include "cameraserver_c.h"
#include "Frame.h" #include "Frame.h"
@@ -31,7 +32,8 @@ class SourceImpl {
SourceImpl& operator=(const SourceImpl& queue) = delete; SourceImpl& operator=(const SourceImpl& queue) = delete;
llvm::StringRef GetName() const { return m_name; } llvm::StringRef GetName() const { return m_name; }
virtual void GetDescription(llvm::SmallVectorImpl<char>& desc) const = 0; virtual llvm::StringRef GetDescription(
llvm::SmallVectorImpl<char>& buf) const = 0;
int GetNumChannels() const { return m_numChannels; } int GetNumChannels() const { return m_numChannels; }
bool IsConnected() const { return m_connected; } bool IsConnected() const { return m_connected; }
@@ -78,19 +80,19 @@ class SourceImpl {
// Property functions // Property functions
virtual int GetProperty(llvm::StringRef name) const = 0; virtual int GetProperty(llvm::StringRef name) const = 0;
virtual void EnumerateProperties( virtual llvm::ArrayRef<int> EnumerateProperties(
llvm::SmallVectorImpl<int>& properties) const = 0; llvm::SmallVectorImpl<int>& vec) const = 0;
virtual CS_PropertyType GetPropertyType(int property) const = 0; virtual CS_PropertyType GetPropertyType(int property) const = 0;
virtual void GetPropertyName(int property, virtual llvm::StringRef GetPropertyName(
llvm::SmallVectorImpl<char>& name) const = 0; int property, llvm::SmallVectorImpl<char>& buf) const = 0;
virtual bool GetBooleanProperty(int property) const = 0; virtual bool GetBooleanProperty(int property) const = 0;
virtual void SetBooleanProperty(int property, bool value) = 0; virtual void SetBooleanProperty(int property, bool value) = 0;
virtual double GetDoubleProperty(int property) const = 0; virtual double GetDoubleProperty(int property) const = 0;
virtual void SetDoubleProperty(int property, double value) = 0; virtual void SetDoubleProperty(int property, double value) = 0;
virtual double GetPropertyMin(int property) const = 0; virtual double GetPropertyMin(int property) const = 0;
virtual double GetPropertyMax(int property) const = 0; virtual double GetPropertyMax(int property) const = 0;
virtual void GetStringProperty(int property, virtual llvm::StringRef GetStringProperty(
llvm::SmallVectorImpl<char>& value) const = 0; int property, llvm::SmallVectorImpl<char>& buf) const = 0;
virtual void SetStringProperty(int property, llvm::StringRef value) = 0; virtual void SetStringProperty(int property, llvm::StringRef value) = 0;
virtual int GetEnumProperty(int property) const = 0; virtual int GetEnumProperty(int property) const = 0;
virtual void SetEnumProperty(int property, int value) = 0; virtual void SetEnumProperty(int property, int value) = 0;

View File

@@ -12,6 +12,7 @@
#include <mutex> #include <mutex>
#include <vector> #include <vector>
#include "llvm/ArrayRef.h"
#include "llvm/SmallVector.h" #include "llvm/SmallVector.h"
#include "support/atomic_static.h" #include "support/atomic_static.h"
@@ -52,7 +53,7 @@ class UnlimitedHandleResource {
void Free(THandle handle); void Free(THandle handle);
template <typename T> template <typename T>
void GetAll(llvm::SmallVectorImpl<T>& handles); llvm::ArrayRef<T> GetAll(llvm::SmallVectorImpl<T>& vec);
private: private:
THandle MakeHandle(size_t i) { THandle MakeHandle(size_t i) {
@@ -124,13 +125,15 @@ void UnlimitedHandleResource<THandle, TStruct, typeValue, TMutex>::Free(
template <typename THandle, typename TStruct, int typeValue, typename TMutex> template <typename THandle, typename TStruct, int typeValue, typename TMutex>
template <typename T> template <typename T>
void UnlimitedHandleResource<THandle, TStruct, typeValue, TMutex>::GetAll( llvm::ArrayRef<T>
llvm::SmallVectorImpl<T>& handles) { UnlimitedHandleResource<THandle, TStruct, typeValue, TMutex>::GetAll(
llvm::SmallVectorImpl<T>& vec) {
std::lock_guard<TMutex> sync(m_handleMutex); std::lock_guard<TMutex> sync(m_handleMutex);
size_t i; size_t i;
for (i = 0; i < m_structures.size(); i++) { for (i = 0; i < m_structures.size(); i++) {
if (m_structures[i] != nullptr) handles.push_back(MakeHandle(i)); if (m_structures[i] != nullptr) vec.push_back(MakeHandle(i));
} }
return vec;
} }
template <typename THandle, typename TStruct, int typeValue, template <typename THandle, typename TStruct, int typeValue,

View File

@@ -32,8 +32,8 @@ CS_PropertyType CS_GetPropertyType(CS_Property property, CS_Status* status) {
} }
char* CS_GetPropertyName(CS_Property property, CS_Status* status) { char* CS_GetPropertyName(CS_Property property, CS_Status* status) {
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetPropertyName(property, str, status); auto str = cs::GetPropertyName(property, buf, status);
if (*status != 0) return nullptr; if (*status != 0) return nullptr;
return ConvertToC(str); return ConvertToC(str);
} }
@@ -65,8 +65,8 @@ double CS_GetDoublePropertyMax(CS_Property property, CS_Status* status) {
} }
char* CS_GetStringProperty(CS_Property property, CS_Status* status) { char* CS_GetStringProperty(CS_Property property, CS_Status* status) {
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetStringProperty(property, str, status); auto str = cs::GetStringProperty(property, buf, status);
if (*status != 0) return nullptr; if (*status != 0) return nullptr;
return ConvertToC(str); return ConvertToC(str);
} }
@@ -114,15 +114,15 @@ CS_Source CS_CreateCvSource(const char* name, int numChannels,
} }
char* CS_GetSourceName(CS_Source source, CS_Status* status) { char* CS_GetSourceName(CS_Source source, CS_Status* status) {
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetSourceName(source, str, status); auto str = cs::GetSourceName(source, buf, status);
if (*status != 0) return nullptr; if (*status != 0) return nullptr;
return ConvertToC(str); return ConvertToC(str);
} }
char* CS_GetSourceDescription(CS_Source source, CS_Status* status) { char* CS_GetSourceDescription(CS_Source source, CS_Status* status) {
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetSourceDescription(source, str, status); auto str = cs::GetSourceDescription(source, buf, status);
if (*status != 0) return nullptr; if (*status != 0) return nullptr;
return ConvertToC(str); return ConvertToC(str);
} }
@@ -146,8 +146,8 @@ CS_Property CS_GetSourceProperty(CS_Source source, const char* name,
CS_Property* CS_EnumerateSourceProperties(CS_Source source, int* count, CS_Property* CS_EnumerateSourceProperties(CS_Source source, int* count,
CS_Status* status) { CS_Status* status) {
llvm::SmallVector<CS_Property, 32> vec; llvm::SmallVector<CS_Property, 32> buf;
cs::EnumerateSourceProperties(source, vec, status); auto vec = cs::EnumerateSourceProperties(source, buf, status);
CS_Property* out = CS_Property* out =
static_cast<CS_Property*>(std::malloc(vec.size() * sizeof(CS_Property))); static_cast<CS_Property*>(std::malloc(vec.size() * sizeof(CS_Property)));
*count = vec.size(); *count = vec.size();
@@ -224,15 +224,15 @@ CS_Sink CS_CreateCvSinkCallback(const char* name, void* data,
} }
char* CS_GetSinkName(CS_Sink sink, CS_Status* status) { char* CS_GetSinkName(CS_Sink sink, CS_Status* status) {
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetSinkName(sink, str, status); auto str = cs::GetSinkName(sink, buf, status);
if (*status != 0) return nullptr; if (*status != 0) return nullptr;
return ConvertToC(str); return ConvertToC(str);
} }
char* CS_GetSinkDescription(CS_Sink sink, CS_Status* status) { char* CS_GetSinkDescription(CS_Sink sink, CS_Status* status) {
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetSinkDescription(sink, str, status); auto str = cs::GetSinkDescription(sink, buf, status);
if (*status != 0) return nullptr; if (*status != 0) return nullptr;
return ConvertToC(str); return ConvertToC(str);
} }
@@ -273,8 +273,8 @@ uint64_t CS_GrabSinkFrame(CS_Sink sink, struct CvMat* image,
} }
char* CS_GetSinkError(CS_Sink sink, CS_Status* status) { char* CS_GetSinkError(CS_Sink sink, CS_Status* status) {
llvm::SmallString<128> str; llvm::SmallString<128> buf;
cs::GetSinkError(sink, str, status); auto str = cs::GetSinkError(sink, buf, status);
if (*status != 0) return nullptr; if (*status != 0) return nullptr;
return ConvertToC(str); return ConvertToC(str);
} }
@@ -349,8 +349,8 @@ void CS_FreeEnumeratedUSBCameras(CS_USBCameraInfo* cameras, int count) {
} }
CS_Source* CS_EnumerateSources(int* count, CS_Status* status) { CS_Source* CS_EnumerateSources(int* count, CS_Status* status) {
llvm::SmallVector<CS_Source, 32> handles; llvm::SmallVector<CS_Source, 32> buf;
cs::EnumerateSourceHandles(handles, status); auto handles = cs::EnumerateSourceHandles(buf, status);
CS_Source* sources = CS_Source* sources =
static_cast<CS_Source*>(std::malloc(handles.size() * sizeof(CS_Source))); static_cast<CS_Source*>(std::malloc(handles.size() * sizeof(CS_Source)));
*count = handles.size(); *count = handles.size();
@@ -368,8 +368,8 @@ void CS_ReleaseEnumeratedSources(CS_Source* sources, int count) {
} }
CS_Sink* CS_EnumerateSinks(int* count, CS_Status* status) { CS_Sink* CS_EnumerateSinks(int* count, CS_Status* status) {
llvm::SmallVector<CS_Sink, 32> handles; llvm::SmallVector<CS_Sink, 32> buf;
cs::EnumerateSinkHandles(handles, status); auto handles = cs::EnumerateSinkHandles(buf, status);
CS_Sink* sinks = CS_Sink* sinks =
static_cast<CS_Sink*>(std::malloc(handles.size() * sizeof(CS_Sink))); static_cast<CS_Sink*>(std::malloc(handles.size() * sizeof(CS_Sink)));
*count = handles.size(); *count = handles.size();

View File

@@ -55,12 +55,13 @@ std::string GetPropertyName(CS_Property property, CS_Status* status) {
return name.str(); return name.str();
} }
void GetPropertyName(CS_Property property, llvm::SmallVectorImpl<char>& name, llvm::StringRef GetPropertyName(CS_Property property,
CS_Status* status) { llvm::SmallVectorImpl<char>& buf,
CS_Status* status) {
int propertyIndex; int propertyIndex;
auto source = GetPropertySource(property, &propertyIndex, status); auto source = GetPropertySource(property, &propertyIndex, status);
if (!source) return; if (!source) return llvm::StringRef{};
source->GetPropertyName(propertyIndex, name); return source->GetPropertyName(propertyIndex, buf);
} }
bool GetBooleanProperty(CS_Property property, CS_Status* status) { bool GetBooleanProperty(CS_Property property, CS_Status* status) {
@@ -114,12 +115,13 @@ std::string GetStringProperty(CS_Property property, CS_Status* status) {
return value.str(); return value.str();
} }
void GetStringProperty(CS_Property property, llvm::SmallVectorImpl<char>& value, llvm::StringRef GetStringProperty(CS_Property property,
CS_Status* status) { llvm::SmallVectorImpl<char>& buf,
CS_Status* status) {
int propertyIndex; int propertyIndex;
auto source = GetPropertySource(property, &propertyIndex, status); auto source = GetPropertySource(property, &propertyIndex, status);
if (!source) return; if (!source) return llvm::StringRef{};
source->GetStringProperty(propertyIndex, value); return source->GetStringProperty(propertyIndex, buf);
} }
void SetStringProperty(CS_Property property, llvm::StringRef value, void SetStringProperty(CS_Property property, llvm::StringRef value,
@@ -188,36 +190,36 @@ std::string GetSourceName(CS_Source source, CS_Status* status) {
return data->source->GetName(); return data->source->GetName();
} }
void GetSourceName(CS_Source source, llvm::SmallVectorImpl<char>& name, llvm::StringRef GetSourceName(CS_Source source,
CS_Status* status) { llvm::SmallVectorImpl<char>& buf,
CS_Status* status) {
auto data = Sources::GetInstance().Get(source); auto data = Sources::GetInstance().Get(source);
if (!data) { if (!data) {
*status = CS_INVALID_HANDLE; *status = CS_INVALID_HANDLE;
return; return llvm::StringRef{};
} }
auto str = data->source->GetName(); return data->source->GetName();
name.append(str.begin(), str.end());
} }
std::string GetSourceDescription(CS_Source source, CS_Status* status) { std::string GetSourceDescription(CS_Source source, CS_Status* status) {
llvm::SmallString<128> desc;
auto data = Sources::GetInstance().Get(source); auto data = Sources::GetInstance().Get(source);
if (!data) { if (!data) {
*status = CS_INVALID_HANDLE; *status = CS_INVALID_HANDLE;
return std::string{}; return std::string{};
} }
data->source->GetDescription(desc); llvm::SmallString<128> buf;
return desc.str(); return data->source->GetDescription(buf);
} }
void GetSourceDescription(CS_Source source, llvm::SmallVectorImpl<char>& desc, llvm::StringRef GetSourceDescription(CS_Source source,
CS_Status* status) { llvm::SmallVectorImpl<char>& buf,
CS_Status* status) {
auto data = Sources::GetInstance().Get(source); auto data = Sources::GetInstance().Get(source);
if (!data) { if (!data) {
*status = CS_INVALID_HANDLE; *status = CS_INVALID_HANDLE;
return; return llvm::StringRef{};
} }
data->source->GetDescription(desc); return data->source->GetDescription(buf);
} }
uint64_t GetSourceLastFrameTime(CS_Source source, CS_Status* status) { uint64_t GetSourceLastFrameTime(CS_Source source, CS_Status* status) {
@@ -257,10 +259,11 @@ CS_Property GetSourceProperty(CS_Source source, llvm::StringRef name,
return Handle{source, property, Handle::kProperty}; return Handle{source, property, Handle::kProperty};
} }
void EnumerateSourceProperties(CS_Source source, llvm::ArrayRef<CS_Property> EnumerateSourceProperties(
llvm::SmallVectorImpl<CS_Property>& properties, CS_Source source, llvm::SmallVectorImpl<CS_Property>& vec,
CS_Status* status) { CS_Status* status) {
// TODO // TODO
return llvm::ArrayRef<CS_Property>{};
} }
CS_Source CopySource(CS_Source source, CS_Status* status) { CS_Source CopySource(CS_Source source, CS_Status* status) {
@@ -358,36 +361,35 @@ std::string GetSinkName(CS_Sink sink, CS_Status* status) {
return data->sink->GetName(); return data->sink->GetName();
} }
void GetSinkName(CS_Sink sink, llvm::SmallVectorImpl<char>& name, llvm::StringRef GetSinkName(CS_Sink sink, llvm::SmallVectorImpl<char>& buf,
CS_Status* status) { CS_Status* status) {
auto data = Sinks::GetInstance().Get(sink); auto data = Sinks::GetInstance().Get(sink);
if (!data) { if (!data) {
*status = CS_INVALID_HANDLE; *status = CS_INVALID_HANDLE;
return; return llvm::StringRef{};
} }
auto str = data->sink->GetName(); return data->sink->GetName();
name.append(str.begin(), str.end());
} }
std::string GetSinkDescription(CS_Sink sink, CS_Status* status) { std::string GetSinkDescription(CS_Sink sink, CS_Status* status) {
llvm::SmallString<128> desc;
auto data = Sinks::GetInstance().Get(sink); auto data = Sinks::GetInstance().Get(sink);
if (!data) { if (!data) {
*status = CS_INVALID_HANDLE; *status = CS_INVALID_HANDLE;
return std::string{}; return std::string{};
} }
data->sink->GetDescription(desc); llvm::SmallString<128> buf;
return desc.str(); return data->sink->GetDescription(buf);
} }
void GetSinkDescription(CS_Sink sink, llvm::SmallVectorImpl<char>& desc, llvm::StringRef GetSinkDescription(CS_Sink sink,
CS_Status* status) { llvm::SmallVectorImpl<char>& buf,
CS_Status* status) {
auto data = Sinks::GetInstance().Get(sink); auto data = Sinks::GetInstance().Get(sink);
if (!data) { if (!data) {
*status = CS_INVALID_HANDLE; *status = CS_INVALID_HANDLE;
return; return llvm::StringRef{};
} }
data->sink->GetDescription(desc); return data->sink->GetDescription(buf);
} }
void SetSinkSource(CS_Sink sink, CS_Source source, CS_Status* status) { void SetSinkSource(CS_Sink sink, CS_Source source, CS_Status* status) {
@@ -464,12 +466,12 @@ uint64_t GrabSinkFrame(CS_Sink sink, cv::Mat* image, CS_Status* status) {
} }
std::string GetSinkError(CS_Sink sink, CS_Status* status) { std::string GetSinkError(CS_Sink sink, CS_Status* status) {
return ""; // TODO return std::string{}; // TODO
} }
void GetSinkError(CS_Sink sink, llvm::SmallVectorImpl<char>& msg, llvm::StringRef GetSinkError(CS_Sink sink, llvm::SmallVectorImpl<char>& buf,
CS_Status* status) { CS_Status* status) {
// TODO return llvm::StringRef{}; // TODO
} }
void SetSinkEnabled(CS_Sink sink, bool enabled, CS_Status* status) { void SetSinkEnabled(CS_Sink sink, bool enabled, CS_Status* status) {
@@ -509,14 +511,14 @@ std::vector<USBCameraInfo> EnumerateUSBCameras(CS_Status* status) {
return std::vector<USBCameraInfo>{}; // TODO return std::vector<USBCameraInfo>{}; // TODO
} }
void EnumerateSourceHandles(llvm::SmallVectorImpl<CS_Source>& handles, llvm::ArrayRef<CS_Source> EnumerateSourceHandles(
CS_Status* status) { llvm::SmallVectorImpl<CS_Source>& vec, CS_Status* status) {
Sources::GetInstance().GetAll(handles); return Sources::GetInstance().GetAll(vec);
} }
void EnumerateSinkHandles(llvm::SmallVectorImpl<CS_Sink>& handles, llvm::ArrayRef<CS_Sink> EnumerateSinkHandles(
CS_Status* status) { llvm::SmallVectorImpl<CS_Sink>& vec, CS_Status* status) {
Sinks::GetInstance().GetAll(handles); return Sinks::GetInstance().GetAll(vec);
} }
} // namespace cs } // namespace cs