1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef BASE_WIN_ENUM_VARIANT_H_
6#define BASE_WIN_ENUM_VARIANT_H_
7
8#include <unknwn.h>
9
10#include "base/memory/scoped_ptr.h"
11#include "base/win/iunknown_impl.h"
12
13namespace base {
14namespace win {
15
16// A simple implementation of IEnumVARIANT.
17class BASE_EXPORT EnumVariant
18  : public IEnumVARIANT,
19    public IUnknownImpl {
20 public:
21  // The constructor allocates an array of size |count|. Then use
22  // ItemAt to set the value of each item in the array to initialize it.
23  explicit EnumVariant(unsigned long count);
24
25  // Returns a mutable pointer to the item at position |index|.
26  VARIANT* ItemAt(unsigned long index);
27
28  // IUnknown.
29  ULONG STDMETHODCALLTYPE AddRef() OVERRIDE;
30  ULONG STDMETHODCALLTYPE Release() OVERRIDE;
31  STDMETHODIMP QueryInterface(REFIID riid, void** ppv) OVERRIDE;
32
33  // IEnumVARIANT.
34  STDMETHODIMP Next(ULONG requested_count,
35                    VARIANT* out_elements,
36                    ULONG* out_elements_received);
37  STDMETHODIMP Skip(ULONG skip_count);
38  STDMETHODIMP Reset();
39  STDMETHODIMP Clone(IEnumVARIANT** out_cloned_object);
40
41 private:
42  ~EnumVariant();
43
44  scoped_ptr<VARIANT[]> items_;
45  unsigned long count_;
46  unsigned long current_index_;
47};
48
49}  // namespace win
50}  // namespace base
51
52#endif  // BASE_WIN_ENUM_VARIANT_H_
53