00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef OR_TOOLS_UTIL_CONST_PTR_ARRAY_H_
00015 #define OR_TOOLS_UTIL_CONST_PTR_ARRAY_H_
00016
00017
00018 using std::string;
00019
00020 #include <stddef.h>
00021 #include <string>
00022 #include <vector>
00023
00024 #include "base/integral_types.h"
00025 #include "base/logging.h"
00026 #include "base/scoped_ptr.h"
00027 #include "base/stringprintf.h"
00028 #include "base/concise_iterator.h"
00029 #include "util/string_array.h"
00030
00031 namespace operations_research {
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 template <class T> class ConstPtrArray {
00045 public:
00046
00047 explicit ConstPtrArray(const std::vector<T*>& ptrs)
00048 : data_(new std::vector<T*>(ptrs)) {}
00049
00050
00051 explicit ConstPtrArray(std::vector<T*>* const data) : data_(data) {}
00052
00053
00054
00055 std::vector<T*>* Release() {
00056 return data_.release();
00057 }
00058
00059
00060 int size() const {
00061 if (data_.get() == NULL) {
00062 return 0;
00063 }
00064 return data_->size();
00065 }
00066
00067
00068 bool Equals(const ConstPtrArray<T>& other) const {
00069 const int current_size = size();
00070 if (current_size != other.size()) {
00071 return false;
00072 }
00073 for (int i = 0; i < current_size; ++i) {
00074 if (get(i) != other.get(i)) {
00075 return false;
00076 }
00077 }
00078 return true;
00079 }
00080
00081
00082
00083 T* operator[](int64 index) const {
00084 CHECK_NOTNULL(data_.get());
00085 return (*data_)[index];
00086 }
00087
00088
00089
00090 T* get(int64 index) const {
00091 CHECK_NOTNULL(data_.get());
00092 return (*data_)[index];
00093 }
00094
00095
00096 std::vector<T*>* Copy() const {
00097 CHECK_NOTNULL(data_.get());
00098 return new std::vector<T*>(*data_);
00099 }
00100
00101
00102 string DebugString() const {
00103 if (data_.get() == NULL) {
00104 return "Released ConstPtrArray";
00105 }
00106 return StringPrintf("[%s]", DebugStringArray(data_->data(),
00107 data_->size(), ", ").c_str());
00108 }
00109
00110
00111
00112 const T* const* RawData() const {
00113 if (data_.get() == NULL) {
00114 return data_->data();
00115 } else {
00116 return NULL;
00117 }
00118 }
00119
00120 private:
00121 scoped_ptr<std::vector<T*> > data_;
00122 };
00123
00124 }
00125 #endif // OR_TOOLS_UTIL_CONST_PTR_ARRAY_H_