diff --git a/talk/app/webrtc/peerconnection.cc b/talk/app/webrtc/peerconnection.cc
index bb5f0d4..ec20593 100644
--- a/talk/app/webrtc/peerconnection.cc
+++ b/talk/app/webrtc/peerconnection.cc
@@ -85,12 +85,11 @@
 };
 
 struct GetStatsMsg : public talk_base::MessageData {
-  GetStatsMsg(webrtc::StatsObserver* observer,
-              webrtc::MediaStreamTrackInterface* track)
-      : observer(observer), track(track) {
+  explicit GetStatsMsg(webrtc::StatsObserver* observer)
+      : observer(observer) {
   }
+  webrtc::StatsReports reports;
   talk_base::scoped_refptr<webrtc::StatsObserver> observer;
-  talk_base::scoped_refptr<webrtc::MediaStreamTrackInterface> track;
 };
 
 // |in_str| should be of format
@@ -447,15 +446,17 @@
 bool PeerConnection::GetStats(StatsObserver* observer,
                               MediaStreamTrackInterface* track,
                               StatsOutputLevel level) {
-  ASSERT(signaling_thread()->IsCurrent());
   if (!VERIFY(observer != NULL)) {
     LOG(LS_ERROR) << "GetStats - observer is NULL.";
     return false;
   }
 
   stats_->UpdateStats(level);
-  signaling_thread()->Post(this, MSG_GETSTATS,
-                           new GetStatsMsg(observer, track));
+  talk_base::scoped_ptr<GetStatsMsg> msg(new GetStatsMsg(observer));
+  if (!stats_->GetStats(track, &(msg->reports))) {
+    return false;
+  }
+  signaling_thread()->Post(this, MSG_GETSTATS, msg.release());
   return true;
 }
 
@@ -701,9 +702,7 @@
     }
     case MSG_GETSTATS: {
       GetStatsMsg* param = static_cast<GetStatsMsg*>(msg->pdata);
-      StatsReports reports;
-      stats_->GetStats(param->track, &reports);
-      param->observer->OnComplete(reports);
+      param->observer->OnComplete(param->reports);
       delete param;
       break;
     }
diff --git a/talk/app/webrtc/peerconnectioninterface.h b/talk/app/webrtc/peerconnectioninterface.h
index 171c10b..ed4033c 100644
--- a/talk/app/webrtc/peerconnectioninterface.h
+++ b/talk/app/webrtc/peerconnectioninterface.h
@@ -113,18 +113,7 @@
 
 class StatsObserver : public talk_base::RefCountInterface {
  public:
-  // TODO(tommi): Remove.
-  virtual void OnComplete(const std::vector<StatsReport>& reports) {}
-
-  // TODO(tommi): Make pure virtual and remove implementation.
-  virtual void OnComplete(const StatsReports& reports) {
-    std::vector<StatsReportCopyable> report_copies;
-    for (size_t i = 0; i < reports.size(); ++i)
-      report_copies.push_back(StatsReportCopyable(*reports[i]));
-    std::vector<StatsReport>* r =
-        reinterpret_cast<std::vector<StatsReport>*>(&report_copies);
-     OnComplete(*r);
-   }
+  virtual void OnComplete(const std::vector<StatsReport>& reports) = 0;
 
  protected:
   virtual ~StatsObserver() {}
diff --git a/talk/app/webrtc/statscollector.cc b/talk/app/webrtc/statscollector.cc
index eab6eeb..94586fd 100644
--- a/talk/app/webrtc/statscollector.cc
+++ b/talk/app/webrtc/statscollector.cc
@@ -234,6 +234,7 @@
 }
 
 namespace {
+typedef std::map<std::string, StatsReport> StatsMap;
 
 double GetTimeNow() {
   return talk_base::Timing::WallTimeNow() * talk_base::kNumMillisecsPerSec;
@@ -293,16 +294,17 @@
   return false;
 }
 
-void AddTrackReport(StatsSet* reports, const std::string& track_id) {
+void AddTrackReport(StatsMap* reports, const std::string& track_id) {
   // Adds an empty track report.
-  StatsReport* report = reports->FindOrAddNew(
-      StatsId(StatsReport::kStatsReportTypeTrack, track_id));
-  report->type = StatsReport::kStatsReportTypeTrack;
-  report->AddValue(StatsReport::kStatsValueNameTrackId, track_id);
+  StatsReport report;
+  report.type = StatsReport::kStatsReportTypeTrack;
+  report.id = StatsId(StatsReport::kStatsReportTypeTrack, track_id);
+  report.AddValue(StatsReport::kStatsValueNameTrackId, track_id);
+  (*reports)[report.id] = report;
 }
 
 template <class TrackVector>
-void CreateTrackReports(const TrackVector& tracks, StatsSet* reports) {
+void CreateTrackReports(const TrackVector& tracks, StatsMap* reports) {
   for (size_t j = 0; j < tracks.size(); ++j) {
     webrtc::MediaStreamTrackInterface* track = tracks[j];
     AddTrackReport(reports, track->id());
@@ -467,7 +469,7 @@
                   double stats_gathering_started,
                   PeerConnectionInterface::StatsOutputLevel level,
                   StatsReport* report) {
-  ASSERT(report->id == StatsReport::kStatsReportVideoBweId);
+  report->id = StatsReport::kStatsReportVideoBweId;
   report->type = StatsReport::kStatsReportTypeBwe;
 
   // Clear out stats from previous GatherStats calls if any.
@@ -581,9 +583,9 @@
 
   // Create the kStatsReportTypeTrack report for the new track if there is no
   // report yet.
-  StatsReport* found = reports_.Find(
+  StatsMap::iterator it = reports_.find(
       StatsId(StatsReport::kStatsReportTypeTrack, audio_track->id()));
-  if (!found)
+  if (it == reports_.end())
     AddTrackReport(&reports_, audio_track->id());
 }
 
@@ -601,46 +603,49 @@
   ASSERT(false);
 }
 
-void StatsCollector::GetStats(MediaStreamTrackInterface* track,
+bool StatsCollector::GetStats(MediaStreamTrackInterface* track,
                               StatsReports* reports) {
   ASSERT(reports != NULL);
-  ASSERT(reports->empty());
+  reports->clear();
 
+  StatsMap::iterator it;
   if (!track) {
-    StatsSet::const_iterator it;
-    for (it = reports_.begin(); it != reports_.end(); ++it)
-      reports->push_back(&(*it));
-    return;
+    for (it = reports_.begin(); it != reports_.end(); ++it) {
+      reports->push_back(it->second);
+    }
+    return true;
   }
 
-  StatsReport* report =
-      reports_.Find(StatsId(StatsReport::kStatsReportTypeSession,
-                            session_->id()));
-  if (report)
-    reports->push_back(report);
+  it = reports_.find(StatsId(StatsReport::kStatsReportTypeSession,
+                             session_->id()));
+  if (it != reports_.end()) {
+    reports->push_back(it->second);
+  }
 
-  report = reports_.Find(
-      StatsId(StatsReport::kStatsReportTypeTrack, track->id()));
+  it = reports_.find(StatsId(StatsReport::kStatsReportTypeTrack, track->id()));
 
-  if (!report)
-    return;
+  if (it == reports_.end()) {
+    LOG(LS_WARNING) << "No StatsReport is available for "<< track->id();
+    return false;
+  }
 
-  reports->push_back(report);
+  reports->push_back(it->second);
 
   std::string track_id;
-  for (StatsSet::const_iterator it = reports_.begin(); it != reports_.end();
-       ++it) {
-    if (it->type != StatsReport::kStatsReportTypeSsrc)
+  for (it = reports_.begin(); it != reports_.end(); ++it) {
+    if (it->second.type != StatsReport::kStatsReportTypeSsrc) {
       continue;
-
-    if (ExtractValueFromReport(*it,
+    }
+    if (ExtractValueFromReport(it->second,
                                StatsReport::kStatsValueNameTrackId,
                                &track_id)) {
       if (track_id == track->id()) {
-        reports->push_back(&(*it));
+        reports->push_back(it->second);
       }
     }
   }
+
+  return true;
 }
 
 void
@@ -667,13 +672,13 @@
     const std::string& transport_id,
     TrackDirection direction) {
   const std::string ssrc_id = talk_base::ToString<uint32>(ssrc);
-  StatsReport* report = reports_.Find(
-      StatsId(StatsReport::kStatsReportTypeSsrc, ssrc_id, direction));
+  StatsMap::iterator it = reports_.find(StatsId(
+      StatsReport::kStatsReportTypeSsrc, ssrc_id, direction));
 
   // Use the ID of the track that is currently mapped to the SSRC, if any.
   std::string track_id;
   if (!GetTrackIdBySsrc(ssrc, &track_id, direction)) {
-    if (!report) {
+    if (it == reports_.end()) {
       // The ssrc is not used by any track or existing report, return NULL
       // in such case to indicate no report is prepared for the ssrc.
       return NULL;
@@ -681,13 +686,13 @@
 
     // The ssrc is not used by any existing track. Keeps the old track id
     // since we want to report the stats for inactive ssrc.
-    ExtractValueFromReport(*report,
+    ExtractValueFromReport(it->second,
                            StatsReport::kStatsValueNameTrackId,
                            &track_id);
   }
 
-  report = GetOrCreateReport(
-      StatsReport::kStatsReportTypeSsrc, ssrc_id, direction);
+  StatsReport* report = GetOrCreateReport(StatsReport::kStatsReportTypeSsrc,
+                                          ssrc_id, direction);
 
   // Clear out stats from previous GatherStats calls if any.
   // This is required since the report will be returned for the new values.
@@ -710,13 +715,13 @@
     const std::string& transport_id,
     TrackDirection direction) {
   const std::string ssrc_id = talk_base::ToString<uint32>(ssrc);
-  StatsReport* report = reports_.Find(
-      StatsId(StatsReport::kStatsReportTypeRemoteSsrc, ssrc_id, direction));
+  StatsMap::iterator it = reports_.find(StatsId(
+      StatsReport::kStatsReportTypeRemoteSsrc, ssrc_id, direction));
 
   // Use the ID of the track that is currently mapped to the SSRC, if any.
   std::string track_id;
   if (!GetTrackIdBySsrc(ssrc, &track_id, direction)) {
-    if (!report) {
+    if (it == reports_.end()) {
       // The ssrc is not used by any track or existing report, return NULL
       // in such case to indicate no report is prepared for the ssrc.
       return NULL;
@@ -724,12 +729,12 @@
 
     // The ssrc is not used by any existing track. Keeps the old track id
     // since we want to report the stats for inactive ssrc.
-    ExtractValueFromReport(*report,
+    ExtractValueFromReport(it->second,
                            StatsReport::kStatsValueNameTrackId,
                            &track_id);
   }
 
-  report = GetOrCreateReport(
+  StatsReport* report = GetOrCreateReport(
       StatsReport::kStatsReportTypeRemoteSsrc, ssrc_id, direction);
 
   // Clear out stats from previous GatherStats calls if any.
@@ -773,17 +778,18 @@
   talk_base::Base64::EncodeFromArray(
       der_buffer.data(), der_buffer.length(), &der_base64);
 
-  StatsReport* report = reports_.FindOrAddNew(
-      StatsId(StatsReport::kStatsReportTypeCertificate, fingerprint));
-  report->type = StatsReport::kStatsReportTypeCertificate;
-  report->timestamp = stats_gathering_started_;
-  report->AddValue(StatsReport::kStatsValueNameFingerprint, fingerprint);
-  report->AddValue(StatsReport::kStatsValueNameFingerprintAlgorithm,
-                   digest_algorithm);
-  report->AddValue(StatsReport::kStatsValueNameDer, der_base64);
+  StatsReport report;
+  report.type = StatsReport::kStatsReportTypeCertificate;
+  report.id = StatsId(report.type, fingerprint);
+  report.timestamp = stats_gathering_started_;
+  report.AddValue(StatsReport::kStatsValueNameFingerprint, fingerprint);
+  report.AddValue(StatsReport::kStatsValueNameFingerprintAlgorithm,
+                  digest_algorithm);
+  report.AddValue(StatsReport::kStatsValueNameDer, der_base64);
   if (!issuer_id.empty())
-    report->AddValue(StatsReport::kStatsValueNameIssuerId, issuer_id);
-  return report->id;
+    report.AddValue(StatsReport::kStatsValueNameIssuerId, issuer_id);
+  reports_[report.id] = report;
+  return report.id;
 }
 
 std::string StatsCollector::AddCertificateReports(
@@ -813,13 +819,15 @@
 
 void StatsCollector::ExtractSessionInfo() {
   // Extract information from the base session.
-  StatsReport* report = reports_.FindOrAddNew(StatsId(
-        StatsReport::kStatsReportTypeSession, session_->id()));
-  report->type = StatsReport::kStatsReportTypeSession;
-  report->timestamp = stats_gathering_started_;
-  report->values.clear();
-  report->AddBoolean(StatsReport::kStatsValueNameInitiator,
-                     session_->initiator());
+  StatsReport report;
+  report.id = StatsId(StatsReport::kStatsReportTypeSession, session_->id());
+  report.type = StatsReport::kStatsReportTypeSession;
+  report.timestamp = stats_gathering_started_;
+  report.values.clear();
+  report.AddBoolean(StatsReport::kStatsValueNameInitiator,
+                    session_->initiator());
+
+  reports_[report.id] = report;
 
   cricket::SessionStats stats;
   if (session_->GetStats(&stats)) {
@@ -857,58 +865,61 @@
                = transport_iter->second.channel_stats.begin();
            channel_iter != transport_iter->second.channel_stats.end();
            ++channel_iter) {
+        StatsReport channel_report;
         std::ostringstream ostc;
         ostc << "Channel-" << transport_iter->second.content_name
              << "-" << channel_iter->component;
-        StatsReport* channel_report = reports_.FindOrAddNew(ostc.str());
-        channel_report->type = StatsReport::kStatsReportTypeComponent;
-        channel_report->timestamp = stats_gathering_started_;
-        channel_report->AddValue(StatsReport::kStatsValueNameComponent,
-                                 channel_iter->component);
+        channel_report.id = ostc.str();
+        channel_report.type = StatsReport::kStatsReportTypeComponent;
+        channel_report.timestamp = stats_gathering_started_;
+        channel_report.AddValue(StatsReport::kStatsValueNameComponent,
+                                channel_iter->component);
         if (!local_cert_report_id.empty())
-          channel_report->AddValue(
+          channel_report.AddValue(
               StatsReport::kStatsValueNameLocalCertificateId,
               local_cert_report_id);
         if (!remote_cert_report_id.empty())
-          channel_report->AddValue(
+          channel_report.AddValue(
               StatsReport::kStatsValueNameRemoteCertificateId,
               remote_cert_report_id);
+        reports_[channel_report.id] = channel_report;
         for (size_t i = 0;
              i < channel_iter->connection_infos.size();
              ++i) {
+          StatsReport report;
+          const cricket::ConnectionInfo& info
+              = channel_iter->connection_infos[i];
           std::ostringstream ost;
           ost << "Conn-" << transport_iter->first << "-"
               << channel_iter->component << "-" << i;
-          StatsReport* report = reports_.FindOrAddNew(ost.str());
-          report->type = StatsReport::kStatsReportTypeCandidatePair;
-          report->timestamp = stats_gathering_started_;
+          report.id = ost.str();
+          report.type = StatsReport::kStatsReportTypeCandidatePair;
+          report.timestamp = stats_gathering_started_;
           // Link from connection to its containing channel.
-          report->AddValue(StatsReport::kStatsValueNameChannelId,
-                           channel_report->id);
-
-          const cricket::ConnectionInfo& info =
-              channel_iter->connection_infos[i];
-          report->AddValue(StatsReport::kStatsValueNameBytesSent,
-                           info.sent_total_bytes);
-          report->AddValue(StatsReport::kStatsValueNameBytesReceived,
-                           info.recv_total_bytes);
-          report->AddBoolean(StatsReport::kStatsValueNameWritable,
-                             info.writable);
-          report->AddBoolean(StatsReport::kStatsValueNameReadable,
-                             info.readable);
-          report->AddBoolean(StatsReport::kStatsValueNameActiveConnection,
-                             info.best_connection);
-          report->AddValue(StatsReport::kStatsValueNameLocalAddress,
-                           info.local_candidate.address().ToString());
-          report->AddValue(StatsReport::kStatsValueNameRemoteAddress,
-                           info.remote_candidate.address().ToString());
-          report->AddValue(StatsReport::kStatsValueNameRtt, info.rtt);
-          report->AddValue(StatsReport::kStatsValueNameTransportType,
-                           info.local_candidate.protocol());
-          report->AddValue(StatsReport::kStatsValueNameLocalCandidateType,
-                           info.local_candidate.type());
-          report->AddValue(StatsReport::kStatsValueNameRemoteCandidateType,
-                           info.remote_candidate.type());
+          report.AddValue(StatsReport::kStatsValueNameChannelId,
+                          channel_report.id);
+          report.AddValue(StatsReport::kStatsValueNameBytesSent,
+                          info.sent_total_bytes);
+          report.AddValue(StatsReport::kStatsValueNameBytesReceived,
+                          info.recv_total_bytes);
+          report.AddBoolean(StatsReport::kStatsValueNameWritable,
+                            info.writable);
+          report.AddBoolean(StatsReport::kStatsValueNameReadable,
+                            info.readable);
+          report.AddBoolean(StatsReport::kStatsValueNameActiveConnection,
+                            info.best_connection);
+          report.AddValue(StatsReport::kStatsValueNameLocalAddress,
+                          info.local_candidate.address().ToString());
+          report.AddValue(StatsReport::kStatsValueNameRemoteAddress,
+                          info.remote_candidate.address().ToString());
+          report.AddValue(StatsReport::kStatsValueNameRtt, info.rtt);
+          report.AddValue(StatsReport::kStatsValueNameTransportType,
+                          info.local_candidate.protocol());
+          report.AddValue(StatsReport::kStatsValueNameLocalCandidateType,
+                          info.local_candidate.type());
+          report.AddValue(StatsReport::kStatsValueNameRemoteCandidateType,
+                          info.remote_candidate.type());
+          reports_[report.id] = report;
         }
       }
     }
@@ -965,8 +976,7 @@
   if (video_info.bw_estimations.size() != 1) {
     LOG(LS_ERROR) << "BWEs count: " << video_info.bw_estimations.size();
   } else {
-    StatsReport* report =
-        reports_.FindOrAddNew(StatsReport::kStatsReportVideoBweId);
+    StatsReport* report = &reports_[StatsReport::kStatsReportVideoBweId];
     ExtractStats(
         video_info.bw_estimations[0], stats_gathering_started_, level, report);
   }
@@ -977,7 +987,13 @@
                                        TrackDirection direction) {
   ASSERT(type == StatsReport::kStatsReportTypeSsrc ||
          type == StatsReport::kStatsReportTypeRemoteSsrc);
-  return reports_.Find(StatsId(type, id, direction));
+  std::string statsid = StatsId(type, id, direction);
+  StatsReport* report = NULL;
+  std::map<std::string, StatsReport>::iterator it = reports_.find(statsid);
+  if (it != reports_.end())
+    report = &(it->second);
+
+  return report;
 }
 
 StatsReport* StatsCollector::GetOrCreateReport(const std::string& type,
@@ -988,8 +1004,8 @@
   StatsReport* report = GetReport(type, id, direction);
   if (report == NULL) {
     std::string statsid = StatsId(type, id, direction);
-    report = reports_.FindOrAddNew(statsid);
-    ASSERT(report->id == statsid);
+    report = &reports_[statsid];  // Create new element.
+    report->id = statsid;
     report->type = type;
   }
 
diff --git a/talk/app/webrtc/statscollector.h b/talk/app/webrtc/statscollector.h
index adfbfee..a444da4 100644
--- a/talk/app/webrtc/statscollector.h
+++ b/talk/app/webrtc/statscollector.h
@@ -72,11 +72,7 @@
   // be called before this function to get the most recent stats. |selector| is
   // a track label or empty string. The most recent reports are stored in
   // |reports|.
-  // TODO(tommi): Change this contract to accept a callback object instead
-  // of filling in |reports|.  As is, there's a requirement that the caller
-  // uses |reports| immediately without allowing any async activity on
-  // the thread (message handling etc) and then discard the results.
-  void GetStats(MediaStreamTrackInterface* track,
+  bool GetStats(MediaStreamTrackInterface* track,
                 StatsReports* reports);
 
   // Prepare an SSRC report for the given ssrc. Used internally
@@ -125,7 +121,7 @@
                         TrackDirection direction);
 
   // A map from the report id to the report.
-  StatsSet reports_;
+  std::map<std::string, StatsReport> reports_;
   // Raw pointer to the session the statistics are gathered from.
   WebRtcSession* const session_;
   double stats_gathering_started_;
diff --git a/talk/app/webrtc/statscollector_unittest.cc b/talk/app/webrtc/statscollector_unittest.cc
index 3d354ef..72ba111 100644
--- a/talk/app/webrtc/statscollector_unittest.cc
+++ b/talk/app/webrtc/statscollector_unittest.cc
@@ -168,10 +168,10 @@
     return kNoReports;
   }
   for (size_t i = 0; i < reports.size(); ++i) {
-    if (reports[i]->type != type)
+    if (reports[i].type != type)
       continue;
     std::string ret;
-    if (GetValue(reports[i], name, &ret)) {
+    if (GetValue(&reports[i], name, &ret)) {
       return ret;
     }
   }
@@ -184,10 +184,10 @@
 const StatsReport* FindNthReportByType(
     const StatsReports& reports, const std::string& type, int n) {
   for (size_t i = 0; i < reports.size(); ++i) {
-    if (reports[i]->type == type) {
+    if (reports[i].type == type) {
       n--;
       if (n == 0)
-        return reports[i];
+        return &reports[i];
     }
   }
   return NULL;
@@ -196,8 +196,8 @@
 const StatsReport* FindReportById(const StatsReports& reports,
                                   const std::string& id) {
   for (size_t i = 0; i < reports.size(); ++i) {
-    if (reports[i]->id == id) {
-      return reports[i];
+    if (reports[i].id == id) {
+      return &reports[i];
     }
   }
   return NULL;
@@ -433,7 +433,7 @@
 class StatsCollectorTest : public testing::Test {
  protected:
   StatsCollectorTest()
-    : media_engine_(new cricket::FakeMediaEngine()),
+    : media_engine_(new cricket::FakeMediaEngine),
       channel_manager_(
           new cricket::ChannelManager(media_engine_,
                                       new cricket::FakeDeviceManager(),
@@ -443,8 +443,6 @@
     EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Return(false));
   }
 
-  ~StatsCollectorTest() {}
-
   // This creates a standard setup with a transport called "trspname"
   // having one transport channel
   // and the specified virtual connection name.
@@ -788,7 +786,7 @@
   stats.GetStats(NULL, &reports);
   EXPECT_EQ((size_t)1, reports.size());
   EXPECT_EQ(std::string(StatsReport::kStatsReportTypeTrack),
-            reports[0]->type);
+            reports[0].type);
 
   std::string trackValue =
       ExtractStatsValue(StatsReport::kStatsReportTypeTrack,
@@ -834,7 +832,6 @@
   EXPECT_TRUE(track_report);
 
   // Get report for the specific |track|.
-  reports.clear();
   stats.GetStats(track_, &reports);
   // |reports| should contain at least one session report, one track report,
   // and one ssrc report.
@@ -1399,7 +1396,6 @@
   VerifyVoiceSenderInfoReport(track_report, voice_sender_info);
 
   // Get stats for the remote track.
-  reports.clear();
   stats.GetStats(remote_track.get(), &reports);
   track_report = FindNthReportByType(reports,
                                      StatsReport::kStatsReportTypeSsrc, 1);
@@ -1456,7 +1452,6 @@
   cricket::VoiceSenderInfo new_voice_sender_info;
   InitVoiceSenderInfo(&new_voice_sender_info);
   cricket::VoiceMediaInfo new_stats_read;
-  reports.clear();
   SetupAndVerifyAudioTrackStats(
       new_audio_track.get(), stream_.get(), &stats, &voice_channel, kVcName,
       media_channel, &new_voice_sender_info, NULL, &new_stats_read, &reports);
diff --git a/talk/app/webrtc/statstypes.h b/talk/app/webrtc/statstypes.h
index ca98eb0..828b9f5 100644
--- a/talk/app/webrtc/statstypes.h
+++ b/talk/app/webrtc/statstypes.h
@@ -31,7 +31,6 @@
 #ifndef TALK_APP_WEBRTC_STATSTYPES_H_
 #define TALK_APP_WEBRTC_STATSTYPES_H_
 
-#include <set>
 #include <string>
 #include <vector>
 
@@ -40,49 +39,14 @@
 
 namespace webrtc {
 
-// TODO(tommi): Move all the implementation that's in this file and
-// statscollector.cc related to these types, into a new, statstypes.cc file.
-
 class StatsReport {
  public:
-  // TODO(tommi): Remove this ctor.
-  StatsReport() : timestamp(0) {}
-
-  // TODO(tommi): Make protected and disallow copy completely once not needed.
-  explicit StatsReport(const StatsReport& src)
-    : id(src.id),
-      type(src.type),
-      timestamp(src.timestamp),
-      values(src.values) {}
-
-  // TODO(tommi): Make this copy constructor protected.
-  StatsReport& operator=(const StatsReport& src) {
-    ASSERT(id == src.id);
-    type = src.type;
-    timestamp = src.timestamp;
-    values = src.values;
-    return *this;
-  }
-
-  // Constructor is protected to force use of StatsSet.
-  // TODO(tommi): Make this ctor protected.
-  explicit StatsReport(const std::string& id) : id(id), timestamp(0) {}
-
-  // Operators provided for STL container/algorithm support.
-  bool operator<(const StatsReport& other) const { return id < other.id; }
-  bool operator==(const StatsReport& other) const { return id == other.id; }
-  // Special support for being able to use std::find on a container
-  // without requiring a new StatsReport instance.
-  bool operator==(const std::string& other_id) const { return id == other_id; }
+  StatsReport() : timestamp(0) { }
 
   // TODO(tommi): Change this to be an enum type that holds all the
   // kStatsValueName constants.
   typedef const char* StatsValueName;
 
-  // The unique identifier for this object.
-  // This is used as a key for this report in ordered containers,
-  // so it must never be changed.
-  // TODO(tommi): Make this member variable const.
   std::string id;  // See below for contents.
   std::string type;  // See below for contents.
 
@@ -275,65 +239,7 @@
   static const char kStatsValueNameDecodingPLCCNG[];
 };
 
-// This class is provided for the cases where we need to keep
-// snapshots of reports around.  This is an edge case.
-// TODO(tommi): Move into the private section of StatsSet.
-class StatsReportCopyable : public StatsReport {
- public:
-  StatsReportCopyable(const std::string& id) : StatsReport(id) {}
-  explicit StatsReportCopyable(const StatsReport& src)
-      : StatsReport(src) {}
-
-  using StatsReport::operator=;
-};
-
-// Typedef for an array of const StatsReport pointers.
-// Ownership of the pointers held by this implementation is assumed to lie
-// elsewhere and lifetime guarantees are made by the implementation that uses
-// this type.  In the StatsCollector, object ownership lies with the StatsSet
-// class.
-typedef std::vector<const StatsReport*> StatsReports;
-
-// A map from the report id to the report.
-// This class wraps an STL container and provides a limited set of
-// functionality in order to keep things simple.
-// TODO(tommi): Use a thread checker here (currently not in libjingle).
-class StatsSet {
- public:
-  StatsSet() {}
-  ~StatsSet() {}
-
-  typedef std::set<StatsReportCopyable> Container;
-  typedef Container::iterator iterator;
-  typedef Container::const_iterator const_iterator;
-
-  const_iterator begin() const { return list_.begin(); }
-  const_iterator end() const { return list_.end(); }
-
-  // Creates a new report object with |id| that does not already
-  // exist in the list of reports.
-  StatsReport* InsertNew(const std::string& id) {
-    ASSERT(Find(id) == NULL);
-    const StatsReport* ret = &(*list_.insert(StatsReportCopyable(id)).first);
-    return const_cast<StatsReport*>(ret);
-  }
-
-  StatsReport* FindOrAddNew(const std::string& id) {
-    StatsReport* ret = Find(id);
-    return ret ? ret : InsertNew(id);
-  }
-
-  // Looks for a report with the given |id|.  If one is not found, NULL
-  // will be returned.
-  StatsReport* Find(const std::string& id) {
-    const_iterator it = std::find(begin(), end(), id);
-    return it == end() ? NULL :
-        const_cast<StatsReport*>(static_cast<const StatsReport*>(&(*it)));
-  }
-
- private:
-  Container list_;
-};
+typedef std::vector<StatsReport> StatsReports;
 
 }  // namespace webrtc
 
diff --git a/talk/app/webrtc/test/mockpeerconnectionobservers.h b/talk/app/webrtc/test/mockpeerconnectionobservers.h
index 2bb187e..3ae2162 100644
--- a/talk/app/webrtc/test/mockpeerconnectionobservers.h
+++ b/talk/app/webrtc/test/mockpeerconnectionobservers.h
@@ -120,13 +120,9 @@
   MockStatsObserver()
       : called_(false) {}
   virtual ~MockStatsObserver() {}
-  virtual void OnComplete(const StatsReports& reports) {
+  virtual void OnComplete(const std::vector<webrtc::StatsReport>& reports) {
     called_ = true;
-    reports_.clear();
-    reports_.reserve(reports.size());
-    StatsReports::const_iterator it;
-    for (it = reports.begin(); it != reports.end(); ++it)
-      reports_.push_back(StatsReportCopyable(*(*it)));
+    reports_ = reports;
   }
 
   bool called() const { return called_; }
@@ -152,7 +148,7 @@
   }
 
  private:
-  int GetSsrcStatsValue(StatsReport::StatsValueName name) {
+  int GetSsrcStatsValue(const std::string name) {
     if (reports_.empty()) {
       return 0;
     }
@@ -171,7 +167,7 @@
   }
 
   bool called_;
-  std::vector<StatsReportCopyable> reports_;
+  std::vector<webrtc::StatsReport> reports_;
 };
 
 }  // namespace webrtc
